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
*/
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
doing ROR-index_merge selects
......@@ -556,6 +563,22 @@ class QUICK_INDEX_MERGE_SELECT : public QUICK_SELECT_I
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 */
READ_RECORD read_record;
};
......@@ -608,6 +631,22 @@ class QUICK_ROR_INTERSECT_SELECT : public QUICK_SELECT_I
*/
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
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
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 */
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)
((tab->type != JT_CONST && tab->type != JT_REF) ||
(uint)tab->ref.key == tab->quick->index))
{
DBUG_ASSERT(tab->quick->is_valid());
sel->quick=tab->quick; // Use value from get_quick_...
sel->quick_keys.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