List:Commits« Previous MessageNext Message »
From:Jorgen Loland Date:December 17 2010 10:40am
Subject:bzr commit into mysql-5.5-bugteam branch (jorgen.loland:3209) Bug#58985
View as plain text  
#At file:///export/home/jl208045/mysql/mysql-5.5-bugteam/ based on revid:jorgen.loland@stripped

 3209 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
=== 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 10:40:33 +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<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 @@ public:
   */
   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 @@ public:
 
   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. */
 

=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc	2010-12-17 09:02:24 +0000
+++ b/sql/sql_select.cc	2010-12-17 10:40:33 +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();


Attachment: [text/bzr-bundle] bzr/jorgen.loland@oracle.com-20101217104033-x5rzkr1sfyh9qhjd.bundle
Thread
bzr commit into mysql-5.5-bugteam branch (jorgen.loland:3209) Bug#58985Jorgen Loland17 Dec