From a7a1d4dc1e3f24ff23db7cb11c9ffda0ce12981c Mon Sep 17 00:00:00 2001 From: "sergefp@mysql.com" <> Date: Fri, 29 Apr 2005 01:16:32 +0400 Subject: [PATCH] Fix for BUG#10244: Make get_quick_select_for_ref() accept estimated # records as parameter and set QUICK_RANGE_SELECT::records, as this value is used to allocate buffers in Multi-Range Read. --- sql/opt_range.cc | 25 +++++++++++++++++++------ sql/opt_range.h | 6 ++++-- sql/sql_select.cc | 3 ++- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 95fe003770b..7dfee132ea9 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -5513,14 +5513,26 @@ bool QUICK_ROR_UNION_SELECT::check_if_keys_used(List *fields) } -/**************************************************************************** - Create a QUICK RANGE based on a key - This allocates things in a new memory root, as this may be called many times - during a query. -****************************************************************************/ +/* + Create quick select from ref/ref_or_null scan. + SYNOPSIS + get_quick_select_for_ref() + thd Thread handle + table Table to access + ref ref[_or_null] scan parameters + records Estimate of number of records (needed only to construct + quick select) + NOTES + This allocates things in a new memory root, as this may be called many + times during a query. + + RETURN + Quick select that retrieves the same rows as passed ref scan + NULL on error. +*/ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, - TABLE_REF *ref) + TABLE_REF *ref, ha_rows records) { MEM_ROOT *old_root= thd->mem_root; /* The following call may change thd->mem_root */ @@ -5537,6 +5549,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, delete quick; goto err; } + quick->records= records; if (cp_buffer_from_ref(thd,ref) && thd->is_fatal_error || !(range= new QUICK_RANGE())) diff --git a/sql/opt_range.h b/sql/opt_range.h index 97d646cedbe..71680b5a1fc 100644 --- a/sql/opt_range.h +++ b/sql/opt_range.h @@ -281,7 +281,8 @@ protected: friend class TRP_ROR_INTERSECT; friend QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, - struct st_table_ref *ref); + struct st_table_ref *ref, + ha_rows records); friend bool get_quick_keys(struct st_qsel_param *param, QUICK_RANGE_SELECT *quick,KEY_PART *key, SEL_ARG *key_tree, @@ -709,5 +710,6 @@ public: }; QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table, - struct st_table_ref *ref); + struct st_table_ref *ref, + ha_rows records); #endif diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 9b93a92c6aa..e85bf888e24 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -10971,7 +10971,8 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order, */ if (!(select->quick= (tab->type == JT_FT ? new FT_SELECT(thd, table, tab->ref.key) : - get_quick_select_for_ref(thd, table, &tab->ref)))) + get_quick_select_for_ref(thd, table, &tab->ref, + tab->found_records)))) goto err; } }