From: Jorgen Loland Date: December 21 2010 7:34am Subject: bzr commit into mysql-next-mr-bugfixing branch (jorgen.loland:3242) WL#4800 List-Archive: http://lists.mysql.com/commits/127353 Message-Id: <20101221073436.2647B453@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3345559533693896787==" --===============3345559533693896787== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/jl208045/mysql/wl4800/mysql-next-mr-opt-backporting-wl4800-revert_printquick/ based on revid:guilhem@stripped 3242 Jorgen Loland 2010-12-21 WL#4800: Revert print_quick() and friends to how they are in next-mr-opt-backporting, i.e., remove optimizer tracing from this function since tracing of quick is performed in TABLE_READ_PLAN::trace_basic_info() instead. @ WL4800_TODO.txt Update todo-list @ sql/opt_range.cc Revert print_quick() and friends to how they are in next-mr-opt-backporting. modified: WL4800_TODO.txt sql/opt_range.cc === modified file 'WL4800_TODO.txt' --- a/WL4800_TODO.txt 2010-12-19 14:28:08 +0000 +++ b/WL4800_TODO.txt 2010-12-21 07:34:33 +0000 @@ -29,8 +29,7 @@ Review comments left: - in changelog, mention /*select#*/; in doc, mention use of this (to decrypt what "id" is about in EXPLAIN). - more checks for non-unique keys? -- revert print_quick() and dbug_dump() to how they are in - opt_backporting. dbug_dump() functions may not be needed anymore. + Try to revert opt_range.cc and sql_test.cc as much as possible. Jorgen working on it. === modified file 'sql/opt_range.cc' --- a/sql/opt_range.cc 2010-12-19 14:24:03 +0000 +++ b/sql/opt_range.cc 2010-12-21 07:34:33 +0000 @@ -792,17 +792,13 @@ TABLE_READ_PLAN *get_best_disjunct_quick static TRP_GROUP_MIN_MAX *get_best_group_min_max(PARAM *param, SEL_TREE *tree, double read_time); -#ifndef DBUG_OFF +#if !defined(DBUG_OFF) || defined(OPTIMIZER_TRACE) static void print_sel_tree(PARAM *param, SEL_TREE *tree, key_map *tree_map, const char *msg); static void print_ror_scans_arr(TABLE *table, const char *msg, struct st_ror_scan_info **start, struct st_ror_scan_info **end); -#endif -#if !defined(DBUG_OFF) || defined(OPTIMIZER_TRACE) -#if 0 static void print_quick(QUICK_SELECT_I *quick, const key_map *needed_reg); -#endif static void append_range(String *out, const KEY_PART_INFO *key_parts, const uchar *min_key, const uchar *max_key, @@ -1963,60 +1959,6 @@ public: Opt_trace_object *trace_object) const = 0; }; - -#if !defined(DBUG_OFF) || defined(OPTIMIZER_TRACE) -/** - Print a key into a stream - - @param[out] out String the key is appended to - @param[in] key_part Index components description - @param[in] key Key tuple - @param[in] used_length Key tuple length -*/ -static void -print_key_value(String *out, const KEY_PART_INFO *key_part, const uchar *key) -{ - String tmp; - uint store_length; - TABLE *table= key_part->field->table; - my_bitmap_map *old_sets[2]; - - dbug_tmp_use_all_columns(table, old_sets, table->read_set, table->write_set); - - Field *field= key_part->field; - store_length= key_part->store_length; - - if (field->real_maybe_null()) - { - /* - Byte 0 of key is the null-byte. If set, key is NULL. - Otherwise, print the key value starting immediately after the - null-byte - */ - if (*key) - { - out->append(STRING_WITH_LEN("NULL")); - goto restore_col_map; - } - key++; // Skip null byte - store_length--; - } - field->set_key_image(key, key_part->length); - if (field->type() == MYSQL_TYPE_BIT) - { - // Prints bitfield as integer; val_str() prints as char: harder to read - (void) field->val_int_as_str(&tmp, 1); // may change tmp's charset - } - else - field->val_str(&tmp); // may change tmp's charset - out->append(tmp.ptr(), tmp.length(), tmp.charset()); - -restore_col_map: - dbug_tmp_restore_column_maps(table->read_set, table->write_set, old_sets); -} -#endif - - /* Plan for a QUICK_RANGE_SELECT scan. TRP_RANGE::make_quick ignores retrieve_full_rows parameter because @@ -2800,6 +2742,8 @@ free_mem: thd->no_errors=0; } + DBUG_EXECUTE("info", print_quick(quick, &needed_reg);); + /* Assume that if the user is using 'limit' we will only need to scan limit rows if we are using a key @@ -3160,7 +3104,7 @@ end: void store_key_image_to_rec(Field *field, uchar *ptr, uint len) { - /* Do the same as print_key() does */ + /* Do the same as print_key_value() does */ my_bitmap_map *old_map; if (field->real_maybe_null()) @@ -12310,14 +12254,58 @@ static void print_ror_scans_arr(TABLE *t #endif /* !DBUG_OFF */ +#if !defined(DBUG_OFF) || defined(OPTIMIZER_TRACE) + /***************************************************************************** -** Print a quick range for debugging -** TODO: -** This should be changed to use a String to store each row instead -** of locking the DEBUG stream ! +** Append a range for a single keypart into a stream. *****************************************************************************/ -#if !defined(DBUG_OFF) || defined(OPTIMIZER_TRACE) +/** + Print a key into a stream + + @param[out] out String the key is appended to + @param[in] key_part Index components description + @param[in] key Key tuple + @param[in] used_length Key tuple length +*/ +static void +print_key_value(String *out, const KEY_PART_INFO *key_part, const uchar *key) +{ + String tmp; + uint store_length; + TABLE *table= key_part->field->table; + my_bitmap_map *old_sets[2]; + + dbug_tmp_use_all_columns(table, old_sets, table->read_set, table->write_set); + + Field *field= key_part->field; + store_length= key_part->store_length; + + if (field->real_maybe_null()) + { + /* + Byte 0 of key is the null-byte. If set, key is NULL. + Otherwise, print the key value starting immediately after the + null-byte + */ + if (*key) + { + out->append(STRING_WITH_LEN("NULL")); + goto restore_col_map; + } + key++; // Skip null byte + store_length--; + } + field->set_key_image(key, key_part->length); + if (field->type() == MYSQL_TYPE_BIT) + (void) field->val_int_as_str(&tmp, 1); // may change tmp's charset + else + field->val_str(&tmp); // may change tmp's charset + out->append(tmp.ptr(), tmp.length(), tmp.charset()); + +restore_col_map: + dbug_tmp_restore_column_maps(table->read_set, table->write_set, old_sets); +} /** Append range info for a key part to a string @@ -12358,7 +12346,53 @@ static void append_range(String *out, } } -#if 0 +/***************************************************************************** +** Print a quick range for debugging +** TODO: +** This should be changed to use a String to store each row instead +** of locking the DEBUG stream ! +*****************************************************************************/ + +static void +print_multiple_key_values(KEY_PART *key_part, const uchar *key, + uint used_length) +{ + char buff[1024]; + const uchar *key_end= key+used_length; + String tmp(buff,sizeof(buff),&my_charset_bin); + uint store_length; + TABLE *table= key_part->field->table; + my_bitmap_map *old_sets[2]; + + dbug_tmp_use_all_columns(table, old_sets, table->read_set, table->write_set); + + for (; key < key_end; key+=store_length, key_part++) + { + Field *field= key_part->field; + store_length= key_part->store_length; + + if (field->real_maybe_null()) + { + if (*key) + { + fwrite("NULL",sizeof(char),4,DBUG_FILE); + continue; + } + key++; // Skip null byte + store_length--; + } + field->set_key_image(key, key_part->length); + if (field->type() == MYSQL_TYPE_BIT) + (void) field->val_int_as_str(&tmp, 1); + else + field->val_str(&tmp); + fwrite(tmp.ptr(),sizeof(char),tmp.length(),DBUG_FILE); + if (key+store_length < key_end) + fputc('/',DBUG_FILE); + } + dbug_tmp_restore_column_maps(table->read_set, table->write_set, old_sets); +} + static void print_quick(QUICK_SELECT_I *quick, const key_map *needed_reg) { char buf[MAX_KEY/8+1]; @@ -12383,87 +12417,92 @@ static void print_quick(QUICK_SELECT_I * DBUG_UNLOCK_FILE; DBUG_VOID_RETURN; } -#endif /* if 0*/ + void QUICK_RANGE_SELECT::dbug_dump(int indent, bool verbose) { - Opt_trace_context *out= current_thd->opt_trace; - Opt_trace_object oto(out, "range_scan"); - oto.add_utf8("index", head->key_info[index].name). - add("key_length", max_used_key_length). - add("used_keyparts", used_key_parts); - - Opt_trace_array trace_range(out, "ranges"); /* purecov: begin inspected */ - if (TRUE) + fprintf(DBUG_FILE, "%*squick range select, key %s, length: %d\n", + indent, "", head->key_info[index].name, max_used_key_length); + + if (verbose) { QUICK_RANGE *range; QUICK_RANGE **pr= (QUICK_RANGE**)ranges.buffer; QUICK_RANGE **end_range= pr + ranges.elements; for (; pr != end_range; ++pr) { - String range_info; - range_info.set_charset(system_charset_info); + fprintf(DBUG_FILE, "%*s", indent + 2, ""); range= *pr; - append_range(&range_info, head->key_info[index].key_part, - range->min_key, range->max_key, - range->flag); - trace_range.add_utf8(range_info.ptr(), range_info.length()); + if (!(range->flag & NO_MIN_RANGE)) + { + print_multiple_key_values(key_parts, range->min_key, + range->min_length); + if (range->flag & NEAR_MIN) + fputs(" < ",DBUG_FILE); + else + fputs(" <= ",DBUG_FILE); + } + fputs("X",DBUG_FILE); + + if (!(range->flag & NO_MAX_RANGE)) + { + if (range->flag & NEAR_MAX) + fputs(" < ",DBUG_FILE); + else + fputs(" <= ",DBUG_FILE); + print_multiple_key_values(key_parts, range->max_key, + range->max_length); + } + fputs("\n",DBUG_FILE); } } - /* purecov: end */ + /* purecov: end */ } void QUICK_INDEX_MERGE_SELECT::dbug_dump(int indent, bool verbose) { - Opt_trace_context *out= current_thd->opt_trace; List_iterator_fast it(quick_selects); QUICK_RANGE_SELECT *quick; - /* purecov: begin inspected */ - Opt_trace_array ota(out, "index_merge"); + fprintf(DBUG_FILE, "%*squick index_merge select\n", indent, ""); + fprintf(DBUG_FILE, "%*smerged scans {\n", indent, ""); while ((quick= it++)) - { - Opt_trace_object wrapper(out); quick->dbug_dump(indent+2, verbose); - } if (pk_quick_select) { - Opt_trace_object oto2(out, "clustered_pk_scan"); + fprintf(DBUG_FILE, "%*sclustered PK quick:\n", indent, ""); pk_quick_select->dbug_dump(indent+2, verbose); } + fprintf(DBUG_FILE, "%*s}\n", indent, ""); } void QUICK_ROR_INTERSECT_SELECT::dbug_dump(int indent, bool verbose) { - Opt_trace_context *out= current_thd->opt_trace; List_iterator_fast it(quick_selects); QUICK_RANGE_SELECT *quick; - Opt_trace_array ota(out, "index_roworder_intersect"); + fprintf(DBUG_FILE, "%*squick ROR-intersect select, %scovering\n", + indent, "", need_to_fetch_row? "":"non-"); + fprintf(DBUG_FILE, "%*smerged scans {\n", indent, ""); while ((quick= it++)) - { - Opt_trace_object wrapper(out); quick->dbug_dump(indent+2, verbose); - } if (cpk_quick) { - Opt_trace_object oto2(out, "clustered_pk_scan"); + fprintf(DBUG_FILE, "%*sclustered PK quick:\n", indent, ""); cpk_quick->dbug_dump(indent+2, verbose); } + fprintf(DBUG_FILE, "%*s}\n", indent, ""); } void QUICK_ROR_UNION_SELECT::dbug_dump(int indent, bool verbose) { - Opt_trace_context *out= current_thd->opt_trace; List_iterator_fast it(quick_selects); QUICK_SELECT_I *quick; - Opt_trace_array ota(out, "index_roworder_union"); + fprintf(DBUG_FILE, "%*squick ROR-union select\n", indent, ""); + fprintf(DBUG_FILE, "%*smerged scans {\n", indent, ""); while ((quick= it++)) - { - Opt_trace_object wrapper(out); quick->dbug_dump(indent+2, verbose); - } + fprintf(DBUG_FILE, "%*s}\n", indent, ""); } - /* Print quick select information to DBUG_FILE. @@ -12486,14 +12525,9 @@ void QUICK_ROR_UNION_SELECT::dbug_dump(i void QUICK_GROUP_MIN_MAX_SELECT::dbug_dump(int indent, bool verbose) { - Opt_trace_context *out= current_thd->opt_trace; - Opt_trace_object oto(out, "index_group"); - oto.add_utf8("index", index_info->name). - add("key_length", max_used_key_length); - fprintf(DBUG_FILE, "%*squick_group_min_max_select: index %s (%d), length: %d\n", - indent, "", index_info->name, index, max_used_key_length); + indent, "", index_info->name, index, max_used_key_length); if (key_infix_len > 0) { fprintf(DBUG_FILE, "%*susing key_infix with length %d:\n", @@ -12511,6 +12545,7 @@ void QUICK_GROUP_MIN_MAX_SELECT::dbug_du } } + #endif /* !DBUG_OFF || OPTIMIZER_TRACE */ /***************************************************************************** --===============3345559533693896787== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jorgen.loland@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jorgen.loland@stripped\ # nqg9a60zdwbb0tmy # target_branch: file:///export/home/jl208045/mysql/wl4800/mysql-next-\ # mr-opt-backporting-wl4800-revert_printquick/ # testament_sha1: 24dcdf73586cf5e0d48ca25a7d53eac711c4ffb9 # timestamp: 2010-12-21 08:34:36 +0100 # base_revision_id: guilhem@stripped # # Begin bundle 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 --===============3345559533693896787==--