20
20
mysql_select and join optimization
23
22
@defgroup Query_Optimizer Query Optimizer
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,
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/plugin/info_schema_table.h"
42
#include "drizzled/item/cache.h"
43
#include "drizzled/item/cmpfunc.h"
44
#include "drizzled/item/copy_string.h"
45
#include "drizzled/item/uint.h"
46
#include "drizzled/cached_item.h"
47
#include "drizzled/sql_base.h"
48
#include "drizzled/field/blob.h"
49
#include "drizzled/check_stack_overrun.h"
50
#include "drizzled/lock.h"
51
#include "drizzled/item/outer_ref.h"
52
#include "drizzled/index_hint.h"
53
#include "drizzled/memory/multi_malloc.h"
54
#include "drizzled/records.h"
55
#include "drizzled/internal/iocache.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"
67
using namespace drizzled;
70
static int sort_keyuse(optimizer::KeyUse *a, optimizer::KeyUse *b);
71
static COND *build_equal_items(Session *session, COND *cond,
102
72
COND_EQUAL *inherited,
103
List<TABLE_LIST> *join_list,
73
List<TableList> *join_list,
104
74
COND_EQUAL **cond_equal_ref);
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);
76
static Item* part_of_refkey(Table *form,Field *field);
77
static bool cmp_buffer_with_ref(JoinTable *tab);
78
static void change_cond_ref_to_const(Session *session,
79
vector<COND_CMP>& save_list,
84
static bool copy_blobs(Field **ptr);
86
static bool eval_const_cond(COND *cond)
88
return ((Item_func*) cond)->val_int() ? true : false;
232
92
This is used to mark equalities that were made from i-th IN-equality.
391
255
ref->outer_ref= new_ref;
392
256
ref->ref= &ref->outer_ref;
394
if (!ref->fixed && ref->fix_fields(thd, 0))
258
if (!ref->fixed && ref->fix_fields(session, 0))
396
thd->used_tables|= item->used_tables();
260
session->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;
430
265
/*****************************************************************************
431
266
Check fields, find best join, do the select and output fields.
432
267
mysql_select assumes that all tables are already opened
433
268
*****************************************************************************/
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;
521
Item_subselect *subselect;
522
Item_in_subselect *in_subs= NULL;
524
Are we in a subquery predicate?
525
TODO: the block below will be executed for every PS execution without need.
527
if ((subselect= select_lex->master_unit()->item))
529
bool do_semijoin= !test(thd->variables.optimizer_switch &
530
OPTIMIZER_SWITCH_NO_SEMIJOIN);
531
if (subselect->substype() == Item_subselect::IN_SUBS)
532
in_subs= (Item_in_subselect*)subselect;
535
Check if we're in subquery that is a candidate for flattening into a
536
semi-join (which is done done in flatten_subqueries()). The
538
1. Subquery predicate is an IN/=ANY subq predicate
539
2. Subquery is a single SELECT (not a UNION)
540
3. Subquery does not have GROUP BY or ORDER BY
541
4. Subquery does not use aggregate functions or HAVING
542
5. Subquery predicate is at the AND-top-level of ON/WHERE clause
543
6. No execution method was already chosen (by a prepared statement).
545
(*). We are not in a subquery of a single table UPDATE/DELETE that
546
doesn't have a JOIN (TODO: We should handle this at some
547
point by switching to multi-table UPDATE/DELETE)
549
(**). We're not in a confluent table-less subquery, like
553
!select_lex->master_unit()->first_select()->next_select() && // 2
554
!select_lex->group_list.elements && !order && // 3
555
!having && !select_lex->with_sum_func && // 4
556
thd->thd_marker && // 5
557
select_lex->outer_select()->join && // (*)
558
select_lex->master_unit()->first_select()->leaf_tables && // (**)
560
in_subs->exec_method == Item_in_subselect::NOT_TRANSFORMED) // 6
563
if (!in_subs->left_expr->fixed &&
564
in_subs->left_expr->fix_fields(thd, &in_subs->left_expr))
569
Check that the right part of the subselect contains no more than one
570
column. E.g. in SELECT 1 IN (SELECT * ..) the right part is (SELECT * ...)
572
if (subselect->substype() == Item_subselect::IN_SUBS &&
573
(select_lex->item_list.elements !=
574
((Item_in_subselect*)subselect)->left_expr->cols()))
576
my_error(ER_OPERAND_COLUMNS, MYF(0), ((Item_in_subselect*)subselect)->left_expr->cols());
581
/* Register the subquery for further processing */
582
select_lex->outer_select()->join->sj_subselects.append(thd->mem_root, in_subs);
583
in_subs->expr_join_nest= (TABLE_LIST*)thd->thd_marker;
587
bool do_materialize= !test(thd->variables.optimizer_switch &
588
OPTIMIZER_SWITCH_NO_MATERIALIZATION);
590
Check if the subquery predicate can be executed via materialization.
591
The required conditions are:
592
1. Subquery predicate is an IN/=ANY subq predicate
593
2. Subquery is a single SELECT (not a UNION)
594
3. Subquery is not a table-less query. In this case there is no
595
point in materializing.
596
4. Subquery predicate is a top-level predicate
597
(this implies it is not negated)
598
TODO: this is a limitation that should be lifeted once we
599
implement correct NULL semantics (WL#3830)
600
5. Subquery is non-correlated
602
This is an overly restrictive condition. It can be extended to:
603
(Subquery is non-correlated ||
604
Subquery is correlated to any query outer to IN predicate ||
605
(Subquery is correlated to the immediate outer query &&
606
Subquery !contains {GROUP BY, ORDER BY [LIMIT],
607
aggregate functions) && subquery predicate is not under "NOT IN"))
608
6. No execution method was already chosen (by a prepared statement).
610
(*) The subquery must be part of a SELECT statement. The current
611
condition also excludes multi-table update statements.
613
We have to determine whether we will perform subquery materialization
614
before calling the IN=>EXISTS transformation, so that we know whether to
615
perform the whole transformation or only that part of it which wraps
616
Item_in_subselect in an Item_in_optimizer.
618
if (do_materialize &&
620
!select_lex->master_unit()->first_select()->next_select() && // 2
621
select_lex->master_unit()->first_select()->leaf_tables && // 3
622
thd->lex->sql_command == SQLCOM_SELECT) // *
624
if (in_subs->is_top_level_item() && // 4
625
!in_subs->is_correlated && // 5
626
in_subs->exec_method == Item_in_subselect::NOT_TRANSFORMED) // 6
627
in_subs->exec_method= Item_in_subselect::MATERIALIZATION;
630
Item_subselect::trans_res trans_res;
631
if ((trans_res= subselect->select_transformer(this)) !=
632
Item_subselect::RES_OK)
634
return((trans_res == Item_subselect::RES_ERROR));
643
for (ord= order; ord; ord= ord->next)
645
Item *item= *ord->item;
646
if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM)
647
item->split_sum_func(thd, ref_pointer_array, all_fields);
651
if (having && having->with_sum_func)
652
having->split_sum_func2(thd, ref_pointer_array, all_fields,
654
if (select_lex->inner_sum_func_list)
656
Item_sum *end=select_lex->inner_sum_func_list;
657
Item_sum *item_sum= end;
660
item_sum= item_sum->next;
661
item_sum->split_sum_func2(thd, ref_pointer_array,
662
all_fields, item_sum->ref_by, false);
663
} while (item_sum != end);
666
if (select_lex->inner_refs_list.elements &&
667
fix_inner_refs(thd, all_fields, select_lex, ref_pointer_array))
671
Check if there are references to un-aggregated columns when computing
672
aggregate functions with implicit grouping (there is no GROUP BY).
674
MODE_ONLY_FULL_GROUP_BY is enabled here by default
676
if (!group_list && select_lex->full_group_by_flag == (NON_AGG_FIELD_USED | SUM_FUNC_USED))
678
my_message(ER_MIX_OF_GROUP_FUNC_AND_FIELDS,
679
ER(ER_MIX_OF_GROUP_FUNC_AND_FIELDS), MYF(0));
683
/* Caclulate the number of groups */
685
for (ORDER *group_tmp= group_list ; group_tmp ; group_tmp= group_tmp->next)
690
goto err; /* purecov: inspected */
692
if (result && result->prepare(fields_list, unit_arg))
693
goto err; /* purecov: inspected */
695
/* Init join struct */
696
count_field_types(select_lex, &tmp_table_param, all_fields, 0);
697
ref_pointer_array_size= all_fields.elements*sizeof(Item*);
698
this->group= group_list != 0;
701
#ifdef RESTRICTED_GROUP
702
if (sum_func_count && !group_list && (func_count || field_count))
704
my_message(ER_WRONG_SUM_SELECT,ER(ER_WRONG_SUM_SELECT),MYF(0));
708
if (select_lex->olap == ROLLUP_TYPE && rollup_init())
710
if (alloc_func_list())
716
return(-1); /* purecov: inspected */
721
Remove the predicates pushed down into the subquery
724
JOIN::remove_subq_pushed_predicates()
725
where IN Must be NULL
726
OUT The remaining WHERE condition, or NULL
729
Given that this join will be executed using (unique|index)_subquery,
730
without "checking NULL", remove the predicates that were pushed down
733
If the subquery compares scalar values, we can remove the condition that
734
was wrapped into trig_cond (it will be checked when needed by the subquery
737
If the subquery compares row values, we need to keep the wrapped
738
equalities in the WHERE clause: when the left (outer) tuple has both NULL
739
and non-NULL values, we'll do a full table scan and will rely on the
740
equalities corresponding to non-NULL parts of left tuple to filter out
741
non-matching records.
743
TODO: We can remove the equalities that will be guaranteed to be true by the
744
fact that subquery engine will be using index lookup. This must be done only
745
for cases where there are no conversion errors of significance, e.g. 257
746
that is searched in a byte. But this requires homogenization of the return
747
codes of all Field*::store() methods.
750
void JOIN::remove_subq_pushed_predicates(Item **where)
752
if (conds->type() == Item::FUNC_ITEM &&
753
((Item_func *)this->conds)->functype() == Item_func::EQ_FUNC &&
754
((Item_func *)conds)->arguments()[0]->type() == Item::REF_ITEM &&
755
((Item_func *)conds)->arguments()[1]->type() == Item::FIELD_ITEM &&
756
test_if_ref ((Item_field *)((Item_func *)conds)->arguments()[1],
757
((Item_func *)conds)->arguments()[0]))
766
271
Index lookup-based subquery: save some flags for EXPLAIN output
805
Check if the table's rowid is included in the temptable
808
sj_table_is_included()
810
join_tab The table to be checked
813
SemiJoinDuplicateElimination: check the table's rowid should be included
814
in the temptable. This is so if
816
1. The table is not embedded within some semi-join nest
817
2. The has been pulled out of a semi-join nest, or
819
3. The table is functionally dependent on some previous table
821
[4. This is also true for constant tables that can't be
822
NULL-complemented but this function is not called for such tables]
825
true - Include table's rowid
829
static bool sj_table_is_included(JOIN *join, JOIN_TAB *join_tab)
831
if (join_tab->emb_sj_nest)
834
/* Check if this table is functionally dependent on the tables that
835
are within the same outer join nest
837
TABLE_LIST *embedding= join_tab->table->pos_in_table_list->embedding;
838
if (join_tab->type == JT_EQ_REF)
840
Table_map_iterator it(join_tab->ref.depend_map & ~PSEUDO_TABLE_BITS);
842
while ((idx= it.next_bit())!=Table_map_iterator::BITMAP_END)
844
JOIN_TAB *ref_tab= join->join_tab + idx;
845
if (embedding == ref_tab->table->pos_in_table_list->embedding)
848
/* Ok, functionally dependent */
851
/* Not functionally dependent => need to include*/
856
TABLE *create_duplicate_weedout_tmp_table(THD *thd, uint uniq_tuple_length_arg,
857
SJ_TMP_TABLE *sjtbl);
861
Setup the strategies to eliminate semi-join duplicates.
864
setup_semijoin_dups_elimination()
866
options Join options (needed to see if join buffering will be
868
no_jbuf_after Another bit of information re where join buffering will
872
Setup the strategies to eliminate semi-join duplicates. ATM there are 3
875
1. DuplicateWeedout (use of temptable to remove duplicates based on rowids
877
2. FirstMatch (pick only the 1st matching row combination of inner tables)
878
3. InsideOut (scanning the sj-inner table in a way that groups duplicates
879
together and picking the 1st one)
881
The join order has "duplicate-generating ranges", and every range is
882
served by one strategy or a combination of FirstMatch with with some
885
"Duplicate-generating range" is defined as a range within the join order
886
that contains all of the inner tables of a semi-join. All ranges must be
887
disjoint, if tables of several semi-joins are interleaved, then the ranges
888
are joined together, which is equivalent to converting
889
SELECT ... WHERE oe1 IN (SELECT ie1 ...) AND oe2 IN (SELECT ie2 )
891
SELECT ... WHERE (oe1, oe2) IN (SELECT ie1, ie2 ... ...)
894
Applicability conditions are as follows:
896
DuplicateWeedout strategy
897
~~~~~~~~~~~~~~~~~~~~~~~~~
899
(ot|nt)* [ it ((it|ot|nt)* (it|ot))] (nt)*
900
+------+ +=========================+ +---+
903
(1) - Prefix of OuterTables (those that participate in
904
IN-equality and/or are correlated with subquery) and outer
905
Noncorrelated Tables.
906
(2) - The handled range. The range starts with the first sj-inner
907
table, and covers all sj-inner and outer tables
908
Within the range, Inner, Outer, outer Noncorrelated tables
909
may follow in any order.
910
(3) - The suffix of outer Noncorrelated tables.
915
(ot|nt)* [ it ((it|nt)* it) ] (nt)*
916
+------+ +==================+ +---+
919
(1) - Prefix of outer and non-correlated tables
920
(2) - The handled range, which may contain only inner and
921
non-correlated tables.
922
(3) - The suffix of outer Noncorrelated tables.
927
(ot|ct|nt) [ insideout_tbl (ot|nt|it)* it ] (ot|nt)*
928
+--------+ +===========+ +=============+ +------+
931
(1) - Prefix that may contain any outer tables. The prefix must contain
932
all the non-trivially correlated outer tables. (non-trivially means
933
that the correlation is not just through the IN-equality).
935
(2) - Inner table for which the InsideOut scan is performed.
937
(3) - The remainder of the duplicate-generating range. It is served by
938
application of FirstMatch strategy, with the exception that
939
outer IN-correlated tables are considered to be non-correlated.
941
(4) - THe suffix of outer and outer non-correlated tables.
943
If several strategies are applicable, their relative priorities are:
948
This function walks over the join order and sets up the strategies by
949
setting appropriate members in join_tab structures.
953
true Out of memory error
957
int setup_semijoin_dups_elimination(JOIN *join, uint64_t options, uint no_jbuf_after)
959
table_map cur_map= join->const_table_map | PSEUDO_TABLE_BITS;
962
0 - invalid (EOF marker),
964
2 - Temptable (maybe confluent),
965
3 - Temptable with join buffering
968
uint start_idx; /* Left range bound */
969
uint end_idx; /* Right range bound */
971
For Temptable strategy: Bitmap of all outer and correlated tables from
972
all involved join nests.
974
table_map outer_tables;
975
} dups_ranges [MAX_TABLES];
977
TABLE_LIST *emb_insideout_nest= NULL;
978
table_map emb_sj_map= 0; /* A bitmap of sj-nests (that is, their sj-inner
979
tables) whose ranges we're in */
980
table_map emb_outer_tables= 0; /* sj-outer tables for those sj-nests */
981
table_map range_start_map= 0; /* table_map at current range start */
982
bool dealing_with_jbuf= false; /* true <=> table within cur range uses join buf */
987
First pass: locate the duplicate-generating ranges and pick the strategies.
989
for (i=join->const_tables ; i < join->tables ; i++)
991
JOIN_TAB *tab=join->join_tab+i;
992
TABLE *table=tab->table;
993
cur_map |= table->map;
995
if (tab->emb_sj_nest) // Encountered an sj-inner table
999
dups_ranges[cur_range].start_idx= i;
1000
range_start_map= cur_map & ~table->map;
1002
Remember if this is a possible start of range that is covered by
1003
the InsideOut strategy (the reason that it is not covered could
1004
be that it overlaps with anther semi-join's range. we don't
1005
support InsideOut for joined ranges)
1007
if (join->best_positions[i].use_insideout_scan)
1008
emb_insideout_nest= tab->emb_sj_nest;
1011
emb_sj_map |= tab->emb_sj_nest->sj_inner_tables;
1012
emb_outer_tables |= tab->emb_sj_nest->nested_join->sj_depends_on;
1014
if (tab->emb_sj_nest != emb_insideout_nest)
1017
Two different semi-joins interleave. This cannot be handled by
1020
emb_insideout_nest= NULL;
1024
if (emb_sj_map) /* We're in duplicate-generating range */
1026
if (i != join->const_tables && !(options & SELECT_NO_JOIN_CACHE) &&
1027
tab->type == JT_ALL && tab->use_quick != 2 && !tab->first_inner &&
1028
i <= no_jbuf_after && !dealing_with_jbuf)
1031
This table uses join buffering, which makes use of FirstMatch or
1032
InsideOut strategies impossible for the current and (we assume)
1033
preceding duplicate-producing ranges.
1034
That is, for the join order:
1036
x x [ x x] x [x x x] x [x x X* x] x
1038
+-----+ +-----+ | join buffering use
1041
we'll have to remove r1 and r2 and use duplicate-elimination
1042
strategy that spans all the tables, starting from the very 1st
1045
dealing_with_jbuf= true;
1046
emb_insideout_nest= false;
1049
Absorb all preceding duplicate-eliminating ranges. Their strategies
1052
for (int prev_range= 0; prev_range < cur_range; prev_range++)
1054
dups_ranges[cur_range].outer_tables |=
1055
dups_ranges[prev_range].outer_tables;
1057
dups_ranges[0].start_idx= 0; /* Will need to start from the 1st table */
1058
dups_ranges[0].outer_tables= dups_ranges[cur_range].outer_tables;
1063
Check if we are at the end of duplicate-producing range. We are if
1065
1. It's an InsideOut range (which presumes all correlated tables are
1066
in the prefix), and all inner tables are in the join order prefix,
1068
2. It's a DuplicateElimination range (possibly covering several
1069
SJ-nests), and all inner, outer, and correlated tables of all
1070
sj-nests are in the join order prefix.
1072
bool end_of_range= false;
1073
if (emb_insideout_nest &&
1074
bitmap_covers(cur_map, emb_insideout_nest->sj_inner_tables))
1076
/* Save that this range is handled with InsideOut: */
1077
dups_ranges[cur_range].strategy= 1;
1080
else if (bitmap_covers(cur_map, emb_outer_tables | emb_sj_map))
1083
This is a complete range to be handled with either DuplicateWeedout
1086
dups_ranges[cur_range].strategy= dealing_with_jbuf? 3 : 2;
1088
This will hold tables from within the range that need to be put
1089
into the join buffer before we can use the FirstMatch on its tail.
1091
dups_ranges[cur_range].outer_tables= emb_outer_tables &
1098
dups_ranges[cur_range].end_idx= i+1;
1099
emb_sj_map= emb_outer_tables= 0;
1100
emb_insideout_nest= NULL;
1101
dealing_with_jbuf= false;
1102
dups_ranges[++cur_range].strategy= 0;
1107
THD *thd= join->thd;
1108
SJ_TMP_TABLE **next_sjtbl_ptr= &join->sj_tmp_tables;
1110
Second pass: setup the chosen strategies
1112
for (int j= 0; j < cur_range; j++)
1114
JOIN_TAB *tab=join->join_tab + dups_ranges[j].start_idx;
1116
if (dups_ranges[j].strategy == 1) // InsideOut strategy
1118
tab->insideout_match_tab= join->join_tab + dups_ranges[j].end_idx - 1;
1121
else // DuplicateWeedout strategy
1123
SJ_TMP_TABLE::TAB sjtabs[MAX_TABLES];
1124
table_map cur_map= join->const_table_map | PSEUDO_TABLE_BITS;
1125
uint jt_rowid_offset= 0; // # tuple bytes are already occupied (w/o NULL bytes)
1126
uint jt_null_bits= 0; // # null bits in tuple bytes
1127
SJ_TMP_TABLE::TAB *last_tab= sjtabs;
1128
uint rowid_keep_flags= JOIN_TAB::CALL_POSITION | JOIN_TAB::KEEP_ROWID;
1129
JOIN_TAB *last_outer_tab= tab - 1;
1131
Walk through the range and remember
1132
- tables that need their rowids to be put into temptable
1133
- the last outer table
1135
for (; tab < join->join_tab + dups_ranges[j].end_idx; tab++)
1137
if (sj_table_is_included(join, tab))
1139
last_tab->join_tab= tab;
1140
last_tab->rowid_offset= jt_rowid_offset;
1141
jt_rowid_offset += tab->table->file->ref_length;
1142
if (tab->table->maybe_null)
1144
last_tab->null_byte= jt_null_bits / 8;
1145
last_tab->null_bit= jt_null_bits++;
1148
tab->table->prepare_for_position();
1149
tab->rowid_keep_flags= rowid_keep_flags;
1151
cur_map |= tab->table->map;
1152
if (!tab->emb_sj_nest && bitmap_covers(cur_map,
1153
dups_ranges[j].outer_tables))
1154
last_outer_tab= tab;
1157
if (jt_rowid_offset) /* Temptable has at least one rowid */
1159
SJ_TMP_TABLE *sjtbl;
1160
uint tabs_size= (last_tab - sjtabs) * sizeof(SJ_TMP_TABLE::TAB);
1161
if (!(sjtbl= (SJ_TMP_TABLE*)thd->alloc(sizeof(SJ_TMP_TABLE))) ||
1162
!(sjtbl->tabs= (SJ_TMP_TABLE::TAB*) thd->alloc(tabs_size)))
1164
memcpy(sjtbl->tabs, sjtabs, tabs_size);
1165
sjtbl->tabs_end= sjtbl->tabs + (last_tab - sjtabs);
1166
sjtbl->rowid_len= jt_rowid_offset;
1167
sjtbl->null_bits= jt_null_bits;
1168
sjtbl->null_bytes= (jt_null_bits + 7)/8;
1170
*next_sjtbl_ptr= sjtbl;
1171
next_sjtbl_ptr= &(sjtbl->next);
1175
create_duplicate_weedout_tmp_table(thd,
1180
join->join_tab[dups_ranges[j].start_idx].flush_weedout_table= sjtbl;
1181
join->join_tab[dups_ranges[j].end_idx - 1].check_weed_out_table= sjtbl;
1183
tab= last_outer_tab + 1;
1184
jump_to= last_outer_tab;
1187
/* Create the FirstMatch tail */
1188
for (; tab < join->join_tab + dups_ranges[j].end_idx; tab++)
1190
if (tab->emb_sj_nest)
1191
tab->do_firstmatch= jump_to;
1200
static void cleanup_sj_tmp_tables(JOIN *join)
1202
for (SJ_TMP_TABLE *sj_tbl= join->sj_tmp_tables; sj_tbl;
1203
sj_tbl= sj_tbl->next)
1205
if (sj_tbl->tmp_table)
1207
free_tmp_table(join->thd, sj_tbl->tmp_table);
1210
join->sj_tmp_tables= NULL;
1213
uint make_join_orderinfo(JOIN *join);
1216
global select optimisation.
1219
error code saved in field 'error'
1230
// to prevent double initialization on EXPLAIN
1235
thd_proc_info(thd, "optimizing");
1236
row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR :
1237
unit->select_limit_cnt);
1238
/* select_limit is used to decide if we are likely to scan the whole table */
1239
select_limit= unit->select_limit_cnt;
1240
if (having || (select_options & OPTION_FOUND_ROWS))
1241
select_limit= HA_POS_ERROR;
1242
do_send_rows = (unit->select_limit_cnt) ? 1 : 0;
1243
// Ignore errors of execution if option IGNORE present
1244
if (thd->lex->ignore)
1245
thd->lex->current_select->no_error= 1;
1247
#ifdef HAVE_REF_TO_FIELDS // Not done yet
1248
/* Add HAVING to WHERE if possible */
1249
if (having && !group_list && !sum_func_count)
1256
else if ((conds=new Item_cond_and(conds,having)))
1259
Item_cond_and can't be fixed after creation, so we do not check
1262
conds->fix_fields(thd, &conds);
1263
conds->change_ref_to_fields(thd, tables_list);
1264
conds->top_level_item();
1269
SELECT_LEX *sel= thd->lex->current_select;
1270
if (sel->first_cond_optimization)
1273
The following code will allocate the new items in a permanent
1274
MEMROOT for prepared statements and stored procedures.
1276
sel->first_cond_optimization= 0;
1278
/* Convert all outer joins to inner joins if possible */
1279
conds= simplify_joins(this, join_list, conds, true, false);
1280
build_bitmap_for_nested_joins(join_list, 0);
1283
conds= optimize_cond(this, conds, join_list, &cond_value);
1284
if (thd->is_error())
1291
having= optimize_cond(this, having, join_list, &having_value);
1292
if (thd->is_error())
1297
if (select_lex->where)
1298
select_lex->cond_value= cond_value;
1299
if (select_lex->having)
1300
select_lex->having_value= having_value;
1302
if (cond_value == Item::COND_FALSE || having_value == Item::COND_FALSE ||
1303
(!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
1304
{ /* Impossible cond */
1305
zero_result_cause= having_value == Item::COND_FALSE ?
1306
"Impossible HAVING" : "Impossible WHERE";
1312
/* Optimize count(*), min() and max() */
1313
if (tables_list && tmp_table_param.sum_func_count && ! group_list)
1317
opt_sum_query() returns HA_ERR_KEY_NOT_FOUND if no rows match
1318
to the WHERE conditions,
1319
or 1 if all items were resolved,
1320
or 0, or an error number HA_ERR_...
1322
if ((res=opt_sum_query(select_lex->leaf_tables, all_fields, conds)))
1324
if (res == HA_ERR_KEY_NOT_FOUND)
1326
zero_result_cause= "No matching min/max row";
1337
zero_result_cause= "No matching min/max row";
1341
zero_result_cause= "Select tables optimized away";
1342
tables_list= 0; // All tables resolved
1344
Extract all table-independent conditions and replace the WHERE
1345
clause with them. All other conditions were computed by opt_sum_query
1346
and the MIN/MAX/COUNT function(s) have been replaced by constants,
1347
so there is no need to compute the whole WHERE clause again.
1348
Notice that make_cond_for_table() will always succeed to remove all
1349
computed conditions, because opt_sum_query() is applicable only to
1351
Preserve conditions for EXPLAIN.
1353
if (conds && !(thd->lex->describe & DESCRIBE_EXTENDED))
1355
COND *table_independent_conds=
1356
make_cond_for_table(conds, PSEUDO_TABLE_BITS, 0, 0);
1357
conds= table_independent_conds;
1366
error= -1; // Error is sent to client
1367
sort_by_table= get_sort_by_table(order, group_list, select_lex->leaf_tables);
1369
/* Calculate how to do the join */
1370
thd_proc_info(thd, "statistics");
1371
if (make_join_statistics(this, select_lex->leaf_tables, conds, &keyuse) ||
1372
thd->is_fatal_error)
1377
/* Remove distinct if only const tables */
1378
select_distinct= select_distinct && (const_tables != tables);
1379
thd_proc_info(thd, "preparing");
1380
if (result->initialize_tables(this))
1382
return(1); // error == -1
1384
if (const_table_map != found_const_table_map &&
1385
!(select_options & SELECT_DESCRIBE) &&
1387
!(conds->used_tables() & RAND_TABLE_BIT) ||
1388
select_lex->master_unit() == &thd->lex->unit)) // upper level SELECT
1390
zero_result_cause= "no matching row in const table";
1394
if (!(thd->options & OPTION_BIG_SELECTS) &&
1395
best_read > (double) thd->variables.max_join_size &&
1396
!(select_options & SELECT_DESCRIBE))
1397
{ /* purecov: inspected */
1398
my_message(ER_TOO_BIG_SELECT, ER(ER_TOO_BIG_SELECT), MYF(0));
1402
if (const_tables && !thd->locked_tables &&
1403
!(select_options & SELECT_NO_UNLOCK))
1404
mysql_unlock_some_tables(thd, table, const_tables);
1405
if (!conds && outer_join)
1407
/* Handle the case where we have an OUTER JOIN without a WHERE */
1408
conds=new Item_int((int64_t) 1,1); // Always true
1410
select= make_select(*table, const_table_map,
1411
const_table_map, conds, 1, &error);
1413
{ /* purecov: inspected */
1414
error= -1; /* purecov: inspected */
1418
reset_nj_counters(join_list);
1419
make_outerjoin_info(this);
1422
Among the equal fields belonging to the same multiple equality
1423
choose the one that is to be retrieved first and substitute
1424
all references to these in where condition for a reference for
1429
conds= substitute_for_best_equal_field(conds, cond_equal, map2table);
1430
conds->update_used_tables();
1434
Permorm the the optimization on fields evaluation mentioned above
1435
for all on expressions.
1437
for (JOIN_TAB *tab= join_tab + const_tables; tab < join_tab + tables ; tab++)
1439
if (*tab->on_expr_ref)
1441
*tab->on_expr_ref= substitute_for_best_equal_field(*tab->on_expr_ref,
1444
(*tab->on_expr_ref)->update_used_tables();
1448
if (conds &&!outer_join && const_table_map != found_const_table_map &&
1449
(select_options & SELECT_DESCRIBE) &&
1450
select_lex->master_unit() == &thd->lex->unit) // upper level SELECT
1452
conds=new Item_int((int64_t) 0,1); // Always false
1454
if (make_join_select(this, select, conds))
1457
"Impossible WHERE noticed after reading const tables";
1458
return(0); // error == 0
1461
error= -1; /* if goto err */
1463
/* Optimize distinct away if possible */
1465
ORDER *org_order= order;
1466
order=remove_const(this, order,conds,1, &simple_order);
1467
if (thd->is_error())
1474
If we are using ORDER BY NULL or ORDER BY const_expression,
1475
return result in any order (even if we are using a GROUP BY)
1477
if (!order && org_order)
1481
Check if we can optimize away GROUP BY/DISTINCT.
1482
We can do that if there are no aggregate functions, the
1483
fields in DISTINCT clause (if present) and/or columns in GROUP BY
1484
(if present) contain direct references to all key parts of
1485
an unique index (in whatever order) and if the key parts of the
1486
unique index cannot contain NULLs.
1487
Note that the unique keys for DISTINCT and GROUP BY should not
1488
be the same (as long as they are unique).
1490
The FROM clause must contain a single non-constant table.
1492
if (tables - const_tables == 1 && (group_list || select_distinct) &&
1493
!tmp_table_param.sum_func_count &&
1494
(!join_tab[const_tables].select ||
1495
!join_tab[const_tables].select->quick ||
1496
join_tab[const_tables].select->quick->get_type() !=
1497
QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX))
1500
list_contains_unique_index(join_tab[const_tables].table,
1501
find_field_in_order_list,
1502
(void *) group_list))
1505
We have found that grouping can be removed since groups correspond to
1506
only one row anyway, but we still have to guarantee correct result
1507
order. The line below effectively rewrites the query from GROUP BY
1508
<fields> to ORDER BY <fields>. There are two exceptions:
1509
- if skip_sort_order is set (see above), then we can simply skip
1511
- we can only rewrite ORDER BY if the ORDER BY fields are 'compatible'
1512
with the GROUP BY ones, i.e. either one is a prefix of another.
1513
We only check if the ORDER BY is a prefix of GROUP BY. In this case
1514
test_if_subpart() copies the ASC/DESC attributes from the original
1516
If GROUP BY is a prefix of ORDER BY, then it is safe to leave
1519
if (!order || test_if_subpart(group_list, order))
1520
order= skip_sort_order ? 0 : group_list;
1522
If we have an IGNORE INDEX FOR GROUP BY(fields) clause, this must be
1523
rewritten to IGNORE INDEX FOR ORDER BY(fields).
1525
join_tab->table->keys_in_use_for_order_by=
1526
join_tab->table->keys_in_use_for_group_by;
1530
if (select_distinct &&
1531
list_contains_unique_index(join_tab[const_tables].table,
1532
find_field_in_item_list,
1533
(void *) &fields_list))
1538
if (group_list || tmp_table_param.sum_func_count)
1540
if (! hidden_group_fields && rollup.state == ROLLUP::STATE_NONE)
1543
else if (select_distinct && tables - const_tables == 1)
1546
We are only using one table. In this case we change DISTINCT to a
1548
- The GROUP BY can be done through indexes (no sort) and the ORDER
1549
BY only uses selected fields.
1550
(In this case we can later optimize away GROUP BY and ORDER BY)
1551
- We are scanning the whole table without LIMIT
1553
- We are using CALC_FOUND_ROWS
1554
- We are using an ORDER BY that can't be optimized away.
1556
We don't want to use this optimization when we are using LIMIT
1557
because in this case we can just create a temporary table that
1558
holds LIMIT rows and stop when this table is full.
1560
JOIN_TAB *tab= &join_tab[const_tables];
1561
bool all_order_fields_used;
1563
skip_sort_order= test_if_skip_sort_order(tab, order, select_limit, 1,
1564
&tab->table->keys_in_use_for_order_by);
1565
if ((group_list=create_distinct_group(thd, select_lex->ref_pointer_array,
1566
order, fields_list, all_fields,
1567
&all_order_fields_used)))
1569
bool skip_group= (skip_sort_order &&
1570
test_if_skip_sort_order(tab, group_list, select_limit, 1,
1571
&tab->table->keys_in_use_for_group_by) != 0);
1572
count_field_types(select_lex, &tmp_table_param, all_fields, 0);
1573
if ((skip_group && all_order_fields_used) ||
1574
select_limit == HA_POS_ERROR ||
1575
(order && !skip_sort_order))
1577
/* Change DISTINCT to GROUP BY */
1580
if (all_order_fields_used)
1582
if (order && skip_sort_order)
1585
Force MySQL to read the table in sorted order to get result in
1588
tmp_table_param.quick_group=0;
1592
group=1; // For end_write_group
1597
else if (thd->is_fatal_error) // End of memory
1602
ORDER *old_group_list;
1603
group_list= remove_const(this, (old_group_list= group_list), conds,
1604
rollup.state == ROLLUP::STATE_NONE,
1606
if (thd->is_error())
1611
if (old_group_list && !group_list)
1614
if (!group_list && group)
1616
order=0; // The output has only one row
1618
select_distinct= 0; // No need in distinct for 1 row
1619
group_optimized_away= 1;
1622
calc_group_buffer(this, group_list);
1623
send_group_parts= tmp_table_param.group_parts; /* Save org parts */
1625
if (test_if_subpart(group_list, order) ||
1626
(!group_list && tmp_table_param.sum_func_count))
1629
// Can't use sort on head table if using row cache
1639
Check if we need to create a temporary table.
1640
This has to be done if all tables are not already read (const tables)
1641
and one of the following conditions holds:
1642
- We are using DISTINCT (simple distinct's are already optimized away)
1643
- We are using an ORDER BY or GROUP BY on fields not in the first table
1644
- We are using different ORDER BY and GROUP BY orders
1645
- The user wants us to buffer the result.
1647
need_tmp= (const_tables != tables &&
1648
((select_distinct || !simple_order || !simple_group) ||
1649
(group_list && order) ||
1650
test(select_options & OPTION_BUFFER_RESULT)));
1652
uint no_jbuf_after= make_join_orderinfo(this);
1653
uint64_t select_opts_for_readinfo=
1654
(select_options & (SELECT_DESCRIBE | SELECT_NO_JOIN_CACHE)) | (0);
1656
sj_tmp_tables= NULL;
1657
if (!select_lex->sj_nests.is_empty())
1658
setup_semijoin_dups_elimination(this, select_opts_for_readinfo,
1661
// No cache for MATCH == 'Don't use join buffering when we use MATCH'.
1662
if (make_join_readinfo(this, select_opts_for_readinfo, no_jbuf_after))
1665
/* Create all structures needed for materialized subquery execution. */
1666
if (setup_subquery_materialization())
1670
is this simple IN subquery?
1672
if (!group_list && !order &&
1673
unit->item && unit->item->substype() == Item_subselect::IN_SUBS &&
1674
tables == 1 && conds &&
1680
if (join_tab[0].type == JT_EQ_REF &&
1681
join_tab[0].ref.items[0]->name == in_left_expr_name)
1683
remove_subq_pushed_predicates(&where);
1684
save_index_subquery_explain_info(join_tab, where);
1685
join_tab[0].type= JT_UNIQUE_SUBQUERY;
1689
subselect_uniquesubquery_engine(thd,
1694
else if (join_tab[0].type == JT_REF &&
1695
join_tab[0].ref.items[0]->name == in_left_expr_name)
1697
remove_subq_pushed_predicates(&where);
1698
save_index_subquery_explain_info(join_tab, where);
1699
join_tab[0].type= JT_INDEX_SUBQUERY;
1703
subselect_indexsubquery_engine(thd,
1710
} else if (join_tab[0].type == JT_REF_OR_NULL &&
1711
join_tab[0].ref.items[0]->name == in_left_expr_name &&
1712
having->name == in_having_cond)
1714
join_tab[0].type= JT_INDEX_SUBQUERY;
1716
conds= remove_additional_cond(conds);
1717
save_index_subquery_explain_info(join_tab, conds);
1719
change_engine(new subselect_indexsubquery_engine(thd,
1729
Need to tell handlers that to play it safe, it should fetch all
1730
columns of the primary key of the tables: this is because MySQL may
1731
build row pointers for the rows, and for all columns of the primary key
1732
the read set has not necessarily been set by the server code.
1734
if (need_tmp || select_distinct || group_list || order)
1736
for (uint i = const_tables; i < tables; i++)
1737
join_tab[i].table->prepare_for_position();
1740
if (const_tables != tables)
1743
Because filesort always does a full table scan or a quick range scan
1744
we must add the removed reference to the select for the table.
1745
We only need to do this when we have a simple_order or simple_group
1746
as in other cases the join is done before the sort.
1748
if ((order || group_list) &&
1749
(join_tab[const_tables].type != JT_ALL) &&
1750
(join_tab[const_tables].type != JT_REF_OR_NULL) &&
1751
((order && simple_order) || (group_list && simple_group)))
1753
if (add_ref_to_table_cond(thd,&join_tab[const_tables])) {
1758
if (!(select_options & SELECT_BIG_RESULT) &&
1761
!test_if_skip_sort_order(&join_tab[const_tables], group_list,
1762
unit->select_limit_cnt, 0,
1763
&join_tab[const_tables].table->
1764
keys_in_use_for_group_by))) ||
1766
tmp_table_param.quick_group)
1768
need_tmp=1; simple_order=simple_group=0; // Force tmp table without sort
1773
Force using of tmp table if sorting by a SP or UDF function due to
1774
their expensive and probably non-deterministic nature.
1776
for (ORDER *tmp_order= order; tmp_order ; tmp_order=tmp_order->next)
1778
Item *item= *tmp_order->item;
1779
if (item->is_expensive())
1781
/* Force tmp table without sort */
1782
need_tmp=1; simple_order=simple_group=0;
1790
if (select_options & SELECT_DESCRIBE)
1798
The loose index scan access method guarantees that all grouping or
1799
duplicate row elimination (for distinct) is already performed
1800
during data retrieval, and that all MIN/MAX functions are already
1801
computed for each group. Thus all MIN/MAX functions should be
1802
treated as regular functions, and there is no need to perform
1803
grouping in the main execution loop.
1804
Notice that currently loose index scan is applicable only for
1805
single table queries, thus it is sufficient to test only the first
1806
join_tab element of the plan for its access method.
1808
if (join_tab->is_using_loose_index_scan())
1809
tmp_table_param.precomputed_group_by= true;
1811
/* Create a tmp table if distinct or if the sort is too complicated */
1814
thd_proc_info(thd, "Creating tmp table");
1816
init_items_ref_array();
1818
tmp_table_param.hidden_field_count= (all_fields.elements -
1819
fields_list.elements);
1820
ORDER *tmp_group= ((!simple_group && !(test_flags & TEST_NO_KEY_GROUP)) ? group_list :
1823
Pushing LIMIT to the temporary table creation is not applicable
1824
when there is ORDER BY or GROUP BY or there is no GROUP BY, but
1825
there are aggregate functions, because in all these cases we need
1828
ha_rows tmp_rows_limit= ((order == 0 || skip_sort_order) &&
1830
!thd->lex->current_select->with_sum_func) ?
1831
select_limit : HA_POS_ERROR;
1833
if (!(exec_tmp_table1=
1834
create_tmp_table(thd, &tmp_table_param, all_fields,
1836
group_list ? 0 : select_distinct,
1837
group_list && simple_group,
1846
We don't have to store rows in temp table that doesn't match HAVING if:
1847
- we are sorting the table and writing complete group rows to the
1849
- We are using DISTINCT without resolving the distinct as a GROUP BY
1852
If having is not handled here, it will be checked before the row
1853
is sent to the client.
1856
(sort_and_group || (exec_tmp_table1->distinct && !group_list)))
1859
/* if group or order on first table, sort first */
1860
if (group_list && simple_group)
1862
thd_proc_info(thd, "Sorting for group");
1863
if (create_sort_index(thd, this, group_list,
1864
HA_POS_ERROR, HA_POS_ERROR, false) ||
1865
alloc_group_fields(this, group_list) ||
1866
make_sum_func_list(all_fields, fields_list, 1) ||
1867
setup_sum_funcs(thd, sum_funcs))
1875
if (make_sum_func_list(all_fields, fields_list, 0) ||
1876
setup_sum_funcs(thd, sum_funcs))
1881
if (!group_list && ! exec_tmp_table1->distinct && order && simple_order)
1883
thd_proc_info(thd, "Sorting for order");
1884
if (create_sort_index(thd, this, order,
1885
HA_POS_ERROR, HA_POS_ERROR, true))
1894
Optimize distinct when used on some of the tables
1895
SELECT DISTINCT t1.a FROM t1,t2 WHERE t1.b=t2.b
1896
In this case we can stop scanning t2 when we have found one t1.a
1899
if (exec_tmp_table1->distinct)
1901
table_map used_tables= thd->used_tables;
1902
JOIN_TAB *last_join_tab= join_tab+tables-1;
1905
if (used_tables & last_join_tab->table->map)
1907
last_join_tab->not_used_in_distinct=1;
1908
} while (last_join_tab-- != join_tab);
1909
/* Optimize "select distinct b from t1 order by key_part_1 limit #" */
1910
if (order && skip_sort_order)
1912
/* Should always succeed */
1913
if (test_if_skip_sort_order(&join_tab[const_tables],
1914
order, unit->select_limit_cnt, 0,
1915
&join_tab[const_tables].table->
1916
keys_in_use_for_order_by))
1922
If this join belongs to an uncacheable subquery save
1925
if (select_lex->uncacheable && !is_top_level_join() &&
1926
init_save_join_tab())
1927
return(-1); /* purecov: inspected */
1936
Restore values in temporary join.
1938
void JOIN::restore_tmp()
1940
memcpy(tmp_join, this, (size_t) sizeof(JOIN));
1947
unit->offset_limit_cnt= (ha_rows)(select_lex->offset_limit ?
1948
select_lex->offset_limit->val_uint() :
1953
if (exec_tmp_table1)
1955
exec_tmp_table1->file->extra(HA_EXTRA_RESET_STATE);
1956
exec_tmp_table1->file->ha_delete_all_rows();
1957
free_io_cache(exec_tmp_table1);
1958
filesort_free_buffers(exec_tmp_table1,0);
1960
if (exec_tmp_table2)
1962
exec_tmp_table2->file->extra(HA_EXTRA_RESET_STATE);
1963
exec_tmp_table2->file->ha_delete_all_rows();
1964
free_io_cache(exec_tmp_table2);
1965
filesort_free_buffers(exec_tmp_table2,0);
1968
set_items_ref_array(items0);
1971
memcpy(join_tab, join_tab_save, sizeof(JOIN_TAB) * tables);
1976
/* Reset of sum functions */
1979
Item_sum *func, **func_ptr= sum_funcs;
1980
while ((func= *(func_ptr++)))
1988
@brief Save the original join layout
1990
@details Saves the original join layout so it can be reused in
1991
re-execution and for EXPLAIN.
1993
@return Operation status
1995
@retval 1 error occurred.
1999
JOIN::init_save_join_tab()
2001
if (!(tmp_join= (JOIN*)thd->alloc(sizeof(JOIN))))
2002
return 1; /* purecov: inspected */
2003
error= 0; // Ensure that tmp_join.error= 0
2010
JOIN::save_join_tab()
2012
if (!join_tab_save && select_lex->master_unit()->uncacheable)
2014
if (!(join_tab_save= (JOIN_TAB*)thd->memdup((uchar*) join_tab,
2015
sizeof(JOIN_TAB) * tables)))
2026
Note, that create_sort_index calls test_if_skip_sort_order and may
2027
finally replace sorting with index scan if there is a LIMIT clause in
2028
the query. It's never shown in EXPLAIN!
2031
When can we have here thd->net.report_error not zero?
2036
List<Item> *columns_list= &fields_list;
2039
thd_proc_info(thd, "executing");
2041
(void) result->prepare2(); // Currently, this cannot fail.
2043
if (!tables_list && (tables || !select_lex->with_sum_func))
2044
{ // Only test of functions
2045
if (select_options & SELECT_DESCRIBE)
2046
select_describe(this, false, false, false,
2047
(zero_result_cause?zero_result_cause:"No tables used"));
2050
result->send_fields(*columns_list,
2051
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF);
2053
We have to test for 'conds' here as the WHERE may not be constant
2054
even if we don't have any tables for prepared statements or if
2055
conds uses something like 'rand()'.
2057
if (cond_value != Item::COND_FALSE &&
2058
(!conds || conds->val_int()) &&
2059
(!having || having->val_int()))
2061
if (do_send_rows && result->send_data(fields_list))
2065
error= (int) result->send_eof();
2066
send_records= ((select_options & OPTION_FOUND_ROWS) ? 1 :
2067
thd->sent_row_count);
2072
error=(int) result->send_eof();
2076
/* Single select (without union) always returns 0 or 1 row */
2077
thd->limit_found_rows= send_records;
2078
thd->examined_row_count= 0;
2082
Don't reset the found rows count if there're no tables as
2083
FOUND_ROWS() may be called. Never reset the examined row count here.
2084
It must be accumulated from all join iterations of all join parts.
2087
thd->limit_found_rows= 0;
2089
if (zero_result_cause)
2091
(void) return_zero_rows(this, result, select_lex->leaf_tables,
2093
send_row_on_empty_set(),
2100
if ((this->select_lex->options & OPTION_SCHEMA_TABLE) &&
2101
get_schema_tables_result(this, PROCESSED_BY_JOIN_EXEC))
2104
if (select_options & SELECT_DESCRIBE)
2107
Check if we managed to optimize ORDER BY away and don't use temporary
2108
table to resolve ORDER BY: in that case, we only may need to do
2109
filesort for GROUP BY.
2111
if (!order && !no_order && (!skip_sort_order || !need_tmp))
2114
Reset 'order' to 'group_list' and reinit variables describing
2118
simple_order= simple_group;
2122
(order != group_list || !(select_options & SELECT_BIG_RESULT)) &&
2123
(const_tables == tables ||
2124
((simple_order || skip_sort_order) &&
2125
test_if_skip_sort_order(&join_tab[const_tables], order,
2127
&join_tab[const_tables].table->
2128
keys_in_use_for_query))))
2131
select_describe(this, need_tmp,
2132
order != 0 && !skip_sort_order,
2134
!tables ? "No tables used" : NullS);
2138
JOIN *curr_join= this;
2139
List<Item> *curr_all_fields= &all_fields;
2140
List<Item> *curr_fields_list= &fields_list;
2141
TABLE *curr_tmp_table= 0;
2143
Initialize examined rows here because the values from all join parts
2144
must be accumulated in examined_row_count. Hence every join
2145
iteration must count from zero.
2147
curr_join->examined_rows= 0;
2149
/* Create a tmp table if distinct or if the sort is too complicated */
2155
We are in a non cacheable sub query. Get the saved join structure
2157
(curr_join may have been modified during last exection and we need
2160
curr_join= tmp_join;
2162
curr_tmp_table= exec_tmp_table1;
2164
/* Copy data to the temporary table */
2165
thd_proc_info(thd, "Copying to tmp table");
2166
if (!curr_join->sort_and_group &&
2167
curr_join->const_tables != curr_join->tables)
2168
curr_join->join_tab[curr_join->const_tables].sorted= 0;
2169
if ((tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table)))
2174
curr_tmp_table->file->info(HA_STATUS_VARIABLE);
2176
if (curr_join->having)
2177
curr_join->having= curr_join->tmp_having= 0; // Allready done
2179
/* Change sum_fields reference to calculated fields in tmp_table */
2180
curr_join->all_fields= *curr_all_fields;
2183
items1= items0 + all_fields.elements;
2184
if (sort_and_group || curr_tmp_table->group)
2186
if (change_to_use_tmp_fields(thd, items1,
2187
tmp_fields_list1, tmp_all_fields1,
2188
fields_list.elements, all_fields))
2193
if (change_refs_to_tmp_fields(thd, items1,
2194
tmp_fields_list1, tmp_all_fields1,
2195
fields_list.elements, all_fields))
2198
curr_join->tmp_all_fields1= tmp_all_fields1;
2199
curr_join->tmp_fields_list1= tmp_fields_list1;
2200
curr_join->items1= items1;
2202
curr_all_fields= &tmp_all_fields1;
2203
curr_fields_list= &tmp_fields_list1;
2204
curr_join->set_items_ref_array(items1);
2206
if (sort_and_group || curr_tmp_table->group)
2208
curr_join->tmp_table_param.field_count+=
2209
curr_join->tmp_table_param.sum_func_count+
2210
curr_join->tmp_table_param.func_count;
2211
curr_join->tmp_table_param.sum_func_count=
2212
curr_join->tmp_table_param.func_count= 0;
2216
curr_join->tmp_table_param.field_count+=
2217
curr_join->tmp_table_param.func_count;
2218
curr_join->tmp_table_param.func_count= 0;
2221
if (curr_tmp_table->group)
2222
{ // Already grouped
2223
if (!curr_join->order && !curr_join->no_order && !skip_sort_order)
2224
curr_join->order= curr_join->group_list; /* order by group */
2225
curr_join->group_list= 0;
2229
If we have different sort & group then we must sort the data by group
2230
and copy it to another tmp table
2231
This code is also used if we are using distinct something
2232
we haven't been able to store in the temporary table yet
2233
like SEC_TO_TIME(SUM(...)).
2236
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))
2237
{ /* Must copy to another table */
2238
/* Free first data from old join */
2239
curr_join->join_free();
2240
if (make_simple_join(curr_join, curr_tmp_table))
2242
calc_group_buffer(curr_join, group_list);
2243
count_field_types(select_lex, &curr_join->tmp_table_param,
2244
curr_join->tmp_all_fields1,
2245
curr_join->select_distinct && !curr_join->group_list);
2246
curr_join->tmp_table_param.hidden_field_count=
2247
(curr_join->tmp_all_fields1.elements-
2248
curr_join->tmp_fields_list1.elements);
2251
if (exec_tmp_table2)
2252
curr_tmp_table= exec_tmp_table2;
2255
/* group data to new table */
2258
If the access method is loose index scan then all MIN/MAX
2259
functions are precomputed, and should be treated as regular
2260
functions. See extended comment in JOIN::exec.
2262
if (curr_join->join_tab->is_using_loose_index_scan())
2263
curr_join->tmp_table_param.precomputed_group_by= true;
2265
if (!(curr_tmp_table=
2266
exec_tmp_table2= create_tmp_table(thd,
2267
&curr_join->tmp_table_param,
2270
curr_join->select_distinct &&
2271
!curr_join->group_list,
2272
1, curr_join->select_options,
2276
curr_join->exec_tmp_table2= exec_tmp_table2;
2278
if (curr_join->group_list)
2280
thd_proc_info(thd, "Creating sort index");
2281
if (curr_join->join_tab == join_tab && save_join_tab())
2285
if (create_sort_index(thd, curr_join, curr_join->group_list,
2286
HA_POS_ERROR, HA_POS_ERROR, false) ||
2287
make_group_fields(this, curr_join))
2291
sortorder= curr_join->sortorder;
2294
thd_proc_info(thd, "Copying to group table");
2296
if (curr_join != this)
2300
curr_join->sum_funcs= sum_funcs2;
2301
curr_join->sum_funcs_end= sum_funcs_end2;
2305
curr_join->alloc_func_list();
2306
sum_funcs2= curr_join->sum_funcs;
2307
sum_funcs_end2= curr_join->sum_funcs_end;
2310
if (curr_join->make_sum_func_list(*curr_all_fields, *curr_fields_list,
2313
curr_join->group_list= 0;
2314
if (!curr_join->sort_and_group &&
2315
curr_join->const_tables != curr_join->tables)
2316
curr_join->join_tab[curr_join->const_tables].sorted= 0;
2317
if (setup_sum_funcs(curr_join->thd, curr_join->sum_funcs) ||
2318
(tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table)))
2323
end_read_record(&curr_join->join_tab->read_record);
2324
curr_join->const_tables= curr_join->tables; // Mark free for cleanup()
2325
curr_join->join_tab[0].table= 0; // Table is freed
2327
// No sum funcs anymore
2330
items2= items1 + all_fields.elements;
2331
if (change_to_use_tmp_fields(thd, items2,
2332
tmp_fields_list2, tmp_all_fields2,
2333
fields_list.elements, tmp_all_fields1))
2335
curr_join->tmp_fields_list2= tmp_fields_list2;
2336
curr_join->tmp_all_fields2= tmp_all_fields2;
2338
curr_fields_list= &curr_join->tmp_fields_list2;
2339
curr_all_fields= &curr_join->tmp_all_fields2;
2340
curr_join->set_items_ref_array(items2);
2341
curr_join->tmp_table_param.field_count+=
2342
curr_join->tmp_table_param.sum_func_count;
2343
curr_join->tmp_table_param.sum_func_count= 0;
2345
if (curr_tmp_table->distinct)
2346
curr_join->select_distinct=0; /* Each row is unique */
2348
curr_join->join_free(); /* Free quick selects */
2349
if (curr_join->select_distinct && ! curr_join->group_list)
2351
thd_proc_info(thd, "Removing duplicates");
2352
if (curr_join->tmp_having)
2353
curr_join->tmp_having->update_used_tables();
2354
if (remove_duplicates(curr_join, curr_tmp_table,
2355
*curr_fields_list, curr_join->tmp_having))
2357
curr_join->tmp_having=0;
2358
curr_join->select_distinct=0;
2360
curr_tmp_table->reginfo.lock_type= TL_UNLOCK;
2361
if (make_simple_join(curr_join, curr_tmp_table))
2363
calc_group_buffer(curr_join, curr_join->group_list);
2364
count_field_types(select_lex, &curr_join->tmp_table_param,
2365
*curr_all_fields, 0);
2369
if (curr_join->group || curr_join->tmp_table_param.sum_func_count)
2371
if (make_group_fields(this, curr_join))
2378
init_items_ref_array();
2379
items3= ref_pointer_array + (all_fields.elements*4);
2380
setup_copy_fields(thd, &curr_join->tmp_table_param,
2381
items3, tmp_fields_list3, tmp_all_fields3,
2382
curr_fields_list->elements, *curr_all_fields);
2383
tmp_table_param.save_copy_funcs= curr_join->tmp_table_param.copy_funcs;
2384
tmp_table_param.save_copy_field= curr_join->tmp_table_param.copy_field;
2385
tmp_table_param.save_copy_field_end=
2386
curr_join->tmp_table_param.copy_field_end;
2387
curr_join->tmp_all_fields3= tmp_all_fields3;
2388
curr_join->tmp_fields_list3= tmp_fields_list3;
2392
curr_join->tmp_table_param.copy_funcs= tmp_table_param.save_copy_funcs;
2393
curr_join->tmp_table_param.copy_field= tmp_table_param.save_copy_field;
2394
curr_join->tmp_table_param.copy_field_end=
2395
tmp_table_param.save_copy_field_end;
2397
curr_fields_list= &tmp_fields_list3;
2398
curr_all_fields= &tmp_all_fields3;
2399
curr_join->set_items_ref_array(items3);
2401
if (curr_join->make_sum_func_list(*curr_all_fields, *curr_fields_list,
2403
setup_sum_funcs(curr_join->thd, curr_join->sum_funcs) ||
2404
thd->is_fatal_error)
2407
if (curr_join->group_list || curr_join->order)
2409
thd_proc_info(thd, "Sorting result");
2410
/* If we have already done the group, add HAVING to sorted table */
2411
if (curr_join->tmp_having && ! curr_join->group_list &&
2412
! curr_join->sort_and_group)
2414
// Some tables may have been const
2415
curr_join->tmp_having->update_used_tables();
2416
JOIN_TAB *curr_table= &curr_join->join_tab[curr_join->const_tables];
2417
table_map used_tables= (curr_join->const_table_map |
2418
curr_table->table->map);
2420
Item* sort_table_cond= make_cond_for_table(curr_join->tmp_having,
2423
if (sort_table_cond)
2425
if (!curr_table->select)
2426
if (!(curr_table->select= new SQL_SELECT))
2428
if (!curr_table->select->cond)
2429
curr_table->select->cond= sort_table_cond;
2430
else // This should never happen
2432
if (!(curr_table->select->cond=
2433
new Item_cond_and(curr_table->select->cond,
2437
Item_cond_and do not need fix_fields for execution, its parameters
2438
are fixed or do not need fix_fields, too
2440
curr_table->select->cond->quick_fix_field();
2442
curr_table->select_cond= curr_table->select->cond;
2443
curr_table->select_cond->top_level_item();
2444
curr_join->tmp_having= make_cond_for_table(curr_join->tmp_having,
2451
curr_join->select_limit= HA_POS_ERROR;
2455
We can abort sorting after thd->select_limit rows if we there is no
2456
WHERE clause for any tables after the sorted one.
2458
JOIN_TAB *curr_table= &curr_join->join_tab[curr_join->const_tables+1];
2459
JOIN_TAB *end_table= &curr_join->join_tab[curr_join->tables];
2460
for (; curr_table < end_table ; curr_table++)
2463
table->keyuse is set in the case there was an original WHERE clause
2464
on the table that was optimized away.
2466
if (curr_table->select_cond ||
2467
(curr_table->keyuse && !curr_table->first_inner))
2469
/* We have to sort all rows */
2470
curr_join->select_limit= HA_POS_ERROR;
2475
if (curr_join->join_tab == join_tab && save_join_tab())
2480
Here we sort rows for ORDER BY/GROUP BY clause, if the optimiser
2481
chose FILESORT to be faster than INDEX SCAN or there is no
2482
suitable index present.
2483
Note, that create_sort_index calls test_if_skip_sort_order and may
2484
finally replace sorting with index scan if there is a LIMIT clause in
2485
the query. XXX: it's never shown in EXPLAIN!
2486
OPTION_FOUND_ROWS supersedes LIMIT and is taken into account.
2488
if (create_sort_index(thd, curr_join,
2489
curr_join->group_list ?
2490
curr_join->group_list : curr_join->order,
2491
curr_join->select_limit,
2492
(select_options & OPTION_FOUND_ROWS ?
2493
HA_POS_ERROR : unit->select_limit_cnt),
2494
curr_join->group_list ? true : false))
2496
sortorder= curr_join->sortorder;
2497
if (curr_join->const_tables != curr_join->tables &&
2498
!curr_join->join_tab[curr_join->const_tables].table->sort.io_cache)
2501
If no IO cache exists for the first table then we are using an
2502
INDEX SCAN and no filesort. Thus we should not remove the sorted
2503
attribute on the INDEX SCAN.
2509
/* XXX: When can we have here thd->is_error() not zero? */
2510
if (thd->is_error())
2512
error= thd->is_error();
2515
curr_join->having= curr_join->tmp_having;
2516
curr_join->fields= curr_fields_list;
2519
thd_proc_info(thd, "Sending data");
2520
result->send_fields(*curr_fields_list,
2521
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF);
2522
error= do_select(curr_join, curr_fields_list, NULL);
2523
thd->limit_found_rows= curr_join->send_records;
2526
/* Accumulate the counts from all join iterations of all join parts. */
2527
thd->examined_row_count+= curr_join->examined_rows;
2530
With EXPLAIN EXTENDED we have to restore original ref_array
2531
for a derived table which is always materialized.
2532
Otherwise we would not be able to print the query correctly.
2535
(thd->lex->describe & DESCRIBE_EXTENDED) &&
2536
select_lex->linkage == DERIVED_TABLE_TYPE)
2537
set_items_ref_array(items0);
2547
Return error that hold JOIN.
2553
select_lex->join= 0;
2557
if (join_tab != tmp_join->join_tab)
2559
JOIN_TAB *tab, *end;
2560
for (tab= join_tab, end= tab+tables ; tab != end ; tab++)
2563
tmp_join->tmp_join= 0;
2564
tmp_table_param.copy_field=0;
2565
return(tmp_join->destroy());
2570
if (exec_tmp_table1)
2571
free_tmp_table(thd, exec_tmp_table1);
2572
if (exec_tmp_table2)
2573
free_tmp_table(thd, exec_tmp_table2);
2575
delete_dynamic(&keyuse);
2582
306
An entry point to single-unit select (a select without UNION).
2584
@param thd thread handler
308
@param session thread Cursor
2585
309
@param rref_pointer_array a reference to ref_pointer_array of
2586
310
the top-level select_lex for this query
2587
311
@param tables list of all tables used in this query.
2588
312
The tables have been pre-opened.
2589
@param wild_num number of wildcards used in the top level
313
@param wild_num number of wildcards used in the top level
2590
314
select of this query.
2591
315
For example statement
2592
316
SELECT *, t1.*, catalog.t2.* FROM t0, t1, t2;
2765
Convert a subquery predicate into a TABLE_LIST semi-join nest
2768
convert_subq_to_sj()
2769
parent_join Parent join, the one that has subq_pred in its WHERE/ON
2771
subq_pred Subquery predicate to be converted
2774
Convert a subquery predicate into a TABLE_LIST semi-join nest. All the
2775
prerequisites are already checked, so the conversion is always successfull.
2777
Prepared Statements: the transformation is permanent:
2778
- Changes in TABLE_LIST structures are naturally permanent
2779
- Item tree changes are performed on statement MEM_ROOT:
2780
= we activate statement MEM_ROOT
2781
= this function is called before the first fix_prepare_information
2784
This is intended because the criteria for subquery-to-sj conversion remain
2785
constant for the lifetime of the Prepared Statement.
2789
true Out of memory error
2792
bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred)
2794
SELECT_LEX *parent_lex= parent_join->select_lex;
2795
TABLE_LIST *emb_tbl_nest= NULL;
2796
List<TABLE_LIST> *emb_join_list= &parent_lex->top_join_list;
2797
THD *thd= parent_join->thd;
2800
1. Find out where to put the predicate into.
2801
Note: for "t1 LEFT JOIN t2" this will be t2, a leaf.
2803
if ((void*)subq_pred->expr_join_nest != (void*)1)
2805
if (subq_pred->expr_join_nest->nested_join)
2810
... [LEFT] JOIN ( ... ) ON (subquery AND whatever) ...
2812
The sj-nest will be inserted into the brackets nest.
2814
emb_tbl_nest= subq_pred->expr_join_nest;
2815
emb_join_list= &emb_tbl_nest->nested_join->join_list;
2817
else if (!subq_pred->expr_join_nest->outer_join)
2822
... INNER JOIN tblX ON (subquery AND whatever) ...
2824
The sj-nest will be tblX's "sibling", i.e. another child of its
2825
parent. This is ok because tblX is joined as an inner join.
2827
emb_tbl_nest= subq_pred->expr_join_nest->embedding;
2829
emb_join_list= &emb_tbl_nest->nested_join->join_list;
2831
else if (!subq_pred->expr_join_nest->nested_join)
2833
TABLE_LIST *outer_tbl= subq_pred->expr_join_nest;
2834
TABLE_LIST *wrap_nest;
2838
... LEFT JOIN tbl ON (on_expr AND subq_pred) ...
2840
we'll need to convert it into:
2842
... LEFT JOIN ( tbl SJ (subq_tables) ) ON (on_expr AND subq_pred) ...
2844
|<----- wrap_nest ---->|
2846
Q: other subqueries may be pointing to this element. What to do?
2847
A1: simple solution: copy *subq_pred->expr_join_nest= *parent_nest.
2848
But we'll need to fix other pointers.
2849
A2: Another way: have TABLE_LIST::next_ptr so the following
2850
subqueries know the table has been nested.
2851
A3: changes in the TABLE_LIST::outer_join will make everything work
2854
if (!(wrap_nest= alloc_join_nest(parent_join->thd)))
2858
wrap_nest->embedding= outer_tbl->embedding;
2859
wrap_nest->join_list= outer_tbl->join_list;
2860
wrap_nest->alias= (char*) "(sj-wrap)";
2862
wrap_nest->nested_join->join_list.empty();
2863
wrap_nest->nested_join->join_list.push_back(outer_tbl);
2865
outer_tbl->embedding= wrap_nest;
2866
outer_tbl->join_list= &wrap_nest->nested_join->join_list;
2869
wrap_nest will take place of outer_tbl, so move the outer join flag
2872
wrap_nest->outer_join= outer_tbl->outer_join;
2873
outer_tbl->outer_join= 0;
2875
wrap_nest->on_expr= outer_tbl->on_expr;
2876
outer_tbl->on_expr= NULL;
2878
List_iterator<TABLE_LIST> li(*wrap_nest->join_list);
2882
if (tbl == outer_tbl)
2884
li.replace(wrap_nest);
2889
Ok now wrap_nest 'contains' outer_tbl and we're ready to add the
2890
semi-join nest into it
2892
emb_join_list= &wrap_nest->nested_join->join_list;
2893
emb_tbl_nest= wrap_nest;
2897
TABLE_LIST *sj_nest;
2898
NESTED_JOIN *nested_join;
2899
if (!(sj_nest= alloc_join_nest(parent_join->thd)))
2903
nested_join= sj_nest->nested_join;
2905
sj_nest->join_list= emb_join_list;
2906
sj_nest->embedding= emb_tbl_nest;
2907
sj_nest->alias= (char*) "(sj-nest)";
2908
/* Nests do not participate in those 'chains', so: */
2909
/* sj_nest->next_leaf= sj_nest->next_local= sj_nest->next_global == NULL*/
2910
emb_join_list->push_back(sj_nest);
2913
nested_join->used_tables and nested_join->not_null_tables are
2914
initialized in simplify_joins().
2918
2. Walk through subquery's top list and set 'embedding' to point to the
2921
st_select_lex *subq_lex= subq_pred->unit->first_select();
2922
nested_join->join_list.empty();
2923
List_iterator_fast<TABLE_LIST> li(subq_lex->top_join_list);
2924
TABLE_LIST *tl, *last_leaf;
2927
tl->embedding= sj_nest;
2928
tl->join_list= &nested_join->join_list;
2929
nested_join->join_list.push_back(tl);
2933
Reconnect the next_leaf chain.
2934
TODO: Do we have to put subquery's tables at the end of the chain?
2935
Inserting them at the beginning would be a bit faster.
2936
NOTE: We actually insert them at the front! That's because the order is
2937
reversed in this list.
2939
for (tl= parent_lex->leaf_tables; tl->next_leaf; tl= tl->next_leaf) {};
2940
tl->next_leaf= subq_lex->leaf_tables;
2944
Same as above for next_local chain
2945
(a theory: a next_local chain always starts with ::leaf_tables
2946
because view's tables are inserted after the view)
2948
for (tl= parent_lex->leaf_tables; tl->next_local; tl= tl->next_local) {};
2949
tl->next_local= subq_lex->leaf_tables;
2951
/* A theory: no need to re-connect the next_global chain */
2953
/* 3. Remove the original subquery predicate from the WHERE/ON */
2955
// The subqueries were replaced for Item_int(1) earlier
2956
subq_pred->exec_method= Item_in_subselect::SEMI_JOIN; // for subsequent executions
2957
/*TODO: also reset the 'with_subselect' there. */
2959
/* n. Adjust the parent_join->tables counter */
2960
uint table_no= parent_join->tables;
2961
/* n. Walk through child's tables and adjust table->map */
2962
for (tl= subq_lex->leaf_tables; tl; tl= tl->next_leaf, table_no++)
2964
tl->table->tablenr= table_no;
2965
tl->table->map= ((table_map)1) << table_no;
2966
SELECT_LEX *old_sl= tl->select_lex;
2967
tl->select_lex= parent_join->select_lex;
2968
for(TABLE_LIST *emb= tl->embedding; emb && emb->select_lex == old_sl; emb= emb->embedding)
2969
emb->select_lex= parent_join->select_lex;
2971
parent_join->tables += subq_lex->join->tables;
2974
Put the subquery's WHERE into semi-join's sj_on_expr
2975
Add the subquery-induced equalities too.
2977
SELECT_LEX *save_lex= thd->lex->current_select;
2978
thd->lex->current_select=subq_lex;
2979
if (!subq_pred->left_expr->fixed &&
2980
subq_pred->left_expr->fix_fields(thd, &subq_pred->left_expr))
2982
thd->lex->current_select=save_lex;
2984
sj_nest->nested_join->sj_corr_tables= subq_pred->used_tables();
2985
sj_nest->nested_join->sj_depends_on= subq_pred->used_tables() |
2986
subq_pred->left_expr->used_tables();
2987
sj_nest->sj_on_expr= subq_lex->where;
2990
Create the IN-equalities and inject them into semi-join's ON expression.
2991
Additionally, for InsideOut strategy
2992
- Record the number of IN-equalities.
2993
- Create list of pointers to (oe1, ..., ieN). We'll need the list to
2994
see which of the expressions are bound and which are not (for those
2995
we'll produce a distinct stream of (ie_i1,...ie_ik).
2997
(TODO: can we just create a list of pointers and hope the expressions
2998
will not substitute themselves on fix_fields()? or we need to wrap
2999
them into Item_direct_view_refs and store pointers to those. The
3000
pointers to Item_direct_view_refs are guaranteed to be stable as
3001
Item_direct_view_refs doesn't substitute itself with anything in
3002
Item_direct_view_ref::fix_fields.
3004
sj_nest->sj_in_exprs= subq_pred->left_expr->cols();
3005
sj_nest->nested_join->sj_outer_expr_list.empty();
3007
if (subq_pred->left_expr->cols() == 1)
3009
nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr);
3011
Item *item_eq= new Item_func_eq(subq_pred->left_expr,
3012
subq_lex->ref_pointer_array[0]);
3013
item_eq->name= (char*)subq_sj_cond_name;
3014
sj_nest->sj_on_expr= and_items(sj_nest->sj_on_expr, item_eq);
3018
for (uint i= 0; i < subq_pred->left_expr->cols(); i++)
3020
nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr->
3023
new Item_func_eq(subq_pred->left_expr->element_index(i),
3024
subq_lex->ref_pointer_array[i]);
3025
item_eq->name= (char*)subq_sj_cond_name + (i % 64);
3026
sj_nest->sj_on_expr= and_items(sj_nest->sj_on_expr, item_eq);
3029
/* Fix the created equality and AND */
3030
sj_nest->sj_on_expr->fix_fields(parent_join->thd, &sj_nest->sj_on_expr);
3033
Walk through sj nest's WHERE and ON expressions and call
3034
item->fix_table_changes() for all items.
3036
sj_nest->sj_on_expr->fix_after_pullout(parent_lex, &sj_nest->sj_on_expr);
3037
fix_list_after_tbl_changes(parent_lex, &sj_nest->nested_join->join_list);
3040
/* Unlink the child select_lex so it doesn't show up in EXPLAIN: */
3041
subq_lex->master_unit()->exclude_level();
3043
/* Inject sj_on_expr into the parent's WHERE or ON */
3046
emb_tbl_nest->on_expr= and_items(emb_tbl_nest->on_expr,
3047
sj_nest->sj_on_expr);
3048
emb_tbl_nest->on_expr->fix_fields(parent_join->thd, &emb_tbl_nest->on_expr);
3052
/* Inject into the WHERE */
3053
parent_join->conds= and_items(parent_join->conds, sj_nest->sj_on_expr);
3054
parent_join->conds->fix_fields(parent_join->thd, &parent_join->conds);
3055
parent_join->select_lex->where= parent_join->conds;
3063
Convert candidate subquery predicates to semi-joins
3066
JOIN::flatten_subqueries()
3069
Convert candidate subquery predicates to semi-joins.
3076
bool JOIN::flatten_subqueries()
3078
Item_in_subselect **in_subq;
3079
Item_in_subselect **in_subq_end;
3081
if (sj_subselects.elements() == 0)
3084
/* 1. Fix children subqueries */
3085
for (in_subq= sj_subselects.front(), in_subq_end= sj_subselects.back();
3086
in_subq != in_subq_end; in_subq++)
3088
JOIN *child_join= (*in_subq)->unit->first_select()->join;
3089
child_join->outer_tables = child_join->tables;
3090
if (child_join->flatten_subqueries())
3092
(*in_subq)->sj_convert_priority=
3093
(*in_subq)->is_correlated * MAX_TABLES + child_join->outer_tables;
3096
//dump_TABLE_LIST_struct(select_lex, select_lex->leaf_tables);
3098
2. Pick which subqueries to convert:
3099
sort the subquery array
3100
- prefer correlated subqueries over uncorrelated;
3101
- prefer subqueries that have greater number of outer tables;
3103
sj_subselects.sort(subq_sj_candidate_cmp);
3104
// #tables-in-parent-query + #tables-in-subquery < MAX_TABLES
3105
/* Replace all subqueries to be flattened with Item_int(1) */
3106
for (in_subq= sj_subselects.front();
3107
in_subq != in_subq_end &&
3108
tables + ((*in_subq)->sj_convert_priority % MAX_TABLES) < MAX_TABLES;
3111
if (replace_where_subcondition(this, *in_subq, new Item_int(1), false))
3115
for (in_subq= sj_subselects.front();
3116
in_subq != in_subq_end &&
3117
tables + ((*in_subq)->sj_convert_priority % MAX_TABLES) < MAX_TABLES;
3120
if (convert_subq_to_sj(this, *in_subq))
3124
/* 3. Finalize those we didn't convert */
3125
for (; in_subq!= in_subq_end; in_subq++)
3127
JOIN *child_join= (*in_subq)->unit->first_select()->join;
3128
Item_subselect::trans_res res;
3129
(*in_subq)->changed= 0;
3130
(*in_subq)->fixed= 0;
3131
res= (*in_subq)->select_transformer(child_join);
3132
if (res == Item_subselect::RES_ERROR)
3135
(*in_subq)->changed= 1;
3136
(*in_subq)->fixed= 1;
3138
Item *substitute= (*in_subq)->substitution;
3139
bool do_fix_fields= !(*in_subq)->substitution->fixed;
3140
if (replace_where_subcondition(this, *in_subq, substitute, do_fix_fields))
3143
//if ((*in_subq)->fix_fields(thd, (*in_subq)->ref_ptr))
3146
sj_subselects.clear();
3152
Setup for execution all subqueries of a query, for which the optimizer
3153
chose hash semi-join.
3155
@details Iterate over all subqueries of the query, and if they are under an
3156
IN predicate, and the optimizer chose to compute it via hash semi-join:
3157
- try to initialize all data structures needed for the materialized execution
3158
of the IN predicate,
3159
- if this fails, then perform the IN=>EXISTS transformation which was
3160
previously blocked during JOIN::prepare.
3162
This method is part of the "code generation" query processing phase.
3164
This phase must be called after substitute_for_best_equal_field() because
3165
that function may replace items with other items from a multiple equality,
3166
and we need to reference the correct items in the index access method of the
3169
@return Operation status
3170
@retval false success.
3171
@retval true error occurred.
3174
bool JOIN::setup_subquery_materialization()
3176
for (SELECT_LEX_UNIT *un= select_lex->first_inner_unit(); un;
3177
un= un->next_unit())
3179
for (SELECT_LEX *sl= un->first_select(); sl; sl= sl->next_select())
3181
Item_subselect *subquery_predicate= sl->master_unit()->item;
3182
if (subquery_predicate &&
3183
subquery_predicate->substype() == Item_subselect::IN_SUBS)
3185
Item_in_subselect *in_subs= (Item_in_subselect*) subquery_predicate;
3186
if (in_subs->exec_method == Item_in_subselect::MATERIALIZATION &&
3187
in_subs->setup_engine())
3197
Check if table's KEYUSE elements have an eq_ref(outer_tables) candidate
3200
find_eq_ref_candidate()
3201
table Table to be checked
3202
sj_inner_tables Bitmap of inner tables. eq_ref(inner_table) doesn't
3206
Check if table's KEYUSE elements have an eq_ref(outer_tables) candidate
3209
Check again if it is feasible to factor common parts with constant table
3213
true - There exists an eq_ref(outer-tables) candidate
3217
bool find_eq_ref_candidate(TABLE *table, table_map sj_inner_tables)
3219
KEYUSE *keyuse= table->reginfo.join_tab->keyuse;
3224
while (1) /* For each key */
3227
KEY *keyinfo= table->key_info + key;
3228
key_part_map bound_parts= 0;
3229
if ((keyinfo->flags & HA_NOSAME) == HA_NOSAME)
3231
do /* For all equalities on all key parts */
3233
/* Check if this is "t.keypart = expr(outer_tables) */
3234
if (!(keyuse->used_tables & sj_inner_tables) &&
3235
!(keyuse->optimize & KEY_OPTIMIZE_REF_OR_NULL))
3237
bound_parts |= 1 << keyuse->keypart;
3240
} while (keyuse->key == key && keyuse->table == table);
3242
if (bound_parts == PREV_BITS(uint, keyinfo->key_parts))
3244
if (keyuse->table != table)
3252
if (keyuse->table != table)
3255
while (keyuse->key == key);
3264
Pull tables out of semi-join nests, if possible
3267
pull_out_semijoin_tables()
3268
join The join where to do the semi-join flattening
3271
Try to pull tables out of semi-join nests.
3274
When this function is called, the join may have several semi-join nests
3275
(possibly within different semi-join nests), but it is guaranteed that
3276
one semi-join nest does not contain another.
3279
A table can be pulled out of the semi-join nest if
3280
- It is a constant table
3284
* Pulled out tables have JOIN_TAB::emb_sj_nest == NULL (like the outer
3286
* Tables that were not pulled out have JOIN_TAB::emb_sj_nest.
3287
* Semi-join nests TABLE_LIST::sj_inner_tables
3289
This operation is (and should be) performed at each PS execution since
3290
tables may become/cease to be constant across PS reexecutions.
3294
1 - Out of memory error
3297
int pull_out_semijoin_tables(JOIN *join)
3299
TABLE_LIST *sj_nest;
3300
List_iterator<TABLE_LIST> sj_list_it(join->select_lex->sj_nests);
3302
/* Try pulling out of the each of the semi-joins */
3303
while ((sj_nest= sj_list_it++))
3305
/* Action #1: Mark the constant tables to be pulled out */
3306
table_map pulled_tables= 0;
3308
List_iterator<TABLE_LIST> child_li(sj_nest->nested_join->join_list);
3310
while ((tbl= child_li++))
3314
tbl->table->reginfo.join_tab->emb_sj_nest= sj_nest;
3315
if (tbl->table->map & join->const_table_map)
3317
pulled_tables |= tbl->table->map;
3323
Action #2: Find which tables we can pull out based on
3324
update_ref_and_keys() data. Note that pulling one table out can allow
3325
us to pull out some other tables too.
3327
bool pulled_a_table;
3330
pulled_a_table= false;
3332
while ((tbl= child_li++))
3334
if (tbl->table && !(pulled_tables & tbl->table->map))
3336
if (find_eq_ref_candidate(tbl->table,
3337
sj_nest->nested_join->used_tables &
3340
pulled_a_table= true;
3341
pulled_tables |= tbl->table->map;
3345
} while (pulled_a_table);
3348
if ((sj_nest)->nested_join->used_tables == pulled_tables)
3350
(sj_nest)->sj_inner_tables= 0;
3351
while ((tbl= child_li++))
3354
tbl->table->reginfo.join_tab->emb_sj_nest= NULL;
3359
/* Record the bitmap of inner tables, mark the inner tables */
3360
table_map inner_tables=(sj_nest)->nested_join->used_tables &
3362
(sj_nest)->sj_inner_tables= inner_tables;
3363
while ((tbl= child_li++))
3367
if (inner_tables & tbl->table->map)
3368
tbl->table->reginfo.join_tab->emb_sj_nest= (sj_nest);
3370
tbl->table->reginfo.join_tab->emb_sj_nest= NULL;
3378
462
/*****************************************************************************
3379
Create JOIN_TABS, make a guess about the table types,
463
Create JoinTableS, make a guess about the table types,
3380
464
Approximate how many records will be used in each table
3381
465
*****************************************************************************/
3384
static ha_rows get_quick_record_count(THD *thd, SQL_SELECT *select,
3386
const key_map *keys,ha_rows limit)
466
ha_rows get_quick_record_count(Session *session, optimizer::SqlSelect *select, Table *table, const key_map *keys,ha_rows limit)
3389
if (check_stack_overrun(thd, STACK_MIN_SIZE, NULL))
469
if (check_stack_overrun(session, STACK_MIN_SIZE, NULL))
3390
470
return(0); // Fatal error flag is set
3393
473
select->head=table;
3394
474
table->reginfo.impossible_range=0;
3395
if ((error= select->test_quick_select(thd, *(key_map *)keys,(table_map) 0,
475
if ((error= select->test_quick_select(session, *(key_map *)keys,(table_map) 0,
3396
476
limit, 0, false)) == 1)
3397
477
return(select->quick->records);
3398
478
if (error == -1)
3404
484
return(HA_POS_ERROR); /* This shouldn't happend */
3408
This structure is used to collect info on potentially sargable
3409
predicates in order to check whether they become sargable after
3410
reading const tables.
3411
We form a bitmap of indexes that can be used for sargable predicates.
3412
Only such indexes are involved in range analysis.
3414
typedef struct st_sargable_param
3416
Field *field; /* field against which to check sargability */
3417
Item **arg_value; /* values of potential keys for lookups */
3418
uint num_values; /* number of values in the above array */
3422
Calculate the best possible join and initialize the join structure.
3431
make_join_statistics(JOIN *join, TABLE_LIST *tables, COND *conds,
3432
DYNAMIC_ARRAY *keyuse_array)
3436
uint i,table_count,const_count,key;
3437
table_map found_const_table_map, all_table_map, found_ref, refs;
3438
key_map const_ref, eq_part;
3439
TABLE **table_vector;
3440
JOIN_TAB *stat,*stat_end,*s,**stat_ref;
3441
KEYUSE *keyuse,*start_keyuse;
3442
table_map outer_join=0;
3443
SARGABLE_PARAM *sargables= 0;
3444
JOIN_TAB *stat_vector[MAX_TABLES+1];
3446
table_count=join->tables;
3447
stat=(JOIN_TAB*) join->thd->calloc(sizeof(JOIN_TAB)*table_count);
3448
stat_ref=(JOIN_TAB**) join->thd->alloc(sizeof(JOIN_TAB*)*MAX_TABLES);
3449
table_vector=(TABLE**) join->thd->alloc(sizeof(TABLE*)*(table_count*2));
3450
if (!stat || !stat_ref || !table_vector)
3451
return(1); // Eom /* purecov: inspected */
3453
join->best_ref=stat_vector;
3455
stat_end=stat+table_count;
3456
found_const_table_map= all_table_map=0;
3461
s++, tables= tables->next_leaf, i++)
3463
TABLE_LIST *embedding= tables->embedding;
3466
s->const_keys.init();
3467
s->checked_keys.init();
3468
s->needed_reg.init();
3469
table_vector[i]=s->table=table=tables->table;
3470
table->pos_in_table_list= tables;
3471
error= table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
3474
table->file->print_error(error, MYF(0));
3477
table->quick_keys.clear_all();
3478
table->reginfo.join_tab=s;
3479
table->reginfo.not_exists_optimize=0;
3480
bzero((char*) table->const_key_parts, sizeof(key_part_map)*table->s->keys);
3481
all_table_map|= table->map;
3483
s->info=0; // For describe
3485
s->dependent= tables->dep_tables;
3486
s->key_dependent= 0;
3487
if (tables->schema_table)
3488
table->file->stats.records= 2;
3489
table->quick_condition_rows= table->file->stats.records;
3491
s->on_expr_ref= &tables->on_expr;
3492
if (*s->on_expr_ref)
3494
/* s is the only inner table of an outer join */
3495
if (!table->file->stats.records && !embedding)
3497
s->dependent= 0; // Ignore LEFT JOIN depend.
3498
set_position(join,const_count++,s,(KEYUSE*) 0);
3501
outer_join|= table->map;
3502
s->embedding_map= 0;
3503
for (;embedding; embedding= embedding->embedding)
3504
s->embedding_map|= embedding->nested_join->nj_map;
3507
if (embedding && !(embedding->sj_on_expr && ! embedding->embedding))
3509
/* s belongs to a nested join, maybe to several embedded joins */
3510
s->embedding_map= 0;
3513
NESTED_JOIN *nested_join= embedding->nested_join;
3514
s->embedding_map|=nested_join->nj_map;
3515
s->dependent|= embedding->dep_tables;
3516
embedding= embedding->embedding;
3517
outer_join|= nested_join->used_tables;
3522
if ((table->s->system || table->file->stats.records <= 1) &&
3524
(table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT) && !join->no_const_tables)
3526
set_position(join,const_count++,s,(KEYUSE*) 0);
3530
join->outer_join=outer_join;
3532
if (join->outer_join)
3535
Build transitive closure for relation 'to be dependent on'.
3536
This will speed up the plan search for many cases with outer joins,
3537
as well as allow us to catch illegal cross references/
3538
Warshall's algorithm is used to build the transitive closure.
3539
As we use bitmaps to represent the relation the complexity
3540
of the algorithm is O((number of tables)^2).
3542
for (i= 0, s= stat ; i < table_count ; i++, s++)
3544
for (uint j= 0 ; j < table_count ; j++)
3546
table= stat[j].table;
3547
if (s->dependent & table->map)
3548
s->dependent |= table->reginfo.join_tab->dependent;
3551
s->table->maybe_null= 1;
3553
/* Catch illegal cross references for outer joins */
3554
for (i= 0, s= stat ; i < table_count ; i++, s++)
3556
if (s->dependent & s->table->map)
3558
join->tables=0; // Don't use join->table
3559
my_message(ER_WRONG_OUTER_JOIN, ER(ER_WRONG_OUTER_JOIN), MYF(0));
3562
s->key_dependent= s->dependent;
3566
if (conds || outer_join)
3567
if (update_ref_and_keys(join->thd, keyuse_array, stat, join->tables,
3568
conds, join->cond_equal,
3569
~outer_join, join->select_lex, &sargables))
3572
/* Read tables with 0 or 1 rows (system tables) */
3573
join->const_table_map= 0;
3575
for (POSITION *p_pos=join->positions, *p_end=p_pos+const_count;
3582
join->const_table_map|=s->table->map;
3583
if ((tmp=join_read_const_table(s, p_pos)))
3586
return(1); // Fatal error
3589
found_const_table_map|= s->table->map;
3592
/* loop until no more const tables are found */
3596
more_const_tables_found:
3601
We only have to loop from stat_vector + const_count as
3602
set_position() will move all const_tables first in stat_vector
3605
for (JOIN_TAB **pos=stat_vector+const_count ; (s= *pos) ; pos++)
3610
If equi-join condition by a key is null rejecting and after a
3611
substitution of a const table the key value happens to be null
3612
then we can state that there are no matches for this equi-join.
3614
if ((keyuse= s->keyuse) && *s->on_expr_ref && !s->embedding_map)
3617
When performing an outer join operation if there are no matching rows
3618
for the single row of the outer table all the inner tables are to be
3619
null complemented and thus considered as constant tables.
3620
Here we apply this consideration to the case of outer join operations
3621
with a single inner table only because the case with nested tables
3622
would require a more thorough analysis.
3623
TODO. Apply single row substitution to null complemented inner tables
3624
for nested outer join operations.
3626
while (keyuse->table == table)
3628
if (!(keyuse->val->used_tables() & ~join->const_table_map) &&
3629
keyuse->val->is_null() && keyuse->null_rejecting)
3632
mark_as_null_row(table);
3633
found_const_table_map|= table->map;
3634
join->const_table_map|= table->map;
3635
set_position(join,const_count++,s,(KEYUSE*) 0);
3636
goto more_const_tables_found;
3642
if (s->dependent) // If dependent on some table
3644
// All dep. must be constants
3645
if (s->dependent & ~(found_const_table_map))
3647
if (table->file->stats.records <= 1L &&
3648
(table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT) &&
3649
!table->pos_in_table_list->embedding)
3653
join->const_table_map|=table->map;
3654
set_position(join,const_count++,s,(KEYUSE*) 0);
3655
if ((tmp= join_read_const_table(s, join->positions+const_count-1)))
3658
return(1); // Fatal error
3661
found_const_table_map|= table->map;
3665
/* check if table can be read by key or table only uses const refs */
3666
if ((keyuse=s->keyuse))
3669
while (keyuse->table == table)
3671
start_keyuse=keyuse;
3673
s->keys.set_bit(key); // QQ: remove this ?
3676
const_ref.clear_all();
3677
eq_part.clear_all();
3680
if (keyuse->val->type() != Item::NULL_ITEM && !keyuse->optimize)
3682
if (!((~found_const_table_map) & keyuse->used_tables))
3683
const_ref.set_bit(keyuse->keypart);
3685
refs|=keyuse->used_tables;
3686
eq_part.set_bit(keyuse->keypart);
3689
} while (keyuse->table == table && keyuse->key == key);
3691
if (eq_part.is_prefix(table->key_info[key].key_parts) &&
3692
!table->pos_in_table_list->embedding)
3694
if ((table->key_info[key].flags & (HA_NOSAME))
3697
if (const_ref == eq_part)
3698
{ // Found everything for ref.
3702
join->const_table_map|=table->map;
3703
set_position(join,const_count++,s,start_keyuse);
3704
if (create_ref_for_key(join, s, start_keyuse,
3705
found_const_table_map))
3707
if ((tmp=join_read_const_table(s,
3708
join->positions+const_count-1)))
3711
return(1); // Fatal error
3714
found_const_table_map|= table->map;
3718
found_ref|= refs; // Table is const if all refs are const
3720
else if (const_ref == eq_part)
3721
s->const_keys.set_bit(key);
3726
} while (join->const_table_map & found_ref && ref_changed);
3729
Update info on indexes that can be used for search lookups as
3730
reading const tables may has added new sargable predicates.
3732
if (const_count && sargables)
3734
for( ; sargables->field ; sargables++)
3736
Field *field= sargables->field;
3737
JOIN_TAB *join_tab= field->table->reginfo.join_tab;
3738
key_map possible_keys= field->key_start;
3739
possible_keys.intersect(field->table->keys_in_use_for_query);
3741
for (uint j=0; j < sargables->num_values; j++)
3742
is_const&= sargables->arg_value[j]->const_item();
3744
join_tab[0].const_keys.merge(possible_keys);
3748
if (pull_out_semijoin_tables(join))
3751
/* Calc how many (possible) matched records in each table */
3753
for (s=stat ; s < stat_end ; s++)
3755
if (s->type == JT_SYSTEM || s->type == JT_CONST)
3757
/* Only one matching row */
3758
s->found_records=s->records=s->read_time=1; s->worst_seeks=1.0;
3761
/* Approximate found rows and time to read them */
3762
s->found_records=s->records=s->table->file->stats.records;
3763
s->read_time=(ha_rows) s->table->file->scan_time();
3766
Set a max range of how many seeks we can expect when using keys
3767
This is can't be to high as otherwise we are likely to use
3770
s->worst_seeks= min((double) s->found_records / 10,
3771
(double) s->read_time*3);
3772
if (s->worst_seeks < 2.0) // Fix for small tables
3776
Add to stat->const_keys those indexes for which all group fields or
3777
all select distinct fields participate in one index.
3779
add_group_and_distinct_keys(join, s);
3781
if (!s->const_keys.is_clear_all() &&
3782
!s->table->pos_in_table_list->embedding)
3786
select= make_select(s->table, found_const_table_map,
3787
found_const_table_map,
3788
*s->on_expr_ref ? *s->on_expr_ref : conds,
3792
records= get_quick_record_count(join->thd, select, s->table,
3793
&s->const_keys, join->row_limit);
3794
s->quick=select->quick;
3795
s->needed_reg=select->needed_reg;
3797
if (records == 0 && s->table->reginfo.impossible_range)
3800
Impossible WHERE or ON expression
3801
In case of ON, we mark that the we match one empty NULL row.
3802
In case of WHERE, don't set found_const_table_map to get the
3803
caller to abort with a zero row result.
3805
join->const_table_map|= s->table->map;
3806
set_position(join,const_count++,s,(KEYUSE*) 0);
3808
if (*s->on_expr_ref)
3810
/* Generate empty row */
3811
s->info= "Impossible ON condition";
3812
found_const_table_map|= s->table->map;
3814
mark_as_null_row(s->table); // All fields are NULL
3817
if (records != HA_POS_ERROR)
3819
s->found_records=records;
3820
s->read_time= (ha_rows) (s->quick ? s->quick->read_time : 0.0);
3826
join->join_tab=stat;
3827
join->map2table=stat_ref;
3828
join->table= join->all_tables=table_vector;
3829
join->const_tables=const_count;
3830
join->found_const_table_map=found_const_table_map;
3832
/* Find an optimal join order of the non-constant tables. */
3833
if (join->const_tables != join->tables)
3835
optimize_keyuse(join, keyuse_array);
3836
if (choose_plan(join, all_table_map & ~join->const_table_map))
3841
memcpy((uchar*) join->best_positions,(uchar*) join->positions,
3842
sizeof(POSITION)*join->const_tables);
3843
join->best_read=1.0;
3845
/* Generate an execution plan from the found optimal join order. */
3846
return(join->thd->killed || get_best_combination(join));
3850
487
/*****************************************************************************
3851
488
Check with keys are used and with tables references with tables
3852
489
Updates in stat:
3855
492
keyuse Pointer to possible keys
3856
493
*****************************************************************************/
3858
/// Used when finding key fields
3859
typedef struct key_field_t {
3861
Item *val; ///< May be empty if diff constant
3863
uint optimize; // KEY_OPTIMIZE_*
3866
If true, the condition this struct represents will not be satisfied
3869
bool null_rejecting;
3870
bool *cond_guard; /* See KEYUSE::cond_guard */
3871
uint sj_pred_no; /* See KEYUSE::sj_pred_no */
3875
Merge new key definitions to old ones, remove those not used in both.
3877
This is called for OR between different levels.
3879
To be able to do 'ref_or_null' we merge a comparison of a column
3880
and 'column IS NULL' to one test. This is useful for sub select queries
3881
that are internally transformed to something like:.
3884
SELECT * FROM t1 WHERE t1.key=outer_ref_field or t1.key IS NULL
3887
KEY_FIELD::null_rejecting is processed as follows: @n
3888
result has null_rejecting=true if it is set for both ORed references.
3890
- (t2.key = t1.field OR t2.key = t1.field) -> null_rejecting=true
3891
- (t2.key = t1.field OR t2.key <=> t1.field) -> null_rejecting=false
3894
The result of this is that we're missing some 'ref' accesses.
3895
OptimizerTeam: Fix this
3899
merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end,
3902
if (start == new_fields)
3903
return start; // Impossible or
3904
if (new_fields == end)
3905
return start; // No new fields, skip all
3907
KEY_FIELD *first_free=new_fields;
3909
/* Mark all found fields in old array */
3910
for (; new_fields != end ; new_fields++)
3912
for (KEY_FIELD *old=start ; old != first_free ; old++)
3914
if (old->field == new_fields->field)
3917
NOTE: below const_item() call really works as "!used_tables()", i.e.
3918
it can return false where it is feasible to make it return true.
3920
The cause is as follows: Some of the tables are already known to be
3921
const tables (the detection code is in make_join_statistics(),
3922
above the update_ref_and_keys() call), but we didn't propagate
3923
information about this: TABLE::const_table is not set to true, and
3924
Item::update_used_tables() hasn't been called for each item.
3925
The result of this is that we're missing some 'ref' accesses.
3926
TODO: OptimizerTeam: Fix this
3928
if (!new_fields->val->const_item())
3931
If the value matches, we can use the key reference.
3932
If not, we keep it until we have examined all new values
3934
if (old->val->eq(new_fields->val, old->field->binary()))
3936
old->level= and_level;
3937
old->optimize= ((old->optimize & new_fields->optimize &
3938
KEY_OPTIMIZE_EXISTS) |
3939
((old->optimize | new_fields->optimize) &
3940
KEY_OPTIMIZE_REF_OR_NULL));
3941
old->null_rejecting= (old->null_rejecting &&
3942
new_fields->null_rejecting);
3945
else if (old->eq_func && new_fields->eq_func &&
3946
old->val->eq_by_collation(new_fields->val,
3947
old->field->binary(),
3948
old->field->charset()))
3951
old->level= and_level;
3952
old->optimize= ((old->optimize & new_fields->optimize &
3953
KEY_OPTIMIZE_EXISTS) |
3954
((old->optimize | new_fields->optimize) &
3955
KEY_OPTIMIZE_REF_OR_NULL));
3956
old->null_rejecting= (old->null_rejecting &&
3957
new_fields->null_rejecting);
3959
else if (old->eq_func && new_fields->eq_func &&
3960
((old->val->const_item() && old->val->is_null()) ||
3961
new_fields->val->is_null()))
3963
/* field = expression OR field IS NULL */
3964
old->level= and_level;
3965
old->optimize= KEY_OPTIMIZE_REF_OR_NULL;
3967
Remember the NOT NULL value unless the value does not depend
3970
if (!old->val->used_tables() && old->val->is_null())
3971
old->val= new_fields->val;
3972
/* The referred expression can be NULL: */
3973
old->null_rejecting= 0;
3978
We are comparing two different const. In this case we can't
3979
use a key-lookup on this so it's better to remove the value
3980
and let the range optimzier handle it
3982
if (old == --first_free) // If last item
3984
*old= *first_free; // Remove old value
3985
old--; // Retry this value
3990
/* Remove all not used items */
3991
for (KEY_FIELD *old=start ; old != first_free ;)
3993
if (old->level != and_level)
3994
{ // Not used in all levels
3995
if (old == --first_free)
3997
*old= *first_free; // Remove old value
4007
Add a possible key to array of possible keys if it's usable as a key
4009
@param key_fields Pointer to add key, if usable
4010
@param and_level And level, to be stored in KEY_FIELD
4011
@param cond Condition predicate
4012
@param field Field used in comparision
4013
@param eq_func True if we used =, <=> or IS NULL
4014
@param value Value used for comparison with field
4015
@param usable_tables Tables which can be used for key optimization
4016
@param sargables IN/OUT Array of found sargable candidates
4019
If we are doing a NOT NULL comparison on a NOT NULL field in a outer join
4020
table, we store this to be able to do not exists optimization later.
4023
*key_fields is incremented if we stored a key in the array
4027
add_key_field(KEY_FIELD **key_fields,uint and_level, Item_func *cond,
4028
Field *field, bool eq_func, Item **value, uint num_values,
4029
table_map usable_tables, SARGABLE_PARAM **sargables)
4031
uint exists_optimize= 0;
4032
if (!(field->flags & PART_KEY_FLAG))
4034
// Don't remove column IS NULL on a LEFT JOIN table
4035
if (!eq_func || (*value)->type() != Item::NULL_ITEM ||
4036
!field->table->maybe_null || field->null_ptr)
4037
return; // Not a key. Skip it
4038
exists_optimize= KEY_OPTIMIZE_EXISTS;
4039
assert(num_values == 1);
4043
table_map used_tables=0;
4045
for (uint i=0; i<num_values; i++)
4047
used_tables|=(value[i])->used_tables();
4048
if (!((value[i])->used_tables() & (field->table->map | RAND_TABLE_BIT)))
4053
if (!(usable_tables & field->table->map))
4055
if (!eq_func || (*value)->type() != Item::NULL_ITEM ||
4056
!field->table->maybe_null || field->null_ptr)
4057
return; // Can't use left join optimize
4058
exists_optimize= KEY_OPTIMIZE_EXISTS;
4062
JOIN_TAB *stat=field->table->reginfo.join_tab;
4063
key_map possible_keys=field->key_start;
4064
possible_keys.intersect(field->table->keys_in_use_for_query);
4065
stat[0].keys.merge(possible_keys); // Add possible keys
4068
Save the following cases:
4070
Field LIKE constant where constant doesn't start with a wildcard
4071
Field = field2 where field2 is in a different table
4078
stat[0].key_dependent|=used_tables;
4081
for (uint i=0; i<num_values; i++)
4083
if (!(is_const&= value[i]->const_item()))
4087
stat[0].const_keys.merge(possible_keys);
4091
Save info to be able check whether this predicate can be
4092
considered as sargable for range analisis after reading const tables.
4093
We do not save info about equalities as update_const_equal_items
4094
will take care of updating info on keys from sargable equalities.
4097
(*sargables)->field= field;
4098
(*sargables)->arg_value= value;
4099
(*sargables)->num_values= num_values;
4102
We can't always use indexes when comparing a string index to a
4103
number. cmp_type() is checked to allow compare of dates to numbers.
4104
eq_func is NEVER true when num_values > 1
4109
Additional optimization: if we're processing
4110
"t.key BETWEEN c1 AND c1" then proceed as if we were processing
4112
TODO: This is a very limited fix. A more generic fix is possible.
4113
There are 2 options:
4114
A) Make equality propagation code be able to handle BETWEEN
4115
(including cases like t1.key BETWEEN t2.key AND t3.key)
4116
B) Make range optimizer to infer additional "t.key = c" equalities
4117
and use them in equality propagation process (see details in
4120
if ((cond->functype() != Item_func::BETWEEN) ||
4121
((Item_func_between*) cond)->negated ||
4122
!value[0]->eq(value[1], field->binary()))
4127
if (field->result_type() == STRING_RESULT)
4129
if ((*value)->result_type() != STRING_RESULT)
4131
if (field->cmp_type() != (*value)->result_type())
4137
We can't use indexes if the effective collation
4138
of the operation differ from the field collation.
4140
if (field->cmp_type() == STRING_RESULT &&
4141
((Field_str*)field)->charset() != cond->compare_collation())
4148
For the moment eq_func is always true. This slot is reserved for future
4149
extensions where we want to remembers other things than just eq comparisons
4152
/* Store possible eq field */
4153
(*key_fields)->field= field;
4154
(*key_fields)->eq_func= eq_func;
4155
(*key_fields)->val= *value;
4156
(*key_fields)->level= and_level;
4157
(*key_fields)->optimize= exists_optimize;
4159
If the condition has form "tbl.keypart = othertbl.field" and
4160
othertbl.field can be NULL, there will be no matches if othertbl.field
4162
We use null_rejecting in add_not_null_conds() to add
4163
'othertbl.field IS NOT NULL' to tab->select_cond.
4165
(*key_fields)->null_rejecting= ((cond->functype() == Item_func::EQ_FUNC ||
4166
cond->functype() == Item_func::MULT_EQUAL_FUNC) &&
4167
((*value)->type() == Item::FIELD_ITEM) &&
4168
((Item_field*)*value)->field->maybe_null());
4169
(*key_fields)->cond_guard= NULL;
4170
(*key_fields)->sj_pred_no= (cond->name >= subq_sj_cond_name &&
4171
cond->name < subq_sj_cond_name + 64)?
4172
cond->name - subq_sj_cond_name: UINT_MAX;
4177
Add possible keys to array of possible keys originated from a simple
4180
@param key_fields Pointer to add key, if usable
4181
@param and_level And level, to be stored in KEY_FIELD
4182
@param cond Condition predicate
4183
@param field Field used in comparision
4184
@param eq_func True if we used =, <=> or IS NULL
4185
@param value Value used for comparison with field
4186
Is NULL for BETWEEN and IN
4187
@param usable_tables Tables which can be used for key optimization
4188
@param sargables IN/OUT Array of found sargable candidates
4191
If field items f1 and f2 belong to the same multiple equality and
4192
a key is added for f1, the the same key is added for f2.
4195
*key_fields is incremented if we stored a key in the array
4199
add_key_equal_fields(KEY_FIELD **key_fields, uint and_level,
4200
Item_func *cond, Item_field *field_item,
4201
bool eq_func, Item **val,
4202
uint num_values, table_map usable_tables,
4203
SARGABLE_PARAM **sargables)
4205
Field *field= field_item->field;
4206
add_key_field(key_fields, and_level, cond, field,
4207
eq_func, val, num_values, usable_tables, sargables);
4208
Item_equal *item_equal= field_item->item_equal;
4212
Add to the set of possible key values every substitution of
4213
the field for an equal field included into item_equal
4215
Item_equal_iterator it(*item_equal);
4217
while ((item= it++))
4219
if (!field->eq(item->field))
4221
add_key_field(key_fields, and_level, cond, item->field,
4222
eq_func, val, num_values, usable_tables,
4230
add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
4231
COND *cond, table_map usable_tables,
4232
SARGABLE_PARAM **sargables)
4234
if (cond->type() == Item_func::COND_ITEM)
4236
List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list());
4237
KEY_FIELD *org_key_fields= *key_fields;
4239
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
4243
add_key_fields(join, key_fields, and_level, item, usable_tables,
4245
for (; org_key_fields != *key_fields ; org_key_fields++)
4246
org_key_fields->level= *and_level;
4251
add_key_fields(join, key_fields, and_level, li++, usable_tables,
4256
KEY_FIELD *start_key_fields= *key_fields;
4258
add_key_fields(join, key_fields, and_level, item, usable_tables,
4260
*key_fields=merge_key_fields(org_key_fields,start_key_fields,
4261
*key_fields,++(*and_level));
4268
Subquery optimization: Conditions that are pushed down into subqueries
4269
are wrapped into Item_func_trig_cond. We process the wrapped condition
4270
but need to set cond_guard for KEYUSE elements generated from it.
4273
if (cond->type() == Item::FUNC_ITEM &&
4274
((Item_func*)cond)->functype() == Item_func::TRIG_COND_FUNC)
4276
Item *cond_arg= ((Item_func*)cond)->arguments()[0];
4277
if (!join->group_list && !join->order &&
4279
join->unit->item->substype() == Item_subselect::IN_SUBS &&
4280
!join->unit->is_union())
4282
KEY_FIELD *save= *key_fields;
4283
add_key_fields(join, key_fields, and_level, cond_arg, usable_tables,
4285
// Indicate that this ref access candidate is for subquery lookup:
4286
for (; save != *key_fields; save++)
4287
save->cond_guard= ((Item_func_trig_cond*)cond)->get_trig_var();
4293
/* If item is of type 'field op field/constant' add it to key_fields */
4294
if (cond->type() != Item::FUNC_ITEM)
4296
Item_func *cond_func= (Item_func*) cond;
4297
switch (cond_func->select_optimize()) {
4298
case Item_func::OPTIMIZE_NONE:
4300
case Item_func::OPTIMIZE_KEY:
4304
if (cond_func->key_item()->real_item()->type() == Item::FIELD_ITEM &&
4305
!(cond_func->used_tables() & OUTER_REF_TABLE_BIT))
4307
values= cond_func->arguments()+1;
4308
if (cond_func->functype() == Item_func::NE_FUNC &&
4309
cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM &&
4310
!(cond_func->arguments()[0]->used_tables() & OUTER_REF_TABLE_BIT))
4312
assert(cond_func->functype() != Item_func::IN_FUNC ||
4313
cond_func->argument_count() != 2);
4314
add_key_equal_fields(key_fields, *and_level, cond_func,
4315
(Item_field*) (cond_func->key_item()->real_item()),
4317
cond_func->argument_count()-1,
4318
usable_tables, sargables);
4320
if (cond_func->functype() == Item_func::BETWEEN)
4322
values= cond_func->arguments();
4323
for (uint i= 1 ; i < cond_func->argument_count() ; i++)
4325
Item_field *field_item;
4326
if (cond_func->arguments()[i]->real_item()->type() == Item::FIELD_ITEM
4328
!(cond_func->arguments()[i]->used_tables() & OUTER_REF_TABLE_BIT))
4330
field_item= (Item_field *) (cond_func->arguments()[i]->real_item());
4331
add_key_equal_fields(key_fields, *and_level, cond_func,
4332
field_item, 0, values, 1, usable_tables,
4339
case Item_func::OPTIMIZE_OP:
4341
bool equal_func=(cond_func->functype() == Item_func::EQ_FUNC ||
4342
cond_func->functype() == Item_func::EQUAL_FUNC);
4344
if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM &&
4345
!(cond_func->arguments()[0]->used_tables() & OUTER_REF_TABLE_BIT))
4347
add_key_equal_fields(key_fields, *and_level, cond_func,
4348
(Item_field*) (cond_func->arguments()[0])->real_item(),
4350
cond_func->arguments()+1, 1, usable_tables,
4353
if (cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM &&
4354
cond_func->functype() != Item_func::LIKE_FUNC &&
4355
!(cond_func->arguments()[1]->used_tables() & OUTER_REF_TABLE_BIT))
4357
add_key_equal_fields(key_fields, *and_level, cond_func,
4358
(Item_field*) (cond_func->arguments()[1])->real_item(),
4360
cond_func->arguments(),1,usable_tables,
4365
case Item_func::OPTIMIZE_NULL:
4366
/* column_name IS [NOT] NULL */
4367
if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM &&
4368
!(cond_func->used_tables() & OUTER_REF_TABLE_BIT))
4370
Item *tmp=new Item_null;
4371
if (unlikely(!tmp)) // Should never be true
4373
add_key_equal_fields(key_fields, *and_level, cond_func,
4374
(Item_field*) (cond_func->arguments()[0])->real_item(),
4375
cond_func->functype() == Item_func::ISNULL_FUNC,
4376
&tmp, 1, usable_tables, sargables);
4379
case Item_func::OPTIMIZE_EQUAL:
4380
Item_equal *item_equal= (Item_equal *) cond;
4381
Item *const_item= item_equal->get_const();
4382
Item_equal_iterator it(*item_equal);
4387
For each field field1 from item_equal consider the equality
4388
field1=const_item as a condition allowing an index access of the table
4389
with field1 by the keys value of field1.
4391
while ((item= it++))
4393
add_key_field(key_fields, *and_level, cond_func, item->field,
4394
true, &const_item, 1, usable_tables, sargables);
4400
Consider all pairs of different fields included into item_equal.
4401
For each of them (field1, field1) consider the equality
4402
field1=field2 as a condition allowing an index access of the table
4403
with field1 by the keys value of field2.
4405
Item_equal_iterator fi(*item_equal);
4406
while ((item= fi++))
4408
Field *field= item->field;
4409
while ((item= it++))
4411
if (!field->eq(item->field))
4413
add_key_field(key_fields, *and_level, cond_func, field,
4414
true, (Item **) &item, 1, usable_tables,
4426
497
Add all keys with uses 'field' for some keypart.
4428
499
If field->and_level != and_level then only mark key_part as const_part.
4432
max_part_bit(key_part_map bits)
501
uint32_t max_part_bit(key_part_map bits)
4435
504
for (found=0; bits & 1 ; found++,bits>>=1) ;
4440
add_key_part(DYNAMIC_ARRAY *keyuse_array,KEY_FIELD *key_field)
4442
Field *field=key_field->field;
4443
TABLE *form= field->table;
4446
if (key_field->eq_func && !(key_field->optimize & KEY_OPTIMIZE_EXISTS))
4448
for (uint key=0 ; key < form->s->keys ; key++)
4450
if (!(form->keys_in_use_for_query.is_set(key)))
4453
uint key_parts= (uint) form->key_info[key].key_parts;
4454
for (uint part=0 ; part < key_parts ; part++)
4456
if (field->eq(form->key_info[key].key_part[part].field))
4458
keyuse.table= field->table;
4459
keyuse.val = key_field->val;
4461
keyuse.keypart=part;
4462
keyuse.keypart_map= (key_part_map) 1 << part;
4463
keyuse.used_tables=key_field->val->used_tables();
4464
keyuse.optimize= key_field->optimize & KEY_OPTIMIZE_REF_OR_NULL;
4465
keyuse.null_rejecting= key_field->null_rejecting;
4466
keyuse.cond_guard= key_field->cond_guard;
4467
keyuse.sj_pred_no= key_field->sj_pred_no;
4468
VOID(insert_dynamic(keyuse_array,(uchar*) &keyuse));
4476
sort_keyuse(KEYUSE *a,KEYUSE *b)
508
static int sort_keyuse(optimizer::KeyUse *a, optimizer::KeyUse *b)
4479
if (a->table->tablenr != b->table->tablenr)
4480
return (int) (a->table->tablenr - b->table->tablenr);
4481
if (a->key != b->key)
4482
return (int) (a->key - b->key);
4483
if (a->keypart != b->keypart)
4484
return (int) (a->keypart - b->keypart);
511
if (a->getTable()->tablenr != b->getTable()->tablenr)
512
return static_cast<int>((a->getTable()->tablenr - b->getTable()->tablenr));
513
if (a->getKey() != b->getKey())
514
return static_cast<int>((a->getKey() - b->getKey()));
515
if (a->getKeypart() != b->getKeypart())
516
return static_cast<int>((a->getKeypart() - b->getKeypart()));
4485
517
// Place const values before other ones
4486
if ((res= test((a->used_tables & ~OUTER_REF_TABLE_BIT)) -
4487
test((b->used_tables & ~OUTER_REF_TABLE_BIT))))
518
if ((res= test((a->getUsedTables() & ~OUTER_REF_TABLE_BIT)) -
519
test((b->getUsedTables() & ~OUTER_REF_TABLE_BIT))))
4489
521
/* Place rows that are not 'OPTIMIZE_REF_OR_NULL' first */
4490
return (int) ((a->optimize & KEY_OPTIMIZE_REF_OR_NULL) -
4491
(b->optimize & KEY_OPTIMIZE_REF_OR_NULL));
4496
Add to KEY_FIELD array all 'ref' access candidates within nested join.
4498
This function populates KEY_FIELD array with entries generated from the
4499
ON condition of the given nested join, and does the same for nested joins
4500
contained within this nested join.
4502
@param[in] nested_join_table Nested join pseudo-table to process
4503
@param[in,out] end End of the key field array
4504
@param[in,out] and_level And-level
4505
@param[in,out] sargables Array of found sargable candidates
4509
We can add accesses to the tables that are direct children of this nested
4510
join (1), and are not inner tables w.r.t their neighbours (2).
4512
Example for #1 (outer brackets pair denotes nested join this function is
4515
... LEFT JOIN (t1 LEFT JOIN (t2 ... ) ) ON cond
4519
... LEFT JOIN (t1 LEFT JOIN t2 ) ON cond
4521
In examples 1-2 for condition cond, we can add 'ref' access candidates to
4525
... LEFT JOIN (t1, t2 LEFT JOIN t3 ON inner_cond) ON cond
4527
Here we can add 'ref' access candidates for t1 and t2, but not for t3.
4530
static void add_key_fields_for_nj(JOIN *join, TABLE_LIST *nested_join_table,
4531
KEY_FIELD **end, uint *and_level,
4532
SARGABLE_PARAM **sargables)
4534
List_iterator<TABLE_LIST> li(nested_join_table->nested_join->join_list);
4535
List_iterator<TABLE_LIST> li2(nested_join_table->nested_join->join_list);
4536
bool have_another = false;
4537
table_map tables= 0;
4539
assert(nested_join_table->nested_join);
4541
while ((table= li++) || (have_another && (li=li2, have_another=false,
4544
if (table->nested_join)
4546
if (!table->on_expr)
4548
/* It's a semi-join nest. Walk into it as if it wasn't a nest */
4551
li= List_iterator<TABLE_LIST>(table->nested_join->join_list);
4554
add_key_fields_for_nj(join, table, end, and_level, sargables);
4557
if (!table->on_expr)
4558
tables |= table->table->map;
4560
if (nested_join_table->on_expr)
4561
add_key_fields(join, end, and_level, nested_join_table->on_expr, tables,
522
return static_cast<int>(((a->getOptimizeFlags() & KEY_OPTIMIZE_REF_OR_NULL) -
523
(b->getOptimizeFlags() & KEY_OPTIMIZE_REF_OR_NULL)));
4567
528
Update keyuse array with all possible keys we can use to fetch rows.
4570
@param[out] keyuse Put here ordered array of KEYUSE structures
531
@param[out] keyuse Put here ordered array of KeyUse structures
4571
532
@param join_tab Array in tablenr_order
4572
533
@param tables Number of tables in join
4573
534
@param cond WHERE condition (note that the function analyzes
4826
779
/* Intersect the keys of all group fields. */
4827
780
cur_item= indexed_fields_it++;
4828
possible_keys.merge(cur_item->field->part_of_key);
781
possible_keys|= cur_item->field->part_of_key;
4829
782
while ((cur_item= indexed_fields_it++))
4831
possible_keys.intersect(cur_item->field->part_of_key);
4834
if (!possible_keys.is_clear_all())
4835
join_tab->const_keys.merge(possible_keys);
4839
/*****************************************************************************
4840
Go through all combinations of not marked tables and find the one
4841
which uses least records
4842
*****************************************************************************/
4844
/** Save const tables first as used tables. */
4847
set_position(JOIN *join,uint idx,JOIN_TAB *table,KEYUSE *key)
4849
join->positions[idx].table= table;
4850
join->positions[idx].key=key;
4851
join->positions[idx].records_read=1.0; /* This is a const table */
4852
join->positions[idx].ref_depend_map= 0;
4854
/* Move the const table as down as possible in best_ref */
4855
JOIN_TAB **pos=join->best_ref+idx+1;
4856
JOIN_TAB *next=join->best_ref[idx];
4857
for (;next != table ; pos++)
4859
JOIN_TAB *tmp=pos[0];
4863
join->best_ref[idx]=table;
4868
Given a semi-join nest, find out which of the IN-equalities are bound
4871
get_bound_sj_equalities()
4872
sj_nest Semi-join nest
4873
remaining_tables Tables that are not yet bound
4876
Given a semi-join nest, find out which of the IN-equalities have their
4877
left part expression bound (i.e. the said expression doesn't refer to
4878
any of remaining_tables and can be evaluated).
4881
Bitmap of bound IN-equalities.
4884
uint64_t get_bound_sj_equalities(TABLE_LIST *sj_nest,
4885
table_map remaining_tables)
4887
List_iterator<Item> li(sj_nest->nested_join->sj_outer_expr_list);
4891
while ((item= li++))
4894
Q: should this take into account equality propagation and how?
4895
A: If e->outer_side is an Item_field, walk over the equality
4896
class and see if there is an element that is bound?
4897
(this is an optional feature)
4899
if (!(item->used_tables() & remaining_tables))
4909
Find the best access path for an extension of a partial execution
4910
plan and add this path to the plan.
4912
The function finds the best access path to table 's' from the passed
4913
partial plan where an access path is the general term for any means to
4914
access the data in 's'. An access path may use either an index or a scan,
4915
whichever is cheaper. The input partial plan is passed via the array
4916
'join->positions' of length 'idx'. The chosen access method for 's' and its
4917
cost are stored in 'join->positions[idx]'.
4919
@param join pointer to the structure providing all context info
4921
@param s the table to be joined by the function
4922
@param thd thread for the connection that submitted the query
4923
@param remaining_tables set of tables not included into the partial plan yet
4924
@param idx the length of the partial plan
4925
@param record_count estimate for the number of records returned by the
4927
@param read_time the cost of the partial plan
4934
best_access_path(JOIN *join,
4937
table_map remaining_tables,
4939
double record_count,
4940
double read_time __attribute__((unused)))
4942
KEYUSE *best_key= 0;
4943
uint best_max_key_part= 0;
4944
bool found_constraint= 0;
4945
double best= DBL_MAX;
4946
double best_time= DBL_MAX;
4947
double records= DBL_MAX;
4948
table_map best_ref_depends_map= 0;
4951
uint best_is_sj_inside_out= 0;
4954
{ /* Use key if possible */
4955
TABLE *table= s->table;
4956
KEYUSE *keyuse,*start_key=0;
4957
double best_records= DBL_MAX;
4958
uint max_key_part=0;
4959
uint64_t bound_sj_equalities= 0;
4960
bool try_sj_inside_out= false;
4962
Discover the bound equalites. We need to do this, if
4963
1. The next table is an SJ-inner table, and
4964
2. It is the first table from that semijoin, and
4965
3. We're not within a semi-join range (i.e. all semi-joins either have
4966
all or none of their tables in join_table_map), except
4967
s->emb_sj_nest (which we've just entered).
4968
3. All correlation references from this sj-nest are bound
4970
if (s->emb_sj_nest && // (1)
4971
s->emb_sj_nest->sj_in_exprs < 64 &&
4972
((remaining_tables & s->emb_sj_nest->sj_inner_tables) == // (2)
4973
s->emb_sj_nest->sj_inner_tables) && // (2)
4974
join->cur_emb_sj_nests == s->emb_sj_nest->sj_inner_tables && // (3)
4975
!(remaining_tables & s->emb_sj_nest->nested_join->sj_corr_tables)) // (4)
4977
/* This table is an InsideOut scan candidate */
4978
bound_sj_equalities= get_bound_sj_equalities(s->emb_sj_nest,
4980
try_sj_inside_out= true;
4983
/* Test how we can use keys */
4984
rec= s->records/MATCHING_ROWS_IN_OTHER_TABLE; // Assumed records/key
4985
for (keyuse=s->keyuse ; keyuse->table == table ;)
4987
key_part_map found_part= 0;
4988
table_map found_ref= 0;
4989
uint key= keyuse->key;
4990
KEY *keyinfo= table->key_info+key;
4991
/* Bitmap of keyparts where the ref access is over 'keypart=const': */
4992
key_part_map const_part= 0;
4993
/* The or-null keypart in ref-or-null access: */
4994
key_part_map ref_or_null_part= 0;
4996
/* Calculate how many key segments of the current key we can use */
4998
uint64_t handled_sj_equalities=0;
4999
key_part_map sj_insideout_map= 0;
5001
do /* For each keypart */
5003
uint keypart= keyuse->keypart;
5004
table_map best_part_found_ref= 0;
5005
double best_prev_record_reads= DBL_MAX;
5007
do /* For each way to access the keypart */
5011
if 1. expression doesn't refer to forward tables
5012
2. we won't get two ref-or-null's
5014
if (!(remaining_tables & keyuse->used_tables) &&
5015
!(ref_or_null_part && (keyuse->optimize &
5016
KEY_OPTIMIZE_REF_OR_NULL)))
5018
found_part|= keyuse->keypart_map;
5019
if (!(keyuse->used_tables & ~join->const_table_map))
5020
const_part|= keyuse->keypart_map;
5022
double tmp2= prev_record_reads(join, idx, (found_ref |
5023
keyuse->used_tables));
5024
if (tmp2 < best_prev_record_reads)
5026
best_part_found_ref= keyuse->used_tables & ~join->const_table_map;
5027
best_prev_record_reads= tmp2;
5029
if (rec > keyuse->ref_table_rows)
5030
rec= keyuse->ref_table_rows;
5032
If there is one 'key_column IS NULL' expression, we can
5033
use this ref_or_null optimisation of this field
5035
if (keyuse->optimize & KEY_OPTIMIZE_REF_OR_NULL)
5036
ref_or_null_part |= keyuse->keypart_map;
5039
if (try_sj_inside_out && keyuse->sj_pred_no != UINT_MAX)
5041
if (!(remaining_tables & keyuse->used_tables))
5042
bound_sj_equalities |= 1ULL << keyuse->sj_pred_no;
5045
handled_sj_equalities |= 1ULL << keyuse->sj_pred_no;
5046
sj_insideout_map |= ((key_part_map)1) << keyuse->keypart;
5051
} while (keyuse->table == table && keyuse->key == key &&
5052
keyuse->keypart == keypart);
5053
found_ref|= best_part_found_ref;
5054
} while (keyuse->table == table && keyuse->key == key);
5057
Assume that that each key matches a proportional part of table.
5059
if (!found_part && !handled_sj_equalities)
5060
continue; // Nothing usable found
5062
if (rec < MATCHING_ROWS_IN_OTHER_TABLE)
5063
rec= MATCHING_ROWS_IN_OTHER_TABLE; // Fix for small tables
5065
bool sj_inside_out_scan= false;
5067
found_constraint= 1;
5069
Check if InsideOut scan is applicable:
5070
1. All IN-equalities are either "bound" or "handled"
5071
2. Index keyparts are
5074
if (try_sj_inside_out &&
5075
table->covering_keys.is_set(key) &&
5076
(handled_sj_equalities | bound_sj_equalities) == // (1)
5077
PREV_BITS(uint64_t, s->emb_sj_nest->sj_in_exprs)) // (1)
5079
uint n_fixed_parts= max_part_bit(found_part);
5080
if (n_fixed_parts != keyinfo->key_parts &&
5081
(PREV_BITS(uint, n_fixed_parts) | sj_insideout_map) ==
5082
PREV_BITS(uint, keyinfo->key_parts))
5085
Not all parts are fixed. Produce bitmap of remaining bits and
5086
check if all of them are covered.
5088
sj_inside_out_scan= true;
5092
It's a confluent ref scan.
5094
That is, all found KEYUSE elements refer to IN-equalities,
5095
and there is really no ref access because there is no
5096
t.keypart0 = {bound expression}
5098
Calculate the cost of complete loose index scan.
5100
records= (double)s->table->file->stats.records;
5102
/* The cost is entire index scan cost (divided by 2) */
5103
best_time= s->table->file->index_only_read_time(key, records);
5105
/* Now figure how many different keys we will get */
5107
if ((rpc= keyinfo->rec_per_key[keyinfo->key_parts-1]))
5108
records= records / rpc;
5115
Check if we found full key
5117
if (found_part == PREV_BITS(uint,keyinfo->key_parts) &&
5120
max_key_part= (uint) ~0;
5121
if ((keyinfo->flags & (HA_NOSAME | HA_NULL_PART_KEY)) == HA_NOSAME)
5123
tmp = prev_record_reads(join, idx, found_ref);
5129
{ /* We found a const key */
5131
ReuseRangeEstimateForRef-1:
5132
We get here if we've found a ref(const) (c_i are constants):
5133
"(keypart1=c1) AND ... AND (keypartN=cN)" [ref_const_cond]
5135
If range optimizer was able to construct a "range"
5136
access on this index, then its condition "quick_cond" was
5137
eqivalent to ref_const_cond (*), and we can re-use E(#rows)
5138
from the range optimizer.
5140
Proof of (*): By properties of range and ref optimizers
5141
quick_cond will be equal or tighther than ref_const_cond.
5142
ref_const_cond already covers "smallest" possible interval -
5143
a singlepoint interval over all keyparts. Therefore,
5144
quick_cond is equivalent to ref_const_cond (if it was an
5145
empty interval we wouldn't have got here).
5147
if (table->quick_keys.is_set(key))
5148
records= (double) table->quick_rows[key];
5151
/* quick_range couldn't use key! */
5152
records= (double) s->records/rec;
5157
if (!(records=keyinfo->rec_per_key[keyinfo->key_parts-1]))
5158
{ /* Prefer longer keys */
5160
((double) s->records / (double) rec *
5162
((double) (table->s->max_key_length-keyinfo->key_length) /
5163
(double) table->s->max_key_length)));
5165
records=2.0; /* Can't be as good as a unique */
5168
ReuseRangeEstimateForRef-2: We get here if we could not reuse
5169
E(#rows) from range optimizer. Make another try:
5171
If range optimizer produced E(#rows) for a prefix of the ref
5172
access we're considering, and that E(#rows) is lower then our
5173
current estimate, make an adjustment. The criteria of when we
5174
can make an adjustment is a special case of the criteria used
5175
in ReuseRangeEstimateForRef-3.
5177
if (table->quick_keys.is_set(key) &&
5178
const_part & (1 << table->quick_key_parts[key]) &&
5179
table->quick_n_ranges[key] == 1 &&
5180
records > (double) table->quick_rows[key])
5182
records= (double) table->quick_rows[key];
5185
/* Limit the number of matched rows */
5187
set_if_smaller(tmp, (double) thd->variables.max_seeks_for_key);
5188
if (table->covering_keys.is_set(key))
5190
/* we can use only index tree */
5191
tmp= record_count * table->file->index_only_read_time(key, tmp);
5194
tmp= record_count*min(tmp,s->worst_seeks);
5200
Use as much key-parts as possible and a uniq key is better
5201
than a not unique key
5202
Set tmp to (previous record count) * (records / combination)
5204
if ((found_part & 1) &&
5205
(!(table->file->index_flags(key, 0, 0) & HA_ONLY_WHOLE_INDEX) ||
5206
found_part == PREV_BITS(uint,keyinfo->key_parts)))
5208
max_key_part= max_part_bit(found_part);
5210
ReuseRangeEstimateForRef-3:
5211
We're now considering a ref[or_null] access via
5212
(t.keypart1=e1 AND ... AND t.keypartK=eK) [ OR
5213
(same-as-above but with one cond replaced
5214
with "t.keypart_i IS NULL")] (**)
5216
Try re-using E(#rows) from "range" optimizer:
5217
We can do so if "range" optimizer used the same intervals as
5218
in (**). The intervals used by range optimizer may be not
5219
available at this point (as "range" access might have choosen to
5220
create quick select over another index), so we can't compare
5221
them to (**). We'll make indirect judgements instead.
5222
The sufficient conditions for re-use are:
5223
(C1) All e_i in (**) are constants, i.e. found_ref==false. (if
5224
this is not satisfied we have no way to know which ranges
5225
will be actually scanned by 'ref' until we execute the
5227
(C2) max #key parts in 'range' access == K == max_key_part (this
5228
is apparently a necessary requirement)
5230
We also have a property that "range optimizer produces equal or
5231
tighter set of scan intervals than ref(const) optimizer". Each
5232
of the intervals in (**) are "tightest possible" intervals when
5233
one limits itself to using keyparts 1..K (which we do in #2).
5234
From here it follows that range access used either one, or
5235
both of the (I1) and (I2) intervals:
5237
(t.keypart1=c1 AND ... AND t.keypartK=eK) (I1)
5238
(same-as-above but with one cond replaced
5239
with "t.keypart_i IS NULL") (I2)
5241
The remaining part is to exclude the situation where range
5242
optimizer used one interval while we're considering
5243
ref-or-null and looking for estimate for two intervals. This
5244
is done by last limitation:
5246
(C3) "range optimizer used (have ref_or_null?2:1) intervals"
5248
if (table->quick_keys.is_set(key) && !found_ref && //(C1)
5249
table->quick_key_parts[key] == max_key_part && //(C2)
5250
table->quick_n_ranges[key] == 1+test(ref_or_null_part)) //(C3)
5252
tmp= records= (double) table->quick_rows[key];
5256
/* Check if we have statistic about the distribution */
5257
if ((records= keyinfo->rec_per_key[max_key_part-1]))
5260
Fix for the case where the index statistics is too
5262
(1) We're considering ref(const) and there is quick select
5264
(2) and that quick select uses more keyparts (i.e. it will
5265
scan equal/smaller interval then this ref(const))
5266
(3) and E(#rows) for quick select is higher then our
5269
We'll use E(#rows) from quick select.
5271
Q: Why do we choose to use 'ref'? Won't quick select be
5272
cheaper in some cases ?
5273
TODO: figure this out and adjust the plan choice if needed.
5275
if (!found_ref && table->quick_keys.is_set(key) && // (1)
5276
table->quick_key_parts[key] > max_key_part && // (2)
5277
records < (double)table->quick_rows[key]) // (3)
5278
records= (double)table->quick_rows[key];
5285
Assume that the first key part matches 1% of the file
5286
and that the whole key matches 10 (duplicates) or 1
5288
Assume also that more key matches proportionally more
5290
This gives the formula:
5291
records = (x * (b-a) + a*c-b)/(c-1)
5293
b = records matched by whole key
5294
a = records matched by first key part (1% of all records?)
5295
c = number of key parts in key
5296
x = used key parts (1 <= x <= c)
5299
if (!(rec_per_key=(double)
5300
keyinfo->rec_per_key[keyinfo->key_parts-1]))
5301
rec_per_key=(double) s->records/rec+1;
5305
else if (rec_per_key/(double) s->records >= 0.01)
5309
double a=s->records*0.01;
5310
if (keyinfo->key_parts > 1)
5311
tmp= (max_key_part * (rec_per_key - a) +
5312
a*keyinfo->key_parts - rec_per_key)/
5313
(keyinfo->key_parts-1);
5316
set_if_bigger(tmp,1.0);
5318
records = (ulong) tmp;
5321
if (ref_or_null_part)
5323
/* We need to do two key searches to find key */
5329
ReuseRangeEstimateForRef-4: We get here if we could not reuse
5330
E(#rows) from range optimizer. Make another try:
5332
If range optimizer produced E(#rows) for a prefix of the ref
5333
access we're considering, and that E(#rows) is lower then our
5334
current estimate, make the adjustment.
5336
The decision whether we can re-use the estimate from the range
5337
optimizer is the same as in ReuseRangeEstimateForRef-3,
5338
applied to first table->quick_key_parts[key] key parts.
5340
if (table->quick_keys.is_set(key) &&
5341
table->quick_key_parts[key] <= max_key_part &&
5342
const_part & (1 << table->quick_key_parts[key]) &&
5343
table->quick_n_ranges[key] == 1 + test(ref_or_null_part &
5345
records > (double) table->quick_rows[key])
5347
tmp= records= (double) table->quick_rows[key];
5351
/* Limit the number of matched rows */
5352
set_if_smaller(tmp, (double) thd->variables.max_seeks_for_key);
5353
if (table->covering_keys.is_set(key))
5355
/* we can use only index tree */
5356
tmp= record_count * table->file->index_only_read_time(key, tmp);
5359
tmp= record_count * min(tmp,s->worst_seeks);
5362
tmp= best_time; // Do nothing
5365
if (sj_inside_out_scan && !start_key)
5373
if (tmp < best_time - records/(double) TIME_FOR_COMPARE)
5375
best_time= tmp + records/(double) TIME_FOR_COMPARE;
5377
best_records= records;
5378
best_key= start_key;
5379
best_max_key_part= max_key_part;
5380
best_ref_depends_map= found_ref;
5381
best_is_sj_inside_out= sj_inside_out_scan;
5384
records= best_records;
5388
Don't test table scan if it can't be better.
5389
Prefer key lookup if we would use the same key for scanning.
5391
Don't do a table scan on InnoDB tables, if we can read the used
5392
parts of the row from any of the used index.
5393
This is because table scans uses index and we would not win
5394
anything by using a table scan.
5396
A word for word translation of the below if-statement in sergefp's
5397
understanding: we check if we should use table scan if:
5398
(1) The found 'ref' access produces more records than a table scan
5399
(or index scan, or quick select), or 'ref' is more expensive than
5401
(2) This doesn't hold: the best way to perform table scan is to to perform
5402
'range' access using index IDX, and the best way to perform 'ref'
5403
access is to use the same index IDX, with the same or more key parts.
5404
(note: it is not clear how this rule is/should be extended to
5405
index_merge quick selects)
5406
(3) See above note about InnoDB.
5407
(4) NOT ("FORCE INDEX(...)" is used for table and there is 'ref' access
5408
path, but there is no quick select)
5409
If the condition in the above brackets holds, then the only possible
5410
"table scan" access method is ALL/index (there is no quick select).
5411
Since we have a 'ref' access path, and FORCE INDEX instructs us to
5412
choose it over ALL/index, there is no need to consider a full table
5415
if ((records >= s->found_records || best > s->read_time) && // (1)
5416
!(s->quick && best_key && s->quick->index == best_key->key && // (2)
5417
best_max_key_part >= s->table->quick_key_parts[best_key->key]) &&// (2)
5418
!((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3)
5419
! s->table->covering_keys.is_clear_all() && best_key && !s->quick) &&// (3)
5420
!(s->table->force_index && best_key && !s->quick)) // (4)
5421
{ // Check full join
5422
ha_rows rnd_records= s->found_records;
5424
If there is a filtering condition on the table (i.e. ref analyzer found
5425
at least one "table.keyXpartY= exprZ", where exprZ refers only to tables
5426
preceding this table in the join order we're now considering), then
5427
assume that 25% of the rows will be filtered out by this condition.
5429
This heuristic is supposed to force tables used in exprZ to be before
5430
this table in join order.
5432
if (found_constraint)
5433
rnd_records-= rnd_records/4;
5436
If applicable, get a more accurate estimate. Don't use the two
5439
if (s->table->quick_condition_rows != s->found_records)
5440
rnd_records= s->table->quick_condition_rows;
5443
Range optimizer never proposes a RANGE if it isn't better
5444
than FULL: so if RANGE is present, it's always preferred to FULL.
5445
Here we estimate its cost.
5451
- read record range through 'quick'
5452
- skip rows which does not satisfy WHERE constraints
5454
We take into account possible use of join cache for ALL/index
5455
access (see first else-branch below), but we don't take it into
5456
account here for range/index_merge access. Find out why this is so.
5459
(s->quick->read_time +
5460
(s->found_records - rnd_records)/(double) TIME_FOR_COMPARE);
5464
/* Estimate cost of reading table. */
5465
tmp= s->table->file->scan_time();
5466
if (s->table->map & join->outer_join) // Can't use join cache
5469
For each record we have to:
5470
- read the whole table record
5471
- skip rows which does not satisfy join condition
5475
(s->records - rnd_records)/(double) TIME_FOR_COMPARE);
5479
/* We read the table as many times as join buffer becomes full. */
5480
tmp*= (1.0 + floor((double) cache_record_length(join,idx) *
5482
(double) thd->variables.join_buff_size));
5484
We don't make full cartesian product between rows in the scanned
5485
table and existing records because we skip all rows from the
5486
scanned table, which does not satisfy join condition when
5487
we read the table (see flush_cached_records for details). Here we
5488
take into account cost to read and skip these records.
5490
tmp+= (s->records - rnd_records)/(double) TIME_FOR_COMPARE;
5495
We estimate the cost of evaluating WHERE clause for found records
5496
as record_count * rnd_records / TIME_FOR_COMPARE. This cost plus
5497
tmp give us total cost of using TABLE SCAN
5499
if (best == DBL_MAX ||
5500
(tmp + record_count/(double) TIME_FOR_COMPARE*rnd_records <
5501
best + record_count/(double) TIME_FOR_COMPARE*records))
5504
If the table has a range (s->quick is set) make_join_select()
5505
will ensure that this will be used
5508
records= rows2double(rnd_records);
5510
/* range/index_merge/ALL/index access method are "independent", so: */
5511
best_ref_depends_map= 0;
5512
best_is_sj_inside_out= false;
5516
/* Update the cost information for the current partial plan */
5517
join->positions[idx].records_read= records;
5518
join->positions[idx].read_time= best;
5519
join->positions[idx].key= best_key;
5520
join->positions[idx].table= s;
5521
join->positions[idx].ref_depend_map= best_ref_depends_map;
5522
join->positions[idx].use_insideout_scan= best_is_sj_inside_out;
5525
idx == join->const_tables &&
5526
s->table == join->sort_by_table &&
5527
join->unit->select_limit_cnt >= records)
5528
join->sort_by_table= (TABLE*) 1; // Must use temporary table
5535
Selects and invokes a search strategy for an optimal query plan.
5537
The function checks user-configurable parameters that control the search
5538
strategy for an optimal plan, selects the search method and then invokes
5539
it. Each specific optimization procedure stores the final optimal plan in
5540
the array 'join->best_positions', and the cost of the plan in
5543
@param join pointer to the structure providing all context info for
5545
@param join_tables set of the tables in the query
5548
'MAX_TABLES+2' denotes the old implementation of find_best before
5549
the greedy version. Will be removed when greedy_search is approved.
5558
choose_plan(JOIN *join, table_map join_tables)
5560
uint search_depth= join->thd->variables.optimizer_search_depth;
5561
uint prune_level= join->thd->variables.optimizer_prune_level;
5562
bool straight_join= test(join->select_options & SELECT_STRAIGHT_JOIN);
5564
join->cur_embedding_map= 0;
5565
reset_nj_counters(join->join_list);
5567
if (SELECT_STRAIGHT_JOIN option is set)
5568
reorder tables so dependent tables come after tables they depend
5569
on, otherwise keep tables in the order they were specified in the query
5571
Apply heuristic: pre-sort all access plans with respect to the number of
5574
my_qsort(join->best_ref + join->const_tables,
5575
join->tables - join->const_tables, sizeof(JOIN_TAB*),
5576
straight_join ? join_tab_cmp_straight : join_tab_cmp);
5577
join->cur_emb_sj_nests= 0;
5580
optimize_straight_join(join, join_tables);
5584
if (search_depth == MAX_TABLES+2)
5586
TODO: 'MAX_TABLES+2' denotes the old implementation of find_best before
5587
the greedy version. Will be removed when greedy_search is approved.
5589
join->best_read= DBL_MAX;
5590
if (find_best(join, join_tables, join->const_tables, 1.0, 0.0))
5595
if (search_depth == 0)
5596
/* Automatically determine a reasonable value for 'search_depth' */
5597
search_depth= determine_search_depth(join);
5598
if (greedy_search(join, join_tables, search_depth, prune_level))
5604
Store the cost of this query into a user variable
5605
Don't update last_query_cost for statements that are not "flat joins" :
5606
i.e. they have subqueries, unions or call stored procedures.
5607
TODO: calculate a correct cost for a query with subqueries and UNIONs.
5609
if (join->thd->lex->is_single_level_stmt())
5610
join->thd->status_var.last_query_cost= join->best_read;
5616
Compare two JOIN_TAB objects based on the number of accessed records.
5618
@param ptr1 pointer to first JOIN_TAB object
5619
@param ptr2 pointer to second JOIN_TAB object
784
possible_keys&= cur_item->field->part_of_key;
787
if (possible_keys.any())
788
join_tab->const_keys|= possible_keys;
792
Compare two JoinTable objects based on the number of accessed records.
794
@param ptr1 pointer to first JoinTable object
795
@param ptr2 pointer to second JoinTable object
5622
798
The order relation implemented by join_tab_cmp() is not transitive,
5676
Heuristic procedure to automatically guess a reasonable degree of
5677
exhaustiveness for the greedy search procedure.
5679
The procedure estimates the optimization time and selects a search depth
5680
big enough to result in a near-optimal QEP, that doesn't take too long to
5681
find. If the number of tables in the query exceeds some constant, then
5682
search_depth is set to this constant.
5684
@param join pointer to the structure providing all context info for
5688
This is an extremely simplistic implementation that serves as a stub for a
5689
more advanced analysis of the join. Ideally the search depth should be
5690
determined by learning from previous query optimizations, because it will
5691
depend on the CPU power (and other factors).
5694
this value should be determined dynamically, based on statistics:
5695
uint max_tables_for_exhaustive_opt= 7;
5698
this value could be determined by some mapping of the form:
5699
depth : table_count -> [max_tables_for_exhaustive_opt..MAX_EXHAUSTIVE]
5702
A positive integer that specifies the search depth (and thus the
5703
exhaustiveness) of the depth-first search algorithm used by
5708
determine_search_depth(JOIN *join)
5710
uint table_count= join->tables - join->const_tables;
5712
/* TODO: this value should be determined dynamically, based on statistics: */
5713
uint max_tables_for_exhaustive_opt= 7;
5715
if (table_count <= max_tables_for_exhaustive_opt)
5716
search_depth= table_count+1; // use exhaustive for small number of tables
5719
TODO: this value could be determined by some mapping of the form:
5720
depth : table_count -> [max_tables_for_exhaustive_opt..MAX_EXHAUSTIVE]
5722
search_depth= max_tables_for_exhaustive_opt; // use greedy search
5724
return search_depth;
5729
Select the best ways to access the tables in a query without reordering them.
5731
Find the best access paths for each query table and compute their costs
5732
according to their order in the array 'join->best_ref' (thus without
5733
reordering the join tables). The function calls sequentially
5734
'best_access_path' for each table in the query to select the best table
5735
access method. The final optimal plan is stored in the array
5736
'join->best_positions', and the corresponding cost in 'join->best_read'.
5738
@param join pointer to the structure providing all context info for
5740
@param join_tables set of the tables in the query
5743
This function can be applied to:
5744
- queries with STRAIGHT_JOIN
5745
- internally to compute the cost of an arbitrary QEP
5747
Thus 'optimize_straight_join' can be used at any stage of the query
5748
optimization process to finalize a QEP as it is.
5752
optimize_straight_join(JOIN *join, table_map join_tables)
5755
uint idx= join->const_tables;
5756
double record_count= 1.0;
5757
double read_time= 0.0;
5759
for (JOIN_TAB **pos= join->best_ref + idx ; (s= *pos) ; pos++)
5761
/* Find the best access method from 's' to the current partial plan */
5762
advance_sj_state(join_tables, s);
5763
best_access_path(join, s, join->thd, join_tables, idx,
5764
record_count, read_time);
5765
/* compute the cost of the new plan extended with 's' */
5766
record_count*= join->positions[idx].records_read;
5767
read_time+= join->positions[idx].read_time;
5768
join_tables&= ~(s->table->map);
5772
read_time+= record_count / (double) TIME_FOR_COMPARE;
5773
if (join->sort_by_table &&
5774
join->sort_by_table != join->positions[join->const_tables].table->table)
5775
read_time+= record_count; // We have to make a temp table
5776
memcpy((uchar*) join->best_positions, (uchar*) join->positions,
5777
sizeof(POSITION)*idx);
5778
join->best_read= read_time;
5783
Find a good, possibly optimal, query execution plan (QEP) by a greedy search.
5785
The search procedure uses a hybrid greedy/exhaustive search with controlled
5786
exhaustiveness. The search is performed in N = card(remaining_tables)
5787
steps. Each step evaluates how promising is each of the unoptimized tables,
5788
selects the most promising table, and extends the current partial QEP with
5789
that table. Currenly the most 'promising' table is the one with least
5790
expensive extension.\
5792
There are two extreme cases:
5793
-# When (card(remaining_tables) < search_depth), the estimate finds the
5794
best complete continuation of the partial QEP. This continuation can be
5795
used directly as a result of the search.
5796
-# When (search_depth == 1) the 'best_extension_by_limited_search'
5797
consideres the extension of the current QEP with each of the remaining
5800
All other cases are in-between these two extremes. Thus the parameter
5801
'search_depth' controlls the exhaustiveness of the search. The higher the
5802
value, the longer the optimizaton time and possibly the better the
5803
resulting plan. The lower the value, the fewer alternative plans are
5804
estimated, but the more likely to get a bad QEP.
5806
All intermediate and final results of the procedure are stored in 'join':
5807
- join->positions : modified for every partial QEP that is explored
5808
- join->best_positions: modified for the current best complete QEP
5809
- join->best_read : modified for the current best complete QEP
5810
- join->best_ref : might be partially reordered
5812
The final optimal plan is stored in 'join->best_positions', and its
5813
corresponding cost in 'join->best_read'.
5816
The following pseudocode describes the algorithm of 'greedy_search':
5819
procedure greedy_search
5820
input: remaining_tables
5825
(t, a) = best_extension(pplan, remaining_tables);
5826
pplan = concat(pplan, (t, a));
5827
remaining_tables = remaining_tables - t;
5828
} while (remaining_tables != {})
5833
where 'best_extension' is a placeholder for a procedure that selects the
5834
most "promising" of all tables in 'remaining_tables'.
5835
Currently this estimate is performed by calling
5836
'best_extension_by_limited_search' to evaluate all extensions of the
5837
current QEP of size 'search_depth', thus the complexity of 'greedy_search'
5838
mainly depends on that of 'best_extension_by_limited_search'.
5841
If 'best_extension()' == 'best_extension_by_limited_search()', then the
5842
worst-case complexity of this algorithm is <=
5843
O(N*N^search_depth/search_depth). When serch_depth >= N, then the
5844
complexity of greedy_search is O(N!).
5847
In the future, 'greedy_search' might be extended to support other
5848
implementations of 'best_extension', e.g. some simpler quadratic procedure.
5850
@param join pointer to the structure providing all context info
5852
@param remaining_tables set of tables not included into the partial plan yet
5853
@param search_depth controlls the exhaustiveness of the search
5854
@param prune_level the pruning heuristics that should be applied during
5864
greedy_search(JOIN *join,
5865
table_map remaining_tables,
5869
double record_count= 1.0;
5870
double read_time= 0.0;
5871
uint idx= join->const_tables; // index into 'join->best_ref'
5873
uint size_remain; // cardinality of remaining_tables
5875
JOIN_TAB *best_table; // the next plan node to be added to the curr QEP
5877
/* number of tables that remain to be optimized */
5878
size_remain= my_count_bits(remaining_tables);
5881
/* Find the extension of the current QEP with the lowest cost */
5882
join->best_read= DBL_MAX;
5883
if (best_extension_by_limited_search(join, remaining_tables, idx, record_count,
5884
read_time, search_depth, prune_level))
5887
if (size_remain <= search_depth)
5890
'join->best_positions' contains a complete optimal extension of the
5891
current partial QEP.
5896
/* select the first table in the optimal extension as most promising */
5897
best_pos= join->best_positions[idx];
5898
best_table= best_pos.table;
5900
Each subsequent loop of 'best_extension_by_limited_search' uses
5901
'join->positions' for cost estimates, therefore we have to update its
5904
join->positions[idx]= best_pos;
5906
/* find the position of 'best_table' in 'join->best_ref' */
5908
JOIN_TAB *pos= join->best_ref[best_idx];
5909
while (pos && best_table != pos)
5910
pos= join->best_ref[++best_idx];
5911
assert((pos != NULL)); // should always find 'best_table'
5912
/* move 'best_table' at the first free position in the array of joins */
5913
swap_variables(JOIN_TAB*, join->best_ref[idx], join->best_ref[best_idx]);
5915
/* compute the cost of the new plan extended with 'best_table' */
5916
record_count*= join->positions[idx].records_read;
5917
read_time+= join->positions[idx].read_time;
5919
remaining_tables&= ~(best_table->table->map);
5927
Find a good, possibly optimal, query execution plan (QEP) by a possibly
5930
The procedure searches for the optimal ordering of the query tables in set
5931
'remaining_tables' of size N, and the corresponding optimal access paths to
5932
each table. The choice of a table order and an access path for each table
5933
constitutes a query execution plan (QEP) that fully specifies how to
5936
The maximal size of the found plan is controlled by the parameter
5937
'search_depth'. When search_depth == N, the resulting plan is complete and
5938
can be used directly as a QEP. If search_depth < N, the found plan consists
5939
of only some of the query tables. Such "partial" optimal plans are useful
5940
only as input to query optimization procedures, and cannot be used directly
5943
The algorithm begins with an empty partial plan stored in 'join->positions'
5944
and a set of N tables - 'remaining_tables'. Each step of the algorithm
5945
evaluates the cost of the partial plan extended by all access plans for
5946
each of the relations in 'remaining_tables', expands the current partial
5947
plan with the access plan that results in lowest cost of the expanded
5948
partial plan, and removes the corresponding relation from
5949
'remaining_tables'. The algorithm continues until it either constructs a
5950
complete optimal plan, or constructs an optimal plartial plan with size =
5953
The final optimal plan is stored in 'join->best_positions'. The
5954
corresponding cost of the optimal plan is in 'join->best_read'.
5957
The procedure uses a recursive depth-first search where the depth of the
5958
recursion (and thus the exhaustiveness of the search) is controlled by the
5959
parameter 'search_depth'.
5962
The pseudocode below describes the algorithm of
5963
'best_extension_by_limited_search'. The worst-case complexity of this
5964
algorithm is O(N*N^search_depth/search_depth). When serch_depth >= N, then
5965
the complexity of greedy_search is O(N!).
5968
procedure best_extension_by_limited_search(
5969
pplan in, // in, partial plan of tables-joined-so-far
5970
pplan_cost, // in, cost of pplan
5971
remaining_tables, // in, set of tables not referenced in pplan
5972
best_plan_so_far, // in/out, best plan found so far
5973
best_plan_so_far_cost,// in/out, cost of best_plan_so_far
5974
search_depth) // in, maximum size of the plans being considered
5976
for each table T from remaining_tables
5978
// Calculate the cost of using table T as above
5979
cost = complex-series-of-calculations;
5981
// Add the cost to the cost so far.
5984
if (pplan_cost >= best_plan_so_far_cost)
5985
// pplan_cost already too great, stop search
5988
pplan= expand pplan by best_access_method;
5989
remaining_tables= remaining_tables - table T;
5990
if (remaining_tables is not an empty set
5994
best_extension_by_limited_search(pplan, pplan_cost,
5997
best_plan_so_far_cost,
6002
best_plan_so_far_cost= pplan_cost;
6003
best_plan_so_far= pplan;
6010
When 'best_extension_by_limited_search' is called for the first time,
6011
'join->best_read' must be set to the largest possible value (e.g. DBL_MAX).
6012
The actual implementation provides a way to optionally use pruning
6013
heuristic (controlled by the parameter 'prune_level') to reduce the search
6014
space by skipping some partial plans.
6017
The parameter 'search_depth' provides control over the recursion
6018
depth, and thus the size of the resulting optimal plan.
6020
@param join pointer to the structure providing all context info
6022
@param remaining_tables set of tables not included into the partial plan yet
6023
@param idx length of the partial QEP in 'join->positions';
6024
since a depth-first search is used, also corresponds
6025
to the current depth of the search tree;
6026
also an index in the array 'join->best_ref';
6027
@param record_count estimate for the number of records returned by the
6029
@param read_time the cost of the best partial plan
6030
@param search_depth maximum depth of the recursion and thus size of the
6032
(0 < search_depth <= join->tables+1).
6033
@param prune_level pruning heuristics that should be applied during
6035
(values: 0 = EXHAUSTIVE, 1 = PRUNE_BY_TIME_OR_ROWS)
6044
best_extension_by_limited_search(JOIN *join,
6045
table_map remaining_tables,
6047
double record_count,
6052
THD *thd= join->thd;
6053
if (thd->killed) // Abort
6057
'join' is a partial plan with lower cost than the best plan so far,
6058
so continue expanding it further with the tables in 'remaining_tables'.
6061
double best_record_count= DBL_MAX;
6062
double best_read_time= DBL_MAX;
6064
for (JOIN_TAB **pos= join->best_ref + idx ; (s= *pos) ; pos++)
6066
table_map real_table_bit= s->table->map;
6067
if ((remaining_tables & real_table_bit) &&
6068
!(remaining_tables & s->dependent) &&
6069
(!idx || !check_interleaving_with_nj(join->positions[idx-1].table, s)))
6071
double current_record_count, current_read_time;
6072
advance_sj_state(remaining_tables, s);
6075
psergey-insideout-todo:
6076
when best_access_path() detects it could do an InsideOut scan or
6077
some other scan, have it return an insideout scan and a flag that
6078
requests to "fork" this loop iteration. (Q: how does that behave
6079
when the depth is insufficient??)
6081
/* Find the best access method from 's' to the current partial plan */
6082
best_access_path(join, s, thd, remaining_tables, idx,
6083
record_count, read_time);
6084
/* Compute the cost of extending the plan with 's' */
6085
current_record_count= record_count * join->positions[idx].records_read;
6086
current_read_time= read_time + join->positions[idx].read_time;
6088
/* Expand only partial plans with lower cost than the best QEP so far */
6089
if ((current_read_time +
6090
current_record_count / (double) TIME_FOR_COMPARE) >= join->best_read)
6092
restore_prev_nj_state(s);
6093
restore_prev_sj_state(remaining_tables, s);
6098
Prune some less promising partial plans. This heuristic may miss
6099
the optimal QEPs, thus it results in a non-exhaustive search.
6101
if (prune_level == 1)
6103
if (best_record_count > current_record_count ||
6104
best_read_time > current_read_time ||
6105
(idx == join->const_tables && s->table == join->sort_by_table)) // 's' is the first table in the QEP
6107
if (best_record_count >= current_record_count &&
6108
best_read_time >= current_read_time &&
6109
/* TODO: What is the reasoning behind this condition? */
6110
(!(s->key_dependent & remaining_tables) ||
6111
join->positions[idx].records_read < 2.0))
6113
best_record_count= current_record_count;
6114
best_read_time= current_read_time;
6119
restore_prev_nj_state(s);
6120
restore_prev_sj_state(remaining_tables, s);
6125
if ( (search_depth > 1) && (remaining_tables & ~real_table_bit) )
6126
{ /* Recursively expand the current partial plan */
6127
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
6128
if (best_extension_by_limited_search(join,
6129
remaining_tables & ~real_table_bit,
6131
current_record_count,
6136
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
6140
'join' is either the best partial QEP with 'search_depth' relations,
6141
or the best complete QEP so far, whichever is smaller.
6143
current_read_time+= current_record_count / (double) TIME_FOR_COMPARE;
6144
if (join->sort_by_table &&
6145
join->sort_by_table !=
6146
join->positions[join->const_tables].table->table)
6147
/* We have to make a temp table */
6148
current_read_time+= current_record_count;
6149
if ((search_depth == 1) || (current_read_time < join->best_read))
6151
memcpy((uchar*) join->best_positions, (uchar*) join->positions,
6152
sizeof(POSITION) * (idx + 1));
6153
join->best_read= current_read_time - 0.001;
6156
restore_prev_nj_state(s);
6157
restore_prev_sj_state(remaining_tables, s);
6166
- TODO: this function is here only temporarily until 'greedy_search' is
6167
tested and accepted.
6174
find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
6177
THD *thd= join->thd;
6182
read_time+=record_count/(double) TIME_FOR_COMPARE;
6183
if (join->sort_by_table &&
6184
join->sort_by_table !=
6185
join->positions[join->const_tables].table->table)
6186
read_time+=record_count; // We have to make a temp table
6187
if (read_time < join->best_read)
6189
memcpy((uchar*) join->best_positions,(uchar*) join->positions,
6190
sizeof(POSITION)*idx);
6191
join->best_read= read_time - 0.001;
6195
if (read_time+record_count/(double) TIME_FOR_COMPARE >= join->best_read)
6196
return(false); /* Found better before */
6199
double best_record_count=DBL_MAX,best_read_time=DBL_MAX;
6200
for (JOIN_TAB **pos=join->best_ref+idx ; (s=*pos) ; pos++)
6202
table_map real_table_bit=s->table->map;
6203
if ((rest_tables & real_table_bit) && !(rest_tables & s->dependent) &&
6204
(!idx|| !check_interleaving_with_nj(join->positions[idx-1].table, s)))
6206
double records, best;
6207
advance_sj_state(rest_tables, s);
6208
best_access_path(join, s, thd, rest_tables, idx, record_count,
6210
records= join->positions[idx].records_read;
6211
best= join->positions[idx].read_time;
6213
Go to the next level only if there hasn't been a better key on
6214
this level! This will cut down the search for a lot simple cases!
6216
double current_record_count=record_count*records;
6217
double current_read_time=read_time+best;
6218
if (best_record_count > current_record_count ||
6219
best_read_time > current_read_time ||
6220
(idx == join->const_tables && s->table == join->sort_by_table))
6222
if (best_record_count >= current_record_count &&
6223
best_read_time >= current_read_time &&
6224
(!(s->key_dependent & rest_tables) || records < 2.0))
6226
best_record_count=current_record_count;
6227
best_read_time=current_read_time;
6229
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
6230
if (find_best(join,rest_tables & ~real_table_bit,idx+1,
6231
current_record_count,current_read_time))
6233
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
6235
restore_prev_nj_state(s);
6236
restore_prev_sj_state(rest_tables, s);
6237
if (join->select_options & SELECT_STRAIGHT_JOIN)
6238
break; // Don't test all combinations
6246
847
Find how much space the prevous read not const tables takes in cache.
6249
static void calc_used_field_length(THD *thd __attribute__((unused)),
849
void calc_used_field_length(Session *, JoinTable *join_tab)
6252
uint null_fields,blobs,fields,rec_length;
851
uint32_t null_fields,blobs,fields,rec_length;
6253
852
Field **f_ptr,*field;
6254
MY_BITMAP *read_set= join_tab->table->read_set;;
6256
854
null_fields= blobs= fields= rec_length=0;
6257
855
for (f_ptr=join_tab->table->field ; (field= *f_ptr) ; f_ptr++)
6259
if (bitmap_is_set(read_set, field->field_index))
857
if (field->isReadSet())
6261
uint flags=field->flags;
859
uint32_t flags=field->flags;
6263
861
rec_length+=field->pack_length();
6264
862
if (flags & BLOB_FLAG)
6266
864
if (!(flags & NOT_NULL_FLAG))
6270
868
if (null_fields)
6271
rec_length+=(join_tab->table->s->null_fields+7)/8;
869
rec_length+=(join_tab->table->getNullFields() + 7)/8;
6272
870
if (join_tab->table->maybe_null)
6273
871
rec_length+=sizeof(bool);
6276
uint blob_length=(uint) (join_tab->table->file->stats.mean_rec_length-
6277
(join_tab->table->s->reclength- rec_length));
6278
rec_length+=(uint) max(4,blob_length);
6280
join_tab->used_fields=fields;
6281
join_tab->used_fieldlength=rec_length;
6282
join_tab->used_blobs=blobs;
6287
cache_record_length(JOIN *join,uint idx)
6290
JOIN_TAB **pos,**end;
6293
for (pos=join->best_ref+join->const_tables,end=join->best_ref+idx ;
6297
JOIN_TAB *join_tab= *pos;
6298
if (!join_tab->used_fieldlength) /* Not calced yet */
6299
calc_used_field_length(thd, join_tab);
6300
length+=join_tab->used_fieldlength;
6307
Get the number of different row combinations for subset of partial join
6311
join The join structure
6312
idx Number of tables in the partial join order (i.e. the
6313
partial join order is in join->positions[0..idx-1])
6314
found_ref Bitmap of tables for which we need to find # of distinct
6318
Given a partial join order (in join->positions[0..idx-1]) and a subset of
6319
tables within that join order (specified in found_ref), find out how many
6320
distinct row combinations of subset tables will be in the result of the
6323
This is used as follows: Suppose we have a table accessed with a ref-based
6324
method. The ref access depends on current rows of tables in found_ref.
6325
We want to count # of different ref accesses. We assume two ref accesses
6326
will be different if at least one of access parameters is different.
6327
Example: consider a query
6329
SELECT * FROM t1, t2, t3 WHERE t1.key=c1 AND t2.key=c2 AND t3.key=t1.field
6332
t1, ref access on t1.key=c1
6333
t2, ref access on t2.key=c2
6334
t3, ref access on t3.key=t1.field
6336
For t1: n_ref_scans = 1, n_distinct_ref_scans = 1
6337
For t2: n_ref_scans = records_read(t1), n_distinct_ref_scans=1
6338
For t3: n_ref_scans = records_read(t1)*records_read(t2)
6339
n_distinct_ref_scans = #records_read(t1)
6341
The reason for having this function (at least the latest version of it)
6342
is that we need to account for buffering in join execution.
6344
An edge-case example: if we have a non-first table in join accessed via
6345
ref(const) or ref(param) where there is a small number of different
6346
values of param, then the access will likely hit the disk cache and will
6347
not require any disk seeks.
6349
The proper solution would be to assume an LRU disk cache of some size,
6350
calculate probability of cache hits, etc. For now we just count
6351
identical ref accesses as one.
6354
Expected number of row combinations
6358
prev_record_reads(JOIN *join, uint idx, table_map found_ref)
6361
POSITION *pos_end= join->positions - 1;
6362
for (POSITION *pos= join->positions + idx - 1; pos != pos_end; pos--)
6364
if (pos->table->table->map & found_ref)
6366
found_ref|= pos->ref_depend_map;
6368
For the case of "t1 LEFT JOIN t2 ON ..." where t2 is a const table
6369
with no matching row we will get position[t2].records_read==0.
6370
Actually the size of output is one null-complemented row, therefore
6371
we will use value of 1 whenever we get records_read==0.
6374
- the above case can't occur if inner part of outer join has more
6375
than one table: table with no matches will not be marked as const.
6377
- Ideally we should add 1 to records_read for every possible null-
6378
complemented row. We're not doing it because: 1. it will require
6379
non-trivial code and add overhead. 2. The value of records_read
6380
is an inprecise estimate and adding 1 (or, in the worst case,
6381
#max_nested_outer_joins=64-1) will not make it any more precise.
6383
if (pos->records_read > DBL_EPSILON)
6384
found*= pos->records_read;
874
uint32_t blob_length=(uint32_t) (join_tab->table->cursor->stats.mean_rec_length-
875
(join_tab->table->getRecordLength()- rec_length));
876
rec_length+= max((uint32_t)4,blob_length);
878
join_tab->used_fields= fields;
879
join_tab->used_fieldlength= rec_length;
880
join_tab->used_blobs= blobs;
883
StoredKey *get_store_key(Session *session,
884
optimizer::KeyUse *keyuse,
885
table_map used_tables,
886
KEY_PART_INFO *key_part,
887
unsigned char *key_buff,
890
Item_ref *key_use_val= static_cast<Item_ref *>(keyuse->getVal());
891
if (! ((~used_tables) & keyuse->getUsedTables())) // if const item
893
return new store_key_const_item(session,
895
key_buff + maybe_null,
896
maybe_null ? key_buff : 0,
900
else if (key_use_val->type() == Item::FIELD_ITEM ||
901
(key_use_val->type() == Item::REF_ITEM &&
902
key_use_val->ref_type() == Item_ref::OUTER_REF &&
903
(*(Item_ref**)((Item_ref*)key_use_val)->ref)->ref_type() == Item_ref::DIRECT_REF &&
904
key_use_val->real_item()->type() == Item::FIELD_ITEM))
906
return new store_key_field(session,
908
key_buff + maybe_null,
909
maybe_null ? key_buff : 0,
911
((Item_field*) key_use_val->real_item())->field,
912
key_use_val->full_name());
914
return new store_key_item(session,
916
key_buff + maybe_null,
917
maybe_null ? key_buff : 0,
6392
Set up join struct according to best position.
923
This function is only called for const items on fields which are keys.
926
returns 1 if there was some conversion made when the field was stored.
6396
get_best_combination(JOIN *join)
6399
table_map used_tables;
6400
JOIN_TAB *join_tab,*j;
6405
table_count=join->tables;
6406
if (!(join->join_tab=join_tab=
6407
(JOIN_TAB*) thd->alloc(sizeof(JOIN_TAB)*table_count)))
6412
used_tables= OUTER_REF_TABLE_BIT; // Outer row is already read
6413
for (j=join_tab, tablenr=0 ; tablenr < table_count ; tablenr++,j++)
928
bool store_val_in_field(Field *field, Item *item, enum_check_fields check_flag)
931
Table *table= field->table;
932
Session *session= table->in_use;
933
ha_rows cuted_fields=session->cuted_fields;
936
we should restore old value of count_cuted_fields because
937
store_val_in_field can be called from mysql_insert
938
with select_insert, which make count_cuted_fields= 1
940
enum_check_fields old_count_cuted_fields= session->count_cuted_fields;
941
session->count_cuted_fields= check_flag;
942
error= item->save_in_field(field, 1);
943
session->count_cuted_fields= old_count_cuted_fields;
944
return error || cuted_fields != session->cuted_fields;
947
inline void add_cond_and_fix(Item **e1, Item *e2)
6416
*j= *join->best_positions[tablenr].table;
6417
form=join->table[tablenr]=j->table;
6418
used_tables|= form->map;
6419
form->reginfo.join_tab=j;
6420
if (!*j->on_expr_ref)
6421
form->reginfo.not_exists_optimize=0; // Only with LEFT JOIN
6422
if (j->type == JT_CONST)
6423
continue; // Handled in make_join_stat..
6428
if (j->type == JT_SYSTEM)
6430
if (j->keys.is_clear_all() || !(keyuse= join->best_positions[tablenr].key))
952
if ((res= new Item_cond_and(*e1, e2)))
6433
if (tablenr != join->const_tables)
955
res->quick_fix_field();
6436
else if (create_ref_for_key(join, j, keyuse, used_tables))
6437
return(true); // Something went wrong
6440
for (i=0 ; i < table_count ; i++)
6441
join->map2table[join->join_tab[i].table->tablenr]=join->join_tab+i;
6442
update_depend_map(join);
6447
static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse,
6448
table_map used_tables)
962
bool create_ref_for_key(JOIN *join,
964
optimizer::KeyUse *org_keyuse,
965
table_map used_tables)
6450
KEYUSE *keyuse=org_keyuse;
6451
THD *thd= join->thd;
6452
uint keyparts,length,key;
967
optimizer::KeyUse *keyuse= org_keyuse;
968
Session *session= join->session;
6456
975
/* Use best key from find_best */
6459
keyinfo=table->key_info+key;
977
key= keyuse->getKey();
978
keyinfo= table->key_info + key;
6463
uint found_part_ref_or_null= 0;
982
uint32_t found_part_ref_or_null= 0;
6465
984
Calculate length for the used key
6466
985
Stop if there is a missing key part or when we find second key_part
6853
Fill in outer join related info for the execution plan structure.
6855
For each outer join operation left after simplification of the
6856
original query the function set up the following pointers in the linear
6857
structure join->join_tab representing the selected execution plan.
6858
The first inner table t0 for the operation is set to refer to the last
6859
inner table tk through the field t0->last_inner.
6860
Any inner table ti for the operation are set to refer to the first
6861
inner table ti->first_inner.
6862
The first inner table t0 for the operation is set to refer to the
6863
first inner table of the embedding outer join operation, if there is any,
6864
through the field t0->first_upper.
6865
The on expression for the outer join operation is attached to the
6866
corresponding first inner table through the field t0->on_expr_ref.
6867
Here ti are structures of the JOIN_TAB type.
6869
EXAMPLE. For the query:
6873
(t2, t3 LEFT JOIN t4 ON t3.a=t4.a)
6874
ON (t1.a=t2.a AND t1.b=t3.b)
6878
given the execution plan with the table order t1,t2,t3,t4
6879
is selected, the following references will be set;
6880
t4->last_inner=[t4], t4->first_inner=[t4], t4->first_upper=[t2]
6881
t2->last_inner=[t4], t2->first_inner=t3->first_inner=[t2],
6882
on expression (t1.a=t2.a AND t1.b=t3.b) will be attached to
6883
*t2->on_expr_ref, while t3.a=t4.a will be attached to *t4->on_expr_ref.
6885
@param join reference to the info fully describing the query
6888
The function assumes that the simplification procedure has been
6889
already applied to the join query (see simplify_joins).
6890
This function can be called only after the execution plan
6895
make_outerjoin_info(JOIN *join)
6897
for (uint i=join->const_tables ; i < join->tables ; i++)
6899
JOIN_TAB *tab=join->join_tab+i;
6900
TABLE *table=tab->table;
6901
TABLE_LIST *tbl= table->pos_in_table_list;
6902
TABLE_LIST *embedding= tbl->embedding;
6904
if (tbl->outer_join)
6907
Table tab is the only one inner table for outer join.
6908
(Like table t4 for the table reference t3 LEFT JOIN t4 ON t3.a=t4.a
6909
is in the query above.)
6911
tab->last_inner= tab->first_inner= tab;
6912
tab->on_expr_ref= &tbl->on_expr;
6913
tab->cond_equal= tbl->cond_equal;
6915
tab->first_upper= embedding->nested_join->first_nested;
6917
for ( ; embedding ; embedding= embedding->embedding)
6919
/* Ignore sj-nests: */
6920
if (!embedding->on_expr)
6922
NESTED_JOIN *nested_join= embedding->nested_join;
6923
if (!nested_join->counter_)
6926
Table tab is the first inner table for nested_join.
6927
Save reference to it in the nested join structure.
6929
nested_join->first_nested= tab;
6930
tab->on_expr_ref= &embedding->on_expr;
6931
tab->cond_equal= tbl->cond_equal;
6932
if (embedding->embedding)
6933
tab->first_upper= embedding->embedding->nested_join->first_nested;
6935
if (!tab->first_inner)
6936
tab->first_inner= nested_join->first_nested;
6937
if (++nested_join->counter_ < nested_join->join_list.elements)
6939
/* Table tab is the last inner table for nested join. */
6940
nested_join->first_nested->last_inner= tab;
6948
make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
6950
THD *thd= join->thd;
6953
add_not_null_conds(join);
6954
table_map used_tables;
6955
if (cond) /* Because of QUICK_GROUP_MIN_MAX_SELECT */
6956
{ /* there may be a select without a cond. */
6957
if (join->tables > 1)
6958
cond->update_used_tables(); // Tablenr may have changed
6959
if (join->const_tables == join->tables &&
6960
thd->lex->current_select->master_unit() ==
6961
&thd->lex->unit) // not upper level SELECT
6962
join->const_table_map|=RAND_TABLE_BIT;
6963
{ // Check const tables
6965
make_cond_for_table(cond,
6966
join->const_table_map,
6968
for (JOIN_TAB *tab= join->join_tab+join->const_tables;
6969
tab < join->join_tab+join->tables ; tab++)
6971
if (*tab->on_expr_ref)
6973
JOIN_TAB *cond_tab= tab->first_inner;
6974
COND *tmp= make_cond_for_table(*tab->on_expr_ref,
6975
join->const_table_map,
6979
tmp= new Item_func_trig_cond(tmp, &cond_tab->not_null_compl);
6982
tmp->quick_fix_field();
6983
cond_tab->select_cond= !cond_tab->select_cond ? tmp :
6984
new Item_cond_and(cond_tab->select_cond,
6986
if (!cond_tab->select_cond)
6988
cond_tab->select_cond->quick_fix_field();
6991
if (const_cond && !const_cond->val_int())
6993
return(1); // Impossible const condition
6997
used_tables=((select->const_tables=join->const_table_map) |
6998
OUTER_REF_TABLE_BIT | RAND_TABLE_BIT);
6999
for (uint i=join->const_tables ; i < join->tables ; i++)
7001
JOIN_TAB *tab=join->join_tab+i;
7003
first_inner is the X in queries like:
7004
SELECT * FROM t1 LEFT OUTER JOIN (t2 JOIN t3) ON X
7006
JOIN_TAB *first_inner_tab= tab->first_inner;
7007
table_map current_map= tab->table->map;
7008
bool use_quick_range=0;
7012
Following force including random expression in last table condition.
7013
It solve problem with select like SELECT * FROM t1 WHERE rand() > 0.5
7015
if (i == join->tables-1)
7016
current_map|= OUTER_REF_TABLE_BIT | RAND_TABLE_BIT;
7017
used_tables|=current_map;
7019
if (tab->type == JT_REF && tab->quick &&
7020
(uint) tab->ref.key == tab->quick->index &&
7021
tab->ref.key_length < tab->quick->max_used_key_length)
7023
/* Range uses longer key; Use this instead of ref on key */
7028
tab->ref.key_parts=0; // Don't use ref key.
7029
join->best_positions[i].records_read= rows2double(tab->quick->records);
7031
We will use join cache here : prevent sorting of the first
7032
table only and sort at the end.
7034
if (i != join->const_tables && join->tables > join->const_tables + 1)
7040
tmp= make_cond_for_table(cond,used_tables,current_map, 0);
7041
if (cond && !tmp && tab->quick)
7043
if (tab->type != JT_ALL)
7046
Don't use the quick method
7047
We come here in the case where we have 'key=constant' and
7048
the test is removed by make_cond_for_table()
7056
Hack to handle the case where we only refer to a table
7057
in the ON part of an OUTER JOIN. In this case we want the code
7058
below to check if we should use 'quick' instead.
7060
tmp= new Item_int((int64_t) 1,1); // Always true
7064
if (tmp || !cond || tab->type == JT_REF || tab->type == JT_REF_OR_NULL ||
7065
tab->type == JT_EQ_REF)
7067
SQL_SELECT *sel= tab->select= ((SQL_SELECT*)
7068
thd->memdup((uchar*) select,
7071
return(1); // End of memory
7073
If tab is an inner table of an outer join operation,
7074
add a match guard to the pushed down predicate.
7075
The guard will turn the predicate on only after
7076
the first match for outer tables is encountered.
7081
Because of QUICK_GROUP_MIN_MAX_SELECT there may be a select without
7082
a cond, so neutralize the hack above.
7084
if (!(tmp= add_found_match_trig_cond(first_inner_tab, tmp, 0)))
7086
tab->select_cond=sel->cond=tmp;
7087
/* Push condition to storage engine if this is enabled
7088
and the condition is not guarded */
7089
tab->table->file->pushed_cond= NULL;
7090
if (thd->variables.engine_condition_pushdown)
7093
make_cond_for_table(tmp, current_map, current_map, 0);
7096
/* Push condition to handler */
7097
if (!tab->table->file->cond_push(push_cond))
7098
tab->table->file->pushed_cond= push_cond;
7103
tab->select_cond= sel->cond= NULL;
7105
sel->head=tab->table;
7108
/* Use quick key read if it's a constant and it's not used
7110
if (tab->needed_reg.is_clear_all() && tab->type != JT_EQ_REF
7111
&& (tab->type != JT_REF || (uint) tab->ref.key == tab->quick->index))
7113
sel->quick=tab->quick; // Use value from get_quick_...
7114
sel->quick_keys.clear_all();
7115
sel->needed_reg.clear_all();
7123
uint ref_key=(uint) sel->head->reginfo.join_tab->ref.key+1;
7124
if (i == join->const_tables && ref_key)
7126
if (!tab->const_keys.is_clear_all() &&
7127
tab->table->reginfo.impossible_range)
7130
else if (tab->type == JT_ALL && ! use_quick_range)
7132
if (!tab->const_keys.is_clear_all() &&
7133
tab->table->reginfo.impossible_range)
7134
return(1); // Impossible range
7136
We plan to scan all rows.
7137
Check again if we should use an index.
7138
We could have used an column from a previous table in
7139
the index if we are using limit and this is the first table
7142
if ((cond && (!tab->keys.is_subset(tab->const_keys) && i > 0)) ||
7143
(!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)))
7145
/* Join with outer join condition */
7146
COND *orig_cond=sel->cond;
7147
sel->cond= and_conds(sel->cond, *tab->on_expr_ref);
7150
We can't call sel->cond->fix_fields,
7151
as it will break tab->on_expr if it's AND condition
7152
(fix_fields currently removes extra AND/OR levels).
7153
Yet attributes of the just built condition are not needed.
7154
Thus we call sel->cond->quick_fix_field for safety.
7156
if (sel->cond && !sel->cond->fixed)
7157
sel->cond->quick_fix_field();
7159
if (sel->test_quick_select(thd, tab->keys,
7160
used_tables & ~ current_map,
7161
(join->select_options &
7164
join->unit->select_limit_cnt), 0,
7168
Before reporting "Impossible WHERE" for the whole query
7169
we have to check isn't it only "impossible ON" instead
7171
sel->cond=orig_cond;
7172
if (!*tab->on_expr_ref ||
7173
sel->test_quick_select(thd, tab->keys,
7174
used_tables & ~ current_map,
7175
(join->select_options &
7178
join->unit->select_limit_cnt),0,
7180
return(1); // Impossible WHERE
7183
sel->cond=orig_cond;
7185
/* Fix for EXPLAIN */
7187
join->best_positions[i].records_read= (double)sel->quick->records;
7191
sel->needed_reg=tab->needed_reg;
7192
sel->quick_keys.clear_all();
7194
if (!sel->quick_keys.is_subset(tab->checked_keys) ||
7195
!sel->needed_reg.is_subset(tab->checked_keys))
7197
tab->keys=sel->quick_keys;
7198
tab->keys.merge(sel->needed_reg);
7199
tab->use_quick= (!sel->needed_reg.is_clear_all() &&
7200
(select->quick_keys.is_clear_all() ||
7202
(select->quick->records >= 100L)))) ?
7204
sel->read_tables= used_tables & ~current_map;
7206
if (i != join->const_tables && tab->use_quick != 2)
7207
{ /* Read with cache */
7209
(tmp=make_cond_for_table(cond,
7210
join->const_table_map |
7214
tab->cache.select=(SQL_SELECT*)
7215
thd->memdup((uchar*) sel, sizeof(SQL_SELECT));
7216
tab->cache.select->cond=tmp;
7217
tab->cache.select->read_tables=join->const_table_map;
7224
Push down conditions from all on expressions.
7225
Each of these conditions are guarded by a variable
7226
that turns if off just before null complemented row for
7227
outer joins is formed. Thus, the condition from an
7228
'on expression' are guaranteed not to be checked for
7229
the null complemented row.
7232
/* First push down constant conditions from on expressions */
7233
for (JOIN_TAB *join_tab= join->join_tab+join->const_tables;
7234
join_tab < join->join_tab+join->tables ; join_tab++)
7236
if (*join_tab->on_expr_ref)
7238
JOIN_TAB *cond_tab= join_tab->first_inner;
7239
COND *tmp= make_cond_for_table(*join_tab->on_expr_ref,
7240
join->const_table_map,
7244
tmp= new Item_func_trig_cond(tmp, &cond_tab->not_null_compl);
7247
tmp->quick_fix_field();
7248
cond_tab->select_cond= !cond_tab->select_cond ? tmp :
7249
new Item_cond_and(cond_tab->select_cond,tmp);
7250
if (!cond_tab->select_cond)
7252
cond_tab->select_cond->quick_fix_field();
7256
/* Push down non-constant conditions from on expressions */
7257
JOIN_TAB *last_tab= tab;
7258
while (first_inner_tab && first_inner_tab->last_inner == last_tab)
7261
Table tab is the last inner table of an outer join.
7262
An on expression is always attached to it.
7264
COND *on_expr= *first_inner_tab->on_expr_ref;
7266
table_map used_tables2= (join->const_table_map |
7267
OUTER_REF_TABLE_BIT | RAND_TABLE_BIT);
7268
for (tab= join->join_tab+join->const_tables; tab <= last_tab ; tab++)
7270
current_map= tab->table->map;
7271
used_tables2|= current_map;
7272
COND *tmp_cond= make_cond_for_table(on_expr, used_tables2,
7276
JOIN_TAB *cond_tab= tab < first_inner_tab ? first_inner_tab : tab;
7278
First add the guards for match variables of
7279
all embedding outer join operations.
7281
if (!(tmp_cond= add_found_match_trig_cond(cond_tab->first_inner,
7286
Now add the guard turning the predicate off for
7287
the null complemented row.
7289
tmp_cond= new Item_func_trig_cond(tmp_cond,
7293
tmp_cond->quick_fix_field();
7294
/* Add the predicate to other pushed down predicates */
7295
cond_tab->select_cond= !cond_tab->select_cond ? tmp_cond :
7296
new Item_cond_and(cond_tab->select_cond,
7298
if (!cond_tab->select_cond)
7300
cond_tab->select_cond->quick_fix_field();
7303
first_inner_tab= first_inner_tab->first_upper;
7312
1215
Check if given expression uses only table fields covered by the given index
9632
2744
if (!(left_const && right_const) &&
9633
2745
args[0]->result_type() == args[1]->result_type())
9637
resolve_const_item(thd, &args[1], args[0]);
9638
func->update_used_tables();
9639
change_cond_ref_to_const(thd, save_list, and_father, and_father,
9642
else if (left_const)
9644
resolve_const_item(thd, &args[0], args[1]);
9645
func->update_used_tables();
9646
change_cond_ref_to_const(thd, save_list, and_father, and_father,
9656
Simplify joins replacing outer joins by inner joins whenever it's
9659
The function, during a retrieval of join_list, eliminates those
9660
outer joins that can be converted into inner join, possibly nested.
9661
It also moves the on expressions for the converted outer joins
9662
and from inner joins to conds.
9663
The function also calculates some attributes for nested joins:
9667
- on_expr_dep_tables
9668
The first two attributes are used to test whether an outer join can
9669
be substituted for an inner join. The third attribute represents the
9670
relation 'to be dependent on' for tables. If table t2 is dependent
9671
on table t1, then in any evaluated execution plan table access to
9672
table t2 must precede access to table t2. This relation is used also
9673
to check whether the query contains invalid cross-references.
9674
The forth attribute is an auxiliary one and is used to calculate
9676
As the attribute dep_tables qualifies possibles orders of tables in the
9677
execution plan, the dependencies required by the straight join
9678
modifiers are reflected in this attribute as well.
9679
The function also removes all braces that can be removed from the join
9680
expression without changing its meaning.
9683
An outer join can be replaced by an inner join if the where condition
9684
or the on expression for an embedding nested join contains a conjunctive
9685
predicate rejecting null values for some attribute of the inner tables.
9689
SELECT * FROM t1 LEFT JOIN t2 ON t2.a=t1.a WHERE t2.b < 5
9691
the predicate t2.b < 5 rejects nulls.
9692
The query is converted first to:
9694
SELECT * FROM t1 INNER JOIN t2 ON t2.a=t1.a WHERE t2.b < 5
9696
then to the equivalent form:
9698
SELECT * FROM t1, t2 ON t2.a=t1.a WHERE t2.b < 5 AND t2.a=t1.a
9702
Similarly the following query:
9704
SELECT * from t1 LEFT JOIN (t2, t3) ON t2.a=t1.a t3.b=t1.b
9709
SELECT * FROM t1, (t2, t3) WHERE t2.c < 5 AND t2.a=t1.a t3.b=t1.b
9713
One conversion might trigger another:
9715
SELECT * FROM t1 LEFT JOIN t2 ON t2.a=t1.a
9716
LEFT JOIN t3 ON t3.b=t2.b
9717
WHERE t3 IS NOT NULL =>
9718
SELECT * FROM t1 LEFT JOIN t2 ON t2.a=t1.a, t3
9719
WHERE t3 IS NOT NULL AND t3.b=t2.b =>
9720
SELECT * FROM t1, t2, t3
9721
WHERE t3 IS NOT NULL AND t3.b=t2.b AND t2.a=t1.a
9724
The function removes all unnecessary braces from the expression
9725
produced by the conversions.
9728
SELECT * FROM t1, (t2, t3) WHERE t2.c < 5 AND t2.a=t1.a AND t3.b=t1.b
9730
finally is converted to:
9732
SELECT * FROM t1, t2, t3 WHERE t2.c < 5 AND t2.a=t1.a AND t3.b=t1.b
9737
It also will remove braces from the following queries:
9739
SELECT * from (t1 LEFT JOIN t2 ON t2.a=t1.a) LEFT JOIN t3 ON t3.b=t2.b
9740
SELECT * from (t1, (t2,t3)) WHERE t1.a=t2.a AND t2.b=t3.b.
9743
The benefit of this simplification procedure is that it might return
9744
a query for which the optimizer can evaluate execution plan with more
9745
join orders. With a left join operation the optimizer does not
9746
consider any plan where one of the inner tables is before some of outer
9750
The function is implemented by a recursive procedure. On the recursive
9751
ascent all attributes are calculated, all outer joins that can be
9752
converted are replaced and then all unnecessary braces are removed.
9753
As join list contains join tables in the reverse order sequential
9754
elimination of outer joins does not require extra recursive calls.
9757
Remove all semi-joins that have are within another semi-join (i.e. have
9758
an "ancestor" semi-join nest)
9761
Here is an example of a join query with invalid cross references:
9763
SELECT * FROM t1 LEFT JOIN t2 ON t2.a=t3.a LEFT JOIN t3 ON t3.b=t1.b
9766
@param join reference to the query info
9767
@param join_list list representation of the join to be converted
9768
@param conds conditions to add on expressions for converted joins
9769
@param top true <=> conds is the where condition
9772
- The new condition, if success
9777
simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top,
9781
NESTED_JOIN *nested_join;
9782
TABLE_LIST *prev_table= 0;
9783
List_iterator<TABLE_LIST> li(*join_list);
9786
Try to simplify join operations from join_list.
9787
The most outer join operation is checked for conversion first.
9789
while ((table= li++))
9791
table_map used_tables;
9792
table_map not_null_tables= (table_map) 0;
9794
if ((nested_join= table->nested_join))
9797
If the element of join_list is a nested join apply
9798
the procedure to its nested join list first.
9802
Item *expr= table->on_expr;
9804
If an on expression E is attached to the table,
9805
check all null rejected predicates in this expression.
9806
If such a predicate over an attribute belonging to
9807
an inner table of an embedded outer join is found,
9808
the outer join is converted to an inner join and
9809
the corresponding on expression is added to E.
9811
expr= simplify_joins(join, &nested_join->join_list,
9812
expr, false, in_sj || table->sj_on_expr);
9814
if (!table->prep_on_expr || expr != table->on_expr)
9818
table->on_expr= expr;
9819
table->prep_on_expr= expr->copy_andor_structure(join->thd);
9822
nested_join->used_tables= (table_map) 0;
9823
nested_join->not_null_tables=(table_map) 0;
9824
conds= simplify_joins(join, &nested_join->join_list, conds, top,
9825
in_sj || table->sj_on_expr);
9826
used_tables= nested_join->used_tables;
9827
not_null_tables= nested_join->not_null_tables;
9831
if (!table->prep_on_expr)
9832
table->prep_on_expr= table->on_expr;
9833
used_tables= table->table->map;
9835
not_null_tables= conds->not_null_tables();
9838
if (table->embedding)
9840
table->embedding->nested_join->used_tables|= used_tables;
9841
table->embedding->nested_join->not_null_tables|= not_null_tables;
9844
if (!table->outer_join || (used_tables & not_null_tables))
9847
For some of the inner tables there are conjunctive predicates
9848
that reject nulls => the outer join can be replaced by an inner join.
9850
table->outer_join= 0;
9853
/* Add ON expression to the WHERE or upper-level ON condition. */
9856
conds= and_conds(conds, table->on_expr);
9857
conds->top_level_item();
9858
/* conds is always a new item as both cond and on_expr existed */
9859
assert(!conds->fixed);
9860
conds->fix_fields(join->thd, &conds);
9863
conds= table->on_expr;
9864
table->prep_on_expr= table->on_expr= 0;
9872
Only inner tables of non-convertible outer joins
9873
remain with on_expr.
9877
table->dep_tables|= table->on_expr->used_tables();
9878
if (table->embedding)
9880
table->dep_tables&= ~table->embedding->nested_join->used_tables;
9882
Embedding table depends on tables used
9883
in embedded on expressions.
9885
table->embedding->on_expr_dep_tables|= table->on_expr->used_tables();
9888
table->dep_tables&= ~table->table->map;
9893
/* The order of tables is reverse: prev_table follows table */
9894
if (prev_table->straight)
9895
prev_table->dep_tables|= used_tables;
9896
if (prev_table->on_expr)
9898
prev_table->dep_tables|= table->on_expr_dep_tables;
9899
table_map prev_used_tables= prev_table->nested_join ?
9900
prev_table->nested_join->used_tables :
9901
prev_table->table->map;
9903
If on expression contains only references to inner tables
9904
we still make the inner tables dependent on the outer tables.
9905
It would be enough to set dependency only on one outer table
9906
for them. Yet this is really a rare case.
9908
if (!(prev_table->on_expr->used_tables() & ~prev_used_tables))
9909
prev_table->dep_tables|= used_tables;
9916
Flatten nested joins that can be flattened.
9917
no ON expression and not a semi-join => can be flattened.
9920
while ((table= li++))
9922
nested_join= table->nested_join;
9923
if (table->sj_on_expr && !in_sj)
9926
If this is a semi-join that is not contained within another semi-join,
9927
leave it intact (otherwise it is flattened)
9929
join->select_lex->sj_nests.push_back(table);
9931
else if (nested_join && !table->on_expr)
9934
List_iterator<TABLE_LIST> it(nested_join->join_list);
9937
tbl->embedding= table->embedding;
9938
tbl->join_list= table->join_list;
9940
li.replace(nested_join->join_list);
9948
Assign each nested join structure a bit in nested_join_map.
9950
Assign each nested join structure (except "confluent" ones - those that
9951
embed only one element) a bit in nested_join_map.
9953
@param join Join being processed
9954
@param join_list List of tables
9955
@param first_unused Number of first unused bit in nested_join_map before the
9959
This function is called after simplify_joins(), when there are no
9960
redundant nested joins, #non_confluent_nested_joins <= #tables_in_join so
9961
we will not run out of bits in nested_join_map.
9964
First unused bit in nested_join_map after the call.
9967
static uint build_bitmap_for_nested_joins(List<TABLE_LIST> *join_list,
9970
List_iterator<TABLE_LIST> li(*join_list);
9972
while ((table= li++))
9974
NESTED_JOIN *nested_join;
9975
if ((nested_join= table->nested_join))
9978
It is guaranteed by simplify_joins() function that a nested join
9979
that has only one child is either
9980
- a single-table view (the child is the underlying table), or
9981
- a single-table semi-join nest
9983
We don't assign bits to such sj-nests because
9984
1. it is redundant (a "sequence" of one table cannot be interleaved
9986
2. we could run out bits in nested_join_map otherwise.
9988
if (nested_join->join_list.elements != 1)
9990
/* Don't assign bits to sj-nests */
9992
nested_join->nj_map= (nested_join_map) 1 << first_unused++;
9993
first_unused= build_bitmap_for_nested_joins(&nested_join->join_list,
9998
return(first_unused);
10003
Set NESTED_JOIN::counter=0 in all nested joins in passed list.
10005
Recursively set NESTED_JOIN::counter=0 for all nested joins contained in
10006
the passed join_list.
10008
@param join_list List of nested joins to process. It may also contain base
10009
tables which will be ignored.
10012
static void reset_nj_counters(List<TABLE_LIST> *join_list)
10014
List_iterator<TABLE_LIST> li(*join_list);
10016
while ((table= li++))
10018
NESTED_JOIN *nested_join;
10019
if ((nested_join= table->nested_join))
10021
nested_join->counter_= 0;
10022
reset_nj_counters(&nested_join->join_list);
2749
resolve_const_item(session, &args[1], args[0]);
2750
func->update_used_tables();
2751
change_cond_ref_to_const(session, save_list, and_father, and_father,
2754
else if (left_const)
2756
resolve_const_item(session, &args[0], args[1]);
2757
func->update_used_tables();
2758
change_cond_ref_to_const(session, save_list, and_father, and_father,
10030
2767
Check interleaving with an inner tables of an outer join for
10031
2768
extension table.
10033
Check if table next_tab can be added to current partial join order, and
2770
Check if table next_tab can be added to current partial join order, and
10034
2771
if yes, record that it has been added.
10036
2773
The function assumes that both current partial join order and its
10037
2774
extension with next_tab are valid wrt table dependencies.
10041
LIMITATIONS ON JOIN ORDER
2778
LIMITATIONS ON JOIN order_st
10042
2779
The nested [outer] joins executioner algorithm imposes these limitations
10043
2780
on join order:
10044
1. "Outer tables first" - any "outer" table must be before any
2781
1. "Outer tables first" - any "outer" table must be before any
10045
2782
corresponding "inner" table.
10046
2783
2. "No interleaving" - tables inside a nested join must form a continuous
10047
sequence in join order (i.e. the sequence must not be interrupted by
2784
sequence in join order (i.e. the sequence must not be interrupted by
10048
2785
tables that are outside of this nested join).
10050
2787
#1 is checked elsewhere, this function checks #2 provided that #1 has
10051
2788
been already checked.
10053
2790
WHY NEED NON-INTERLEAVING
10054
Consider an example:
2791
Consider an example:
10056
2793
select * from t0 join t1 left join (t2 join t3) on cond1
10510
3178
if (test_if_equality_guarantees_uniqueness (left_item, right_item))
10513
return right_item->eq(*const_item, 1);
10514
*const_item=right_item;
3181
return right_item->eq(*const_item, 1);
3182
*const_item=right_item;
10518
3186
else if (right_item->eq(comp_item,1))
10520
3188
if (test_if_equality_guarantees_uniqueness (right_item, left_item))
10523
return left_item->eq(*const_item, 1);
10524
*const_item=left_item;
10532
/****************************************************************************
10533
Create internal temporary table
10534
****************************************************************************/
10537
Create field for temporary table from given field.
10539
@param thd Thread handler
10540
@param org_field field from which new field will be created
10541
@param name New field name
10542
@param table Temporary table
10543
@param item !=NULL if item->result_field should point to new field.
10544
This is relevant for how fill_record() is going to work:
10545
If item != NULL then fill_record() will update
10546
the record in the original table.
10547
If item == NULL then fill_record() will update
10548
the temporary table
10549
@param convert_blob_length If >0 create a varstring(convert_blob_length)
10550
field instead of blob.
10558
Field *create_tmp_field_from_field(THD *thd, Field *org_field,
10559
const char *name, TABLE *table,
10560
Item_field *item, uint convert_blob_length)
10565
Make sure that the blob fits into a Field_varstring which has
10568
if (convert_blob_length && convert_blob_length <= Field_varstring::MAX_SIZE &&
10569
(org_field->flags & BLOB_FLAG))
10570
new_field= new Field_varstring(convert_blob_length,
10571
org_field->maybe_null(),
10572
org_field->field_name, table->s,
10573
org_field->charset());
10575
new_field= org_field->new_field(thd->mem_root, table,
10576
table == org_field->table);
10579
new_field->init(table);
10580
new_field->orig_table= org_field->orig_table;
10582
item->result_field= new_field;
10584
new_field->field_name= name;
10585
new_field->flags|= (org_field->flags & NO_DEFAULT_VALUE_FLAG);
10586
if (org_field->maybe_null() || (item && item->maybe_null))
10587
new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join
10588
if (org_field->type() == DRIZZLE_TYPE_VAR_STRING ||
10589
org_field->type() == DRIZZLE_TYPE_VARCHAR)
10590
table->s->db_create_options|= HA_OPTION_PACK_RECORD;
10591
else if (org_field->type() == DRIZZLE_TYPE_DOUBLE)
10592
((Field_double *) new_field)->not_fixed= true;
10598
Create field for temporary table using type of given item.
10600
@param thd Thread handler
10601
@param item Item to create a field for
10602
@param table Temporary table
10603
@param copy_func If set and item is a function, store copy of
10605
@param modify_item 1 if item->result_field should point to new
10606
item. This is relevent for how fill_record()
10608
If modify_item is 1 then fill_record() will
10609
update the record in the original table.
10610
If modify_item is 0 then fill_record() will
10611
update the temporary table
10612
@param convert_blob_length If >0 create a varstring(convert_blob_length)
10613
field instead of blob.
10621
static Field *create_tmp_field_from_item(THD *thd __attribute__((unused)),
10622
Item *item, TABLE *table,
10623
Item ***copy_func, bool modify_item,
10624
uint convert_blob_length)
10626
bool maybe_null= item->maybe_null;
10629
switch (item->result_type()) {
10631
new_field= new Field_double(item->max_length, maybe_null,
10632
item->name, item->decimals, true);
10636
Select an integer type with the minimal fit precision.
10637
MY_INT32_NUM_DECIMAL_DIGITS is sign inclusive, don't consider the sign.
10638
Values with MY_INT32_NUM_DECIMAL_DIGITS digits may or may not fit into
10639
Field_long : make them Field_int64_t.
10641
if (item->max_length >= (MY_INT32_NUM_DECIMAL_DIGITS - 1))
10642
new_field=new Field_int64_t(item->max_length, maybe_null,
10643
item->name, item->unsigned_flag);
10645
new_field=new Field_long(item->max_length, maybe_null,
10646
item->name, item->unsigned_flag);
10648
case STRING_RESULT:
10649
assert(item->collation.collation);
10651
enum enum_field_types type;
10653
DATE/TIME fields have STRING_RESULT result type.
10654
To preserve type they needed to be handled separately.
10656
if ((type= item->field_type()) == DRIZZLE_TYPE_DATETIME ||
10657
type == DRIZZLE_TYPE_TIME || type == DRIZZLE_TYPE_NEWDATE ||
10658
type == DRIZZLE_TYPE_TIMESTAMP)
10659
new_field= item->tmp_table_field_from_field_type(table, 1);
10661
Make sure that the blob fits into a Field_varstring which has
10664
else if (item->max_length/item->collation.collation->mbmaxlen > 255 &&
10665
convert_blob_length <= Field_varstring::MAX_SIZE &&
10666
convert_blob_length)
10667
new_field= new Field_varstring(convert_blob_length, maybe_null,
10668
item->name, table->s,
10669
item->collation.collation);
10671
new_field= item->make_string_field(table);
10672
new_field->set_derivation(item->collation.derivation);
10674
case DECIMAL_RESULT:
10676
uint8_t dec= item->decimals;
10677
uint8_t intg= ((Item_decimal *) item)->decimal_precision() - dec;
10678
uint32_t len= item->max_length;
10681
Trying to put too many digits overall in a DECIMAL(prec,dec)
10682
will always throw a warning. We must limit dec to
10683
DECIMAL_MAX_SCALE however to prevent an assert() later.
10688
signed int overflow;
10690
dec= min(dec, DECIMAL_MAX_SCALE);
10693
If the value still overflows the field with the corrected dec,
10694
we'll throw out decimals rather than integers. This is still
10695
bad and of course throws a truncation warning.
10696
+1: for decimal point
10699
overflow= my_decimal_precision_to_length(intg + dec, dec,
10700
item->unsigned_flag) - len;
10703
dec= max(0, dec - overflow); // too long, discard fract
10705
len -= item->decimals - dec; // corrected value fits
10708
new_field= new Field_new_decimal(len, maybe_null, item->name,
10709
dec, item->unsigned_flag);
10714
// This case should never be choosen
10720
new_field->init(table);
10722
if (copy_func && item->is_result_field())
10723
*((*copy_func)++) = item; // Save for copy_funcs
10725
item->set_result_field(new_field);
10726
if (item->type() == Item::NULL_ITEM)
10727
new_field->is_created_from_null_item= true;
10733
Create field for information schema table.
10735
@param thd Thread handler
10736
@param table Temporary table
10737
@param item Item to create a field for
10745
Field *create_tmp_field_for_schema(THD *thd __attribute__((unused)),
10746
Item *item, TABLE *table)
10748
if (item->field_type() == DRIZZLE_TYPE_VARCHAR)
10751
if (item->max_length > MAX_FIELD_VARCHARLENGTH)
10752
field= new Field_blob(item->max_length, item->maybe_null,
10753
item->name, item->collation.collation);
10755
field= new Field_varstring(item->max_length, item->maybe_null,
10757
table->s, item->collation.collation);
10759
field->init(table);
10762
return item->tmp_table_field_from_field_type(table, 0);
10767
Create field for temporary table.
10769
@param thd Thread handler
10770
@param table Temporary table
10771
@param item Item to create a field for
10772
@param type Type of item (normally item->type)
10773
@param copy_func If set and item is a function, store copy of item
10775
@param from_field if field will be created using other field as example,
10776
pointer example field will be written here
10777
@param default_field If field has a default value field, store it here
10778
@param group 1 if we are going to do a relative group by on result
10779
@param modify_item 1 if item->result_field should point to new item.
10780
This is relevent for how fill_record() is going to
10782
If modify_item is 1 then fill_record() will update
10783
the record in the original table.
10784
If modify_item is 0 then fill_record() will update
10785
the temporary table
10786
@param convert_blob_length If >0 create a varstring(convert_blob_length)
10787
field instead of blob.
10795
Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
10796
Item ***copy_func, Field **from_field,
10797
Field **default_field,
10798
bool group, bool modify_item,
10799
bool table_cant_handle_bit_fields __attribute__((unused)),
10800
bool make_copy_field,
10801
uint convert_blob_length)
10804
Item::Type orig_type= type;
10805
Item *orig_item= 0;
10807
if (type != Item::FIELD_ITEM &&
10808
item->real_item()->type() == Item::FIELD_ITEM)
10811
item= item->real_item();
10812
type= Item::FIELD_ITEM;
10816
case Item::SUM_FUNC_ITEM:
10818
Item_sum *item_sum=(Item_sum*) item;
10819
result= item_sum->create_tmp_field(group, table, convert_blob_length);
10821
my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATALERROR));
10824
case Item::FIELD_ITEM:
10825
case Item::DEFAULT_VALUE_ITEM:
10827
Item_field *field= (Item_field*) item;
10828
bool orig_modify= modify_item;
10829
if (orig_type == Item::REF_ITEM)
10832
If item have to be able to store NULLs but underlaid field can't do it,
10833
create_tmp_field_from_field() can't be used for tmp field creation.
10835
if (field->maybe_null && !field->field->maybe_null())
10837
result= create_tmp_field_from_item(thd, item, table, NULL,
10838
modify_item, convert_blob_length);
10839
*from_field= field->field;
10840
if (result && modify_item)
10841
field->result_field= result;
10844
result= create_tmp_field_from_field(thd, (*from_field= field->field),
10845
orig_item ? orig_item->name :
10848
modify_item ? field :
10850
convert_blob_length);
10851
if (orig_type == Item::REF_ITEM && orig_modify)
10852
((Item_ref*)orig_item)->set_result_field(result);
10853
if (field->field->eq_def(result))
10854
*default_field= field->field;
10858
case Item::FUNC_ITEM:
10860
case Item::COND_ITEM:
10861
case Item::FIELD_AVG_ITEM:
10862
case Item::FIELD_STD_ITEM:
10863
case Item::SUBSELECT_ITEM:
10864
/* The following can only happen with 'CREATE TABLE ... SELECT' */
10865
case Item::PROC_ITEM:
10866
case Item::INT_ITEM:
10867
case Item::REAL_ITEM:
10868
case Item::DECIMAL_ITEM:
10869
case Item::STRING_ITEM:
10870
case Item::REF_ITEM:
10871
case Item::NULL_ITEM:
10872
case Item::VARBIN_ITEM:
10873
if (make_copy_field)
10875
assert(((Item_result_field*)item)->result_field);
10876
*from_field= ((Item_result_field*)item)->result_field;
10878
return create_tmp_field_from_item(thd, item, table,
10879
(make_copy_field ? 0 : copy_func),
10880
modify_item, convert_blob_length);
10881
case Item::TYPE_HOLDER:
10882
result= ((Item_type_holder *)item)->make_field_by_type(table);
10883
result->set_derivation(item->collation.derivation);
10885
default: // Dosen't have to be stored
10891
Set up column usage bitmaps for a temporary table
10894
For temporary tables, we need one bitmap with all columns set and
10895
a tmp_set bitmap to be used by things like filesort.
10898
void setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps)
10900
uint field_count= table->s->fields;
10901
bitmap_init(&table->def_read_set, (my_bitmap_map*) bitmaps, field_count,
10903
bitmap_init(&table->tmp_set,
10904
(my_bitmap_map*) (bitmaps+ bitmap_buffer_size(field_count)),
10905
field_count, false);
10906
/* write_set and all_set are copies of read_set */
10907
table->def_write_set= table->def_read_set;
10908
table->s->all_set= table->def_read_set;
10909
bitmap_set_all(&table->s->all_set);
10910
table->default_column_bitmaps();
10915
Create a temp table according to a field list.
10917
Given field pointers are changed to point at tmp_table for
10918
send_fields. The table object is self contained: it's
10919
allocated in its own memory root, as well as Field objects
10920
created for table columns.
10921
This function will replace Item_sum items in 'fields' list with
10922
corresponding Item_field items, pointing at the fields in the
10923
temporary table, unless this was prohibited by true
10924
value of argument save_sum_fields. The Item_field objects
10925
are created in THD memory root.
10927
@param thd thread handle
10928
@param param a description used as input to create the table
10929
@param fields list of items that will be used to define
10930
column types of the table (also see NOTES)
10931
@param group TODO document
10932
@param distinct should table rows be distinct
10933
@param save_sum_fields see NOTES
10934
@param select_options
10936
@param table_alias possible name of the temporary table that can
10937
be used for name resolving; can be "".
10940
#define STRING_TOTAL_LENGTH_TO_PACK_ROWS 128
10941
#define AVG_STRING_LENGTH_TO_PACK_ROWS 64
10942
#define RATIO_TO_PACK_ROWS 2
10943
#define MIN_STRING_LENGTH_TO_PACK_ROWS 10
10946
create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
10947
ORDER *group, bool distinct, bool save_sum_fields,
10948
uint64_t select_options, ha_rows rows_limit,
10951
MEM_ROOT *mem_root_save, own_root;
10953
TABLE_SHARE *share;
10954
uint i,field_count,null_count,null_pack_length;
10955
uint copy_func_count= param->func_count;
10956
uint hidden_null_count, hidden_null_pack_length, hidden_field_count;
10957
uint blob_count,group_null_items, string_count;
10958
uint temp_pool_slot=MY_BIT_NONE;
10960
ulong reclength, string_total_length;
10961
bool using_unique_constraint= 0;
10962
bool use_packed_rows= 0;
10963
bool not_all_columns= !(select_options & TMP_TABLE_ALL_COLUMNS);
10964
char *tmpname,path[FN_REFLEN];
10965
uchar *pos, *group_buff, *bitmaps;
10967
Field **reg_field, **from_field, **default_field;
10969
Copy_field *copy=0;
10971
KEY_PART_INFO *key_part_info;
10973
MI_COLUMNDEF *recinfo;
10974
uint total_uneven_bit_length= 0;
10975
bool force_copy_fields= param->force_copy_fields;
10977
status_var_increment(thd->status_var.created_tmp_tables);
10979
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
10980
temp_pool_slot = bitmap_lock_set_next(&temp_pool);
10982
if (temp_pool_slot != MY_BIT_NONE) // we got a slot
10983
sprintf(path, "%s_%lx_%i", tmp_file_prefix,
10984
current_pid, temp_pool_slot);
10987
/* if we run out of slots or we are not using tempool */
10988
sprintf(path,"%s%lx_%lx_%x", tmp_file_prefix,current_pid,
10989
thd->thread_id, thd->tmp_table++);
10993
No need to change table name to lower case as we are only creating
10994
MyISAM or HEAP tables here
10996
fn_format(path, path, mysql_tmpdir, "", MY_REPLACE_EXT|MY_UNPACK_FILENAME);
11001
if (!param->quick_group)
11002
group=0; // Can't use group key
11003
else for (ORDER *tmp=group ; tmp ; tmp=tmp->next)
11006
marker == 4 means two things:
11007
- store NULLs in the key, and
11008
- convert BIT fields to 64-bit long, needed because MEMORY tables
11009
can't index BIT fields.
11011
(*tmp->item)->marker= 4;
11012
if ((*tmp->item)->max_length >= CONVERT_IF_BIGGER_TO_BLOB)
11013
using_unique_constraint=1;
11015
if (param->group_length >= MAX_BLOB_WIDTH)
11016
using_unique_constraint=1;
11018
distinct=0; // Can't use distinct
11021
field_count=param->field_count+param->func_count+param->sum_func_count;
11022
hidden_field_count=param->hidden_field_count;
11025
When loose index scan is employed as access method, it already
11026
computes all groups and the result of all aggregate functions. We
11027
make space for the items of the aggregate function in the list of
11028
functions TMP_TABLE_PARAM::items_to_copy, so that the values of
11029
these items are stored in the temporary table.
11031
if (param->precomputed_group_by)
11032
copy_func_count+= param->sum_func_count;
11034
init_sql_alloc(&own_root, TABLE_ALLOC_BLOCK_SIZE, 0);
11036
if (!multi_alloc_root(&own_root,
11037
&table, sizeof(*table),
11038
&share, sizeof(*share),
11039
®_field, sizeof(Field*) * (field_count+1),
11040
&default_field, sizeof(Field*) * (field_count),
11041
&blob_field, sizeof(uint)*(field_count+1),
11042
&from_field, sizeof(Field*)*field_count,
11043
©_func, sizeof(*copy_func)*(copy_func_count+1),
11044
¶m->keyinfo, sizeof(*param->keyinfo),
11046
sizeof(*key_part_info)*(param->group_parts+1),
11047
¶m->start_recinfo,
11048
sizeof(*param->recinfo)*(field_count*2+4),
11049
&tmpname, (uint) strlen(path)+1,
11050
&group_buff, (group && ! using_unique_constraint ?
11051
param->group_length : 0),
11052
&bitmaps, bitmap_buffer_size(field_count)*2,
11055
if (temp_pool_slot != MY_BIT_NONE)
11056
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11057
return(NULL); /* purecov: inspected */
11059
/* Copy_field belongs to TMP_TABLE_PARAM, allocate it in THD mem_root */
11060
if (!(param->copy_field= copy= new (thd->mem_root) Copy_field[field_count]))
11062
if (temp_pool_slot != MY_BIT_NONE)
11063
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11064
free_root(&own_root, MYF(0)); /* purecov: inspected */
11065
return(NULL); /* purecov: inspected */
11067
param->items_to_copy= copy_func;
11068
strmov(tmpname,path);
11069
/* make table according to fields */
11071
bzero((char*) table,sizeof(*table));
11072
bzero((char*) reg_field,sizeof(Field*)*(field_count+1));
11073
bzero((char*) default_field, sizeof(Field*) * (field_count));
11074
bzero((char*) from_field,sizeof(Field*)*field_count);
11076
table->mem_root= own_root;
11077
mem_root_save= thd->mem_root;
11078
thd->mem_root= &table->mem_root;
11080
table->field=reg_field;
11081
table->alias= table_alias;
11082
table->reginfo.lock_type=TL_WRITE; /* Will be updated */
11083
table->db_stat=HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
11085
table->temp_pool_slot = temp_pool_slot;
11086
table->copy_blobs= 1;
11087
table->in_use= thd;
11088
table->quick_keys.init();
11089
table->covering_keys.init();
11090
table->keys_in_use_for_query.init();
11093
init_tmp_table_share(thd, share, "", 0, tmpname, tmpname);
11094
share->blob_field= blob_field;
11095
share->blob_ptr_size= portable_sizeof_char_ptr;
11096
share->db_low_byte_first=1; // True for HEAP and MyISAM
11097
share->table_charset= param->table_charset;
11098
share->primary_key= MAX_KEY; // Indicate no primary key
11099
share->keys_for_keyread.init();
11100
share->keys_in_use.init();
11102
/* Calculate which type of fields we will store in the temporary table */
11104
reclength= string_total_length= 0;
11105
blob_count= string_count= null_count= hidden_null_count= group_null_items= 0;
11106
param->using_indirect_summary_function=0;
11108
List_iterator_fast<Item> li(fields);
11110
Field **tmp_from_field=from_field;
11111
while ((item=li++))
11113
Item::Type type=item->type();
11114
if (not_all_columns)
11116
if (item->with_sum_func && type != Item::SUM_FUNC_ITEM)
11118
if (item->used_tables() & OUTER_REF_TABLE_BIT)
11119
item->update_used_tables();
11120
if (type == Item::SUBSELECT_ITEM ||
11121
(item->used_tables() & ~OUTER_REF_TABLE_BIT))
11124
Mark that the we have ignored an item that refers to a summary
11125
function. We need to know this if someone is going to use
11126
DISTINCT on the result.
11128
param->using_indirect_summary_function=1;
11132
if (item->const_item() && (int) hidden_field_count <= 0)
11133
continue; // We don't have to store this
11135
if (type == Item::SUM_FUNC_ITEM && !group && !save_sum_fields)
11136
{ /* Can't calc group yet */
11137
((Item_sum*) item)->result_field=0;
11138
for (i=0 ; i < ((Item_sum*) item)->arg_count ; i++)
11140
Item **argp= ((Item_sum*) item)->args + i;
11142
if (!arg->const_item())
11145
create_tmp_field(thd, table, arg, arg->type(), ©_func,
11146
tmp_from_field, &default_field[fieldnr],
11147
group != 0,not_all_columns,
11149
param->convert_blob_length);
11151
goto err; // Should be OOM
11153
reclength+=new_field->pack_length();
11154
if (new_field->flags & BLOB_FLAG)
11156
*blob_field++= fieldnr;
11159
*(reg_field++)= new_field;
11160
if (new_field->real_type() == DRIZZLE_TYPE_STRING ||
11161
new_field->real_type() == DRIZZLE_TYPE_VARCHAR)
11164
string_total_length+= new_field->pack_length();
11166
thd->mem_root= mem_root_save;
11167
thd->change_item_tree(argp, new Item_field(new_field));
11168
thd->mem_root= &table->mem_root;
11169
if (!(new_field->flags & NOT_NULL_FLAG))
11173
new_field->maybe_null() is still false, it will be
11174
changed below. But we have to setup Item_field correctly
11176
(*argp)->maybe_null=1;
11178
new_field->field_index= fieldnr++;
11185
The last parameter to create_tmp_field() is a bit tricky:
11187
We need to set it to 0 in union, to get fill_record() to modify the
11189
We need to set it to 1 on multi-table-update and in select to
11190
write rows to the temporary table.
11191
We here distinguish between UNION and multi-table-updates by the fact
11192
that in the later case group is set to the row pointer.
11194
Field *new_field= (param->schema_table) ?
11195
create_tmp_field_for_schema(thd, item, table) :
11196
create_tmp_field(thd, table, item, type, ©_func,
11197
tmp_from_field, &default_field[fieldnr],
11199
!force_copy_fields &&
11200
(not_all_columns || group !=0),
11202
If item->marker == 4 then we force create_tmp_field
11203
to create a 64-bit longs for BIT fields because HEAP
11204
tables can't index BIT fields directly. We do the same
11205
for distinct, as we want the distinct index to be
11206
usable in this case too.
11208
item->marker == 4 || param->bit_fields_as_long,
11210
param->convert_blob_length);
11214
if (thd->is_fatal_error)
11215
goto err; // Got OOM
11216
continue; // Some kindf of const item
11218
if (type == Item::SUM_FUNC_ITEM)
11219
((Item_sum *) item)->result_field= new_field;
11221
reclength+=new_field->pack_length();
11222
if (!(new_field->flags & NOT_NULL_FLAG))
11224
if (new_field->flags & BLOB_FLAG)
11226
*blob_field++= fieldnr;
11229
if (item->marker == 4 && item->maybe_null)
11231
group_null_items++;
11232
new_field->flags|= GROUP_FLAG;
11234
new_field->field_index= fieldnr++;
11235
*(reg_field++)= new_field;
11237
if (!--hidden_field_count)
11240
This was the last hidden field; Remember how many hidden fields could
11243
hidden_null_count=null_count;
11245
We need to update hidden_field_count as we may have stored group
11246
functions with constant arguments
11248
param->hidden_field_count= fieldnr;
11252
assert(fieldnr == (uint) (reg_field - table->field));
11253
assert(field_count >= (uint) (reg_field - table->field));
11254
field_count= fieldnr;
11256
*blob_field= 0; // End marker
11257
share->fields= field_count;
11259
/* If result table is small; use a heap */
11260
/* future: storage engine selection can be made dynamic? */
11261
if (blob_count || using_unique_constraint ||
11262
(select_options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
11263
OPTION_BIG_TABLES || (select_options & TMP_TABLE_FORCE_MYISAM))
11265
share->db_plugin= ha_lock_engine(0, myisam_hton);
11266
table->file= get_new_handler(share, &table->mem_root,
11269
(param->group_parts > table->file->max_key_parts() ||
11270
param->group_length > table->file->max_key_length()))
11271
using_unique_constraint=1;
11275
share->db_plugin= ha_lock_engine(0, heap_hton);
11276
table->file= get_new_handler(share, &table->mem_root,
11283
if (!using_unique_constraint)
11284
reclength+= group_null_items; // null flag is stored separately
11286
share->blob_fields= blob_count;
11287
if (blob_count == 0)
11289
/* We need to ensure that first byte is not 0 for the delete link */
11290
if (param->hidden_field_count)
11291
hidden_null_count++;
11295
hidden_null_pack_length=(hidden_null_count+7)/8;
11296
null_pack_length= (hidden_null_pack_length +
11297
(null_count + total_uneven_bit_length + 7) / 8);
11298
reclength+=null_pack_length;
11300
reclength=1; // Dummy select
11301
/* Use packed rows if there is blobs or a lot of space to gain */
11302
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)))
11303
use_packed_rows= 1;
11305
share->reclength= reclength;
11307
uint alloc_length=ALIGN_SIZE(reclength+MI_UNIQUE_HASH_LENGTH+1);
11308
share->rec_buff_length= alloc_length;
11309
if (!(table->record[0]= (uchar*)
11310
alloc_root(&table->mem_root, alloc_length*3)))
11312
table->record[1]= table->record[0]+alloc_length;
11313
share->default_values= table->record[1]+alloc_length;
11315
copy_func[0]=0; // End marker
11316
param->func_count= copy_func - param->items_to_copy;
11318
setup_tmp_table_column_bitmaps(table, bitmaps);
11320
recinfo=param->start_recinfo;
11321
null_flags=(uchar*) table->record[0];
11322
pos=table->record[0]+ null_pack_length;
11323
if (null_pack_length)
11325
bzero((uchar*) recinfo,sizeof(*recinfo));
11326
recinfo->type=FIELD_NORMAL;
11327
recinfo->length=null_pack_length;
11329
bfill(null_flags,null_pack_length,255); // Set null fields
11331
table->null_flags= (uchar*) table->record[0];
11332
share->null_fields= null_count+ hidden_null_count;
11333
share->null_bytes= null_pack_length;
11335
null_count= (blob_count == 0) ? 1 : 0;
11336
hidden_field_count=param->hidden_field_count;
11337
for (i=0,reg_field=table->field; i < field_count; i++,reg_field++,recinfo++)
11339
Field *field= *reg_field;
11341
bzero((uchar*) recinfo,sizeof(*recinfo));
11343
if (!(field->flags & NOT_NULL_FLAG))
11345
if (field->flags & GROUP_FLAG && !using_unique_constraint)
11348
We have to reserve one byte here for NULL bits,
11349
as this is updated by 'end_update()'
11351
*pos++=0; // Null is stored here
11353
recinfo->type=FIELD_NORMAL;
11355
bzero((uchar*) recinfo,sizeof(*recinfo));
11359
recinfo->null_bit= 1 << (null_count & 7);
11360
recinfo->null_pos= null_count/8;
11362
field->move_field(pos,null_flags+null_count/8,
11363
1 << (null_count & 7));
11367
field->move_field(pos,(uchar*) 0,0);
11371
Test if there is a default field value. The test for ->ptr is to skip
11372
'offset' fields generated by initalize_tables
11374
if (default_field[i] && default_field[i]->ptr)
11377
default_field[i] is set only in the cases when 'field' can
11378
inherit the default value that is defined for the field referred
11379
by the Item_field object from which 'field' has been created.
11382
Field *orig_field= default_field[i];
11383
/* Get the value from default_values */
11384
diff= (my_ptrdiff_t) (orig_field->table->s->default_values-
11385
orig_field->table->record[0]);
11386
orig_field->move_field_offset(diff); // Points now at default_values
11387
if (orig_field->is_real_null())
11391
field->set_notnull();
11392
memcpy(field->ptr, orig_field->ptr, field->pack_length());
11394
orig_field->move_field_offset(-diff); // Back to record[0]
11398
{ /* Not a table Item */
11399
copy->set(field,from_field[i],save_sum_fields);
11402
length=field->pack_length();
11405
/* Make entry for create table */
11406
recinfo->length=length;
11407
if (field->flags & BLOB_FLAG)
11408
recinfo->type= (int) FIELD_BLOB;
11409
else if (use_packed_rows &&
11410
field->real_type() == DRIZZLE_TYPE_STRING &&
11411
length >= MIN_STRING_LENGTH_TO_PACK_ROWS)
11412
recinfo->type=FIELD_SKIP_ENDSPACE;
11414
recinfo->type=FIELD_NORMAL;
11415
if (!--hidden_field_count)
11416
null_count=(null_count+7) & ~7; // move to next byte
11418
// fix table name in field entry
11419
field->table_name= &table->alias;
11422
param->copy_field_end=copy;
11423
param->recinfo=recinfo;
11424
store_record(table,s->default_values); // Make empty default record
11426
if (thd->variables.tmp_table_size == ~ (uint64_t) 0) // No limit
11427
share->max_rows= ~(ha_rows) 0;
11429
share->max_rows= (ha_rows) (((share->db_type() == heap_hton) ?
11430
min(thd->variables.tmp_table_size,
11431
thd->variables.max_heap_table_size) :
11432
thd->variables.tmp_table_size) /
11434
set_if_bigger(share->max_rows,1); // For dummy start options
11436
Push the LIMIT clause to the temporary table creation, so that we
11437
materialize only up to 'rows_limit' records instead of all result records.
11439
set_if_smaller(share->max_rows, rows_limit);
11440
param->end_write_records= rows_limit;
11442
keyinfo= param->keyinfo;
11446
table->group=group; /* Table is grouped by key */
11447
param->group_buff=group_buff;
11449
share->uniques= test(using_unique_constraint);
11450
table->key_info=keyinfo;
11451
keyinfo->key_part=key_part_info;
11452
keyinfo->flags=HA_NOSAME;
11453
keyinfo->usable_key_parts=keyinfo->key_parts= param->group_parts;
11454
keyinfo->key_length=0;
11455
keyinfo->rec_per_key=0;
11456
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
11457
keyinfo->name= (char*) "group_key";
11458
ORDER *cur_group= group;
11459
for (; cur_group ; cur_group= cur_group->next, key_part_info++)
11461
Field *field=(*cur_group->item)->get_tmp_table_field();
11462
bool maybe_null=(*cur_group->item)->maybe_null;
11463
key_part_info->null_bit=0;
11464
key_part_info->field= field;
11465
key_part_info->offset= field->offset(table->record[0]);
11466
key_part_info->length= (uint16_t) field->key_length();
11467
key_part_info->type= (uint8_t) field->key_type();
11468
key_part_info->key_type =
11469
((ha_base_keytype) key_part_info->type == HA_KEYTYPE_TEXT ||
11470
(ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT1 ||
11471
(ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT2) ?
11472
0 : FIELDFLAG_BINARY;
11473
if (!using_unique_constraint)
11475
cur_group->buff=(char*) group_buff;
11476
if (!(cur_group->field= field->new_key_field(thd->mem_root,table,
11481
goto err; /* purecov: inspected */
11485
To be able to group on NULL, we reserved place in group_buff
11486
for the NULL flag just before the column. (see above).
11487
The field data is after this flag.
11488
The NULL flag is updated in 'end_update()' and 'end_write()'
11490
keyinfo->flags|= HA_NULL_ARE_EQUAL; // def. that NULL == NULL
11491
key_part_info->null_bit=field->null_bit;
11492
key_part_info->null_offset= (uint) (field->null_ptr -
11493
(uchar*) table->record[0]);
11494
cur_group->buff++; // Pointer to field data
11495
group_buff++; // Skipp null flag
11497
/* In GROUP BY 'a' and 'a ' are equal for VARCHAR fields */
11498
key_part_info->key_part_flag|= HA_END_SPACE_ARE_EQUAL;
11499
group_buff+= cur_group->field->pack_length();
11501
keyinfo->key_length+= key_part_info->length;
11505
if (distinct && field_count != param->hidden_field_count)
11508
Create an unique key or an unique constraint over all columns
11509
that should be in the result. In the temporary table, there are
11510
'param->hidden_field_count' extra columns, whose null bits are stored
11511
in the first 'hidden_null_pack_length' bytes of the row.
11516
Special mode for index creation in MyISAM used to support unique
11517
indexes on blobs with arbitrary length. Such indexes cannot be
11522
null_pack_length-=hidden_null_pack_length;
11523
keyinfo->key_parts= ((field_count-param->hidden_field_count)+
11524
(share->uniques ? test(null_pack_length) : 0));
11525
table->distinct= 1;
11527
if (!(key_part_info= (KEY_PART_INFO*)
11528
alloc_root(&table->mem_root,
11529
keyinfo->key_parts * sizeof(KEY_PART_INFO))))
11531
bzero((void*) key_part_info, keyinfo->key_parts * sizeof(KEY_PART_INFO));
11532
table->key_info=keyinfo;
11533
keyinfo->key_part=key_part_info;
11534
keyinfo->flags=HA_NOSAME | HA_NULL_ARE_EQUAL;
11535
keyinfo->key_length=(uint16_t) reclength;
11536
keyinfo->name= (char*) "distinct_key";
11537
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
11538
keyinfo->rec_per_key=0;
11541
Create an extra field to hold NULL bits so that unique indexes on
11542
blobs can distinguish NULL from 0. This extra field is not needed
11543
when we do not use UNIQUE indexes for blobs.
11545
if (null_pack_length && share->uniques)
11547
key_part_info->null_bit=0;
11548
key_part_info->offset=hidden_null_pack_length;
11549
key_part_info->length=null_pack_length;
11550
key_part_info->field= new Field_string(table->record[0],
11551
(uint32_t) key_part_info->length,
11555
NullS, &my_charset_bin);
11556
if (!key_part_info->field)
11558
key_part_info->field->init(table);
11559
key_part_info->key_type=FIELDFLAG_BINARY;
11560
key_part_info->type= HA_KEYTYPE_BINARY;
11563
/* Create a distinct key over the columns we are going to return */
11564
for (i=param->hidden_field_count, reg_field=table->field + i ;
11566
i++, reg_field++, key_part_info++)
11568
key_part_info->null_bit=0;
11569
key_part_info->field= *reg_field;
11570
key_part_info->offset= (*reg_field)->offset(table->record[0]);
11571
key_part_info->length= (uint16_t) (*reg_field)->pack_length();
11573
The below method of computing the key format length of the
11574
key part is a copy/paste from opt_range.cc, and table.cc.
11575
This should be factored out, e.g. as a method of Field.
11576
In addition it is not clear if any of the Field::*_length
11577
methods is supposed to compute the same length. If so, it
11580
key_part_info->store_length= key_part_info->length;
11582
if ((*reg_field)->real_maybe_null())
11583
key_part_info->store_length+= HA_KEY_NULL_LENGTH;
11584
if ((*reg_field)->type() == DRIZZLE_TYPE_BLOB ||
11585
(*reg_field)->real_type() == DRIZZLE_TYPE_VARCHAR)
11586
key_part_info->store_length+= HA_KEY_BLOB_LENGTH;
11588
key_part_info->type= (uint8_t) (*reg_field)->key_type();
11589
key_part_info->key_type =
11590
((ha_base_keytype) key_part_info->type == HA_KEYTYPE_TEXT ||
11591
(ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT1 ||
11592
(ha_base_keytype) key_part_info->type == HA_KEYTYPE_VARTEXT2) ?
11593
0 : FIELDFLAG_BINARY;
11597
if (thd->is_fatal_error) // If end of memory
11598
goto err; /* purecov: inspected */
11599
share->db_record_offset= 1;
11600
if (share->db_type() == myisam_hton)
11602
if (create_myisam_tmp_table(table, param->keyinfo, param->start_recinfo,
11603
¶m->recinfo, select_options))
11606
if (open_tmp_table(table))
11609
thd->mem_root= mem_root_save;
11614
thd->mem_root= mem_root_save;
11615
free_tmp_table(thd,table); /* purecov: inspected */
11616
if (temp_pool_slot != MY_BIT_NONE)
11617
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11618
return(NULL); /* purecov: inspected */
11625
Create a temporary table to weed out duplicate rowid combinations
11629
create_duplicate_weedout_tmp_table()
11631
uniq_tuple_length_arg
11635
Create a temporary table to weed out duplicate rowid combinations. The
11636
table has a single column that is a concatenation of all rowids in the
11639
Depending on the needed length, there are two cases:
11641
1. When the length of the column < max_key_length:
11643
CREATE TABLE tmp (col VARBINARY(n) NOT NULL, UNIQUE KEY(col));
11645
2. Otherwise (not a valid SQL syntax but internally supported):
11647
CREATE TABLE tmp (col VARBINARY NOT NULL, UNIQUE CONSTRAINT(col));
11649
The code in this function was produced by extraction of relevant parts
11650
from create_tmp_table().
11657
TABLE *create_duplicate_weedout_tmp_table(THD *thd,
11658
uint uniq_tuple_length_arg,
11659
SJ_TMP_TABLE *sjtbl)
11661
MEM_ROOT *mem_root_save, own_root;
11663
TABLE_SHARE *share;
11664
uint temp_pool_slot=MY_BIT_NONE;
11665
char *tmpname,path[FN_REFLEN];
11667
KEY_PART_INFO *key_part_info;
11672
MI_COLUMNDEF *recinfo, *start_recinfo;
11673
bool using_unique_constraint=false;
11674
bool use_packed_rows= false;
11675
Field *field, *key_field;
11676
uint blob_count, null_pack_length, null_count;
11681
STEP 1: Get temporary table name
11683
statistic_increment(thd->status_var.created_tmp_tables, &LOCK_status);
11684
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
11685
temp_pool_slot = bitmap_lock_set_next(&temp_pool);
11687
if (temp_pool_slot != MY_BIT_NONE) // we got a slot
11688
sprintf(path, "%s_%lx_%i", tmp_file_prefix,
11689
current_pid, temp_pool_slot);
11692
/* if we run out of slots or we are not using tempool */
11693
sprintf(path,"%s%lx_%lx_%x", tmp_file_prefix,current_pid,
11694
thd->thread_id, thd->tmp_table++);
11696
fn_format(path, path, mysql_tmpdir, "", MY_REPLACE_EXT|MY_UNPACK_FILENAME);
11698
/* STEP 2: Figure if we'll be using a key or blob+constraint */
11699
if (uniq_tuple_length_arg >= CONVERT_IF_BIGGER_TO_BLOB)
11700
using_unique_constraint= true;
11702
/* STEP 3: Allocate memory for temptable description */
11703
init_sql_alloc(&own_root, TABLE_ALLOC_BLOCK_SIZE, 0);
11704
if (!multi_alloc_root(&own_root,
11705
&table, sizeof(*table),
11706
&share, sizeof(*share),
11707
®_field, sizeof(Field*) * (1+1),
11708
&blob_field, sizeof(uint)*2,
11709
&keyinfo, sizeof(*keyinfo),
11710
&key_part_info, sizeof(*key_part_info) * 2,
11712
sizeof(*recinfo)*(1*2+4),
11713
&tmpname, (uint) strlen(path)+1,
11714
&group_buff, (!using_unique_constraint ?
11715
uniq_tuple_length_arg : 0),
11716
&bitmaps, bitmap_buffer_size(1)*2,
11719
if (temp_pool_slot != MY_BIT_NONE)
11720
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11723
strmov(tmpname,path);
11726
/* STEP 4: Create TABLE description */
11727
bzero((char*) table,sizeof(*table));
11728
bzero((char*) reg_field,sizeof(Field*)*2);
11730
table->mem_root= own_root;
11731
mem_root_save= thd->mem_root;
11732
thd->mem_root= &table->mem_root;
11734
table->field=reg_field;
11735
table->alias= "weedout-tmp";
11736
table->reginfo.lock_type=TL_WRITE; /* Will be updated */
11737
table->db_stat=HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
11739
table->temp_pool_slot = temp_pool_slot;
11740
table->copy_blobs= 1;
11741
table->in_use= thd;
11742
table->quick_keys.init();
11743
table->covering_keys.init();
11744
table->keys_in_use_for_query.init();
11747
init_tmp_table_share(thd, share, "", 0, tmpname, tmpname);
11748
share->blob_field= blob_field;
11749
share->blob_ptr_size= portable_sizeof_char_ptr;
11750
share->db_low_byte_first=1; // True for HEAP and MyISAM
11751
share->table_charset= NULL;
11752
share->primary_key= MAX_KEY; // Indicate no primary key
11753
share->keys_for_keyread.init();
11754
share->keys_in_use.init();
11758
/* Create the field */
11761
For the sake of uniformity, always use Field_varstring (altough we could
11762
use Field_string for shorter keys)
11764
field= new Field_varstring(uniq_tuple_length_arg, false, "rowids", share,
11768
field->table= table;
11769
field->key_start.init(0);
11770
field->part_of_key.init(0);
11771
field->part_of_sortkey.init(0);
11772
field->unireg_check= Field::NONE;
11773
field->flags= (NOT_NULL_FLAG | BINARY_FLAG | NO_DEFAULT_VALUE_FLAG);
11774
field->reset_fields();
11775
field->init(table);
11776
field->orig_table= NULL;
11778
field->field_index= 0;
11780
*(reg_field++)= field;
11785
share->blob_fields= 0;
11788
uint reclength= field->pack_length();
11789
if (using_unique_constraint)
11791
share->db_plugin= ha_lock_engine(0, myisam_hton);
11792
table->file= get_new_handler(share, &table->mem_root,
11794
assert(uniq_tuple_length_arg <= table->file->max_key_length());
11798
share->db_plugin= ha_lock_engine(0, heap_hton);
11799
table->file= get_new_handler(share, &table->mem_root,
11807
null_pack_length= 1;
11808
reclength += null_pack_length;
11810
share->reclength= reclength;
11812
uint alloc_length=ALIGN_SIZE(share->reclength + MI_UNIQUE_HASH_LENGTH+1);
11813
share->rec_buff_length= alloc_length;
11814
if (!(table->record[0]= (uchar*)
11815
alloc_root(&table->mem_root, alloc_length*3)))
11817
table->record[1]= table->record[0]+alloc_length;
11818
share->default_values= table->record[1]+alloc_length;
11820
setup_tmp_table_column_bitmaps(table, bitmaps);
11822
recinfo= start_recinfo;
11823
null_flags=(uchar*) table->record[0];
11824
pos=table->record[0]+ null_pack_length;
11825
if (null_pack_length)
11827
bzero((uchar*) recinfo,sizeof(*recinfo));
11828
recinfo->type=FIELD_NORMAL;
11829
recinfo->length=null_pack_length;
11831
bfill(null_flags,null_pack_length,255); // Set null fields
11833
table->null_flags= (uchar*) table->record[0];
11834
share->null_fields= null_count;
11835
share->null_bytes= null_pack_length;
11840
//Field *field= *reg_field;
11842
bzero((uchar*) recinfo,sizeof(*recinfo));
11843
field->move_field(pos,(uchar*) 0,0);
11847
Test if there is a default field value. The test for ->ptr is to skip
11848
'offset' fields generated by initalize_tables
11850
// Initialize the table field:
11851
bzero(field->ptr, field->pack_length());
11853
length=field->pack_length();
11856
/* Make entry for create table */
11857
recinfo->length=length;
11858
if (field->flags & BLOB_FLAG)
11859
recinfo->type= (int) FIELD_BLOB;
11860
else if (use_packed_rows &&
11861
field->real_type() == DRIZZLE_TYPE_STRING &&
11862
length >= MIN_STRING_LENGTH_TO_PACK_ROWS)
11863
recinfo->type=FIELD_SKIP_ENDSPACE;
11865
recinfo->type=FIELD_NORMAL;
11867
field->table_name= &table->alias;
11870
//param->recinfo=recinfo;
11871
//store_record(table,s->default_values); // Make empty default record
11873
if (thd->variables.tmp_table_size == ~ (uint64_t) 0) // No limit
11874
share->max_rows= ~(ha_rows) 0;
11876
share->max_rows= (ha_rows) (((share->db_type() == heap_hton) ?
11877
min(thd->variables.tmp_table_size,
11878
thd->variables.max_heap_table_size) :
11879
thd->variables.tmp_table_size) /
11881
set_if_bigger(share->max_rows,1); // For dummy start options
11884
//// keyinfo= param->keyinfo;
11888
share->uniques= test(using_unique_constraint);
11889
table->key_info=keyinfo;
11890
keyinfo->key_part=key_part_info;
11891
keyinfo->flags=HA_NOSAME;
11892
keyinfo->usable_key_parts= keyinfo->key_parts= 1;
11893
keyinfo->key_length=0;
11894
keyinfo->rec_per_key=0;
11895
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
11896
keyinfo->name= (char*) "weedout_key";
11898
key_part_info->null_bit=0;
11899
key_part_info->field= field;
11900
key_part_info->offset= field->offset(table->record[0]);
11901
key_part_info->length= (uint16_t) field->key_length();
11902
key_part_info->type= (uint8_t) field->key_type();
11903
key_part_info->key_type = FIELDFLAG_BINARY;
11904
if (!using_unique_constraint)
11906
if (!(key_field= field->new_key_field(thd->mem_root, table,
11911
key_part_info->key_part_flag|= HA_END_SPACE_ARE_EQUAL; //todo need this?
11913
keyinfo->key_length+= key_part_info->length;
11917
if (thd->is_fatal_error) // If end of memory
11919
share->db_record_offset= 1;
11920
if (share->db_type() == myisam_hton)
11923
if (create_myisam_tmp_table(table, keyinfo, start_recinfo, &recinfo, 0))
11926
sjtbl->start_recinfo= start_recinfo;
11927
sjtbl->recinfo= recinfo;
11928
if (open_tmp_table(table))
11931
thd->mem_root= mem_root_save;
11935
thd->mem_root= mem_root_save;
11936
free_tmp_table(thd,table); /* purecov: inspected */
11937
if (temp_pool_slot != MY_BIT_NONE)
11938
bitmap_lock_clear_bit(&temp_pool, temp_pool_slot);
11939
return(NULL); /* purecov: inspected */
11942
/****************************************************************************/
11945
Create a reduced TABLE object with properly set up Field list from a
11946
list of field definitions.
11948
The created table doesn't have a table handler associated with
11949
it, has no keys, no group/distinct, no copy_funcs array.
11950
The sole purpose of this TABLE object is to use the power of Field
11951
class to read/write data to/from table->record[0]. Then one can store
11952
the record in any container (RB tree, hash, etc).
11953
The table is created in THD mem_root, so are the table's fields.
11954
Consequently, if you don't BLOB fields, you don't need to free it.
11956
@param thd connection handle
11957
@param field_list list of column definitions
11960
0 if out of memory, TABLE object in case of success
11963
TABLE *create_virtual_tmp_table(THD *thd, List<Create_field> &field_list)
11965
uint field_count= field_list.elements;
11966
uint blob_count= 0;
11968
Create_field *cdef; /* column definition */
11969
uint record_length= 0;
11970
uint null_count= 0; /* number of columns which may be null */
11971
uint null_pack_length; /* NULL representation array length */
11975
TABLE_SHARE *share;
11977
if (!multi_alloc_root(thd->mem_root,
11978
&table, sizeof(*table),
11979
&share, sizeof(*share),
11980
&field, (field_count + 1) * sizeof(Field*),
11981
&blob_field, (field_count+1) *sizeof(uint),
11982
&bitmaps, bitmap_buffer_size(field_count)*2,
11986
bzero(table, sizeof(*table));
11987
bzero(share, sizeof(*share));
11988
table->field= field;
11990
share->blob_field= blob_field;
11991
share->fields= field_count;
11992
share->blob_ptr_size= portable_sizeof_char_ptr;
11993
setup_tmp_table_column_bitmaps(table, bitmaps);
11995
/* Create all fields and calculate the total length of record */
11996
List_iterator_fast<Create_field> it(field_list);
11997
while ((cdef= it++))
11999
*field= make_field(share, 0, cdef->length,
12000
(uchar*) (f_maybe_null(cdef->pack_flag) ? "" : 0),
12001
f_maybe_null(cdef->pack_flag) ? 1 : 0,
12002
cdef->pack_flag, cdef->sql_type, cdef->charset,
12003
cdef->unireg_check,
12004
cdef->interval, cdef->field_name);
12007
(*field)->init(table);
12008
record_length+= (*field)->pack_length();
12009
if (! ((*field)->flags & NOT_NULL_FLAG))
12012
if ((*field)->flags & BLOB_FLAG)
12013
share->blob_field[blob_count++]= (uint) (field - table->field);
12017
*field= NULL; /* mark the end of the list */
12018
share->blob_field[blob_count]= 0; /* mark the end of the list */
12019
share->blob_fields= blob_count;
12021
null_pack_length= (null_count + 7)/8;
12022
share->reclength= record_length + null_pack_length;
12023
share->rec_buff_length= ALIGN_SIZE(share->reclength + 1);
12024
table->record[0]= (uchar*) thd->alloc(share->rec_buff_length);
12025
if (!table->record[0])
12028
if (null_pack_length)
12030
table->null_flags= (uchar*) table->record[0];
12031
share->null_fields= null_count;
12032
share->null_bytes= null_pack_length;
12035
table->in_use= thd; /* field->reset() may access table->in_use */
12037
/* Set up field pointers */
12038
uchar *null_pos= table->record[0];
12039
uchar *field_pos= null_pos + share->null_bytes;
12042
for (field= table->field; *field; ++field)
12044
Field *cur_field= *field;
12045
if ((cur_field->flags & NOT_NULL_FLAG))
12046
cur_field->move_field(field_pos);
12049
cur_field->move_field(field_pos, (uchar*) null_pos, null_bit);
12051
if (null_bit == (1 << 8))
12057
cur_field->reset();
12059
field_pos+= cur_field->pack_length();
12064
for (field= table->field; *field; ++field)
12065
delete *field; /* just invokes field destructor */
12070
static bool open_tmp_table(TABLE *table)
12073
if ((error=table->file->ha_open(table, table->s->table_name.str,O_RDWR,
12074
HA_OPEN_TMP_TABLE | HA_OPEN_INTERNAL_TABLE)))
12076
table->file->print_error(error,MYF(0)); /* purecov: inspected */
12080
(void) table->file->extra(HA_EXTRA_QUICK); /* Faster */
12086
Create MyISAM temporary table
12089
create_myisam_tmp_table()
12090
table Table object that descrimes the table to be created
12091
keyinfo Description of the index (there is always one index)
12092
start_recinfo MyISAM's column descriptions
12093
recinfo INOUT End of MyISAM's column descriptions
12094
options Option bits
12097
Create a MyISAM temporary table according to passed description. The is
12098
assumed to have one unique index or constraint.
12100
The passed array or MI_COLUMNDEF structures must have this form:
12102
1. 1-byte column (afaiu for 'deleted' flag) (note maybe not 1-byte
12103
when there are many nullable columns)
12105
3. One free MI_COLUMNDEF element (*recinfo points here)
12107
This function may use the free element to create hash column for unique
12115
static bool create_myisam_tmp_table(TABLE *table, KEY *keyinfo,
12116
MI_COLUMNDEF *start_recinfo,
12117
MI_COLUMNDEF **recinfo,
12122
MI_UNIQUEDEF uniquedef;
12123
TABLE_SHARE *share= table->s;
12126
{ // Get keys for ni_create
12127
bool using_unique_constraint=0;
12128
HA_KEYSEG *seg= (HA_KEYSEG*) alloc_root(&table->mem_root,
12129
sizeof(*seg) * keyinfo->key_parts);
12133
bzero(seg, sizeof(*seg) * keyinfo->key_parts);
12134
if (keyinfo->key_length >= table->file->max_key_length() ||
12135
keyinfo->key_parts > table->file->max_key_parts() ||
12138
/* Can't create a key; Make a unique constraint instead of a key */
12141
using_unique_constraint=1;
12142
bzero((char*) &uniquedef,sizeof(uniquedef));
12143
uniquedef.keysegs=keyinfo->key_parts;
12145
uniquedef.null_are_equal=1;
12147
/* Create extra column for hash value */
12148
bzero((uchar*) *recinfo,sizeof(**recinfo));
12149
(*recinfo)->type= FIELD_CHECK;
12150
(*recinfo)->length=MI_UNIQUE_HASH_LENGTH;
12152
share->reclength+=MI_UNIQUE_HASH_LENGTH;
12156
/* Create an unique key */
12157
bzero((char*) &keydef,sizeof(keydef));
12158
keydef.flag=HA_NOSAME | HA_BINARY_PACK_KEY | HA_PACK_KEY;
12159
keydef.keysegs= keyinfo->key_parts;
12162
for (uint i=0; i < keyinfo->key_parts ; i++,seg++)
12164
Field *field=keyinfo->key_part[i].field;
12166
seg->language= field->charset()->number;
12167
seg->length= keyinfo->key_part[i].length;
12168
seg->start= keyinfo->key_part[i].offset;
12169
if (field->flags & BLOB_FLAG)
12172
((keyinfo->key_part[i].key_type & FIELDFLAG_BINARY) ?
12173
HA_KEYTYPE_VARBINARY2 : HA_KEYTYPE_VARTEXT2);
12174
seg->bit_start= (uint8_t)(field->pack_length() - share->blob_ptr_size);
12175
seg->flag= HA_BLOB_PART;
12176
seg->length=0; // Whole blob in unique constraint
12180
seg->type= keyinfo->key_part[i].type;
12181
/* Tell handler if it can do suffic space compression */
12182
if (field->real_type() == DRIZZLE_TYPE_STRING &&
12183
keyinfo->key_part[i].length > 4)
12184
seg->flag|= HA_SPACE_PACK;
12186
if (!(field->flags & NOT_NULL_FLAG))
12188
seg->null_bit= field->null_bit;
12189
seg->null_pos= (uint) (field->null_ptr - (uchar*) table->record[0]);
12191
We are using a GROUP BY on something that contains NULL
12192
In this case we have to tell MyISAM that two NULL should
12193
on INSERT be regarded at the same value
12195
if (!using_unique_constraint)
12196
keydef.flag|= HA_NULL_ARE_EQUAL;
12200
MI_CREATE_INFO create_info;
12201
bzero((char*) &create_info,sizeof(create_info));
12203
if ((options & (OPTION_BIG_TABLES | SELECT_SMALL_RESULT)) ==
12205
create_info.data_file_length= ~(uint64_t) 0;
12207
if ((error=mi_create(share->table_name.str, share->keys, &keydef,
12208
(uint) (*recinfo-start_recinfo),
12210
share->uniques, &uniquedef,
12212
HA_CREATE_TMP_TABLE)))
12214
table->file->print_error(error,MYF(0)); /* purecov: inspected */
12218
status_var_increment(table->in_use->status_var.created_tmp_disk_tables);
12219
share->db_record_offset= 1;
12227
free_tmp_table(THD *thd, TABLE *entry)
12229
MEM_ROOT own_root= entry->mem_root;
12230
const char *save_proc_info;
12232
save_proc_info=thd->proc_info;
12233
thd_proc_info(thd, "removing tmp table");
12237
if (entry->db_stat)
12238
entry->file->ha_drop_table(entry->s->table_name.str);
12240
entry->file->ha_delete_table(entry->s->table_name.str);
12241
delete entry->file;
12245
for (Field **ptr=entry->field ; *ptr ; ptr++)
12247
free_io_cache(entry);
12249
if (entry->temp_pool_slot != MY_BIT_NONE)
12250
bitmap_lock_clear_bit(&temp_pool, entry->temp_pool_slot);
12252
plugin_unlock(0, entry->s->db_plugin);
12254
free_root(&own_root, MYF(0)); /* the table is allocated in its own root */
12255
thd_proc_info(thd, save_proc_info);
12261
If a HEAP table gets full, create a MyISAM table and copy all rows
12265
bool create_myisam_from_heap(THD *thd, TABLE *table,
12266
MI_COLUMNDEF *start_recinfo,
12267
MI_COLUMNDEF **recinfo,
12268
int error, bool ignore_last_dupp_key_error)
12272
const char *save_proc_info;
12275
if (table->s->db_type() != heap_hton ||
12276
error != HA_ERR_RECORD_FILE_FULL)
12278
table->file->print_error(error,MYF(0));
12283
new_table.s= &share;
12284
new_table.s->db_plugin= ha_lock_engine(thd, myisam_hton);
12285
if (!(new_table.file= get_new_handler(&share, &new_table.mem_root,
12286
new_table.s->db_type())))
12287
return(1); // End of memory
12289
save_proc_info=thd->proc_info;
12290
thd_proc_info(thd, "converting HEAP to MyISAM");
12292
if (create_myisam_tmp_table(&new_table, table->key_info, start_recinfo,
12293
recinfo, thd->lex->select_lex.options |
12296
if (open_tmp_table(&new_table))
12298
if (table->file->indexes_are_disabled())
12299
new_table.file->ha_disable_indexes(HA_KEY_SWITCH_ALL);
12300
table->file->ha_index_or_rnd_end();
12301
table->file->ha_rnd_init(1);
12302
if (table->no_rows)
12304
new_table.file->extra(HA_EXTRA_NO_ROWS);
12305
new_table.no_rows=1;
12308
#ifdef TO_BE_DONE_LATER_IN_4_1
12310
To use start_bulk_insert() (which is new in 4.1) we need to find
12311
all places where a corresponding end_bulk_insert() should be put.
12313
table->file->info(HA_STATUS_VARIABLE); /* update table->file->stats.records */
12314
new_table.file->ha_start_bulk_insert(table->file->stats.records);
12316
/* HA_EXTRA_WRITE_CACHE can stay until close, no need to disable it */
12317
new_table.file->extra(HA_EXTRA_WRITE_CACHE);
12321
copy all old rows from heap table to MyISAM table
12322
This is the only code that uses record[1] to read/write but this
12323
is safe as this is a temporary MyISAM table without timestamp/autoincrement.
12325
while (!table->file->rnd_next(new_table.record[1]))
12327
write_err= new_table.file->ha_write_row(new_table.record[1]);
12331
/* copy row that filled HEAP table */
12332
if ((write_err=new_table.file->ha_write_row(table->record[0])))
12334
if (new_table.file->is_fatal_error(write_err, HA_CHECK_DUP) ||
12335
!ignore_last_dupp_key_error)
12339
/* remove heap table and change to use myisam table */
12340
(void) table->file->ha_rnd_end();
12341
(void) table->file->close(); // This deletes the table !
12342
delete table->file;
12344
plugin_unlock(0, table->s->db_plugin);
12345
share.db_plugin= my_plugin_lock(0, &share.db_plugin);
12346
new_table.s= table->s; // Keep old share
12350
table->file->change_table_ptr(table, table->s);
12351
table->use_all_columns();
12352
if (save_proc_info)
12354
const char *new_proc_info=
12355
(!strcmp(save_proc_info,"Copying to tmp table") ?
12356
"Copying to tmp table on disk" : save_proc_info);
12357
thd_proc_info(thd, new_proc_info);
12362
table->file->print_error(write_err, MYF(0));
12363
(void) table->file->ha_rnd_end();
12364
(void) new_table.file->close();
12366
new_table.file->ha_delete_table(new_table.s->table_name.str);
12368
delete new_table.file;
12369
thd_proc_info(thd, save_proc_info);
12370
table->mem_root= new_table.mem_root;
3191
return left_item->eq(*const_item, 1);
3192
*const_item=left_item;
12778
SemiJoinDuplicateElimination: Weed out duplicate row combinations
12781
do_sj_dups_weedout()
12785
1 The row combination is a duplicate (discard it)
12786
0 The row combination is not a duplicate (continue)
12789
int do_sj_dups_weedout(THD *thd, SJ_TMP_TABLE *sjtbl)
12792
SJ_TMP_TABLE::TAB *tab= sjtbl->tabs;
12793
SJ_TMP_TABLE::TAB *tab_end= sjtbl->tabs_end;
12794
uchar *ptr= sjtbl->tmp_table->record[0] + 1;
12795
uchar *nulls_ptr= ptr;
12797
/* Put the the rowids tuple into table->record[0]: */
12799
// 1. Store the length
12800
if (((Field_varstring*)(sjtbl->tmp_table->field[0]))->length_bytes == 1)
12802
*ptr= (uchar)(sjtbl->rowid_len + sjtbl->null_bytes);
12807
int2store(ptr, sjtbl->rowid_len + sjtbl->null_bytes);
12811
// 2. Zero the null bytes
12812
if (sjtbl->null_bytes)
12814
bzero(ptr, sjtbl->null_bytes);
12815
ptr += sjtbl->null_bytes;
12818
// 3. Put the rowids
12819
for (uint i=0; tab != tab_end; tab++, i++)
12821
handler *h= tab->join_tab->table->file;
12822
if (tab->join_tab->table->maybe_null && tab->join_tab->table->null_row)
12824
/* It's a NULL-complemented row */
12825
*(nulls_ptr + tab->null_byte) |= tab->null_bit;
12826
bzero(ptr + tab->rowid_offset, h->ref_length);
12830
/* Copy the rowid value */
12831
if (tab->join_tab->rowid_keep_flags & JOIN_TAB::CALL_POSITION)
12832
h->position(tab->join_tab->table->record[0]);
12833
memcpy(ptr + tab->rowid_offset, h->ref, h->ref_length);
12837
error= sjtbl->tmp_table->file->ha_write_row(sjtbl->tmp_table->record[0]);
12840
/* create_myisam_from_heap will generate error if needed */
12841
if (sjtbl->tmp_table->file->is_fatal_error(error, HA_CHECK_DUP) &&
12842
create_myisam_from_heap(thd, sjtbl->tmp_table, sjtbl->start_recinfo,
12843
&sjtbl->recinfo, error, 1))
12845
//return (error == HA_ERR_FOUND_DUPP_KEY || error== HA_ERR_FOUND_DUPP_UNIQUE) ? 1: -1;
12853
SemiJoinDuplicateElimination: Reset the temporary table
12856
int do_sj_reset(SJ_TMP_TABLE *sj_tbl)
12858
if (sj_tbl->tmp_table)
12859
return sj_tbl->tmp_table->file->ha_delete_all_rows();
12864
Process one record of the nested loop join.
12866
This function will evaluate parts of WHERE/ON clauses that are
12867
applicable to the partial record on hand and in case of success
12868
submit this record to the next level of the nested loop.
12871
static enum_nested_loop_state
12872
evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
12875
bool not_used_in_distinct=join_tab->not_used_in_distinct;
12876
ha_rows found_records=join->found_records;
12877
COND *select_cond= join_tab->select_cond;
12879
if (error > 0 || (join->thd->is_error())) // Fatal error
12880
return NESTED_LOOP_ERROR;
12882
return NESTED_LOOP_NO_MORE_ROWS;
12883
if (join->thd->killed) // Aborted by user
12885
join->thd->send_kill_message();
12886
return NESTED_LOOP_KILLED; /* purecov: inspected */
12888
if (!select_cond || select_cond->val_int())
12891
There is no select condition or the attached pushed down
12892
condition is true => a match is found.
12895
while (join_tab->first_unmatched && found)
12898
The while condition is always false if join_tab is not
12899
the last inner join table of an outer join operation.
12901
JOIN_TAB *first_unmatched= join_tab->first_unmatched;
12903
Mark that a match for current outer table is found.
12904
This activates push down conditional predicates attached
12905
to the all inner tables of the outer join.
12907
first_unmatched->found= 1;
12908
for (JOIN_TAB *tab= first_unmatched; tab <= join_tab; tab++)
12910
if (tab->table->reginfo.not_exists_optimize)
12911
return NESTED_LOOP_NO_MORE_ROWS;
12912
/* Check all predicates that has just been activated. */
12914
Actually all predicates non-guarded by first_unmatched->found
12915
will be re-evaluated again. It could be fixed, but, probably,
12916
it's not worth doing now.
12918
if (tab->select_cond && !tab->select_cond->val_int())
12920
/* The condition attached to table tab is false */
12921
if (tab == join_tab)
12926
Set a return point if rejected predicate is attached
12927
not to the last table of the current nest level.
12929
join->return_tab= tab;
12930
return NESTED_LOOP_OK;
12935
Check whether join_tab is not the last inner table
12936
for another embedding outer join.
12938
if ((first_unmatched= first_unmatched->first_upper) &&
12939
first_unmatched->last_inner != join_tab)
12940
first_unmatched= 0;
12941
join_tab->first_unmatched= first_unmatched;
12944
JOIN_TAB *return_tab= join->return_tab;
12945
join_tab->found_match= true;
12946
if (join_tab->check_weed_out_table)
12948
int res= do_sj_dups_weedout(join->thd, join_tab->check_weed_out_table);
12950
return NESTED_LOOP_ERROR;
12952
return NESTED_LOOP_OK;
12954
else if (join_tab->do_firstmatch)
12957
We should return to the join_tab->do_firstmatch after we have
12958
enumerated all the suffixes for current prefix row combination
12960
return_tab= join_tab->do_firstmatch;
12964
It was not just a return to lower loop level when one
12965
of the newly activated predicates is evaluated as false
12966
(See above join->return_tab= tab).
12968
join->examined_rows++;
12969
join->thd->row_count++;
12973
enum enum_nested_loop_state rc;
12974
/* A match from join_tab is found for the current partial join. */
12975
rc= (*join_tab->next_select)(join, join_tab+1, 0);
12976
if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS)
12978
if (return_tab < join->return_tab)
12979
join->return_tab= return_tab;
12981
if (join->return_tab < join_tab)
12982
return NESTED_LOOP_OK;
12984
Test if this was a SELECT DISTINCT query on a table that
12985
was not in the field list; In this case we can abort if
12986
we found a row, as no new rows can be added to the result.
12988
if (not_used_in_distinct && found_records != join->found_records)
12989
return NESTED_LOOP_NO_MORE_ROWS;
12992
join_tab->read_record.file->unlock_row();
12997
The condition pushed down to the table join_tab rejects all rows
12998
with the beginning coinciding with the current partial join.
13000
join->examined_rows++;
13001
join->thd->row_count++;
13002
join_tab->read_record.file->unlock_row();
13004
return NESTED_LOOP_OK;
13011
Construct a NULL complimented partial join record and feed it to the next
13012
level of the nested loop. This function is used in case we have
13013
an OUTER join and no matching record was found.
13016
static enum_nested_loop_state
13017
evaluate_null_complemented_join_record(JOIN *join, JOIN_TAB *join_tab)
13020
The table join_tab is the first inner table of a outer join operation
13021
and no matches has been found for the current outer row.
13023
JOIN_TAB *last_inner_tab= join_tab->last_inner;
13024
/* Cache variables for faster loop */
13026
for ( ; join_tab <= last_inner_tab ; join_tab++)
13028
/* Change the the values of guard predicate variables. */
13029
join_tab->found= 1;
13030
join_tab->not_null_compl= 0;
13031
/* The outer row is complemented by nulls for each inner tables */
13032
restore_record(join_tab->table,s->default_values); // Make empty record
13033
mark_as_null_row(join_tab->table); // For group by without error
13034
select_cond= join_tab->select_cond;
13035
/* Check all attached conditions for inner table rows. */
13036
if (select_cond && !select_cond->val_int())
13037
return NESTED_LOOP_OK;
13041
The row complemented by nulls might be the first row
13042
of embedding outer joins.
13043
If so, perform the same actions as in the code
13044
for the first regular outer join row above.
13048
JOIN_TAB *first_unmatched= join_tab->first_unmatched;
13049
if ((first_unmatched= first_unmatched->first_upper) &&
13050
first_unmatched->last_inner != join_tab)
13051
first_unmatched= 0;
13052
join_tab->first_unmatched= first_unmatched;
13053
if (!first_unmatched)
13055
first_unmatched->found= 1;
13056
for (JOIN_TAB *tab= first_unmatched; tab <= join_tab; tab++)
13058
if (tab->select_cond && !tab->select_cond->val_int())
13060
join->return_tab= tab;
13061
return NESTED_LOOP_OK;
13066
The row complemented by nulls satisfies all conditions
13067
attached to inner tables.
13068
Send the row complemented by nulls to be joined with the
13071
return (*join_tab->next_select)(join, join_tab+1, 0);
13075
static enum_nested_loop_state
13076
flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skip_last)
13078
enum_nested_loop_state rc= NESTED_LOOP_OK;
13082
join_tab->table->null_row= 0;
13083
if (!join_tab->cache.records)
13084
return NESTED_LOOP_OK; /* Nothing to do */
13086
(void) store_record_in_cache(&join_tab->cache); // Must save this for later
13087
if (join_tab->use_quick == 2)
13089
if (join_tab->select->quick)
13090
{ /* Used quick select last. reset it */
13091
delete join_tab->select->quick;
13092
join_tab->select->quick=0;
13095
/* read through all records */
13096
if ((error=join_init_read_record(join_tab)))
13098
reset_cache_write(&join_tab->cache);
13099
return error < 0 ? NESTED_LOOP_NO_MORE_ROWS: NESTED_LOOP_ERROR;
13102
for (JOIN_TAB *tmp=join->join_tab; tmp != join_tab ; tmp++)
13104
tmp->status=tmp->table->status;
13105
tmp->table->status=0;
13108
info= &join_tab->read_record;
13111
if (join->thd->killed)
13113
join->thd->send_kill_message();
13114
return NESTED_LOOP_KILLED; // Aborted by user /* purecov: inspected */
13116
SQL_SELECT *select=join_tab->select;
13117
if (rc == NESTED_LOOP_OK &&
13118
(!join_tab->cache.select || !join_tab->cache.select->skip_record()))
13121
reset_cache_read(&join_tab->cache);
13122
for (i=(join_tab->cache.records- (skip_last ? 1 : 0)) ; i-- > 0 ;)
13124
read_cached_record(join_tab);
13125
if (!select || !select->skip_record())
13128
if (!join_tab->check_weed_out_table ||
13129
!(res= do_sj_dups_weedout(join->thd, join_tab->check_weed_out_table)))
13131
rc= (join_tab->next_select)(join,join_tab+1,0);
13132
if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS)
13134
reset_cache_write(&join_tab->cache);
13139
return NESTED_LOOP_ERROR;
13143
} while (!(error=info->read_record(info)));
13146
read_cached_record(join_tab); // Restore current record
13147
reset_cache_write(&join_tab->cache);
13148
if (error > 0) // Fatal error
13149
return NESTED_LOOP_ERROR; /* purecov: inspected */
13150
for (JOIN_TAB *tmp2=join->join_tab; tmp2 != join_tab ; tmp2++)
13151
tmp2->table->status=tmp2->status;
13152
return NESTED_LOOP_OK;
13156
/*****************************************************************************
13157
The different ways to read a record
13158
Returns -1 if row was not found, 0 if row was found and 1 on errors
13159
*****************************************************************************/
13161
/** Help function when we get some an error from the table handler. */
13163
int report_error(TABLE *table, int error)
13165
if (error == HA_ERR_END_OF_FILE || error == HA_ERR_KEY_NOT_FOUND)
13167
table->status= STATUS_GARBAGE;
13168
return -1; // key not found; ok
13171
Locking reads can legally return also these errors, do not
13172
print them to the .err log
13174
if (error != HA_ERR_LOCK_DEADLOCK && error != HA_ERR_LOCK_WAIT_TIMEOUT)
13175
sql_print_error("Got error %d when reading table '%s'",
13176
error, table->s->path.str);
13177
table->file->print_error(error,MYF(0));
13182
int safe_index_read(JOIN_TAB *tab)
13185
TABLE *table= tab->table;
13186
if ((error=table->file->index_read_map(table->record[0],
3585
int safe_index_read(JoinTable *tab)
3588
Table *table= tab->table;
3589
if ((error=table->cursor->index_read_map(table->record[0],
13187
3590
tab->ref.key_buff,
13188
3591
make_prev_keypart_map(tab->ref.key_parts),
13189
3592
HA_READ_KEY_EXACT)))
13190
return report_error(table, error);
3593
return table->report_error(error);
13196
join_read_const_table(JOIN_TAB *tab, POSITION *pos)
3597
int join_read_const_table(JoinTable *tab, optimizer::Position *pos)
13199
TABLE *table=tab->table;
3600
Table *table=tab->table;
13200
3601
table->const_table=1;
13201
3602
table->null_row=0;
13202
3603
table->status=STATUS_NO_RECORD;
13204
if (tab->type == JT_SYSTEM)
3605
if (tab->type == AM_SYSTEM)
13206
3607
if ((error=join_read_system(tab)))
13207
3608
{ // Info for DESCRIBE
13208
3609
tab->info="const row not found";
13209
3610
/* Mark for EXPLAIN that the row was not found */
13210
pos->records_read=0.0;
13211
pos->ref_depend_map= 0;
13212
if (!table->maybe_null || error > 0)
3611
pos->setFanout(0.0);
3612
pos->clearRefDependMap();
3613
if (! table->maybe_null || error > 0)
13218
if (!table->key_read && table->covering_keys.is_set(tab->ref.key) &&
13219
!table->no_keyread &&
13220
(int) table->reginfo.lock_type <= (int) TL_READ_HIGH_PRIORITY)
3619
if (! table->key_read &&
3620
table->covering_keys.test(tab->ref.key) &&
3621
! table->no_keyread &&
3622
(int) table->reginfo.lock_type <= (int) TL_READ_WITH_SHARED_LOCKS)
13222
3624
table->key_read=1;
13223
table->file->extra(HA_EXTRA_KEYREAD);
3625
table->cursor->extra(HA_EXTRA_KEYREAD);
13224
3626
tab->index= tab->ref.key;
13226
3628
error=join_read_const(tab);
13227
3629
if (table->key_read)
13229
3631
table->key_read=0;
13230
table->file->extra(HA_EXTRA_NO_KEYREAD);
3632
table->cursor->extra(HA_EXTRA_NO_KEYREAD);
13234
3636
tab->info="unique row not found";
13235
3637
/* Mark for EXPLAIN that the row was not found */
13236
pos->records_read=0.0;
13237
pos->ref_depend_map= 0;
3638
pos->setFanout(0.0);
3639
pos->clearRefDependMap();
13238
3640
if (!table->maybe_null || error > 0)
13242
3644
if (*tab->on_expr_ref && !table->null_row)
13244
3646
if ((table->null_row= test((*tab->on_expr_ref)->val_int() == 0)))
13245
mark_as_null_row(table);
3647
table->mark_as_null_row();
13247
3649
if (!table->null_row)
13248
3650
table->maybe_null=0;
17290
/** Allocate memory needed for other rollup functions. */
17292
bool JOIN::rollup_init()
17297
tmp_table_param.quick_group= 0; // Can't create groups in tmp table
17298
rollup.state= ROLLUP::STATE_INITED;
17301
Create pointers to the different sum function groups
17302
These are updated by rollup_make_fields()
17304
tmp_table_param.group_parts= send_group_parts;
17306
if (!(rollup.null_items= (Item_null_result**) thd->alloc((sizeof(Item*) +
17308
sizeof(List<Item>) +
17309
ref_pointer_array_size)
17310
* send_group_parts )))
17313
rollup.fields= (List<Item>*) (rollup.null_items + send_group_parts);
17314
rollup.ref_pointer_arrays= (Item***) (rollup.fields + send_group_parts);
17315
ref_array= (Item**) (rollup.ref_pointer_arrays+send_group_parts);
17318
Prepare space for field list for the different levels
17319
These will be filled up in rollup_make_fields()
17321
for (i= 0 ; i < send_group_parts ; i++)
17323
rollup.null_items[i]= new (thd->mem_root) Item_null_result();
17324
List<Item> *rollup_fields= &rollup.fields[i];
17325
rollup_fields->empty();
17326
rollup.ref_pointer_arrays[i]= ref_array;
17327
ref_array+= all_fields.elements;
17329
for (i= 0 ; i < send_group_parts; i++)
17331
for (j=0 ; j < fields_list.elements ; j++)
17332
rollup.fields[i].push_back(rollup.null_items[i]);
17334
List_iterator<Item> it(all_fields);
17336
while ((item= it++))
17339
bool found_in_group= 0;
17341
for (group_tmp= group_list; group_tmp; group_tmp= group_tmp->next)
17343
if (*group_tmp->item == item)
17345
item->maybe_null= 1;
17347
if (item->const_item())
17350
For ROLLUP queries each constant item referenced in GROUP BY list
17351
is wrapped up into an Item_func object yielding the same value
17352
as the constant item. The objects of the wrapper class are never
17353
considered as constant items and besides they inherit all
17354
properties of the Item_result_field class.
17355
This wrapping allows us to ensure writing constant items
17356
into temporary tables whenever the result of the ROLLUP
17357
operation has to be written into a temporary table, e.g. when
17358
ROLLUP is used together with DISTINCT in the SELECT list.
17359
Usually when creating temporary tables for a intermidiate
17360
result we do not include fields for constant expressions.
17362
Item* new_item= new Item_func_rollup_const(item);
17365
new_item->fix_fields(thd, (Item **) 0);
17366
thd->change_item_tree(it.ref(), new_item);
17367
for (ORDER *tmp= group_tmp; tmp; tmp= tmp->next)
17369
if (*tmp->item == item)
17370
thd->change_item_tree(tmp->item, new_item);
17375
if (item->type() == Item::FUNC_ITEM && !found_in_group)
17377
bool changed= false;
17378
if (change_group_ref(thd, (Item_func *) item, group_list, &changed))
17381
We have to prevent creation of a field in a temporary table for
17382
an expression that contains GROUP BY attributes.
17383
Marking the expression item as 'with_sum_func' will ensure this.
17386
item->with_sum_func= 1;
17394
Fill up rollup structures with pointers to fields to use.
17396
Creates copies of item_sum items for each sum level.
17398
@param fields_arg List of all fields (hidden and real ones)
17399
@param sel_fields Pointer to selected fields
17400
@param func Store here a pointer to all fields
17404
In this case func is pointing to next not used element.
17409
bool JOIN::rollup_make_fields(List<Item> &fields_arg, List<Item> &sel_fields,
17412
List_iterator_fast<Item> it(fields_arg);
17413
Item *first_field= sel_fields.head();
17417
Create field lists for the different levels
17419
The idea here is to have a separate field list for each rollup level to
17420
avoid all runtime checks of which columns should be NULL.
17422
The list is stored in reverse order to get sum function in such an order
17423
in func that it makes it easy to reset them with init_sum_functions()
17425
Assuming: SELECT a, b, c SUM(b) FROM t1 GROUP BY a,b WITH ROLLUP
17427
rollup.fields[0] will contain list where a,b,c is NULL
17428
rollup.fields[1] will contain list where b,c is NULL
17430
rollup.ref_pointer_array[#] points to fields for rollup.fields[#]
17432
sum_funcs_end[0] points to all sum functions
17433
sum_funcs_end[1] points to all sum functions, except grand totals
17437
for (level=0 ; level < send_group_parts ; level++)
17440
uint pos= send_group_parts - level -1;
17441
bool real_fields= 0;
17443
List_iterator<Item> new_it(rollup.fields[pos]);
17444
Item **ref_array_start= rollup.ref_pointer_arrays[pos];
17445
ORDER *start_group;
17447
/* Point to first hidden field */
17448
Item **ref_array= ref_array_start + fields_arg.elements-1;
17450
/* Remember where the sum functions ends for the previous level */
17451
sum_funcs_end[pos+1]= *func;
17453
/* Find the start of the group for this level */
17454
for (i= 0, start_group= group_list ;
17456
start_group= start_group->next)
17460
while ((item= it++))
17462
if (item == first_field)
17464
real_fields= 1; // End of hidden fields
17465
ref_array= ref_array_start;
17468
if (item->type() == Item::SUM_FUNC_ITEM && !item->const_item() &&
17469
(!((Item_sum*) item)->depended_from() ||
17470
((Item_sum *)item)->depended_from() == select_lex))
17474
This is a top level summary function that must be replaced with
17475
a sum function that is reset for this level.
17477
NOTE: This code creates an object which is not that nice in a
17478
sub select. Fortunately it's not common to have rollup in
17481
item= item->copy_or_same(thd);
17482
((Item_sum*) item)->make_unique();
17483
*(*func)= (Item_sum*) item;
17488
/* Check if this is something that is part of this group by */
17490
for (group_tmp= start_group, i= pos ;
17491
group_tmp ; group_tmp= group_tmp->next, i++)
17493
if (*group_tmp->item == item)
17496
This is an element that is used by the GROUP BY and should be
17497
set to NULL in this level
17499
Item_null_result *null_item= new (thd->mem_root) Item_null_result();
17502
item->maybe_null= 1; // Value will be null sometimes
17503
null_item->result_field= item->get_tmp_table_field();
17512
(void) new_it++; // Point to next item
17513
new_it.replace(item); // Replace previous
17520
sum_funcs_end[0]= *func; // Point to last function
17525
Send all rollup levels higher than the current one to the client.
17529
SELECT a, b, c SUM(b) FROM t1 GROUP BY a,b WITH ROLLUP
17532
@param idx Level we are on:
17533
- 0 = Total sum level
17534
- 1 = First group changed (a)
17535
- 2 = Second group changed (a,b)
17540
1 If send_data_failed()
17543
int JOIN::rollup_send_data(uint idx)
17546
for (i= send_group_parts ; i-- > idx ; )
17548
/* Get reference pointers to sum functions in place */
17549
memcpy((char*) ref_pointer_array,
17550
(char*) rollup.ref_pointer_arrays[i],
17551
ref_pointer_array_size);
17552
if ((!having || having->val_int()))
17554
if (send_records < unit->select_limit_cnt && do_send_rows &&
17555
result->send_data(rollup.fields[i]))
17560
/* Restore ref_pointer_array */
17561
set_items_ref_array(current_ref_pointer_array);
17566
Write all rollup levels higher than the current one to a temp table.
17570
SELECT a, b, SUM(c) FROM t1 GROUP BY a,b WITH ROLLUP
17573
@param idx Level we are on:
17574
- 0 = Total sum level
17575
- 1 = First group changed (a)
17576
- 2 = Second group changed (a,b)
17577
@param table reference to temp table
17582
1 if write_data_failed()
17585
int JOIN::rollup_write_data(uint idx, TABLE *table_arg)
17588
for (i= send_group_parts ; i-- > idx ; )
17590
/* Get reference pointers to sum functions in place */
17591
memcpy((char*) ref_pointer_array,
17592
(char*) rollup.ref_pointer_arrays[i],
17593
ref_pointer_array_size);
17594
if ((!having || having->val_int()))
17598
List_iterator_fast<Item> it(rollup.fields[i]);
17599
while ((item= it++))
17601
if (item->type() == Item::NULL_ITEM && item->is_result_field())
17602
item->save_in_result_field(1);
17604
copy_sum_funcs(sum_funcs_end[i+1], sum_funcs_end[i]);
17605
if ((write_error= table_arg->file->ha_write_row(table_arg->record[0])))
17607
if (create_myisam_from_heap(thd, table_arg,
17608
tmp_table_param.start_recinfo,
17609
&tmp_table_param.recinfo,
17615
/* Restore ref_pointer_array */
17616
set_items_ref_array(current_ref_pointer_array);
17621
clear results if there are not rows found for group
17622
(end_send_group/end_write_group)
17627
clear_tables(this);
17628
copy_fields(&tmp_table_param);
17632
Item_sum *func, **func_ptr= sum_funcs;
17633
while ((func= *(func_ptr++)))
17641
Send a description about what how the select will be done to stdout.
17644
void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
17645
bool distinct,const char *message)
17647
List<Item> field_list;
17648
List<Item> item_list;
17649
THD *thd=join->thd;
17650
select_result *result=join->result;
17651
Item *item_null= new Item_null();
17652
CHARSET_INFO *cs= system_charset_info;
17654
/* Don't log this into the slow query log */
17655
thd->server_status&= ~(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED);
17656
join->unit->offset_limit_cnt= 0;
17659
NOTE: the number/types of items pushed into item_list must be in sync with
17660
EXPLAIN column types as they're "defined" in THD::send_explain_fields()
17664
item_list.push_back(new Item_int((int32_t)
17665
join->select_lex->select_number));
17666
item_list.push_back(new Item_string(join->select_lex->type,
17667
strlen(join->select_lex->type), cs));
17668
for (uint i=0 ; i < 7; i++)
17669
item_list.push_back(item_null);
17670
if (join->thd->lex->describe & DESCRIBE_EXTENDED)
17671
item_list.push_back(item_null);
17673
item_list.push_back(new Item_string(message,strlen(message),cs));
17674
if (result->send_data(item_list))
17677
else if (join->select_lex == join->unit->fake_select_lex)
17680
here we assume that the query will return at least two rows, so we
17681
show "filesort" in EXPLAIN. Of course, sometimes we'll be wrong
17682
and no filesort will be actually done, but executing all selects in
17683
the UNION to provide precise EXPLAIN information will hardly be
17686
char table_name_buffer[NAME_LEN];
17689
item_list.push_back(new Item_null);
17691
item_list.push_back(new Item_string(join->select_lex->type,
17692
strlen(join->select_lex->type),
17696
SELECT_LEX *sl= join->unit->first_select();
17697
uint len= 6, lastop= 0;
17698
memcpy(table_name_buffer, STRING_WITH_LEN("<union"));
17699
for (; sl && len + lastop + 5 < NAME_LEN; sl= sl->next_select())
17702
lastop= snprintf(table_name_buffer + len, NAME_LEN - len,
17703
"%u,", sl->select_number);
17705
if (sl || len + lastop >= NAME_LEN)
17707
memcpy(table_name_buffer + len, STRING_WITH_LEN("...>") + 1);
17713
table_name_buffer[len - 1]= '>'; // change ',' to '>'
17715
item_list.push_back(new Item_string(table_name_buffer, len, cs));
17718
item_list.push_back(new Item_string(join_type_str[JT_ALL],
17719
strlen(join_type_str[JT_ALL]),
17721
/* possible_keys */
17722
item_list.push_back(item_null);
17724
item_list.push_back(item_null);
17726
item_list.push_back(item_null);
17728
item_list.push_back(item_null);
17730
if (join->thd->lex->describe & DESCRIBE_EXTENDED)
17731
item_list.push_back(item_null);
17733
item_list.push_back(item_null);
17735
if (join->unit->global_parameters->order_list.first)
17736
item_list.push_back(new Item_string("Using filesort",
17739
item_list.push_back(new Item_string("", 0, cs));
17741
if (result->send_data(item_list))
17746
table_map used_tables=0;
17747
for (uint i=0 ; i < join->tables ; i++)
17749
JOIN_TAB *tab=join->join_tab+i;
17750
TABLE *table=tab->table;
17751
TABLE_LIST *table_list= tab->table->pos_in_table_list;
17753
char buff1[512], buff2[512], buff3[512];
17754
char keylen_str_buf[64];
17755
String extra(buff, sizeof(buff),cs);
17756
char table_name_buffer[NAME_LEN];
17757
String tmp1(buff1,sizeof(buff1),cs);
17758
String tmp2(buff2,sizeof(buff2),cs);
17759
String tmp3(buff3,sizeof(buff3),cs);
17768
item_list.push_back(new Item_uint((uint32_t)
17769
join->select_lex->select_number));
17771
item_list.push_back(new Item_string(join->select_lex->type,
17772
strlen(join->select_lex->type),
17774
if (tab->type == JT_ALL && tab->select && tab->select->quick)
17776
quick_type= tab->select->quick->get_type();
17777
if ((quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_MERGE) ||
17778
(quick_type == QUICK_SELECT_I::QS_TYPE_ROR_INTERSECT) ||
17779
(quick_type == QUICK_SELECT_I::QS_TYPE_ROR_UNION))
17780
tab->type = JT_INDEX_MERGE;
17782
tab->type = JT_RANGE;
17785
if (table->derived_select_number)
17787
/* Derived table name generation */
17788
int len= snprintf(table_name_buffer, sizeof(table_name_buffer)-1,
17790
table->derived_select_number);
17791
item_list.push_back(new Item_string(table_name_buffer, len, cs));
17795
TABLE_LIST *real_table= table->pos_in_table_list;
17796
item_list.push_back(new Item_string(real_table->alias,
17797
strlen(real_table->alias),
17800
/* "type" column */
17801
item_list.push_back(new Item_string(join_type_str[tab->type],
17802
strlen(join_type_str[tab->type]),
17804
/* Build "possible_keys" value and add it to item_list */
17805
if (!tab->keys.is_clear_all())
17808
for (j=0 ; j < table->s->keys ; j++)
17810
if (tab->keys.is_set(j))
17814
tmp1.append(table->key_info[j].name,
17815
strlen(table->key_info[j].name),
17816
system_charset_info);
17821
item_list.push_back(new Item_string(tmp1.ptr(),tmp1.length(),cs));
17823
item_list.push_back(item_null);
17825
/* Build "key", "key_len", and "ref" values and add them to item_list */
17826
if (tab->ref.key_parts)
17828
KEY *key_info=table->key_info+ tab->ref.key;
17829
register uint length;
17830
item_list.push_back(new Item_string(key_info->name,
17831
strlen(key_info->name),
17832
system_charset_info));
17833
length= int64_t2str(tab->ref.key_length, keylen_str_buf, 10) -
17835
item_list.push_back(new Item_string(keylen_str_buf, length,
17836
system_charset_info));
17837
for (store_key **ref=tab->ref.key_copy ; *ref ; ref++)
17841
tmp2.append((*ref)->name(), strlen((*ref)->name()),
17842
system_charset_info);
17844
item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length(),cs));
17846
else if (tab->type == JT_NEXT)
17848
KEY *key_info=table->key_info+ tab->index;
17849
register uint length;
17850
item_list.push_back(new Item_string(key_info->name,
17851
strlen(key_info->name),cs));
17852
length= int64_t2str(key_info->key_length, keylen_str_buf, 10) -
17854
item_list.push_back(new Item_string(keylen_str_buf,
17856
system_charset_info));
17857
item_list.push_back(item_null);
17859
else if (tab->select && tab->select->quick)
17861
tab->select->quick->add_keys_and_lengths(&tmp2, &tmp3);
17862
item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length(),cs));
17863
item_list.push_back(new Item_string(tmp3.ptr(),tmp3.length(),cs));
17864
item_list.push_back(item_null);
17868
if (table_list->schema_table &&
17869
table_list->schema_table->i_s_requested_object & OPTIMIZE_I_S_TABLE)
17871
const char *tmp_buff;
17873
if (table_list->has_db_lookup_value)
17875
f_idx= table_list->schema_table->idx_field1;
17876
tmp_buff= table_list->schema_table->fields_info[f_idx].field_name;
17877
tmp2.append(tmp_buff, strlen(tmp_buff), cs);
17879
if (table_list->has_table_lookup_value)
17881
if (table_list->has_db_lookup_value)
17883
f_idx= table_list->schema_table->idx_field2;
17884
tmp_buff= table_list->schema_table->fields_info[f_idx].field_name;
17885
tmp2.append(tmp_buff, strlen(tmp_buff), cs);
17888
item_list.push_back(new Item_string(tmp2.ptr(),tmp2.length(),cs));
17890
item_list.push_back(item_null);
17893
item_list.push_back(item_null);
17894
item_list.push_back(item_null);
17895
item_list.push_back(item_null);
17898
/* Add "rows" field to item_list. */
17899
if (table_list->schema_table)
17902
if (join->thd->lex->describe & DESCRIBE_EXTENDED)
17903
item_list.push_back(item_null);
17905
item_list.push_back(item_null);
17909
double examined_rows;
17910
if (tab->select && tab->select->quick)
17911
examined_rows= rows2double(tab->select->quick->records);
17912
else if (tab->type == JT_NEXT || tab->type == JT_ALL)
17913
examined_rows= rows2double(tab->limit ? tab->limit :
17914
tab->table->file->records());
17916
examined_rows= join->best_positions[i].records_read;
17918
item_list.push_back(new Item_int((int64_t) (uint64_t) examined_rows,
17919
MY_INT64_NUM_DECIMAL_DIGITS));
17921
/* Add "filtered" field to item_list. */
17922
if (join->thd->lex->describe & DESCRIBE_EXTENDED)
17926
f= (float) (100.0 * join->best_positions[i].records_read /
17928
item_list.push_back(new Item_float(f, 2));
17932
/* Build "Extra" field and add it to item_list. */
17933
bool key_read=table->key_read;
17934
if ((tab->type == JT_NEXT || tab->type == JT_CONST) &&
17935
table->covering_keys.is_set(tab->index))
17937
if (quick_type == QUICK_SELECT_I::QS_TYPE_ROR_INTERSECT &&
17938
!((QUICK_ROR_INTERSECT_SELECT*)tab->select->quick)->need_to_fetch_row)
17942
item_list.push_back(new Item_string(tab->info,strlen(tab->info),cs));
17943
else if (tab->packed_info & TAB_INFO_HAVE_VALUE)
17945
if (tab->packed_info & TAB_INFO_USING_INDEX)
17946
extra.append(STRING_WITH_LEN("; Using index"));
17947
if (tab->packed_info & TAB_INFO_USING_WHERE)
17948
extra.append(STRING_WITH_LEN("; Using where"));
17949
if (tab->packed_info & TAB_INFO_FULL_SCAN_ON_NULL)
17950
extra.append(STRING_WITH_LEN("; Full scan on NULL key"));
17951
/* Skip initial "; "*/
17952
const char *str= extra.ptr();
17953
uint32_t len= extra.length();
17959
item_list.push_back(new Item_string(str, len, cs));
17963
uint keyno= MAX_KEY;
17964
if (tab->ref.key_parts)
17965
keyno= tab->ref.key;
17966
else if (tab->select && tab->select->quick)
17967
keyno = tab->select->quick->index;
17969
if (keyno != MAX_KEY && keyno == table->file->pushed_idx_cond_keyno &&
17970
table->file->pushed_idx_cond)
17971
extra.append(STRING_WITH_LEN("; Using index condition"));
17973
if (quick_type == QUICK_SELECT_I::QS_TYPE_ROR_UNION ||
17974
quick_type == QUICK_SELECT_I::QS_TYPE_ROR_INTERSECT ||
17975
quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_MERGE)
17977
extra.append(STRING_WITH_LEN("; Using "));
17978
tab->select->quick->add_info_string(&extra);
17982
if (tab->use_quick == 2)
17984
/* 4 bits per 1 hex digit + terminating '\0' */
17985
char buf[MAX_KEY / 4 + 1];
17986
extra.append(STRING_WITH_LEN("; Range checked for each "
17987
"record (index map: 0x"));
17988
extra.append(tab->keys.print(buf));
17991
else if (tab->select->cond)
17993
const COND *pushed_cond= tab->table->file->pushed_cond;
17995
if (thd->variables.engine_condition_pushdown && pushed_cond)
17997
extra.append(STRING_WITH_LEN("; Using where with pushed "
17999
if (thd->lex->describe & DESCRIBE_EXTENDED)
18001
extra.append(STRING_WITH_LEN(": "));
18002
((COND *)pushed_cond)->print(&extra, QT_ORDINARY);
18006
extra.append(STRING_WITH_LEN("; Using where"));
18011
if (quick_type == QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX)
18012
extra.append(STRING_WITH_LEN("; Using index for group-by"));
18014
extra.append(STRING_WITH_LEN("; Using index"));
18016
if (table->reginfo.not_exists_optimize)
18017
extra.append(STRING_WITH_LEN("; Not exists"));
18019
if (quick_type == QUICK_SELECT_I::QS_TYPE_RANGE &&
18020
!(((QUICK_RANGE_SELECT*)(tab->select->quick))->mrr_flags &
18021
HA_MRR_USE_DEFAULT_IMPL))
18023
extra.append(STRING_WITH_LEN("; Using MRR"));
18026
if (table_list->schema_table &&
18027
table_list->schema_table->i_s_requested_object & OPTIMIZE_I_S_TABLE)
18029
if (!table_list->table_open_method)
18030
extra.append(STRING_WITH_LEN("; Skip_open_table"));
18031
else if (table_list->table_open_method == OPEN_FRM_ONLY)
18032
extra.append(STRING_WITH_LEN("; Open_frm_only"));
18034
extra.append(STRING_WITH_LEN("; Open_full_table"));
18035
if (table_list->has_db_lookup_value &&
18036
table_list->has_table_lookup_value)
18037
extra.append(STRING_WITH_LEN("; Scanned 0 databases"));
18038
else if (table_list->has_db_lookup_value ||
18039
table_list->has_table_lookup_value)
18040
extra.append(STRING_WITH_LEN("; Scanned 1 database"));
18042
extra.append(STRING_WITH_LEN("; Scanned all databases"));
18044
if (need_tmp_table)
18047
extra.append(STRING_WITH_LEN("; Using temporary"));
18052
extra.append(STRING_WITH_LEN("; Using filesort"));
18054
if (distinct & test_all_bits(used_tables,thd->used_tables))
18055
extra.append(STRING_WITH_LEN("; Distinct"));
18057
if (tab->insideout_match_tab)
18059
extra.append(STRING_WITH_LEN("; LooseScan"));
18062
if (tab->flush_weedout_table)
18063
extra.append(STRING_WITH_LEN("; Start temporary"));
18064
else if (tab->check_weed_out_table)
18065
extra.append(STRING_WITH_LEN("; End temporary"));
18066
else if (tab->do_firstmatch)
18068
extra.append(STRING_WITH_LEN("; FirstMatch("));
18069
TABLE *prev_table=tab->do_firstmatch->table;
18070
if (prev_table->derived_select_number)
18072
char namebuf[NAME_LEN];
18073
/* Derived table name generation */
18074
int len= snprintf(namebuf, sizeof(namebuf)-1,
18076
prev_table->derived_select_number);
18077
extra.append(namebuf, len);
18080
extra.append(prev_table->pos_in_table_list->alias);
18081
extra.append(STRING_WITH_LEN(")"));
18084
for (uint part= 0; part < tab->ref.key_parts; part++)
18086
if (tab->ref.cond_guards[part])
18088
extra.append(STRING_WITH_LEN("; Full scan on NULL key"));
18093
if (i > 0 && tab[-1].next_select == sub_select_cache)
18094
extra.append(STRING_WITH_LEN("; Using join buffer"));
18096
/* Skip initial "; "*/
18097
const char *str= extra.ptr();
18098
uint32_t len= extra.length();
18104
item_list.push_back(new Item_string(str, len, cs));
18106
// For next iteration
18107
used_tables|=table->map;
18108
if (result->send_data(item_list))
18112
for (SELECT_LEX_UNIT *unit= join->select_lex->first_inner_unit();
18114
unit= unit->next_unit())
18116
if (mysql_explain_union(thd, unit, result))
18123
bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
18126
SELECT_LEX *first= unit->first_select();
18128
for (SELECT_LEX *sl= first;
18130
sl= sl->next_select())
18132
// drop UNCACHEABLE_EXPLAIN, because it is for internal usage only
18133
uint8_t uncacheable= (sl->uncacheable & ~UNCACHEABLE_EXPLAIN);
18134
sl->type= (((&thd->lex->select_lex)==sl)?
18135
(sl->first_inner_unit() || sl->next_select() ?
18136
"PRIMARY" : "SIMPLE"):
18138
((sl->linkage == DERIVED_TABLE_TYPE) ?
18140
((uncacheable & UNCACHEABLE_DEPENDENT) ?
18141
"DEPENDENT SUBQUERY":
18142
(uncacheable?"UNCACHEABLE SUBQUERY":
18144
((uncacheable & UNCACHEABLE_DEPENDENT) ?
18146
uncacheable?"UNCACHEABLE UNION":
18148
sl->options|= SELECT_DESCRIBE;
18150
if (unit->is_union())
18152
unit->fake_select_lex->select_number= UINT_MAX; // jost for initialization
18153
unit->fake_select_lex->type= "UNION RESULT";
18154
unit->fake_select_lex->options|= SELECT_DESCRIBE;
18155
if (!(res= unit->prepare(thd, result, SELECT_NO_UNLOCK | SELECT_DESCRIBE)))
18157
res|= unit->cleanup();
18161
thd->lex->current_select= first;
18162
unit->set_limit(unit->global_parameters);
18163
res= mysql_select(thd, &first->ref_pointer_array,
18164
(TABLE_LIST*) first->table_list.first,
18165
first->with_wild, first->item_list,
18167
first->order_list.elements +
18168
first->group_list.elements,
18169
(ORDER*) first->order_list.first,
18170
(ORDER*) first->group_list.first,
18172
(ORDER*) thd->lex->proc_list.first,
18173
first->options | thd->options | SELECT_DESCRIBE,
18174
result, unit, first);
18176
return(res || thd->is_error());
18180
static void print_table_array(THD *thd, String *str, TABLE_LIST **table,
18183
(*table)->print(thd, str, QT_ORDINARY);
18185
for (TABLE_LIST **tbl= table + 1; tbl < end; tbl++)
18187
TABLE_LIST *curr= *tbl;
6541
static void print_table_array(Session *session, String *str, TableList **table,
6544
(*table)->print(session, str, QT_ORDINARY);
6546
for (TableList **tbl= table + 1; tbl < end; tbl++)
6548
TableList *curr= *tbl;
18188
6549
if (curr->outer_join)
18190
6551
/* MySQL converts right to left joins */