9794
/*****************************************************************************
9795
** Print a quick range for debugging
9797
** This should be changed to use a String to store each row instead
9798
** of locking the DEBUG stream !
9799
*****************************************************************************/
9802
print_key(KEY_PART *key_part, const uchar *key, uint used_length)
9805
const uchar *key_end= key+used_length;
9806
String tmp(buff,sizeof(buff),&my_charset_bin);
9808
TABLE *table= key_part->field->table;
9809
my_bitmap_map *old_write_set, *old_read_set;
9810
old_write_set= dbug_tmp_use_all_columns(table, table->write_set);
9811
old_read_set= dbug_tmp_use_all_columns(table, table->read_set);
9813
for (; key < key_end; key+=store_length, key_part++)
9815
Field *field= key_part->field;
9816
store_length= key_part->store_length;
9818
if (field->real_maybe_null())
9822
fwrite("NULL",sizeof(char),4,DBUG_FILE);
9825
key++; // Skip null byte
9828
field->set_key_image(key, key_part->length);
9829
field->val_str(&tmp);
9830
fwrite(tmp.ptr(),sizeof(char),tmp.length(),DBUG_FILE);
9831
if (key+store_length < key_end)
9832
fputc('/',DBUG_FILE);
9834
dbug_tmp_restore_column_map(table->write_set, old_write_set);
9835
dbug_tmp_restore_column_map(table->read_set, old_read_set);
9839
static void print_quick(QUICK_SELECT_I *quick, const key_map *needed_reg)
9841
char buf[MAX_KEY/8+1];
9843
my_bitmap_map *old_read_map, *old_write_map;
9849
old_read_map= dbug_tmp_use_all_columns(table, table->read_set);
9850
old_write_map= dbug_tmp_use_all_columns(table, table->write_set);
9851
quick->dbug_dump(0, true);
9852
dbug_tmp_restore_column_map(table->read_set, old_read_map);
9853
dbug_tmp_restore_column_map(table->write_set, old_write_map);
9855
fprintf(DBUG_FILE,"other_keys: 0x%s:\n", needed_reg->print(buf));
9862
void QUICK_RANGE_SELECT::dbug_dump(int indent, bool verbose)
9864
/* purecov: begin inspected */
9865
fprintf(DBUG_FILE, "%*squick range select, key %s, length: %d\n",
9866
indent, "", head->key_info[index].name, max_used_key_length);
9871
QUICK_RANGE **pr= (QUICK_RANGE**)ranges.buffer;
9872
QUICK_RANGE **end_range= pr + ranges.elements;
9873
for (; pr != end_range; ++pr)
9875
fprintf(DBUG_FILE, "%*s", indent + 2, "");
9877
if (!(range->flag & NO_MIN_RANGE))
9879
print_key(key_parts, range->min_key, range->min_length);
9880
if (range->flag & NEAR_MIN)
9881
fputs(" < ",DBUG_FILE);
9883
fputs(" <= ",DBUG_FILE);
9885
fputs("X",DBUG_FILE);
9887
if (!(range->flag & NO_MAX_RANGE))
9889
if (range->flag & NEAR_MAX)
9890
fputs(" < ",DBUG_FILE);
9892
fputs(" <= ",DBUG_FILE);
9893
print_key(key_parts, range->max_key, range->max_length);
9895
fputs("\n",DBUG_FILE);
9901
void QUICK_INDEX_MERGE_SELECT::dbug_dump(int indent, bool verbose)
9903
List_iterator_fast<QUICK_RANGE_SELECT> it(quick_selects);
9904
QUICK_RANGE_SELECT *quick;
9905
fprintf(DBUG_FILE, "%*squick index_merge select\n", indent, "");
9906
fprintf(DBUG_FILE, "%*smerged scans {\n", indent, "");
9907
while ((quick= it++))
9908
quick->dbug_dump(indent+2, verbose);
9909
if (pk_quick_select)
9911
fprintf(DBUG_FILE, "%*sclustered PK quick:\n", indent, "");
9912
pk_quick_select->dbug_dump(indent+2, verbose);
9914
fprintf(DBUG_FILE, "%*s}\n", indent, "");
9917
void QUICK_ROR_INTERSECT_SELECT::dbug_dump(int indent, bool verbose)
9919
List_iterator_fast<QUICK_RANGE_SELECT> it(quick_selects);
9920
QUICK_RANGE_SELECT *quick;
9921
fprintf(DBUG_FILE, "%*squick ROR-intersect select, %scovering\n",
9922
indent, "", need_to_fetch_row? "":"non-");
9923
fprintf(DBUG_FILE, "%*smerged scans {\n", indent, "");
9924
while ((quick= it++))
9925
quick->dbug_dump(indent+2, verbose);
9928
fprintf(DBUG_FILE, "%*sclustered PK quick:\n", indent, "");
9929
cpk_quick->dbug_dump(indent+2, verbose);
9931
fprintf(DBUG_FILE, "%*s}\n", indent, "");
9934
void QUICK_ROR_UNION_SELECT::dbug_dump(int indent, bool verbose)
9936
List_iterator_fast<QUICK_SELECT_I> it(quick_selects);
9937
QUICK_SELECT_I *quick;
9938
fprintf(DBUG_FILE, "%*squick ROR-union select\n", indent, "");
9939
fprintf(DBUG_FILE, "%*smerged scans {\n", indent, "");
9940
while ((quick= it++))
9941
quick->dbug_dump(indent+2, verbose);
9942
fprintf(DBUG_FILE, "%*s}\n", indent, "");
9947
Print quick select information to DBUG_FILE.
9950
QUICK_GROUP_MIN_MAX_SELECT::dbug_dump()
9951
indent Indentation offset
9952
verbose If true show more detailed output.
9955
Print the contents of this quick select to DBUG_FILE. The method also
9956
calls dbug_dump() for the used quick select if any.
9959
Caller is responsible for locking DBUG_FILE before this call and unlocking
9966
void QUICK_GROUP_MIN_MAX_SELECT::dbug_dump(int indent, bool verbose)
9969
"%*squick_group_min_max_select: index %s (%d), length: %d\n",
9970
indent, "", index_info->name, index, max_used_key_length);
9971
if (key_infix_len > 0)
9973
fprintf(DBUG_FILE, "%*susing key_infix with length %d:\n",
9974
indent, "", key_infix_len);
9976
if (quick_prefix_select)
9978
fprintf(DBUG_FILE, "%*susing quick_range_select:\n", indent, "");
9979
quick_prefix_select->dbug_dump(indent + 2, verbose);
9981
if (min_max_ranges.elements > 0)
9983
fprintf(DBUG_FILE, "%*susing %d quick_ranges for MIN/MAX:\n",
9984
indent, "", min_max_ranges.elements);
9988
9793
/*****************************************************************************
9989
9794
** Instantiate templates
9990
9795
*****************************************************************************/