From: Jorgen Loland Date: December 17 2010 12:58pm Subject: bzr push into mysql-5.5-bugteam branch (jorgen.loland:3209 to 3210) Bug#58985 List-Archive: http://lists.mysql.com/commits/127200 X-Bug: 58985 Message-Id: <20101217125822.4F2F576B@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3210 Jorgen Loland 2010-12-17 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. modified: sql/opt_range.h sql/sql_select.cc 3209 Georgi Kodinov 2010-12-17 [merge] merge === modified file 'sql/opt_range.h' --- a/sql/opt_range.h 2010-11-23 10:47:35 +0000 +++ b/sql/opt_range.h 2010-12-17 12:52:39 +0000 @@ -336,6 +336,13 @@ public: */ 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 @@ public: bool clustered_pk_range() { return test(pk_quick_select); } + virtual bool is_valid() + { + List_iterator_fast 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 @@ public: */ List quick_selects; + virtual bool is_valid() + { + List_iterator_fast 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 @@ public: List quick_selects; /* Merged quick selects */ + virtual bool is_valid() + { + List_iterator_fast 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. */ === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-12-17 11:11:34 +0000 +++ b/sql/sql_select.cc 2010-12-17 12:52:39 +0000 @@ -6504,6 +6504,7 @@ make_join_select(JOIN *join,SQL_SELECT * ((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(); No bundle (reason: useless for push emails).