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($@)) ])