mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
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.
This commit is contained in:
parent
254bb2570c
commit
a7a1d4dc1e
3 changed files with 25 additions and 9 deletions
|
@ -5513,14 +5513,26 @@ bool QUICK_ROR_UNION_SELECT::check_if_keys_used(List<Item> *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()))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue