Commit 381a078f authored by Jorgen Loland's avatar Jorgen Loland

BUG#58985: Assertion tab->quick->index != 64 failed in make_join_select()

           in sql_select.cc

Follow-up patch. Add sanity check for quick select when it is
decided that it should be used.

sql/opt_range.h:
  Add is_valid() to QUICK_SELECT*
sql/sql_select.cc:
  Add sanity check for quick select when it is decided that it should be used.
parent 326a0aff
...@@ -336,6 +336,13 @@ class QUICK_SELECT_I ...@@ -336,6 +336,13 @@ class QUICK_SELECT_I
*/ */
virtual bool is_keys_used(const MY_BITMAP *fields); virtual bool is_keys_used(const MY_BITMAP *fields);
/**
Simple sanity check that the quick select has been set up
correctly. Function is overridden by quick selects that merge
indices.
*/
virtual bool is_valid() { return index != MAX_KEY; };
/* /*
rowid of last row retrieved by this quick select. This is used only when rowid of last row retrieved by this quick select. This is used only when
doing ROR-index_merge selects doing ROR-index_merge selects
...@@ -556,6 +563,22 @@ class QUICK_INDEX_MERGE_SELECT : public QUICK_SELECT_I ...@@ -556,6 +563,22 @@ class QUICK_INDEX_MERGE_SELECT : public QUICK_SELECT_I
bool clustered_pk_range() { return test(pk_quick_select); } bool clustered_pk_range() { return test(pk_quick_select); }
virtual bool is_valid()
{
List_iterator_fast<QUICK_RANGE_SELECT> it(quick_selects);
QUICK_RANGE_SELECT *quick;
bool valid= true;
while ((quick= it++))
{
if (!quick->is_valid())
{
valid= false;
break;
}
}
return valid;
}
/* used to get rows collected in Unique */ /* used to get rows collected in Unique */
READ_RECORD read_record; READ_RECORD read_record;
}; };
...@@ -608,6 +631,22 @@ class QUICK_ROR_INTERSECT_SELECT : public QUICK_SELECT_I ...@@ -608,6 +631,22 @@ class QUICK_ROR_INTERSECT_SELECT : public QUICK_SELECT_I
*/ */
List<QUICK_RANGE_SELECT> quick_selects; List<QUICK_RANGE_SELECT> quick_selects;
virtual bool is_valid()
{
List_iterator_fast<QUICK_RANGE_SELECT> it(quick_selects);
QUICK_RANGE_SELECT *quick;
bool valid= true;
while ((quick= it++))
{
if (!quick->is_valid())
{
valid= false;
break;
}
}
return valid;
}
/* /*
Merged quick select that uses Clustered PK, if there is one. This quick Merged quick select that uses Clustered PK, if there is one. This quick
select is not used for row retrieval, it is used for row retrieval. select is not used for row retrieval, it is used for row retrieval.
...@@ -658,6 +697,22 @@ class QUICK_ROR_UNION_SELECT : public QUICK_SELECT_I ...@@ -658,6 +697,22 @@ class QUICK_ROR_UNION_SELECT : public QUICK_SELECT_I
List<QUICK_SELECT_I> quick_selects; /* Merged quick selects */ List<QUICK_SELECT_I> quick_selects; /* Merged quick selects */
virtual bool is_valid()
{
List_iterator_fast<QUICK_SELECT_I> it(quick_selects);
QUICK_SELECT_I *quick;
bool valid= true;
while ((quick= it++))
{
if (!quick->is_valid())
{
valid= false;
break;
}
}
return valid;
}
QUEUE queue; /* Priority queue for merge operation */ QUEUE queue; /* Priority queue for merge operation */
MEM_ROOT alloc; /* Memory pool for this and merged quick selects data. */ MEM_ROOT alloc; /* Memory pool for this and merged quick selects data. */
......
...@@ -6504,6 +6504,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) ...@@ -6504,6 +6504,7 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
((tab->type != JT_CONST && tab->type != JT_REF) || ((tab->type != JT_CONST && tab->type != JT_REF) ||
(uint)tab->ref.key == tab->quick->index)) (uint)tab->ref.key == tab->quick->index))
{ {
DBUG_ASSERT(tab->quick->is_valid());
sel->quick=tab->quick; // Use value from get_quick_... sel->quick=tab->quick; // Use value from get_quick_...
sel->quick_keys.clear_all(); sel->quick_keys.clear_all();
sel->needed_reg.clear_all(); sel->needed_reg.clear_all();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment