From ba71026e0374b97324a4a0f2887e2df846911c9d Mon Sep 17 00:00:00 2001
From: unknown <serg@sergbook.mysql.com>
Date: Tue, 9 May 2006 15:14:29 -0400
Subject: [PATCH 1/2] fix HA_ERR_RECORD_DELETED for falcon

---
 include/my_base.h |   2 +-
 sql/opt_range.cc  | 177 ++++++++++++++++++++++++----------------------
 2 files changed, 94 insertions(+), 85 deletions(-)

diff --git a/include/my_base.h b/include/my_base.h
index e014f7c33b7..0390106880a 100644
--- a/include/my_base.h
+++ b/include/my_base.h
@@ -340,7 +340,7 @@ enum ha_base_keytype {
 #define HA_ERR_WRONG_COMMAND	131	/* Command not supported */
 #define HA_ERR_OLD_FILE		132	/* old databasfile */
 #define HA_ERR_NO_ACTIVE_RECORD 133	/* No record read in update() */
-#define HA_ERR_RECORD_DELETED	134	/* Intern error-code */
+#define HA_ERR_RECORD_DELETED	134	/* A record is not there */
 #define HA_ERR_RECORD_FILE_FULL 135	/* No more room in file */
 #define HA_ERR_INDEX_FILE_FULL	136	/* No more room in file */
 #define HA_ERR_END_OF_FILE	137	/* end in next/prev/first/last */
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index e4eb6e8ab3f..9ab1063d6b2 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -4306,7 +4306,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
   DBUG_EXECUTE("info", print_ror_scans_arr(param->table,
                                            "building covering ROR-I",
                                            ror_scan_mark, ror_scans_end););
-  do {
+  do
+  {
     /*
       Update changed sorting info:
         #covered fields,
@@ -7387,64 +7388,69 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
   uint last_rowid_count=0;
   DBUG_ENTER("QUICK_ROR_INTERSECT_SELECT::get_next");
 
-  /* Get a rowid for first quick and save it as a 'candidate' */
-  quick= quick_it++;
-  if (cpk_quick)
+  do
   {
-    do {
-      error= quick->get_next();
-    }while (!error && !cpk_quick->row_in_ranges());
-  }
-  else
-    error= quick->get_next();
-
-  if (error)
-    DBUG_RETURN(error);
-
-  quick->file->position(quick->record);
-  memcpy(last_rowid, quick->file->ref, head->file->ref_length);
-  last_rowid_count= 1;
-
-  while (last_rowid_count < quick_selects.elements)
-  {
-    if (!(quick= quick_it++))
+    /* Get a rowid for first quick and save it as a 'candidate' */
+    quick= quick_it++;
+    if (cpk_quick)
     {
-      quick_it.rewind();
-      quick= quick_it++;
-    }
-
-    do {
-      if ((error= quick->get_next()))
-        DBUG_RETURN(error);
-      quick->file->position(quick->record);
-      cmp= head->file->cmp_ref(quick->file->ref, last_rowid);
-    } while (cmp < 0);
-
-    /* Ok, current select 'caught up' and returned ref >= cur_ref */
-    if (cmp > 0)
-    {
-      /* Found a row with ref > cur_ref. Make it a new 'candidate' */
-      if (cpk_quick)
+      do
       {
-        while (!cpk_quick->row_in_ranges())
-        {
-          if ((error= quick->get_next()))
-            DBUG_RETURN(error);
-        }
-      }
-      memcpy(last_rowid, quick->file->ref, head->file->ref_length);
-      last_rowid_count= 1;
+        error= quick->get_next();
+      }while (!error && !cpk_quick->row_in_ranges());
     }
     else
-    {
-      /* current 'candidate' row confirmed by this select */
-      last_rowid_count++;
-    }
-  }
+      error= quick->get_next();
 
-  /* We get here iff we got the same row ref in all scans. */
-  if (need_to_fetch_row)
-    error= head->file->rnd_pos(head->record[0], last_rowid);
+    if (error)
+      DBUG_RETURN(error);
+
+    quick->file->position(quick->record);
+    memcpy(last_rowid, quick->file->ref, head->file->ref_length);
+    last_rowid_count= 1;
+
+    while (last_rowid_count < quick_selects.elements)
+    {
+      if (!(quick= quick_it++))
+      {
+        quick_it.rewind();
+        quick= quick_it++;
+      }
+
+      do
+      {
+        if ((error= quick->get_next()))
+          DBUG_RETURN(error);
+        quick->file->position(quick->record);
+        cmp= head->file->cmp_ref(quick->file->ref, last_rowid);
+      } while (cmp < 0);
+
+      /* Ok, current select 'caught up' and returned ref >= cur_ref */
+      if (cmp > 0)
+      {
+        /* Found a row with ref > cur_ref. Make it a new 'candidate' */
+        if (cpk_quick)
+        {
+          while (!cpk_quick->row_in_ranges())
+          {
+            if ((error= quick->get_next()))
+              DBUG_RETURN(error);
+          }
+        }
+        memcpy(last_rowid, quick->file->ref, head->file->ref_length);
+        last_rowid_count= 1;
+      }
+      else
+      {
+        /* current 'candidate' row confirmed by this select */
+        last_rowid_count++;
+      }
+    }
+
+    /* We get here iff we got the same row ref in all scans. */
+    if (need_to_fetch_row)
+      error= head->file->rnd_pos(head->record[0], last_rowid);
+  } while (error == HA_ERR_RECORD_DELETED);
   DBUG_RETURN(error);
 }
 
@@ -7473,41 +7479,44 @@ int QUICK_ROR_UNION_SELECT::get_next()
 
   do
   {
-    if (!queue.elements)
-      DBUG_RETURN(HA_ERR_END_OF_FILE);
-    /* Ok, we have a queue with >= 1 scans */
-
-    quick= (QUICK_SELECT_I*)queue_top(&queue);
-    memcpy(cur_rowid, quick->last_rowid, rowid_length);
-
-    /* put into queue rowid from the same stream as top element */
-    if ((error= quick->get_next()))
+    do
     {
-      if (error != HA_ERR_END_OF_FILE)
-        DBUG_RETURN(error);
-      queue_remove(&queue, 0);
-    }
-    else
-    {
-      quick->save_last_pos();
-      queue_replaced(&queue);
-    }
+      if (!queue.elements)
+        DBUG_RETURN(HA_ERR_END_OF_FILE);
+      /* Ok, we have a queue with >= 1 scans */
 
-    if (!have_prev_rowid)
-    {
-      /* No rows have been returned yet */
-      dup_row= FALSE;
-      have_prev_rowid= TRUE;
-    }
-    else
-      dup_row= !head->file->cmp_ref(cur_rowid, prev_rowid);
-  }while (dup_row);
+      quick= (QUICK_SELECT_I*)queue_top(&queue);
+      memcpy(cur_rowid, quick->last_rowid, rowid_length);
 
-  tmp= cur_rowid;
-  cur_rowid= prev_rowid;
-  prev_rowid= tmp;
+      /* put into queue rowid from the same stream as top element */
+      if ((error= quick->get_next()))
+      {
+        if (error != HA_ERR_END_OF_FILE)
+          DBUG_RETURN(error);
+        queue_remove(&queue, 0);
+      }
+      else
+      {
+        quick->save_last_pos();
+        queue_replaced(&queue);
+      }
 
-  error= head->file->rnd_pos(quick->record, prev_rowid);
+      if (!have_prev_rowid)
+      {
+        /* No rows have been returned yet */
+        dup_row= FALSE;
+        have_prev_rowid= TRUE;
+      }
+      else
+        dup_row= !head->file->cmp_ref(cur_rowid, prev_rowid);
+    } while (dup_row);
+
+    tmp= cur_rowid;
+    cur_rowid= prev_rowid;
+    prev_rowid= tmp;
+
+    error= head->file->rnd_pos(quick->record, prev_rowid);
+  } while (error == HA_ERR_RECORD_DELETED);
   DBUG_RETURN(error);
 }
 

From bf6524db26cabf11c96898e58dbecf2694ee18fd Mon Sep 17 00:00:00 2001
From: unknown <serg@sergbook.mysql.com>
Date: Wed, 10 May 2006 11:27:38 -0400
Subject: [PATCH 2/2] a workaround for aclocal-1.8 bug

---
 config/ac-macros/plugins.m4 | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/config/ac-macros/plugins.m4 b/config/ac-macros/plugins.m4
index c00741bcfc0..42f121149c6 100644
--- a/config/ac-macros/plugins.m4
+++ b/config/ac-macros/plugins.m4
@@ -750,7 +750,10 @@ dnl ---------------------------------------------------------------------------
 AC_DEFUN([_MYSQL_INCLUDE_LIST],[
  ifelse([$1], [], [], [
   m4_define([__mysql_include__],[$1])
-  sinclude($1)
+  dnl We have to use builtin(), because sinclude($1) generates an error
+  dnl "file $1 does not exists" in aclocal-1.8 - which is a bug, clearly
+  dnl violating m4 specs, and which is fixed in aclocal-1.9
+  builtin([include],$1)
   m4_undefine([__mysql_include__])
   _MYSQL_INCLUDE_LIST(m4_shift($@))
  ])