Loading sql/opt_range.cc +19 −6 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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())) Loading sql/opt_range.h +4 −2 Original line number Diff line number Diff line Loading @@ -281,7 +281,8 @@ class QUICK_RANGE_SELECT : public QUICK_SELECT_I 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, Loading Loading @@ -709,5 +710,6 @@ class FT_SELECT: public QUICK_RANGE_SELECT { }; 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 sql/sql_select.cc +2 −1 Original line number Diff line number Diff line Loading @@ -11002,7 +11002,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 Loading
sql/opt_range.cc +19 −6 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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())) Loading
sql/opt_range.h +4 −2 Original line number Diff line number Diff line Loading @@ -281,7 +281,8 @@ class QUICK_RANGE_SELECT : public QUICK_SELECT_I 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, Loading Loading @@ -709,5 +710,6 @@ class FT_SELECT: public QUICK_RANGE_SELECT { }; 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
sql/sql_select.cc +2 −1 Original line number Diff line number Diff line Loading @@ -11002,7 +11002,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