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);
765
static void print_quick(QUICK_SELECT_I *quick, const key_map *needed_reg);
761
767
static SEL_TREE *tree_and(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2);
762
768
static SEL_TREE *tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2);
763
769
static SEL_ARG *sel_add(SEL_ARG *key1,SEL_ARG *key2);
764
770
static SEL_ARG *key_or(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2);
765
771
static SEL_ARG *key_and(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2,
766
uint32_t clone_flag);
767
773
static bool get_range(SEL_ARG **e1,SEL_ARG **e2,SEL_ARG *root1);
768
774
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);
775
SEL_ARG *key_tree, uchar *min_key,uint min_key_flag,
776
uchar *max_key,uint max_key_flag);
771
777
static bool eq_tree(SEL_ARG* a,SEL_ARG *b);
773
779
static SEL_ARG null_element(SEL_ARG::IMPOSSIBLE);
774
static bool null_part_in_key(KEY_PART *key_part, const unsigned char *key,
780
static bool null_part_in_key(KEY_PART *key_part, const uchar *key,
776
782
bool sel_trees_can_be_ored(SEL_TREE *tree1, SEL_TREE *tree2, RANGE_OPT_PARAM* param);
1602
1607
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)
1610
SEL_ARG::SEL_ARG(Field *f,const uchar *min_value_arg,
1611
const uchar *max_value_arg)
1607
1612
: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),
1613
elements(1), use_count(1), field(f), min_value((uchar*) min_value_arg),
1614
max_value((uchar*) max_value_arg), next(0),prev(0),
1610
1615
next_key_part(0),color(BLACK),type(KEY_RANGE)
1612
1617
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_)
1620
SEL_ARG::SEL_ARG(Field *field_,uint8 part_,
1621
uchar *min_value_, uchar *max_value_,
1622
uint8 min_flag_,uint8 max_flag_,uint8 maybe_flag_)
1618
1623
:min_flag(min_flag_),max_flag(max_flag_),maybe_flag(maybe_flag_),
1619
1624
part(part_),maybe_null(field_->real_maybe_null()), elements(1),use_count(1),
1620
1625
field(field_), min_value(min_value_), max_value(max_value_),
1998
1998
bool have_min, have_max;
1999
1999
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;
2000
uint group_prefix_len;
2001
uint used_key_parts;
2002
uint group_key_parts;
2003
2003
KEY *index_info;
2005
uint32_t key_infix_len;
2006
unsigned char key_infix[MAX_KEY_LENGTH];
2006
uchar key_infix[MAX_KEY_LENGTH];
2007
2007
SEL_TREE *range_tree; /* Represents all range predicates in the query. */
2008
2008
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. */
2009
uint param_idx; /* Index of used key in param->key. */
2010
2010
/* Number of records selected by the ranges in index_tree. */
2012
2012
ha_rows quick_prefix_records;
2014
2014
TRP_GROUP_MIN_MAX(bool have_min_arg, bool have_max_arg,
2015
2015
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,
2016
uint group_prefix_len_arg, uint used_key_parts_arg,
2017
uint group_key_parts_arg, KEY *index_info_arg,
2018
uint index_arg, uint key_infix_len_arg,
2019
uchar *key_infix_arg,
2020
2020
SEL_TREE *tree_arg, SEL_ARG *index_tree_arg,
2021
uint32_t param_idx_arg, ha_rows quick_prefix_records_arg)
2021
uint param_idx_arg, ha_rows quick_prefix_records_arg)
2022
2022
: have_min(have_min_arg), have_max(have_max_arg),
2023
2023
min_max_arg_part(min_max_arg_part_arg),
2024
2024
group_prefix_len(group_prefix_len_arg), used_key_parts(used_key_parts_arg),
7680
7676
* Implementation of QUICK_GROUP_MIN_MAX_SELECT
7681
7677
*******************************************************************************/
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);
7679
static inline uint get_field_keypart(KEY *index, Field *field);
7680
static inline SEL_ARG * get_index_range_tree(uint index, SEL_TREE* range_tree,
7681
PARAM *param, uint *param_idx);
7686
7682
static bool get_constant_key_infix(KEY *index_info, SEL_ARG *index_range_tree,
7687
7683
KEY_PART_INFO *first_non_group_part,
7688
7684
KEY_PART_INFO *min_max_arg_part,
7689
7685
KEY_PART_INFO *last_part, THD *thd,
7690
unsigned char *key_infix, uint32_t *key_infix_len,
7686
uchar *key_infix, uint *key_infix_len,
7691
7687
KEY_PART_INFO **first_non_infix_part);
7693
7689
check_group_min_max_predicates(COND *cond, Item_field *min_max_arg_item,
7694
7690
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,
7693
cost_group_min_max(TABLE* table, KEY *index_info, uint used_key_parts,
7694
uint group_key_parts, SEL_TREE *range_tree,
7699
7695
SEL_ARG *index_tree, ha_rows quick_prefix_records,
7700
7696
bool have_min, bool have_max,
7701
7697
double *read_cost, ha_rows *records);
7926
7922
KEY_PART_INFO *last_part= NULL;
7927
7923
KEY_PART_INFO *first_non_group_part= NULL;
7928
7924
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;
7925
uint key_infix_parts= 0;
7926
uint cur_group_key_parts= 0;
7927
uint cur_group_prefix_len= 0;
7932
7928
/* Cost-related variables for the best index so far. */
7933
7929
double best_read_cost= DBL_MAX;
7934
7930
ha_rows best_records= 0;
7935
7931
SEL_ARG *best_index_tree= NULL;
7936
7932
ha_rows best_quick_prefix_records= 0;
7937
uint32_t best_param_idx= 0;
7933
uint best_param_idx= 0;
7938
7934
double cur_read_cost= DBL_MAX;
7939
7935
ha_rows cur_records;
7940
7936
SEL_ARG *cur_index_tree= NULL;
7941
7937
ha_rows cur_quick_prefix_records= 0;
7942
uint32_t cur_param_idx=MAX_KEY;
7938
uint cur_param_idx=MAX_KEY;
7943
7939
key_map cur_used_key_parts;
7944
uint32_t pk= param->table->s->primary_key;
7940
uint pk= param->table->s->primary_key;
7946
for (uint32_t cur_index= 0 ; cur_index_info != cur_index_info_end ;
7942
for (uint cur_index= 0 ; cur_index_info != cur_index_info_end ;
7947
7943
cur_index_info++, cur_index++)
7949
7945
/* Check (B1) - if current index is covering. */
8785
8779
QUICK_GROUP_MIN_MAX_SELECT::
8786
QUICK_GROUP_MIN_MAX_SELECT(Table *table, JOIN *join_arg, bool have_min_arg,
8780
QUICK_GROUP_MIN_MAX_SELECT(TABLE *table, JOIN *join_arg, bool have_min_arg,
8787
8781
bool have_max_arg,
8788
8782
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)
8783
uint group_prefix_len_arg, uint group_key_parts_arg,
8784
uint used_key_parts_arg, KEY *index_info_arg,
8785
uint use_index, double read_cost_arg,
8786
ha_rows records_arg, uint key_infix_len_arg,
8787
uchar *key_infix_arg, MEM_ROOT *parent_alloc)
8794
8788
:join(join_arg), index_info(index_info_arg),
8795
8789
group_prefix_len(group_prefix_len_arg),
8796
8790
group_key_parts(group_key_parts_arg), have_min(have_min_arg),
9779
/*****************************************************************************
9780
** Print a quick range for debugging
9782
** This should be changed to use a String to store each row instead
9783
** of locking the DEBUG stream !
9784
*****************************************************************************/
9787
print_key(KEY_PART *key_part, const uchar *key, uint used_length)
9790
const uchar *key_end= key+used_length;
9791
String tmp(buff,sizeof(buff),&my_charset_bin);
9793
TABLE *table= key_part->field->table;
9794
my_bitmap_map *old_write_set, *old_read_set;
9795
old_write_set= dbug_tmp_use_all_columns(table, table->write_set);
9796
old_read_set= dbug_tmp_use_all_columns(table, table->read_set);
9798
for (; key < key_end; key+=store_length, key_part++)
9800
Field *field= key_part->field;
9801
store_length= key_part->store_length;
9803
if (field->real_maybe_null())
9807
fwrite("NULL",sizeof(char),4,DBUG_FILE);
9810
key++; // Skip null byte
9813
field->set_key_image(key, key_part->length);
9814
field->val_str(&tmp);
9815
fwrite(tmp.ptr(),sizeof(char),tmp.length(),DBUG_FILE);
9816
if (key+store_length < key_end)
9817
fputc('/',DBUG_FILE);
9819
dbug_tmp_restore_column_map(table->write_set, old_write_set);
9820
dbug_tmp_restore_column_map(table->read_set, old_read_set);
9824
static void print_quick(QUICK_SELECT_I *quick, const key_map *needed_reg)
9826
char buf[MAX_KEY/8+1];
9828
my_bitmap_map *old_read_map, *old_write_map;
9834
old_read_map= dbug_tmp_use_all_columns(table, table->read_set);
9835
old_write_map= dbug_tmp_use_all_columns(table, table->write_set);
9836
quick->dbug_dump(0, true);
9837
dbug_tmp_restore_column_map(table->read_set, old_read_map);
9838
dbug_tmp_restore_column_map(table->write_set, old_write_map);
9840
fprintf(DBUG_FILE,"other_keys: 0x%s:\n", needed_reg->print(buf));
9847
void QUICK_RANGE_SELECT::dbug_dump(int indent, bool verbose)
9849
/* purecov: begin inspected */
9850
fprintf(DBUG_FILE, "%*squick range select, key %s, length: %d\n",
9851
indent, "", head->key_info[index].name, max_used_key_length);
9856
QUICK_RANGE **pr= (QUICK_RANGE**)ranges.buffer;
9857
QUICK_RANGE **end_range= pr + ranges.elements;
9858
for (; pr != end_range; ++pr)
9860
fprintf(DBUG_FILE, "%*s", indent + 2, "");
9862
if (!(range->flag & NO_MIN_RANGE))
9864
print_key(key_parts, range->min_key, range->min_length);
9865
if (range->flag & NEAR_MIN)
9866
fputs(" < ",DBUG_FILE);
9868
fputs(" <= ",DBUG_FILE);
9870
fputs("X",DBUG_FILE);
9872
if (!(range->flag & NO_MAX_RANGE))
9874
if (range->flag & NEAR_MAX)
9875
fputs(" < ",DBUG_FILE);
9877
fputs(" <= ",DBUG_FILE);
9878
print_key(key_parts, range->max_key, range->max_length);
9880
fputs("\n",DBUG_FILE);
9886
void QUICK_INDEX_MERGE_SELECT::dbug_dump(int indent, bool verbose)
9888
List_iterator_fast<QUICK_RANGE_SELECT> it(quick_selects);
9889
QUICK_RANGE_SELECT *quick;
9890
fprintf(DBUG_FILE, "%*squick index_merge select\n", indent, "");
9891
fprintf(DBUG_FILE, "%*smerged scans {\n", indent, "");
9892
while ((quick= it++))
9893
quick->dbug_dump(indent+2, verbose);
9894
if (pk_quick_select)
9896
fprintf(DBUG_FILE, "%*sclustered PK quick:\n", indent, "");
9897
pk_quick_select->dbug_dump(indent+2, verbose);
9899
fprintf(DBUG_FILE, "%*s}\n", indent, "");
9902
void QUICK_ROR_INTERSECT_SELECT::dbug_dump(int indent, bool verbose)
9904
List_iterator_fast<QUICK_RANGE_SELECT> it(quick_selects);
9905
QUICK_RANGE_SELECT *quick;
9906
fprintf(DBUG_FILE, "%*squick ROR-intersect select, %scovering\n",
9907
indent, "", need_to_fetch_row? "":"non-");
9908
fprintf(DBUG_FILE, "%*smerged scans {\n", indent, "");
9909
while ((quick= it++))
9910
quick->dbug_dump(indent+2, verbose);
9913
fprintf(DBUG_FILE, "%*sclustered PK quick:\n", indent, "");
9914
cpk_quick->dbug_dump(indent+2, verbose);
9916
fprintf(DBUG_FILE, "%*s}\n", indent, "");
9919
void QUICK_ROR_UNION_SELECT::dbug_dump(int indent, bool verbose)
9921
List_iterator_fast<QUICK_SELECT_I> it(quick_selects);
9922
QUICK_SELECT_I *quick;
9923
fprintf(DBUG_FILE, "%*squick ROR-union select\n", indent, "");
9924
fprintf(DBUG_FILE, "%*smerged scans {\n", indent, "");
9925
while ((quick= it++))
9926
quick->dbug_dump(indent+2, verbose);
9927
fprintf(DBUG_FILE, "%*s}\n", indent, "");
9932
Print quick select information to DBUG_FILE.
9935
QUICK_GROUP_MIN_MAX_SELECT::dbug_dump()
9936
indent Indentation offset
9937
verbose If true show more detailed output.
9940
Print the contents of this quick select to DBUG_FILE. The method also
9941
calls dbug_dump() for the used quick select if any.
9944
Caller is responsible for locking DBUG_FILE before this call and unlocking
9951
void QUICK_GROUP_MIN_MAX_SELECT::dbug_dump(int indent, bool verbose)
9954
"%*squick_group_min_max_select: index %s (%d), length: %d\n",
9955
indent, "", index_info->name, index, max_used_key_length);
9956
if (key_infix_len > 0)
9958
fprintf(DBUG_FILE, "%*susing key_infix with length %d:\n",
9959
indent, "", key_infix_len);
9961
if (quick_prefix_select)
9963
fprintf(DBUG_FILE, "%*susing quick_range_select:\n", indent, "");
9964
quick_prefix_select->dbug_dump(indent + 2, verbose);
9966
if (min_max_ranges.elements > 0)
9968
fprintf(DBUG_FILE, "%*susing %d quick_ranges for MIN/MAX:\n",
9969
indent, "", min_max_ranges.elements);
9785
9973
/*****************************************************************************
9786
9974
** Instantiate templates
9787
9975
*****************************************************************************/