12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
20
select_query and join optimization
20
mysql_select and join optimization
22
23
@defgroup Query_Optimizer Query Optimizer
32
#include <drizzled/sql_select.h> /* include join.h */
34
#include <drizzled/error.h>
35
#include <drizzled/gettext.h>
36
#include <drizzled/util/test.h>
37
#include <drizzled/name_resolution_context_state.h>
38
#include <drizzled/nested_join.h>
39
#include <drizzled/probes.h>
40
#include <drizzled/show.h>
41
#include <drizzled/item/cache.h>
42
#include <drizzled/item/cmpfunc.h>
43
#include <drizzled/item/copy_string.h>
44
#include <drizzled/item/uint.h>
45
#include <drizzled/cached_item.h>
46
#include <drizzled/sql_base.h>
47
#include <drizzled/field/blob.h>
48
#include <drizzled/check_stack_overrun.h>
49
#include <drizzled/lock.h>
50
#include <drizzled/item/outer_ref.h>
51
#include <drizzled/index_hint.h>
52
#include <drizzled/records.h>
53
#include <drizzled/internal/iocache.h>
54
#include <drizzled/drizzled.h>
55
#include <drizzled/plugin/storage_engine.h>
57
#include <drizzled/sql_union.h>
58
#include <drizzled/optimizer/key_field.h>
59
#include <drizzled/optimizer/position.h>
60
#include <drizzled/optimizer/sargable_param.h>
61
#include <drizzled/optimizer/key_use.h>
62
#include <drizzled/optimizer/range.h>
63
#include <drizzled/optimizer/quick_range_select.h>
64
#include <drizzled/optimizer/quick_ror_intersect_select.h>
66
#include <drizzled/filesort.h>
67
#include <drizzled/sql_lex.h>
68
#include <drizzled/session.h>
69
#include <drizzled/sort_field.h>
70
#include <drizzled/select_result.h>
77
static int sort_keyuse(optimizer::KeyUse *a, optimizer::KeyUse *b);
78
static COND *build_equal_items(Session *session, COND *cond,
27
#ifdef USE_PRAGMA_IMPLEMENTATION
28
#pragma implementation // gcc: Class implementation
31
#include "mysql_priv.h"
32
#include "sql_select.h"
38
const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref",
39
"MAYBE_REF","ALL","range","index",
40
"ref_or_null","unique_subquery","index_subquery",
44
struct st_sargable_param;
46
static void optimize_keyuse(JOIN *join, DYNAMIC_ARRAY *keyuse_array);
47
static bool make_join_statistics(JOIN *join, TABLE_LIST *leaves, COND *conds,
48
DYNAMIC_ARRAY *keyuse);
49
static bool update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,
51
uint tables, COND *conds,
52
COND_EQUAL *cond_equal,
53
table_map table_map, SELECT_LEX *select_lex,
54
st_sargable_param **sargables);
55
static int sort_keyuse(KEYUSE *a,KEYUSE *b);
56
static void set_position(JOIN *join,uint index,JOIN_TAB *table,KEYUSE *key);
57
static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse,
58
table_map used_tables);
59
static bool choose_plan(JOIN *join,table_map join_tables);
61
static void best_access_path(JOIN *join, JOIN_TAB *s, THD *thd,
62
table_map remaining_tables, uint idx,
63
double record_count, double read_time);
64
static void optimize_straight_join(JOIN *join, table_map join_tables);
65
static bool greedy_search(JOIN *join, table_map remaining_tables,
66
uint depth, uint prune_level);
67
static bool best_extension_by_limited_search(JOIN *join,
68
table_map remaining_tables,
69
uint idx, double record_count,
70
double read_time, uint depth,
72
static uint determine_search_depth(JOIN* join);
73
static int join_tab_cmp(const void* ptr1, const void* ptr2);
74
static int join_tab_cmp_straight(const void* ptr1, const void* ptr2);
76
TODO: 'find_best' is here only temporarily until 'greedy_search' is
79
static bool find_best(JOIN *join,table_map rest_tables,uint index,
80
double record_count,double read_time);
81
static uint cache_record_length(JOIN *join,uint index);
82
static double prev_record_reads(JOIN *join, uint idx, table_map found_ref);
83
static bool get_best_combination(JOIN *join);
84
static store_key *get_store_key(THD *thd,
85
KEYUSE *keyuse, table_map used_tables,
86
KEY_PART_INFO *key_part, uchar *key_buff,
88
static bool make_simple_join(JOIN *join,TABLE *tmp_table);
89
static void make_outerjoin_info(JOIN *join);
90
static bool make_join_select(JOIN *join,SQL_SELECT *select,COND *item);
91
static bool make_join_readinfo(JOIN *join, uint64_t options, uint no_jbuf_after);
92
static bool only_eq_ref_tables(JOIN *join, ORDER *order, table_map tables);
93
static void update_depend_map(JOIN *join);
94
static void update_depend_map(JOIN *join, ORDER *order);
95
static ORDER *remove_const(JOIN *join,ORDER *first_order,COND *cond,
96
bool change_list, bool *simple_order);
97
static int return_zero_rows(JOIN *join, select_result *res,TABLE_LIST *tables,
98
List<Item> &fields, bool send_row,
99
uint64_t select_options, const char *info,
101
static COND *build_equal_items(THD *thd, COND *cond,
79
102
COND_EQUAL *inherited,
80
List<TableList> *join_list,
103
List<TABLE_LIST> *join_list,
81
104
COND_EQUAL **cond_equal_ref);
83
static Item* part_of_refkey(Table *form,Field *field);
84
static bool cmp_buffer_with_ref(JoinTable *tab);
85
static void change_cond_ref_to_const(Session *session,
86
list<COND_CMP>& save_list,
91
static bool copy_blobs(Field **ptr);
93
static bool eval_const_cond(COND *cond)
95
return ((Item_func*) cond)->val_int() ? true : false;
105
static COND* substitute_for_best_equal_field(COND *cond,
106
COND_EQUAL *cond_equal,
107
void *table_join_idx);
108
static COND *simplify_joins(JOIN *join, List<TABLE_LIST> *join_list,
109
COND *conds, bool top, bool in_sj);
110
static bool check_interleaving_with_nj(JOIN_TAB *last, JOIN_TAB *next);
111
static void restore_prev_nj_state(JOIN_TAB *last);
112
static void reset_nj_counters(List<TABLE_LIST> *join_list);
113
static uint build_bitmap_for_nested_joins(List<TABLE_LIST> *join_list,
117
void advance_sj_state(const table_map remaining_tables, const JOIN_TAB *tab);
118
static void restore_prev_sj_state(const table_map remaining_tables,
119
const JOIN_TAB *tab);
121
static COND *optimize_cond(JOIN *join, COND *conds,
122
List<TABLE_LIST> *join_list,
123
Item::cond_result *cond_value);
124
static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item);
125
static bool open_tmp_table(TABLE *table);
126
static bool create_myisam_tmp_table(TABLE *table, KEY *keyinfo,
127
MI_COLUMNDEF *start_recinfo,
128
MI_COLUMNDEF **recinfo,
130
static int do_select(JOIN *join,List<Item> *fields,TABLE *tmp_table);
132
static enum_nested_loop_state
133
evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
135
static enum_nested_loop_state
136
evaluate_null_complemented_join_record(JOIN *join, JOIN_TAB *join_tab);
137
static enum_nested_loop_state
138
flush_cached_records(JOIN *join, JOIN_TAB *join_tab, bool skip_last);
139
static enum_nested_loop_state
140
end_send(JOIN *join, JOIN_TAB *join_tab, bool end_of_records);
141
static enum_nested_loop_state
142
end_write(JOIN *join, JOIN_TAB *join_tab, bool end_of_records);
143
static enum_nested_loop_state
144
end_update(JOIN *join, JOIN_TAB *join_tab, bool end_of_records);
145
static enum_nested_loop_state
146
end_unique_update(JOIN *join, JOIN_TAB *join_tab, bool end_of_records);
148
static int join_read_const_table(JOIN_TAB *tab, POSITION *pos);
149
static int join_read_system(JOIN_TAB *tab);
150
static int join_read_const(JOIN_TAB *tab);
151
static int join_read_key(JOIN_TAB *tab);
152
static int join_read_always_key(JOIN_TAB *tab);
153
static int join_read_last_key(JOIN_TAB *tab);
154
static int join_no_more_records(READ_RECORD *info);
155
static int join_read_next(READ_RECORD *info);
156
static int join_read_next_different(READ_RECORD *info);
157
static int join_init_quick_read_record(JOIN_TAB *tab);
158
static int test_if_quick_select(JOIN_TAB *tab);
159
static int join_init_read_record(JOIN_TAB *tab);
160
static int join_read_first(JOIN_TAB *tab);
161
static int join_read_next_same(READ_RECORD *info);
162
static int join_read_next_same_diff(READ_RECORD *info);
163
static int join_read_last(JOIN_TAB *tab);
164
static int join_read_prev_same(READ_RECORD *info);
165
static int join_read_prev(READ_RECORD *info);
166
int join_read_always_key_or_null(JOIN_TAB *tab);
167
int join_read_next_same_or_null(READ_RECORD *info);
168
static COND *make_cond_for_table(COND *cond,table_map table,
169
table_map used_table,
170
bool exclude_expensive_cond);
171
static Item* part_of_refkey(TABLE *form,Field *field);
172
static bool test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,
173
ha_rows select_limit, bool no_changes,
175
static bool list_contains_unique_index(TABLE *table,
176
bool (*find_func) (Field *, void *), void *data);
177
static bool find_field_in_item_list (Field *field, void *data);
178
static bool find_field_in_order_list (Field *field, void *data);
179
static int create_sort_index(THD *thd, JOIN *join, ORDER *order,
180
ha_rows filesort_limit, ha_rows select_limit,
182
static int remove_duplicates(JOIN *join,TABLE *entry,List<Item> &fields,
184
static int remove_dup_with_compare(THD *thd, TABLE *entry, Field **field,
185
ulong offset,Item *having);
186
static int remove_dup_with_hash_index(THD *thd,TABLE *table,
187
uint field_count, Field **first_field,
189
ulong key_length,Item *having);
190
static int join_init_cache(THD *thd,JOIN_TAB *tables,uint table_count);
191
static ulong used_blob_length(CACHE_FIELD **ptr);
192
static bool store_record_in_cache(JOIN_CACHE *cache);
193
static void reset_cache_read(JOIN_CACHE *cache);
194
static void reset_cache_write(JOIN_CACHE *cache);
195
static void read_cached_record(JOIN_TAB *tab);
196
static bool cmp_buffer_with_ref(JOIN_TAB *tab);
197
static ORDER *create_distinct_group(THD *thd, Item **ref_pointer_array,
198
ORDER *order, List<Item> &fields,
199
List<Item> &all_fields,
200
bool *all_order_by_fields_used);
201
static bool test_if_subpart(ORDER *a,ORDER *b);
202
static TABLE *get_sort_by_table(ORDER *a,ORDER *b,TABLE_LIST *tables);
203
static void calc_group_buffer(JOIN *join,ORDER *group);
204
static bool make_group_fields(JOIN *main_join, JOIN *curr_join);
205
static bool alloc_group_fields(JOIN *join,ORDER *group);
206
// Create list for using with tempory table
207
static bool change_to_use_tmp_fields(THD *thd, Item **ref_pointer_array,
208
List<Item> &new_list1,
209
List<Item> &new_list2,
210
uint elements, List<Item> &items);
211
// Create list for using with tempory table
212
static bool change_refs_to_tmp_fields(THD *thd, Item **ref_pointer_array,
213
List<Item> &new_list1,
214
List<Item> &new_list2,
215
uint elements, List<Item> &items);
216
static void init_tmptable_sum_functions(Item_sum **func);
217
static void update_tmptable_sum_func(Item_sum **func,TABLE *tmp_table);
218
static void copy_sum_funcs(Item_sum **func_ptr, Item_sum **end);
219
static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab);
220
static bool setup_sum_funcs(THD *thd, Item_sum **func_ptr);
221
static bool init_sum_functions(Item_sum **func, Item_sum **end);
222
static bool update_sum_func(Item_sum **func);
223
void select_describe(JOIN *join, bool need_tmp_table,bool need_order,
224
bool distinct, const char *message=NullS);
225
static Item *remove_additional_cond(Item* conds);
226
static void add_group_and_distinct_keys(JOIN *join, JOIN_TAB *join_tab);
227
static bool test_if_ref(Item_field *left_item,Item *right_item);
228
static bool replace_where_subcondition(JOIN *join, Item *old_cond,
229
Item *new_cond, bool fix_fields);
99
232
This is used to mark equalities that were made from i-th IN-equality.
266
391
ref->outer_ref= new_ref;
267
392
ref->ref= &ref->outer_ref;
269
if (!ref->fixed && ref->fix_fields(session, 0))
394
if (!ref->fixed && ref->fix_fields(thd, 0))
271
session->used_tables|= item->used_tables();
396
thd->used_tables|= item->used_tables();
401
#define MAGIC_IN_WHERE_TOP_LEVEL 10
403
Function to setup clauses without sum functions.
405
inline int setup_without_group(THD *thd, Item **ref_pointer_array,
409
List<Item> &all_fields,
412
ORDER *group, bool *hidden_group_fields)
415
nesting_map save_allow_sum_func=thd->lex->allow_sum_func ;
417
thd->lex->allow_sum_func&= ~(1 << thd->lex->current_select->nest_level);
418
res= setup_conds(thd, tables, leaves, conds);
420
thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level;
421
res= res || setup_order(thd, ref_pointer_array, tables, fields, all_fields,
423
thd->lex->allow_sum_func&= ~(1 << thd->lex->current_select->nest_level);
424
res= res || setup_group(thd, ref_pointer_array, tables, fields, all_fields,
425
group, hidden_group_fields);
426
thd->lex->allow_sum_func= save_allow_sum_func;
276
430
/*****************************************************************************
277
431
Check fields, find best join, do the select and output fields.
278
select_query assumes that all tables are already opened
432
mysql_select assumes that all tables are already opened
279
433
*****************************************************************************/
436
Prepare of whole select (including sub queries in future).
439
Add check of calculation of GROUP functions and fields:
440
SELECT COUNT(*)+table.col1 from table1;
448
JOIN::prepare(Item ***rref_pointer_array,
449
TABLE_LIST *tables_init,
450
uint wild_num, COND *conds_init, uint og_num,
451
ORDER *order_init, ORDER *group_init,
453
ORDER *proc_param_init, SELECT_LEX *select_lex_arg,
454
SELECT_LEX_UNIT *unit_arg)
456
// to prevent double initialization on EXPLAIN
462
group_list= group_init;
464
proc_param= proc_param_init;
465
tables_list= tables_init;
466
select_lex= select_lex_arg;
467
select_lex->join= this;
468
join_list= &select_lex->top_join_list;
469
union_part= unit_arg->is_union();
471
thd->lex->current_select->is_item_list_lookup= 1;
473
If we have already executed SELECT, then it have not sense to prevent
474
its table from update (see unique_table())
476
if (thd->derived_tables_processing)
477
select_lex->exclude_from_table_unique_test= true;
479
/* Check that all tables, fields, conds and order are ok */
481
if (!(select_options & OPTION_SETUP_TABLES_DONE) &&
482
setup_tables_and_check_access(thd, &select_lex->context, join_list,
483
tables_list, &select_lex->leaf_tables,
487
TABLE_LIST *table_ptr;
488
for (table_ptr= select_lex->leaf_tables;
490
table_ptr= table_ptr->next_leaf)
493
if (setup_wild(thd, tables_list, fields_list, &all_fields, wild_num) ||
494
select_lex->setup_ref_array(thd, og_num) ||
495
setup_fields(thd, (*rref_pointer_array), fields_list, MARK_COLUMNS_READ,
497
setup_without_group(thd, (*rref_pointer_array), tables_list,
498
select_lex->leaf_tables, fields_list,
499
all_fields, &conds, order, group_list,
500
&hidden_group_fields))
501
return(-1); /* purecov: inspected */
503
ref_pointer_array= *rref_pointer_array;
507
nesting_map save_allow_sum_func= thd->lex->allow_sum_func;
508
thd->where="having clause";
509
thd->lex->allow_sum_func|= 1 << select_lex_arg->nest_level;
510
select_lex->having_fix_field= 1;
511
bool having_fix_rc= (!having->fixed &&
512
(having->fix_fields(thd, &having) ||
513
having->check_cols(1)));
514
select_lex->having_fix_field= 0;
515
if (having_fix_rc || thd->is_error())
516
return(-1); /* purecov: inspected */
517
thd->lex->allow_sum_func= save_allow_sum_func;
520
if (!thd->lex->view_prepare_mode)
522
Item_subselect *subselect;
523
Item_in_subselect *in_subs= NULL;
525
Are we in a subquery predicate?
526
TODO: the block below will be executed for every PS execution without need.
528
if ((subselect= select_lex->master_unit()->item))
530
bool do_semijoin= !test(thd->variables.optimizer_switch &
531
OPTIMIZER_SWITCH_NO_SEMIJOIN);
532
if (subselect->substype() == Item_subselect::IN_SUBS)
533
in_subs= (Item_in_subselect*)subselect;
536
Check if we're in subquery that is a candidate for flattening into a
537
semi-join (which is done done in flatten_subqueries()). The
539
1. Subquery predicate is an IN/=ANY subq predicate
540
2. Subquery is a single SELECT (not a UNION)
541
3. Subquery does not have GROUP BY or ORDER BY
542
4. Subquery does not use aggregate functions or HAVING
543
5. Subquery predicate is at the AND-top-level of ON/WHERE clause
544
6. No execution method was already chosen (by a prepared statement).
546
(*). We are not in a subquery of a single table UPDATE/DELETE that
547
doesn't have a JOIN (TODO: We should handle this at some
548
point by switching to multi-table UPDATE/DELETE)
550
(**). We're not in a confluent table-less subquery, like
554
!select_lex->master_unit()->first_select()->next_select() && // 2
555
!select_lex->group_list.elements && !order && // 3
556
!having && !select_lex->with_sum_func && // 4
557
thd->thd_marker && // 5
558
select_lex->outer_select()->join && // (*)
559
select_lex->master_unit()->first_select()->leaf_tables && // (**)
561
in_subs->exec_method == Item_in_subselect::NOT_TRANSFORMED) // 6
564
if (!in_subs->left_expr->fixed &&
565
in_subs->left_expr->fix_fields(thd, &in_subs->left_expr))
570
Check that the right part of the subselect contains no more than one
571
column. E.g. in SELECT 1 IN (SELECT * ..) the right part is (SELECT * ...)
573
if (subselect->substype() == Item_subselect::IN_SUBS &&
574
(select_lex->item_list.elements !=
575
((Item_in_subselect*)subselect)->left_expr->cols()))
577
my_error(ER_OPERAND_COLUMNS, MYF(0), ((Item_in_subselect*)subselect)->left_expr->cols());
582
/* Register the subquery for further processing */
583
select_lex->outer_select()->join->sj_subselects.append(thd->mem_root, in_subs);
584
in_subs->expr_join_nest= (TABLE_LIST*)thd->thd_marker;
588
bool do_materialize= !test(thd->variables.optimizer_switch &
589
OPTIMIZER_SWITCH_NO_MATERIALIZATION);
591
Check if the subquery predicate can be executed via materialization.
592
The required conditions are:
593
1. Subquery predicate is an IN/=ANY subq predicate
594
2. Subquery is a single SELECT (not a UNION)
595
3. Subquery is not a table-less query. In this case there is no
596
point in materializing.
597
4. Subquery predicate is a top-level predicate
598
(this implies it is not negated)
599
TODO: this is a limitation that should be lifeted once we
600
implement correct NULL semantics (WL#3830)
601
5. Subquery is non-correlated
603
This is an overly restrictive condition. It can be extended to:
604
(Subquery is non-correlated ||
605
Subquery is correlated to any query outer to IN predicate ||
606
(Subquery is correlated to the immediate outer query &&
607
Subquery !contains {GROUP BY, ORDER BY [LIMIT],
608
aggregate functions) && subquery predicate is not under "NOT IN"))
609
6. No execution method was already chosen (by a prepared statement).
611
(*) The subquery must be part of a SELECT statement. The current
612
condition also excludes multi-table update statements.
614
We have to determine whether we will perform subquery materialization
615
before calling the IN=>EXISTS transformation, so that we know whether to
616
perform the whole transformation or only that part of it which wraps
617
Item_in_subselect in an Item_in_optimizer.
619
if (do_materialize &&
621
!select_lex->master_unit()->first_select()->next_select() && // 2
622
select_lex->master_unit()->first_select()->leaf_tables && // 3
623
thd->lex->sql_command == SQLCOM_SELECT) // *
625
if (in_subs->is_top_level_item() && // 4
626
!in_subs->is_correlated && // 5
627
in_subs->exec_method == Item_in_subselect::NOT_TRANSFORMED) // 6
628
in_subs->exec_method= Item_in_subselect::MATERIALIZATION;
631
Item_subselect::trans_res trans_res;
632
if ((trans_res= subselect->select_transformer(this)) !=
633
Item_subselect::RES_OK)
635
select_lex->fix_prepare_information(thd, &conds, &having);
636
return((trans_res == Item_subselect::RES_ERROR));
642
select_lex->fix_prepare_information(thd, &conds, &having);
647
for (ord= order; ord; ord= ord->next)
649
Item *item= *ord->item;
650
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM)
651
item->split_sum_func(thd, ref_pointer_array, all_fields);
655
if (having && having->with_sum_func)
656
having->split_sum_func2(thd, ref_pointer_array, all_fields,
658
if (select_lex->inner_sum_func_list)
660
Item_sum *end=select_lex->inner_sum_func_list;
661
Item_sum *item_sum= end;
664
item_sum= item_sum->next;
665
item_sum->split_sum_func2(thd, ref_pointer_array,
666
all_fields, item_sum->ref_by, false);
667
} while (item_sum != end);
670
if (select_lex->inner_refs_list.elements &&
671
fix_inner_refs(thd, all_fields, select_lex, ref_pointer_array))
675
Check if there are references to un-aggregated columns when computing
676
aggregate functions with implicit grouping (there is no GROUP BY).
678
MODE_ONLY_FULL_GROUP_BY is enabled here by default
680
if (!group_list && select_lex->full_group_by_flag == (NON_AGG_FIELD_USED | SUM_FUNC_USED))
682
my_message(ER_MIX_OF_GROUP_FUNC_AND_FIELDS,
683
ER(ER_MIX_OF_GROUP_FUNC_AND_FIELDS), MYF(0));
687
/* Caclulate the number of groups */
689
for (ORDER *group_tmp= group_list ; group_tmp ; group_tmp= group_tmp->next)
694
goto err; /* purecov: inspected */
696
if (result && result->prepare(fields_list, unit_arg))
697
goto err; /* purecov: inspected */
699
/* Init join struct */
700
count_field_types(select_lex, &tmp_table_param, all_fields, 0);
701
ref_pointer_array_size= all_fields.elements*sizeof(Item*);
702
this->group= group_list != 0;
705
#ifdef RESTRICTED_GROUP
706
if (sum_func_count && !group_list && (func_count || field_count))
708
my_message(ER_WRONG_SUM_SELECT,ER(ER_WRONG_SUM_SELECT),MYF(0));
712
if (select_lex->olap == ROLLUP_TYPE && rollup_init())
714
if (alloc_func_list())
720
return(-1); /* purecov: inspected */
725
Remove the predicates pushed down into the subquery
728
JOIN::remove_subq_pushed_predicates()
729
where IN Must be NULL
730
OUT The remaining WHERE condition, or NULL
733
Given that this join will be executed using (unique|index)_subquery,
734
without "checking NULL", remove the predicates that were pushed down
737
If the subquery compares scalar values, we can remove the condition that
738
was wrapped into trig_cond (it will be checked when needed by the subquery
741
If the subquery compares row values, we need to keep the wrapped
742
equalities in the WHERE clause: when the left (outer) tuple has both NULL
743
and non-NULL values, we'll do a full table scan and will rely on the
744
equalities corresponding to non-NULL parts of left tuple to filter out
745
non-matching records.
747
TODO: We can remove the equalities that will be guaranteed to be true by the
748
fact that subquery engine will be using index lookup. This must be done only
749
for cases where there are no conversion errors of significance, e.g. 257
750
that is searched in a byte. But this requires homogenization of the return
751
codes of all Field*::store() methods.
754
void JOIN::remove_subq_pushed_predicates(Item **where)
756
if (conds->type() == Item::FUNC_ITEM &&
757
((Item_func *)this->conds)->functype() == Item_func::EQ_FUNC &&
758
((Item_func *)conds)->arguments()[0]->type() == Item::REF_ITEM &&
759
((Item_func *)conds)->arguments()[1]->type() == Item::FIELD_ITEM &&
760
test_if_ref ((Item_field *)((Item_func *)conds)->arguments()[1],
761
((Item_func *)conds)->arguments()[0]))
282
770
Index lookup-based subquery: save some flags for EXPLAIN output
809
Check if the table's rowid is included in the temptable
812
sj_table_is_included()
814
join_tab The table to be checked
817
SemiJoinDuplicateElimination: check the table's rowid should be included
818
in the temptable. This is so if
820
1. The table is not embedded within some semi-join nest
821
2. The has been pulled out of a semi-join nest, or
823
3. The table is functionally dependent on some previous table
825
[4. This is also true for constant tables that can't be
826
NULL-complemented but this function is not called for such tables]
829
true - Include table's rowid
833
static bool sj_table_is_included(JOIN *join, JOIN_TAB *join_tab)
835
if (join_tab->emb_sj_nest)
838
/* Check if this table is functionally dependent on the tables that
839
are within the same outer join nest
841
TABLE_LIST *embedding= join_tab->table->pos_in_table_list->embedding;
842
if (join_tab->type == JT_EQ_REF)
844
Table_map_iterator it(join_tab->ref.depend_map & ~PSEUDO_TABLE_BITS);
846
while ((idx= it.next_bit())!=Table_map_iterator::BITMAP_END)
848
JOIN_TAB *ref_tab= join->join_tab + idx;
849
if (embedding == ref_tab->table->pos_in_table_list->embedding)
852
/* Ok, functionally dependent */
855
/* Not functionally dependent => need to include*/
860
TABLE *create_duplicate_weedout_tmp_table(THD *thd, uint uniq_tuple_length_arg,
861
SJ_TMP_TABLE *sjtbl);
865
Setup the strategies to eliminate semi-join duplicates.
868
setup_semijoin_dups_elimination()
870
options Join options (needed to see if join buffering will be
872
no_jbuf_after Another bit of information re where join buffering will
876
Setup the strategies to eliminate semi-join duplicates. ATM there are 3
879
1. DuplicateWeedout (use of temptable to remove duplicates based on rowids
881
2. FirstMatch (pick only the 1st matching row combination of inner tables)
882
3. InsideOut (scanning the sj-inner table in a way that groups duplicates
883
together and picking the 1st one)
885
The join order has "duplicate-generating ranges", and every range is
886
served by one strategy or a combination of FirstMatch with with some
889
"Duplicate-generating range" is defined as a range within the join order
890
that contains all of the inner tables of a semi-join. All ranges must be
891
disjoint, if tables of several semi-joins are interleaved, then the ranges
892
are joined together, which is equivalent to converting
893
SELECT ... WHERE oe1 IN (SELECT ie1 ...) AND oe2 IN (SELECT ie2 )
895
SELECT ... WHERE (oe1, oe2) IN (SELECT ie1, ie2 ... ...)
898
Applicability conditions are as follows:
900
DuplicateWeedout strategy
901
~~~~~~~~~~~~~~~~~~~~~~~~~
903
(ot|nt)* [ it ((it|ot|nt)* (it|ot))] (nt)*
904
+------+ +=========================+ +---+
907
(1) - Prefix of OuterTables (those that participate in
908
IN-equality and/or are correlated with subquery) and outer
909
Noncorrelated Tables.
910
(2) - The handled range. The range starts with the first sj-inner
911
table, and covers all sj-inner and outer tables
912
Within the range, Inner, Outer, outer Noncorrelated tables
913
may follow in any order.
914
(3) - The suffix of outer Noncorrelated tables.
919
(ot|nt)* [ it ((it|nt)* it) ] (nt)*
920
+------+ +==================+ +---+
923
(1) - Prefix of outer and non-correlated tables
924
(2) - The handled range, which may contain only inner and
925
non-correlated tables.
926
(3) - The suffix of outer Noncorrelated tables.
931
(ot|ct|nt) [ insideout_tbl (ot|nt|it)* it ] (ot|nt)*
932
+--------+ +===========+ +=============+ +------+
935
(1) - Prefix that may contain any outer tables. The prefix must contain
936
all the non-trivially correlated outer tables. (non-trivially means
937
that the correlation is not just through the IN-equality).
939
(2) - Inner table for which the InsideOut scan is performed.
941
(3) - The remainder of the duplicate-generating range. It is served by
942
application of FirstMatch strategy, with the exception that
943
outer IN-correlated tables are considered to be non-correlated.
945
(4) - THe suffix of outer and outer non-correlated tables.
947
If several strategies are applicable, their relative priorities are:
952
This function walks over the join order and sets up the strategies by
953
setting appropriate members in join_tab structures.
957
true Out of memory error
961
int setup_semijoin_dups_elimination(JOIN *join, uint64_t options, uint no_jbuf_after)
963
table_map cur_map= join->const_table_map | PSEUDO_TABLE_BITS;
966
0 - invalid (EOF marker),
968
2 - Temptable (maybe confluent),
969
3 - Temptable with join buffering
972
uint start_idx; /* Left range bound */
973
uint end_idx; /* Right range bound */
975
For Temptable strategy: Bitmap of all outer and correlated tables from
976
all involved join nests.
978
table_map outer_tables;
979
} dups_ranges [MAX_TABLES];
981
TABLE_LIST *emb_insideout_nest= NULL;
982
table_map emb_sj_map= 0; /* A bitmap of sj-nests (that is, their sj-inner
983
tables) whose ranges we're in */
984
table_map emb_outer_tables= 0; /* sj-outer tables for those sj-nests */
985
table_map range_start_map= 0; /* table_map at current range start */
986
bool dealing_with_jbuf= false; /* true <=> table within cur range uses join buf */
991
First pass: locate the duplicate-generating ranges and pick the strategies.
993
for (i=join->const_tables ; i < join->tables ; i++)
995
JOIN_TAB *tab=join->join_tab+i;
996
TABLE *table=tab->table;
997
cur_map |= table->map;
999
if (tab->emb_sj_nest) // Encountered an sj-inner table
1003
dups_ranges[cur_range].start_idx= i;
1004
range_start_map= cur_map & ~table->map;
1006
Remember if this is a possible start of range that is covered by
1007
the InsideOut strategy (the reason that it is not covered could
1008
be that it overlaps with anther semi-join's range. we don't
1009
support InsideOut for joined ranges)
1011
if (join->best_positions[i].use_insideout_scan)
1012
emb_insideout_nest= tab->emb_sj_nest;
1015
emb_sj_map |= tab->emb_sj_nest->sj_inner_tables;
1016
emb_outer_tables |= tab->emb_sj_nest->nested_join->sj_depends_on;
1018
if (tab->emb_sj_nest != emb_insideout_nest)
1021
Two different semi-joins interleave. This cannot be handled by
1024
emb_insideout_nest= NULL;
1028
if (emb_sj_map) /* We're in duplicate-generating range */
1030
if (i != join->const_tables && !(options & SELECT_NO_JOIN_CACHE) &&
1031
tab->type == JT_ALL && tab->use_quick != 2 && !tab->first_inner &&
1032
i <= no_jbuf_after && !dealing_with_jbuf)
1035
This table uses join buffering, which makes use of FirstMatch or
1036
InsideOut strategies impossible for the current and (we assume)
1037
preceding duplicate-producing ranges.
1038
That is, for the join order:
1040
x x [ x x] x [x x x] x [x x X* x] x
1042
+-----+ +-----+ | join buffering use
1045
we'll have to remove r1 and r2 and use duplicate-elimination
1046
strategy that spans all the tables, starting from the very 1st
1049
dealing_with_jbuf= true;
1050
emb_insideout_nest= false;
1053
Absorb all preceding duplicate-eliminating ranges. Their strategies
1056
for (int prev_range= 0; prev_range < cur_range; prev_range++)
1058
dups_ranges[cur_range].outer_tables |=
1059
dups_ranges[prev_range].outer_tables;
1061
dups_ranges[0].start_idx= 0; /* Will need to start from the 1st table */
1062
dups_ranges[0].outer_tables= dups_ranges[cur_range].outer_tables;
1067
Check if we are at the end of duplicate-producing range. We are if
1069
1. It's an InsideOut range (which presumes all correlated tables are
1070
in the prefix), and all inner tables are in the join order prefix,
1072
2. It's a DuplicateElimination range (possibly covering several
1073
SJ-nests), and all inner, outer, and correlated tables of all
1074
sj-nests are in the join order prefix.
1076
bool end_of_range= false;
1077
if (emb_insideout_nest &&
1078
bitmap_covers(cur_map, emb_insideout_nest->sj_inner_tables))
1080
/* Save that this range is handled with InsideOut: */
1081
dups_ranges[cur_range].strategy= 1;
1084
else if (bitmap_covers(cur_map, emb_outer_tables | emb_sj_map))
1087
This is a complete range to be handled with either DuplicateWeedout
1090
dups_ranges[cur_range].strategy= dealing_with_jbuf? 3 : 2;
1092
This will hold tables from within the range that need to be put
1093
into the join buffer before we can use the FirstMatch on its tail.
1095
dups_ranges[cur_range].outer_tables= emb_outer_tables &
1102
dups_ranges[cur_range].end_idx= i+1;
1103
emb_sj_map= emb_outer_tables= 0;
1104
emb_insideout_nest= NULL;
1105
dealing_with_jbuf= false;
1106
dups_ranges[++cur_range].strategy= 0;
1111
THD *thd= join->thd;
1112
SJ_TMP_TABLE **next_sjtbl_ptr= &join->sj_tmp_tables;
1114
Second pass: setup the chosen strategies
1116
for (int j= 0; j < cur_range; j++)
1118
JOIN_TAB *tab=join->join_tab + dups_ranges[j].start_idx;
1120
if (dups_ranges[j].strategy == 1) // InsideOut strategy
1122
tab->insideout_match_tab= join->join_tab + dups_ranges[j].end_idx - 1;
1125
else // DuplicateWeedout strategy
1127
SJ_TMP_TABLE::TAB sjtabs[MAX_TABLES];
1128
table_map cur_map= join->const_table_map | PSEUDO_TABLE_BITS;
1129
uint jt_rowid_offset= 0; // # tuple bytes are already occupied (w/o NULL bytes)
1130
uint jt_null_bits= 0; // # null bits in tuple bytes
1131
SJ_TMP_TABLE::TAB *last_tab= sjtabs;
1132
uint rowid_keep_flags= JOIN_TAB::CALL_POSITION | JOIN_TAB::KEEP_ROWID;
1133
JOIN_TAB *last_outer_tab= tab - 1;
1135
Walk through the range and remember
1136
- tables that need their rowids to be put into temptable
1137
- the last outer table
1139
for (; tab < join->join_tab + dups_ranges[j].end_idx; tab++)
1141
if (sj_table_is_included(join, tab))
1143
last_tab->join_tab= tab;
1144
last_tab->rowid_offset= jt_rowid_offset;
1145
jt_rowid_offset += tab->table->file->ref_length;
1146
if (tab->table->maybe_null)
1148
last_tab->null_byte= jt_null_bits / 8;
1149
last_tab->null_bit= jt_null_bits++;
1152
tab->table->prepare_for_position();
1153
tab->rowid_keep_flags= rowid_keep_flags;
1155
cur_map |= tab->table->map;
1156
if (!tab->emb_sj_nest && bitmap_covers(cur_map,
1157
dups_ranges[j].outer_tables))
1158
last_outer_tab= tab;
1161
if (jt_rowid_offset) /* Temptable has at least one rowid */
1163
SJ_TMP_TABLE *sjtbl;
1164
uint tabs_size= (last_tab - sjtabs) * sizeof(SJ_TMP_TABLE::TAB);
1165
if (!(sjtbl= (SJ_TMP_TABLE*)thd->alloc(sizeof(SJ_TMP_TABLE))) ||
1166
!(sjtbl->tabs= (SJ_TMP_TABLE::TAB*) thd->alloc(tabs_size)))
1168
memcpy(sjtbl->tabs, sjtabs, tabs_size);
1169
sjtbl->tabs_end= sjtbl->tabs + (last_tab - sjtabs);
1170
sjtbl->rowid_len= jt_rowid_offset;
1171
sjtbl->null_bits= jt_null_bits;
1172
sjtbl->null_bytes= (jt_null_bits + 7)/8;
1174
*next_sjtbl_ptr= sjtbl;
1175
next_sjtbl_ptr= &(sjtbl->next);
1179
create_duplicate_weedout_tmp_table(thd,
1184
join->join_tab[dups_ranges[j].start_idx].flush_weedout_table= sjtbl;
1185
join->join_tab[dups_ranges[j].end_idx - 1].check_weed_out_table= sjtbl;
1187
tab= last_outer_tab + 1;
1188
jump_to= last_outer_tab;
1191
/* Create the FirstMatch tail */
1192
for (; tab < join->join_tab + dups_ranges[j].end_idx; tab++)
1194
if (tab->emb_sj_nest)
1195
tab->do_firstmatch= jump_to;
1204
static void cleanup_sj_tmp_tables(JOIN *join)
1206
for (SJ_TMP_TABLE *sj_tbl= join->sj_tmp_tables; sj_tbl;
1207
sj_tbl= sj_tbl->next)
1209
if (sj_tbl->tmp_table)
1211
free_tmp_table(join->thd, sj_tbl->tmp_table);
1214
join->sj_tmp_tables= NULL;
1217
uint make_join_orderinfo(JOIN *join);
1220
global select optimisation.
1223
error code saved in field 'error'
1234
// to prevent double initialization on EXPLAIN
1239
thd_proc_info(thd, "optimizing");
1240
row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR :
1241
unit->select_limit_cnt);
1242
/* select_limit is used to decide if we are likely to scan the whole table */
1243
select_limit= unit->select_limit_cnt;
1244
if (having || (select_options & OPTION_FOUND_ROWS))
1245
select_limit= HA_POS_ERROR;
1246
do_send_rows = (unit->select_limit_cnt) ? 1 : 0;
1247
// Ignore errors of execution if option IGNORE present
1248
if (thd->lex->ignore)
1249
thd->lex->current_select->no_error= 1;
1251
#ifdef HAVE_REF_TO_FIELDS // Not done yet
1252
/* Add HAVING to WHERE if possible */
1253
if (having && !group_list && !sum_func_count)
1260
else if ((conds=new Item_cond_and(conds,having)))
1263
Item_cond_and can't be fixed after creation, so we do not check
1266
conds->fix_fields(thd, &conds);
1267
conds->change_ref_to_fields(thd, tables_list);
1268
conds->top_level_item();
1273
SELECT_LEX *sel= thd->lex->current_select;
1274
if (sel->first_cond_optimization)
1277
The following code will allocate the new items in a permanent
1278
MEMROOT for prepared statements and stored procedures.
1280
sel->first_cond_optimization= 0;
1282
/* Convert all outer joins to inner joins if possible */
1283
conds= simplify_joins(this, join_list, conds, true, false);
1284
build_bitmap_for_nested_joins(join_list, 0);
1286
sel->prep_where= conds ? conds->copy_andor_structure(thd) : 0;
1289
conds= optimize_cond(this, conds, join_list, &cond_value);
1290
if (thd->is_error())
1297
having= optimize_cond(this, having, join_list, &having_value);
1298
if (thd->is_error())
1303
if (select_lex->where)
1304
select_lex->cond_value= cond_value;
1305
if (select_lex->having)
1306
select_lex->having_value= having_value;
1308
if (cond_value == Item::COND_FALSE || having_value == Item::COND_FALSE ||
1309
(!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
1310
{ /* Impossible cond */
1311
zero_result_cause= having_value == Item::COND_FALSE ?
1312
"Impossible HAVING" : "Impossible WHERE";
1318
/* Optimize count(*), min() and max() */
1319
if (tables_list && tmp_table_param.sum_func_count && ! group_list)
1323
opt_sum_query() returns HA_ERR_KEY_NOT_FOUND if no rows match
1324
to the WHERE conditions,
1325
or 1 if all items were resolved,
1326
or 0, or an error number HA_ERR_...
1328
if ((res=opt_sum_query(select_lex->leaf_tables, all_fields, conds)))
1330
if (res == HA_ERR_KEY_NOT_FOUND)
1332
zero_result_cause= "No matching min/max row";
1343
zero_result_cause= "No matching min/max row";
1347
zero_result_cause= "Select tables optimized away";
1348
tables_list= 0; // All tables resolved
1350
Extract all table-independent conditions and replace the WHERE
1351
clause with them. All other conditions were computed by opt_sum_query
1352
and the MIN/MAX/COUNT function(s) have been replaced by constants,
1353
so there is no need to compute the whole WHERE clause again.
1354
Notice that make_cond_for_table() will always succeed to remove all
1355
computed conditions, because opt_sum_query() is applicable only to
1357
Preserve conditions for EXPLAIN.
1359
if (conds && !(thd->lex->describe & DESCRIBE_EXTENDED))
1361
COND *table_independent_conds=
1362
make_cond_for_table(conds, PSEUDO_TABLE_BITS, 0, 0);
1363
conds= table_independent_conds;
1372
error= -1; // Error is sent to client
1373
sort_by_table= get_sort_by_table(order, group_list, select_lex->leaf_tables);
1375
/* Calculate how to do the join */
1376
thd_proc_info(thd, "statistics");
1377
if (make_join_statistics(this, select_lex->leaf_tables, conds, &keyuse) ||
1378
thd->is_fatal_error)
1383
/* Remove distinct if only const tables */
1384
select_distinct= select_distinct && (const_tables != tables);
1385
thd_proc_info(thd, "preparing");
1386
if (result->initialize_tables(this))
1388
return(1); // error == -1
1390
if (const_table_map != found_const_table_map &&
1391
!(select_options & SELECT_DESCRIBE) &&
1393
!(conds->used_tables() & RAND_TABLE_BIT) ||
1394
select_lex->master_unit() == &thd->lex->unit)) // upper level SELECT
1396
zero_result_cause= "no matching row in const table";
1400
if (!(thd->options & OPTION_BIG_SELECTS) &&
1401
best_read > (double) thd->variables.max_join_size &&
1402
!(select_options & SELECT_DESCRIBE))
1403
{ /* purecov: inspected */
1404
my_message(ER_TOO_BIG_SELECT, ER(ER_TOO_BIG_SELECT), MYF(0));
1408
if (const_tables && !thd->locked_tables &&
1409
!(select_options & SELECT_NO_UNLOCK))
1410
mysql_unlock_some_tables(thd, table, const_tables);
1411
if (!conds && outer_join)
1413
/* Handle the case where we have an OUTER JOIN without a WHERE */
1414
conds=new Item_int((int64_t) 1,1); // Always true
1416
select= make_select(*table, const_table_map,
1417
const_table_map, conds, 1, &error);
1419
{ /* purecov: inspected */
1420
error= -1; /* purecov: inspected */
1424
reset_nj_counters(join_list);
1425
make_outerjoin_info(this);
1428
Among the equal fields belonging to the same multiple equality
1429
choose the one that is to be retrieved first and substitute
1430
all references to these in where condition for a reference for
1435
conds= substitute_for_best_equal_field(conds, cond_equal, map2table);
1436
conds->update_used_tables();
1440
Permorm the the optimization on fields evaluation mentioned above
1441
for all on expressions.
1443
for (JOIN_TAB *tab= join_tab + const_tables; tab < join_tab + tables ; tab++)
1445
if (*tab->on_expr_ref)
1447
*tab->on_expr_ref= substitute_for_best_equal_field(*tab->on_expr_ref,
1450
(*tab->on_expr_ref)->update_used_tables();
1454
if (conds &&!outer_join && const_table_map != found_const_table_map &&
1455
(select_options & SELECT_DESCRIBE) &&
1456
select_lex->master_unit() == &thd->lex->unit) // upper level SELECT
1458
conds=new Item_int((int64_t) 0,1); // Always false
1460
if (make_join_select(this, select, conds))
1463
"Impossible WHERE noticed after reading const tables";
1464
return(0); // error == 0
1467
error= -1; /* if goto err */
1469
/* Optimize distinct away if possible */
1471
ORDER *org_order= order;
1472
order=remove_const(this, order,conds,1, &simple_order);
1473
if (thd->is_error())
1480
If we are using ORDER BY NULL or ORDER BY const_expression,
1481
return result in any order (even if we are using a GROUP BY)
1483
if (!order && org_order)
1487
Check if we can optimize away GROUP BY/DISTINCT.
1488
We can do that if there are no aggregate functions, the
1489
fields in DISTINCT clause (if present) and/or columns in GROUP BY
1490
(if present) contain direct references to all key parts of
1491
an unique index (in whatever order) and if the key parts of the
1492
unique index cannot contain NULLs.
1493
Note that the unique keys for DISTINCT and GROUP BY should not
1494
be the same (as long as they are unique).
1496
The FROM clause must contain a single non-constant table.
1498
if (tables - const_tables == 1 && (group_list || select_distinct) &&
1499
!tmp_table_param.sum_func_count &&
1500
(!join_tab[const_tables].select ||
1501
!join_tab[const_tables].select->quick ||
1502
join_tab[const_tables].select->quick->get_type() !=
1503
QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX))
1506
list_contains_unique_index(join_tab[const_tables].table,
1507
find_field_in_order_list,
1508
(void *) group_list))
1511
We have found that grouping can be removed since groups correspond to
1512
only one row anyway, but we still have to guarantee correct result
1513
order. The line below effectively rewrites the query from GROUP BY
1514
<fields> to ORDER BY <fields>. There are two exceptions:
1515
- if skip_sort_order is set (see above), then we can simply skip
1517
- we can only rewrite ORDER BY if the ORDER BY fields are 'compatible'
1518
with the GROUP BY ones, i.e. either one is a prefix of another.
1519
We only check if the ORDER BY is a prefix of GROUP BY. In this case
1520
test_if_subpart() copies the ASC/DESC attributes from the original
1522
If GROUP BY is a prefix of ORDER BY, then it is safe to leave
1525
if (!order || test_if_subpart(group_list, order))
1526
order= skip_sort_order ? 0 : group_list;
1528
If we have an IGNORE INDEX FOR GROUP BY(fields) clause, this must be
1529
rewritten to IGNORE INDEX FOR ORDER BY(fields).
1531
join_tab->table->keys_in_use_for_order_by=
1532
join_tab->table->keys_in_use_for_group_by;
1536
if (select_distinct &&
1537
list_contains_unique_index(join_tab[const_tables].table,
1538
find_field_in_item_list,
1539
(void *) &fields_list))
1544
if (group_list || tmp_table_param.sum_func_count)
1546
if (! hidden_group_fields && rollup.state == ROLLUP::STATE_NONE)
1549
else if (select_distinct && tables - const_tables == 1)
1552
We are only using one table. In this case we change DISTINCT to a
1554
- The GROUP BY can be done through indexes (no sort) and the ORDER
1555
BY only uses selected fields.
1556
(In this case we can later optimize away GROUP BY and ORDER BY)
1557
- We are scanning the whole table without LIMIT
1559
- We are using CALC_FOUND_ROWS
1560
- We are using an ORDER BY that can't be optimized away.
1562
We don't want to use this optimization when we are using LIMIT
1563
because in this case we can just create a temporary table that
1564
holds LIMIT rows and stop when this table is full.
1566
JOIN_TAB *tab= &join_tab[const_tables];
1567
bool all_order_fields_used;
1569
skip_sort_order= test_if_skip_sort_order(tab, order, select_limit, 1,
1570
&tab->table->keys_in_use_for_order_by);
1571
if ((group_list=create_distinct_group(thd, select_lex->ref_pointer_array,
1572
order, fields_list, all_fields,
1573
&all_order_fields_used)))
1575
bool skip_group= (skip_sort_order &&
1576
test_if_skip_sort_order(tab, group_list, select_limit, 1,
1577
&tab->table->keys_in_use_for_group_by) != 0);
1578
count_field_types(select_lex, &tmp_table_param, all_fields, 0);
1579
if ((skip_group && all_order_fields_used) ||
1580
select_limit == HA_POS_ERROR ||
1581
(order && !skip_sort_order))
1583
/* Change DISTINCT to GROUP BY */
1586
if (all_order_fields_used)
1588
if (order && skip_sort_order)
1591
Force MySQL to read the table in sorted order to get result in
1594
tmp_table_param.quick_group=0;
1598
group=1; // For end_write_group
1603
else if (thd->is_fatal_error) // End of memory
1608
ORDER *old_group_list;
1609
group_list= remove_const(this, (old_group_list= group_list), conds,
1610
rollup.state == ROLLUP::STATE_NONE,
1612
if (thd->is_error())
1617
if (old_group_list && !group_list)
1620
if (!group_list && group)
1622
order=0; // The output has only one row
1624
select_distinct= 0; // No need in distinct for 1 row
1625
group_optimized_away= 1;
1628
calc_group_buffer(this, group_list);
1629
send_group_parts= tmp_table_param.group_parts; /* Save org parts */
1631
if (test_if_subpart(group_list, order) ||
1632
(!group_list && tmp_table_param.sum_func_count))
1635
// Can't use sort on head table if using row cache
1645
Check if we need to create a temporary table.
1646
This has to be done if all tables are not already read (const tables)
1647
and one of the following conditions holds:
1648
- We are using DISTINCT (simple distinct's are already optimized away)
1649
- We are using an ORDER BY or GROUP BY on fields not in the first table
1650
- We are using different ORDER BY and GROUP BY orders
1651
- The user wants us to buffer the result.
1653
need_tmp= (const_tables != tables &&
1654
((select_distinct || !simple_order || !simple_group) ||
1655
(group_list && order) ||
1656
test(select_options & OPTION_BUFFER_RESULT)));
1658
uint no_jbuf_after= make_join_orderinfo(this);
1659
uint64_t select_opts_for_readinfo=
1660
(select_options & (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) | (0);
1662
sj_tmp_tables= NULL;
1663
if (!select_lex->sj_nests.is_empty())
1664
setup_semijoin_dups_elimination(this, select_opts_for_readinfo,
1667
// No cache for MATCH == 'Don't use join buffering when we use MATCH'.
1668
if (make_join_readinfo(this, select_opts_for_readinfo, no_jbuf_after))
1671
/* Create all structures needed for materialized subquery execution. */
1672
if (setup_subquery_materialization())
1676
is this simple IN subquery?
1678
if (!group_list && !order &&
1679
unit->item && unit->item->substype() == Item_subselect::IN_SUBS &&
1680
tables == 1 && conds &&
1686
if (join_tab[0].type == JT_EQ_REF &&
1687
join_tab[0].ref.items[0]->name == in_left_expr_name)
1689
remove_subq_pushed_predicates(&where);
1690
save_index_subquery_explain_info(join_tab, where);
1691
join_tab[0].type= JT_UNIQUE_SUBQUERY;
1695
subselect_uniquesubquery_engine(thd,
1700
else if (join_tab[0].type == JT_REF &&
1701
join_tab[0].ref.items[0]->name == in_left_expr_name)
1703
remove_subq_pushed_predicates(&where);
1704
save_index_subquery_explain_info(join_tab, where);
1705
join_tab[0].type= JT_INDEX_SUBQUERY;
1709
subselect_indexsubquery_engine(thd,
1716
} else if (join_tab[0].type == JT_REF_OR_NULL &&
1717
join_tab[0].ref.items[0]->name == in_left_expr_name &&
1718
having->name == in_having_cond)
1720
join_tab[0].type= JT_INDEX_SUBQUERY;
1722
conds= remove_additional_cond(conds);
1723
save_index_subquery_explain_info(join_tab, conds);
1725
change_engine(new subselect_indexsubquery_engine(thd,
1735
Need to tell handlers that to play it safe, it should fetch all
1736
columns of the primary key of the tables: this is because MySQL may
1737
build row pointers for the rows, and for all columns of the primary key
1738
the read set has not necessarily been set by the server code.
1740
if (need_tmp || select_distinct || group_list || order)
1742
for (uint i = const_tables; i < tables; i++)
1743
join_tab[i].table->prepare_for_position();
1746
if (const_tables != tables)
1749
Because filesort always does a full table scan or a quick range scan
1750
we must add the removed reference to the select for the table.
1751
We only need to do this when we have a simple_order or simple_group
1752
as in other cases the join is done before the sort.
1754
if ((order || group_list) &&
1755
(join_tab[const_tables].type != JT_ALL) &&
1756
(join_tab[const_tables].type != JT_REF_OR_NULL) &&
1757
((order && simple_order) || (group_list && simple_group)))
1759
if (add_ref_to_table_cond(thd,&join_tab[const_tables])) {
1764
if (!(select_options & SELECT_BIG_RESULT) &&
1767
!test_if_skip_sort_order(&join_tab[const_tables], group_list,
1768
unit->select_limit_cnt, 0,
1769
&join_tab[const_tables].table->
1770
keys_in_use_for_group_by))) ||
1772
tmp_table_param.quick_group)
1774
need_tmp=1; simple_order=simple_group=0; // Force tmp table without sort
1779
Force using of tmp table if sorting by a SP or UDF function due to
1780
their expensive and probably non-deterministic nature.
1782
for (ORDER *tmp_order= order; tmp_order ; tmp_order=tmp_order->next)
1784
Item *item= *tmp_order->item;
1785
if (item->is_expensive())
1787
/* Force tmp table without sort */
1788
need_tmp=1; simple_order=simple_group=0;
1796
if (select_options & SELECT_DESCRIBE)
1804
The loose index scan access method guarantees that all grouping or
1805
duplicate row elimination (for distinct) is already performed
1806
during data retrieval, and that all MIN/MAX functions are already
1807
computed for each group. Thus all MIN/MAX functions should be
1808
treated as regular functions, and there is no need to perform
1809
grouping in the main execution loop.
1810
Notice that currently loose index scan is applicable only for
1811
single table queries, thus it is sufficient to test only the first
1812
join_tab element of the plan for its access method.
1814
if (join_tab->is_using_loose_index_scan())
1815
tmp_table_param.precomputed_group_by= true;
1817
/* Create a tmp table if distinct or if the sort is too complicated */
1820
thd_proc_info(thd, "Creating tmp table");
1822
init_items_ref_array();
1824
tmp_table_param.hidden_field_count= (all_fields.elements -
1825
fields_list.elements);
1826
ORDER *tmp_group= ((!simple_group && !(test_flags & TEST_NO_KEY_GROUP)) ? group_list :
1829
Pushing LIMIT to the temporary table creation is not applicable
1830
when there is ORDER BY or GROUP BY or there is no GROUP BY, but
1831
there are aggregate functions, because in all these cases we need
1834
ha_rows tmp_rows_limit= ((order == 0 || skip_sort_order) &&
1836
!thd->lex->current_select->with_sum_func) ?
1837
select_limit : HA_POS_ERROR;
1839
if (!(exec_tmp_table1=
1840
create_tmp_table(thd, &tmp_table_param, all_fields,
1842
group_list ? 0 : select_distinct,
1843
group_list && simple_group,
1852
We don't have to store rows in temp table that doesn't match HAVING if:
1853
- we are sorting the table and writing complete group rows to the
1855
- We are using DISTINCT without resolving the distinct as a GROUP BY
1858
If having is not handled here, it will be checked before the row
1859
is sent to the client.
1862
(sort_and_group || (exec_tmp_table1->distinct && !group_list)))
1865
/* if group or order on first table, sort first */
1866
if (group_list && simple_group)
1868
thd_proc_info(thd, "Sorting for group");
1869
if (create_sort_index(thd, this, group_list,
1870
HA_POS_ERROR, HA_POS_ERROR, false) ||
1871
alloc_group_fields(this, group_list) ||
1872
make_sum_func_list(all_fields, fields_list, 1) ||
1873
setup_sum_funcs(thd, sum_funcs))
1881
if (make_sum_func_list(all_fields, fields_list, 0) ||
1882
setup_sum_funcs(thd, sum_funcs))
1887
if (!group_list && ! exec_tmp_table1->distinct && order && simple_order)
1889
thd_proc_info(thd, "Sorting for order");
1890
if (create_sort_index(thd, this, order,
1891
HA_POS_ERROR, HA_POS_ERROR, true))
1900
Optimize distinct when used on some of the tables
1901
SELECT DISTINCT t1.a FROM t1,t2 WHERE t1.b=t2.b
1902
In this case we can stop scanning t2 when we have found one t1.a
1905
if (exec_tmp_table1->distinct)
1907
table_map used_tables= thd->used_tables;
1908
JOIN_TAB *last_join_tab= join_tab+tables-1;
1911
if (used_tables & last_join_tab->table->map)
1913
last_join_tab->not_used_in_distinct=1;
1914
} while (last_join_tab-- != join_tab);
1915
/* Optimize "select distinct b from t1 order by key_part_1 limit #" */
1916
if (order && skip_sort_order)
1918
/* Should always succeed */
1919
if (test_if_skip_sort_order(&join_tab[const_tables],
1920
order, unit->select_limit_cnt, 0,
1921
&join_tab[const_tables].table->
1922
keys_in_use_for_order_by))
1928
If this join belongs to an uncacheable subquery save
1931
if (select_lex->uncacheable && !is_top_level_join() &&
1932
init_save_join_tab())
1933
return(-1); /* purecov: inspected */
1942
Restore values in temporary join.
1944
void JOIN::restore_tmp()
1946
memcpy(tmp_join, this, (size_t) sizeof(JOIN));
1953
unit->offset_limit_cnt= (ha_rows)(select_lex->offset_limit ?
1954
select_lex->offset_limit->val_uint() :
1959
if (exec_tmp_table1)
1961
exec_tmp_table1->file->extra(HA_EXTRA_RESET_STATE);
1962
exec_tmp_table1->file->ha_delete_all_rows();
1963
free_io_cache(exec_tmp_table1);
1964
filesort_free_buffers(exec_tmp_table1,0);
1966
if (exec_tmp_table2)
1968
exec_tmp_table2->file->extra(HA_EXTRA_RESET_STATE);
1969
exec_tmp_table2->file->ha_delete_all_rows();
1970
free_io_cache(exec_tmp_table2);
1971
filesort_free_buffers(exec_tmp_table2,0);
1974
set_items_ref_array(items0);
1977
memcpy(join_tab, join_tab_save, sizeof(JOIN_TAB) * tables);
1982
/* Reset of sum functions */
1985
Item_sum *func, **func_ptr= sum_funcs;
1986
while ((func= *(func_ptr++)))
1994
@brief Save the original join layout
1996
@details Saves the original join layout so it can be reused in
1997
re-execution and for EXPLAIN.
1999
@return Operation status
2001
@retval 1 error occurred.
2005
JOIN::init_save_join_tab()
2007
if (!(tmp_join= (JOIN*)thd->alloc(sizeof(JOIN))))
2008
return 1; /* purecov: inspected */
2009
error= 0; // Ensure that tmp_join.error= 0
2016
JOIN::save_join_tab()
2018
if (!join_tab_save && select_lex->master_unit()->uncacheable)
2020
if (!(join_tab_save= (JOIN_TAB*)thd->memdup((uchar*) join_tab,
2021
sizeof(JOIN_TAB) * tables)))
2032
Note, that create_sort_index calls test_if_skip_sort_order and may
2033
finally replace sorting with index scan if there is a LIMIT clause in
2034
the query. It's never shown in EXPLAIN!
2037
When can we have here thd->net.report_error not zero?
2042
List<Item> *columns_list= &fields_list;
2045
thd_proc_info(thd, "executing");
2047
(void) result->prepare2(); // Currently, this cannot fail.
2049
if (!tables_list && (tables || !select_lex->with_sum_func))
2050
{ // Only test of functions
2051
if (select_options & SELECT_DESCRIBE)
2052
select_describe(this, false, false, false,
2053
(zero_result_cause?zero_result_cause:"No tables used"));
2056
result->send_fields(*columns_list,
2057
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF);
2059
We have to test for 'conds' here as the WHERE may not be constant
2060
even if we don't have any tables for prepared statements or if
2061
conds uses something like 'rand()'.
2063
if (cond_value != Item::COND_FALSE &&
2064
(!conds || conds->val_int()) &&
2065
(!having || having->val_int()))
2067
if (do_send_rows && result->send_data(fields_list))
2071
error= (int) result->send_eof();
2072
send_records= ((select_options & OPTION_FOUND_ROWS) ? 1 :
2073
thd->sent_row_count);
2078
error=(int) result->send_eof();
2082
/* Single select (without union) always returns 0 or 1 row */
2083
thd->limit_found_rows= send_records;
2084
thd->examined_row_count= 0;
2088
Don't reset the found rows count if there're no tables as
2089
FOUND_ROWS() may be called. Never reset the examined row count here.
2090
It must be accumulated from all join iterations of all join parts.
2093
thd->limit_found_rows= 0;
2095
if (zero_result_cause)
2097
(void) return_zero_rows(this, result, select_lex->leaf_tables,
2099
send_row_on_empty_set(),
2106
if ((this->select_lex->options & OPTION_SCHEMA_TABLE) &&
2107
get_schema_tables_result(this, PROCESSED_BY_JOIN_EXEC))
2110
if (select_options & SELECT_DESCRIBE)
2113
Check if we managed to optimize ORDER BY away and don't use temporary
2114
table to resolve ORDER BY: in that case, we only may need to do
2115
filesort for GROUP BY.
2117
if (!order && !no_order && (!skip_sort_order || !need_tmp))
2120
Reset 'order' to 'group_list' and reinit variables describing
2124
simple_order= simple_group;
2128
(order != group_list || !(select_options & SELECT_BIG_RESULT)) &&
2129
(const_tables == tables ||
2130
((simple_order || skip_sort_order) &&
2131
test_if_skip_sort_order(&join_tab[const_tables], order,
2133
&join_tab[const_tables].table->
2134
keys_in_use_for_query))))
2137
select_describe(this, need_tmp,
2138
order != 0 && !skip_sort_order,
2140
!tables ? "No tables used" : NullS);
2144
JOIN *curr_join= this;
2145
List<Item> *curr_all_fields= &all_fields;
2146
List<Item> *curr_fields_list= &fields_list;
2147
TABLE *curr_tmp_table= 0;
2149
Initialize examined rows here because the values from all join parts
2150
must be accumulated in examined_row_count. Hence every join
2151
iteration must count from zero.
2153
curr_join->examined_rows= 0;
2155
/* Create a tmp table if distinct or if the sort is too complicated */
2161
We are in a non cacheable sub query. Get the saved join structure
2163
(curr_join may have been modified during last exection and we need
2166
curr_join= tmp_join;
2168
curr_tmp_table= exec_tmp_table1;
2170
/* Copy data to the temporary table */
2171
thd_proc_info(thd, "Copying to tmp table");
2172
if (!curr_join->sort_and_group &&
2173
curr_join->const_tables != curr_join->tables)
2174
curr_join->join_tab[curr_join->const_tables].sorted= 0;
2175
if ((tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table)))
2180
curr_tmp_table->file->info(HA_STATUS_VARIABLE);
2182
if (curr_join->having)
2183
curr_join->having= curr_join->tmp_having= 0; // Allready done
2185
/* Change sum_fields reference to calculated fields in tmp_table */
2186
curr_join->all_fields= *curr_all_fields;
2189
items1= items0 + all_fields.elements;
2190
if (sort_and_group || curr_tmp_table->group)
2192
if (change_to_use_tmp_fields(thd, items1,
2193
tmp_fields_list1, tmp_all_fields1,
2194
fields_list.elements, all_fields))
2199
if (change_refs_to_tmp_fields(thd, items1,
2200
tmp_fields_list1, tmp_all_fields1,
2201
fields_list.elements, all_fields))
2204
curr_join->tmp_all_fields1= tmp_all_fields1;
2205
curr_join->tmp_fields_list1= tmp_fields_list1;
2206
curr_join->items1= items1;
2208
curr_all_fields= &tmp_all_fields1;
2209
curr_fields_list= &tmp_fields_list1;
2210
curr_join->set_items_ref_array(items1);
2212
if (sort_and_group || curr_tmp_table->group)
2214
curr_join->tmp_table_param.field_count+=
2215
curr_join->tmp_table_param.sum_func_count+
2216
curr_join->tmp_table_param.func_count;
2217
curr_join->tmp_table_param.sum_func_count=
2218
curr_join->tmp_table_param.func_count= 0;
2222
curr_join->tmp_table_param.field_count+=
2223
curr_join->tmp_table_param.func_count;
2224
curr_join->tmp_table_param.func_count= 0;
2227
if (curr_tmp_table->group)
2228
{ // Already grouped
2229
if (!curr_join->order && !curr_join->no_order && !skip_sort_order)
2230
curr_join->order= curr_join->group_list; /* order by group */
2231
curr_join->group_list= 0;
2235
If we have different sort & group then we must sort the data by group
2236
and copy it to another tmp table
2237
This code is also used if we are using distinct something
2238
we haven't been able to store in the temporary table yet
2239
like SEC_TO_TIME(SUM(...)).
2242
if ((curr_join->group_list && (!test_if_subpart(curr_join->group_list, curr_join->order) || curr_join->select_distinct)) || (curr_join->select_distinct && curr_join->tmp_table_param.using_indirect_summary_function))
2243
{ /* Must copy to another table */
2244
/* Free first data from old join */
2245
curr_join->join_free();
2246
if (make_simple_join(curr_join, curr_tmp_table))
2248
calc_group_buffer(curr_join, group_list);
2249
count_field_types(select_lex, &curr_join->tmp_table_param,
2250
curr_join->tmp_all_fields1,
2251
curr_join->select_distinct && !curr_join->group_list);
2252
curr_join->tmp_table_param.hidden_field_count=
2253
(curr_join->tmp_all_fields1.elements-
2254
curr_join->tmp_fields_list1.elements);
2257
if (exec_tmp_table2)
2258
curr_tmp_table= exec_tmp_table2;
2261
/* group data to new table */
2264
If the access method is loose index scan then all MIN/MAX
2265
functions are precomputed, and should be treated as regular
2266
functions. See extended comment in JOIN::exec.
2268
if (curr_join->join_tab->is_using_loose_index_scan())
2269
curr_join->tmp_table_param.precomputed_group_by= true;
2271
if (!(curr_tmp_table=
2272
exec_tmp_table2= create_tmp_table(thd,
2273
&curr_join->tmp_table_param,
2276
curr_join->select_distinct &&
2277
!curr_join->group_list,
2278
1, curr_join->select_options,
2282
curr_join->exec_tmp_table2= exec_tmp_table2;
2284
if (curr_join->group_list)
2286
thd_proc_info(thd, "Creating sort index");
2287
if (curr_join->join_tab == join_tab && save_join_tab())
2291
if (create_sort_index(thd, curr_join, curr_join->group_list,
2292
HA_POS_ERROR, HA_POS_ERROR, false) ||
2293
make_group_fields(this, curr_join))
2297
sortorder= curr_join->sortorder;
2300
thd_proc_info(thd, "Copying to group table");
2302
if (curr_join != this)
2306
curr_join->sum_funcs= sum_funcs2;
2307
curr_join->sum_funcs_end= sum_funcs_end2;
2311
curr_join->alloc_func_list();
2312
sum_funcs2= curr_join->sum_funcs;
2313
sum_funcs_end2= curr_join->sum_funcs_end;
2316
if (curr_join->make_sum_func_list(*curr_all_fields, *curr_fields_list,
2319
curr_join->group_list= 0;
2320
if (!curr_join->sort_and_group &&
2321
curr_join->const_tables != curr_join->tables)
2322
curr_join->join_tab[curr_join->const_tables].sorted= 0;
2323
if (setup_sum_funcs(curr_join->thd, curr_join->sum_funcs) ||
2324
(tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table)))
2329
end_read_record(&curr_join->join_tab->read_record);
2330
curr_join->const_tables= curr_join->tables; // Mark free for cleanup()
2331
curr_join->join_tab[0].table= 0; // Table is freed
2333
// No sum funcs anymore
2336
items2= items1 + all_fields.elements;
2337
if (change_to_use_tmp_fields(thd, items2,
2338
tmp_fields_list2, tmp_all_fields2,
2339
fields_list.elements, tmp_all_fields1))
2341
curr_join->tmp_fields_list2= tmp_fields_list2;
2342
curr_join->tmp_all_fields2= tmp_all_fields2;
2344
curr_fields_list= &curr_join->tmp_fields_list2;
2345
curr_all_fields= &curr_join->tmp_all_fields2;
2346
curr_join->set_items_ref_array(items2);
2347
curr_join->tmp_table_param.field_count+=
2348
curr_join->tmp_table_param.sum_func_count;
2349
curr_join->tmp_table_param.sum_func_count= 0;
2351
if (curr_tmp_table->distinct)
2352
curr_join->select_distinct=0; /* Each row is unique */
2354
curr_join->join_free(); /* Free quick selects */
2355
if (curr_join->select_distinct && ! curr_join->group_list)
2357
thd_proc_info(thd, "Removing duplicates");
2358
if (curr_join->tmp_having)
2359
curr_join->tmp_having->update_used_tables();
2360
if (remove_duplicates(curr_join, curr_tmp_table,
2361
*curr_fields_list, curr_join->tmp_having))
2363
curr_join->tmp_having=0;
2364
curr_join->select_distinct=0;
2366
curr_tmp_table->reginfo.lock_type= TL_UNLOCK;
2367
if (make_simple_join(curr_join, curr_tmp_table))
2369
calc_group_buffer(curr_join, curr_join->group_list);
2370
count_field_types(select_lex, &curr_join->tmp_table_param,
2371
*curr_all_fields, 0);
2375
if (curr_join->group || curr_join->tmp_table_param.sum_func_count)
2377
if (make_group_fields(this, curr_join))
2384
init_items_ref_array();
2385
items3= ref_pointer_array + (all_fields.elements*4);
2386
setup_copy_fields(thd, &curr_join->tmp_table_param,
2387
items3, tmp_fields_list3, tmp_all_fields3,
2388
curr_fields_list->elements, *curr_all_fields);
2389
tmp_table_param.save_copy_funcs= curr_join->tmp_table_param.copy_funcs;
2390
tmp_table_param.save_copy_field= curr_join->tmp_table_param.copy_field;
2391
tmp_table_param.save_copy_field_end=
2392
curr_join->tmp_table_param.copy_field_end;
2393
curr_join->tmp_all_fields3= tmp_all_fields3;
2394
curr_join->tmp_fields_list3= tmp_fields_list3;
2398
curr_join->tmp_table_param.copy_funcs= tmp_table_param.save_copy_funcs;
2399
curr_join->tmp_table_param.copy_field= tmp_table_param.save_copy_field;
2400
curr_join->tmp_table_param.copy_field_end=
2401
tmp_table_param.save_copy_field_end;
2403
curr_fields_list= &tmp_fields_list3;
2404
curr_all_fields= &tmp_all_fields3;
2405
curr_join->set_items_ref_array(items3);
2407
if (curr_join->make_sum_func_list(*curr_all_fields, *curr_fields_list,
2409
setup_sum_funcs(curr_join->thd, curr_join->sum_funcs) ||
2410
thd->is_fatal_error)
2413
if (curr_join->group_list || curr_join->order)
2415
thd_proc_info(thd, "Sorting result");
2416
/* If we have already done the group, add HAVING to sorted table */
2417
if (curr_join->tmp_having && ! curr_join->group_list &&
2418
! curr_join->sort_and_group)
2420
// Some tables may have been const
2421
curr_join->tmp_having->update_used_tables();
2422
JOIN_TAB *curr_table= &curr_join->join_tab[curr_join->const_tables];
2423
table_map used_tables= (curr_join->const_table_map |
2424
curr_table->table->map);
2426
Item* sort_table_cond= make_cond_for_table(curr_join->tmp_having,
2429
if (sort_table_cond)
2431
if (!curr_table->select)
2432
if (!(curr_table->select= new SQL_SELECT))
2434
if (!curr_table->select->cond)
2435
curr_table->select->cond= sort_table_cond;
2436
else // This should never happen
2438
if (!(curr_table->select->cond=
2439
new Item_cond_and(curr_table->select->cond,
2443
Item_cond_and do not need fix_fields for execution, its parameters
2444
are fixed or do not need fix_fields, too
2446
curr_table->select->cond->quick_fix_field();
2448
curr_table->select_cond= curr_table->select->cond;
2449
curr_table->select_cond->top_level_item();
2450
curr_join->tmp_having= make_cond_for_table(curr_join->tmp_having,
2457
curr_join->select_limit= HA_POS_ERROR;
2461
We can abort sorting after thd->select_limit rows if we there is no
2462
WHERE clause for any tables after the sorted one.
2464
JOIN_TAB *curr_table= &curr_join->join_tab[curr_join->const_tables+1];
2465
JOIN_TAB *end_table= &curr_join->join_tab[curr_join->tables];
2466
for (; curr_table < end_table ; curr_table++)
2469
table->keyuse is set in the case there was an original WHERE clause
2470
on the table that was optimized away.
2472
if (curr_table->select_cond ||
2473
(curr_table->keyuse && !curr_table->first_inner))
2475
/* We have to sort all rows */
2476
curr_join->select_limit= HA_POS_ERROR;
2481
if (curr_join->join_tab == join_tab && save_join_tab())
2486
Here we sort rows for ORDER BY/GROUP BY clause, if the optimiser
2487
chose FILESORT to be faster than INDEX SCAN or there is no
2488
suitable index present.
2489
Note, that create_sort_index calls test_if_skip_sort_order and may
2490
finally replace sorting with index scan if there is a LIMIT clause in
2491
the query. XXX: it's never shown in EXPLAIN!
2492
OPTION_FOUND_ROWS supersedes LIMIT and is taken into account.
2494
if (create_sort_index(thd, curr_join,
2495
curr_join->group_list ?
2496
curr_join->group_list : curr_join->order,
2497
curr_join->select_limit,
2498
(select_options & OPTION_FOUND_ROWS ?
2499
HA_POS_ERROR : unit->select_limit_cnt),
2500
curr_join->group_list ? true : false))
2502
sortorder= curr_join->sortorder;
2503
if (curr_join->const_tables != curr_join->tables &&
2504
!curr_join->join_tab[curr_join->const_tables].table->sort.io_cache)
2507
If no IO cache exists for the first table then we are using an
2508
INDEX SCAN and no filesort. Thus we should not remove the sorted
2509
attribute on the INDEX SCAN.
2515
/* XXX: When can we have here thd->is_error() not zero? */
2516
if (thd->is_error())
2518
error= thd->is_error();
2521
curr_join->having= curr_join->tmp_having;
2522
curr_join->fields= curr_fields_list;
2525
thd_proc_info(thd, "Sending data");
2526
result->send_fields(*curr_fields_list,
2527
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF);
2528
error= do_select(curr_join, curr_fields_list, NULL);
2529
thd->limit_found_rows= curr_join->send_records;
2532
/* Accumulate the counts from all join iterations of all join parts. */
2533
thd->examined_row_count+= curr_join->examined_rows;
2536
With EXPLAIN EXTENDED we have to restore original ref_array
2537
for a derived table which is always materialized.
2538
Otherwise we would not be able to print the query correctly.
2541
(thd->lex->describe & DESCRIBE_EXTENDED) &&
2542
select_lex->linkage == DERIVED_TABLE_TYPE)
2543
set_items_ref_array(items0);
2553
Return error that hold JOIN.
2559
select_lex->join= 0;
2563
if (join_tab != tmp_join->join_tab)
2565
JOIN_TAB *tab, *end;
2566
for (tab= join_tab, end= tab+tables ; tab != end ; tab++)
2569
tmp_join->tmp_join= 0;
2570
tmp_table_param.copy_field=0;
2571
return(tmp_join->destroy());
2576
if (exec_tmp_table1)
2577
free_tmp_table(thd, exec_tmp_table1);
2578
if (exec_tmp_table2)
2579
free_tmp_table(thd, exec_tmp_table2);
2581
delete_dynamic(&keyuse);
317
2588
An entry point to single-unit select (a select without UNION).
319
@param session thread Cursor
2590
@param thd thread handler
320
2591
@param rref_pointer_array a reference to ref_pointer_array of
321
2592
the top-level select_lex for this query
322
2593
@param tables list of all tables used in this query.
323
2594
The tables have been pre-opened.
324
@param wild_num number of wildcards used in the top level
2595
@param wild_num number of wildcards used in the top level
325
2596
select of this query.
326
2597
For example statement
327
2598
SELECT *, t1.*, catalog.t2.* FROM t0, t1, t2;
448
session->set_proc_info("end");
2722
thd_proc_info(thd, "end");
449
2723
err|= select_lex->cleanup();
450
return(err || session->is_error());
2724
return(err || thd->is_error());
452
2726
return(join->error);
455
inline Item *and_items(Item* cond, Item *item)
2730
int subq_sj_candidate_cmp(Item_in_subselect* const *el1,
2731
Item_in_subselect* const *el2)
2733
return ((*el1)->sj_convert_priority < (*el2)->sj_convert_priority) ? 1 :
2734
( ((*el1)->sj_convert_priority == (*el2)->sj_convert_priority)? 0 : -1);
2738
inline Item * and_items(Item* cond, Item *item)
457
2740
return (cond? (new Item_cond_and(cond, item)) : item);
2744
static TABLE_LIST *alloc_join_nest(THD *thd)
2747
if (!(tbl= (TABLE_LIST*) thd->calloc(ALIGN_SIZE(sizeof(TABLE_LIST))+
2748
sizeof(NESTED_JOIN))))
2750
tbl->nested_join= (NESTED_JOIN*) ((uchar*)tbl +
2751
ALIGN_SIZE(sizeof(TABLE_LIST)));
2756
void fix_list_after_tbl_changes(SELECT_LEX *new_parent, List<TABLE_LIST> *tlist)
2758
List_iterator<TABLE_LIST> it(*tlist);
2760
while ((table= it++))
2763
table->on_expr->fix_after_pullout(new_parent, &table->on_expr);
2764
if (table->nested_join)
2765
fix_list_after_tbl_changes(new_parent, &table->nested_join->join_list);
2771
Convert a subquery predicate into a TABLE_LIST semi-join nest
2774
convert_subq_to_sj()
2775
parent_join Parent join, the one that has subq_pred in its WHERE/ON
2777
subq_pred Subquery predicate to be converted
2780
Convert a subquery predicate into a TABLE_LIST semi-join nest. All the
2781
prerequisites are already checked, so the conversion is always successfull.
2783
Prepared Statements: the transformation is permanent:
2784
- Changes in TABLE_LIST structures are naturally permanent
2785
- Item tree changes are performed on statement MEM_ROOT:
2786
= we activate statement MEM_ROOT
2787
= this function is called before the first fix_prepare_information
2790
This is intended because the criteria for subquery-to-sj conversion remain
2791
constant for the lifetime of the Prepared Statement.
2795
true Out of memory error
2798
bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred)
2800
SELECT_LEX *parent_lex= parent_join->select_lex;
2801
TABLE_LIST *emb_tbl_nest= NULL;
2802
List<TABLE_LIST> *emb_join_list= &parent_lex->top_join_list;
2803
THD *thd= parent_join->thd;
2806
1. Find out where to put the predicate into.
2807
Note: for "t1 LEFT JOIN t2" this will be t2, a leaf.
2809
if ((void*)subq_pred->expr_join_nest != (void*)1)
2811
if (subq_pred->expr_join_nest->nested_join)
2816
... [LEFT] JOIN ( ... ) ON (subquery AND whatever) ...
2818
The sj-nest will be inserted into the brackets nest.
2820
emb_tbl_nest= subq_pred->expr_join_nest;
2821
emb_join_list= &emb_tbl_nest->nested_join->join_list;
2823
else if (!subq_pred->expr_join_nest->outer_join)
2828
... INNER JOIN tblX ON (subquery AND whatever) ...
2830
The sj-nest will be tblX's "sibling", i.e. another child of its
2831
parent. This is ok because tblX is joined as an inner join.
2833
emb_tbl_nest= subq_pred->expr_join_nest->embedding;
2835
emb_join_list= &emb_tbl_nest->nested_join->join_list;
2837
else if (!subq_pred->expr_join_nest->nested_join)
2839
TABLE_LIST *outer_tbl= subq_pred->expr_join_nest;
2840
TABLE_LIST *wrap_nest;
2844
... LEFT JOIN tbl ON (on_expr AND subq_pred) ...
2846
we'll need to convert it into:
2848
... LEFT JOIN ( tbl SJ (subq_tables) ) ON (on_expr AND subq_pred) ...
2850
|<----- wrap_nest ---->|
2852
Q: other subqueries may be pointing to this element. What to do?
2853
A1: simple solution: copy *subq_pred->expr_join_nest= *parent_nest.
2854
But we'll need to fix other pointers.
2855
A2: Another way: have TABLE_LIST::next_ptr so the following
2856
subqueries know the table has been nested.
2857
A3: changes in the TABLE_LIST::outer_join will make everything work
2860
if (!(wrap_nest= alloc_join_nest(parent_join->thd)))
2864
wrap_nest->embedding= outer_tbl->embedding;
2865
wrap_nest->join_list= outer_tbl->join_list;
2866
wrap_nest->alias= (char*) "(sj-wrap)";
2868
wrap_nest->nested_join->join_list.empty();
2869
wrap_nest->nested_join->join_list.push_back(outer_tbl);
2871
outer_tbl->embedding= wrap_nest;
2872
outer_tbl->join_list= &wrap_nest->nested_join->join_list;
2875
wrap_nest will take place of outer_tbl, so move the outer join flag
2878
wrap_nest->outer_join= outer_tbl->outer_join;
2879
outer_tbl->outer_join= 0;
2881
wrap_nest->on_expr= outer_tbl->on_expr;
2882
outer_tbl->on_expr= NULL;
2884
List_iterator<TABLE_LIST> li(*wrap_nest->join_list);
2888
if (tbl == outer_tbl)
2890
li.replace(wrap_nest);
2895
Ok now wrap_nest 'contains' outer_tbl and we're ready to add the
2896
semi-join nest into it
2898
emb_join_list= &wrap_nest->nested_join->join_list;
2899
emb_tbl_nest= wrap_nest;
2903
TABLE_LIST *sj_nest;
2904
NESTED_JOIN *nested_join;
2905
if (!(sj_nest= alloc_join_nest(parent_join->thd)))
2909
nested_join= sj_nest->nested_join;
2911
sj_nest->join_list= emb_join_list;
2912
sj_nest->embedding= emb_tbl_nest;
2913
sj_nest->alias= (char*) "(sj-nest)";
2914
/* Nests do not participate in those 'chains', so: */
2915
/* sj_nest->next_leaf= sj_nest->next_local= sj_nest->next_global == NULL*/
2916
emb_join_list->push_back(sj_nest);
2919
nested_join->used_tables and nested_join->not_null_tables are
2920
initialized in simplify_joins().
2924
2. Walk through subquery's top list and set 'embedding' to point to the
2927
st_select_lex *subq_lex= subq_pred->unit->first_select();
2928
nested_join->join_list.empty();
2929
List_iterator_fast<TABLE_LIST> li(subq_lex->top_join_list);
2930
TABLE_LIST *tl, *last_leaf;
2933
tl->embedding= sj_nest;
2934
tl->join_list= &nested_join->join_list;
2935
nested_join->join_list.push_back(tl);
2939
Reconnect the next_leaf chain.
2940
TODO: Do we have to put subquery's tables at the end of the chain?
2941
Inserting them at the beginning would be a bit faster.
2942
NOTE: We actually insert them at the front! That's because the order is
2943
reversed in this list.
2945
for (tl= parent_lex->leaf_tables; tl->next_leaf; tl= tl->next_leaf) {};
2946
tl->next_leaf= subq_lex->leaf_tables;
2950
Same as above for next_local chain
2951
(a theory: a next_local chain always starts with ::leaf_tables
2952
because view's tables are inserted after the view)
2954
for (tl= parent_lex->leaf_tables; tl->next_local; tl= tl->next_local) {};
2955
tl->next_local= subq_lex->leaf_tables;
2957
/* A theory: no need to re-connect the next_global chain */
2959
/* 3. Remove the original subquery predicate from the WHERE/ON */
2961
// The subqueries were replaced for Item_int(1) earlier
2962
subq_pred->exec_method= Item_in_subselect::SEMI_JOIN; // for subsequent executions
2963
/*TODO: also reset the 'with_subselect' there. */
2965
/* n. Adjust the parent_join->tables counter */
2966
uint table_no= parent_join->tables;
2967
/* n. Walk through child's tables and adjust table->map */
2968
for (tl= subq_lex->leaf_tables; tl; tl= tl->next_leaf, table_no++)
2970
tl->table->tablenr= table_no;
2971
tl->table->map= ((table_map)1) << table_no;
2972
SELECT_LEX *old_sl= tl->select_lex;
2973
tl->select_lex= parent_join->select_lex;
2974
for(TABLE_LIST *emb= tl->embedding; emb && emb->select_lex == old_sl; emb= emb->embedding)
2975
emb->select_lex= parent_join->select_lex;
2977
parent_join->tables += subq_lex->join->tables;
2980
Put the subquery's WHERE into semi-join's sj_on_expr
2981
Add the subquery-induced equalities too.
2983
SELECT_LEX *save_lex= thd->lex->current_select;
2984
thd->lex->current_select=subq_lex;
2985
if (!subq_pred->left_expr->fixed &&
2986
subq_pred->left_expr->fix_fields(thd, &subq_pred->left_expr))
2988
thd->lex->current_select=save_lex;
2990
sj_nest->nested_join->sj_corr_tables= subq_pred->used_tables();
2991
sj_nest->nested_join->sj_depends_on= subq_pred->used_tables() |
2992
subq_pred->left_expr->used_tables();
2993
sj_nest->sj_on_expr= subq_lex->where;
2996
Create the IN-equalities and inject them into semi-join's ON expression.
2997
Additionally, for InsideOut strategy
2998
- Record the number of IN-equalities.
2999
- Create list of pointers to (oe1, ..., ieN). We'll need the list to
3000
see which of the expressions are bound and which are not (for those
3001
we'll produce a distinct stream of (ie_i1,...ie_ik).
3003
(TODO: can we just create a list of pointers and hope the expressions
3004
will not substitute themselves on fix_fields()? or we need to wrap
3005
them into Item_direct_view_refs and store pointers to those. The
3006
pointers to Item_direct_view_refs are guaranteed to be stable as
3007
Item_direct_view_refs doesn't substitute itself with anything in
3008
Item_direct_view_ref::fix_fields.
3010
sj_nest->sj_in_exprs= subq_pred->left_expr->cols();
3011
sj_nest->nested_join->sj_outer_expr_list.empty();
3013
if (subq_pred->left_expr->cols() == 1)
3015
nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr);
3017
Item *item_eq= new Item_func_eq(subq_pred->left_expr,
3018
subq_lex->ref_pointer_array[0]);
3019
item_eq->name= (char*)subq_sj_cond_name;
3020
sj_nest->sj_on_expr= and_items(sj_nest->sj_on_expr, item_eq);
3024
for (uint i= 0; i < subq_pred->left_expr->cols(); i++)
3026
nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr->
3029
new Item_func_eq(subq_pred->left_expr->element_index(i),
3030
subq_lex->ref_pointer_array[i]);
3031
item_eq->name= (char*)subq_sj_cond_name + (i % 64);
3032
sj_nest->sj_on_expr= and_items(sj_nest->sj_on_expr, item_eq);
3035
/* Fix the created equality and AND */
3036
sj_nest->sj_on_expr->fix_fields(parent_join->thd, &sj_nest->sj_on_expr);
3039
Walk through sj nest's WHERE and ON expressions and call
3040
item->fix_table_changes() for all items.
3042
sj_nest->sj_on_expr->fix_after_pullout(parent_lex, &sj_nest->sj_on_expr);
3043
fix_list_after_tbl_changes(parent_lex, &sj_nest->nested_join->join_list);
3046
/* Unlink the child select_lex so it doesn't show up in EXPLAIN: */
3047
subq_lex->master_unit()->exclude_level();
3049
/* Inject sj_on_expr into the parent's WHERE or ON */
3052
emb_tbl_nest->on_expr= and_items(emb_tbl_nest->on_expr,
3053
sj_nest->sj_on_expr);
3054
emb_tbl_nest->on_expr->fix_fields(parent_join->thd, &emb_tbl_nest->on_expr);
3058
/* Inject into the WHERE */
3059
parent_join->conds= and_items(parent_join->conds, sj_nest->sj_on_expr);
3060
parent_join->conds->fix_fields(parent_join->thd, &parent_join->conds);
3061
parent_join->select_lex->where= parent_join->conds;
3069
Convert candidate subquery predicates to semi-joins
3072
JOIN::flatten_subqueries()
3075
Convert candidate subquery predicates to semi-joins.
3082
bool JOIN::flatten_subqueries()
3084
Item_in_subselect **in_subq;
3085
Item_in_subselect **in_subq_end;
3087
if (sj_subselects.elements() == 0)
3090
/* 1. Fix children subqueries */
3091
for (in_subq= sj_subselects.front(), in_subq_end= sj_subselects.back();
3092
in_subq != in_subq_end; in_subq++)
3094
JOIN *child_join= (*in_subq)->unit->first_select()->join;
3095
child_join->outer_tables = child_join->tables;
3096
if (child_join->flatten_subqueries())
3098
(*in_subq)->sj_convert_priority=
3099
(*in_subq)->is_correlated * MAX_TABLES + child_join->outer_tables;
3102
//dump_TABLE_LIST_struct(select_lex, select_lex->leaf_tables);
3104
2. Pick which subqueries to convert:
3105
sort the subquery array
3106
- prefer correlated subqueries over uncorrelated;
3107
- prefer subqueries that have greater number of outer tables;
3109
sj_subselects.sort(subq_sj_candidate_cmp);
3110
// #tables-in-parent-query + #tables-in-subquery < MAX_TABLES
3111
/* Replace all subqueries to be flattened with Item_int(1) */
3112
for (in_subq= sj_subselects.front();
3113
in_subq != in_subq_end &&
3114
tables + ((*in_subq)->sj_convert_priority % MAX_TABLES) < MAX_TABLES;
3117
if (replace_where_subcondition(this, *in_subq, new Item_int(1), false))
3121
for (in_subq= sj_subselects.front();
3122
in_subq != in_subq_end &&
3123
tables + ((*in_subq)->sj_convert_priority % MAX_TABLES) < MAX_TABLES;
3126
if (convert_subq_to_sj(this, *in_subq))
3130
/* 3. Finalize those we didn't convert */
3131
for (; in_subq!= in_subq_end; in_subq++)
3133
JOIN *child_join= (*in_subq)->unit->first_select()->join;
3134
Item_subselect::trans_res res;
3135
(*in_subq)->changed= 0;
3136
(*in_subq)->fixed= 0;
3137
res= (*in_subq)->select_transformer(child_join);
3138
if (res == Item_subselect::RES_ERROR)
3141
(*in_subq)->changed= 1;
3142
(*in_subq)->fixed= 1;
3144
Item *substitute= (*in_subq)->substitution;
3145
bool do_fix_fields= !(*in_subq)->substitution->fixed;
3146
if (replace_where_subcondition(this, *in_subq, substitute, do_fix_fields))
3149
//if ((*in_subq)->fix_fields(thd, (*in_subq)->ref_ptr))
3152
sj_subselects.clear();
3158
Setup for execution all subqueries of a query, for which the optimizer
3159
chose hash semi-join.
3161
@details Iterate over all subqueries of the query, and if they are under an
3162
IN predicate, and the optimizer chose to compute it via hash semi-join:
3163
- try to initialize all data structures needed for the materialized execution
3164
of the IN predicate,
3165
- if this fails, then perform the IN=>EXISTS transformation which was
3166
previously blocked during JOIN::prepare.
3168
This method is part of the "code generation" query processing phase.
3170
This phase must be called after substitute_for_best_equal_field() because
3171
that function may replace items with other items from a multiple equality,
3172
and we need to reference the correct items in the index access method of the
3175
@return Operation status
3176
@retval false success.
3177
@retval true error occurred.
3180
bool JOIN::setup_subquery_materialization()
3182
for (SELECT_LEX_UNIT *un= select_lex->first_inner_unit(); un;
3183
un= un->next_unit())
3185
for (SELECT_LEX *sl= un->first_select(); sl; sl= sl->next_select())
3187
Item_subselect *subquery_predicate= sl->master_unit()->item;
3188
if (subquery_predicate &&
3189
subquery_predicate->substype() == Item_subselect::IN_SUBS)
3191
Item_in_subselect *in_subs= (Item_in_subselect*) subquery_predicate;
3192
if (in_subs->exec_method == Item_in_subselect::MATERIALIZATION &&
3193
in_subs->setup_engine())
3203
Check if table's KEYUSE elements have an eq_ref(outer_tables) candidate
3206
find_eq_ref_candidate()
3207
table Table to be checked
3208
sj_inner_tables Bitmap of inner tables. eq_ref(inner_table) doesn't
3212
Check if table's KEYUSE elements have an eq_ref(outer_tables) candidate
3215
Check again if it is feasible to factor common parts with constant table
3219
true - There exists an eq_ref(outer-tables) candidate
3223
bool find_eq_ref_candidate(TABLE *table, table_map sj_inner_tables)
3225
KEYUSE *keyuse= table->reginfo.join_tab->keyuse;
3230
while (1) /* For each key */
3233
KEY *keyinfo= table->key_info + key;
3234
key_part_map bound_parts= 0;
3235
if ((keyinfo->flags & HA_NOSAME) == HA_NOSAME)
3237
do /* For all equalities on all key parts */
3239
/* Check if this is "t.keypart = expr(outer_tables) */
3240
if (!(keyuse->used_tables & sj_inner_tables) &&
3241
!(keyuse->optimize & KEY_OPTIMIZE_REF_OR_NULL))
3243
bound_parts |= 1 << keyuse->keypart;
3246
} while (keyuse->key == key && keyuse->table == table);
3248
if (bound_parts == PREV_BITS(uint, keyinfo->key_parts))
3250
if (keyuse->table != table)
3258
if (keyuse->table != table)
3261
while (keyuse->key == key);
3270
Pull tables out of semi-join nests, if possible
3273
pull_out_semijoin_tables()
3274
join The join where to do the semi-join flattening
3277
Try to pull tables out of semi-join nests.
3280
When this function is called, the join may have several semi-join nests
3281
(possibly within different semi-join nests), but it is guaranteed that
3282
one semi-join nest does not contain another.
3285
A table can be pulled out of the semi-join nest if
3286
- It is a constant table
3290
* Pulled out tables have JOIN_TAB::emb_sj_nest == NULL (like the outer
3292
* Tables that were not pulled out have JOIN_TAB::emb_sj_nest.
3293
* Semi-join nests TABLE_LIST::sj_inner_tables
3295
This operation is (and should be) performed at each PS execution since
3296
tables may become/cease to be constant across PS reexecutions.
3300
1 - Out of memory error
3303
int pull_out_semijoin_tables(JOIN *join)
3305
TABLE_LIST *sj_nest;
3306
List_iterator<TABLE_LIST> sj_list_it(join->select_lex->sj_nests);
3308
/* Try pulling out of the each of the semi-joins */
3309
while ((sj_nest= sj_list_it++))
3311
/* Action #1: Mark the constant tables to be pulled out */
3312
table_map pulled_tables= 0;
3314
List_iterator<TABLE_LIST> child_li(sj_nest->nested_join->join_list);
3316
while ((tbl= child_li++))
3320
tbl->table->reginfo.join_tab->emb_sj_nest= sj_nest;
3321
if (tbl->table->map & join->const_table_map)
3323
pulled_tables |= tbl->table->map;
3329
Action #2: Find which tables we can pull out based on
3330
update_ref_and_keys() data. Note that pulling one table out can allow
3331
us to pull out some other tables too.
3333
bool pulled_a_table;
3336
pulled_a_table= false;
3338
while ((tbl= child_li++))
3340
if (tbl->table && !(pulled_tables & tbl->table->map))
3342
if (find_eq_ref_candidate(tbl->table,
3343
sj_nest->nested_join->used_tables &
3346
pulled_a_table= true;
3347
pulled_tables |= tbl->table->map;
3351
} while (pulled_a_table);
3354
if ((sj_nest)->nested_join->used_tables == pulled_tables)
3356
(sj_nest)->sj_inner_tables= 0;
3357
while ((tbl= child_li++))
3360
tbl->table->reginfo.join_tab->emb_sj_nest= NULL;
3365
/* Record the bitmap of inner tables, mark the inner tables */
3366
table_map inner_tables=(sj_nest)->nested_join->used_tables &
3368
(sj_nest)->sj_inner_tables= inner_tables;
3369
while ((tbl= child_li++))
3373
if (inner_tables & tbl->table->map)
3374
tbl->table->reginfo.join_tab->emb_sj_nest= (sj_nest);
3376
tbl->table->reginfo.join_tab->emb_sj_nest= NULL;
460
3384
/*****************************************************************************
461
Create JoinTableS, make a guess about the table types,
3385
Create JOIN_TABS, make a guess about the table types,
462
3386
Approximate how many records will be used in each table
463
3387
*****************************************************************************/
464
ha_rows get_quick_record_count(Session *session, optimizer::SqlSelect *select, Table *table, const key_map *keys,ha_rows limit)
3390
static ha_rows get_quick_record_count(THD *thd, SQL_SELECT *select,
3392
const key_map *keys,ha_rows limit)
467
if (check_stack_overrun(session, STACK_MIN_SIZE, NULL))
3395
if (check_stack_overrun(thd, STACK_MIN_SIZE, NULL))
468
3396
return(0); // Fatal error flag is set
471
3399
select->head=table;
472
3400
table->reginfo.impossible_range=0;
473
if ((error= select->test_quick_select(session, *(key_map *)keys,(table_map) 0,
3401
if ((error= select->test_quick_select(thd, *(key_map *)keys,(table_map) 0,
474
3402
limit, 0, false)) == 1)
475
3403
return(select->quick->records);
476
3404
if (error == -1)
482
3410
return(HA_POS_ERROR); /* This shouldn't happend */
3414
This structure is used to collect info on potentially sargable
3415
predicates in order to check whether they become sargable after
3416
reading const tables.
3417
We form a bitmap of indexes that can be used for sargable predicates.
3418
Only such indexes are involved in range analysis.
3420
typedef struct st_sargable_param
3422
Field *field; /* field against which to check sargability */
3423
Item **arg_value; /* values of potential keys for lookups */
3424
uint num_values; /* number of values in the above array */
3428
Calculate the best possible join and initialize the join structure.
3437
make_join_statistics(JOIN *join, TABLE_LIST *tables, COND *conds,
3438
DYNAMIC_ARRAY *keyuse_array)
3442
uint i,table_count,const_count,key;
3443
table_map found_const_table_map, all_table_map, found_ref, refs;
3444
key_map const_ref, eq_part;
3445
TABLE **table_vector;
3446
JOIN_TAB *stat,*stat_end,*s,**stat_ref;
3447
KEYUSE *keyuse,*start_keyuse;
3448
table_map outer_join=0;
3449
SARGABLE_PARAM *sargables= 0;
3450
JOIN_TAB *stat_vector[MAX_TABLES+1];
3452
table_count=join->tables;
3453
stat=(JOIN_TAB*) join->thd->calloc(sizeof(JOIN_TAB)*table_count);
3454
stat_ref=(JOIN_TAB**) join->thd->alloc(sizeof(JOIN_TAB*)*MAX_TABLES);
3455
table_vector=(TABLE**) join->thd->alloc(sizeof(TABLE*)*(table_count*2));
3456
if (!stat || !stat_ref || !table_vector)
3457
return(1); // Eom /* purecov: inspected */
3459
join->best_ref=stat_vector;
3461
stat_end=stat+table_count;
3462
found_const_table_map= all_table_map=0;
3467
s++, tables= tables->next_leaf, i++)
3469
TABLE_LIST *embedding= tables->embedding;
3472
s->const_keys.init();
3473
s->checked_keys.init();
3474
s->needed_reg.init();
3475
table_vector[i]=s->table=table=tables->table;
3476
table->pos_in_table_list= tables;
3477
error= table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
3480
table->file->print_error(error, MYF(0));
3483
table->quick_keys.clear_all();
3484
table->reginfo.join_tab=s;
3485
table->reginfo.not_exists_optimize=0;
3486
bzero((char*) table->const_key_parts, sizeof(key_part_map)*table->s->keys);
3487
all_table_map|= table->map;
3489
s->info=0; // For describe
3491
s->dependent= tables->dep_tables;
3492
s->key_dependent= 0;
3493
if (tables->schema_table)
3494
table->file->stats.records= 2;
3495
table->quick_condition_rows= table->file->stats.records;
3497
s->on_expr_ref= &tables->on_expr;
3498
if (*s->on_expr_ref)
3500
/* s is the only inner table of an outer join */
3501
if (!table->file->stats.records && !embedding)
3503
s->dependent= 0; // Ignore LEFT JOIN depend.
3504
set_position(join,const_count++,s,(KEYUSE*) 0);
3507
outer_join|= table->map;
3508
s->embedding_map= 0;
3509
for (;embedding; embedding= embedding->embedding)
3510
s->embedding_map|= embedding->nested_join->nj_map;
3513
if (embedding && !(embedding->sj_on_expr && ! embedding->embedding))
3515
/* s belongs to a nested join, maybe to several embedded joins */
3516
s->embedding_map= 0;
3519
NESTED_JOIN *nested_join= embedding->nested_join;
3520
s->embedding_map|=nested_join->nj_map;
3521
s->dependent|= embedding->dep_tables;
3522
embedding= embedding->embedding;
3523
outer_join|= nested_join->used_tables;
3528
if ((table->s->system || table->file->stats.records <= 1) &&
3530
(table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT) && !join->no_const_tables)
3532
set_position(join,const_count++,s,(KEYUSE*) 0);
3536
join->outer_join=outer_join;
3538
if (join->outer_join)
3541
Build transitive closure for relation 'to be dependent on'.
3542
This will speed up the plan search for many cases with outer joins,
3543
as well as allow us to catch illegal cross references/
3544
Warshall's algorithm is used to build the transitive closure.
3545
As we use bitmaps to represent the relation the complexity
3546
of the algorithm is O((number of tables)^2).
3548
for (i= 0, s= stat ; i < table_count ; i++, s++)
3550
for (uint j= 0 ; j < table_count ; j++)
3552
table= stat[j].table;
3553
if (s->dependent & table->map)
3554
s->dependent |= table->reginfo.join_tab->dependent;
3557
s->table->maybe_null= 1;
3559
/* Catch illegal cross references for outer joins */
3560
for (i= 0, s= stat ; i < table_count ; i++, s++)
3562
if (s->dependent & s->table->map)
3564
join->tables=0; // Don't use join->table
3565
my_message(ER_WRONG_OUTER_JOIN, ER(ER_WRONG_OUTER_JOIN), MYF(0));
3568
s->key_dependent= s->dependent;
3572
if (conds || outer_join)
3573
if (update_ref_and_keys(join->thd, keyuse_array, stat, join->tables,
3574
conds, join->cond_equal,
3575
~outer_join, join->select_lex, &sargables))
3578
/* Read tables with 0 or 1 rows (system tables) */
3579
join->const_table_map= 0;
3581
for (POSITION *p_pos=join->positions, *p_end=p_pos+const_count;
3588
join->const_table_map|=s->table->map;
3589
if ((tmp=join_read_const_table(s, p_pos)))
3592
return(1); // Fatal error
3595
found_const_table_map|= s->table->map;
3598
/* loop until no more const tables are found */
3602
more_const_tables_found:
3607
We only have to loop from stat_vector + const_count as
3608
set_position() will move all const_tables first in stat_vector
3611
for (JOIN_TAB **pos=stat_vector+const_count ; (s= *pos) ; pos++)
3616
If equi-join condition by a key is null rejecting and after a
3617
substitution of a const table the key value happens to be null
3618
then we can state that there are no matches for this equi-join.
3620
if ((keyuse= s->keyuse) && *s->on_expr_ref && !s->embedding_map)
3623
When performing an outer join operation if there are no matching rows
3624
for the single row of the outer table all the inner tables are to be
3625
null complemented and thus considered as constant tables.
3626
Here we apply this consideration to the case of outer join operations
3627
with a single inner table only because the case with nested tables
3628
would require a more thorough analysis.
3629
TODO. Apply single row substitution to null complemented inner tables
3630
for nested outer join operations.
3632
while (keyuse->table == table)
3634
if (!(keyuse->val->used_tables() & ~join->const_table_map) &&
3635
keyuse->val->is_null() && keyuse->null_rejecting)
3638
mark_as_null_row(table);
3639
found_const_table_map|= table->map;
3640
join->const_table_map|= table->map;
3641
set_position(join,const_count++,s,(KEYUSE*) 0);
3642
goto more_const_tables_found;
3648
if (s->dependent) // If dependent on some table
3650
// All dep. must be constants
3651
if (s->dependent & ~(found_const_table_map))
3653
if (table->file->stats.records <= 1L &&
3654
(table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT) &&
3655
!table->pos_in_table_list->embedding)
3659
join->const_table_map|=table->map;
3660
set_position(join,const_count++,s,(KEYUSE*) 0);
3661
if ((tmp= join_read_const_table(s, join->positions+const_count-1)))
3664
return(1); // Fatal error
3667
found_const_table_map|= table->map;
3671
/* check if table can be read by key or table only uses const refs */
3672
if ((keyuse=s->keyuse))
3675
while (keyuse->table == table)
3677
start_keyuse=keyuse;
3679
s->keys.set_bit(key); // QQ: remove this ?
3682
const_ref.clear_all();
3683
eq_part.clear_all();
3686
if (keyuse->val->type() != Item::NULL_ITEM && !keyuse->optimize)
3688
if (!((~found_const_table_map) & keyuse->used_tables))
3689
const_ref.set_bit(keyuse->keypart);
3691
refs|=keyuse->used_tables;
3692
eq_part.set_bit(keyuse->keypart);
3695
} while (keyuse->table == table && keyuse->key == key);
3697
if (eq_part.is_prefix(table->key_info[key].key_parts) &&
3698
!table->pos_in_table_list->embedding)
3700
if ((table->key_info[key].flags & (HA_NOSAME))
3703
if (const_ref == eq_part)
3704
{ // Found everything for ref.
3708
join->const_table_map|=table->map;
3709
set_position(join,const_count++,s,start_keyuse);
3710
if (create_ref_for_key(join, s, start_keyuse,
3711
found_const_table_map))
3713
if ((tmp=join_read_const_table(s,
3714
join->positions+const_count-1)))
3717
return(1); // Fatal error
3720
found_const_table_map|= table->map;
3724
found_ref|= refs; // Table is const if all refs are const
3726
else if (const_ref == eq_part)
3727
s->const_keys.set_bit(key);
3732
} while (join->const_table_map & found_ref && ref_changed);
3735
Update info on indexes that can be used for search lookups as
3736
reading const tables may has added new sargable predicates.
3738
if (const_count && sargables)
3740
for( ; sargables->field ; sargables++)
3742
Field *field= sargables->field;
3743
JOIN_TAB *join_tab= field->table->reginfo.join_tab;
3744
key_map possible_keys= field->key_start;
3745
possible_keys.intersect(field->table->keys_in_use_for_query);
3747
for (uint j=0; j < sargables->num_values; j++)
3748
is_const&= sargables->arg_value[j]->const_item();
3750
join_tab[0].const_keys.merge(possible_keys);
3754
if (pull_out_semijoin_tables(join))
3757
/* Calc how many (possible) matched records in each table */
3759
for (s=stat ; s < stat_end ; s++)
3761
if (s->type == JT_SYSTEM || s->type == JT_CONST)
3763
/* Only one matching row */
3764
s->found_records=s->records=s->read_time=1; s->worst_seeks=1.0;
3767
/* Approximate found rows and time to read them */
3768
s->found_records=s->records=s->table->file->stats.records;
3769
s->read_time=(ha_rows) s->table->file->scan_time();
3772
Set a max range of how many seeks we can expect when using keys
3773
This is can't be to high as otherwise we are likely to use
3776
s->worst_seeks= min((double) s->found_records / 10,
3777
(double) s->read_time*3);
3778
if (s->worst_seeks < 2.0) // Fix for small tables
3782
Add to stat->const_keys those indexes for which all group fields or
3783
all select distinct fields participate in one index.
3785
add_group_and_distinct_keys(join, s);
3787
if (!s->const_keys.is_clear_all() &&
3788
!s->table->pos_in_table_list->embedding)
3792
select= make_select(s->table, found_const_table_map,
3793
found_const_table_map,
3794
*s->on_expr_ref ? *s->on_expr_ref : conds,
3798
records= get_quick_record_count(join->thd, select, s->table,
3799
&s->const_keys, join->row_limit);
3800
s->quick=select->quick;
3801
s->needed_reg=select->needed_reg;
3803
if (records == 0 && s->table->reginfo.impossible_range)
3806
Impossible WHERE or ON expression
3807
In case of ON, we mark that the we match one empty NULL row.
3808
In case of WHERE, don't set found_const_table_map to get the
3809
caller to abort with a zero row result.
3811
join->const_table_map|= s->table->map;
3812
set_position(join,const_count++,s,(KEYUSE*) 0);
3814
if (*s->on_expr_ref)
3816
/* Generate empty row */
3817
s->info= "Impossible ON condition";
3818
found_const_table_map|= s->table->map;
3820
mark_as_null_row(s->table); // All fields are NULL
3823
if (records != HA_POS_ERROR)
3825
s->found_records=records;
3826
s->read_time= (ha_rows) (s->quick ? s->quick->read_time : 0.0);
3832
join->join_tab=stat;
3833
join->map2table=stat_ref;
3834
join->table= join->all_tables=table_vector;
3835
join->const_tables=const_count;
3836
join->found_const_table_map=found_const_table_map;
3838
/* Find an optimal join order of the non-constant tables. */
3839
if (join->const_tables != join->tables)
3841
optimize_keyuse(join, keyuse_array);
3842
if (choose_plan(join, all_table_map & ~join->const_table_map))
3847
memcpy((uchar*) join->best_positions,(uchar*) join->positions,
3848
sizeof(POSITION)*join->const_tables);
3849
join->best_read=1.0;
3851
/* Generate an execution plan from the found optimal join order. */
3852
return(join->thd->killed || get_best_combination(join));
485
3856
/*****************************************************************************
486
3857
Check with keys are used and with tables references with tables
487
3858
Updates in stat:
490
3861
keyuse Pointer to possible keys
491
3862
*****************************************************************************/
3864
/// Used when finding key fields
3865
typedef struct key_field_t {
3867
Item *val; ///< May be empty if diff constant
3869
uint optimize; // KEY_OPTIMIZE_*
3872
If true, the condition this struct represents will not be satisfied
3875
bool null_rejecting;
3876
bool *cond_guard; /* See KEYUSE::cond_guard */
3877
uint sj_pred_no; /* See KEYUSE::sj_pred_no */
3881
Merge new key definitions to old ones, remove those not used in both.
3883
This is called for OR between different levels.
3885
To be able to do 'ref_or_null' we merge a comparison of a column
3886
and 'column IS NULL' to one test. This is useful for sub select queries
3887
that are internally transformed to something like:.
3890
SELECT * FROM t1 WHERE t1.key=outer_ref_field or t1.key IS NULL
3893
KEY_FIELD::null_rejecting is processed as follows: @n
3894
result has null_rejecting=true if it is set for both ORed references.
3896
- (t2.key = t1.field OR t2.key = t1.field) -> null_rejecting=true
3897
- (t2.key = t1.field OR t2.key <=> t1.field) -> null_rejecting=false
3900
The result of this is that we're missing some 'ref' accesses.
3901
OptimizerTeam: Fix this
3905
merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end,
3908
if (start == new_fields)
3909
return start; // Impossible or
3910
if (new_fields == end)
3911
return start; // No new fields, skip all
3913
KEY_FIELD *first_free=new_fields;
3915
/* Mark all found fields in old array */
3916
for (; new_fields != end ; new_fields++)
3918
for (KEY_FIELD *old=start ; old != first_free ; old++)
3920
if (old->field == new_fields->field)
3923
NOTE: below const_item() call really works as "!used_tables()", i.e.
3924
it can return false where it is feasible to make it return true.
3926
The cause is as follows: Some of the tables are already known to be
3927
const tables (the detection code is in make_join_statistics(),
3928
above the update_ref_and_keys() call), but we didn't propagate
3929
information about this: TABLE::const_table is not set to true, and
3930
Item::update_used_tables() hasn't been called for each item.
3931
The result of this is that we're missing some 'ref' accesses.
3932
TODO: OptimizerTeam: Fix this
3934
if (!new_fields->val->const_item())
3937
If the value matches, we can use the key reference.
3938
If not, we keep it until we have examined all new values
3940
if (old->val->eq(new_fields->val, old->field->binary()))
3942
old->level= and_level;
3943
old->optimize= ((old->optimize & new_fields->optimize &
3944
KEY_OPTIMIZE_EXISTS) |
3945
((old->optimize | new_fields->optimize) &
3946
KEY_OPTIMIZE_REF_OR_NULL));
3947
old->null_rejecting= (old->null_rejecting &&
3948
new_fields->null_rejecting);
3951
else if (old->eq_func && new_fields->eq_func &&
3952
old->val->eq_by_collation(new_fields->val,
3953
old->field->binary(),
3954
old->field->charset()))
3957
old->level= and_level;
3958
old->optimize= ((old->optimize & new_fields->optimize &
3959
KEY_OPTIMIZE_EXISTS) |
3960
((old->optimize | new_fields->optimize) &
3961
KEY_OPTIMIZE_REF_OR_NULL));
3962
old->null_rejecting= (old->null_rejecting &&
3963
new_fields->null_rejecting);
3965
else if (old->eq_func && new_fields->eq_func &&
3966
((old->val->const_item() && old->val->is_null()) ||
3967
new_fields->val->is_null()))
3969
/* field = expression OR field IS NULL */
3970
old->level= and_level;
3971
old->optimize= KEY_OPTIMIZE_REF_OR_NULL;
3973
Remember the NOT NULL value unless the value does not depend
3976
if (!old->val->used_tables() && old->val->is_null())
3977
old->val= new_fields->val;
3978
/* The referred expression can be NULL: */
3979
old->null_rejecting= 0;
3984
We are comparing two different const. In this case we can't
3985
use a key-lookup on this so it's better to remove the value
3986
and let the range optimzier handle it
3988
if (old == --first_free) // If last item
3990
*old= *first_free; // Remove old value
3991
old--; // Retry this value
3996
/* Remove all not used items */
3997
for (KEY_FIELD *old=start ; old != first_free ;)
3999
if (old->level != and_level)
4000
{ // Not used in all levels
4001
if (old == --first_free)
4003
*old= *first_free; // Remove old value
4013
Add a possible key to array of possible keys if it's usable as a key
4015
@param key_fields Pointer to add key, if usable
4016
@param and_level And level, to be stored in KEY_FIELD
4017
@param cond Condition predicate
4018
@param field Field used in comparision
4019
@param eq_func True if we used =, <=> or IS NULL
4020
@param value Value used for comparison with field
4021
@param usable_tables Tables which can be used for key optimization
4022
@param sargables IN/OUT Array of found sargable candidates
4025
If we are doing a NOT NULL comparison on a NOT NULL field in a outer join
4026
table, we store this to be able to do not exists optimization later.
4029
*key_fields is incremented if we stored a key in the array
4033
add_key_field(KEY_FIELD **key_fields,uint and_level, Item_func *cond,
4034
Field *field, bool eq_func, Item **value, uint num_values,
4035
table_map usable_tables, SARGABLE_PARAM **sargables)
4037
uint exists_optimize= 0;
4038
if (!(field->flags & PART_KEY_FLAG))
4040
// Don't remove column IS NULL on a LEFT JOIN table
4041
if (!eq_func || (*value)->type() != Item::NULL_ITEM ||
4042
!field->table->maybe_null || field->null_ptr)
4043
return; // Not a key. Skip it
4044
exists_optimize= KEY_OPTIMIZE_EXISTS;
4045
assert(num_values == 1);
4049
table_map used_tables=0;
4051
for (uint i=0; i<num_values; i++)
4053
used_tables|=(value[i])->used_tables();
4054
if (!((value[i])->used_tables() & (field->table->map | RAND_TABLE_BIT)))
4059
if (!(usable_tables & field->table->map))
4061
if (!eq_func || (*value)->type() != Item::NULL_ITEM ||
4062
!field->table->maybe_null || field->null_ptr)
4063
return; // Can't use left join optimize
4064
exists_optimize= KEY_OPTIMIZE_EXISTS;
4068
JOIN_TAB *stat=field->table->reginfo.join_tab;
4069
key_map possible_keys=field->key_start;
4070
possible_keys.intersect(field->table->keys_in_use_for_query);
4071
stat[0].keys.merge(possible_keys); // Add possible keys
4074
Save the following cases:
4076
Field LIKE constant where constant doesn't start with a wildcard
4077
Field = field2 where field2 is in a different table
4084
stat[0].key_dependent|=used_tables;
4087
for (uint i=0; i<num_values; i++)
4089
if (!(is_const&= value[i]->const_item()))
4093
stat[0].const_keys.merge(possible_keys);
4097
Save info to be able check whether this predicate can be
4098
considered as sargable for range analisis after reading const tables.
4099
We do not save info about equalities as update_const_equal_items
4100
will take care of updating info on keys from sargable equalities.
4103
(*sargables)->field= field;
4104
(*sargables)->arg_value= value;
4105
(*sargables)->num_values= num_values;
4108
We can't always use indexes when comparing a string index to a
4109
number. cmp_type() is checked to allow compare of dates to numbers.
4110
eq_func is NEVER true when num_values > 1
4115
Additional optimization: if we're processing
4116
"t.key BETWEEN c1 AND c1" then proceed as if we were processing
4118
TODO: This is a very limited fix. A more generic fix is possible.
4119
There are 2 options:
4120
A) Make equality propagation code be able to handle BETWEEN
4121
(including cases like t1.key BETWEEN t2.key AND t3.key)
4122
B) Make range optimizer to infer additional "t.key = c" equalities
4123
and use them in equality propagation process (see details in
4126
if ((cond->functype() != Item_func::BETWEEN) ||
4127
((Item_func_between*) cond)->negated ||
4128
!value[0]->eq(value[1], field->binary()))
4133
if (field->result_type() == STRING_RESULT)
4135
if ((*value)->result_type() != STRING_RESULT)
4137
if (field->cmp_type() != (*value)->result_type())
4143
We can't use indexes if the effective collation
4144
of the operation differ from the field collation.
4146
if (field->cmp_type() == STRING_RESULT &&
4147
((Field_str*)field)->charset() != cond->compare_collation())
4154
For the moment eq_func is always true. This slot is reserved for future
4155
extensions where we want to remembers other things than just eq comparisons
4158
/* Store possible eq field */
4159
(*key_fields)->field= field;
4160
(*key_fields)->eq_func= eq_func;
4161
(*key_fields)->val= *value;
4162
(*key_fields)->level= and_level;
4163
(*key_fields)->optimize= exists_optimize;
4165
If the condition has form "tbl.keypart = othertbl.field" and
4166
othertbl.field can be NULL, there will be no matches if othertbl.field
4168
We use null_rejecting in add_not_null_conds() to add
4169
'othertbl.field IS NOT NULL' to tab->select_cond.
4171
(*key_fields)->null_rejecting= ((cond->functype() == Item_func::EQ_FUNC ||
4172
cond->functype() == Item_func::MULT_EQUAL_FUNC) &&
4173
((*value)->type() == Item::FIELD_ITEM) &&
4174
((Item_field*)*value)->field->maybe_null());
4175
(*key_fields)->cond_guard= NULL;
4176
(*key_fields)->sj_pred_no= (cond->name >= subq_sj_cond_name &&
4177
cond->name < subq_sj_cond_name + 64)?
4178
cond->name - subq_sj_cond_name: UINT_MAX;
4183
Add possible keys to array of possible keys originated from a simple
4186
@param key_fields Pointer to add key, if usable
4187
@param and_level And level, to be stored in KEY_FIELD
4188
@param cond Condition predicate
4189
@param field Field used in comparision
4190
@param eq_func True if we used =, <=> or IS NULL
4191
@param value Value used for comparison with field
4192
Is NULL for BETWEEN and IN
4193
@param usable_tables Tables which can be used for key optimization
4194
@param sargables IN/OUT Array of found sargable candidates
4197
If field items f1 and f2 belong to the same multiple equality and
4198
a key is added for f1, the the same key is added for f2.
4201
*key_fields is incremented if we stored a key in the array
4205
add_key_equal_fields(KEY_FIELD **key_fields, uint and_level,
4206
Item_func *cond, Item_field *field_item,
4207
bool eq_func, Item **val,
4208
uint num_values, table_map usable_tables,
4209
SARGABLE_PARAM **sargables)
4211
Field *field= field_item->field;
4212
add_key_field(key_fields, and_level, cond, field,
4213
eq_func, val, num_values, usable_tables, sargables);
4214
Item_equal *item_equal= field_item->item_equal;
4218
Add to the set of possible key values every substitution of
4219
the field for an equal field included into item_equal
4221
Item_equal_iterator it(*item_equal);
4223
while ((item= it++))
4225
if (!field->eq(item->field))
4227
add_key_field(key_fields, and_level, cond, item->field,
4228
eq_func, val, num_values, usable_tables,
4236
add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
4237
COND *cond, table_map usable_tables,
4238
SARGABLE_PARAM **sargables)
4240
if (cond->type() == Item_func::COND_ITEM)
4242
List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list());
4243
KEY_FIELD *org_key_fields= *key_fields;
4245
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
4249
add_key_fields(join, key_fields, and_level, item, usable_tables,
4251
for (; org_key_fields != *key_fields ; org_key_fields++)
4252
org_key_fields->level= *and_level;
4257
add_key_fields(join, key_fields, and_level, li++, usable_tables,
4262
KEY_FIELD *start_key_fields= *key_fields;
4264
add_key_fields(join, key_fields, and_level, item, usable_tables,
4266
*key_fields=merge_key_fields(org_key_fields,start_key_fields,
4267
*key_fields,++(*and_level));
4274
Subquery optimization: Conditions that are pushed down into subqueries
4275
are wrapped into Item_func_trig_cond. We process the wrapped condition
4276
but need to set cond_guard for KEYUSE elements generated from it.
4279
if (cond->type() == Item::FUNC_ITEM &&
4280
((Item_func*)cond)->functype() == Item_func::TRIG_COND_FUNC)
4282
Item *cond_arg= ((Item_func*)cond)->arguments()[0];
4283
if (!join->group_list && !join->order &&
4285
join->unit->item->substype() == Item_subselect::IN_SUBS &&
4286
!join->unit->is_union())
4288
KEY_FIELD *save= *key_fields;
4289
add_key_fields(join, key_fields, and_level, cond_arg, usable_tables,
4291
// Indicate that this ref access candidate is for subquery lookup:
4292
for (; save != *key_fields; save++)
4293
save->cond_guard= ((Item_func_trig_cond*)cond)->get_trig_var();
4299
/* If item is of type 'field op field/constant' add it to key_fields */
4300
if (cond->type() != Item::FUNC_ITEM)
4302
Item_func *cond_func= (Item_func*) cond;
4303
switch (cond_func->select_optimize()) {
4304
case Item_func::OPTIMIZE_NONE:
4306
case Item_func::OPTIMIZE_KEY:
4310
if (cond_func->key_item()->real_item()->type() == Item::FIELD_ITEM &&
4311
!(cond_func->used_tables() & OUTER_REF_TABLE_BIT))
4313
values= cond_func->arguments()+1;
4314
if (cond_func->functype() == Item_func::NE_FUNC &&
4315
cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM &&
4316
!(cond_func->arguments()[0]->used_tables() & OUTER_REF_TABLE_BIT))
4318
assert(cond_func->functype() != Item_func::IN_FUNC ||
4319
cond_func->argument_count() != 2);
4320
add_key_equal_fields(key_fields, *and_level, cond_func,
4321
(Item_field*) (cond_func->key_item()->real_item()),
4323
cond_func->argument_count()-1,
4324
usable_tables, sargables);
4326
if (cond_func->functype() == Item_func::BETWEEN)
4328
values= cond_func->arguments();
4329
for (uint i= 1 ; i < cond_func->argument_count() ; i++)
4331
Item_field *field_item;
4332
if (cond_func->arguments()[i]->real_item()->type() == Item::FIELD_ITEM
4334
!(cond_func->arguments()[i]->used_tables() & OUTER_REF_TABLE_BIT))
4336
field_item= (Item_field *) (cond_func->arguments()[i]->real_item());
4337
add_key_equal_fields(key_fields, *and_level, cond_func,
4338
field_item, 0, values, 1, usable_tables,
4345
case Item_func::OPTIMIZE_OP:
4347
bool equal_func=(cond_func->functype() == Item_func::EQ_FUNC ||
4348
cond_func->functype() == Item_func::EQUAL_FUNC);
4350
if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM &&
4351
!(cond_func->arguments()[0]->used_tables() & OUTER_REF_TABLE_BIT))
4353
add_key_equal_fields(key_fields, *and_level, cond_func,
4354
(Item_field*) (cond_func->arguments()[0])->real_item(),
4356
cond_func->arguments()+1, 1, usable_tables,
4359
if (cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM &&
4360
cond_func->functype() != Item_func::LIKE_FUNC &&
4361
!(cond_func->arguments()[1]->used_tables() & OUTER_REF_TABLE_BIT))
4363
add_key_equal_fields(key_fields, *and_level, cond_func,
4364
(Item_field*) (cond_func->arguments()[1])->real_item(),
4366
cond_func->arguments(),1,usable_tables,
4371
case Item_func::OPTIMIZE_NULL:
4372
/* column_name IS [NOT] NULL */
4373
if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM &&
4374
!(cond_func->used_tables() & OUTER_REF_TABLE_BIT))
4376
Item *tmp=new Item_null;
4377
if (unlikely(!tmp)) // Should never be true
4379
add_key_equal_fields(key_fields, *and_level, cond_func,
4380
(Item_field*) (cond_func->arguments()[0])->real_item(),
4381
cond_func->functype() == Item_func::ISNULL_FUNC,
4382
&tmp, 1, usable_tables, sargables);
4385
case Item_func::OPTIMIZE_EQUAL:
4386
Item_equal *item_equal= (Item_equal *) cond;
4387
Item *const_item= item_equal->get_const();
4388
Item_equal_iterator it(*item_equal);
4393
For each field field1 from item_equal consider the equality
4394
field1=const_item as a condition allowing an index access of the table
4395
with field1 by the keys value of field1.
4397
while ((item= it++))
4399
add_key_field(key_fields, *and_level, cond_func, item->field,
4400
true, &const_item, 1, usable_tables, sargables);
4406
Consider all pairs of different fields included into item_equal.
4407
For each of them (field1, field1) consider the equality
4408
field1=field2 as a condition allowing an index access of the table
4409
with field1 by the keys value of field2.
4411
Item_equal_iterator fi(*item_equal);
4412
while ((item= fi++))
4414
Field *field= item->field;
4415
while ((item= it++))
4417
if (!field->eq(item->field))
4419
add_key_field(key_fields, *and_level, cond_func, field,
4420
true, (Item **) &item, 1, usable_tables,
495
4432
Add all keys with uses 'field' for some keypart.
497
4434
If field->and_level != and_level then only mark key_part as const_part.
499
uint32_t max_part_bit(key_part_map bits)
4438
max_part_bit(key_part_map bits)
502
4441
for (found=0; bits & 1 ; found++,bits>>=1) ;
506
static int sort_keyuse(optimizer::KeyUse *a, optimizer::KeyUse *b)
4446
add_key_part(DYNAMIC_ARRAY *keyuse_array,KEY_FIELD *key_field)
4448
Field *field=key_field->field;
4449
TABLE *form= field->table;
4452
if (key_field->eq_func && !(key_field->optimize & KEY_OPTIMIZE_EXISTS))
4454
for (uint key=0 ; key < form->s->keys ; key++)
4456
if (!(form->keys_in_use_for_query.is_set(key)))
4459
uint key_parts= (uint) form->key_info[key].key_parts;
4460
for (uint part=0 ; part < key_parts ; part++)
4462
if (field->eq(form->key_info[key].key_part[part].field))
4464
keyuse.table= field->table;
4465
keyuse.val = key_field->val;
4467
keyuse.keypart=part;
4468
keyuse.keypart_map= (key_part_map) 1 << part;
4469
keyuse.used_tables=key_field->val->used_tables();
4470
keyuse.optimize= key_field->optimize & KEY_OPTIMIZE_REF_OR_NULL;
4471
keyuse.null_rejecting= key_field->null_rejecting;
4472
keyuse.cond_guard= key_field->cond_guard;
4473
keyuse.sj_pred_no= key_field->sj_pred_no;
4474
VOID(insert_dynamic(keyuse_array,(uchar*) &keyuse));
4482
sort_keyuse(KEYUSE *a,KEYUSE *b)
509
if (a->getTable()->tablenr != b->getTable()->tablenr)
510
return static_cast<int>((a->getTable()->tablenr - b->getTable()->tablenr));
511
if (a->getKey() != b->getKey())
512
return static_cast<int>((a->getKey() - b->getKey()));
513
if (a->getKeypart() != b->getKeypart())
514
return static_cast<int>((a->getKeypart() - b->getKeypart()));
4485
if (a->table->tablenr != b->table->tablenr)
4486
return (int) (a->table->tablenr - b->table->tablenr);
4487
if (a->key != b->key)
4488
return (int) (a->key - b->key);
4489
if (a->keypart != b->keypart)
4490
return (int) (a->keypart - b->keypart);
515
4491
// Place const values before other ones
516
if ((res= test((a->getUsedTables() & ~OUTER_REF_TABLE_BIT)) -
517
test((b->getUsedTables() & ~OUTER_REF_TABLE_BIT))))
4492
if ((res= test((a->used_tables & ~OUTER_REF_TABLE_BIT)) -
4493
test((b->used_tables & ~OUTER_REF_TABLE_BIT))))
519
4495
/* Place rows that are not 'OPTIMIZE_REF_OR_NULL' first */
520
return static_cast<int>(((a->getOptimizeFlags() & KEY_OPTIMIZE_REF_OR_NULL) -
521
(b->getOptimizeFlags() & KEY_OPTIMIZE_REF_OR_NULL)));
4496
return (int) ((a->optimize & KEY_OPTIMIZE_REF_OR_NULL) -
4497
(b->optimize & KEY_OPTIMIZE_REF_OR_NULL));
4502
Add to KEY_FIELD array all 'ref' access candidates within nested join.
4504
This function populates KEY_FIELD array with entries generated from the
4505
ON condition of the given nested join, and does the same for nested joins
4506
contained within this nested join.
4508
@param[in] nested_join_table Nested join pseudo-table to process
4509
@param[in,out] end End of the key field array
4510
@param[in,out] and_level And-level
4511
@param[in,out] sargables Array of found sargable candidates
4515
We can add accesses to the tables that are direct children of this nested
4516
join (1), and are not inner tables w.r.t their neighbours (2).
4518
Example for #1 (outer brackets pair denotes nested join this function is
4521
... LEFT JOIN (t1 LEFT JOIN (t2 ... ) ) ON cond
4525
... LEFT JOIN (t1 LEFT JOIN t2 ) ON cond
4527
In examples 1-2 for condition cond, we can add 'ref' access candidates to
4531
... LEFT JOIN (t1, t2 LEFT JOIN t3 ON inner_cond) ON cond
4533
Here we can add 'ref' access candidates for t1 and t2, but not for t3.
4536
static void add_key_fields_for_nj(JOIN *join, TABLE_LIST *nested_join_table,
4537
KEY_FIELD **end, uint *and_level,
4538
SARGABLE_PARAM **sargables)
4540
List_iterator<TABLE_LIST> li(nested_join_table->nested_join->join_list);
4541
List_iterator<TABLE_LIST> li2(nested_join_table->nested_join->join_list);
4542
bool have_another = false;
4543
table_map tables= 0;
4545
assert(nested_join_table->nested_join);
4547
while ((table= li++) || (have_another && (li=li2, have_another=false,
4550
if (table->nested_join)
4552
if (!table->on_expr)
4554
/* It's a semi-join nest. Walk into it as if it wasn't a nest */
4557
li= List_iterator<TABLE_LIST>(table->nested_join->join_list);
4560
add_key_fields_for_nj(join, table, end, and_level, sargables);
4563
if (!table->on_expr)
4564
tables |= table->table->map;
4566
if (nested_join_table->on_expr)
4567
add_key_fields(join, end, and_level, nested_join_table->on_expr, tables,
526
4573
Update keyuse array with all possible keys we can use to fetch rows.
529
@param[out] keyuse Put here ordered array of KeyUse structures
4576
@param[out] keyuse Put here ordered array of KEYUSE structures
530
4577
@param join_tab Array in tablenr_order
531
4578
@param tables Number of tables in join
532
4579
@param cond WHERE condition (note that the function analyzes
781
4832
/* Intersect the keys of all group fields. */
782
4833
cur_item= indexed_fields_it++;
783
possible_keys|= cur_item->field->part_of_key;
4834
possible_keys.merge(cur_item->field->part_of_key);
784
4835
while ((cur_item= indexed_fields_it++))
786
possible_keys&= cur_item->field->part_of_key;
789
if (possible_keys.any())
790
join_tab->const_keys|= possible_keys;
794
Compare two JoinTable objects based on the number of accessed records.
796
@param ptr1 pointer to first JoinTable object
797
@param ptr2 pointer to second JoinTable object
4837
possible_keys.intersect(cur_item->field->part_of_key);
4840
if (!possible_keys.is_clear_all())
4841
join_tab->const_keys.merge(possible_keys);
4845
/*****************************************************************************
4846
Go through all combinations of not marked tables and find the one
4847
which uses least records
4848
*****************************************************************************/
4850
/** Save const tables first as used tables. */
4853
set_position(JOIN *join,uint idx,JOIN_TAB *table,KEYUSE *key)
4855
join->positions[idx].table= table;
4856
join->positions[idx].key=key;
4857
join->positions[idx].records_read=1.0; /* This is a const table */
4858
join->positions[idx].ref_depend_map= 0;
4860
/* Move the const table as down as possible in best_ref */
4861
JOIN_TAB **pos=join->best_ref+idx+1;
4862
JOIN_TAB *next=join->best_ref[idx];
4863
for (;next != table ; pos++)
4865
JOIN_TAB *tmp=pos[0];
4869
join->best_ref[idx]=table;
4874
Given a semi-join nest, find out which of the IN-equalities are bound
4877
get_bound_sj_equalities()
4878
sj_nest Semi-join nest
4879
remaining_tables Tables that are not yet bound
4882
Given a semi-join nest, find out which of the IN-equalities have their
4883
left part expression bound (i.e. the said expression doesn't refer to
4884
any of remaining_tables and can be evaluated).
4887
Bitmap of bound IN-equalities.
4890
uint64_t get_bound_sj_equalities(TABLE_LIST *sj_nest,
4891
table_map remaining_tables)
4893
List_iterator<Item> li(sj_nest->nested_join->sj_outer_expr_list);
4897
while ((item= li++))
4900
Q: should this take into account equality propagation and how?
4901
A: If e->outer_side is an Item_field, walk over the equality
4902
class and see if there is an element that is bound?
4903
(this is an optional feature)
4905
if (!(item->used_tables() & remaining_tables))
4915
Find the best access path for an extension of a partial execution
4916
plan and add this path to the plan.
4918
The function finds the best access path to table 's' from the passed
4919
partial plan where an access path is the general term for any means to
4920
access the data in 's'. An access path may use either an index or a scan,
4921
whichever is cheaper. The input partial plan is passed via the array
4922
'join->positions' of length 'idx'. The chosen access method for 's' and its
4923
cost are stored in 'join->positions[idx]'.
4925
@param join pointer to the structure providing all context info
4927
@param s the table to be joined by the function
4928
@param thd thread for the connection that submitted the query
4929
@param remaining_tables set of tables not included into the partial plan yet
4930
@param idx the length of the partial plan
4931
@param record_count estimate for the number of records returned by the
4933
@param read_time the cost of the partial plan
4940
best_access_path(JOIN *join,
4943
table_map remaining_tables,
4945
double record_count,
4946
double read_time __attribute__((__unused__)))
4948
KEYUSE *best_key= 0;
4949
uint best_max_key_part= 0;
4950
bool found_constraint= 0;
4951
double best= DBL_MAX;
4952
double best_time= DBL_MAX;
4953
double records= DBL_MAX;
4954
table_map best_ref_depends_map= 0;
4957
uint best_is_sj_inside_out= 0;
4960
{ /* Use key if possible */
4961
TABLE *table= s->table;
4962
KEYUSE *keyuse,*start_key=0;
4963
double best_records= DBL_MAX;
4964
uint max_key_part=0;
4965
uint64_t bound_sj_equalities= 0;
4966
bool try_sj_inside_out= false;
4968
Discover the bound equalites. We need to do this, if
4969
1. The next table is an SJ-inner table, and
4970
2. It is the first table from that semijoin, and
4971
3. We're not within a semi-join range (i.e. all semi-joins either have
4972
all or none of their tables in join_table_map), except
4973
s->emb_sj_nest (which we've just entered).
4974
3. All correlation references from this sj-nest are bound
4976
if (s->emb_sj_nest && // (1)
4977
s->emb_sj_nest->sj_in_exprs < 64 &&
4978
((remaining_tables & s->emb_sj_nest->sj_inner_tables) == // (2)
4979
s->emb_sj_nest->sj_inner_tables) && // (2)
4980
join->cur_emb_sj_nests == s->emb_sj_nest->sj_inner_tables && // (3)
4981
!(remaining_tables & s->emb_sj_nest->nested_join->sj_corr_tables)) // (4)
4983
/* This table is an InsideOut scan candidate */
4984
bound_sj_equalities= get_bound_sj_equalities(s->emb_sj_nest,
4986
try_sj_inside_out= true;
4989
/* Test how we can use keys */
4990
rec= s->records/MATCHING_ROWS_IN_OTHER_TABLE; // Assumed records/key
4991
for (keyuse=s->keyuse ; keyuse->table == table ;)
4993
key_part_map found_part= 0;
4994
table_map found_ref= 0;
4995
uint key= keyuse->key;
4996
KEY *keyinfo= table->key_info+key;
4997
/* Bitmap of keyparts where the ref access is over 'keypart=const': */
4998
key_part_map const_part= 0;
4999
/* The or-null keypart in ref-or-null access: */
5000
key_part_map ref_or_null_part= 0;
5002
/* Calculate how many key segments of the current key we can use */
5004
uint64_t handled_sj_equalities=0;
5005
key_part_map sj_insideout_map= 0;
5007
do /* For each keypart */
5009
uint keypart= keyuse->keypart;
5010
table_map best_part_found_ref= 0;
5011
double best_prev_record_reads= DBL_MAX;
5013
do /* For each way to access the keypart */
5017
if 1. expression doesn't refer to forward tables
5018
2. we won't get two ref-or-null's
5020
if (!(remaining_tables & keyuse->used_tables) &&
5021
!(ref_or_null_part && (keyuse->optimize &
5022
KEY_OPTIMIZE_REF_OR_NULL)))
5024
found_part|= keyuse->keypart_map;
5025
if (!(keyuse->used_tables & ~join->const_table_map))
5026
const_part|= keyuse->keypart_map;
5028
double tmp2= prev_record_reads(join, idx, (found_ref |
5029
keyuse->used_tables));
5030
if (tmp2 < best_prev_record_reads)
5032
best_part_found_ref= keyuse->used_tables & ~join->const_table_map;
5033
best_prev_record_reads= tmp2;
5035
if (rec > keyuse->ref_table_rows)
5036
rec= keyuse->ref_table_rows;
5038
If there is one 'key_column IS NULL' expression, we can
5039
use this ref_or_null optimisation of this field
5041
if (keyuse->optimize & KEY_OPTIMIZE_REF_OR_NULL)
5042
ref_or_null_part |= keyuse->keypart_map;
5045
if (try_sj_inside_out && keyuse->sj_pred_no != UINT_MAX)
5047
if (!(remaining_tables & keyuse->used_tables))
5048
bound_sj_equalities |= 1ULL << keyuse->sj_pred_no;
5051
handled_sj_equalities |= 1ULL << keyuse->sj_pred_no;
5052
sj_insideout_map |= ((key_part_map)1) << keyuse->keypart;
5057
} while (keyuse->table == table && keyuse->key == key &&
5058
keyuse->keypart == keypart);
5059
found_ref|= best_part_found_ref;
5060
} while (keyuse->table == table && keyuse->key == key);
5063
Assume that that each key matches a proportional part of table.
5065
if (!found_part && !handled_sj_equalities)
5066
continue; // Nothing usable found
5068
if (rec < MATCHING_ROWS_IN_OTHER_TABLE)
5069
rec= MATCHING_ROWS_IN_OTHER_TABLE; // Fix for small tables
5071
bool sj_inside_out_scan= false;
5073
found_constraint= 1;
5075
Check if InsideOut scan is applicable:
5076
1. All IN-equalities are either "bound" or "handled"
5077
2. Index keyparts are
5080
if (try_sj_inside_out &&
5081
table->covering_keys.is_set(key) &&
5082
(handled_sj_equalities | bound_sj_equalities) == // (1)
5083
PREV_BITS(uint64_t, s->emb_sj_nest->sj_in_exprs)) // (1)
5085
uint n_fixed_parts= max_part_bit(found_part);
5086
if (n_fixed_parts != keyinfo->key_parts &&
5087
(PREV_BITS(uint, n_fixed_parts) | sj_insideout_map) ==
5088
PREV_BITS(uint, keyinfo->key_parts))
5091
Not all parts are fixed. Produce bitmap of remaining bits and
5092
check if all of them are covered.
5094
sj_inside_out_scan= true;
5098
It's a confluent ref scan.
5100
That is, all found KEYUSE elements refer to IN-equalities,
5101
and there is really no ref access because there is no
5102
t.keypart0 = {bound expression}
5104
Calculate the cost of complete loose index scan.
5106
records= (double)s->table->file->stats.records;
5108
/* The cost is entire index scan cost (divided by 2) */
5109
best_time= s->table->file->index_only_read_time(key, records);
5111
/* Now figure how many different keys we will get */
5113
if ((rpc= keyinfo->rec_per_key[keyinfo->key_parts-1]))
5114
records= records / rpc;
5121
Check if we found full key
5123
if (found_part == PREV_BITS(uint,keyinfo->key_parts) &&
5126
max_key_part= (uint) ~0;
5127
if ((keyinfo->flags & (HA_NOSAME | HA_NULL_PART_KEY)) == HA_NOSAME)
5129
tmp = prev_record_reads(join, idx, found_ref);
5135
{ /* We found a const key */
5137
ReuseRangeEstimateForRef-1:
5138
We get here if we've found a ref(const) (c_i are constants):
5139
"(keypart1=c1) AND ... AND (keypartN=cN)" [ref_const_cond]
5141
If range optimizer was able to construct a "range"
5142
access on this index, then its condition "quick_cond" was
5143
eqivalent to ref_const_cond (*), and we can re-use E(#rows)
5144
from the range optimizer.
5146
Proof of (*): By properties of range and ref optimizers
5147
quick_cond will be equal or tighther than ref_const_cond.
5148
ref_const_cond already covers "smallest" possible interval -
5149
a singlepoint interval over all keyparts. Therefore,
5150
quick_cond is equivalent to ref_const_cond (if it was an
5151
empty interval we wouldn't have got here).
5153
if (table->quick_keys.is_set(key))
5154
records= (double) table->quick_rows[key];
5157
/* quick_range couldn't use key! */
5158
records= (double) s->records/rec;
5163
if (!(records=keyinfo->rec_per_key[keyinfo->key_parts-1]))
5164
{ /* Prefer longer keys */
5166
((double) s->records / (double) rec *
5168
((double) (table->s->max_key_length-keyinfo->key_length) /
5169
(double) table->s->max_key_length)));
5171
records=2.0; /* Can't be as good as a unique */
5174
ReuseRangeEstimateForRef-2: We get here if we could not reuse
5175
E(#rows) from range optimizer. Make another try:
5177
If range optimizer produced E(#rows) for a prefix of the ref
5178
access we're considering, and that E(#rows) is lower then our
5179
current estimate, make an adjustment. The criteria of when we
5180
can make an adjustment is a special case of the criteria used
5181
in ReuseRangeEstimateForRef-3.
5183
if (table->quick_keys.is_set(key) &&
5184
const_part & (1 << table->quick_key_parts[key]) &&
5185
table->quick_n_ranges[key] == 1 &&
5186
records > (double) table->quick_rows[key])
5188
records= (double) table->quick_rows[key];
5191
/* Limit the number of matched rows */
5193
set_if_smaller(tmp, (double) thd->variables.max_seeks_for_key);
5194
if (table->covering_keys.is_set(key))
5196
/* we can use only index tree */
5197
tmp= record_count * table->file->index_only_read_time(key, tmp);
5200
tmp= record_count*min(tmp,s->worst_seeks);
5206
Use as much key-parts as possible and a uniq key is better
5207
than a not unique key
5208
Set tmp to (previous record count) * (records / combination)
5210
if ((found_part & 1) &&
5211
(!(table->file->index_flags(key, 0, 0) & HA_ONLY_WHOLE_INDEX) ||
5212
found_part == PREV_BITS(uint,keyinfo->key_parts)))
5214
max_key_part= max_part_bit(found_part);
5216
ReuseRangeEstimateForRef-3:
5217
We're now considering a ref[or_null] access via
5218
(t.keypart1=e1 AND ... AND t.keypartK=eK) [ OR
5219
(same-as-above but with one cond replaced
5220
with "t.keypart_i IS NULL")] (**)
5222
Try re-using E(#rows) from "range" optimizer:
5223
We can do so if "range" optimizer used the same intervals as
5224
in (**). The intervals used by range optimizer may be not
5225
available at this point (as "range" access might have choosen to
5226
create quick select over another index), so we can't compare
5227
them to (**). We'll make indirect judgements instead.
5228
The sufficient conditions for re-use are:
5229
(C1) All e_i in (**) are constants, i.e. found_ref==false. (if
5230
this is not satisfied we have no way to know which ranges
5231
will be actually scanned by 'ref' until we execute the
5233
(C2) max #key parts in 'range' access == K == max_key_part (this
5234
is apparently a necessary requirement)
5236
We also have a property that "range optimizer produces equal or
5237
tighter set of scan intervals than ref(const) optimizer". Each
5238
of the intervals in (**) are "tightest possible" intervals when
5239
one limits itself to using keyparts 1..K (which we do in #2).
5240
From here it follows that range access used either one, or
5241
both of the (I1) and (I2) intervals:
5243
(t.keypart1=c1 AND ... AND t.keypartK=eK) (I1)
5244
(same-as-above but with one cond replaced
5245
with "t.keypart_i IS NULL") (I2)
5247
The remaining part is to exclude the situation where range
5248
optimizer used one interval while we're considering
5249
ref-or-null and looking for estimate for two intervals. This
5250
is done by last limitation:
5252
(C3) "range optimizer used (have ref_or_null?2:1) intervals"
5254
if (table->quick_keys.is_set(key) && !found_ref && //(C1)
5255
table->quick_key_parts[key] == max_key_part && //(C2)
5256
table->quick_n_ranges[key] == 1+test(ref_or_null_part)) //(C3)
5258
tmp= records= (double) table->quick_rows[key];
5262
/* Check if we have statistic about the distribution */
5263
if ((records= keyinfo->rec_per_key[max_key_part-1]))
5266
Fix for the case where the index statistics is too
5268
(1) We're considering ref(const) and there is quick select
5270
(2) and that quick select uses more keyparts (i.e. it will
5271
scan equal/smaller interval then this ref(const))
5272
(3) and E(#rows) for quick select is higher then our
5275
We'll use E(#rows) from quick select.
5277
Q: Why do we choose to use 'ref'? Won't quick select be
5278
cheaper in some cases ?
5279
TODO: figure this out and adjust the plan choice if needed.
5281
if (!found_ref && table->quick_keys.is_set(key) && // (1)
5282
table->quick_key_parts[key] > max_key_part && // (2)
5283
records < (double)table->quick_rows[key]) // (3)
5284
records= (double)table->quick_rows[key];
5291
Assume that the first key part matches 1% of the file
5292
and that the whole key matches 10 (duplicates) or 1
5294
Assume also that more key matches proportionally more
5296
This gives the formula:
5297
records = (x * (b-a) + a*c-b)/(c-1)
5299
b = records matched by whole key
5300
a = records matched by first key part (1% of all records?)
5301
c = number of key parts in key
5302
x = used key parts (1 <= x <= c)
5305
if (!(rec_per_key=(double)
5306
keyinfo->rec_per_key[keyinfo->key_parts-1]))
5307
rec_per_key=(double) s->records/rec+1;
5311
else if (rec_per_key/(double) s->records >= 0.01)
5315
double a=s->records*0.01;
5316
if (keyinfo->key_parts > 1)
5317
tmp= (max_key_part * (rec_per_key - a) +
5318
a*keyinfo->key_parts - rec_per_key)/
5319
(keyinfo->key_parts-1);
5322
set_if_bigger(tmp,1.0);
5324
records = (ulong) tmp;
5327
if (ref_or_null_part)
5329
/* We need to do two key searches to find key */
5335
ReuseRangeEstimateForRef-4: We get here if we could not reuse
5336
E(#rows) from range optimizer. Make another try:
5338
If range optimizer produced E(#rows) for a prefix of the ref
5339
access we're considering, and that E(#rows) is lower then our
5340
current estimate, make the adjustment.
5342
The decision whether we can re-use the estimate from the range
5343
optimizer is the same as in ReuseRangeEstimateForRef-3,
5344
applied to first table->quick_key_parts[key] key parts.
5346
if (table->quick_keys.is_set(key) &&
5347
table->quick_key_parts[key] <= max_key_part &&
5348
const_part & (1 << table->quick_key_parts[key]) &&
5349
table->quick_n_ranges[key] == 1 + test(ref_or_null_part &
5351
records > (double) table->quick_rows[key])
5353
tmp= records= (double) table->quick_rows[key];
5357
/* Limit the number of matched rows */
5358
set_if_smaller(tmp, (double) thd->variables.max_seeks_for_key);
5359
if (table->covering_keys.is_set(key))
5361
/* we can use only index tree */
5362
tmp= record_count * table->file->index_only_read_time(key, tmp);
5365
tmp= record_count * min(tmp,s->worst_seeks);
5368
tmp= best_time; // Do nothing
5371
if (sj_inside_out_scan && !start_key)
5379
if (tmp < best_time - records/(double) TIME_FOR_COMPARE)
5381
best_time= tmp + records/(double) TIME_FOR_COMPARE;
5383
best_records= records;
5384
best_key= start_key;
5385
best_max_key_part= max_key_part;
5386
best_ref_depends_map= found_ref;
5387
best_is_sj_inside_out= sj_inside_out_scan;
5390
records= best_records;
5394
Don't test table scan if it can't be better.
5395
Prefer key lookup if we would use the same key for scanning.
5397
Don't do a table scan on InnoDB tables, if we can read the used
5398
parts of the row from any of the used index.
5399
This is because table scans uses index and we would not win
5400
anything by using a table scan.
5402
A word for word translation of the below if-statement in sergefp's
5403
understanding: we check if we should use table scan if:
5404
(1) The found 'ref' access produces more records than a table scan
5405
(or index scan, or quick select), or 'ref' is more expensive than
5407
(2) This doesn't hold: the best way to perform table scan is to to perform
5408
'range' access using index IDX, and the best way to perform 'ref'
5409
access is to use the same index IDX, with the same or more key parts.
5410
(note: it is not clear how this rule is/should be extended to
5411
index_merge quick selects)
5412
(3) See above note about InnoDB.
5413
(4) NOT ("FORCE INDEX(...)" is used for table and there is 'ref' access
5414
path, but there is no quick select)
5415
If the condition in the above brackets holds, then the only possible
5416
"table scan" access method is ALL/index (there is no quick select).
5417
Since we have a 'ref' access path, and FORCE INDEX instructs us to
5418
choose it over ALL/index, there is no need to consider a full table
5421
if ((records >= s->found_records || best > s->read_time) && // (1)
5422
!(s->quick && best_key && s->quick->index == best_key->key && // (2)
5423
best_max_key_part >= s->table->quick_key_parts[best_key->key]) &&// (2)
5424
!((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3)
5425
! s->table->covering_keys.is_clear_all() && best_key && !s->quick) &&// (3)
5426
!(s->table->force_index && best_key && !s->quick)) // (4)
5427
{ // Check full join
5428
ha_rows rnd_records= s->found_records;
5430
If there is a filtering condition on the table (i.e. ref analyzer found
5431
at least one "table.keyXpartY= exprZ", where exprZ refers only to tables
5432
preceding this table in the join order we're now considering), then
5433
assume that 25% of the rows will be filtered out by this condition.
5435
This heuristic is supposed to force tables used in exprZ to be before
5436
this table in join order.
5438
if (found_constraint)
5439
rnd_records-= rnd_records/4;
5442
If applicable, get a more accurate estimate. Don't use the two
5445
if (s->table->quick_condition_rows != s->found_records)
5446
rnd_records= s->table->quick_condition_rows;
5449
Range optimizer never proposes a RANGE if it isn't better
5450
than FULL: so if RANGE is present, it's always preferred to FULL.
5451
Here we estimate its cost.
5457
- read record range through 'quick'
5458
- skip rows which does not satisfy WHERE constraints
5460
We take into account possible use of join cache for ALL/index
5461
access (see first else-branch below), but we don't take it into
5462
account here for range/index_merge access. Find out why this is so.
5465
(s->quick->read_time +
5466
(s->found_records - rnd_records)/(double) TIME_FOR_COMPARE);
5470
/* Estimate cost of reading table. */
5471
tmp= s->table->file->scan_time();
5472
if (s->table->map & join->outer_join) // Can't use join cache
5475
For each record we have to:
5476
- read the whole table record
5477
- skip rows which does not satisfy join condition
5481
(s->records - rnd_records)/(double) TIME_FOR_COMPARE);
5485
/* We read the table as many times as join buffer becomes full. */
5486
tmp*= (1.0 + floor((double) cache_record_length(join,idx) *
5488
(double) thd->variables.join_buff_size));
5490
We don't make full cartesian product between rows in the scanned
5491
table and existing records because we skip all rows from the
5492
scanned table, which does not satisfy join condition when
5493
we read the table (see flush_cached_records for details). Here we
5494
take into account cost to read and skip these records.
5496
tmp+= (s->records - rnd_records)/(double) TIME_FOR_COMPARE;
5501
We estimate the cost of evaluating WHERE clause for found records
5502
as record_count * rnd_records / TIME_FOR_COMPARE. This cost plus
5503
tmp give us total cost of using TABLE SCAN
5505
if (best == DBL_MAX ||
5506
(tmp + record_count/(double) TIME_FOR_COMPARE*rnd_records <
5507
best + record_count/(double) TIME_FOR_COMPARE*records))
5510
If the table has a range (s->quick is set) make_join_select()
5511
will ensure that this will be used
5514
records= rows2double(rnd_records);
5516
/* range/index_merge/ALL/index access method are "independent", so: */
5517
best_ref_depends_map= 0;
5518
best_is_sj_inside_out= false;
5522
/* Update the cost information for the current partial plan */
5523
join->positions[idx].records_read= records;
5524
join->positions[idx].read_time= best;
5525
join->positions[idx].key= best_key;
5526
join->positions[idx].table= s;
5527
join->positions[idx].ref_depend_map= best_ref_depends_map;
5528
join->positions[idx].use_insideout_scan= best_is_sj_inside_out;
5531
idx == join->const_tables &&
5532
s->table == join->sort_by_table &&
5533
join->unit->select_limit_cnt >= records)
5534
join->sort_by_table= (TABLE*) 1; // Must use temporary table
5541
Selects and invokes a search strategy for an optimal query plan.
5543
The function checks user-configurable parameters that control the search
5544
strategy for an optimal plan, selects the search method and then invokes
5545
it. Each specific optimization procedure stores the final optimal plan in
5546
the array 'join->best_positions', and the cost of the plan in
5549
@param join pointer to the structure providing all context info for
5551
@param join_tables set of the tables in the query
5554
'MAX_TABLES+2' denotes the old implementation of find_best before
5555
the greedy version. Will be removed when greedy_search is approved.
5564
choose_plan(JOIN *join, table_map join_tables)
5566
uint search_depth= join->thd->variables.optimizer_search_depth;
5567
uint prune_level= join->thd->variables.optimizer_prune_level;
5568
bool straight_join= test(join->select_options & SELECT_STRAIGHT_JOIN);
5570
join->cur_embedding_map= 0;
5571
reset_nj_counters(join->join_list);
5573
if (SELECT_STRAIGHT_JOIN option is set)
5574
reorder tables so dependent tables come after tables they depend
5575
on, otherwise keep tables in the order they were specified in the query
5577
Apply heuristic: pre-sort all access plans with respect to the number of
5580
my_qsort(join->best_ref + join->const_tables,
5581
join->tables - join->const_tables, sizeof(JOIN_TAB*),
5582
straight_join ? join_tab_cmp_straight : join_tab_cmp);
5583
join->cur_emb_sj_nests= 0;
5586
optimize_straight_join(join, join_tables);
5590
if (search_depth == MAX_TABLES+2)
5592
TODO: 'MAX_TABLES+2' denotes the old implementation of find_best before
5593
the greedy version. Will be removed when greedy_search is approved.
5595
join->best_read= DBL_MAX;
5596
if (find_best(join, join_tables, join->const_tables, 1.0, 0.0))
5601
if (search_depth == 0)
5602
/* Automatically determine a reasonable value for 'search_depth' */
5603
search_depth= determine_search_depth(join);
5604
if (greedy_search(join, join_tables, search_depth, prune_level))
5610
Store the cost of this query into a user variable
5611
Don't update last_query_cost for statements that are not "flat joins" :
5612
i.e. they have subqueries, unions or call stored procedures.
5613
TODO: calculate a correct cost for a query with subqueries and UNIONs.
5615
if (join->thd->lex->is_single_level_stmt())
5616
join->thd->status_var.last_query_cost= join->best_read;
5622
Compare two JOIN_TAB objects based on the number of accessed records.
5624
@param ptr1 pointer to first JOIN_TAB object
5625
@param ptr2 pointer to second JOIN_TAB object
800
5628
The order relation implemented by join_tab_cmp() is not transitive,
5682
Heuristic procedure to automatically guess a reasonable degree of
5683
exhaustiveness for the greedy search procedure.
5685
The procedure estimates the optimization time and selects a search depth
5686
big enough to result in a near-optimal QEP, that doesn't take too long to
5687
find. If the number of tables in the query exceeds some constant, then
5688
search_depth is set to this constant.
5690
@param join pointer to the structure providing all context info for
5694
This is an extremely simplistic implementation that serves as a stub for a
5695
more advanced analysis of the join. Ideally the search depth should be
5696
determined by learning from previous query optimizations, because it will
5697
depend on the CPU power (and other factors).
5700
this value should be determined dynamically, based on statistics:
5701
uint max_tables_for_exhaustive_opt= 7;
5704
this value could be determined by some mapping of the form:
5705
depth : table_count -> [max_tables_for_exhaustive_opt..MAX_EXHAUSTIVE]
5708
A positive integer that specifies the search depth (and thus the
5709
exhaustiveness) of the depth-first search algorithm used by
5714
determine_search_depth(JOIN *join)
5716
uint table_count= join->tables - join->const_tables;
5718
/* TODO: this value should be determined dynamically, based on statistics: */
5719
uint max_tables_for_exhaustive_opt= 7;
5721
if (table_count <= max_tables_for_exhaustive_opt)
5722
search_depth= table_count+1; // use exhaustive for small number of tables
5725
TODO: this value could be determined by some mapping of the form:
5726
depth : table_count -> [max_tables_for_exhaustive_opt..MAX_EXHAUSTIVE]
5728
search_depth= max_tables_for_exhaustive_opt; // use greedy search
5730
return search_depth;
5735
Select the best ways to access the tables in a query without reordering them.
5737
Find the best access paths for each query table and compute their costs
5738
according to their order in the array 'join->best_ref' (thus without
5739
reordering the join tables). The function calls sequentially
5740
'best_access_path' for each table in the query to select the best table
5741
access method. The final optimal plan is stored in the array
5742
'join->best_positions', and the corresponding cost in 'join->best_read'.
5744
@param join pointer to the structure providing all context info for
5746
@param join_tables set of the tables in the query
5749
This function can be applied to:
5750
- queries with STRAIGHT_JOIN
5751
- internally to compute the cost of an arbitrary QEP
5753
Thus 'optimize_straight_join' can be used at any stage of the query
5754
optimization process to finalize a QEP as it is.
5758
optimize_straight_join(JOIN *join, table_map join_tables)
5761
uint idx= join->const_tables;
5762
double record_count= 1.0;
5763
double read_time= 0.0;
5765
for (JOIN_TAB **pos= join->best_ref + idx ; (s= *pos) ; pos++)
5767
/* Find the best access method from 's' to the current partial plan */
5768
advance_sj_state(join_tables, s);
5769
best_access_path(join, s, join->thd, join_tables, idx,
5770
record_count, read_time);
5771
/* compute the cost of the new plan extended with 's' */
5772
record_count*= join->positions[idx].records_read;
5773
read_time+= join->positions[idx].read_time;
5774
join_tables&= ~(s->table->map);
5778
read_time+= record_count / (double) TIME_FOR_COMPARE;
5779
if (join->sort_by_table &&
5780
join->sort_by_table != join->positions[join->const_tables].table->table)
5781
read_time+= record_count; // We have to make a temp table
5782
memcpy((uchar*) join->best_positions, (uchar*) join->positions,
5783
sizeof(POSITION)*idx);
5784
join->best_read= read_time;
5789
Find a good, possibly optimal, query execution plan (QEP) by a greedy search.
5791
The search procedure uses a hybrid greedy/exhaustive search with controlled
5792
exhaustiveness. The search is performed in N = card(remaining_tables)
5793
steps. Each step evaluates how promising is each of the unoptimized tables,
5794
selects the most promising table, and extends the current partial QEP with
5795
that table. Currenly the most 'promising' table is the one with least
5796
expensive extension.\
5798
There are two extreme cases:
5799
-# When (card(remaining_tables) < search_depth), the estimate finds the
5800
best complete continuation of the partial QEP. This continuation can be
5801
used directly as a result of the search.
5802
-# When (search_depth == 1) the 'best_extension_by_limited_search'
5803
consideres the extension of the current QEP with each of the remaining
5806
All other cases are in-between these two extremes. Thus the parameter
5807
'search_depth' controlls the exhaustiveness of the search. The higher the
5808
value, the longer the optimizaton time and possibly the better the
5809
resulting plan. The lower the value, the fewer alternative plans are
5810
estimated, but the more likely to get a bad QEP.
5812
All intermediate and final results of the procedure are stored in 'join':
5813
- join->positions : modified for every partial QEP that is explored
5814
- join->best_positions: modified for the current best complete QEP
5815
- join->best_read : modified for the current best complete QEP
5816
- join->best_ref : might be partially reordered
5818
The final optimal plan is stored in 'join->best_positions', and its
5819
corresponding cost in 'join->best_read'.
5822
The following pseudocode describes the algorithm of 'greedy_search':
5825
procedure greedy_search
5826
input: remaining_tables
5831
(t, a) = best_extension(pplan, remaining_tables);
5832
pplan = concat(pplan, (t, a));
5833
remaining_tables = remaining_tables - t;
5834
} while (remaining_tables != {})
5839
where 'best_extension' is a placeholder for a procedure that selects the
5840
most "promising" of all tables in 'remaining_tables'.
5841
Currently this estimate is performed by calling
5842
'best_extension_by_limited_search' to evaluate all extensions of the
5843
current QEP of size 'search_depth', thus the complexity of 'greedy_search'
5844
mainly depends on that of 'best_extension_by_limited_search'.
5847
If 'best_extension()' == 'best_extension_by_limited_search()', then the
5848
worst-case complexity of this algorithm is <=
5849
O(N*N^search_depth/search_depth). When serch_depth >= N, then the
5850
complexity of greedy_search is O(N!).
5853
In the future, 'greedy_search' might be extended to support other
5854
implementations of 'best_extension', e.g. some simpler quadratic procedure.
5856
@param join pointer to the structure providing all context info
5858
@param remaining_tables set of tables not included into the partial plan yet
5859
@param search_depth controlls the exhaustiveness of the search
5860
@param prune_level the pruning heuristics that should be applied during
5870
greedy_search(JOIN *join,
5871
table_map remaining_tables,
5875
double record_count= 1.0;
5876
double read_time= 0.0;
5877
uint idx= join->const_tables; // index into 'join->best_ref'
5879
uint size_remain; // cardinality of remaining_tables
5881
JOIN_TAB *best_table; // the next plan node to be added to the curr QEP
5883
/* number of tables that remain to be optimized */
5884
size_remain= my_count_bits(remaining_tables);
5887
/* Find the extension of the current QEP with the lowest cost */
5888
join->best_read= DBL_MAX;
5889
if (best_extension_by_limited_search(join, remaining_tables, idx, record_count,
5890
read_time, search_depth, prune_level))
5893
if (size_remain <= search_depth)
5896
'join->best_positions' contains a complete optimal extension of the
5897
current partial QEP.
5902
/* select the first table in the optimal extension as most promising */
5903
best_pos= join->best_positions[idx];
5904
best_table= best_pos.table;
5906
Each subsequent loop of 'best_extension_by_limited_search' uses
5907
'join->positions' for cost estimates, therefore we have to update its
5910
join->positions[idx]= best_pos;
5912
/* find the position of 'best_table' in 'join->best_ref' */
5914
JOIN_TAB *pos= join->best_ref[best_idx];
5915
while (pos && best_table != pos)
5916
pos= join->best_ref[++best_idx];
5917
assert((pos != NULL)); // should always find 'best_table'
5918
/* move 'best_table' at the first free position in the array of joins */
5919
swap_variables(JOIN_TAB*, join->best_ref[idx], join->best_ref[best_idx]);
5921
/* compute the cost of the new plan extended with 'best_table' */
5922
record_count*= join->positions[idx].records_read;
5923
read_time+= join->positions[idx].read_time;
5925
remaining_tables&= ~(best_table->table->map);
5933
Find a good, possibly optimal, query execution plan (QEP) by a possibly
5936
The procedure searches for the optimal ordering of the query tables in set
5937
'remaining_tables' of size N, and the corresponding optimal access paths to
5938
each table. The choice of a table order and an access path for each table
5939
constitutes a query execution plan (QEP) that fully specifies how to
5942
The maximal size of the found plan is controlled by the parameter
5943
'search_depth'. When search_depth == N, the resulting plan is complete and
5944
can be used directly as a QEP. If search_depth < N, the found plan consists
5945
of only some of the query tables. Such "partial" optimal plans are useful
5946
only as input to query optimization procedures, and cannot be used directly
5949
The algorithm begins with an empty partial plan stored in 'join->positions'
5950
and a set of N tables - 'remaining_tables'. Each step of the algorithm
5951
evaluates the cost of the partial plan extended by all access plans for
5952
each of the relations in 'remaining_tables', expands the current partial
5953
plan with the access plan that results in lowest cost of the expanded
5954
partial plan, and removes the corresponding relation from
5955
'remaining_tables'. The algorithm continues until it either constructs a
5956
complete optimal plan, or constructs an optimal plartial plan with size =
5959
The final optimal plan is stored in 'join->best_positions'. The
5960
corresponding cost of the optimal plan is in 'join->best_read'.
5963
The procedure uses a recursive depth-first search where the depth of the
5964
recursion (and thus the exhaustiveness of the search) is controlled by the
5965
parameter 'search_depth'.
5968
The pseudocode below describes the algorithm of
5969
'best_extension_by_limited_search'. The worst-case complexity of this
5970
algorithm is O(N*N^search_depth/search_depth). When serch_depth >= N, then
5971
the complexity of greedy_search is O(N!).
5974
procedure best_extension_by_limited_search(
5975
pplan in, // in, partial plan of tables-joined-so-far
5976
pplan_cost, // in, cost of pplan
5977
remaining_tables, // in, set of tables not referenced in pplan
5978
best_plan_so_far, // in/out, best plan found so far
5979
best_plan_so_far_cost,// in/out, cost of best_plan_so_far
5980
search_depth) // in, maximum size of the plans being considered
5982
for each table T from remaining_tables
5984
// Calculate the cost of using table T as above
5985
cost = complex-series-of-calculations;
5987
// Add the cost to the cost so far.
5990
if (pplan_cost >= best_plan_so_far_cost)
5991
// pplan_cost already too great, stop search
5994
pplan= expand pplan by best_access_method;
5995
remaining_tables= remaining_tables - table T;
5996
if (remaining_tables is not an empty set
6000
best_extension_by_limited_search(pplan, pplan_cost,
6003
best_plan_so_far_cost,
6008
best_plan_so_far_cost= pplan_cost;
6009
best_plan_so_far= pplan;
6016
When 'best_extension_by_limited_search' is called for the first time,
6017
'join->best_read' must be set to the largest possible value (e.g. DBL_MAX).
6018
The actual implementation provides a way to optionally use pruning
6019
heuristic (controlled by the parameter 'prune_level') to reduce the search
6020
space by skipping some partial plans.
6023
The parameter 'search_depth' provides control over the recursion
6024
depth, and thus the size of the resulting optimal plan.
6026
@param join pointer to the structure providing all context info
6028
@param remaining_tables set of tables not included into the partial plan yet
6029
@param idx length of the partial QEP in 'join->positions';
6030
since a depth-first search is used, also corresponds
6031
to the current depth of the search tree;
6032
also an index in the array 'join->best_ref';
6033
@param record_count estimate for the number of records returned by the
6035
@param read_time the cost of the best partial plan
6036
@param search_depth maximum depth of the recursion and thus size of the
6038
(0 < search_depth <= join->tables+1).
6039
@param prune_level pruning heuristics that should be applied during
6041
(values: 0 = EXHAUSTIVE, 1 = PRUNE_BY_TIME_OR_ROWS)
6050
best_extension_by_limited_search(JOIN *join,
6051
table_map remaining_tables,
6053
double record_count,
6058
THD *thd= join->thd;
6059
if (thd->killed) // Abort
6063
'join' is a partial plan with lower cost than the best plan so far,
6064
so continue expanding it further with the tables in 'remaining_tables'.
6067
double best_record_count= DBL_MAX;
6068
double best_read_time= DBL_MAX;
6070
for (JOIN_TAB **pos= join->best_ref + idx ; (s= *pos) ; pos++)
6072
table_map real_table_bit= s->table->map;
6073
if ((remaining_tables & real_table_bit) &&
6074
!(remaining_tables & s->dependent) &&
6075
(!idx || !check_interleaving_with_nj(join->positions[idx-1].table, s)))
6077
double current_record_count, current_read_time;
6078
advance_sj_state(remaining_tables, s);
6081
psergey-insideout-todo:
6082
when best_access_path() detects it could do an InsideOut scan or
6083
some other scan, have it return an insideout scan and a flag that
6084
requests to "fork" this loop iteration. (Q: how does that behave
6085
when the depth is insufficient??)
6087
/* Find the best access method from 's' to the current partial plan */
6088
best_access_path(join, s, thd, remaining_tables, idx,
6089
record_count, read_time);
6090
/* Compute the cost of extending the plan with 's' */
6091
current_record_count= record_count * join->positions[idx].records_read;
6092
current_read_time= read_time + join->positions[idx].read_time;
6094
/* Expand only partial plans with lower cost than the best QEP so far */
6095
if ((current_read_time +
6096
current_record_count / (double) TIME_FOR_COMPARE) >= join->best_read)
6098
restore_prev_nj_state(s);
6099
restore_prev_sj_state(remaining_tables, s);
6104
Prune some less promising partial plans. This heuristic may miss
6105
the optimal QEPs, thus it results in a non-exhaustive search.
6107
if (prune_level == 1)
6109
if (best_record_count > current_record_count ||
6110
best_read_time > current_read_time ||
6111
(idx == join->const_tables && s->table == join->sort_by_table)) // 's' is the first table in the QEP
6113
if (best_record_count >= current_record_count &&
6114
best_read_time >= current_read_time &&
6115
/* TODO: What is the reasoning behind this condition? */
6116
(!(s->key_dependent & remaining_tables) ||
6117
join->positions[idx].records_read < 2.0))
6119
best_record_count= current_record_count;
6120
best_read_time= current_read_time;
6125
restore_prev_nj_state(s);
6126
restore_prev_sj_state(remaining_tables, s);
6131
if ( (search_depth > 1) && (remaining_tables & ~real_table_bit) )
6132
{ /* Recursively expand the current partial plan */
6133
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
6134
if (best_extension_by_limited_search(join,
6135
remaining_tables & ~real_table_bit,
6137
current_record_count,
6142
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
6146
'join' is either the best partial QEP with 'search_depth' relations,
6147
or the best complete QEP so far, whichever is smaller.
6149
current_read_time+= current_record_count / (double) TIME_FOR_COMPARE;
6150
if (join->sort_by_table &&
6151
join->sort_by_table !=
6152
join->positions[join->const_tables].table->table)
6153
/* We have to make a temp table */
6154
current_read_time+= current_record_count;
6155
if ((search_depth == 1) || (current_read_time < join->best_read))
6157
memcpy((uchar*) join->best_positions, (uchar*) join->positions,
6158
sizeof(POSITION) * (idx + 1));
6159
join->best_read= current_read_time - 0.001;
6162
restore_prev_nj_state(s);
6163
restore_prev_sj_state(remaining_tables, s);
6172
- TODO: this function is here only temporarily until 'greedy_search' is
6173
tested and accepted.
6180
find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
6183
THD *thd= join->thd;
6188
read_time+=record_count/(double) TIME_FOR_COMPARE;
6189
if (join->sort_by_table &&
6190
join->sort_by_table !=
6191
join->positions[join->const_tables].table->table)
6192
read_time+=record_count; // We have to make a temp table
6193
if (read_time < join->best_read)
6195
memcpy((uchar*) join->best_positions,(uchar*) join->positions,
6196
sizeof(POSITION)*idx);
6197
join->best_read= read_time - 0.001;
6201
if (read_time+record_count/(double) TIME_FOR_COMPARE >= join->best_read)
6202
return(false); /* Found better before */
6205
double best_record_count=DBL_MAX,best_read_time=DBL_MAX;
6206
for (JOIN_TAB **pos=join->best_ref+idx ; (s=*pos) ; pos++)
6208
table_map real_table_bit=s->table->map;
6209
if ((rest_tables & real_table_bit) && !(rest_tables & s->dependent) &&
6210
(!idx|| !check_interleaving_with_nj(join->positions[idx-1].table, s)))
6212
double records, best;
6213
advance_sj_state(rest_tables, s);
6214
best_access_path(join, s, thd, rest_tables, idx, record_count,
6216
records= join->positions[idx].records_read;
6217
best= join->positions[idx].read_time;
6219
Go to the next level only if there hasn't been a better key on
6220
this level! This will cut down the search for a lot simple cases!
6222
double current_record_count=record_count*records;
6223
double current_read_time=read_time+best;
6224
if (best_record_count > current_record_count ||
6225
best_read_time > current_read_time ||
6226
(idx == join->const_tables && s->table == join->sort_by_table))
6228
if (best_record_count >= current_record_count &&
6229
best_read_time >= current_read_time &&
6230
(!(s->key_dependent & rest_tables) || records < 2.0))
6232
best_record_count=current_record_count;
6233
best_read_time=current_read_time;
6235
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
6236
if (find_best(join,rest_tables & ~real_table_bit,idx+1,
6237
current_record_count,current_read_time))
6239
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
6241
restore_prev_nj_state(s);
6242
restore_prev_sj_state(rest_tables, s);
6243
if (join->select_options & SELECT_STRAIGHT_JOIN)
6244
break; // Don't test all combinations
849
6252
Find how much space the prevous read not const tables takes in cache.
851
void calc_used_field_length(Session *, JoinTable *join_tab)
6255
static void calc_used_field_length(THD *thd __attribute__((__unused__)),
853
uint32_t null_fields,blobs,fields,rec_length;
6258
uint null_fields,blobs,fields,rec_length;
854
6259
Field **f_ptr,*field;
6260
MY_BITMAP *read_set= join_tab->table->read_set;;
856
6262
null_fields= blobs= fields= rec_length=0;
857
for (f_ptr=join_tab->table->getFields() ; (field= *f_ptr) ; f_ptr++)
6263
for (f_ptr=join_tab->table->field ; (field= *f_ptr) ; f_ptr++)
859
if (field->isReadSet())
6265
if (bitmap_is_set(read_set, field->field_index))
861
uint32_t flags=field->flags;
6267
uint flags=field->flags;
863
6269
rec_length+=field->pack_length();
864
6270
if (flags & BLOB_FLAG)
866
6272
if (!(flags & NOT_NULL_FLAG))
870
6276
if (null_fields)
871
rec_length+=(join_tab->table->getNullFields() + 7)/8;
6277
rec_length+=(join_tab->table->s->null_fields+7)/8;
872
6278
if (join_tab->table->maybe_null)
873
6279
rec_length+=sizeof(bool);
876
uint32_t blob_length=(uint32_t) (join_tab->table->cursor->stats.mean_rec_length-
877
(join_tab->table->getRecordLength()- rec_length));
878
rec_length+= max((uint32_t)4,blob_length);
880
join_tab->used_fields= fields;
881
join_tab->used_fieldlength= rec_length;
882
join_tab->used_blobs= blobs;
885
StoredKey *get_store_key(Session *session,
886
optimizer::KeyUse *keyuse,
887
table_map used_tables,
888
KeyPartInfo *key_part,
889
unsigned char *key_buff,
892
Item_ref *key_use_val= static_cast<Item_ref *>(keyuse->getVal());
893
if (! ((~used_tables) & keyuse->getUsedTables())) // if const item
895
return new store_key_const_item(session,
897
key_buff + maybe_null,
898
maybe_null ? key_buff : 0,
902
else if (key_use_val->type() == Item::FIELD_ITEM ||
903
(key_use_val->type() == Item::REF_ITEM &&
904
key_use_val->ref_type() == Item_ref::OUTER_REF &&
905
(*(Item_ref**)((Item_ref*)key_use_val)->ref)->ref_type() == Item_ref::DIRECT_REF &&
906
key_use_val->real_item()->type() == Item::FIELD_ITEM))
908
return new store_key_field(session,
910
key_buff + maybe_null,
911
maybe_null ? key_buff : 0,
913
((Item_field*) key_use_val->real_item())->field,
914
key_use_val->full_name());
916
return new store_key_item(session,
918
key_buff + maybe_null,
919
maybe_null ? key_buff : 0,
6282
uint blob_length=(uint) (join_tab->table->file->stats.mean_rec_length-
6283
(join_tab->table->s->reclength- rec_length));
6284
rec_length+=(uint) max(4,blob_length);
6286
join_tab->used_fields=fields;
6287
join_tab->used_fieldlength=rec_length;
6288
join_tab->used_blobs=blobs;
6293
cache_record_length(JOIN *join,uint idx)
6296
JOIN_TAB **pos,**end;
6299
for (pos=join->best_ref+join->const_tables,end=join->best_ref+idx ;
6303
JOIN_TAB *join_tab= *pos;
6304
if (!join_tab->used_fieldlength) /* Not calced yet */
6305
calc_used_field_length(thd, join_tab);
6306
length+=join_tab->used_fieldlength;
6313
Get the number of different row combinations for subset of partial join
6317
join The join structure
6318
idx Number of tables in the partial join order (i.e. the
6319
partial join order is in join->positions[0..idx-1])
6320
found_ref Bitmap of tables for which we need to find # of distinct
6324
Given a partial join order (in join->positions[0..idx-1]) and a subset of
6325
tables within that join order (specified in found_ref), find out how many
6326
distinct row combinations of subset tables will be in the result of the
6329
This is used as follows: Suppose we have a table accessed with a ref-based
6330
method. The ref access depends on current rows of tables in found_ref.
6331
We want to count # of different ref accesses. We assume two ref accesses
6332
will be different if at least one of access parameters is different.
6333
Example: consider a query
6335
SELECT * FROM t1, t2, t3 WHERE t1.key=c1 AND t2.key=c2 AND t3.key=t1.field
6338
t1, ref access on t1.key=c1
6339
t2, ref access on t2.key=c2
6340
t3, ref access on t3.key=t1.field
6342
For t1: n_ref_scans = 1, n_distinct_ref_scans = 1
6343
For t2: n_ref_scans = records_read(t1), n_distinct_ref_scans=1
6344
For t3: n_ref_scans = records_read(t1)*records_read(t2)
6345
n_distinct_ref_scans = #records_read(t1)
6347
The reason for having this function (at least the latest version of it)
6348
is that we need to account for buffering in join execution.
6350
An edge-case example: if we have a non-first table in join accessed via
6351
ref(const) or ref(param) where there is a small number of different
6352
values of param, then the access will likely hit the disk cache and will
6353
not require any disk seeks.
6355
The proper solution would be to assume an LRU disk cache of some size,
6356
calculate probability of cache hits, etc. For now we just count
6357
identical ref accesses as one.
6360
Expected number of row combinations
6364
prev_record_reads(JOIN *join, uint idx, table_map found_ref)
6367
POSITION *pos_end= join->positions - 1;
6368
for (POSITION *pos= join->positions + idx - 1; pos != pos_end; pos--)
6370
if (pos->table->table->map & found_ref)
6372
found_ref|= pos->ref_depend_map;
6374
For the case of "t1 LEFT JOIN t2 ON ..." where t2 is a const table
6375
with no matching row we will get position[t2].records_read==0.
6376
Actually the size of output is one null-complemented row, therefore
6377
we will use value of 1 whenever we get records_read==0.
6380
- the above case can't occur if inner part of outer join has more
6381
than one table: table with no matches will not be marked as const.
6383
- Ideally we should add 1 to records_read for every possible null-
6384
complemented row. We're not doing it because: 1. it will require
6385
non-trivial code and add overhead. 2. The value of records_read
6386
is an inprecise estimate and adding 1 (or, in the worst case,
6387
#max_nested_outer_joins=64-1) will not make it any more precise.
6389
if (pos->records_read > DBL_EPSILON)
6390
found*= pos->records_read;
925
This function is only called for const items on fields which are keys.
928
returns 1 if there was some conversion made when the field was stored.
6398
Set up join struct according to best position.
930
bool store_val_in_field(Field *field, Item *item, enum_check_fields check_flag)
933
Table *table= field->getTable();
934
Session *session= table->in_use;
935
ha_rows cuted_fields=session->cuted_fields;
938
we should restore old value of count_cuted_fields because
939
store_val_in_field can be called from insert_query
940
with select_insert, which make count_cuted_fields= 1
942
enum_check_fields old_count_cuted_fields= session->count_cuted_fields;
943
session->count_cuted_fields= check_flag;
944
error= item->save_in_field(field, 1);
945
session->count_cuted_fields= old_count_cuted_fields;
946
return error || cuted_fields != session->cuted_fields;
949
inline void add_cond_and_fix(Item **e1, Item *e2)
6402
get_best_combination(JOIN *join)
6405
table_map used_tables;
6406
JOIN_TAB *join_tab,*j;
6411
table_count=join->tables;
6412
if (!(join->join_tab=join_tab=
6413
(JOIN_TAB*) thd->alloc(sizeof(JOIN_TAB)*table_count)))
6418
used_tables= OUTER_REF_TABLE_BIT; // Outer row is already read
6419
for (j=join_tab, tablenr=0 ; tablenr < table_count ; tablenr++,j++)
954
if ((res= new Item_cond_and(*e1, e2)))
6422
*j= *join->best_positions[tablenr].table;
6423
form=join->table[tablenr]=j->table;
6424
used_tables|= form->map;
6425
form->reginfo.join_tab=j;
6426
if (!*j->on_expr_ref)
6427
form->reginfo.not_exists_optimize=0; // Only with LEFT JOIN
6428
if (j->type == JT_CONST)
6429
continue; // Handled in make_join_stat..
6434
if (j->type == JT_SYSTEM)
6436
if (j->keys.is_clear_all() || !(keyuse= join->best_positions[tablenr].key))
957
res->quick_fix_field();
6439
if (tablenr != join->const_tables)
6442
else if (create_ref_for_key(join, j, keyuse, used_tables))
6443
return(true); // Something went wrong
6446
for (i=0 ; i < table_count ; i++)
6447
join->map2table[join->join_tab[i].table->tablenr]=join->join_tab+i;
6448
update_depend_map(join);
964
bool create_ref_for_key(Join *join,
966
optimizer::KeyUse *org_keyuse,
967
table_map used_tables)
6453
static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse,
6454
table_map used_tables)
969
optimizer::KeyUse *keyuse= org_keyuse;
970
Session *session= join->session;
975
KeyInfo *keyinfo= NULL;
6456
KEYUSE *keyuse=org_keyuse;
6457
THD *thd= join->thd;
6458
uint keyparts,length,key;
977
6462
/* Use best key from find_best */
979
key= keyuse->getKey();
980
keyinfo= table->key_info + key;
6465
keyinfo=table->key_info+key;
984
uint32_t found_part_ref_or_null= 0;
6469
uint found_part_ref_or_null= 0;
986
6471
Calculate length for the used key
987
6472
Stop if there is a missing key part or when we find second key_part
6859
Fill in outer join related info for the execution plan structure.
6861
For each outer join operation left after simplification of the
6862
original query the function set up the following pointers in the linear
6863
structure join->join_tab representing the selected execution plan.
6864
The first inner table t0 for the operation is set to refer to the last
6865
inner table tk through the field t0->last_inner.
6866
Any inner table ti for the operation are set to refer to the first
6867
inner table ti->first_inner.
6868
The first inner table t0 for the operation is set to refer to the
6869
first inner table of the embedding outer join operation, if there is any,
6870
through the field t0->first_upper.
6871
The on expression for the outer join operation is attached to the
6872
corresponding first inner table through the field t0->on_expr_ref.
6873
Here ti are structures of the JOIN_TAB type.
6875
EXAMPLE. For the query:
6879
(t2, t3 LEFT JOIN t4 ON t3.a=t4.a)
6880
ON (t1.a=t2.a AND t1.b=t3.b)
6884
given the execution plan with the table order t1,t2,t3,t4
6885
is selected, the following references will be set;
6886
t4->last_inner=[t4], t4->first_inner=[t4], t4->first_upper=[t2]
6887
t2->last_inner=[t4], t2->first_inner=t3->first_inner=[t2],
6888
on expression (t1.a=t2.a AND t1.b=t3.b) will be attached to
6889
*t2->on_expr_ref, while t3.a=t4.a will be attached to *t4->on_expr_ref.
6891
@param join reference to the info fully describing the query
6894
The function assumes that the simplification procedure has been
6895
already applied to the join query (see simplify_joins).
6896
This function can be called only after the execution plan
6901
make_outerjoin_info(JOIN *join)
6903
for (uint i=join->const_tables ; i < join->tables ; i++)
6905
JOIN_TAB *tab=join->join_tab+i;
6906
TABLE *table=tab->table;
6907
TABLE_LIST *tbl= table->pos_in_table_list;
6908
TABLE_LIST *embedding= tbl->embedding;
6910
if (tbl->outer_join)
6913
Table tab is the only one inner table for outer join.
6914
(Like table t4 for the table reference t3 LEFT JOIN t4 ON t3.a=t4.a
6915
is in the query above.)
6917
tab->last_inner= tab->first_inner= tab;
6918
tab->on_expr_ref= &tbl->on_expr;
6919
tab->cond_equal= tbl->cond_equal;
6921
tab->first_upper= embedding->nested_join->first_nested;
6923
for ( ; embedding ; embedding= embedding->embedding)
6925
/* Ignore sj-nests: */
6926
if (!embedding->on_expr)
6928
NESTED_JOIN *nested_join= embedding->nested_join;
6929
if (!nested_join->counter_)
6932
Table tab is the first inner table for nested_join.
6933
Save reference to it in the nested join structure.
6935
nested_join->first_nested= tab;
6936
tab->on_expr_ref= &embedding->on_expr;
6937
tab->cond_equal= tbl->cond_equal;
6938
if (embedding->embedding)
6939
tab->first_upper= embedding->embedding->nested_join->first_nested;
6941
if (!tab->first_inner)
6942
tab->first_inner= nested_join->first_nested;
6943
if (++nested_join->counter_ < nested_join->join_list.elements)
6945
/* Table tab is the last inner table for nested join. */
6946
nested_join->first_nested->last_inner= tab;
6954
make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
6956
THD *thd= join->thd;
6959
add_not_null_conds(join);
6960
table_map used_tables;
6961
if (cond) /* Because of QUICK_GROUP_MIN_MAX_SELECT */
6962
{ /* there may be a select without a cond. */
6963
if (join->tables > 1)
6964
cond->update_used_tables(); // Tablenr may have changed
6965
if (join->const_tables == join->tables &&
6966
thd->lex->current_select->master_unit() ==
6967
&thd->lex->unit) // not upper level SELECT
6968
join->const_table_map|=RAND_TABLE_BIT;
6969
{ // Check const tables
6971
make_cond_for_table(cond,
6972
join->const_table_map,
6974
for (JOIN_TAB *tab= join->join_tab+join->const_tables;
6975
tab < join->join_tab+join->tables ; tab++)
6977
if (*tab->on_expr_ref)
6979
JOIN_TAB *cond_tab= tab->first_inner;
6980
COND *tmp= make_cond_for_table(*tab->on_expr_ref,
6981
join->const_table_map,
6985
tmp= new Item_func_trig_cond(tmp, &cond_tab->not_null_compl);
6988
tmp->quick_fix_field();
6989
cond_tab->select_cond= !cond_tab->select_cond ? tmp :
6990
new Item_cond_and(cond_tab->select_cond,
6992
if (!cond_tab->select_cond)
6994
cond_tab->select_cond->quick_fix_field();
6997
if (const_cond && !const_cond->val_int())
6999
return(1); // Impossible const condition
7003
used_tables=((select->const_tables=join->const_table_map) |
7004
OUTER_REF_TABLE_BIT | RAND_TABLE_BIT);
7005
for (uint i=join->const_tables ; i < join->tables ; i++)
7007
JOIN_TAB *tab=join->join_tab+i;
7009
first_inner is the X in queries like:
7010
SELECT * FROM t1 LEFT OUTER JOIN (t2 JOIN t3) ON X
7012
JOIN_TAB *first_inner_tab= tab->first_inner;
7013
table_map current_map= tab->table->map;
7014
bool use_quick_range=0;
7018
Following force including random expression in last table condition.
7019
It solve problem with select like SELECT * FROM t1 WHERE rand() > 0.5
7021
if (i == join->tables-1)
7022
current_map|= OUTER_REF_TABLE_BIT | RAND_TABLE_BIT;
7023
used_tables|=current_map;
7025
if (tab->type == JT_REF && tab->quick &&
7026
(uint) tab->ref.key == tab->quick->index &&
7027
tab->ref.key_length < tab->quick->max_used_key_length)
7029
/* Range uses longer key; Use this instead of ref on key */
7034
tab->ref.key_parts=0; // Don't use ref key.
7035
join->best_positions[i].records_read= rows2double(tab->quick->records);
7037
We will use join cache here : prevent sorting of the first
7038
table only and sort at the end.
7040
if (i != join->const_tables && join->tables > join->const_tables + 1)
7046
tmp= make_cond_for_table(cond,used_tables,current_map, 0);
7047
if (cond && !tmp && tab->quick)
7049
if (tab->type != JT_ALL)
7052
Don't use the quick method
7053
We come here in the case where we have 'key=constant' and
7054
the test is removed by make_cond_for_table()
7062
Hack to handle the case where we only refer to a table
7063
in the ON part of an OUTER JOIN. In this case we want the code
7064
below to check if we should use 'quick' instead.
7066
tmp= new Item_int((int64_t) 1,1); // Always true
7070
if (tmp || !cond || tab->type == JT_REF || tab->type == JT_REF_OR_NULL ||
7071
tab->type == JT_EQ_REF)
7073
SQL_SELECT *sel= tab->select= ((SQL_SELECT*)
7074
thd->memdup((uchar*) select,
7077
return(1); // End of memory
7079
If tab is an inner table of an outer join operation,
7080
add a match guard to the pushed down predicate.
7081
The guard will turn the predicate on only after
7082
the first match for outer tables is encountered.
7087
Because of QUICK_GROUP_MIN_MAX_SELECT there may be a select without
7088
a cond, so neutralize the hack above.
7090
if (!(tmp= add_found_match_trig_cond(first_inner_tab, tmp, 0)))
7092
tab->select_cond=sel->cond=tmp;
7093
/* Push condition to storage engine if this is enabled
7094
and the condition is not guarded */
7095
tab->table->file->pushed_cond= NULL;
7096
if (thd->variables.engine_condition_pushdown)
7099
make_cond_for_table(tmp, current_map, current_map, 0);
7102
/* Push condition to handler */
7103
if (!tab->table->file->cond_push(push_cond))
7104
tab->table->file->pushed_cond= push_cond;
7109
tab->select_cond= sel->cond= NULL;
7111
sel->head=tab->table;
7114
/* Use quick key read if it's a constant and it's not used
7116
if (tab->needed_reg.is_clear_all() && tab->type != JT_EQ_REF
7117
&& (tab->type != JT_REF || (uint) tab->ref.key == tab->quick->index))
7119
sel->quick=tab->quick; // Use value from get_quick_...
7120
sel->quick_keys.clear_all();
7121
sel->needed_reg.clear_all();
7129
uint ref_key=(uint) sel->head->reginfo.join_tab->ref.key+1;
7130
if (i == join->const_tables && ref_key)
7132
if (!tab->const_keys.is_clear_all() &&
7133
tab->table->reginfo.impossible_range)
7136
else if (tab->type == JT_ALL && ! use_quick_range)
7138
if (!tab->const_keys.is_clear_all() &&
7139
tab->table->reginfo.impossible_range)
7140
return(1); // Impossible range
7142
We plan to scan all rows.
7143
Check again if we should use an index.
7144
We could have used an column from a previous table in
7145
the index if we are using limit and this is the first table
7148
if ((cond && (!tab->keys.is_subset(tab->const_keys) && i > 0)) ||
7149
(!tab->const_keys.is_clear_all() && (i == join->const_tables) && (join->unit->select_limit_cnt < join->best_positions[i].records_read) && ((join->select_options & OPTION_FOUND_ROWS) == false)))
7151
/* Join with outer join condition */
7152
COND *orig_cond=sel->cond;
7153
sel->cond= and_conds(sel->cond, *tab->on_expr_ref);
7156
We can't call sel->cond->fix_fields,
7157
as it will break tab->on_expr if it's AND condition
7158
(fix_fields currently removes extra AND/OR levels).
7159
Yet attributes of the just built condition are not needed.
7160
Thus we call sel->cond->quick_fix_field for safety.
7162
if (sel->cond && !sel->cond->fixed)
7163
sel->cond->quick_fix_field();
7165
if (sel->test_quick_select(thd, tab->keys,
7166
used_tables & ~ current_map,
7167
(join->select_options &
7170
join->unit->select_limit_cnt), 0,
7174
Before reporting "Impossible WHERE" for the whole query
7175
we have to check isn't it only "impossible ON" instead
7177
sel->cond=orig_cond;
7178
if (!*tab->on_expr_ref ||
7179
sel->test_quick_select(thd, tab->keys,
7180
used_tables & ~ current_map,
7181
(join->select_options &
7184
join->unit->select_limit_cnt),0,
7186
return(1); // Impossible WHERE
7189
sel->cond=orig_cond;
7191
/* Fix for EXPLAIN */
7193
join->best_positions[i].records_read= (double)sel->quick->records;
7197
sel->needed_reg=tab->needed_reg;
7198
sel->quick_keys.clear_all();
7200
if (!sel->quick_keys.is_subset(tab->checked_keys) ||
7201
!sel->needed_reg.is_subset(tab->checked_keys))
7203
tab->keys=sel->quick_keys;
7204
tab->keys.merge(sel->needed_reg);
7205
tab->use_quick= (!sel->needed_reg.is_clear_all() &&
7206
(select->quick_keys.is_clear_all() ||
7208
(select->quick->records >= 100L)))) ?
7210
sel->read_tables= used_tables & ~current_map;
7212
if (i != join->const_tables && tab->use_quick != 2)
7213
{ /* Read with cache */
7215
(tmp=make_cond_for_table(cond,
7216
join->const_table_map |
7220
tab->cache.select=(SQL_SELECT*)
7221
thd->memdup((uchar*) sel, sizeof(SQL_SELECT));
7222
tab->cache.select->cond=tmp;
7223
tab->cache.select->read_tables=join->const_table_map;
7230
Push down conditions from all on expressions.
7231
Each of these conditions are guarded by a variable
7232
that turns if off just before null complemented row for
7233
outer joins is formed. Thus, the condition from an
7234
'on expression' are guaranteed not to be checked for
7235
the null complemented row.
7238
/* First push down constant conditions from on expressions */
7239
for (JOIN_TAB *join_tab= join->join_tab+join->const_tables;
7240
join_tab < join->join_tab+join->tables ; join_tab++)
7242
if (*join_tab->on_expr_ref)
7244
JOIN_TAB *cond_tab= join_tab->first_inner;
7245
COND *tmp= make_cond_for_table(*join_tab->on_expr_ref,
7246
join->const_table_map,
7250
tmp= new Item_func_trig_cond(tmp, &cond_tab->not_null_compl);
7253
tmp->quick_fix_field();
7254
cond_tab->select_cond= !cond_tab->select_cond ? tmp :
7255
new Item_cond_and(cond_tab->select_cond,tmp);
7256
if (!cond_tab->select_cond)
7258
cond_tab->select_cond->quick_fix_field();
7262
/* Push down non-constant conditions from on expressions */
7263
JOIN_TAB *last_tab= tab;
7264
while (first_inner_tab && first_inner_tab->last_inner == last_tab)
7267
Table tab is the last inner table of an outer join.
7268
An on expression is always attached to it.
7270
COND *on_expr= *first_inner_tab->on_expr_ref;
7272
table_map used_tables2= (join->const_table_map |
7273
OUTER_REF_TABLE_BIT | RAND_TABLE_BIT);
7274
for (tab= join->join_tab+join->const_tables; tab <= last_tab ; tab++)
7276
current_map= tab->table->map;
7277
used_tables2|= current_map;
7278
COND *tmp_cond= make_cond_for_table(on_expr, used_tables2,
7282
JOIN_TAB *cond_tab= tab < first_inner_tab ? first_inner_tab : tab;
7284
First add the guards for match variables of
7285
all embedding outer join operations.
7287
if (!(tmp_cond= add_found_match_trig_cond(cond_tab->first_inner,
7292
Now add the guard turning the predicate off for
7293
the null complemented row.
7295
tmp_cond= new Item_func_trig_cond(tmp_cond,
7299
tmp_cond->quick_fix_field();
7300
/* Add the predicate to other pushed down predicates */
7301
cond_tab->select_cond= !cond_tab->select_cond ? tmp_cond :
7302
new Item_cond_and(cond_tab->select_cond,
7304
if (!cond_tab->select_cond)
7306
cond_tab->select_cond->quick_fix_field();
7309
first_inner_tab= first_inner_tab->first_upper;
7318
Check if given expression uses only table fields covered by the given index
7321
uses_index_fields_only()
7322
item Expression to check
7323
tbl The table having the index
7324
keyno The index number
7325
other_tbls_ok true <=> Fields of other non-const tables are allowed
7328
Check if given expression only uses fields covered by index #keyno in the
7329
table tbl. The expression can use any fields in any other tables.
7331
The expression is guaranteed not to be AND or OR - those constructs are
7332
handled outside of this function.
7339
bool uses_index_fields_only(Item *item, TABLE *tbl, uint keyno,
7342
if (item->const_item())
7346
Don't push down the triggered conditions. Nested outer joins execution
7347
code may need to evaluate a condition several times (both triggered and
7348
untriggered), and there is no way to put thi
7349
TODO: Consider cloning the triggered condition and using the copies for:
7350
1. push the first copy down, to have most restrictive index condition
7352
2. Put the second copy into tab->select_cond.
7354
if (item->type() == Item::FUNC_ITEM &&
7355
((Item_func*)item)->functype() == Item_func::TRIG_COND_FUNC)
7358
if (!(item->used_tables() & tbl->map))
7359
return other_tbls_ok;
7361
Item::Type item_type= item->type();
7362
switch (item_type) {
7363
case Item::FUNC_ITEM:
7365
/* This is a function, apply condition recursively to arguments */
7366
Item_func *item_func= (Item_func*)item;
7368
Item **item_end= (item_func->arguments()) + item_func->argument_count();
7369
for (child= item_func->arguments(); child != item_end; child++)
7371
if (!uses_index_fields_only(*child, tbl, keyno, other_tbls_ok))
7376
case Item::COND_ITEM:
7378
/* This is a function, apply condition recursively to arguments */
7379
List_iterator<Item> li(*((Item_cond*)item)->argument_list());
7383
if (!uses_index_fields_only(item, tbl, keyno, other_tbls_ok))
7388
case Item::FIELD_ITEM:
7390
Item_field *item_field= (Item_field*)item;
7391
if (item_field->field->table != tbl)
7393
return item_field->field->part_of_key.is_set(keyno);
7395
case Item::REF_ITEM:
7396
return uses_index_fields_only(item->real_item(), tbl, keyno,
7399
return false; /* Play it safe, don't push unknown non-const items */
1216
7404
#define ICP_COND_USES_INDEX_ONLY 10
1222
void JoinTable::cleanup()
1224
safe_delete(select);
1229
size_t size= cache.end - cache.buff;
1230
global_join_buffer.sub(size);
7407
Get a part of the condition that can be checked using only index fields
7410
make_cond_for_index()
7411
cond The source condition
7412
table The table that is partially available
7413
keyno The index in the above table. Only fields covered by the index
7415
other_tbls_ok true <=> Fields of other non-const tables are allowed
7418
Get a part of the condition that can be checked when for the given table
7419
we have values only of fields covered by some index. The condition may
7420
refer to other tables, it is assumed that we have values of all of their
7424
make_cond_for_index(
7425
"cond(t1.field) AND cond(t2.key1) AND cond(t2.non_key) AND cond(t2.key2)",
7428
"cond(t1.field) AND cond(t2.key2)"
7431
Index condition, or NULL if no condition could be inferred.
7434
Item *make_cond_for_index(Item *cond, TABLE *table, uint keyno,
7439
if (cond->type() == Item::COND_ITEM)
7442
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
7444
Item_cond_and *new_cond=new Item_cond_and;
7447
List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
7451
Item *fix= make_cond_for_index(item, table, keyno, other_tbls_ok);
7453
new_cond->argument_list()->push_back(fix);
7454
n_marked += test(item->marker == ICP_COND_USES_INDEX_ONLY);
7456
if (n_marked ==((Item_cond*)cond)->argument_list()->elements)
7457
cond->marker= ICP_COND_USES_INDEX_ONLY;
7458
switch (new_cond->argument_list()->elements) {
7462
return new_cond->argument_list()->head();
7464
new_cond->quick_fix_field();
7470
Item_cond_or *new_cond=new Item_cond_or;
7473
List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
7477
Item *fix= make_cond_for_index(item, table, keyno, other_tbls_ok);
7480
new_cond->argument_list()->push_back(fix);
7481
n_marked += test(item->marker == ICP_COND_USES_INDEX_ONLY);
7483
if (n_marked ==((Item_cond*)cond)->argument_list()->elements)
7484
cond->marker= ICP_COND_USES_INDEX_ONLY;
7485
new_cond->quick_fix_field();
7486
new_cond->top_level_item();
7491
if (!uses_index_fields_only(cond, table, keyno, other_tbls_ok))
7493
cond->marker= ICP_COND_USES_INDEX_ONLY;
7498
Item *make_cond_remainder(Item *cond, bool exclude_index)
7500
if (exclude_index && cond->marker == ICP_COND_USES_INDEX_ONLY)
7501
return 0; /* Already checked */
7503
if (cond->type() == Item::COND_ITEM)
7505
table_map tbl_map= 0;
7506
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
7508
/* Create new top level AND item */
7509
Item_cond_and *new_cond=new Item_cond_and;
7512
List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
7516
Item *fix= make_cond_remainder(item, exclude_index);
7519
new_cond->argument_list()->push_back(fix);
7520
tbl_map |= fix->used_tables();
7523
switch (new_cond->argument_list()->elements) {
7527
return new_cond->argument_list()->head();
7529
new_cond->quick_fix_field();
7530
((Item_cond*)new_cond)->used_tables_cache= tbl_map;
7536
Item_cond_or *new_cond=new Item_cond_or;
7539
List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
7543
Item *fix= make_cond_remainder(item, false);
7546
new_cond->argument_list()->push_back(fix);
7547
tbl_map |= fix->used_tables();
7549
new_cond->quick_fix_field();
7550
((Item_cond*)new_cond)->used_tables_cache= tbl_map;
7551
new_cond->top_level_item();
7560
Try to extract and push the index condition
7564
tab A join tab that has tab->table->file and its condition
7566
keyno Index for which extract and push the condition
7567
other_tbls_ok true <=> Fields of other non-const tables are allowed
7570
Try to extract and push the index condition down to table handler
7573
static void push_index_cond(JOIN_TAB *tab, uint keyno, bool other_tbls_ok)
7576
if (tab->table->file->index_flags(keyno, 0, 1) & HA_DO_INDEX_COND_PUSHDOWN &&
7577
tab->join->thd->variables.engine_condition_pushdown)
7579
idx_cond= make_cond_for_index(tab->select_cond, tab->table, keyno,
7584
tab->pre_idx_push_select_cond= tab->select_cond;
7585
Item *idx_remainder_cond=
7586
tab->table->file->idx_cond_push(keyno, idx_cond);
7589
Disable eq_ref's "lookup cache" if we've pushed down an index
7591
TODO: This check happens to work on current ICP implementations, but
7592
there may exist a compliant implementation that will not work
7593
correctly with it. Sort this out when we stabilize the condition
7596
if (idx_remainder_cond != idx_cond)
7597
tab->ref.disable_cache= true;
7599
Item *row_cond= make_cond_remainder(tab->select_cond, true);
7603
if (!idx_remainder_cond)
7604
tab->select_cond= row_cond;
7607
tab->select_cond= new Item_cond_and(row_cond, idx_remainder_cond);
7608
tab->select_cond->quick_fix_field();
7609
((Item_cond_and*)tab->select_cond)->used_tables_cache=
7610
row_cond->used_tables() | idx_remainder_cond->used_tables();
7614
tab->select_cond= idx_remainder_cond;
7617
tab->select->cond= tab->select_cond;
7627
Determine if the set is already ordered for ORDER BY, so it can
7628
disable join cache because it will change the ordering of the results.
7629
Code handles sort table that is at any location (not only first after
7630
the const tables) despite the fact that it's currently prohibited.
7631
We must disable join cache if the first non-const table alone is
7632
ordered. If there is a temp table the ordering is done as a last
7633
operation and doesn't prevent join cache usage.
7635
uint make_join_orderinfo(JOIN *join)
7639
return join->tables;
7641
for (i=join->const_tables ; i < join->tables ; i++)
7643
JOIN_TAB *tab=join->join_tab+i;
7644
TABLE *table=tab->table;
7645
if ((table == join->sort_by_table &&
7646
(!join->order || join->skip_sort_order)) ||
7647
(join->sort_by_table == (TABLE *) 1 && i != join->const_tables))
7657
Plan refinement stage: do various set ups for the executioner
7660
make_join_readinfo()
7661
join Join being processed
7662
options Join's options (checking for SELECT_DESCRIBE,
7663
SELECT_NO_JOIN_CACHE)
7664
no_jbuf_after Don't use join buffering after table with this number.
7667
Plan refinement stage: do various set ups for the executioner
7668
- set up use of join buffering
7669
- push index conditions
7670
- increment counters
7675
true - Out of memory
7679
make_join_readinfo(JOIN *join, uint64_t options, uint no_jbuf_after)
7682
bool statistics= test(!(join->select_options & SELECT_DESCRIBE));
7685
for (i=join->const_tables ; i < join->tables ; i++)
7687
JOIN_TAB *tab=join->join_tab+i;
7688
TABLE *table=tab->table;
7689
bool using_join_cache;
7690
tab->read_record.table= table;
7691
tab->read_record.file=table->file;
7692
tab->next_select=sub_select; /* normal select */
7694
TODO: don't always instruct first table's ref/range access method to
7695
produce sorted output.
7697
tab->sorted= sorted;
7698
sorted= 0; // only first must be sorted
7699
if (tab->insideout_match_tab)
7701
if (!(tab->insideout_buf= (uchar*)join->thd->alloc(tab->table->key_info
7706
switch (tab->type) {
7707
case JT_SYSTEM: // Only happens with left join
7708
table->status=STATUS_NO_RECORD;
7709
tab->read_first_record= join_read_system;
7710
tab->read_record.read_record= join_no_more_records;
7712
case JT_CONST: // Only happens with left join
7713
table->status=STATUS_NO_RECORD;
7714
tab->read_first_record= join_read_const;
7715
tab->read_record.read_record= join_no_more_records;
7716
if (table->covering_keys.is_set(tab->ref.key) &&
7720
table->file->extra(HA_EXTRA_KEYREAD);
7724
table->status=STATUS_NO_RECORD;
7727
delete tab->select->quick;
7728
tab->select->quick=0;
7732
tab->read_first_record= join_read_key;
7733
tab->read_record.read_record= join_no_more_records;
7734
if (table->covering_keys.is_set(tab->ref.key) &&
7738
table->file->extra(HA_EXTRA_KEYREAD);
7741
push_index_cond(tab, tab->ref.key, true);
7743
case JT_REF_OR_NULL:
7745
table->status=STATUS_NO_RECORD;
7748
delete tab->select->quick;
7749
tab->select->quick=0;
7753
if (table->covering_keys.is_set(tab->ref.key) &&
7757
table->file->extra(HA_EXTRA_KEYREAD);
7760
push_index_cond(tab, tab->ref.key, true);
7761
if (tab->type == JT_REF)
7763
tab->read_first_record= join_read_always_key;
7764
tab->read_record.read_record= tab->insideout_match_tab?
7765
join_read_next_same_diff : join_read_next_same;
7769
tab->read_first_record= join_read_always_key_or_null;
7770
tab->read_record.read_record= join_read_next_same_or_null;
7775
If previous table use cache
7776
If the incoming data set is already sorted don't use cache.
7778
table->status=STATUS_NO_RECORD;
7779
using_join_cache= false;
7780
if (i != join->const_tables && !(options & SELECT_NO_JOIN_CACHE) &&
7781
tab->use_quick != 2 && !tab->first_inner && i <= no_jbuf_after &&
7782
!tab->insideout_match_tab)
7784
if ((options & SELECT_DESCRIBE) ||
7785
!join_init_cache(join->thd,join->join_tab+join->const_tables,
7786
i-join->const_tables))
7788
using_join_cache= true;
7789
tab[-1].next_select=sub_select_cache; /* Patch previous */
7792
/* These init changes read_record */
7793
if (tab->use_quick == 2)
7795
join->thd->server_status|=SERVER_QUERY_NO_GOOD_INDEX_USED;
7796
tab->read_first_record= join_init_quick_read_record;
7798
status_var_increment(join->thd->status_var.select_range_check_count);
7802
tab->read_first_record= join_init_read_record;
7803
if (i == join->const_tables)
7805
if (tab->select && tab->select->quick)
7808
status_var_increment(join->thd->status_var.select_range_count);
7812
join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
7814
status_var_increment(join->thd->status_var.select_scan_count);
7819
if (tab->select && tab->select->quick)
7822
status_var_increment(join->thd->status_var.select_full_range_join_count);
7826
join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
7828
status_var_increment(join->thd->status_var.select_full_join_count);
7831
if (!table->no_keyread)
7833
if (tab->select && tab->select->quick &&
7834
tab->select->quick->index != MAX_KEY && //not index_merge
7835
table->covering_keys.is_set(tab->select->quick->index))
7838
table->file->extra(HA_EXTRA_KEYREAD);
7840
else if (!table->covering_keys.is_clear_all() &&
7841
!(tab->select && tab->select->quick))
7842
{ // Only read index tree
7843
if (!tab->insideout_match_tab)
7846
See bug #26447: "Using the clustered index for a table scan
7847
is always faster than using a secondary index".
7849
if (table->s->primary_key != MAX_KEY &&
7850
table->file->primary_key_is_clustered())
7851
tab->index= table->s->primary_key;
7853
tab->index=find_shortest_key(table, & table->covering_keys);
7855
tab->read_first_record= join_read_first;
7856
tab->type=JT_NEXT; // Read with index_first / index_next
7859
if (tab->select && tab->select->quick &&
7860
tab->select->quick->index != MAX_KEY && ! tab->table->key_read)
7861
push_index_cond(tab, tab->select->quick->index, !using_join_cache);
7865
break; /* purecov: deadcode */
7868
abort(); /* purecov: deadcode */
7871
join->join_tab[join->tables-1].next_select=0; /* Set by do_select */
7877
Give error if we some tables are done with a full join.
7879
This is used by multi_table_update and multi_table_delete when running
7882
@param join Join condition
7887
1 Error (full join used)
7890
bool error_if_full_join(JOIN *join)
7892
for (JOIN_TAB *tab=join->join_tab, *end=join->join_tab+join->tables;
7896
if (tab->type == JT_ALL && (!tab->select || !tab->select->quick))
7898
my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
7899
ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
7911
void JOIN_TAB::cleanup()
2515
9638
if (!(left_const && right_const) &&
2516
9639
args[0]->result_type() == args[1]->result_type())
2520
resolve_const_item(session, &args[1], args[0]);
2521
func->update_used_tables();
2522
change_cond_ref_to_const(session, save_list, and_father, and_father,
2525
else if (left_const)
2527
resolve_const_item(session, &args[0], args[1]);
2528
func->update_used_tables();
2529
change_cond_ref_to_const(session, save_list, and_father, and_father,
9643
resolve_const_item(thd, &args[1], args[0]);
9644
func->update_used_tables();
9645
change_cond_ref_to_const(thd, save_list, and_father, and_father,
9648
else if (left_const)
9650
resolve_const_item(thd, &args[0], args[1]);
9651
func->update_used_tables();
9652
change_cond_ref_to_const(thd, save_list, and_father, and_father,
9662
Simplify joins replacing outer joins by inner joins whenever it's
9665
The function, during a retrieval of join_list, eliminates those
9666
outer joins that can be converted into inner join, possibly nested.
9667
It also moves the on expressions for the converted outer joins
9668
and from inner joins to conds.
9669
The function also calculates some attributes for nested joins:
9673
- on_expr_dep_tables
9674
The first two attributes are used to test whether an outer join can
9675
be substituted for an inner join. The third attribute represents the
9676
relation 'to be dependent on' for tables. If table t2 is dependent
9677
on table t1, then in any evaluated execution plan table access to
9678
table t2 must precede access to table t2. This relation is used also
9679
to check whether the query contains invalid cross-references.
9680
The forth attribute is an auxiliary one and is used to calculate
9682
As the attribute dep_tables qualifies possibles orders of tables in the
9683
execution plan, the dependencies required by the straight join
9684
modifiers are reflected in this attribute as well.
9685
The function also removes all braces that can be removed from the join
9686
expression without changing its meaning.
9689
An outer join can be replaced by an inner join if the where condition
9690
or the on expression for an embedding nested join contains a conjunctive
9691
predicate rejecting null values for some attribute of the inner tables.
9695
SELECT * FROM t1 LEFT JOIN t2 ON t2.a=t1.a WHERE t2.b < 5
9697
the predicate t2.b < 5 rejects nulls.
9698
The query is converted first to:
9700
SELECT * FROM t1 INNER JOIN t2 ON t2.a=t1.a WHERE t2.b < 5
9702
then to the equivalent form:
9704
SELECT * FROM t1, t2 ON t2.a=t1.a WHERE t2.b < 5 AND t2.a=t1.a
9708
Similarly the following query:
9710
SELECT * from t1 LEFT JOIN (t2, t3) ON t2.a=t1.a t3.b=t1.b
9715
SELECT * FROM t1, (t2, t3) WHERE t2.c < 5 AND t2.a=t1.a t3.b=t1.b
9719
One conversion might trigger another:
9721
SELECT * FROM t1 LEFT JOIN t2 ON t2.a=t1.a
9722
LEFT JOIN t3 ON t3.b=t2.b
9723
WHERE t3 IS NOT NULL =>
9724
SELECT * FROM t1 LEFT JOIN t2 ON t2.a=t1.a, t3
9725
WHERE t3 IS NOT NULL AND t3.b=t2.b =>
9726
SELECT * FROM t1, t2, t3
9727
WHERE t3 IS NOT NULL AND t3.b=t2.b AND t2.a=t1.a
9730
The function removes all unnecessary braces from the expression
9731
produced by the conversions.
9734
SELECT * FROM t1, (t2, t3) WHERE t2.c < 5 AND t2.a=t1.a AND t3.b=t1.b
9736
finally is converted to:
9738
SELECT * FROM t1, t2, t3 WHERE t2.c < 5 AND t2.a=t1.a AND t3.b=t1.b
9743
It also will remove braces from the following queries:
9745
SELECT * from (t1 LEFT JOIN t2 ON t2.a=t1.a) LEFT JOIN t3 ON t3.b=t2.b
9746
SELECT * from (t1, (t2,t3)) WHERE t1.a=t2.a AND t2.b=t3.b.
9749
The benefit of this simplification procedure is that it might return
9750
a query for which the optimizer can evaluate execution plan with more
9751
join orders. With a left join operation the optimizer does not
9752
consider any plan where one of the inner tables is before some of outer
9756
The function is implemented by a recursive procedure. On the recursive
9757
ascent all attributes are calculated, all outer joins that can be
9758
converted are replaced and then all unnecessary braces are removed.
9759
As join list contains join tables in the reverse order sequential
9760
elimination of outer joins does not require extra recursive calls.
9763
Remove all semi-joins that have are within another semi-join (i.e. have
9764
an "ancestor" semi-join nest)
9767
Here is an example of a join query with invalid cross references:
9769
SELECT * FROM t1 LEFT JOIN t2 ON t2.a=t3.a LEFT JOIN t3 ON t3.b=t1.b
9772
@param join reference to the query info
9773
@param join_list list representation of the join to be converted
9774
@param conds conditions to add on expressions for converted joins
9775
@param top true <=> conds is the where condition
9778
- The new condition, if success
9783
simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top,
9787
NESTED_JOIN *nested_join;
9788
TABLE_LIST *prev_table= 0;
9789
List_iterator<TABLE_LIST> li(*join_list);
9792
Try to simplify join operations from join_list.
9793
The most outer join operation is checked for conversion first.
9795
while ((table= li++))
9797
table_map used_tables;
9798
table_map not_null_tables= (table_map) 0;
9800
if ((nested_join= table->nested_join))
9803
If the element of join_list is a nested join apply
9804
the procedure to its nested join list first.
9808
Item *expr= table->on_expr;
9810
If an on expression E is attached to the table,
9811
check all null rejected predicates in this expression.
9812
If such a predicate over an attribute belonging to
9813
an inner table of an embedded outer join is found,
9814
the outer join is converted to an inner join and
9815
the corresponding on expression is added to E.
9817
expr= simplify_joins(join, &nested_join->join_list,
9818
expr, false, in_sj || table->sj_on_expr);
9820
if (!table->prep_on_expr || expr != table->on_expr)
9824
table->on_expr= expr;
9825
table->prep_on_expr= expr->copy_andor_structure(join->thd);
9828
nested_join->used_tables= (table_map) 0;
9829
nested_join->not_null_tables=(table_map) 0;
9830
conds= simplify_joins(join, &nested_join->join_list, conds, top,
9831
in_sj || table->sj_on_expr);
9832
used_tables= nested_join->used_tables;
9833
not_null_tables= nested_join->not_null_tables;
9837
if (!table->prep_on_expr)
9838
table->prep_on_expr= table->on_expr;
9839
used_tables= table->table->map;
9841
not_null_tables= conds->not_null_tables();
9844
if (table->embedding)
9846
table->embedding->nested_join->used_tables|= used_tables;
9847
table->embedding->nested_join->not_null_tables|= not_null_tables;
9850
if (!table->outer_join || (used_tables & not_null_tables))
9853
For some of the inner tables there are conjunctive predicates
9854
that reject nulls => the outer join can be replaced by an inner join.
9856
table->outer_join= 0;
9859
/* Add ON expression to the WHERE or upper-level ON condition. */
9862
conds= and_conds(conds, table->on_expr);
9863
conds->top_level_item();
9864
/* conds is always a new item as both cond and on_expr existed */
9865
assert(!conds->fixed);
9866
conds->fix_fields(join->thd, &conds);
9869
conds= table->on_expr;
9870
table->prep_on_expr= table->on_expr= 0;
9878
Only inner tables of non-convertible outer joins
9879
remain with on_expr.
9883
table->dep_tables|= table->on_expr->used_tables();
9884
if (table->embedding)
9886
table->dep_tables&= ~table->embedding->nested_join->used_tables;
9888
Embedding table depends on tables used
9889
in embedded on expressions.
9891
table->embedding->on_expr_dep_tables|= table->on_expr->used_tables();
9894
table->dep_tables&= ~table->table->map;
9899
/* The order of tables is reverse: prev_table follows table */
9900
if (prev_table->straight)
9901
prev_table->dep_tables|= used_tables;
9902
if (prev_table->on_expr)
9904
prev_table->dep_tables|= table->on_expr_dep_tables;
9905
table_map prev_used_tables= prev_table->nested_join ?
9906
prev_table->nested_join->used_tables :
9907
prev_table->table->map;
9909
If on expression contains only references to inner tables
9910
we still make the inner tables dependent on the outer tables.
9911
It would be enough to set dependency only on one outer table
9912
for them. Yet this is really a rare case.
9914
if (!(prev_table->on_expr->used_tables() & ~prev_used_tables))
9915
prev_table->dep_tables|= used_tables;
9922
Flatten nested joins that can be flattened.
9923
no ON expression and not a semi-join => can be flattened.
9926
while ((table= li++))
9928
nested_join= table->nested_join;
9929
if (table->sj_on_expr && !in_sj)
9932
If this is a semi-join that is not contained within another semi-join,
9933
leave it intact (otherwise it is flattened)
9935
join->select_lex->sj_nests.push_back(table);
9937
else if (nested_join && !table->on_expr)
9940
List_iterator<TABLE_LIST> it(nested_join->join_list);
9943
tbl->embedding= table->embedding;
9944
tbl->join_list= table->join_list;
9946
li.replace(nested_join->join_list);
9954
Assign each nested join structure a bit in nested_join_map.
9956
Assign each nested join structure (except "confluent" ones - those that
9957
embed only one element) a bit in nested_join_map.
9959
@param join Join being processed
9960
@param join_list List of tables
9961
@param first_unused Number of first unused bit in nested_join_map before the
9965
This function is called after simplify_joins(), when there are no
9966
redundant nested joins, #non_confluent_nested_joins <= #tables_in_join so
9967
we will not run out of bits in nested_join_map.
9970
First unused bit in nested_join_map after the call.
9973
static uint build_bitmap_for_nested_joins(List<TABLE_LIST> *join_list,
9976
List_iterator<TABLE_LIST> li(*join_list);
9978
while ((table= li++))
9980
NESTED_JOIN *nested_join;
9981
if ((nested_join= table->nested_join))
9984
It is guaranteed by simplify_joins() function that a nested join
9985
that has only one child is either
9986
- a single-table view (the child is the underlying table), or
9987
- a single-table semi-join nest
9989
We don't assign bits to such sj-nests because
9990
1. it is redundant (a "sequence" of one table cannot be interleaved
9992
2. we could run out bits in nested_join_map otherwise.
9994
if (nested_join->join_list.elements != 1)
9996
/* Don't assign bits to sj-nests */
9998
nested_join->nj_map= (nested_join_map) 1 << first_unused++;
9999
first_unused= build_bitmap_for_nested_joins(&nested_join->join_list,
10004
return(first_unused);
10009
Set NESTED_JOIN::counter=0 in all nested joins in passed list.
10011
Recursively set NESTED_JOIN::counter=0 for all nested joins contained in
10012
the passed join_list.
10014
@param join_list List of nested joins to process. It may also contain base
10015
tables which will be ignored.
10018
static void reset_nj_counters(List<TABLE_LIST> *join_list)
10020
List_iterator<TABLE_LIST> li(*join_list);
10022
while ((table= li++))
10024
NESTED_JOIN *nested_join;
10025
if ((nested_join= table->nested_join))
10027
nested_join->counter_= 0;
10028
reset_nj_counters(&nested_join->join_list);
2538
10036
Check interleaving with an inner tables of an outer join for
2539
10037
extension table.
2541
Check if table next_tab can be added to current partial join order, and
10039
Check if table next_tab can be added to current partial join order, and
2542
10040
if yes, record that it has been added.
2544
10042
The function assumes that both current partial join order and its
2545
10043
extension with next_tab are valid wrt table dependencies.
2549
LIMITATIONS ON JOIN order_st
10047
LIMITATIONS ON JOIN ORDER
2550
10048
The nested [outer] joins executioner algorithm imposes these limitations
2551
10049
on join order:
2552
1. "Outer tables first" - any "outer" table must be before any
10050
1. "Outer tables first" - any "outer" table must be before any
2553
10051
corresponding "inner" table.
2554
10052
2. "No interleaving" - tables inside a nested join must form a continuous
2555
sequence in join order (i.e. the sequence must not be interrupted by
10053
sequence in join order (i.e. the sequence must not be interrupted by
2556
10054
tables that are outside of this nested join).
2558
10056
#1 is checked elsewhere, this function checks #2 provided that #1 has
2559
10057
been already checked.
2561
10059
WHY NEED NON-INTERLEAVING
2562
Consider an example:
10060
Consider an example:
2564
10062
select * from t0 join t1 left join (t2 join t3) on cond1
2947
10516
if (test_if_equality_guarantees_uniqueness (left_item, right_item))
2950
return right_item->eq(*const_item, 1);
2951
*const_item=right_item;
10519
return right_item->eq(*const_item, 1);
10520
*const_item=right_item;
2955
10524
else if (right_item->eq(comp_item,1))
2957
10526
if (test_if_equality_guarantees_uniqueness (right_item, left_item))
2960
return left_item->eq(*const_item, 1);
2961
*const_item=left_item;
10529
return left_item->eq(*const_item, 1);
10530
*const_item=left_item;
10538
/****************************************************************************
10539
Create internal temporary table
10540
****************************************************************************/
10543
Create field for temporary table from given field.
10545
@param thd Thread handler
10546
@param org_field field from which new field will be created
10547
@param name New field name
10548
@param table Temporary table
10549
@param item !=NULL if item->result_field should point to new field.
10550
This is relevant for how fill_record() is going to work:
10551
If item != NULL then fill_record() will update
10552
the record in the original table.
10553
If item == NULL then fill_record() will update
10554
the temporary table
10555
@param convert_blob_length If >0 create a varstring(convert_blob_length)
10556
field instead of blob.
10564
Field *create_tmp_field_from_field(THD *thd, Field *org_field,
10565
const char *name, TABLE *table,
10566
Item_field *item, uint convert_blob_length)
10571
Make sure that the blob fits into a Field_varstring which has
10574
if (convert_blob_length && convert_blob_length <= Field_varstring::MAX_SIZE &&
10575
(org_field->flags & BLOB_FLAG))
10576
new_field= new Field_varstring(convert_blob_length,
10577
org_field->maybe_null(),
10578
org_field->field_name, table->s,
10579
org_field->charset());
10581
new_field= org_field->new_field(thd->mem_root, table,
10582
table == org_field->table);
10585
new_field->init(table);
10586
new_field->orig_table= org_field->orig_table;
10588
item->result_field= new_field;
10590
new_field->field_name= name;
10591
new_field->flags|= (org_field->flags & NO_DEFAULT_VALUE_FLAG);
10592
if (org_field->maybe_null() || (item && item->maybe_null))
10593
new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join
10594
if (org_field->type() == MYSQL_TYPE_VAR_STRING ||
10595
org_field->type() == MYSQL_TYPE_VARCHAR)
10596
table->s->db_create_options|= HA_OPTION_PACK_RECORD;
10597
else if (org_field->type() == FIELD_TYPE_DOUBLE)
10598
((Field_double *) new_field)->not_fixed= true;
10604
Create field for temporary table using type of given item.
10606
@param thd Thread handler
10607
@param item Item to create a field for
10608
@param table Temporary table
10609
@param copy_func If set and item is a function, store copy of
10611
@param modify_item 1 if item->result_field should point to new
10612
item. This is relevent for how fill_record()
10614
If modify_item is 1 then fill_record() will
10615
update the record in the original table.
10616
If modify_item is 0 then fill_record() will
10617
update the temporary table
10618
@param convert_blob_length If >0 create a varstring(convert_blob_length)
10619
field instead of blob.
10627
static Field *create_tmp_field_from_item(THD *thd __attribute__((__unused__)),
10628
Item *item, TABLE *table,
10629
Item ***copy_func, bool modify_item,
10630
uint convert_blob_length)
10632
bool maybe_null= item->maybe_null;
10635
switch (item->result_type()) {
10637
new_field= new Field_double(item->max_length, maybe_null,
10638
item->name, item->decimals, true);
10642
Select an integer type with the minimal fit precision.
10643
MY_INT32_NUM_DECIMAL_DIGITS is sign inclusive, don't consider the sign.
10644
Values with MY_INT32_NUM_DECIMAL_DIGITS digits may or may not fit into
10645
Field_long : make them Field_int64_t.
10647
if (item->max_length >= (MY_INT32_NUM_DECIMAL_DIGITS - 1))
10648
new_field=new Field_int64_t(item->max_length, maybe_null,
10649
item->name, item->unsigned_flag);
10651
new_field=new Field_long(item->max_length, maybe_null,
10652
item->name, item->unsigned_flag);
10654
case STRING_RESULT:
10655
assert(item->collation.collation);
10657
enum enum_field_types type;
10659
DATE/TIME fields have STRING_RESULT result type.
10660
To preserve type they needed to be handled separately.
10662
if ((type= item->field_type()) == MYSQL_TYPE_DATETIME ||
10663
type == MYSQL_TYPE_TIME || type == MYSQL_TYPE_NEWDATE ||
10664
type == MYSQL_TYPE_TIMESTAMP)
10665
new_field= item->tmp_table_field_from_field_type(table, 1);
10667
Make sure that the blob fits into a Field_varstring which has
10670
else if (item->max_length/item->collation.collation->mbmaxlen > 255 &&
10671
convert_blob_length <= Field_varstring::MAX_SIZE &&
10672
convert_blob_length)
10673
new_field= new Field_varstring(convert_blob_length, maybe_null,
10674
item->name, table->s,
10675
item->collation.collation);
10677
new_field= item->make_string_field(table);
10678
new_field->set_derivation(item->collation.derivation);
10680
case DECIMAL_RESULT:
10682
uint8 dec= item->decimals;
10683
uint8 intg= ((Item_decimal *) item)->decimal_precision() - dec;
10684
uint32 len= item->max_length;
10687
Trying to put too many digits overall in a DECIMAL(prec,dec)
10688
will always throw a warning. We must limit dec to
10689
DECIMAL_MAX_SCALE however to prevent an assert() later.
10694
signed int overflow;
10696
dec= min(dec, DECIMAL_MAX_SCALE);
10699
If the value still overflows the field with the corrected dec,
10700
we'll throw out decimals rather than integers. This is still
10701
bad and of course throws a truncation warning.
10702
+1: for decimal point
10705
overflow= my_decimal_precision_to_length(intg + dec, dec,
10706
item->unsigned_flag) - len;
10709
dec= max(0, dec - overflow); // too long, discard fract
10711
len -= item->decimals - dec; // corrected value fits
10714
new_field= new Field_new_decimal(len, maybe_null, item->name,
10715
dec, item->unsigned_flag);
10720
// This case should never be choosen
10726
new_field->init(table);
10728
if (copy_func && item->is_result_field())
10729
*((*copy_func)++) = item; // Save for copy_funcs
10731
item->set_result_field(new_field);
10732
if (item->type() == Item::NULL_ITEM)
10733
new_field->is_created_from_null_item= true;
10739
Create field for information schema table.
10741
@param thd Thread handler
10742
@param table Temporary table
10743
@param item Item to create a field for
10751
Field *create_tmp_field_for_schema(THD *thd __attribute__((__unused__)),
10752
Item *item, TABLE *table)
10754
if (item->field_type() == MYSQL_TYPE_VARCHAR)
10757
if (item->max_length > MAX_FIELD_VARCHARLENGTH)
10758
field= new Field_blob(item->max_length, item->maybe_null,
10759
item->name, item->collation.collation);
10761
field= new Field_varstring(item->max_length, item->maybe_null,
10763
table->s, item->collation.collation);
10765
field->init(table);
10768
return item->tmp_table_field_from_field_type(table, 0);
10773
Create field for temporary table.
10775
@param thd Thread handler
10776
@param table Temporary table
10777
@param item Item to create a field for
10778
@param type Type of item (normally item->type)
10779
@param copy_func If set and item is a function, store copy of item
10781
@param from_field if field will be created using other field as example,
10782
pointer example field will be written here
10783
@param default_field If field has a default value field, store it here
10784
@param group 1 if we are going to do a relative group by on result
10785
@param modify_item 1 if item->result_field should point to new item.
10786
This is relevent for how fill_record() is going to
10788
If modify_item is 1 then fill_record() will update
10789
the record in the original table.
10790
If modify_item is 0 then fill_record() will update
10791
the temporary table
10792
@param convert_blob_length If >0 create a varstring(convert_blob_length)
10793
field instead of blob.
10801
Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
10802
Item ***copy_func, Field **from_field,
10803
Field **default_field,
10804
bool group, bool modify_item,
10805
bool table_cant_handle_bit_fields __attribute__((__unused__)),
10806
bool make_copy_field,
10807
uint convert_blob_length)
10810
Item::Type orig_type= type;
10811
Item *orig_item= 0;
10813
if (type != Item::FIELD_ITEM &&
10814
item->real_item()->type() == Item::FIELD_ITEM)
10817
item= item->real_item();
10818
type= Item::FIELD_ITEM;
10822
case Item::SUM_FUNC_ITEM:
10824
Item_sum *item_sum=(Item_sum*) item;
10825
result= item_sum->create_tmp_field(group, table, convert_blob_length);
10827
my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATALERROR));
10830
case Item::FIELD_ITEM:
10831
case Item::DEFAULT_VALUE_ITEM:
10833
Item_field *field= (Item_field*) item;
10834
bool orig_modify= modify_item;
10835
if (orig_type == Item::REF_ITEM)
10838
If item have to be able to store NULLs but underlaid field can't do it,
10839
create_tmp_field_from_field() can't be used for tmp field creation.
10841
if (field->maybe_null && !field->field->maybe_null())
10843
result= create_tmp_field_from_item(thd, item, table, NULL,
10844
modify_item, convert_blob_length);
10845
*from_field= field->field;
10846
if (result && modify_item)
10847
field->result_field= result;
10850
result= create_tmp_field_from_field(thd, (*from_field= field->field),
10851
orig_item ? orig_item->name :
10854
modify_item ? field :
10856
convert_blob_length);
10857
if (orig_type == Item::REF_ITEM && orig_modify)
10858
((Item_ref*)orig_item)->set_result_field(result);
10859
if (field->field->eq_def(result))
10860
*default_field= field->field;
10864
case Item::FUNC_ITEM:
10866
case Item::COND_ITEM:
10867
case Item::FIELD_AVG_ITEM:
10868
case Item::FIELD_STD_ITEM:
10869
case Item::SUBSELECT_ITEM:
10870
/* The following can only happen with 'CREATE TABLE ... SELECT' */
10871
case Item::PROC_ITEM:
10872
case Item::INT_ITEM:
10873
case Item::REAL_ITEM:
10874
case Item::DECIMAL_ITEM:
10875
case Item::STRING_ITEM:
10876
case Item::REF_ITEM:
10877
case Item::NULL_ITEM:
10878
case Item::VARBIN_ITEM:
10879
if (make_copy_field)
10881
assert(((Item_result_field*)item)->result_field);
10882
*from_field= ((Item_result_field*)item)->result_field;
10884
return create_tmp_field_from_item(thd, item, table,
10885
(make_copy_field ? 0 : copy_func),
10886
modify_item, convert_blob_length);
10887
case Item::TYPE_HOLDER:
10888
result= ((Item_type_holder *)item)->make_field_by_type(table);
10889
result->set_derivation(item->collation.derivation);
10891
default: // Dosen't have to be stored
10897
Set up column usage bitmaps for a temporary table
10900
For temporary tables, we need one bitmap with all columns set and
10901
a tmp_set bitmap to be used by things like filesort.
10904
void setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps)
10906
uint field_count= table->s->fields;
10907
bitmap_init(&table->def_read_set, (my_bitmap_map*) bitmaps, field_count,
10909
bitmap_init(&table->tmp_set,
10910
(my_bitmap_map*) (bitmaps+ bitmap_buffer_size(field_count)),
10911
field_count, false);
10912
/* write_set and all_set are copies of read_set */
10913
table->def_write_set= table->def_read_set;
10914
table->s->all_set= table->def_read_set;
10915
bitmap_set_all(&table->s->all_set);
10916
table->default_column_bitmaps();
10921
Create a temp table according to a field list.
10923
Given field pointers are changed to point at tmp_table for
10924
send_fields. The table object is self contained: it's
10925
allocated in its own memory root, as well as Field objects
10926
created for table columns.
10927
This function will replace Item_sum items in 'fields' list with
10928
corresponding Item_field items, pointing at the fields in the
10929
temporary table, unless this was prohibited by true
10930
value of argument save_sum_fields. The Item_field objects
10931
are created in THD memory root.
10933
@param thd thread handle
10934
@param param a description used as input to create the table
10935
@param fields list of items that will be used to define
10936
column types of the table (also see NOTES)
10937
@param group TODO document
10938
@param distinct should table rows be distinct
10939
@param save_sum_fields see NOTES
10940
@param select_options
10942
@param table_alias possible name of the temporary table that can
10943
be used for name resolving; can be "".
10946
#define STRING_TOTAL_LENGTH_TO_PACK_ROWS 128
10947
#define AVG_STRING_LENGTH_TO_PACK_ROWS 64
10948
#define RATIO_TO_PACK_ROWS 2
10949
#define MIN_STRING_LENGTH_TO_PACK_ROWS 10
10952
create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
10953
ORDER *group, bool distinct, bool save_sum_fields,
10954
uint64_t select_options, ha_rows rows_limit,
10957
MEM_ROOT *mem_root_save, own_root;
10959
TABLE_SHARE *share;
10960
uint i,field_count,null_count,null_pack_length;
10961
uint copy_func_count= param->func_count;
10962
uint hidden_null_count, hidden_null_pack_length, hidden_field_count;
10963
uint blob_count,group_null_items, string_count;
10964
uint temp_pool_slot=MY_BIT_NONE;
10966
ulong reclength, string_total_length;
10967
bool using_unique_constraint= 0;
10968
bool use_packed_rows= 0;
10969
bool not_all_columns= !(select_options & TMP_TABLE_ALL_COLUMNS);
10970
char *tmpname,path[FN_REFLEN];
10971
uchar *pos, *group_buff, *bitmaps;
10973
Field **reg_field, **from_field, **default_field;
10975
Copy_field *copy=0;
10977
KEY_PART_INFO *key_part_info;
10979
MI_COLUMNDEF *recinfo;
10980
uint total_uneven_bit_length= 0;
10981
bool force_copy_fields= param->force_copy_fields;
10983
status_var_increment(thd->status_var.created_tmp_tables);
10985
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
10986
temp_pool_slot = bitmap_lock_set_next(&temp_pool);
10988
if (temp_pool_slot != MY_BIT_NONE) // we got a slot
10989
sprintf(path, "%s_%lx_%i", tmp_file_prefix,
10990
current_pid, temp_pool_slot);
10993
/* if we run out of slots or we are not using tempool */
10994
sprintf(path,"%s%lx_%lx_%x", tmp_file_prefix,current_pid,
10995
thd->thread_id, thd->tmp_table++);
10999
No need to change table name to lower case as we are only creating
11000
MyISAM or HEAP tables here
11002
fn_format(path, path, mysql_tmpdir, "", MY_REPLACE_EXT|MY_UNPACK_FILENAME);
11007
if (!param->quick_group)
11008
group=0; // Can't use group key
11009
else for (ORDER *tmp=group ; tmp ; tmp=tmp->next)
11012
marker == 4 means two things:
11013
- store NULLs in the key, and
11014
- convert BIT fields to 64-bit long, needed because MEMORY tables
11015
can't index BIT fields.
11017
(*tmp->item)->marker= 4;
11018
if ((*tmp->item)->max_length >= CONVERT_IF_BIGGER_TO_BLOB)
11019
using_unique_constraint=1;
11021
if (param->group_length >= MAX_BLOB_WIDTH)
11022
using_unique_constraint=1;
11024
distinct=0; // Can't use distinct
11027
field_count=param->field_count+param->func_count+param->sum_func_count;
11028
hidden_field_count=param->hidden_field_count;
11031
When loose index scan is employed as access method, it already
11032
computes all groups and the result of all aggregate functions. We
11033
make space for the items of the aggregate function in the list of
11034
functions TMP_TABLE_PARAM::items_to_copy, so that the values of
11035
these items are stored in the temporary table.
11037
if (param->precomputed_group_by)
11038
copy_func_count+= param->sum_func_count;
11040
init_sql_alloc(&own_root, TABLE_ALLOC_BLOCK_SIZE, 0);
11042
if (!multi_alloc_root(&own_root,
11043
&table, sizeof(*table),
11044
&share, sizeof(*share),
11045
®_field, sizeof(Field*) * (field_count+1),
11046
&default_field, sizeof(Field*) * (field_count),
11047
&blob_field, sizeof(uint)*(field_count+1),
11048
&from_field, sizeof(Field*)*field_count,
11049
©_func, sizeof(*copy_func)*(copy_func_count+1),
11050
¶m->keyinfo, sizeof(*param->keyinfo),
11052
sizeof(*key_part_info)*(param->group_parts+1),
11053
¶m->start_recinfo,
11054
sizeof(*param->recinfo)*(field_count*2+4),
11055
&tmpname, (uint) strlen(path)+1,
11056
&group_buff, (group && ! using_unique_constraint ?
11057
param->group_length : 0),
11058
&bitmaps, bitmap_buffer_size(field_count)*2,
11061
if (temp_pool_slot != MY_BIT_NONE)
11062
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11063
return(NULL); /* purecov: inspected */
11065
/* Copy_field belongs to TMP_TABLE_PARAM, allocate it in THD mem_root */
11066
if (!(param->copy_field= copy= new (thd->mem_root) Copy_field[field_count]))
11068
if (temp_pool_slot != MY_BIT_NONE)
11069
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11070
free_root(&own_root, MYF(0)); /* purecov: inspected */
11071
return(NULL); /* purecov: inspected */
11073
param->items_to_copy= copy_func;
11074
strmov(tmpname,path);
11075
/* make table according to fields */
11077
bzero((char*) table,sizeof(*table));
11078
bzero((char*) reg_field,sizeof(Field*)*(field_count+1));
11079
bzero((char*) default_field, sizeof(Field*) * (field_count));
11080
bzero((char*) from_field,sizeof(Field*)*field_count);
11082
table->mem_root= own_root;
11083
mem_root_save= thd->mem_root;
11084
thd->mem_root= &table->mem_root;
11086
table->field=reg_field;
11087
table->alias= table_alias;
11088
table->reginfo.lock_type=TL_WRITE; /* Will be updated */
11089
table->db_stat=HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
11091
table->temp_pool_slot = temp_pool_slot;
11092
table->copy_blobs= 1;
11093
table->in_use= thd;
11094
table->quick_keys.init();
11095
table->covering_keys.init();
11096
table->keys_in_use_for_query.init();
11099
init_tmp_table_share(thd, share, "", 0, tmpname, tmpname);
11100
share->blob_field= blob_field;
11101
share->blob_ptr_size= portable_sizeof_char_ptr;
11102
share->db_low_byte_first=1; // True for HEAP and MyISAM
11103
share->table_charset= param->table_charset;
11104
share->primary_key= MAX_KEY; // Indicate no primary key
11105
share->keys_for_keyread.init();
11106
share->keys_in_use.init();
11108
/* Calculate which type of fields we will store in the temporary table */
11110
reclength= string_total_length= 0;
11111
blob_count= string_count= null_count= hidden_null_count= group_null_items= 0;
11112
param->using_indirect_summary_function=0;
11114
List_iterator_fast<Item> li(fields);
11116
Field **tmp_from_field=from_field;
11117
while ((item=li++))
11119
Item::Type type=item->type();
11120
if (not_all_columns)
11122
if (item->with_sum_func && type != Item::SUM_FUNC_ITEM)
11124
if (item->used_tables() & OUTER_REF_TABLE_BIT)
11125
item->update_used_tables();
11126
if (type == Item::SUBSELECT_ITEM ||
11127
(item->used_tables() & ~OUTER_REF_TABLE_BIT))
11130
Mark that the we have ignored an item that refers to a summary
11131
function. We need to know this if someone is going to use
11132
DISTINCT on the result.
11134
param->using_indirect_summary_function=1;
11138
if (item->const_item() && (int) hidden_field_count <= 0)
11139
continue; // We don't have to store this
11141
if (type == Item::SUM_FUNC_ITEM && !group && !save_sum_fields)
11142
{ /* Can't calc group yet */
11143
((Item_sum*) item)->result_field=0;
11144
for (i=0 ; i < ((Item_sum*) item)->arg_count ; i++)
11146
Item **argp= ((Item_sum*) item)->args + i;
11148
if (!arg->const_item())
11151
create_tmp_field(thd, table, arg, arg->type(), ©_func,
11152
tmp_from_field, &default_field[fieldnr],
11153
group != 0,not_all_columns,
11155
param->convert_blob_length);
11157
goto err; // Should be OOM
11159
reclength+=new_field->pack_length();
11160
if (new_field->flags & BLOB_FLAG)
11162
*blob_field++= fieldnr;
11165
*(reg_field++)= new_field;
11166
if (new_field->real_type() == MYSQL_TYPE_STRING ||
11167
new_field->real_type() == MYSQL_TYPE_VARCHAR)
11170
string_total_length+= new_field->pack_length();
11172
thd->mem_root= mem_root_save;
11173
thd->change_item_tree(argp, new Item_field(new_field));
11174
thd->mem_root= &table->mem_root;
11175
if (!(new_field->flags & NOT_NULL_FLAG))
11179
new_field->maybe_null() is still false, it will be
11180
changed below. But we have to setup Item_field correctly
11182
(*argp)->maybe_null=1;
11184
new_field->field_index= fieldnr++;
11191
The last parameter to create_tmp_field() is a bit tricky:
11193
We need to set it to 0 in union, to get fill_record() to modify the
11195
We need to set it to 1 on multi-table-update and in select to
11196
write rows to the temporary table.
11197
We here distinguish between UNION and multi-table-updates by the fact
11198
that in the later case group is set to the row pointer.
11200
Field *new_field= (param->schema_table) ?
11201
create_tmp_field_for_schema(thd, item, table) :
11202
create_tmp_field(thd, table, item, type, ©_func,
11203
tmp_from_field, &default_field[fieldnr],
11205
!force_copy_fields &&
11206
(not_all_columns || group !=0),
11208
If item->marker == 4 then we force create_tmp_field
11209
to create a 64-bit longs for BIT fields because HEAP
11210
tables can't index BIT fields directly. We do the same
11211
for distinct, as we want the distinct index to be
11212
usable in this case too.
11214
item->marker == 4 || param->bit_fields_as_long,
11216
param->convert_blob_length);
11220
if (thd->is_fatal_error)
11221
goto err; // Got OOM
11222
continue; // Some kindf of const item
11224
if (type == Item::SUM_FUNC_ITEM)
11225
((Item_sum *) item)->result_field= new_field;
11227
reclength+=new_field->pack_length();
11228
if (!(new_field->flags & NOT_NULL_FLAG))
11230
if (new_field->flags & BLOB_FLAG)
11232
*blob_field++= fieldnr;
11235
if (item->marker == 4 && item->maybe_null)
11237
group_null_items++;
11238
new_field->flags|= GROUP_FLAG;
11240
new_field->field_index= fieldnr++;
11241
*(reg_field++)= new_field;
11243
if (!--hidden_field_count)
11246
This was the last hidden field; Remember how many hidden fields could
11249
hidden_null_count=null_count;
11251
We need to update hidden_field_count as we may have stored group
11252
functions with constant arguments
11254
param->hidden_field_count= fieldnr;
11258
assert(fieldnr == (uint) (reg_field - table->field));
11259
assert(field_count >= (uint) (reg_field - table->field));
11260
field_count= fieldnr;
11262
*blob_field= 0; // End marker
11263
share->fields= field_count;
11265
/* If result table is small; use a heap */
11266
/* future: storage engine selection can be made dynamic? */
11267
if (blob_count || using_unique_constraint ||
11268
(select_options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
11269
OPTION_BIG_TABLES || (select_options & TMP_TABLE_FORCE_MYISAM))
11271
share->db_plugin= ha_lock_engine(0, myisam_hton);
11272
table->file= get_new_handler(share, &table->mem_root,
11275
(param->group_parts > table->file->max_key_parts() ||
11276
param->group_length > table->file->max_key_length()))
11277
using_unique_constraint=1;
11281
share->db_plugin= ha_lock_engine(0, heap_hton);
11282
table->file= get_new_handler(share, &table->mem_root,
11289
if (!using_unique_constraint)
11290
reclength+= group_null_items; // null flag is stored separately
11292
share->blob_fields= blob_count;
11293
if (blob_count == 0)
11295
/* We need to ensure that first byte is not 0 for the delete link */
11296
if (param->hidden_field_count)
11297
hidden_null_count++;
11301
hidden_null_pack_length=(hidden_null_count+7)/8;
11302
null_pack_length= (hidden_null_pack_length +
11303
(null_count + total_uneven_bit_length + 7) / 8);
11304
reclength+=null_pack_length;
11306
reclength=1; // Dummy select
11307
/* Use packed rows if there is blobs or a lot of space to gain */
11308
if (blob_count || ((string_total_length >= STRING_TOTAL_LENGTH_TO_PACK_ROWS) && (reclength / string_total_length <= RATIO_TO_PACK_ROWS || (string_total_length / string_count) >= AVG_STRING_LENGTH_TO_PACK_ROWS)))
11309
use_packed_rows= 1;
11311
share->reclength= reclength;
11313
uint alloc_length=ALIGN_SIZE(reclength+MI_UNIQUE_HASH_LENGTH+1);
11314
share->rec_buff_length= alloc_length;
11315
if (!(table->record[0]= (uchar*)
11316
alloc_root(&table->mem_root, alloc_length*3)))
11318
table->record[1]= table->record[0]+alloc_length;
11319
share->default_values= table->record[1]+alloc_length;
11321
copy_func[0]=0; // End marker
11322
param->func_count= copy_func - param->items_to_copy;
11324
setup_tmp_table_column_bitmaps(table, bitmaps);
11326
recinfo=param->start_recinfo;
11327
null_flags=(uchar*) table->record[0];
11328
pos=table->record[0]+ null_pack_length;
11329
if (null_pack_length)
11331
bzero((uchar*) recinfo,sizeof(*recinfo));
11332
recinfo->type=FIELD_NORMAL;
11333
recinfo->length=null_pack_length;
11335
bfill(null_flags,null_pack_length,255); // Set null fields
11337
table->null_flags= (uchar*) table->record[0];
11338
share->null_fields= null_count+ hidden_null_count;
11339
share->null_bytes= null_pack_length;
11341
null_count= (blob_count == 0) ? 1 : 0;
11342
hidden_field_count=param->hidden_field_count;
11343
for (i=0,reg_field=table->field; i < field_count; i++,reg_field++,recinfo++)
11345
Field *field= *reg_field;
11347
bzero((uchar*) recinfo,sizeof(*recinfo));
11349
if (!(field->flags & NOT_NULL_FLAG))
11351
if (field->flags & GROUP_FLAG && !using_unique_constraint)
11354
We have to reserve one byte here for NULL bits,
11355
as this is updated by 'end_update()'
11357
*pos++=0; // Null is stored here
11359
recinfo->type=FIELD_NORMAL;
11361
bzero((uchar*) recinfo,sizeof(*recinfo));
11365
recinfo->null_bit= 1 << (null_count & 7);
11366
recinfo->null_pos= null_count/8;
11368
field->move_field(pos,null_flags+null_count/8,
11369
1 << (null_count & 7));
11373
field->move_field(pos,(uchar*) 0,0);
11377
Test if there is a default field value. The test for ->ptr is to skip
11378
'offset' fields generated by initalize_tables
11380
if (default_field[i] && default_field[i]->ptr)
11383
default_field[i] is set only in the cases when 'field' can
11384
inherit the default value that is defined for the field referred
11385
by the Item_field object from which 'field' has been created.
11388
Field *orig_field= default_field[i];
11389
/* Get the value from default_values */
11390
diff= (my_ptrdiff_t) (orig_field->table->s->default_values-
11391
orig_field->table->record[0]);
11392
orig_field->move_field_offset(diff); // Points now at default_values
11393
if (orig_field->is_real_null())
11397
field->set_notnull();
11398
memcpy(field->ptr, orig_field->ptr, field->pack_length());
11400
orig_field->move_field_offset(-diff); // Back to record[0]
11404
{ /* Not a table Item */
11405
copy->set(field,from_field[i],save_sum_fields);
11408
length=field->pack_length();
11411
/* Make entry for create table */
11412
recinfo->length=length;
11413
if (field->flags & BLOB_FLAG)
11414
recinfo->type= (int) FIELD_BLOB;
11415
else if (use_packed_rows &&
11416
field->real_type() == MYSQL_TYPE_STRING &&
11417
length >= MIN_STRING_LENGTH_TO_PACK_ROWS)
11418
recinfo->type=FIELD_SKIP_ENDSPACE;
11420
recinfo->type=FIELD_NORMAL;
11421
if (!--hidden_field_count)
11422
null_count=(null_count+7) & ~7; // move to next byte
11424
// fix table name in field entry
11425
field->table_name= &table->alias;
11428
param->copy_field_end=copy;
11429
param->recinfo=recinfo;
11430
store_record(table,s->default_values); // Make empty default record
11432
if (thd->variables.tmp_table_size == ~ (uint64_t) 0) // No limit
11433
share->max_rows= ~(ha_rows) 0;
11435
share->max_rows= (ha_rows) (((share->db_type() == heap_hton) ?
11436
min(thd->variables.tmp_table_size,
11437
thd->variables.max_heap_table_size) :
11438
thd->variables.tmp_table_size) /
11440
set_if_bigger(share->max_rows,1); // For dummy start options
11442
Push the LIMIT clause to the temporary table creation, so that we
11443
materialize only up to 'rows_limit' records instead of all result records.
11445
set_if_smaller(share->max_rows, rows_limit);
11446
param->end_write_records= rows_limit;
11448
keyinfo= param->keyinfo;
11452
table->group=group; /* Table is grouped by key */
11453
param->group_buff=group_buff;
11455
share->uniques= test(using_unique_constraint);
11456
table->key_info=keyinfo;
11457
keyinfo->key_part=key_part_info;
11458
keyinfo->flags=HA_NOSAME;
11459
keyinfo->usable_key_parts=keyinfo->key_parts= param->group_parts;
11460
keyinfo->key_length=0;
11461
keyinfo->rec_per_key=0;
11462
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
11463
keyinfo->name= (char*) "group_key";
11464
ORDER *cur_group= group;
11465
for (; cur_group ; cur_group= cur_group->next, key_part_info++)
11467
Field *field=(*cur_group->item)->get_tmp_table_field();
11468
bool maybe_null=(*cur_group->item)->maybe_null;
11469
key_part_info->null_bit=0;
11470
key_part_info->field= field;
11471
key_part_info->offset= field->offset(table->record[0]);
11472
key_part_info->length= (uint16) field->key_length();
11473
key_part_info->type= (uint8) field->key_type();
11474
key_part_info->key_type =
11475
((ha_base_keytype) key_part_info->type == HA_KEYTYPE_TEXT ||
11476
(ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT1 ||
11477
(ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT2) ?
11478
0 : FIELDFLAG_BINARY;
11479
if (!using_unique_constraint)
11481
cur_group->buff=(char*) group_buff;
11482
if (!(cur_group->field= field->new_key_field(thd->mem_root,table,
11487
goto err; /* purecov: inspected */
11491
To be able to group on NULL, we reserved place in group_buff
11492
for the NULL flag just before the column. (see above).
11493
The field data is after this flag.
11494
The NULL flag is updated in 'end_update()' and 'end_write()'
11496
keyinfo->flags|= HA_NULL_ARE_EQUAL; // def. that NULL == NULL
11497
key_part_info->null_bit=field->null_bit;
11498
key_part_info->null_offset= (uint) (field->null_ptr -
11499
(uchar*) table->record[0]);
11500
cur_group->buff++; // Pointer to field data
11501
group_buff++; // Skipp null flag
11503
/* In GROUP BY 'a' and 'a ' are equal for VARCHAR fields */
11504
key_part_info->key_part_flag|= HA_END_SPACE_ARE_EQUAL;
11505
group_buff+= cur_group->field->pack_length();
11507
keyinfo->key_length+= key_part_info->length;
11511
if (distinct && field_count != param->hidden_field_count)
11514
Create an unique key or an unique constraint over all columns
11515
that should be in the result. In the temporary table, there are
11516
'param->hidden_field_count' extra columns, whose null bits are stored
11517
in the first 'hidden_null_pack_length' bytes of the row.
11522
Special mode for index creation in MyISAM used to support unique
11523
indexes on blobs with arbitrary length. Such indexes cannot be
11528
null_pack_length-=hidden_null_pack_length;
11529
keyinfo->key_parts= ((field_count-param->hidden_field_count)+
11530
(share->uniques ? test(null_pack_length) : 0));
11531
table->distinct= 1;
11533
if (!(key_part_info= (KEY_PART_INFO*)
11534
alloc_root(&table->mem_root,
11535
keyinfo->key_parts * sizeof(KEY_PART_INFO))))
11537
bzero((void*) key_part_info, keyinfo->key_parts * sizeof(KEY_PART_INFO));
11538
table->key_info=keyinfo;
11539
keyinfo->key_part=key_part_info;
11540
keyinfo->flags=HA_NOSAME | HA_NULL_ARE_EQUAL;
11541
keyinfo->key_length=(uint16) reclength;
11542
keyinfo->name= (char*) "distinct_key";
11543
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
11544
keyinfo->rec_per_key=0;
11547
Create an extra field to hold NULL bits so that unique indexes on
11548
blobs can distinguish NULL from 0. This extra field is not needed
11549
when we do not use UNIQUE indexes for blobs.
11551
if (null_pack_length && share->uniques)
11553
key_part_info->null_bit=0;
11554
key_part_info->offset=hidden_null_pack_length;
11555
key_part_info->length=null_pack_length;
11556
key_part_info->field= new Field_string(table->record[0],
11557
(uint32) key_part_info->length,
11561
NullS, &my_charset_bin);
11562
if (!key_part_info->field)
11564
key_part_info->field->init(table);
11565
key_part_info->key_type=FIELDFLAG_BINARY;
11566
key_part_info->type= HA_KEYTYPE_BINARY;
11569
/* Create a distinct key over the columns we are going to return */
11570
for (i=param->hidden_field_count, reg_field=table->field + i ;
11572
i++, reg_field++, key_part_info++)
11574
key_part_info->null_bit=0;
11575
key_part_info->field= *reg_field;
11576
key_part_info->offset= (*reg_field)->offset(table->record[0]);
11577
key_part_info->length= (uint16) (*reg_field)->pack_length();
11579
The below method of computing the key format length of the
11580
key part is a copy/paste from opt_range.cc, and table.cc.
11581
This should be factored out, e.g. as a method of Field.
11582
In addition it is not clear if any of the Field::*_length
11583
methods is supposed to compute the same length. If so, it
11586
key_part_info->store_length= key_part_info->length;
11588
if ((*reg_field)->real_maybe_null())
11589
key_part_info->store_length+= HA_KEY_NULL_LENGTH;
11590
if ((*reg_field)->type() == MYSQL_TYPE_BLOB ||
11591
(*reg_field)->real_type() == MYSQL_TYPE_VARCHAR)
11592
key_part_info->store_length+= HA_KEY_BLOB_LENGTH;
11594
key_part_info->type= (uint8) (*reg_field)->key_type();
11595
key_part_info->key_type =
11596
((ha_base_keytype) key_part_info->type == HA_KEYTYPE_TEXT ||
11597
(ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT1 ||
11598
(ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT2) ?
11599
0 : FIELDFLAG_BINARY;
11603
if (thd->is_fatal_error) // If end of memory
11604
goto err; /* purecov: inspected */
11605
share->db_record_offset= 1;
11606
if (share->db_type() == myisam_hton)
11608
if (create_myisam_tmp_table(table, param->keyinfo, param->start_recinfo,
11609
¶m->recinfo, select_options))
11612
if (open_tmp_table(table))
11615
thd->mem_root= mem_root_save;
11620
thd->mem_root= mem_root_save;
11621
free_tmp_table(thd,table); /* purecov: inspected */
11622
if (temp_pool_slot != MY_BIT_NONE)
11623
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11624
return(NULL); /* purecov: inspected */
11631
Create a temporary table to weed out duplicate rowid combinations
11635
create_duplicate_weedout_tmp_table()
11637
uniq_tuple_length_arg
11641
Create a temporary table to weed out duplicate rowid combinations. The
11642
table has a single column that is a concatenation of all rowids in the
11645
Depending on the needed length, there are two cases:
11647
1. When the length of the column < max_key_length:
11649
CREATE TABLE tmp (col VARBINARY(n) NOT NULL, UNIQUE KEY(col));
11651
2. Otherwise (not a valid SQL syntax but internally supported):
11653
CREATE TABLE tmp (col VARBINARY NOT NULL, UNIQUE CONSTRAINT(col));
11655
The code in this function was produced by extraction of relevant parts
11656
from create_tmp_table().
11663
TABLE *create_duplicate_weedout_tmp_table(THD *thd,
11664
uint uniq_tuple_length_arg,
11665
SJ_TMP_TABLE *sjtbl)
11667
MEM_ROOT *mem_root_save, own_root;
11669
TABLE_SHARE *share;
11670
uint temp_pool_slot=MY_BIT_NONE;
11671
char *tmpname,path[FN_REFLEN];
11673
KEY_PART_INFO *key_part_info;
11678
MI_COLUMNDEF *recinfo, *start_recinfo;
11679
bool using_unique_constraint=false;
11680
bool use_packed_rows= false;
11681
Field *field, *key_field;
11682
uint blob_count, null_pack_length, null_count;
11687
STEP 1: Get temporary table name
11689
statistic_increment(thd->status_var.created_tmp_tables, &LOCK_status);
11690
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
11691
temp_pool_slot = bitmap_lock_set_next(&temp_pool);
11693
if (temp_pool_slot != MY_BIT_NONE) // we got a slot
11694
sprintf(path, "%s_%lx_%i", tmp_file_prefix,
11695
current_pid, temp_pool_slot);
11698
/* if we run out of slots or we are not using tempool */
11699
sprintf(path,"%s%lx_%lx_%x", tmp_file_prefix,current_pid,
11700
thd->thread_id, thd->tmp_table++);
11702
fn_format(path, path, mysql_tmpdir, "", MY_REPLACE_EXT|MY_UNPACK_FILENAME);
11704
/* STEP 2: Figure if we'll be using a key or blob+constraint */
11705
if (uniq_tuple_length_arg >= CONVERT_IF_BIGGER_TO_BLOB)
11706
using_unique_constraint= true;
11708
/* STEP 3: Allocate memory for temptable description */
11709
init_sql_alloc(&own_root, TABLE_ALLOC_BLOCK_SIZE, 0);
11710
if (!multi_alloc_root(&own_root,
11711
&table, sizeof(*table),
11712
&share, sizeof(*share),
11713
®_field, sizeof(Field*) * (1+1),
11714
&blob_field, sizeof(uint)*2,
11715
&keyinfo, sizeof(*keyinfo),
11716
&key_part_info, sizeof(*key_part_info) * 2,
11718
sizeof(*recinfo)*(1*2+4),
11719
&tmpname, (uint) strlen(path)+1,
11720
&group_buff, (!using_unique_constraint ?
11721
uniq_tuple_length_arg : 0),
11722
&bitmaps, bitmap_buffer_size(1)*2,
11725
if (temp_pool_slot != MY_BIT_NONE)
11726
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11729
strmov(tmpname,path);
11732
/* STEP 4: Create TABLE description */
11733
bzero((char*) table,sizeof(*table));
11734
bzero((char*) reg_field,sizeof(Field*)*2);
11736
table->mem_root= own_root;
11737
mem_root_save= thd->mem_root;
11738
thd->mem_root= &table->mem_root;
11740
table->field=reg_field;
11741
table->alias= "weedout-tmp";
11742
table->reginfo.lock_type=TL_WRITE; /* Will be updated */
11743
table->db_stat=HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
11745
table->temp_pool_slot = temp_pool_slot;
11746
table->copy_blobs= 1;
11747
table->in_use= thd;
11748
table->quick_keys.init();
11749
table->covering_keys.init();
11750
table->keys_in_use_for_query.init();
11753
init_tmp_table_share(thd, share, "", 0, tmpname, tmpname);
11754
share->blob_field= blob_field;
11755
share->blob_ptr_size= portable_sizeof_char_ptr;
11756
share->db_low_byte_first=1; // True for HEAP and MyISAM
11757
share->table_charset= NULL;
11758
share->primary_key= MAX_KEY; // Indicate no primary key
11759
share->keys_for_keyread.init();
11760
share->keys_in_use.init();
11764
/* Create the field */
11767
For the sake of uniformity, always use Field_varstring (altough we could
11768
use Field_string for shorter keys)
11770
field= new Field_varstring(uniq_tuple_length_arg, false, "rowids", share,
11774
field->table= table;
11775
field->key_start.init(0);
11776
field->part_of_key.init(0);
11777
field->part_of_sortkey.init(0);
11778
field->unireg_check= Field::NONE;
11779
field->flags= (NOT_NULL_FLAG | BINARY_FLAG | NO_DEFAULT_VALUE_FLAG);
11780
field->reset_fields();
11781
field->init(table);
11782
field->orig_table= NULL;
11784
field->field_index= 0;
11786
*(reg_field++)= field;
11791
share->blob_fields= 0;
11794
uint reclength= field->pack_length();
11795
if (using_unique_constraint)
11797
share->db_plugin= ha_lock_engine(0, myisam_hton);
11798
table->file= get_new_handler(share, &table->mem_root,
11800
assert(uniq_tuple_length_arg <= table->file->max_key_length());
11804
share->db_plugin= ha_lock_engine(0, heap_hton);
11805
table->file= get_new_handler(share, &table->mem_root,
11813
null_pack_length= 1;
11814
reclength += null_pack_length;
11816
share->reclength= reclength;
11818
uint alloc_length=ALIGN_SIZE(share->reclength + MI_UNIQUE_HASH_LENGTH+1);
11819
share->rec_buff_length= alloc_length;
11820
if (!(table->record[0]= (uchar*)
11821
alloc_root(&table->mem_root, alloc_length*3)))
11823
table->record[1]= table->record[0]+alloc_length;
11824
share->default_values= table->record[1]+alloc_length;
11826
setup_tmp_table_column_bitmaps(table, bitmaps);
11828
recinfo= start_recinfo;
11829
null_flags=(uchar*) table->record[0];
11830
pos=table->record[0]+ null_pack_length;
11831
if (null_pack_length)
11833
bzero((uchar*) recinfo,sizeof(*recinfo));
11834
recinfo->type=FIELD_NORMAL;
11835
recinfo->length=null_pack_length;
11837
bfill(null_flags,null_pack_length,255); // Set null fields
11839
table->null_flags= (uchar*) table->record[0];
11840
share->null_fields= null_count;
11841
share->null_bytes= null_pack_length;
11846
//Field *field= *reg_field;
11848
bzero((uchar*) recinfo,sizeof(*recinfo));
11849
field->move_field(pos,(uchar*) 0,0);
11853
Test if there is a default field value. The test for ->ptr is to skip
11854
'offset' fields generated by initalize_tables
11856
// Initialize the table field:
11857
bzero(field->ptr, field->pack_length());
11859
length=field->pack_length();
11862
/* Make entry for create table */
11863
recinfo->length=length;
11864
if (field->flags & BLOB_FLAG)
11865
recinfo->type= (int) FIELD_BLOB;
11866
else if (use_packed_rows &&
11867
field->real_type() == MYSQL_TYPE_STRING &&
11868
length >= MIN_STRING_LENGTH_TO_PACK_ROWS)
11869
recinfo->type=FIELD_SKIP_ENDSPACE;
11871
recinfo->type=FIELD_NORMAL;
11873
field->table_name= &table->alias;
11876
//param->recinfo=recinfo;
11877
//store_record(table,s->default_values); // Make empty default record
11879
if (thd->variables.tmp_table_size == ~ (uint64_t) 0) // No limit
11880
share->max_rows= ~(ha_rows) 0;
11882
share->max_rows= (ha_rows) (((share->db_type() == heap_hton) ?
11883
min(thd->variables.tmp_table_size,
11884
thd->variables.max_heap_table_size) :
11885
thd->variables.tmp_table_size) /
11887
set_if_bigger(share->max_rows,1); // For dummy start options
11890
//// keyinfo= param->keyinfo;
11894
share->uniques= test(using_unique_constraint);
11895
table->key_info=keyinfo;
11896
keyinfo->key_part=key_part_info;
11897
keyinfo->flags=HA_NOSAME;
11898
keyinfo->usable_key_parts= keyinfo->key_parts= 1;
11899
keyinfo->key_length=0;
11900
keyinfo->rec_per_key=0;
11901
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
11902
keyinfo->name= (char*) "weedout_key";
11904
key_part_info->null_bit=0;
11905
key_part_info->field= field;
11906
key_part_info->offset= field->offset(table->record[0]);
11907
key_part_info->length= (uint16) field->key_length();
11908
key_part_info->type= (uint8) field->key_type();
11909
key_part_info->key_type = FIELDFLAG_BINARY;
11910
if (!using_unique_constraint)
11912
if (!(key_field= field->new_key_field(thd->mem_root, table,
11917
key_part_info->key_part_flag|= HA_END_SPACE_ARE_EQUAL; //todo need this?
11919
keyinfo->key_length+= key_part_info->length;
11923
if (thd->is_fatal_error) // If end of memory
11925
share->db_record_offset= 1;
11926
if (share->db_type() == myisam_hton)
11929
if (create_myisam_tmp_table(table, keyinfo, start_recinfo, &recinfo, 0))
11932
sjtbl->start_recinfo= start_recinfo;
11933
sjtbl->recinfo= recinfo;
11934
if (open_tmp_table(table))
11937
thd->mem_root= mem_root_save;
11941
thd->mem_root= mem_root_save;
11942
free_tmp_table(thd,table); /* purecov: inspected */
11943
if (temp_pool_slot != MY_BIT_NONE)
11944
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11945
return(NULL); /* purecov: inspected */
11948
/****************************************************************************/
11951
Create a reduced TABLE object with properly set up Field list from a
11952
list of field definitions.
11954
The created table doesn't have a table handler associated with
11955
it, has no keys, no group/distinct, no copy_funcs array.
11956
The sole purpose of this TABLE object is to use the power of Field
11957
class to read/write data to/from table->record[0]. Then one can store
11958
the record in any container (RB tree, hash, etc).
11959
The table is created in THD mem_root, so are the table's fields.
11960
Consequently, if you don't BLOB fields, you don't need to free it.
11962
@param thd connection handle
11963
@param field_list list of column definitions
11966
0 if out of memory, TABLE object in case of success
11969
TABLE *create_virtual_tmp_table(THD *thd, List<Create_field> &field_list)
11971
uint field_count= field_list.elements;
11972
uint blob_count= 0;
11974
Create_field *cdef; /* column definition */
11975
uint record_length= 0;
11976
uint null_count= 0; /* number of columns which may be null */
11977
uint null_pack_length; /* NULL representation array length */
11981
TABLE_SHARE *share;
11983
if (!multi_alloc_root(thd->mem_root,
11984
&table, sizeof(*table),
11985
&share, sizeof(*share),
11986
&field, (field_count + 1) * sizeof(Field*),
11987
&blob_field, (field_count+1) *sizeof(uint),
11988
&bitmaps, bitmap_buffer_size(field_count)*2,
11992
bzero(table, sizeof(*table));
11993
bzero(share, sizeof(*share));
11994
table->field= field;
11996
share->blob_field= blob_field;
11997
share->fields= field_count;
11998
share->blob_ptr_size= portable_sizeof_char_ptr;
11999
setup_tmp_table_column_bitmaps(table, bitmaps);
12001
/* Create all fields and calculate the total length of record */
12002
List_iterator_fast<Create_field> it(field_list);
12003
while ((cdef= it++))
12005
*field= make_field(share, 0, cdef->length,
12006
(uchar*) (f_maybe_null(cdef->pack_flag) ? "" : 0),
12007
f_maybe_null(cdef->pack_flag) ? 1 : 0,
12008
cdef->pack_flag, cdef->sql_type, cdef->charset,
12009
cdef->unireg_check,
12010
cdef->interval, cdef->field_name);
12013
(*field)->init(table);
12014
record_length+= (*field)->pack_length();
12015
if (! ((*field)->flags & NOT_NULL_FLAG))
12018
if ((*field)->flags & BLOB_FLAG)
12019
share->blob_field[blob_count++]= (uint) (field - table->field);
12023
*field= NULL; /* mark the end of the list */
12024
share->blob_field[blob_count]= 0; /* mark the end of the list */
12025
share->blob_fields= blob_count;
12027
null_pack_length= (null_count + 7)/8;
12028
share->reclength= record_length + null_pack_length;
12029
share->rec_buff_length= ALIGN_SIZE(share->reclength + 1);
12030
table->record[0]= (uchar*) thd->alloc(share->rec_buff_length);
12031
if (!table->record[0])
12034
if (null_pack_length)
12036
table->null_flags= (uchar*) table->record[0];
12037
share->null_fields= null_count;
12038
share->null_bytes= null_pack_length;
12041
table->in_use= thd; /* field->reset() may access table->in_use */
12043
/* Set up field pointers */
12044
uchar *null_pos= table->record[0];
12045
uchar *field_pos= null_pos + share->null_bytes;
12048
for (field= table->field; *field; ++field)
12050
Field *cur_field= *field;
12051
if ((cur_field->flags & NOT_NULL_FLAG))
12052
cur_field->move_field(field_pos);
12055
cur_field->move_field(field_pos, (uchar*) null_pos, null_bit);
12057
if (null_bit == (1 << 8))
12063
cur_field->reset();
12065
field_pos+= cur_field->pack_length();
12070
for (field= table->field; *field; ++field)
12071
delete *field; /* just invokes field destructor */
12076
static bool open_tmp_table(TABLE *table)
12079
if ((error=table->file->ha_open(table, table->s->table_name.str,O_RDWR,
12080
HA_OPEN_TMP_TABLE | HA_OPEN_INTERNAL_TABLE)))
12082
table->file->print_error(error,MYF(0)); /* purecov: inspected */
12086
(void) table->file->extra(HA_EXTRA_QUICK); /* Faster */
12092
Create MyISAM temporary table
12095
create_myisam_tmp_table()
12096
table Table object that descrimes the table to be created
12097
keyinfo Description of the index (there is always one index)
12098
start_recinfo MyISAM's column descriptions
12099
recinfo INOUT End of MyISAM's column descriptions
12100
options Option bits
12103
Create a MyISAM temporary table according to passed description. The is
12104
assumed to have one unique index or constraint.
12106
The passed array or MI_COLUMNDEF structures must have this form:
12108
1. 1-byte column (afaiu for 'deleted' flag) (note maybe not 1-byte
12109
when there are many nullable columns)
12111
3. One free MI_COLUMNDEF element (*recinfo points here)
12113
This function may use the free element to create hash column for unique
12121
static bool create_myisam_tmp_table(TABLE *table, KEY *keyinfo,
12122
MI_COLUMNDEF *start_recinfo,
12123
MI_COLUMNDEF **recinfo,
12128
MI_UNIQUEDEF uniquedef;
12129
TABLE_SHARE *share= table->s;
12132
{ // Get keys for ni_create
12133
bool using_unique_constraint=0;
12134
HA_KEYSEG *seg= (HA_KEYSEG*) alloc_root(&table->mem_root,
12135
sizeof(*seg) * keyinfo->key_parts);
12139
bzero(seg, sizeof(*seg) * keyinfo->key_parts);
12140
if (keyinfo->key_length >= table->file->max_key_length() ||
12141
keyinfo->key_parts > table->file->max_key_parts() ||
12144
/* Can't create a key; Make a unique constraint instead of a key */
12147
using_unique_constraint=1;
12148
bzero((char*) &uniquedef,sizeof(uniquedef));
12149
uniquedef.keysegs=keyinfo->key_parts;
12151
uniquedef.null_are_equal=1;
12153
/* Create extra column for hash value */
12154
bzero((uchar*) *recinfo,sizeof(**recinfo));
12155
(*recinfo)->type= FIELD_CHECK;
12156
(*recinfo)->length=MI_UNIQUE_HASH_LENGTH;
12158
share->reclength+=MI_UNIQUE_HASH_LENGTH;
12162
/* Create an unique key */
12163
bzero((char*) &keydef,sizeof(keydef));
12164
keydef.flag=HA_NOSAME | HA_BINARY_PACK_KEY | HA_PACK_KEY;
12165
keydef.keysegs= keyinfo->key_parts;
12168
for (uint i=0; i < keyinfo->key_parts ; i++,seg++)
12170
Field *field=keyinfo->key_part[i].field;
12172
seg->language= field->charset()->number;
12173
seg->length= keyinfo->key_part[i].length;
12174
seg->start= keyinfo->key_part[i].offset;
12175
if (field->flags & BLOB_FLAG)
12178
((keyinfo->key_part[i].key_type & FIELDFLAG_BINARY) ?
12179
HA_KEYTYPE_VARBINARY2 : HA_KEYTYPE_VARTEXT2);
12180
seg->bit_start= (uint8)(field->pack_length() - share->blob_ptr_size);
12181
seg->flag= HA_BLOB_PART;
12182
seg->length=0; // Whole blob in unique constraint
12186
seg->type= keyinfo->key_part[i].type;
12187
/* Tell handler if it can do suffic space compression */
12188
if (field->real_type() == MYSQL_TYPE_STRING &&
12189
keyinfo->key_part[i].length > 4)
12190
seg->flag|= HA_SPACE_PACK;
12192
if (!(field->flags & NOT_NULL_FLAG))
12194
seg->null_bit= field->null_bit;
12195
seg->null_pos= (uint) (field->null_ptr - (uchar*) table->record[0]);
12197
We are using a GROUP BY on something that contains NULL
12198
In this case we have to tell MyISAM that two NULL should
12199
on INSERT be regarded at the same value
12201
if (!using_unique_constraint)
12202
keydef.flag|= HA_NULL_ARE_EQUAL;
12206
MI_CREATE_INFO create_info;
12207
bzero((char*) &create_info,sizeof(create_info));
12209
if ((options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
12211
create_info.data_file_length= ~(uint64_t) 0;
12213
if ((error=mi_create(share->table_name.str, share->keys, &keydef,
12214
(uint) (*recinfo-start_recinfo),
12216
share->uniques, &uniquedef,
12218
HA_CREATE_TMP_TABLE)))
12220
table->file->print_error(error,MYF(0)); /* purecov: inspected */
12224
status_var_increment(table->in_use->status_var.created_tmp_disk_tables);
12225
share->db_record_offset= 1;
12233
free_tmp_table(THD *thd, TABLE *entry)
12235
MEM_ROOT own_root= entry->mem_root;
12236
const char *save_proc_info;
12238
save_proc_info=thd->proc_info;
12239
thd_proc_info(thd, "removing tmp table");
12243
if (entry->db_stat)
12244
entry->file->ha_drop_table(entry->s->table_name.str);
12246
entry->file->ha_delete_table(entry->s->table_name.str);
12247
delete entry->file;
12251
for (Field **ptr=entry->field ; *ptr ; ptr++)
12253
free_io_cache(entry);
12255
if (entry->temp_pool_slot != MY_BIT_NONE)
12256
bitmap_lock_clear_bit(&temp_pool, entry->temp_pool_slot);
12258
plugin_unlock(0, entry->s->db_plugin);
12260
free_root(&own_root, MYF(0)); /* the table is allocated in its own root */
12261
thd_proc_info(thd, save_proc_info);
12267
If a HEAP table gets full, create a MyISAM table and copy all rows
12271
bool create_myisam_from_heap(THD *thd, TABLE *table,
12272
MI_COLUMNDEF *start_recinfo,
12273
MI_COLUMNDEF **recinfo,
12274
int error, bool ignore_last_dupp_key_error)
12278
const char *save_proc_info;
12281
if (table->s->db_type() != heap_hton ||
12282
error != HA_ERR_RECORD_FILE_FULL)
12284
table->file->print_error(error,MYF(0));
12289
new_table.s= &share;
12290
new_table.s->db_plugin= ha_lock_engine(thd, myisam_hton);
12291
if (!(new_table.file= get_new_handler(&share, &new_table.mem_root,
12292
new_table.s->db_type())))
12293
return(1); // End of memory
12295
save_proc_info=thd->proc_info;
12296
thd_proc_info(thd, "converting HEAP to MyISAM");
12298
if (create_myisam_tmp_table(&new_table, table->key_info, start_recinfo,
12299
recinfo, thd->lex->select_lex.options |
12302
if (open_tmp_table(&new_table))
12304
if (table->file->indexes_are_disabled())
12305
new_table.file->ha_disable_indexes(HA_KEY_SWITCH_ALL);
12306
table->file->ha_index_or_rnd_end();
12307
table->file->ha_rnd_init(1);
12308
if (table->no_rows)
12310
new_table.file->extra(HA_EXTRA_NO_ROWS);
12311
new_table.no_rows=1;
12314
#ifdef TO_BE_DONE_LATER_IN_4_1
12316
To use start_bulk_insert() (which is new in 4.1) we need to find
12317
all places where a corresponding end_bulk_insert() should be put.
12319
table->file->info(HA_STATUS_VARIABLE); /* update table->file->stats.records */
12320
new_table.file->ha_start_bulk_insert(table->file->stats.records);
12322
/* HA_EXTRA_WRITE_CACHE can stay until close, no need to disable it */
12323
new_table.file->extra(HA_EXTRA_WRITE_CACHE);
12327
copy all old rows from heap table to MyISAM table
12328
This is the only code that uses record[1] to read/write but this
12329
is safe as this is a temporary MyISAM table without timestamp/autoincrement.
12331
while (!table->file->rnd_next(new_table.record[1]))
12333
write_err= new_table.file->ha_write_row(new_table.record[1]);
12337
/* copy row that filled HEAP table */
12338
if ((write_err=new_table.file->ha_write_row(table->record[0])))
12340
if (new_table.file->is_fatal_error(write_err, HA_CHECK_DUP) ||
12341
!ignore_last_dupp_key_error)
12345
/* remove heap table and change to use myisam table */
12346
(void) table->file->ha_rnd_end();
12347
(void) table->file->close(); // This deletes the table !
12348
delete table->file;
12350
plugin_unlock(0, table->s->db_plugin);
12351
share.db_plugin= my_plugin_lock(0, &share.db_plugin);
12352
new_table.s= table->s; // Keep old share
12356
table->file->change_table_ptr(table, table->s);
12357
table->use_all_columns();
12358
if (save_proc_info)
12360
const char *new_proc_info=
12361
(!strcmp(save_proc_info,"Copying to tmp table") ?
12362
"Copying to tmp table on disk" : save_proc_info);
12363
thd_proc_info(thd, new_proc_info);
12368
table->file->print_error(write_err, MYF(0));
12369
(void) table->file->ha_rnd_end();
12370
(void) new_table.file->close();
12372
new_table.file->ha_delete_table(new_table.s->table_name.str);
12374
delete new_table.file;
12375
thd_proc_info(thd, save_proc_info);
12376
table->mem_root= new_table.mem_root;
3362
int safe_index_read(JoinTable *tab)
3365
Table *table= tab->table;
3366
if ((error=table->cursor->index_read_map(table->getInsertRecord(),
12784
SemiJoinDuplicateElimination: Weed out duplicate row combinations
12787
do_sj_dups_weedout()
12791
1 The row combination is a duplicate (discard it)
12792
0 The row combination is not a duplicate (continue)
12795
int do_sj_dups_weedout(THD *thd, SJ_TMP_TABLE *sjtbl)
12798
SJ_TMP_TABLE::TAB *tab= sjtbl->tabs;
12799
SJ_TMP_TABLE::TAB *tab_end= sjtbl->tabs_end;
12800
uchar *ptr= sjtbl->tmp_table->record[0] + 1;
12801
uchar *nulls_ptr= ptr;
12803
/* Put the the rowids tuple into table->record[0]: */
12805
// 1. Store the length
12806
if (((Field_varstring*)(sjtbl->tmp_table->field[0]))->length_bytes == 1)
12808
*ptr= (uchar)(sjtbl->rowid_len + sjtbl->null_bytes);
12813
int2store(ptr, sjtbl->rowid_len + sjtbl->null_bytes);
12817
// 2. Zero the null bytes
12818
if (sjtbl->null_bytes)
12820
bzero(ptr, sjtbl->null_bytes);
12821
ptr += sjtbl->null_bytes;
12824
// 3. Put the rowids
12825
for (uint i=0; tab != tab_end; tab++, i++)
12827
handler *h= tab->join_tab->table->file;
12828
if (tab->join_tab->table->maybe_null && tab->join_tab->table->null_row)
12830
/* It's a NULL-complemented row */
12831
*(nulls_ptr + tab->null_byte) |= tab->null_bit;
12832
bzero(ptr + tab->rowid_offset, h->ref_length);
12836
/* Copy the rowid value */
12837
if (tab->join_tab->rowid_keep_flags & JOIN_TAB::CALL_POSITION)
12838
h->position(tab->join_tab->table->record[0]);
12839
memcpy(ptr + tab->rowid_offset, h->ref, h->ref_length);
12843
error= sjtbl->tmp_table->file->ha_write_row(sjtbl->tmp_table->record[0]);
12846
/* create_myisam_from_heap will generate error if needed */
12847
if (sjtbl->tmp_table->file->is_fatal_error(error, HA_CHECK_DUP) &&
12848
create_myisam_from_heap(thd, sjtbl->tmp_table, sjtbl->start_recinfo,
12849
&sjtbl->recinfo, error, 1))
12851
//return (error == HA_ERR_FOUND_DUPP_KEY || error== HA_ERR_FOUND_DUPP_UNIQUE) ? 1: -1;
12859
SemiJoinDuplicateElimination: Reset the temporary table
12862
int do_sj_reset(SJ_TMP_TABLE *sj_tbl)
12864
if (sj_tbl->tmp_table)
12865
return sj_tbl->tmp_table->file->ha_delete_all_rows();
12870
Process one record of the nested loop join.
12872
This function will evaluate parts of WHERE/ON clauses that are
12873
applicable to the partial record on hand and in case of success
12874
submit this record to the next level of the nested loop.
12877
static enum_nested_loop_state
12878
evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
12881
bool not_used_in_distinct=join_tab->not_used_in_distinct;
12882
ha_rows found_records=join->found_records;
12883
COND *select_cond= join_tab->select_cond;
12885
if (error > 0 || (join->thd->is_error())) // Fatal error
12886
return NESTED_LOOP_ERROR;
12888
return NESTED_LOOP_NO_MORE_ROWS;
12889
if (join->thd->killed) // Aborted by user
12891
join->thd->send_kill_message();
12892
return NESTED_LOOP_KILLED; /* purecov: inspected */
12894
if (!select_cond || select_cond->val_int())
12897
There is no select condition or the attached pushed down
12898
condition is true => a match is found.
12901
while (join_tab->first_unmatched && found)
12904
The while condition is always false if join_tab is not
12905
the last inner join table of an outer join operation.
12907
JOIN_TAB *first_unmatched= join_tab->first_unmatched;
12909
Mark that a match for current outer table is found.
12910
This activates push down conditional predicates attached
12911
to the all inner tables of the outer join.
12913
first_unmatched->found= 1;
12914
for (JOIN_TAB *tab= first_unmatched; tab <= join_tab; tab++)
12916
if (tab->table->reginfo.not_exists_optimize)
12917
return NESTED_LOOP_NO_MORE_ROWS;
12918
/* Check all predicates that has just been activated. */
12920
Actually all predicates non-guarded by first_unmatched->found
12921
will be re-evaluated again. It could be fixed, but, probably,
12922
it's not worth doing now.
12924
if (tab->select_cond && !tab->select_cond->val_int())
12926
/* The condition attached to table tab is false */
12927
if (tab == join_tab)
12932
Set a return point if rejected predicate is attached
12933
not to the last table of the current nest level.
12935
join->return_tab= tab;
12936
return NESTED_LOOP_OK;
12941
Check whether join_tab is not the last inner table
12942
for another embedding outer join.
12944
if ((first_unmatched= first_unmatched->first_upper) &&
12945
first_unmatched->last_inner != join_tab)
12946
first_unmatched= 0;
12947
join_tab->first_unmatched= first_unmatched;
12950
JOIN_TAB *return_tab= join->return_tab;
12951
join_tab->found_match= true;
12952
if (join_tab->check_weed_out_table)
12954
int res= do_sj_dups_weedout(join->thd, join_tab->check_weed_out_table);
12956
return NESTED_LOOP_ERROR;
12958
return NESTED_LOOP_OK;
12960
else if (join_tab->do_firstmatch)
12963
We should return to the join_tab->do_firstmatch after we have
12964
enumerated all the suffixes for current prefix row combination
12966
return_tab= join_tab->do_firstmatch;
12970
It was not just a return to lower loop level when one
12971
of the newly activated predicates is evaluated as false
12972
(See above join->return_tab= tab).
12974
join->examined_rows++;
12975
join->thd->row_count++;
12979
enum enum_nested_loop_state rc;
12980
/* A match from join_tab is found for the current partial join. */
12981
rc= (*join_tab->next_select)(join, join_tab+1, 0);
12982
if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS)
12984
if (return_tab < join->return_tab)
12985
join->return_tab= return_tab;
12987
if (join->return_tab < join_tab)
12988
return NESTED_LOOP_OK;
12990
Test if this was a SELECT DISTINCT query on a table that
12991
was not in the field list; In this case we can abort if
12992
we found a row, as no new rows can be added to the result.
12994
if (not_used_in_distinct && found_records != join->found_records)
12995
return NESTED_LOOP_NO_MORE_ROWS;
12998
join_tab->read_record.file->unlock_row();
13003
The condition pushed down to the table join_tab rejects all rows
13004
with the beginning coinciding with the current partial join.
13006
join->examined_rows++;
13007
join->thd->row_count++;
13008
join_tab->read_record.file->unlock_row();
13010
return NESTED_LOOP_OK;
13017
Construct a NULL complimented partial join record and feed it to the next
13018
level of the nested loop. This function is used in case we have
13019
an OUTER join and no matching record was found.
13022
static enum_nested_loop_state
13023
evaluate_null_complemented_join_record(JOIN *join, JOIN_TAB *join_tab)
13026
The table join_tab is the first inner table of a outer join operation
13027
and no matches has been found for the current outer row.
13029
JOIN_TAB *last_inner_tab= join_tab->last_inner;
13030
/* Cache variables for faster loop */
13032
for ( ; join_tab <= last_inner_tab ; join_tab++)
13034
/* Change the the values of guard predicate variables. */
13035
join_tab->found= 1;
13036
join_tab->not_null_compl= 0;
13037
/* The outer row is complemented by nulls for each inner tables */
13038
restore_record(join_tab->table,s->default_values); // Make empty record
13039
mark_as_null_row(join_tab->table); // For group by without error
13040
select_cond= join_tab->select_cond;
13041
/* Check all attached conditions for inner table rows. */
13042
if (select_cond && !select_cond->val_int())
13043
return NESTED_LOOP_OK;
13047
The row complemented by nulls might be the first row
13048
of embedding outer joins.
13049
If so, perform the same actions as in the code
13050
for the first regular outer join row above.
13054
JOIN_TAB *first_unmatched= join_tab->first_unmatched;
13055
if ((first_unmatched= first_unmatched->first_upper) &&
13056
first_unmatched->last_inner != join_tab)
13057
first_unmatched= 0;
13058
join_tab->first_unmatched= first_unmatched;
13059
if (!first_unmatched)
13061
first_unmatched->found= 1;
13062
for (JOIN_TAB *tab= first_unmatched; tab <= join_tab; tab++)
13064
if (tab->select_cond && !tab->select_cond->val_int())
13066
join->return_tab= tab;
13067
return NESTED_LOOP_OK;
13072
The row complemented by nulls satisfies all conditions
13073
attached to inner tables.
13074
Send the row complemented by nulls to be joined with the
13077
return (*join_tab->next_select)(join, join_tab+1, 0);
13081
static enum_nested_loop_state
13082
flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skip_last)
13084
enum_nested_loop_state rc= NESTED_LOOP_OK;
13088
join_tab->table->null_row= 0;
13089
if (!join_tab->cache.records)
13090
return NESTED_LOOP_OK; /* Nothing to do */
13092
(void) store_record_in_cache(&join_tab->cache); // Must save this for later
13093
if (join_tab->use_quick == 2)
13095
if (join_tab->select->quick)
13096
{ /* Used quick select last. reset it */
13097
delete join_tab->select->quick;
13098
join_tab->select->quick=0;
13101
/* read through all records */
13102
if ((error=join_init_read_record(join_tab)))
13104
reset_cache_write(&join_tab->cache);
13105
return error < 0 ? NESTED_LOOP_NO_MORE_ROWS: NESTED_LOOP_ERROR;
13108
for (JOIN_TAB *tmp=join->join_tab; tmp != join_tab ; tmp++)
13110
tmp->status=tmp->table->status;
13111
tmp->table->status=0;
13114
info= &join_tab->read_record;
13117
if (join->thd->killed)
13119
join->thd->send_kill_message();
13120
return NESTED_LOOP_KILLED; // Aborted by user /* purecov: inspected */
13122
SQL_SELECT *select=join_tab->select;
13123
if (rc == NESTED_LOOP_OK &&
13124
(!join_tab->cache.select || !join_tab->cache.select->skip_record()))
13127
reset_cache_read(&join_tab->cache);
13128
for (i=(join_tab->cache.records- (skip_last ? 1 : 0)) ; i-- > 0 ;)
13130
read_cached_record(join_tab);
13131
if (!select || !select->skip_record())
13134
if (!join_tab->check_weed_out_table ||
13135
!(res= do_sj_dups_weedout(join->thd, join_tab->check_weed_out_table)))
13137
rc= (join_tab->next_select)(join,join_tab+1,0);
13138
if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS)
13140
reset_cache_write(&join_tab->cache);
13145
return NESTED_LOOP_ERROR;
13149
} while (!(error=info->read_record(info)));
13152
read_cached_record(join_tab); // Restore current record
13153
reset_cache_write(&join_tab->cache);
13154
if (error > 0) // Fatal error
13155
return NESTED_LOOP_ERROR; /* purecov: inspected */
13156
for (JOIN_TAB *tmp2=join->join_tab; tmp2 != join_tab ; tmp2++)
13157
tmp2->table->status=tmp2->status;
13158
return NESTED_LOOP_OK;
13162
/*****************************************************************************
13163
The different ways to read a record
13164
Returns -1 if row was not found, 0 if row was found and 1 on errors
13165
*****************************************************************************/
13167
/** Help function when we get some an error from the table handler. */
13169
int report_error(TABLE *table, int error)
13171
if (error == HA_ERR_END_OF_FILE || error == HA_ERR_KEY_NOT_FOUND)
13173
table->status= STATUS_GARBAGE;
13174
return -1; // key not found; ok
13177
Locking reads can legally return also these errors, do not
13178
print them to the .err log
13180
if (error != HA_ERR_LOCK_DEADLOCK && error != HA_ERR_LOCK_WAIT_TIMEOUT)
13181
sql_print_error("Got error %d when reading table '%s'",
13182
error, table->s->path.str);
13183
table->file->print_error(error,MYF(0));
13188
int safe_index_read(JOIN_TAB *tab)
13191
TABLE *table= tab->table;
13192
if ((error=table->file->index_read_map(table->record[0],
3367
13193
tab->ref.key_buff,
3368
13194
make_prev_keypart_map(tab->ref.key_parts),
3369
13195
HA_READ_KEY_EXACT)))
3370
return table->report_error(error);
13196
return report_error(table, error);
13202
join_read_const_table(JOIN_TAB *tab, POSITION *pos)
13205
TABLE *table=tab->table;
13206
table->const_table=1;
13208
table->status=STATUS_NO_RECORD;
13210
if (tab->type == JT_SYSTEM)
13212
if ((error=join_read_system(tab)))
13213
{ // Info for DESCRIBE
13214
tab->info="const row not found";
13215
/* Mark for EXPLAIN that the row was not found */
13216
pos->records_read=0.0;
13217
pos->ref_depend_map= 0;
13218
if (!table->maybe_null || error > 0)
13224
if (!table->key_read && table->covering_keys.is_set(tab->ref.key) &&
13225
!table->no_keyread &&
13226
(int) table->reginfo.lock_type <= (int) TL_READ_HIGH_PRIORITY)
13229
table->file->extra(HA_EXTRA_KEYREAD);
13230
tab->index= tab->ref.key;
13232
error=join_read_const(tab);
13233
if (table->key_read)
13236
table->file->extra(HA_EXTRA_NO_KEYREAD);
13240
tab->info="unique row not found";
13241
/* Mark for EXPLAIN that the row was not found */
13242
pos->records_read=0.0;
13243
pos->ref_depend_map= 0;
13244
if (!table->maybe_null || error > 0)
13248
if (*tab->on_expr_ref && !table->null_row)
13250
if ((table->null_row= test((*tab->on_expr_ref)->val_int() == 0)))
13251
mark_as_null_row(table);
13253
if (!table->null_row)
13254
table->maybe_null=0;
13256
/* Check appearance of new constant items in Item_equal objects */
13257
JOIN *join= tab->join;
13259
update_const_equal_items(join->conds, tab);
13261
for (tbl= join->select_lex->leaf_tables; tbl; tbl= tbl->next_leaf)
13263
TABLE_LIST *embedded;
13264
TABLE_LIST *embedding= tbl;
13267
embedded= embedding;
13268
if (embedded->on_expr)
13269
update_const_equal_items(embedded->on_expr, tab);
13270
embedding= embedded->embedding;
13272
while (embedding &&
13273
embedding->nested_join->join_list.head() == embedded);
13281
join_read_system(JOIN_TAB *tab)
13283
TABLE *table= tab->table;
13285
if (table->status & STATUS_GARBAGE) // If first read
13287
if ((error=table->file->read_first_row(table->record[0],
13288
table->s->primary_key)))
13290
if (error != HA_ERR_END_OF_FILE)
13291
return report_error(table, error);
13292
mark_as_null_row(tab->table);
13293
empty_record(table); // Make empty record
13296
store_record(table,record[1]);
13298
else if (!table->status) // Only happens with left join
13299
restore_record(table,record[1]); // restore old record
13301
return table->status ? -1 : 0;
3375
13306
Read a (constant) table when there is at most one matching row.
6257
static void print_table_array(Session *session, String *str, TableList **table,
6260
(*table)->print(session, str, QT_ORDINARY);
6262
for (TableList **tbl= table + 1; tbl < end; tbl++)
6264
TableList *curr= *tbl;
17296
/** Allocate memory needed for other rollup functions. */
17298
bool JOIN::rollup_init()
17303
tmp_table_param.quick_group= 0; // Can't create groups in tmp table
17304
rollup.state= ROLLUP::STATE_INITED;
17307
Create pointers to the different sum function groups
17308
These are updated by rollup_make_fields()
17310
tmp_table_param.group_parts= send_group_parts;
17312
if (!(rollup.null_items= (Item_null_result**) thd->alloc((sizeof(Item*) +
17314
sizeof(List<Item>) +
17315
ref_pointer_array_size)
17316
* send_group_parts )))
17319
rollup.fields= (List<Item>*) (rollup.null_items + send_group_parts);
17320
rollup.ref_pointer_arrays= (Item***) (rollup.fields + send_group_parts);
17321
ref_array= (Item**) (rollup.ref_pointer_arrays+send_group_parts);
17324
Prepare space for field list for the different levels
17325
These will be filled up in rollup_make_fields()
17327
for (i= 0 ; i < send_group_parts ; i++)
17329
rollup.null_items[i]= new (thd->mem_root) Item_null_result();
17330
List<Item> *rollup_fields= &rollup.fields[i];
17331
rollup_fields->empty();
17332
rollup.ref_pointer_arrays[i]= ref_array;
17333
ref_array+= all_fields.elements;
17335
for (i= 0 ; i < send_group_parts; i++)
17337
for (j=0 ; j < fields_list.elements ; j++)
17338
rollup.fields[i].push_back(rollup.null_items[i]);
17340
List_iterator<Item> it(all_fields);
17342
while ((item= it++))
17345
bool found_in_group= 0;
17347
for (group_tmp= group_list; group_tmp; group_tmp= group_tmp->next)
17349
if (*group_tmp->item == item)
17351
item->maybe_null= 1;
17353
if (item->const_item())
17356
For ROLLUP queries each constant item referenced in GROUP BY list
17357
is wrapped up into an Item_func object yielding the same value
17358
as the constant item. The objects of the wrapper class are never
17359
considered as constant items and besides they inherit all
17360
properties of the Item_result_field class.
17361
This wrapping allows us to ensure writing constant items
17362
into temporary tables whenever the result of the ROLLUP
17363
operation has to be written into a temporary table, e.g. when
17364
ROLLUP is used together with DISTINCT in the SELECT list.
17365
Usually when creating temporary tables for a intermidiate
17366
result we do not include fields for constant expressions.
17368
Item* new_item= new Item_func_rollup_const(item);
17371
new_item->fix_fields(thd, (Item **) 0);
17372
thd->change_item_tree(it.ref(), new_item);
17373
for (ORDER *tmp= group_tmp; tmp; tmp= tmp->next)
17375
if (*tmp->item == item)
17376
thd->change_item_tree(tmp->item, new_item);
17381
if (item->type() == Item::FUNC_ITEM && !found_in_group)
17383
bool changed= false;
17384
if (change_group_ref(thd, (Item_func *) item, group_list, &changed))
17387
We have to prevent creation of a field in a temporary table for
17388
an expression that contains GROUP BY attributes.
17389
Marking the expression item as 'with_sum_func' will ensure this.
17392
item->with_sum_func= 1;
17400
Fill up rollup structures with pointers to fields to use.
17402
Creates copies of item_sum items for each sum level.
17404
@param fields_arg List of all fields (hidden and real ones)
17405
@param sel_fields Pointer to selected fields
17406
@param func Store here a pointer to all fields
17410
In this case func is pointing to next not used element.
17415
bool JOIN::rollup_make_fields(List<Item> &fields_arg, List<Item> &sel_fields,
17418
List_iterator_fast<Item> it(fields_arg);
17419
Item *first_field= sel_fields.head();
17423
Create field lists for the different levels
17425
The idea here is to have a separate field list for each rollup level to
17426
avoid all runtime checks of which columns should be NULL.
17428
The list is stored in reverse order to get sum function in such an order
17429
in func that it makes it easy to reset them with init_sum_functions()
17431
Assuming: SELECT a, b, c SUM(b) FROM t1 GROUP BY a,b WITH ROLLUP
17433
rollup.fields[0] will contain list where a,b,c is NULL
17434
rollup.fields[1] will contain list where b,c is NULL
17436
rollup.ref_pointer_array[#] points to fields for rollup.fields[#]
17438
sum_funcs_end[0] points to all sum functions
17439
sum_funcs_end[1] points to all sum functions, except grand totals
17443
for (level=0 ; level < send_group_parts ; level++)
17446
uint pos= send_group_parts - level -1;
17447
bool real_fields= 0;
17449
List_iterator<Item> new_it(rollup.fields[pos]);
17450
Item **ref_array_start= rollup.ref_pointer_arrays[pos];
17451
ORDER *start_group;
17453
/* Point to first hidden field */
17454
Item **ref_array= ref_array_start + fields_arg.elements-1;
17456
/* Remember where the sum functions ends for the previous level */
17457
sum_funcs_end[pos+1]= *func;
17459
/* Find the start of the group for this level */
17460
for (i= 0, start_group= group_list ;
17462
start_group= start_group->next)
17466
while ((item= it++))
17468
if (item == first_field)
17470
real_fields= 1; // End of hidden fields
17471
ref_array= ref_array_start;
17474
if (item->type() == Item::SUM_FUNC_ITEM && !item->const_item() &&
17475
(!((Item_sum*) item)->depended_from() ||
17476
((Item_sum *)item)->depended_from() == select_lex))
17480
This is a top level summary function that must be replaced with
17481
a sum function that is reset for this level.
17483
NOTE: This code creates an object which is not that nice in a
17484
sub select. Fortunately it's not common to have rollup in
17487
item= item->copy_or_same(thd);
17488
((Item_sum*) item)->make_unique();
17489
*(*func)= (Item_sum*) item;
17494
/* Check if this is something that is part of this group by */
17496
for (group_tmp= start_group, i= pos ;
17497
group_tmp ; group_tmp= group_tmp->next, i++)
17499
if (*group_tmp->item == item)
17502
This is an element that is used by the GROUP BY and should be
17503
set to NULL in this level
17505
Item_null_result *null_item= new (thd->mem_root) Item_null_result();
17508
item->maybe_null= 1; // Value will be null sometimes
17509
null_item->result_field= item->get_tmp_table_field();
17518
(void) new_it++; // Point to next item
17519
new_it.replace(item); // Replace previous
17526
sum_funcs_end[0]= *func; // Point to last function
17531
Send all rollup levels higher than the current one to the client.
17535
SELECT a, b, c SUM(b) FROM t1 GROUP BY a,b WITH ROLLUP
17538
@param idx Level we are on:
17539
- 0 = Total sum level
17540
- 1 = First group changed (a)
17541
- 2 = Second group changed (a,b)
17546
1 If send_data_failed()
17549
int JOIN::rollup_send_data(uint idx)
17552
for (i= send_group_parts ; i-- > idx ; )
17554
/* Get reference pointers to sum functions in place */
17555
memcpy((char*) ref_pointer_array,
17556
(char*) rollup.ref_pointer_arrays[i],
17557
ref_pointer_array_size);
17558
if ((!having || having->val_int()))
17560
if (send_records < unit->select_limit_cnt && do_send_rows &&
17561
result->send_data(rollup.fields[i]))
17566
/* Restore ref_pointer_array */
17567
set_items_ref_array(current_ref_pointer_array);
17572
Write all rollup levels higher than the current one to a temp table.
17576
SELECT a, b, SUM(c) FROM t1 GROUP BY a,b WITH ROLLUP
17579
@param idx Level we are on:
17580
- 0 = Total sum level
17581
- 1 = First group changed (a)
17582
- 2 = Second group changed (a,b)
17583
@param table reference to temp table
17588
1 if write_data_failed()
17591
int JOIN::rollup_write_data(uint idx, TABLE *table_arg)
17594
for (i= send_group_parts ; i-- > idx ; )
17596
/* Get reference pointers to sum functions in place */
17597
memcpy((char*) ref_pointer_array,
17598
(char*) rollup.ref_pointer_arrays[i],
17599
ref_pointer_array_size);
17600
if ((!having || having->val_int()))
17604
List_iterator_fast<Item> it(rollup.fields[i]);
17605
while ((item= it++))
17607
if (item->type() == Item::NULL_ITEM && item->is_result_field())
17608
item->save_in_result_field(1);
17610
copy_sum_funcs(sum_funcs_end[i+1], sum_funcs_end[i]);
17611
if ((write_error= table_arg->file->ha_write_row(table_arg->record[0])))
17613
if (create_myisam_from_heap(thd, table_arg,
17614
tmp_table_param.start_recinfo,
17615
&tmp_table_param.recinfo,
17621
/* Restore ref_pointer_array */
17622
set_items_ref_array(current_ref_pointer_array);
17627
clear results if there are not rows found for group
17628
(end_send_group/end_write_group)
17633
clear_tables(this);
17634
copy_fields(&tmp_table_param);
17638
Item_sum *func, **func_ptr= sum_funcs;
17639
while ((func= *(func_ptr++)))
17647
Send a description about what how the select will be done to stdout.
17650
void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
17651
bool distinct,const char *message)
17653
List<Item> field_list;
17654
List<Item> item_list;
17655
THD *thd=join->thd;
17656
select_result *result=join->result;
17657
Item *item_null= new Item_null();
17658
CHARSET_INFO *cs= system_charset_info;
17660
/* Don't log this into the slow query log */
17661
thd->server_status&= ~(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED);
17662
join->unit->offset_limit_cnt= 0;
17665
NOTE: the number/types of items pushed into item_list must be in sync with
17666
EXPLAIN column types as they're "defined" in THD::send_explain_fields()
17670
item_list.push_back(new Item_int((int32)
17671
join->select_lex->select_number));
17672
item_list.push_back(new Item_string(join->select_lex->type,
17673
strlen(join->select_lex->type), cs));
17674
for (uint i=0 ; i < 7; i++)
17675
item_list.push_back(item_null);
17676
if (join->thd->lex->describe & DESCRIBE_EXTENDED)
17677
item_list.push_back(item_null);
17679
item_list.push_back(new Item_string(message,strlen(message),cs));
17680
if (result->send_data(item_list))
17683
else if (join->select_lex == join->unit->fake_select_lex)
17686
here we assume that the query will return at least two rows, so we
17687
show "filesort" in EXPLAIN. Of course, sometimes we'll be wrong
17688
and no filesort will be actually done, but executing all selects in
17689
the UNION to provide precise EXPLAIN information will hardly be
17692
char table_name_buffer[NAME_LEN];
17695
item_list.push_back(new Item_null);
17697
item_list.push_back(new Item_string(join->select_lex->type,
17698
strlen(join->select_lex->type),
17702
SELECT_LEX *sl= join->unit->first_select();
17703
uint len= 6, lastop= 0;
17704
memcpy(table_name_buffer, STRING_WITH_LEN("<union"));
17705
for (; sl && len + lastop + 5 < NAME_LEN; sl= sl->next_select())
17708
lastop= snprintf(table_name_buffer + len, NAME_LEN - len,
17709
"%u,", sl->select_number);
17711
if (sl || len + lastop >= NAME_LEN)
17713
memcpy(table_name_buffer + len, STRING_WITH_LEN("...>") + 1);
17719
table_name_buffer[len - 1]= '>'; // change ',' to '>'
17721
item_list.push_back(new Item_string(table_name_buffer, len, cs));
17724
item_list.push_back(new Item_string(join_type_str[JT_ALL],
17725
strlen(join_type_str[JT_ALL]),
17727
/* possible_keys */
17728
item_list.push_back(item_null);
17730
item_list.push_back(item_null);
17732
item_list.push_back(item_null);
17734
item_list.push_back(item_null);
17736
if (join->thd->lex->describe & DESCRIBE_EXTENDED)
17737
item_list.push_back(item_null);
17739
item_list.push_back(item_null);
17741
if (join->unit->global_parameters->order_list.first)
17742
item_list.push_back(new Item_string("Using filesort",
17745
item_list.push_back(new Item_string("", 0, cs));
17747
if (result->send_data(item_list))
17752
table_map used_tables=0;
17753
for (uint i=0 ; i < join->tables ; i++)
17755
JOIN_TAB *tab=join->join_tab+i;
17756
TABLE *table=tab->table;
17757
TABLE_LIST *table_list= tab->table->pos_in_table_list;
17759
char buff1[512], buff2[512], buff3[512];
17760
char keylen_str_buf[64];
17761
String extra(buff, sizeof(buff),cs);
17762
char table_name_buffer[NAME_LEN];
17763
String tmp1(buff1,sizeof(buff1),cs);
17764
String tmp2(buff2,sizeof(buff2),cs);
17765
String tmp3(buff3,sizeof(buff3),cs);
17774
item_list.push_back(new Item_uint((uint32)
17775
join->select_lex->select_number));
17777
item_list.push_back(new Item_string(join->select_lex->type,
17778
strlen(join->select_lex->type),
17780
if (tab->type == JT_ALL && tab->select && tab->select->quick)
17782
quick_type= tab->select->quick->get_type();
17783
if ((quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_MERGE) ||
17784
(quick_type == QUICK_SELECT_I::QS_TYPE_ROR_INTERSECT) ||
17785
(quick_type == QUICK_SELECT_I::QS_TYPE_ROR_UNION))
17786
tab->type = JT_INDEX_MERGE;
17788
tab->type = JT_RANGE;
17791
if (table->derived_select_number)
17793
/* Derived table name generation */
17794
int len= snprintf(table_name_buffer, sizeof(table_name_buffer)-1,
17796
table->derived_select_number);
17797
item_list.push_back(new Item_string(table_name_buffer, len, cs));
17801
TABLE_LIST *real_table= table->pos_in_table_list;
17802
item_list.push_back(new Item_string(real_table->alias,
17803
strlen(real_table->alias),
17806
/* "type" column */
17807
item_list.push_back(new Item_string(join_type_str[tab->type],
17808
strlen(join_type_str[tab->type]),
17810
/* Build "possible_keys" value and add it to item_list */
17811
if (!tab->keys.is_clear_all())
17814
for (j=0 ; j < table->s->keys ; j++)
17816
if (tab->keys.is_set(j))
17820
tmp1.append(table->key_info[j].name,
17821
strlen(table->key_info[j].name),
17822
system_charset_info);
17827
item_list.push_back(new Item_string(tmp1.ptr(),tmp1.length(),cs));
17829
item_list.push_back(item_null);
17831
/* Build "key", "key_len", and "ref" values and add them to item_list */
17832
if (tab->ref.key_parts)
17834
KEY *key_info=table->key_info+ tab->ref.key;
17835
register uint length;
17836
item_list.push_back(new Item_string(key_info->name,
17837
strlen(key_info->name),
17838
system_charset_info));
17839
length= int64_t2str(tab->ref.key_length, keylen_str_buf, 10) -
17841
item_list.push_back(new Item_string(keylen_str_buf, length,
17842
system_charset_info));
17843
for (store_key **ref=tab->ref.key_copy ; *ref ; ref++)
17847
tmp2.append((*ref)->name(), strlen((*ref)->name()),
17848
system_charset_info);
17850
item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length(),cs));
17852
else if (tab->type == JT_NEXT)
17854
KEY *key_info=table->key_info+ tab->index;
17855
register uint length;
17856
item_list.push_back(new Item_string(key_info->name,
17857
strlen(key_info->name),cs));
17858
length= int64_t2str(key_info->key_length, keylen_str_buf, 10) -
17860
item_list.push_back(new Item_string(keylen_str_buf,
17862
system_charset_info));
17863
item_list.push_back(item_null);
17865
else if (tab->select && tab->select->quick)
17867
tab->select->quick->add_keys_and_lengths(&tmp2, &tmp3);
17868
item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length(),cs));
17869
item_list.push_back(new Item_string(tmp3.ptr(),tmp3.length(),cs));
17870
item_list.push_back(item_null);
17874
if (table_list->schema_table &&
17875
table_list->schema_table->i_s_requested_object & OPTIMIZE_I_S_TABLE)
17877
const char *tmp_buff;
17879
if (table_list->has_db_lookup_value)
17881
f_idx= table_list->schema_table->idx_field1;
17882
tmp_buff= table_list->schema_table->fields_info[f_idx].field_name;
17883
tmp2.append(tmp_buff, strlen(tmp_buff), cs);
17885
if (table_list->has_table_lookup_value)
17887
if (table_list->has_db_lookup_value)
17889
f_idx= table_list->schema_table->idx_field2;
17890
tmp_buff= table_list->schema_table->fields_info[f_idx].field_name;
17891
tmp2.append(tmp_buff, strlen(tmp_buff), cs);
17894
item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length(),cs));
17896
item_list.push_back(item_null);
17899
item_list.push_back(item_null);
17900
item_list.push_back(item_null);
17901
item_list.push_back(item_null);
17904
/* Add "rows" field to item_list. */
17905
if (table_list->schema_table)
17908
if (join->thd->lex->describe & DESCRIBE_EXTENDED)
17909
item_list.push_back(item_null);
17911
item_list.push_back(item_null);
17915
double examined_rows;
17916
if (tab->select && tab->select->quick)
17917
examined_rows= rows2double(tab->select->quick->records);
17918
else if (tab->type == JT_NEXT || tab->type == JT_ALL)
17919
examined_rows= rows2double(tab->limit ? tab->limit :
17920
tab->table->file->records());
17922
examined_rows= join->best_positions[i].records_read;
17924
item_list.push_back(new Item_int((int64_t) (uint64_t) examined_rows,
17925
MY_INT64_NUM_DECIMAL_DIGITS));
17927
/* Add "filtered" field to item_list. */
17928
if (join->thd->lex->describe & DESCRIBE_EXTENDED)
17932
f= (float) (100.0 * join->best_positions[i].records_read /
17934
item_list.push_back(new Item_float(f, 2));
17938
/* Build "Extra" field and add it to item_list. */
17939
bool key_read=table->key_read;
17940
if ((tab->type == JT_NEXT || tab->type == JT_CONST) &&
17941
table->covering_keys.is_set(tab->index))
17943
if (quick_type == QUICK_SELECT_I::QS_TYPE_ROR_INTERSECT &&
17944
!((QUICK_ROR_INTERSECT_SELECT*)tab->select->quick)->need_to_fetch_row)
17948
item_list.push_back(new Item_string(tab->info,strlen(tab->info),cs));
17949
else if (tab->packed_info & TAB_INFO_HAVE_VALUE)
17951
if (tab->packed_info & TAB_INFO_USING_INDEX)
17952
extra.append(STRING_WITH_LEN("; Using index"));
17953
if (tab->packed_info & TAB_INFO_USING_WHERE)
17954
extra.append(STRING_WITH_LEN("; Using where"));
17955
if (tab->packed_info & TAB_INFO_FULL_SCAN_ON_NULL)
17956
extra.append(STRING_WITH_LEN("; Full scan on NULL key"));
17957
/* Skip initial "; "*/
17958
const char *str= extra.ptr();
17959
uint32 len= extra.length();
17965
item_list.push_back(new Item_string(str, len, cs));
17969
uint keyno= MAX_KEY;
17970
if (tab->ref.key_parts)
17971
keyno= tab->ref.key;
17972
else if (tab->select && tab->select->quick)
17973
keyno = tab->select->quick->index;
17975
if (keyno != MAX_KEY && keyno == table->file->pushed_idx_cond_keyno &&
17976
table->file->pushed_idx_cond)
17977
extra.append(STRING_WITH_LEN("; Using index condition"));
17979
if (quick_type == QUICK_SELECT_I::QS_TYPE_ROR_UNION ||
17980
quick_type == QUICK_SELECT_I::QS_TYPE_ROR_INTERSECT ||
17981
quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_MERGE)
17983
extra.append(STRING_WITH_LEN("; Using "));
17984
tab->select->quick->add_info_string(&extra);
17988
if (tab->use_quick == 2)
17990
/* 4 bits per 1 hex digit + terminating '\0' */
17991
char buf[MAX_KEY / 4 + 1];
17992
extra.append(STRING_WITH_LEN("; Range checked for each "
17993
"record (index map: 0x"));
17994
extra.append(tab->keys.print(buf));
17997
else if (tab->select->cond)
17999
const COND *pushed_cond= tab->table->file->pushed_cond;
18001
if (thd->variables.engine_condition_pushdown && pushed_cond)
18003
extra.append(STRING_WITH_LEN("; Using where with pushed "
18005
if (thd->lex->describe & DESCRIBE_EXTENDED)
18007
extra.append(STRING_WITH_LEN(": "));
18008
((COND *)pushed_cond)->print(&extra, QT_ORDINARY);
18012
extra.append(STRING_WITH_LEN("; Using where"));
18017
if (quick_type == QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX)
18018
extra.append(STRING_WITH_LEN("; Using index for group-by"));
18020
extra.append(STRING_WITH_LEN("; Using index"));
18022
if (table->reginfo.not_exists_optimize)
18023
extra.append(STRING_WITH_LEN("; Not exists"));
18025
if (quick_type == QUICK_SELECT_I::QS_TYPE_RANGE &&
18026
!(((QUICK_RANGE_SELECT*)(tab->select->quick))->mrr_flags &
18027
HA_MRR_USE_DEFAULT_IMPL))
18029
extra.append(STRING_WITH_LEN("; Using MRR"));
18032
if (table_list->schema_table &&
18033
table_list->schema_table->i_s_requested_object & OPTIMIZE_I_S_TABLE)
18035
if (!table_list->table_open_method)
18036
extra.append(STRING_WITH_LEN("; Skip_open_table"));
18037
else if (table_list->table_open_method == OPEN_FRM_ONLY)
18038
extra.append(STRING_WITH_LEN("; Open_frm_only"));
18040
extra.append(STRING_WITH_LEN("; Open_full_table"));
18041
if (table_list->has_db_lookup_value &&
18042
table_list->has_table_lookup_value)
18043
extra.append(STRING_WITH_LEN("; Scanned 0 databases"));
18044
else if (table_list->has_db_lookup_value ||
18045
table_list->has_table_lookup_value)
18046
extra.append(STRING_WITH_LEN("; Scanned 1 database"));
18048
extra.append(STRING_WITH_LEN("; Scanned all databases"));
18050
if (need_tmp_table)
18053
extra.append(STRING_WITH_LEN("; Using temporary"));
18058
extra.append(STRING_WITH_LEN("; Using filesort"));
18060
if (distinct & test_all_bits(used_tables,thd->used_tables))
18061
extra.append(STRING_WITH_LEN("; Distinct"));
18063
if (tab->insideout_match_tab)
18065
extra.append(STRING_WITH_LEN("; LooseScan"));
18068
if (tab->flush_weedout_table)
18069
extra.append(STRING_WITH_LEN("; Start temporary"));
18070
else if (tab->check_weed_out_table)
18071
extra.append(STRING_WITH_LEN("; End temporary"));
18072
else if (tab->do_firstmatch)
18074
extra.append(STRING_WITH_LEN("; FirstMatch("));
18075
TABLE *prev_table=tab->do_firstmatch->table;
18076
if (prev_table->derived_select_number)
18078
char namebuf[NAME_LEN];
18079
/* Derived table name generation */
18080
int len= snprintf(namebuf, sizeof(namebuf)-1,
18082
prev_table->derived_select_number);
18083
extra.append(namebuf, len);
18086
extra.append(prev_table->pos_in_table_list->alias);
18087
extra.append(STRING_WITH_LEN(")"));
18090
for (uint part= 0; part < tab->ref.key_parts; part++)
18092
if (tab->ref.cond_guards[part])
18094
extra.append(STRING_WITH_LEN("; Full scan on NULL key"));
18099
if (i > 0 && tab[-1].next_select == sub_select_cache)
18100
extra.append(STRING_WITH_LEN("; Using join buffer"));
18102
/* Skip initial "; "*/
18103
const char *str= extra.ptr();
18104
uint32 len= extra.length();
18110
item_list.push_back(new Item_string(str, len, cs));
18112
// For next iteration
18113
used_tables|=table->map;
18114
if (result->send_data(item_list))
18118
for (SELECT_LEX_UNIT *unit= join->select_lex->first_inner_unit();
18120
unit= unit->next_unit())
18122
if (mysql_explain_union(thd, unit, result))
18129
bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
18132
SELECT_LEX *first= unit->first_select();
18134
for (SELECT_LEX *sl= first;
18136
sl= sl->next_select())
18138
// drop UNCACHEABLE_EXPLAIN, because it is for internal usage only
18139
uint8 uncacheable= (sl->uncacheable & ~UNCACHEABLE_EXPLAIN);
18140
sl->type= (((&thd->lex->select_lex)==sl)?
18141
(sl->first_inner_unit() || sl->next_select() ?
18142
"PRIMARY" : "SIMPLE"):
18144
((sl->linkage == DERIVED_TABLE_TYPE) ?
18146
((uncacheable & UNCACHEABLE_DEPENDENT) ?
18147
"DEPENDENT SUBQUERY":
18148
(uncacheable?"UNCACHEABLE SUBQUERY":
18150
((uncacheable & UNCACHEABLE_DEPENDENT) ?
18152
uncacheable?"UNCACHEABLE UNION":
18154
sl->options|= SELECT_DESCRIBE;
18156
if (unit->is_union())
18158
unit->fake_select_lex->select_number= UINT_MAX; // jost for initialization
18159
unit->fake_select_lex->type= "UNION RESULT";
18160
unit->fake_select_lex->options|= SELECT_DESCRIBE;
18161
if (!(res= unit->prepare(thd, result, SELECT_NO_UNLOCK | SELECT_DESCRIBE)))
18163
res|= unit->cleanup();
18167
thd->lex->current_select= first;
18168
unit->set_limit(unit->global_parameters);
18169
res= mysql_select(thd, &first->ref_pointer_array,
18170
(TABLE_LIST*) first->table_list.first,
18171
first->with_wild, first->item_list,
18173
first->order_list.elements +
18174
first->group_list.elements,
18175
(ORDER*) first->order_list.first,
18176
(ORDER*) first->group_list.first,
18178
(ORDER*) thd->lex->proc_list.first,
18179
first->options | thd->options | SELECT_DESCRIBE,
18180
result, unit, first);
18182
return(res || thd->is_error());
18186
static void print_table_array(THD *thd, String *str, TABLE_LIST **table,
18189
(*table)->print(thd, str, QT_ORDINARY);
18191
for (TABLE_LIST **tbl= table + 1; tbl < end; tbl++)
18193
TABLE_LIST *curr= *tbl;
6265
18194
if (curr->outer_join)
6267
18196
/* MySQL converts right to left joins */