diff options
author | unknown <cmiller@zippy.cornsilk.net> | 2007-01-03 17:15:10 -0500 |
---|---|---|
committer | unknown <cmiller@zippy.cornsilk.net> | 2007-01-03 17:15:10 -0500 |
commit | 66dfd85cf4d55e6d87e8bb81b8fc8450eb9b3f67 (patch) | |
tree | 3ccc1d229c4d2704fc85d800e206032a74a7a2e0 /sql/sql_select.cc | |
parent | 96fa010c66bffd1f904d5d71bd2d0a0087ad287b (diff) | |
download | mariadb-git-66dfd85cf4d55e6d87e8bb81b8fc8450eb9b3f67.tar.gz |
Bug#24795: Add SHOW PROFILE
Patch contributed by Jeremy Cole. CLA received Oct 2006 by Kaj Arnö
Add rudimentary query profiling support.
libmysqld/Makefile.am:
Add profile file to source list.
sql/Makefile.am:
Add profiling files to source and header lists.
sql/ha_archive.cc:
Macro-ized other discovered instances of setting proc_info.
sql/ha_myisam.cc:
Macroize setting thread-state info
sql/item_func.cc:
Macro-ized other discovered instances of setting proc_info.
sql/lex.h:
Add lexer info for profiling.
sql/lock.cc:
Macroize setting thread-state info
sql/log_event.cc:
Macro-ized other discovered instances of setting proc_info.
sql/mysql_priv.h:
Set constants for profiling.
sql/repl_failsafe.cc:
Macro-ized other discovered instances of setting proc_info.
sql/slave.cc:
Macro-ized other discovered instances of setting proc_info.
sql/sp_head.cc:
Macro-ized other discovered instances of setting proc_info.
sql/sql_base.cc:
Macroize setting thread-state info
---
Macro-ized other discovered instances of setting proc_info.
sql/sql_cache.cc:
Macroize setting thread-state info
sql/sql_class.cc:
Integrate profiling.
sql/sql_class.h:
Instantiate profiling object.
sql/sql_delete.cc:
Macroize setting thread-state info
sql/sql_insert.cc:
Macroize setting thread-state info
---
Macro-ized other discovered instances of setting proc_info.
sql/sql_lex.cc:
Initialize profiling.
sql/sql_lex.h:
Define lex tokens and allocate space for profiling options.
sql/sql_parse.cc:
Integrate profiling.
---
Macro-ized other discovered instances of setting proc_info.
sql/sql_repl.cc:
Macro-ized other discovered instances of setting proc_info.
sql/sql_select.cc:
Macroize setting thread-state info.
Clean up some lines.
sql/sql_show.cc:
Macro-ized other discovered instances of setting proc_info.
---
Revert bad use of macro.
sql/sql_table.cc:
Macroize setting thread-state info
sql/sql_update.cc:
Macroize setting thread-state info
sql/sql_view.cc:
Macro-ized other discovered instances of setting proc_info.
sql/sql_yacc.yy:
Add parser info for profiling.
---
Fix new YACC shift/reduce conflict. (Now at 249.)
mysql-test/r/profile.result:
Test profiling code.
---
A not-very-useful result.
mysql-test/t/profile.test:
Test profiling code.
---
Test syntax, but not values of profiles code.
sql/sql_profile.cc:
Add profiling code.
---
Add wishlist comment.
sql/sql_profile.h:
Add profiling code.
---
Changed the value of the macro so that it's syntactically equivalent to a
single statement.
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 3d2f46a9982..cb8f39084df 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -599,6 +599,7 @@ JOIN::optimize() if (thd->lex->orig_sql_command != SQLCOM_SHOW_STATUS) thd->status_var.last_query_cost= 0.0; + THD_PROC_INFO(thd, "optimizing"); row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR : unit->select_limit_cnt); /* select_limit is used to decide if we are likely to scan the whole table */ @@ -702,14 +703,14 @@ JOIN::optimize() thd->fatal_error(); error= res; DBUG_PRINT("error",("Error from opt_sum_query")); - DBUG_RETURN(1); + DBUG_RETURN(1); } if (res < 0) { DBUG_PRINT("info",("No matching min/max row")); - zero_result_cause= "No matching min/max row"; - error=0; - DBUG_RETURN(0); + zero_result_cause= "No matching min/max row"; + error=0; + DBUG_RETURN(0); } DBUG_PRINT("info",("Select tables optimized away")); zero_result_cause= "Select tables optimized away"; @@ -745,7 +746,7 @@ JOIN::optimize() sort_by_table= get_sort_by_table(order, group_list, select_lex->leaf_tables); /* Calculate how to do the join */ - thd->proc_info= "statistics"; + THD_PROC_INFO(thd, "statistics"); if (make_join_statistics(this, select_lex->leaf_tables, conds, &keyuse) || thd->is_fatal_error) { @@ -755,7 +756,7 @@ JOIN::optimize() /* Remove distinct if only const tables */ select_distinct= select_distinct && (const_tables != tables); - thd->proc_info= "preparing"; + THD_PROC_INFO(thd, "preparing"); if (result->initialize_tables(this)) { DBUG_PRINT("error",("Error: initialize_tables() failed")); @@ -1102,8 +1103,9 @@ JOIN::optimize() join_tab[const_tables].type != JT_REF_OR_NULL && (order && simple_order || group_list && simple_group)) { - if (add_ref_to_table_cond(thd,&join_tab[const_tables])) + if (add_ref_to_table_cond(thd,&join_tab[const_tables])) { DBUG_RETURN(1); + } } if (!(select_options & SELECT_BIG_RESULT) && @@ -1161,7 +1163,7 @@ JOIN::optimize() if (need_tmp) { DBUG_PRINT("info",("Creating tmp table")); - thd->proc_info="Creating tmp table"; + THD_PROC_INFO(thd, "creating temporary table"); init_items_ref_array(); @@ -1190,7 +1192,9 @@ JOIN::optimize() select_options, tmp_rows_limit, (char *) ""))) + { DBUG_RETURN(1); + } /* We don't have to store rows in temp table that doesn't match HAVING if: @@ -1210,28 +1214,35 @@ JOIN::optimize() if (group_list && simple_group) { DBUG_PRINT("info",("Sorting for group")); - thd->proc_info="Sorting for group"; + THD_PROC_INFO(thd, "sorting for group"); if (create_sort_index(thd, this, group_list, HA_POS_ERROR, HA_POS_ERROR) || alloc_group_fields(this, group_list) || make_sum_func_list(all_fields, fields_list, 1) || setup_sum_funcs(thd, sum_funcs)) - DBUG_RETURN(1); + { + DBUG_RETURN(1); + } group_list=0; } else { if (make_sum_func_list(all_fields, fields_list, 0) || setup_sum_funcs(thd, sum_funcs)) - DBUG_RETURN(1); + { + DBUG_RETURN(1); + } + if (!group_list && ! exec_tmp_table1->distinct && order && simple_order) { - DBUG_PRINT("info",("Sorting for order")); - thd->proc_info="Sorting for order"; - if (create_sort_index(thd, this, order, + DBUG_PRINT("info",("Sorting for order")); + THD_PROC_INFO(thd, "Sorting for order"); + if (create_sort_index(thd, this, order, HA_POS_ERROR, HA_POS_ERROR)) - DBUG_RETURN(1); - order=0; + { + DBUG_RETURN(1); + } + order=0; } } @@ -1354,6 +1365,7 @@ JOIN::exec() int tmp_error; DBUG_ENTER("JOIN::exec"); + THD_PROC_INFO(thd, "executing"); error= 0; if (procedure) { @@ -1493,7 +1505,7 @@ JOIN::exec() curr_tmp_table= exec_tmp_table1; /* Copy data to the temporary table */ - thd->proc_info= "Copying to tmp table"; + THD_PROC_INFO(thd, "Copying to tmp table"); DBUG_PRINT("info", ("%s", thd->proc_info)); if ((tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table, 0))) { @@ -1616,7 +1628,7 @@ JOIN::exec() } if (curr_join->group_list) { - thd->proc_info= "Creating sort index"; + THD_PROC_INFO(thd, "Creating sort index"); if (curr_join->join_tab == join_tab && save_join_tab()) { DBUG_VOID_RETURN; @@ -1630,7 +1642,7 @@ JOIN::exec() sortorder= curr_join->sortorder; } - thd->proc_info="Copying to group table"; + THD_PROC_INFO(thd, "Copying to group table"); DBUG_PRINT("info", ("%s", thd->proc_info)); tmp_error= -1; if (curr_join != this) @@ -1686,7 +1698,7 @@ JOIN::exec() curr_join->join_free(); /* Free quick selects */ if (curr_join->select_distinct && ! curr_join->group_list) { - thd->proc_info="Removing duplicates"; + THD_PROC_INFO(thd, "Removing duplicates"); if (curr_join->tmp_having) curr_join->tmp_having->update_used_tables(); if (remove_duplicates(curr_join, curr_tmp_table, @@ -1747,7 +1759,7 @@ JOIN::exec() if (curr_join->group_list || curr_join->order) { DBUG_PRINT("info",("Sorting for send_fields")); - thd->proc_info="Sorting result"; + THD_PROC_INFO(thd, "Sorting result"); /* If we have already done the group, add HAVING to sorted table */ if (curr_join->tmp_having && ! curr_join->group_list && ! curr_join->sort_and_group) @@ -1871,7 +1883,7 @@ JOIN::exec() } else { - thd->proc_info="Sending data"; + THD_PROC_INFO(thd, "Sending data"); DBUG_PRINT("info", ("%s", thd->proc_info)); result->send_fields((procedure ? curr_join->procedure_fields_list : *curr_fields_list), @@ -2019,7 +2031,7 @@ mysql_select(THD *thd, Item ***rref_pointer_array, { if (!(join= new JOIN(thd, fields, select_options, result))) DBUG_RETURN(TRUE); - thd->proc_info="init"; + THD_PROC_INFO(thd, "init"); thd->used_tables=0; // Updated by setup_fields if (err= join->prepare(rref_pointer_array, tables, wild_num, conds, og_num, order, group, having, proc_param, @@ -2064,8 +2076,9 @@ mysql_select(THD *thd, Item ***rref_pointer_array, err: if (free_join) { - thd->proc_info="end"; + THD_PROC_INFO(thd, "cleaning up"); err|= select_lex->cleanup(); + THD_PROC_INFO(thd, "end"); DBUG_RETURN(err || thd->net.report_error); } DBUG_RETURN(join->error); @@ -9745,7 +9758,7 @@ free_tmp_table(THD *thd, TABLE *entry) DBUG_PRINT("enter",("table: %s",entry->alias)); save_proc_info=thd->proc_info; - thd->proc_info="removing tmp table"; + THD_PROC_INFO(thd, "removing tmp table"); if (entry->file) { @@ -9773,7 +9786,7 @@ free_tmp_table(THD *thd, TABLE *entry) bitmap_clear_bit(&temp_pool, entry->temp_pool_slot); free_root(&own_root, MYF(0)); /* the table is allocated in its own root */ - thd->proc_info=save_proc_info; + THD_PROC_INFO(thd, save_proc_info); DBUG_VOID_RETURN; } @@ -9803,7 +9816,7 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param, DBUG_RETURN(1); // End of memory save_proc_info=thd->proc_info; - thd->proc_info="converting HEAP to MyISAM"; + THD_PROC_INFO(thd, "converting HEAP to MyISAM"); if (create_myisam_tmp_table(&new_table,param, thd->lex->select_lex.options | thd->options)) @@ -9856,8 +9869,8 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param, table->s= &table->share_not_to_be_used; table->file->change_table_ptr(table); if (save_proc_info) - thd->proc_info= (!strcmp(save_proc_info,"Copying to tmp table") ? - "Copying to tmp table on disk" : save_proc_info); + THD_PROC_INFO(thd, (!strcmp(save_proc_info,"Copying to tmp table") ? + "Copying to tmp table on disk" : save_proc_info)); DBUG_RETURN(0); err: @@ -9869,7 +9882,7 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param, new_table.file->delete_table(new_table.s->table_name); delete new_table.file; err2: - thd->proc_info=save_proc_info; + THD_PROC_INFO(thd, save_proc_info); DBUG_RETURN(1); } |