103
103
subject and may omit some details.
106
#include <drizzled/server_includes.h>
107
#include <drizzled/sql_select.h>
106
#ifdef USE_PRAGMA_IMPLEMENTATION
107
#pragma implementation // gcc: Class implementation
110
#include "mysql_priv.h"
112
#include "sql_select.h"
109
114
#ifndef EXTRA_DEBUG
110
115
#define test_rb_tree(A,B) {}
118
123
#define double2rows(x) ((ha_rows)(x))
120
static int sel_cmp(Field *f,unsigned char *a,unsigned char *b,uint8_t a_flag,uint8_t b_flag);
125
static int sel_cmp(Field *f,uchar *a,uchar *b,uint8 a_flag,uint8 b_flag);
122
static unsigned char is_null_string[2]= {1,0};
127
static uchar is_null_string[2]= {1,0};
124
129
class RANGE_OPT_PARAM;
295
300
class SEL_ARG :public Sql_alloc
298
uint8_t min_flag,max_flag,maybe_flag;
299
uint8_t part; // Which key part
303
uint8 min_flag,max_flag,maybe_flag;
304
uint8 part; // Which key part
302
307
Number of children of this element in the RB-tree, plus 1 for this
307
312
Valid only for elements which are RB-tree roots: Number of times this
308
313
RB-tree is referred to (it is referred by SEL_ARG::next_key_part or by
329
334
SEL_ARG(SEL_ARG &);
330
SEL_ARG(Field *,const unsigned char *, const unsigned char *);
331
SEL_ARG(Field *field, uint8_t part, unsigned char *min_value, unsigned char *max_value,
332
uint8_t min_flag, uint8_t max_flag, uint8_t maybe_flag);
335
SEL_ARG(Field *,const uchar *, const uchar *);
336
SEL_ARG(Field *field, uint8 part, uchar *min_value, uchar *max_value,
337
uint8 min_flag, uint8 max_flag, uint8 maybe_flag);
333
338
SEL_ARG(enum Type type_arg)
334
339
:min_flag(0),elements(1),use_count(1),left(0),right(0),next_key_part(0),
335
340
color(BLACK), type(type_arg)
365
370
SEL_ARG *clone_and(SEL_ARG* arg)
366
371
{ // Get overlapping range
367
unsigned char *new_min,*new_max;
368
uint8_t flag_min,flag_max;
372
uchar *new_min,*new_max;
373
uint8 flag_min,flag_max;
369
374
if (cmp_min_to_min(arg) >= 0)
371
376
new_min=min_value; flag_min=min_flag;
438
443
min_flag=arg->max_flag & NEAR_MAX ? 0 : NEAR_MIN;
440
445
/* returns a number of keypart values (0 or 1) appended to the key buffer */
441
int store_min(uint32_t length, unsigned char **min_key,uint32_t min_key_flag)
446
int store_min(uint length, uchar **min_key,uint min_key_flag)
443
448
/* "(kp1 > c1) AND (kp2 OP c2) AND ..." -> (kp1 > c1) */
444
449
if ((!(min_flag & NO_MIN_RANGE) &&
447
452
if (maybe_null && *min_value)
450
memset(*min_key+1, 0, length-1);
455
bzero(*min_key+1,length-1);
453
458
memcpy(*min_key,min_value,length);
459
464
/* returns a number of keypart values (0 or 1) appended to the key buffer */
460
int store_max(uint32_t length, unsigned char **max_key, uint32_t max_key_flag)
465
int store_max(uint length, uchar **max_key, uint max_key_flag)
462
467
if (!(max_flag & NO_MAX_RANGE) &&
463
468
!(max_key_flag & (NO_MAX_RANGE | NEAR_MAX)))
465
470
if (maybe_null && *max_value)
468
memset(*max_key+1, 0, length-1);
473
bzero(*max_key+1,length-1);
471
476
memcpy(*max_key,max_value,length);
478
483
/* returns a number of keypart values appended to the key buffer */
479
int store_min_key(KEY_PART *key, unsigned char **range_key, uint32_t *range_key_flag)
484
int store_min_key(KEY_PART *key, uchar **range_key, uint *range_key_flag)
481
486
SEL_ARG *key_tree= first();
482
uint32_t res= key_tree->store_min(key[key_tree->part].store_length,
487
uint res= key_tree->store_min(key[key_tree->part].store_length,
483
488
range_key, *range_key_flag);
484
489
*range_key_flag|= key_tree->min_flag;
495
500
/* returns a number of keypart values appended to the key buffer */
496
int store_max_key(KEY_PART *key, unsigned char **range_key, uint32_t *range_key_flag)
501
int store_max_key(KEY_PART *key, uchar **range_key, uint *range_key_flag)
498
503
SEL_ARG *key_tree= last();
499
uint32_t res=key_tree->store_max(key[key_tree->part].store_length,
504
uint res=key_tree->store_max(key[key_tree->part].store_length,
500
505
range_key, *range_key_flag);
501
506
(*range_key_flag)|= key_tree->max_flag;
502
507
if (key_tree->next_key_part &&
630
635
/* The members below are filled/used only after get_mm_tree is done */
631
636
key_map ror_scans_map; /* bitmask of ROR scan-able elements in keys */
632
uint32_t n_ror_scans; /* number of set bits in ror_scans_map */
637
uint n_ror_scans; /* number of set bits in ror_scans_map */
634
639
struct st_ror_scan_info **ror_scans; /* list of ROR key scans */
635
640
struct st_ror_scan_info **ror_scans_end; /* last ROR scan */
682
687
KEY_PART *key[MAX_KEY]; /* First key parts of keys used in the query */
683
688
int64_t baseflag;
684
uint32_t max_key_part;
685
690
/* Number of ranges in the last checked tree->key */
686
uint32_t range_count;
687
unsigned char min_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH],
692
uchar min_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH],
688
693
max_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH];
689
694
bool quick; // Don't calulate possible keys
691
uint32_t fields_bitmap_size;
696
uint fields_bitmap_size;
692
697
MY_BITMAP needed_fields; /* bitmask of fields needed by the query */
693
698
MY_BITMAP tmp_covered_fields;
695
700
key_map *needed_reg; /* ptr to SQL_SELECT::needed_reg */
697
uint32_t *imerge_cost_buff; /* buffer for index_merge cost estimates */
698
uint32_t imerge_cost_buff_size; /* size of the buffer */
702
uint *imerge_cost_buff; /* buffer for index_merge cost estimates */
703
uint imerge_cost_buff_size; /* size of the buffer */
700
705
/* true if last checked tree->key can be used for ROR-scan */
701
706
bool is_ror_scan;
702
707
/* Number of ranges in the last checked tree->key */
706
711
class TABLE_READ_PLAN;
720
725
Item_func::Functype type,Item *value);
721
726
static SEL_TREE *get_mm_tree(RANGE_OPT_PARAM *param,COND *cond);
723
static bool is_key_scan_ror(PARAM *param, uint32_t keynr, uint8_t nparts);
724
static ha_rows check_quick_select(PARAM *param, uint32_t idx, bool index_only,
728
static bool is_key_scan_ror(PARAM *param, uint keynr, uint8 nparts);
729
static ha_rows check_quick_select(PARAM *param, uint idx, bool index_only,
725
730
SEL_ARG *tree, bool update_tbl_stats,
726
uint32_t *mrr_flags, uint32_t *bufsize,
731
uint *mrr_flags, uint *bufsize,
727
732
COST_VECT *cost);
728
733
//bool update_tbl_stats);
729
/*static ha_rows check_quick_keys(PARAM *param,uint32_t index,SEL_ARG *key_tree,
730
unsigned char *min_key, uint32_t min_key_flag, int,
731
unsigned char *max_key, uint32_t max_key_flag, int);
734
/*static ha_rows check_quick_keys(PARAM *param,uint index,SEL_ARG *key_tree,
735
uchar *min_key, uint min_key_flag, int,
736
uchar *max_key, uint max_key_flag, int);
734
QUICK_RANGE_SELECT *get_quick_select(PARAM *param,uint32_t index,
735
SEL_ARG *key_tree, uint32_t mrr_flags,
736
uint32_t mrr_buf_size, MEM_ROOT *alloc);
739
QUICK_RANGE_SELECT *get_quick_select(PARAM *param,uint index,
740
SEL_ARG *key_tree, uint mrr_flags,
741
uint mrr_buf_size, MEM_ROOT *alloc);
737
742
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
738
743
bool index_read_must_be_used,
739
744
bool update_tbl_stats,
755
760
static void print_sel_tree(PARAM *param, SEL_TREE *tree, key_map *tree_map,
756
761
const char *msg);
757
static void print_ror_scans_arr(Table *table, const char *msg,
762
static void print_ror_scans_arr(TABLE *table, const char *msg,
758
763
struct st_ror_scan_info **start,
759
764
struct st_ror_scan_info **end);
763
768
static SEL_ARG *sel_add(SEL_ARG *key1,SEL_ARG *key2);
764
769
static SEL_ARG *key_or(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2);
765
770
static SEL_ARG *key_and(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2,
766
uint32_t clone_flag);
767
772
static bool get_range(SEL_ARG **e1,SEL_ARG **e2,SEL_ARG *root1);
768
773
bool get_quick_keys(PARAM *param,QUICK_RANGE_SELECT *quick,KEY_PART *key,
769
SEL_ARG *key_tree, unsigned char *min_key,uint32_t min_key_flag,
770
unsigned char *max_key,uint32_t max_key_flag);
774
SEL_ARG *key_tree, uchar *min_key,uint min_key_flag,
775
uchar *max_key,uint max_key_flag);
771
776
static bool eq_tree(SEL_ARG* a,SEL_ARG *b);
773
778
static SEL_ARG null_element(SEL_ARG::IMPOSSIBLE);
774
static bool null_part_in_key(KEY_PART *key_part, const unsigned char *key,
779
static bool null_part_in_key(KEY_PART *key_part, const uchar *key,
776
781
bool sel_trees_can_be_ored(SEL_TREE *tree1, SEL_TREE *tree2, RANGE_OPT_PARAM* param);
828
833
if (trees_next == trees_end)
830
835
const int realloc_ratio= 2; /* Double size for next round */
831
uint32_t old_elements= (trees_end - trees);
832
uint32_t old_size= sizeof(SEL_TREE**) * old_elements;
833
uint32_t new_size= old_size * realloc_ratio;
836
uint old_elements= (trees_end - trees);
837
uint old_size= sizeof(SEL_TREE**) * old_elements;
838
uint new_size= old_size * realloc_ratio;
834
839
SEL_TREE **new_trees;
835
840
if (!(new_trees= (SEL_TREE**)alloc_root(param->mem_root, new_size)))
999
1004
1 = Got some error (out of memory?)
1002
SQL_SELECT *make_select(Table *head, table_map const_tables,
1007
SQL_SELECT *make_select(TABLE *head, table_map const_tables,
1003
1008
table_map read_tables, COND *conds,
1004
1009
bool allow_null_cond,
1063
1068
used_key_parts(0)
1066
QUICK_RANGE_SELECT::QUICK_RANGE_SELECT(THD *thd, Table *table, uint32_t key_nr,
1071
QUICK_RANGE_SELECT::QUICK_RANGE_SELECT(THD *thd, TABLE *table, uint key_nr,
1067
1072
bool no_alloc, MEM_ROOT *parent_alloc,
1068
1073
bool *create_error)
1069
1074
:free_file(0),cur_range(NULL),last_range(0),dont_free(0)
1145
1150
delete_dynamic(&ranges); /* ranges are allocated in alloc */
1146
1151
free_root(&alloc,MYF(0));
1147
free((char*) column_bitmap.bitmap);
1152
my_free((char*) column_bitmap.bitmap, MYF(MY_ALLOW_ZERO_PTR));
1149
1154
head->column_bitmaps_set(save_read_set, save_write_set);
1155
x_free(mrr_buf_desc);
1156
1160
QUICK_INDEX_MERGE_SELECT::QUICK_INDEX_MERGE_SELECT(THD *thd_param,
1158
1162
:pk_quick_select(NULL), thd(thd_param)
1160
1164
index= MAX_KEY;
1162
memset(&read_record, 0, sizeof(read_record));
1166
bzero(&read_record, sizeof(read_record));
1163
1167
init_sql_alloc(&alloc, thd->variables.range_alloc_block_size, 0);
1216
1220
if (!parent_alloc)
1217
1221
init_sql_alloc(&alloc, thd->variables.range_alloc_block_size, 0);
1219
memset(&alloc, 0, sizeof(MEM_ROOT));
1220
last_rowid= (unsigned char*) alloc_root(parent_alloc? parent_alloc : &alloc,
1223
bzero(&alloc, sizeof(MEM_ROOT));
1224
last_rowid= (uchar*) alloc_root(parent_alloc? parent_alloc : &alloc,
1221
1225
head->file->ref_length);
1471
1475
false , QUICK_ROR_UNION_SELECT::queue_cmp,
1474
memset(&queue, 0, sizeof(QUEUE));
1478
bzero(&queue, sizeof(QUEUE));
1478
if (!(cur_rowid= (unsigned char*) alloc_root(&alloc, 2*head->file->ref_length)))
1482
if (!(cur_rowid= (uchar*) alloc_root(&alloc, 2*head->file->ref_length)))
1480
1484
prev_rowid= cur_rowid + head->file->ref_length;
1493
1497
val2 Second merged select
1496
int QUICK_ROR_UNION_SELECT::queue_cmp(void *arg, unsigned char *val1, unsigned char *val2)
1500
int QUICK_ROR_UNION_SELECT::queue_cmp(void *arg, uchar *val1, uchar *val2)
1498
1502
QUICK_ROR_UNION_SELECT *self= (QUICK_ROR_UNION_SELECT*)arg;
1499
1503
return self->head->file->cmp_ref(((QUICK_SELECT_I*)val1)->last_rowid,
1602
1606
use_count=0; elements=1;
1605
SEL_ARG::SEL_ARG(Field *f,const unsigned char *min_value_arg,
1606
const unsigned char *max_value_arg)
1609
SEL_ARG::SEL_ARG(Field *f,const uchar *min_value_arg,
1610
const uchar *max_value_arg)
1607
1611
:min_flag(0), max_flag(0), maybe_flag(0), maybe_null(f->real_maybe_null()),
1608
elements(1), use_count(1), field(f), min_value((unsigned char*) min_value_arg),
1609
max_value((unsigned char*) max_value_arg), next(0),prev(0),
1612
elements(1), use_count(1), field(f), min_value((uchar*) min_value_arg),
1613
max_value((uchar*) max_value_arg), next(0),prev(0),
1610
1614
next_key_part(0),color(BLACK),type(KEY_RANGE)
1612
1616
left=right= &null_element;
1615
SEL_ARG::SEL_ARG(Field *field_,uint8_t part_,
1616
unsigned char *min_value_, unsigned char *max_value_,
1617
uint8_t min_flag_,uint8_t max_flag_,uint8_t maybe_flag_)
1619
SEL_ARG::SEL_ARG(Field *field_,uint8 part_,
1620
uchar *min_value_, uchar *max_value_,
1621
uint8 min_flag_,uint8 max_flag_,uint8 maybe_flag_)
1618
1622
:min_flag(min_flag_),max_flag(max_flag_),maybe_flag(maybe_flag_),
1619
1623
part(part_),maybe_null(field_->real_maybe_null()), elements(1),use_count(1),
1620
1624
field(field_), min_value(min_value_), max_value(max_value_),
1691
1695
Returns -2 or 2 if the ranges where 'joined' like < 2 and >= 2
1694
static int sel_cmp(Field *field, unsigned char *a, unsigned char *b, uint8_t a_flag,
1698
static int sel_cmp(Field *field, uchar *a, uchar *b, uint8 a_flag,
1698
1702
/* First check if there was a compare to a min or max element */
1778
1782
MAX_KEY if no such index was found.
1781
uint32_t get_index_for_order(Table *table, order_st *order, ha_rows limit)
1785
uint get_index_for_order(TABLE *table, ORDER *order, ha_rows limit)
1784
uint32_t match_key= MAX_KEY, match_key_len= MAX_KEY_LENGTH + 1;
1788
uint match_key= MAX_KEY, match_key_len= MAX_KEY_LENGTH + 1;
1787
1791
for (ord= order; ord; ord= ord->next)
1882
1886
/* Table read plans are allocated on MEM_ROOT and are never deleted */
1883
1887
static void *operator new(size_t size, MEM_ROOT *mem_root)
1884
1888
{ return (void*) alloc_root(mem_root, (uint) size); }
1885
static void operator delete(void *ptr __attribute__((unused)),
1886
size_t size __attribute__((unused)))
1889
static void operator delete(void *ptr __attribute__((__unused__)),
1890
size_t size __attribute__((__unused__)))
1887
1891
{ TRASH(ptr, size); }
1888
static void operator delete(void *ptr __attribute__((unused)),
1889
MEM_ROOT *mem_root __attribute__((unused)))
1892
static void operator delete(void *ptr __attribute__((__unused__)),
1893
MEM_ROOT *mem_root __attribute__((__unused__)))
1890
1894
{ /* Never called */ }
1891
1895
virtual ~TABLE_READ_PLAN() {} /* Remove gcc warning */
1910
1914
SEL_ARG *key; /* set of intervals to be used in "range" method retrieval */
1911
uint32_t key_idx; /* key number in PARAM::key */
1913
uint32_t mrr_buf_size;
1915
uint key_idx; /* key number in PARAM::key */
1915
TRP_RANGE(SEL_ARG *key_arg, uint32_t idx_arg, uint32_t mrr_flags_arg)
1919
TRP_RANGE(SEL_ARG *key_arg, uint idx_arg, uint mrr_flags_arg)
1916
1920
: key(key_arg), key_idx(idx_arg), mrr_flags(mrr_flags_arg)
1918
1922
virtual ~TRP_RANGE() {} /* Remove gcc warning */
1920
1924
QUICK_SELECT_I *make_quick(PARAM *param,
1921
bool retrieve_full_rows __attribute__((unused)),
1925
bool retrieve_full_rows __attribute__((__unused__)),
1922
1926
MEM_ROOT *parent_alloc)
1924
1928
QUICK_RANGE_SELECT *quick;
1998
2002
bool have_min, have_max;
1999
2003
KEY_PART_INFO *min_max_arg_part;
2000
uint32_t group_prefix_len;
2001
uint32_t used_key_parts;
2002
uint32_t group_key_parts;
2004
uint group_prefix_len;
2005
uint used_key_parts;
2006
uint group_key_parts;
2003
2007
KEY *index_info;
2005
uint32_t key_infix_len;
2006
unsigned char key_infix[MAX_KEY_LENGTH];
2010
uchar key_infix[MAX_KEY_LENGTH];
2007
2011
SEL_TREE *range_tree; /* Represents all range predicates in the query. */
2008
2012
SEL_ARG *index_tree; /* The SEL_ARG sub-tree corresponding to index_info. */
2009
uint32_t param_idx; /* Index of used key in param->key. */
2013
uint param_idx; /* Index of used key in param->key. */
2010
2014
/* Number of records selected by the ranges in index_tree. */
2012
2016
ha_rows quick_prefix_records;
2014
2018
TRP_GROUP_MIN_MAX(bool have_min_arg, bool have_max_arg,
2015
2019
KEY_PART_INFO *min_max_arg_part_arg,
2016
uint32_t group_prefix_len_arg, uint32_t used_key_parts_arg,
2017
uint32_t group_key_parts_arg, KEY *index_info_arg,
2018
uint32_t index_arg, uint32_t key_infix_len_arg,
2019
unsigned char *key_infix_arg,
2020
uint group_prefix_len_arg, uint used_key_parts_arg,
2021
uint group_key_parts_arg, KEY *index_info_arg,
2022
uint index_arg, uint key_infix_len_arg,
2023
uchar *key_infix_arg,
2020
2024
SEL_TREE *tree_arg, SEL_ARG *index_tree_arg,
2021
uint32_t param_idx_arg, ha_rows quick_prefix_records_arg)
2025
uint param_idx_arg, ha_rows quick_prefix_records_arg)
2022
2026
: have_min(have_min_arg), have_max(have_max_arg),
2023
2027
min_max_arg_part(min_max_arg_part_arg),
2024
2028
group_prefix_len(group_prefix_len_arg), used_key_parts(used_key_parts_arg),
2054
2058
static int fill_used_fields_bitmap(PARAM *param)
2056
Table *table= param->table;
2060
TABLE *table= param->table;
2057
2061
my_bitmap_map *tmp;
2059
2063
param->tmp_covered_fields.bitmap= 0;
2060
2064
param->fields_bitmap_size= table->s->column_bitmap_size;
2061
2065
if (!(tmp= (my_bitmap_map*) alloc_root(param->mem_root,
2227
2231
param.key[param.keys]=key_parts;
2228
2232
key_part_info= key_info->key_part;
2229
for (uint32_t part=0 ; part < key_info->key_parts ;
2233
for (uint part=0 ; part < key_info->key_parts ;
2230
2234
part++, key_parts++, key_part_info++)
2232
2236
key_parts->key= param.keys;
2237
2241
key_parts->null_bit= key_part_info->null_bit;
2238
2242
key_parts->image_type = Field::itRAW;
2239
2243
/* Only HA_PART_KEY_SEG is used */
2240
key_parts->flag= (uint8_t) key_part_info->key_part_flag;
2244
key_parts->flag= (uint8) key_part_info->key_part_flag;
2242
2246
param.real_keynr[param.keys++]=idx;
2247
2251
/* Calculate cost of full index read for the shortest covering index */
2248
2252
if (!head->covering_keys.is_clear_all())
2250
int key_for_use= head->find_shortest_key(&head->covering_keys);
2254
int key_for_use= find_shortest_key(head, &head->covering_keys);
2251
2255
double key_read_time=
2252
2256
param.table->file->index_only_read_time(key_for_use,
2253
2257
rows2double(records)) +
2286
2290
group_trp= get_best_group_min_max(¶m, tree);
2289
param.table->quick_condition_rows= cmin(group_trp->records,
2293
param.table->quick_condition_rows= min(group_trp->records,
2290
2294
head->file->stats.records);
2291
2295
if (group_trp->read_cost < best_read_time)
2471
2475
bool pk_is_clustered= param->table->file->primary_key_is_clustered();
2472
2476
bool all_scans_ror_able= true;
2473
2477
bool all_scans_rors= true;
2474
uint32_t unique_calc_buff_size;
2478
uint unique_calc_buff_size;
2475
2479
TABLE_READ_PLAN **roru_read_plans;
2476
2480
TABLE_READ_PLAN **cur_roru_plan;
2477
2481
double roru_index_costs;
2578
2582
imerge_trp->read_cost= imerge_cost;
2579
2583
imerge_trp->records= non_cpk_scan_records + cpk_scan_records;
2580
imerge_trp->records= cmin(imerge_trp->records,
2584
imerge_trp->records= min(imerge_trp->records,
2581
2585
param->table->file->stats.records);
2582
2586
imerge_trp->range_scans= range_scans;
2583
2587
imerge_trp->range_scans_end= range_scans + n_child_scans;
2690
2694
typedef struct st_ror_scan_info
2692
uint32_t idx; /* # of used key in param->keys */
2693
uint32_t keynr; /* # of used key in table */
2696
uint idx; /* # of used key in param->keys */
2697
uint keynr; /* # of used key in table */
2694
2698
ha_rows records; /* estimate of # records this scan will return */
2696
2700
/* Set of intervals over key fields that will be used for row retrieval. */
2987
2991
double selectivity_mult= 1.0;
2988
2992
KEY_PART_INFO *key_part= info->param->table->key_info[scan->keynr].key_part;
2989
unsigned char key_val[MAX_KEY_LENGTH+MAX_FIELD_WIDTH]; /* key values tuple */
2990
unsigned char *key_ptr= key_val;
2993
uchar key_val[MAX_KEY_LENGTH+MAX_FIELD_WIDTH]; /* key values tuple */
2994
uchar *key_ptr= key_val;
2991
2995
SEL_ARG *sel_arg, *tuple_arg= NULL;
2992
2996
key_part_map keypart_map= 0;
2993
2997
bool cur_covered;
3529
3533
bool update_tbl_stats,
3530
3534
double read_time)
3533
3537
SEL_ARG **key,**end, **key_to_read= NULL;
3534
3538
ha_rows best_records= 0;
3535
uint32_t best_mrr_flags= 0, best_buf_size= 0;
3539
uint best_mrr_flags= 0, best_buf_size= 0;
3536
3540
TRP_RANGE* read_plan= NULL;
3538
3542
Note that there may be trees that have type SEL_TREE::KEY but contain no
3549
3553
ha_rows found_records;
3550
3554
COST_VECT cost;
3551
3555
double found_read_time;
3552
uint32_t mrr_flags, buf_size;
3553
uint32_t keynr= param->real_keynr[idx];
3556
uint mrr_flags, buf_size;
3557
uint keynr= param->real_keynr[idx];
3554
3558
if ((*key)->type == SEL_ARG::MAYBE_KEY ||
3555
3559
(*key)->maybe_flag)
3556
3560
param->needed_reg->set_bit(keynr);
3599
3603
QUICK_SELECT_I *TRP_INDEX_MERGE::make_quick(PARAM *param,
3600
bool retrieve_full_rows __attribute__((unused)),
3601
MEM_ROOT *parent_alloc __attribute__((unused)))
3604
bool retrieve_full_rows __attribute__((__unused__)),
3605
MEM_ROOT *parent_alloc __attribute__((__unused__)))
3603
3607
QUICK_INDEX_MERGE_SELECT *quick_imerge;
3604
3608
QUICK_RANGE_SELECT *quick;
3676
3680
QUICK_SELECT_I *TRP_ROR_UNION::make_quick(PARAM *param,
3677
bool retrieve_full_rows __attribute__((unused)),
3678
MEM_ROOT *parent_alloc __attribute__((unused)))
3681
bool retrieve_full_rows __attribute__((__unused__)),
3682
MEM_ROOT *parent_alloc __attribute__((__unused__)))
3680
3684
QUICK_ROR_UNION_SELECT *quick_roru;
3681
3685
TABLE_READ_PLAN **scan;
4260
4264
get_mm_parts(RANGE_OPT_PARAM *param, COND *cond_func, Field *field,
4261
4265
Item_func::Functype type,
4263
Item_result cmp_type __attribute__((unused)))
4267
Item_result cmp_type __attribute__((__unused__)))
4265
4269
if (field->table != param->table)
4310
4314
get_mm_leaf(RANGE_OPT_PARAM *param, COND *conf_func, Field *field,
4311
4315
KEY_PART *key_part, Item_func::Functype type,Item *value)
4313
uint32_t maybe_null=(uint) field->real_maybe_null();
4317
uint maybe_null=(uint) field->real_maybe_null();
4314
4318
bool optimize_range;
4315
4319
SEL_ARG *tree= 0;
4316
4320
MEM_ROOT *alloc= param->mem_root;
4318
4322
ulong orig_sql_mode;
4377
4381
bool like_error;
4378
4382
char buff1[MAX_FIELD_WIDTH];
4379
unsigned char *min_str,*max_str;
4383
uchar *min_str,*max_str;
4380
4384
String tmp(buff1,sizeof(buff1),value->collation.collation),*res;
4381
4385
size_t length, offset, min_length, max_length;
4382
uint32_t field_length= field->pack_length()+maybe_null;
4386
uint field_length= field->pack_length()+maybe_null;
4384
4388
if (!optimize_range)
4468
4472
/* For comparison purposes allow invalid dates like 2000-01-32 */
4469
4473
orig_sql_mode= field->table->in_use->variables.sql_mode;
4470
4474
if (value->real_item()->type() == Item::STRING_ITEM &&
4471
(field->type() == DRIZZLE_TYPE_NEWDATE ||
4472
field->type() == DRIZZLE_TYPE_DATETIME))
4475
(field->type() == MYSQL_TYPE_NEWDATE ||
4476
field->type() == MYSQL_TYPE_DATETIME))
4473
4477
field->table->in_use->variables.sql_mode|= MODE_INVALID_DATES;
4474
4478
err= value->save_in_field_no_warnings(field, 1);
4545
4549
field->table->in_use->variables.sql_mode= orig_sql_mode;
4546
str= (unsigned char*) alloc_root(alloc, key_part->store_length+1);
4550
str= (uchar*) alloc_root(alloc, key_part->store_length+1);
4549
4553
if (maybe_null)
4550
*str= (unsigned char) field->is_real_null(); // Set to 1 if null
4554
*str= (uchar) field->is_real_null(); // Set to 1 if null
4551
4555
field->get_key_image(str+maybe_null, key_part->length,
4552
4556
key_part->image_type);
4553
4557
if (!(tree= new (alloc) SEL_ARG(field, str, str)))
4913
4917
/* one tree is index merge tree and another is range tree */
4914
4918
if (tree1->merges.is_empty())
4915
std::swap(tree1, tree2);
4919
swap_variables(SEL_TREE*, tree1, tree2);
4917
4921
if (param->remove_jump_scans && remove_nonrange_trees(param, tree2))
4918
4922
return(new SEL_TREE(SEL_TREE::ALWAYS));
5014
5018
key2->type != SEL_ARG::MAYBE_KEY) ||
5015
5019
key1->type == SEL_ARG::MAYBE_KEY)
5016
5020
{ // Put simple key in key2
5017
std::swap(key1, key2);
5021
swap_variables(SEL_ARG *, key1, key2);
5018
5022
clone_flag=swap_clone_flag(clone_flag);
5876
5880
Pointers in min and max keys. They point to right-after-end of key
5877
5881
images. The 0-th entry has these pointing to key tuple start.
5879
unsigned char *min_key, *max_key;
5883
uchar *min_key, *max_key;
5882
5886
Flags, for {keypart0, keypart1, ... this_keypart} subtuple.
5883
5887
min_key_flag may have NULL_RANGE set.
5885
uint32_t min_key_flag, max_key_flag;
5889
uint min_key_flag, max_key_flag;
5887
5891
/* Number of key parts */
5888
uint32_t min_key_parts, max_key_parts;
5892
uint min_key_parts, max_key_parts;
5889
5893
SEL_ARG *key_tree;
5890
5894
} RANGE_SEQ_ENTRY;
5896
5900
typedef struct st_sel_arg_range_seq
5898
uint32_t keyno; /* index of used tree in SEL_TREE structure */
5899
uint32_t real_keyno; /* Number of the index in tables */
5902
uint keyno; /* index of used tree in SEL_TREE structure */
5903
uint real_keyno; /* Number of the index in tables */
5901
5905
SEL_ARG *start; /* Root node of the traversed SEL_ARG* graph */
5923
5927
range_seq_t sel_arg_range_seq_init(void *init_param,
5924
uint32_t n_ranges __attribute__((unused)),
5925
uint32_t flags __attribute__((unused)))
5928
uint n_ranges __attribute__((__unused__)),
5929
uint flags __attribute__((__unused__)))
5927
5931
SEL_ARG_RANGE_SEQ *seq= (SEL_ARG_RANGE_SEQ*)init_param;
5928
5932
seq->at_start= true;
5950
5954
cur->min_key_parts= prev->min_key_parts;
5951
5955
cur->max_key_parts= prev->max_key_parts;
5953
uint16_t stor_length= arg->param->key[arg->keyno][key_tree->part].store_length;
5957
uint16 stor_length= arg->param->key[arg->keyno][key_tree->part].store_length;
5954
5958
cur->min_key_parts += key_tree->store_min(stor_length, &cur->min_key,
5955
5959
prev->min_key_flag);
5956
5960
cur->max_key_parts += key_tree->store_max(stor_length, &cur->max_key,
6047
6051
RANGE_SEQ_ENTRY *cur= &seq->stack[seq->i];
6048
uint32_t min_key_length= cur->min_key - seq->param->min_key;
6049
uint32_t max_key_length= cur->max_key - seq->param->max_key;
6050
uint32_t len= cur->min_key - cur[-1].min_key;
6052
uint min_key_length= cur->min_key - seq->param->min_key;
6053
uint max_key_length= cur->max_key - seq->param->max_key;
6054
uint len= cur->min_key - cur[-1].min_key;
6051
6055
if (!(min_key_length == max_key_length &&
6052
6056
!memcmp(cur[-1].min_key, cur[-1].max_key, len) &&
6053
6057
!key_tree->min_flag && !key_tree->max_flag))
6164
ha_rows check_quick_select(PARAM *param, uint32_t idx, bool index_only,
6168
ha_rows check_quick_select(PARAM *param, uint idx, bool index_only,
6165
6169
SEL_ARG *tree, bool update_tbl_stats,
6166
uint32_t *mrr_flags, uint32_t *bufsize, COST_VECT *cost)
6170
uint *mrr_flags, uint *bufsize, COST_VECT *cost)
6168
6172
SEL_ARG_RANGE_SEQ seq;
6169
6173
RANGE_SEQ_IF seq_if = {sel_arg_range_seq_init, sel_arg_range_seq_next};
6170
6174
handler *file= param->table->file;
6172
uint32_t keynr= param->real_keynr[idx];
6176
uint keynr= param->real_keynr[idx];
6174
6178
/* Handle cases when we don't have a valid non-empty list of range */
6215
6219
param->table->quick_key_parts[keynr]=param->max_key_part+1;
6216
6220
param->table->quick_n_ranges[keynr]= param->range_count;
6217
6221
param->table->quick_condition_rows=
6218
cmin(param->table->quick_condition_rows, rows);
6222
min(param->table->quick_condition_rows, rows);
6221
6225
/* Figure out if the key scan is ROR (returns rows in ROWID order) or not */
6277
6281
false Otherwise
6280
static bool is_key_scan_ror(PARAM *param, uint32_t keynr, uint8_t nparts)
6284
static bool is_key_scan_ror(PARAM *param, uint keynr, uint8 nparts)
6282
6286
KEY *table_key= param->table->key_info + keynr;
6283
6287
KEY_PART_INFO *key_part= table_key->key_part + nparts;
6284
6288
KEY_PART_INFO *key_part_end= (table_key->key_part +
6285
6289
table_key->key_parts);
6288
6292
for (KEY_PART_INFO *kp= table_key->key_part; kp < key_part; kp++)
6290
uint16_t fieldnr= param->table->key_info[keynr].
6294
uint16 fieldnr= param->table->key_info[keynr].
6291
6295
key_part[kp - table_key->key_part].fieldnr - 1;
6292
6296
if (param->table->field[fieldnr]->key_length() != kp->length)
6341
6345
QUICK_RANGE_SELECT *
6342
get_quick_select(PARAM *param,uint32_t idx,SEL_ARG *key_tree, uint32_t mrr_flags,
6343
uint32_t mrr_buf_size, MEM_ROOT *parent_alloc)
6346
get_quick_select(PARAM *param,uint idx,SEL_ARG *key_tree, uint mrr_flags,
6347
uint mrr_buf_size, MEM_ROOT *parent_alloc)
6345
6349
QUICK_RANGE_SELECT *quick;
6346
6350
bool create_err= false;
6380
6384
get_quick_keys(PARAM *param,QUICK_RANGE_SELECT *quick,KEY_PART *key,
6381
SEL_ARG *key_tree, unsigned char *min_key,uint32_t min_key_flag,
6382
unsigned char *max_key, uint32_t max_key_flag)
6385
SEL_ARG *key_tree, uchar *min_key,uint min_key_flag,
6386
uchar *max_key, uint max_key_flag)
6384
6388
QUICK_RANGE *range;
6386
6390
int min_part= key_tree->part-1, // # of keypart values in min_key buffer
6387
6391
max_part= key_tree->part-1; // # of keypart values in max_key buffer
6392
6396
min_key,min_key_flag, max_key, max_key_flag))
6395
unsigned char *tmp_min_key=min_key,*tmp_max_key=max_key;
6399
uchar *tmp_min_key=min_key,*tmp_max_key=max_key;
6396
6400
min_part+= key_tree->store_min(key[key_tree->part].store_length,
6397
6401
&tmp_min_key,min_key_flag);
6398
6402
max_part+= key_tree->store_max(key[key_tree->part].store_length,
6413
6417
goto end; // Ugly, but efficient
6416
uint32_t tmp_min_flag=key_tree->min_flag,tmp_max_flag=key_tree->max_flag;
6420
uint tmp_min_flag=key_tree->min_flag,tmp_max_flag=key_tree->max_flag;
6417
6421
if (!tmp_min_flag)
6418
6422
min_part+= key_tree->next_key_part->store_min_key(key, &tmp_min_key,
6419
6423
&tmp_min_flag);
6477
6481
set_if_bigger(quick->max_used_key_length, range->min_length);
6478
6482
set_if_bigger(quick->max_used_key_length, range->max_length);
6479
6483
set_if_bigger(quick->used_key_parts, (uint) key_tree->part+1);
6480
if (insert_dynamic(&quick->ranges, (unsigned char*) &range))
6484
if (insert_dynamic(&quick->ranges, (uchar*) &range))
6523
6527
false Otherwise
6526
static bool null_part_in_key(KEY_PART *key_part, const unsigned char *key, uint32_t length)
6530
static bool null_part_in_key(KEY_PART *key_part, const uchar *key, uint length)
6528
for (const unsigned char *end=key+length ;
6532
for (const uchar *end=key+length ;
6530
6534
key+= key_part++->store_length)
6600
QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, Table *table,
6604
QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
6601
6605
TABLE_REF *ref, ha_rows records)
6603
6607
MEM_ROOT *old_root, *alloc;
6648
6652
key_part->length= key_info->key_part[part].length;
6649
6653
key_part->store_length= key_info->key_part[part].store_length;
6650
6654
key_part->null_bit= key_info->key_part[part].null_bit;
6651
key_part->flag= (uint8_t) key_info->key_part[part].key_part_flag;
6655
key_part->flag= (uint8) key_info->key_part[part].key_part_flag;
6653
if (insert_dynamic(&quick->ranges,(unsigned char*)&range))
6657
if (insert_dynamic(&quick->ranges,(uchar*)&range))
7041
7045
range_seq_t quick_range_seq_init(void *init_param,
7042
uint32_t n_ranges __attribute__((unused)),
7043
uint32_t flags __attribute__((unused)))
7046
uint n_ranges __attribute__((__unused__)),
7047
uint flags __attribute__((__unused__)))
7045
7049
QUICK_RANGE_SELECT *quick= (QUICK_RANGE_SELECT*)init_param;
7046
7050
quick->qr_traversal_ctx.first= (QUICK_RANGE**)quick->ranges.buffer;
7116
7120
Reference to range_flag associated with range number #idx
7119
uint16_t &mrr_persistent_flag_storage(range_seq_t seq, uint32_t idx)
7123
uint16 &mrr_persistent_flag_storage(range_seq_t seq, uint idx)
7121
7125
QUICK_RANGE_SEQ_CTX *ctx= (QUICK_RANGE_SEQ_CTX*)seq;
7122
7126
return ctx->first[idx]->flag;
7148
7152
Reference to range-associated data
7151
char* &mrr_get_ptr_by_idx(range_seq_t seq __attribute__((unused)),
7152
uint32_t idx __attribute__((unused)))
7155
char* &mrr_get_ptr_by_idx(range_seq_t seq __attribute__((__unused__)),
7156
uint idx __attribute__((__unused__)))
7154
7158
static char *dummy;
7222
7226
other if some error occurred
7225
int QUICK_RANGE_SELECT::get_next_prefix(uint32_t prefix_length,
7229
int QUICK_RANGE_SELECT::get_next_prefix(uint prefix_length,
7226
7230
key_part_map keypart_map,
7227
unsigned char *cur_prefix)
7250
7254
last_range= *(cur_range++);
7252
start_key.key= (const unsigned char*) last_range->min_key;
7253
start_key.length= cmin(last_range->min_length, (uint16_t)prefix_length);
7256
start_key.key= (const uchar*) last_range->min_key;
7257
start_key.length= min(last_range->min_length, prefix_length);
7254
7258
start_key.keypart_map= last_range->min_keypart_map & keypart_map;
7255
7259
start_key.flag= ((last_range->flag & NEAR_MIN) ? HA_READ_AFTER_KEY :
7256
7260
(last_range->flag & EQ_RANGE) ?
7257
7261
HA_READ_KEY_EXACT : HA_READ_KEY_OR_NEXT);
7258
end_key.key= (const unsigned char*) last_range->max_key;
7259
end_key.length= cmin(last_range->max_length, (uint16_t)prefix_length);
7262
end_key.key= (const uchar*) last_range->max_key;
7263
end_key.length= min(last_range->max_length, prefix_length);
7260
7264
end_key.keypart_map= last_range->max_keypart_map & keypart_map;
7262
7266
We use READ_AFTER_KEY here because if we are reading on a key
7332
7336
QUICK_SELECT_DESC::QUICK_SELECT_DESC(QUICK_RANGE_SELECT *q,
7333
uint32_t used_key_parts_arg __attribute__((unused)),
7334
bool *create_err __attribute__((unused)))
7337
uint used_key_parts_arg __attribute__((__unused__)),
7338
bool *create_err __attribute__((__unused__)))
7335
7339
:QUICK_RANGE_SELECT(*q), rev_it(rev_ranges)
7337
7341
QUICK_RANGE *r;
7445
7449
return 0; /* key can't be to large */
7447
7451
KEY_PART *key_part=key_parts;
7448
uint32_t store_length;
7450
for (unsigned char *key=range_arg->max_key, *end=key+range_arg->max_length;
7454
for (uchar *key=range_arg->max_key, *end=key+range_arg->max_length;
7452
7456
key+= store_length, key_part++)
7680
7684
* Implementation of QUICK_GROUP_MIN_MAX_SELECT
7681
7685
*******************************************************************************/
7683
static inline uint32_t get_field_keypart(KEY *index, Field *field);
7684
static inline SEL_ARG * get_index_range_tree(uint32_t index, SEL_TREE* range_tree,
7685
PARAM *param, uint32_t *param_idx);
7687
static inline uint get_field_keypart(KEY *index, Field *field);
7688
static inline SEL_ARG * get_index_range_tree(uint index, SEL_TREE* range_tree,
7689
PARAM *param, uint *param_idx);
7686
7690
static bool get_constant_key_infix(KEY *index_info, SEL_ARG *index_range_tree,
7687
7691
KEY_PART_INFO *first_non_group_part,
7688
7692
KEY_PART_INFO *min_max_arg_part,
7689
7693
KEY_PART_INFO *last_part, THD *thd,
7690
unsigned char *key_infix, uint32_t *key_infix_len,
7694
uchar *key_infix, uint *key_infix_len,
7691
7695
KEY_PART_INFO **first_non_infix_part);
7693
7697
check_group_min_max_predicates(COND *cond, Item_field *min_max_arg_item,
7694
7698
Field::imagetype image_type);
7697
cost_group_min_max(Table* table, KEY *index_info, uint32_t used_key_parts,
7698
uint32_t group_key_parts, SEL_TREE *range_tree,
7701
cost_group_min_max(TABLE* table, KEY *index_info, uint used_key_parts,
7702
uint group_key_parts, SEL_TREE *range_tree,
7699
7703
SEL_ARG *index_tree, ha_rows quick_prefix_records,
7700
7704
bool have_min, bool have_max,
7701
7705
double *read_cost, ha_rows *records);
7835
7839
THD *thd= param->thd;
7836
7840
JOIN *join= thd->lex->current_select->join;
7837
Table *table= param->table;
7841
TABLE *table= param->table;
7838
7842
bool have_min= false; /* true if there is a MIN function. */
7839
7843
bool have_max= false; /* true if there is a MAX function. */
7840
7844
Item_field *min_max_arg_item= NULL; // The argument of all MIN/MAX functions
7841
7845
KEY_PART_INFO *min_max_arg_part= NULL; /* The corresponding keypart. */
7842
uint32_t group_prefix_len= 0; /* Length (in bytes) of the key prefix. */
7846
uint group_prefix_len= 0; /* Length (in bytes) of the key prefix. */
7843
7847
KEY *index_info= NULL; /* The index chosen for data access. */
7844
uint32_t index= 0; /* The id of the chosen index. */
7845
uint32_t group_key_parts= 0; // Number of index key parts in the group prefix.
7846
uint32_t used_key_parts= 0; /* Number of index key parts used for access. */
7847
unsigned char key_infix[MAX_KEY_LENGTH]; /* Constants from equality predicates.*/
7848
uint32_t key_infix_len= 0; /* Length of key_infix. */
7848
uint index= 0; /* The id of the chosen index. */
7849
uint group_key_parts= 0; // Number of index key parts in the group prefix.
7850
uint used_key_parts= 0; /* Number of index key parts used for access. */
7851
uchar key_infix[MAX_KEY_LENGTH]; /* Constants from equality predicates.*/
7852
uint key_infix_len= 0; /* Length of key_infix. */
7849
7853
TRP_GROUP_MIN_MAX *read_plan= NULL; /* The eventually constructed TRP. */
7850
uint32_t key_part_nr;
7851
order_st *tmp_group;
7853
7857
Item_field *item_field;
7926
7930
KEY_PART_INFO *last_part= NULL;
7927
7931
KEY_PART_INFO *first_non_group_part= NULL;
7928
7932
KEY_PART_INFO *first_non_infix_part= NULL;
7929
uint32_t key_infix_parts= 0;
7930
uint32_t cur_group_key_parts= 0;
7931
uint32_t cur_group_prefix_len= 0;
7933
uint key_infix_parts= 0;
7934
uint cur_group_key_parts= 0;
7935
uint cur_group_prefix_len= 0;
7932
7936
/* Cost-related variables for the best index so far. */
7933
7937
double best_read_cost= DBL_MAX;
7934
7938
ha_rows best_records= 0;
7935
7939
SEL_ARG *best_index_tree= NULL;
7936
7940
ha_rows best_quick_prefix_records= 0;
7937
uint32_t best_param_idx= 0;
7941
uint best_param_idx= 0;
7938
7942
double cur_read_cost= DBL_MAX;
7939
7943
ha_rows cur_records;
7940
7944
SEL_ARG *cur_index_tree= NULL;
7941
7945
ha_rows cur_quick_prefix_records= 0;
7942
uint32_t cur_param_idx=MAX_KEY;
7946
uint cur_param_idx=MAX_KEY;
7943
7947
key_map cur_used_key_parts;
7944
uint32_t pk= param->table->s->primary_key;
7948
uint pk= param->table->s->primary_key;
7946
for (uint32_t cur_index= 0 ; cur_index_info != cur_index_info_end ;
7950
for (uint cur_index= 0 ; cur_index_info != cur_index_info_end ;
7947
7951
cur_index_info++, cur_index++)
7949
7953
/* Check (B1) - if current index is covering. */
8008
8012
Check (GA2) if this is a DISTINCT query.
8009
If GA2, then Store a new order_st object in group_fields_array at the
8010
position of the key part of item_field->field. Thus we get the order_st
8013
If GA2, then Store a new ORDER object in group_fields_array at the
8014
position of the key part of item_field->field. Thus we get the ORDER
8011
8015
objects for each field ordered as the corresponding key parts.
8012
Later group_fields_array of order_st objects is used to convert the query
8016
Later group_fields_array of ORDER objects is used to convert the query
8013
8017
to a GROUP query.
8015
8019
else if (join->select_distinct)
8017
8021
select_items_it.rewind();
8018
8022
cur_used_key_parts.clear_all();
8019
uint32_t max_key_part= 0;
8023
uint max_key_part= 0;
8020
8024
while ((item= select_items_it++))
8022
8026
item_field= (Item_field*) item; /* (SA5) already checked above. */
8034
8038
cur_group_prefix_len+= cur_part->store_length;
8035
8039
cur_used_key_parts.set_bit(key_part_nr);
8036
8040
++cur_group_key_parts;
8037
max_key_part= cmax(max_key_part,key_part_nr);
8041
max_key_part= max(max_key_part,key_part_nr);
8040
8044
Check that used key parts forms a prefix of the index.
8201
8205
/* Check (SA3) for the where clause. */
8202
8206
if (join->conds && min_max_arg_item &&
8203
!check_group_min_max_predicates(join->conds, min_max_arg_item, Field::itRAW))
8207
!check_group_min_max_predicates(join->conds, min_max_arg_item,
8208
(index_info->flags & HA_SPATIAL) ?
8209
Field::itMBR : Field::itRAW))
8206
8212
/* The query passes all tests, so construct a new TRP object. */
8287
8293
Item_func *pred= (Item_func*) cond;
8288
8294
Item **arguments= pred->arguments();
8290
for (uint32_t arg_idx= 0; arg_idx < pred->argument_count (); arg_idx++)
8296
for (uint arg_idx= 0; arg_idx < pred->argument_count (); arg_idx++)
8292
8298
cur_arg= arguments[arg_idx]->real_item();
8293
8299
if (cur_arg->type() == Item::FIELD_ITEM)
8314
8320
/* Check that pred compares min_max_arg_item with a constant. */
8316
memset(args, 0, 3 * sizeof(Item*));
8322
bzero(args, 3 * sizeof(Item*));
8318
8324
/* Test if this is a comparison of a field and a constant. */
8319
8325
if (!simple_pred(pred, args, &inv))
8392
get_constant_key_infix(KEY *index_info __attribute__((unused)),
8398
get_constant_key_infix(KEY *index_info __attribute__((__unused__)),
8393
8399
SEL_ARG *index_range_tree,
8394
8400
KEY_PART_INFO *first_non_group_part,
8395
8401
KEY_PART_INFO *min_max_arg_part,
8396
8402
KEY_PART_INFO *last_part,
8397
THD *thd __attribute__((unused)),
8398
unsigned char *key_infix, uint32_t *key_infix_len,
8403
THD *thd __attribute__((__unused__)),
8404
uchar *key_infix, uint *key_infix_len,
8399
8405
KEY_PART_INFO **first_non_infix_part)
8401
8407
SEL_ARG *cur_range;
8436
8442
(cur_range->min_flag & NEAR_MIN) || (cur_range->max_flag & NEAR_MAX))
8439
uint32_t field_length= cur_part->store_length;
8445
uint field_length= cur_part->store_length;
8440
8446
if ((cur_range->maybe_null &&
8441
8447
cur_range->min_value[0] && cur_range->max_value[0]) ||
8442
8448
!memcmp(cur_range->min_value, cur_range->max_value, field_length))
8511
8517
Pointer to the SEL_ARG subtree that corresponds to index.
8514
SEL_ARG * get_index_range_tree(uint32_t index, SEL_TREE* range_tree, PARAM *param,
8515
uint32_t *param_idx)
8520
SEL_ARG * get_index_range_tree(uint index, SEL_TREE* range_tree, PARAM *param,
8517
uint32_t idx= 0; /* Index nr in param->key_parts */
8523
uint idx= 0; /* Index nr in param->key_parts */
8518
8524
while (idx < param->keys)
8520
8526
if (index == param->real_keynr[idx])
8589
void cost_group_min_max(Table* table, KEY *index_info, uint32_t used_key_parts,
8590
uint32_t group_key_parts, SEL_TREE *range_tree,
8591
SEL_ARG *index_tree __attribute__((unused)),
8595
void cost_group_min_max(TABLE* table, KEY *index_info, uint used_key_parts,
8596
uint group_key_parts, SEL_TREE *range_tree,
8597
SEL_ARG *index_tree __attribute__((__unused__)),
8592
8598
ha_rows quick_prefix_records,
8593
8599
bool have_min, bool have_max,
8594
8600
double *read_cost, ha_rows *records)
8596
8602
ha_rows table_records;
8597
uint32_t num_groups;
8598
uint32_t num_blocks;
8599
uint32_t keys_per_block;
8600
uint32_t keys_per_group;
8601
uint32_t keys_per_subgroup; /* Average number of keys in sub-groups */
8605
uint keys_per_block;
8606
uint keys_per_group;
8607
uint keys_per_subgroup; /* Average number of keys in sub-groups */
8602
8608
/* formed by a key infix. */
8603
8609
double p_overlap; /* Probability that a sub-group overlaps two blocks. */
8604
8610
double quick_prefix_selectivity;
8640
8646
double blocks_per_group= (double) num_blocks / (double) num_groups;
8641
8647
p_overlap= (blocks_per_group * (keys_per_subgroup - 1)) / keys_per_group;
8642
p_overlap= cmin(p_overlap, 1.0);
8648
p_overlap= min(p_overlap, 1.0);
8644
io_cost= (double) cmin(num_groups * (1 + p_overlap), (double)num_blocks);
8650
io_cost= (double) min(num_groups * (1 + p_overlap), num_blocks);
8647
8653
io_cost= (keys_per_group > keys_per_block) ?
8785
8791
QUICK_GROUP_MIN_MAX_SELECT::
8786
QUICK_GROUP_MIN_MAX_SELECT(Table *table, JOIN *join_arg, bool have_min_arg,
8792
QUICK_GROUP_MIN_MAX_SELECT(TABLE *table, JOIN *join_arg, bool have_min_arg,
8787
8793
bool have_max_arg,
8788
8794
KEY_PART_INFO *min_max_arg_part_arg,
8789
uint32_t group_prefix_len_arg, uint32_t group_key_parts_arg,
8790
uint32_t used_key_parts_arg, KEY *index_info_arg,
8791
uint32_t use_index, double read_cost_arg,
8792
ha_rows records_arg, uint32_t key_infix_len_arg,
8793
unsigned char *key_infix_arg, MEM_ROOT *parent_alloc)
8795
uint group_prefix_len_arg, uint group_key_parts_arg,
8796
uint used_key_parts_arg, KEY *index_info_arg,
8797
uint use_index, double read_cost_arg,
8798
ha_rows records_arg, uint key_infix_len_arg,
8799
uchar *key_infix_arg, MEM_ROOT *parent_alloc)
8794
8800
:join(join_arg), index_info(index_info_arg),
8795
8801
group_prefix_len(group_prefix_len_arg),
8796
8802
group_key_parts(group_key_parts_arg), have_min(have_min_arg),
8849
8855
if (group_prefix) /* Already initialized. */
8852
if (!(last_prefix= (unsigned char*) alloc_root(&alloc, group_prefix_len)))
8858
if (!(last_prefix= (uchar*) alloc_root(&alloc, group_prefix_len)))
8855
8861
We may use group_prefix to store keys with all select fields, so allocate
8856
8862
enough space for it.
8858
if (!(group_prefix= (unsigned char*) alloc_root(&alloc,
8864
if (!(group_prefix= (uchar*) alloc_root(&alloc,
8859
8865
real_prefix_len + min_max_arg_len)))
8865
8871
The memory location pointed to by key_infix will be deleted soon, so
8866
8872
allocate a new buffer and copy the key_infix into it.
8868
unsigned char *tmp_key_infix= (unsigned char*) alloc_root(&alloc, key_infix_len);
8874
uchar *tmp_key_infix= (uchar*) alloc_root(&alloc, key_infix_len);
8869
8875
if (!tmp_key_infix)
8871
8877
memcpy(tmp_key_infix, this->key_infix, key_infix_len);
8956
8962
bool QUICK_GROUP_MIN_MAX_SELECT::add_range(SEL_ARG *sel_range)
8958
8964
QUICK_RANGE *range;
8959
uint32_t range_flag= sel_range->min_flag | sel_range->max_flag;
8965
uint range_flag= sel_range->min_flag | sel_range->max_flag;
8961
8967
/* Skip (-inf,+inf) ranges, e.g. (x < 5 or x > 4). */
8962
8968
if ((range_flag & NO_MIN_RANGE) && (range_flag & NO_MAX_RANGE))
9008
9014
group_prefix_len < quick_prefix_select->max_used_key_length)
9010
9016
DYNAMIC_ARRAY *arr;
9013
9019
for (inx= 0, arr= &quick_prefix_select->ranges; inx < arr->elements; inx++)
9015
9021
QUICK_RANGE *range;
9017
get_dynamic(arr, (unsigned char*)&range, inx);
9023
get_dynamic(arr, (uchar*)&range, inx);
9018
9024
range->flag &= ~(NEAR_MIN | NEAR_MAX);
9050
9056
QUICK_RANGE *cur_range;
9052
9058
{ /* Check if the right-most range has a lower boundary. */
9053
get_dynamic(&min_max_ranges, (unsigned char*)&cur_range,
9059
get_dynamic(&min_max_ranges, (uchar*)&cur_range,
9054
9060
min_max_ranges.elements - 1);
9055
9061
if (!(cur_range->flag & NO_MIN_RANGE))
9063
9069
{ /* Check if the left-most range has an upper boundary. */
9064
get_dynamic(&min_max_ranges, (unsigned char*)&cur_range, 0);
9070
get_dynamic(&min_max_ranges, (uchar*)&cur_range, 0);
9065
9071
if (!(cur_range->flag & NO_MAX_RANGE))
9067
9073
max_used_key_length+= min_max_arg_len;
9441
9447
assert(min_max_ranges.elements > 0);
9443
for (uint32_t range_idx= 0; range_idx < min_max_ranges.elements; range_idx++)
9449
for (uint range_idx= 0; range_idx < min_max_ranges.elements; range_idx++)
9444
9450
{ /* Search from the left-most range to the right. */
9445
get_dynamic(&min_max_ranges, (unsigned char*)&cur_range, range_idx);
9451
get_dynamic(&min_max_ranges, (uchar*)&cur_range, range_idx);
9448
9454
If the current value for the min/max argument is bigger than the right
9449
9455
boundary of cur_range, there is no need to check this range.
9451
9457
if (range_idx != 0 && !(cur_range->flag & NO_MAX_RANGE) &&
9452
(key_cmp(min_max_arg_part, (const unsigned char*) cur_range->max_key,
9458
(key_cmp(min_max_arg_part, (const uchar*) cur_range->max_key,
9453
9459
min_max_arg_len) == 1))
9510
9516
if ( !(cur_range->flag & NO_MAX_RANGE) )
9512
9518
/* Compose the MAX key for the range. */
9513
unsigned char *max_key= (unsigned char*) my_alloca(real_prefix_len + min_max_arg_len);
9519
uchar *max_key= (uchar*) my_alloca(real_prefix_len + min_max_arg_len);
9514
9520
memcpy(max_key, group_prefix, real_prefix_len);
9515
9521
memcpy(max_key + real_prefix_len, cur_range->max_key,
9516
9522
cur_range->max_length);
9572
9578
assert(min_max_ranges.elements > 0);
9574
for (uint32_t range_idx= min_max_ranges.elements; range_idx > 0; range_idx--)
9580
for (uint range_idx= min_max_ranges.elements; range_idx > 0; range_idx--)
9575
9581
{ /* Search from the right-most range to the left. */
9576
get_dynamic(&min_max_ranges, (unsigned char*)&cur_range, range_idx - 1);
9582
get_dynamic(&min_max_ranges, (uchar*)&cur_range, range_idx - 1);
9579
9585
If the current value for the min/max argument is smaller than the left
9582
9588
if (range_idx != min_max_ranges.elements &&
9583
9589
!(cur_range->flag & NO_MIN_RANGE) &&
9584
(key_cmp(min_max_arg_part, (const unsigned char*) cur_range->min_key,
9590
(key_cmp(min_max_arg_part, (const uchar*) cur_range->min_key,
9585
9591
min_max_arg_len) == -1))
9627
9633
if ( !(cur_range->flag & NO_MIN_RANGE) )
9629
9635
/* Compose the MIN key for the range. */
9630
unsigned char *min_key= (unsigned char*) my_alloca(real_prefix_len + min_max_arg_len);
9636
uchar *min_key= (uchar*) my_alloca(real_prefix_len + min_max_arg_len);
9631
9637
memcpy(min_key, group_prefix, real_prefix_len);
9632
9638
memcpy(min_key + real_prefix_len, cur_range->min_key,
9633
9639
cur_range->min_length);
9729
9735
String *used_lengths)
9733
9739
key_names->append(index_info->name);
9734
9740
length= int64_t2str(max_used_key_length, buf, 10) - buf;
9735
9741
used_lengths->append(buf, length);
9738
9744
static void print_sel_tree(PARAM *param, SEL_TREE *tree, key_map *tree_map,
9739
const char *msg __attribute__((unused)))
9745
const char *msg __attribute__((__unused__)))
9741
9747
SEL_ARG **key,**end;
9766
static void print_ror_scans_arr(Table *table,
9767
const char *msg __attribute__((unused)),
9772
static void print_ror_scans_arr(TABLE *table,
9773
const char *msg __attribute__((__unused__)),
9768
9774
struct st_ror_scan_info **start,
9769
9775
struct st_ror_scan_info **end)