3216 Jorgen Loland 2010-09-28
WL#5581: "Add --opt-trace-protocol to MTR"
Add a new opt-trace-protocol to mtr so that existing
regression test suites can be used to test optimizer tracing.
The opt-trace-protocol does this:
1) Enables optimizer tracing
2) Prints the optimizer trace for every statement
eligible for tracing
The statements eligible for tracing are:
[EXPLAIN [EXTENDED]] SELECT
INSERT
DELETE
UPDATE
@ client/mysqltest.cc
Added optimizer trace protocol
@ mysql-test/mysql-test-run.pl
Added optimizer trace protocol
modified:
client/mysqltest.cc
mysql-test/mysql-test-run.pl
3215 Guilhem Bichot 2010-09-27 [merge]
merge of latest next-mr-opt-backporting
added:
include/mysql/service_thd_wait.h
include/mysql/service_thread_scheduler.h
libservices/my_thread_scheduler_service.c
libservices/thd_wait_service.c
mysql-test/include/ctype_filesort2.inc
mysql-test/include/have_binlog_rows_query.inc
mysql-test/include/not_blackhole.inc
mysql-test/include/rpl_assert.inc
mysql-test/r/have_binlog_rows_query.require
mysql-test/r/partition_not_blackhole.result
mysql-test/std_data/parts/t1_blackhole.frm
mysql-test/std_data/parts/t1_blackhole.par
mysql-test/suite/perfschema/r/checksum.result
mysql-test/suite/perfschema/t/checksum.test
mysql-test/suite/rpl/r/rpl_row_ignorable_event.result
mysql-test/suite/rpl/t/rpl_row_ignorable_event-master.opt
mysql-test/suite/rpl/t/rpl_row_ignorable_event-slave.opt
mysql-test/suite/rpl/t/rpl_row_ignorable_event.test
mysql-test/suite/sys_vars/r/binlog_rows_query_log_events_basic.result
mysql-test/suite/sys_vars/t/binlog_rows_query_log_events_basic.test
mysql-test/t/partition_not_blackhole-master.opt
mysql-test/t/partition_not_blackhole.test
sql/sql_callback.h
modified:
client/mysqlbinlog.cc
client/mysqldump.c
client/mysqltest.cc
cmake/dtrace.cmake
dbug/dbug.c
include/Makefile.am
include/m_ctype.h
include/mysql/plugin.h
include/mysql/plugin_audit.h.pp
include/mysql/plugin_ftparser.h.pp
include/mysql/service_my_snprintf.h
include/mysql/services.h
include/service_versions.h
include/thr_lock.h
include/violite.h
libmysqld/Makefile.am
libmysqld/lib_sql.cc
libservices/CMakeLists.txt
libservices/HOWTO
libservices/Makefile.am
mysql-test/CMakeLists.txt
mysql-test/collections/default.experimental
mysql-test/extra/binlog_tests/binlog_insert_delayed.test
mysql-test/extra/rpl_tests/create_recursive_construct.inc
mysql-test/extra/rpl_tests/delayed_slave_wait_on_query.inc
mysql-test/extra/rpl_tests/rpl_binlog_max_cache_size.test
mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test
mysql-test/include/default_mysqld.cnf
mysql-test/include/mtr_warnings.sql
mysql-test/include/range.inc
mysql-test/include/show_binlog_events2.inc
mysql-test/include/subquery_mat.inc
mysql-test/include/subquery_sj.inc
mysql-test/include/wait_for_slave_param.inc
mysql-test/r/alter_table.result
mysql-test/r/archive.result
mysql-test/r/bootstrap.result
mysql-test/r/create.result
mysql-test/r/csv.result
mysql-test/r/ctype_errors.result
mysql-test/r/ctype_tis620.result
mysql-test/r/ctype_ujis.result
mysql-test/r/ctype_utf16.result
mysql-test/r/ctype_utf32.result
mysql-test/r/ctype_utf8.result
mysql-test/r/ctype_utf8mb4.result
mysql-test/r/ctype_utf8mb4_heap.result
mysql-test/r/ctype_utf8mb4_innodb.result
mysql-test/r/ctype_utf8mb4_myisam.result
mysql-test/r/delete.result
mysql-test/r/drop.result
mysql-test/r/error_simulation.result
mysql-test/r/explain.result
mysql-test/r/func_gconcat.result
mysql-test/r/func_group.result
mysql-test/r/func_misc.result
mysql-test/r/func_time.result
mysql-test/r/gis-rtree.result
mysql-test/r/grant.result
mysql-test/r/handler_innodb.result
mysql-test/r/handler_myisam.result
mysql-test/r/key.result
mysql-test/r/log_tables.result
mysql-test/r/mdl_sync.result
mysql-test/r/myisam-system.result
mysql-test/r/myisam.result
mysql-test/r/mysqld--help-notwin.result
mysql-test/r/mysqld--help-win.result
mysql-test/r/mysqldump.result
mysql-test/r/optimizer_trace_no_prot.result
mysql-test/r/optimizer_trace_ps_prot.result
mysql-test/r/parser.result
mysql-test/r/partition.result
mysql-test/r/partition_disabled.result
mysql-test/r/partition_error.result
mysql-test/r/profiling.result
mysql-test/r/ps.result
mysql-test/r/ps_1general.result
mysql-test/r/ps_ddl1.result
mysql-test/r/range_all.result
mysql-test/r/range_icp.result
mysql-test/r/range_icp_mrr.result
mysql-test/r/range_mrr.result
mysql-test/r/range_none.result
mysql-test/r/read_only.result
mysql-test/r/rename.result
mysql-test/r/select_all.result
mysql-test/r/select_all_jcl6.result
mysql-test/r/select_icp_mrr.result
mysql-test/r/select_icp_mrr_jcl6.result
mysql-test/r/select_none.result
mysql-test/r/select_none_jcl6.result
mysql-test/r/signal.result
mysql-test/r/signal_demo2.result
mysql-test/r/signal_demo3.result
mysql-test/r/sp-dynamic.result
mysql-test/r/sp-error.result
mysql-test/r/sp-prelocking.result
mysql-test/r/sp-vars.result
mysql-test/r/sp.result
mysql-test/r/strict.result
mysql-test/r/subquery_mat.result
mysql-test/r/subquery_mat_all.result
mysql-test/r/subquery_mat_none.result
mysql-test/r/subquery_sj_all.result
mysql-test/r/subquery_sj_all_jcl6.result
mysql-test/r/subquery_sj_all_jcl7.result
mysql-test/r/subquery_sj_dupsweed.result
mysql-test/r/subquery_sj_dupsweed_jcl6.result
mysql-test/r/subquery_sj_dupsweed_jcl7.result
mysql-test/r/subquery_sj_firstmatch.result
mysql-test/r/subquery_sj_firstmatch_jcl6.result
mysql-test/r/subquery_sj_firstmatch_jcl7.result
mysql-test/r/subquery_sj_loosescan.result
mysql-test/r/subquery_sj_loosescan_jcl6.result
mysql-test/r/subquery_sj_loosescan_jcl7.result
mysql-test/r/subquery_sj_mat.result
mysql-test/r/subquery_sj_mat_jcl6.result
mysql-test/r/subquery_sj_mat_jcl7.result
mysql-test/r/subquery_sj_mat_nosj.result
mysql-test/r/subquery_sj_none.result
mysql-test/r/subquery_sj_none_jcl6.result
mysql-test/r/subquery_sj_none_jcl7.result
mysql-test/r/subselect_innodb.result
mysql-test/r/temp_table.result
mysql-test/r/truncate_coverage.result
mysql-test/r/type_datetime.result
mysql-test/r/type_newdecimal.result
mysql-test/r/variables.result
mysql-test/r/view.result
mysql-test/r/warnings.result
mysql-test/suite/binlog/r/binlog_row_binlog.result
mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result
mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result
mysql-test/suite/binlog/r/binlog_stm_binlog.result
mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result
mysql-test/suite/binlog/r/binlog_unsafe.result
mysql-test/suite/binlog/t/binlog_incident.test
mysql-test/suite/binlog/t/binlog_unsafe.test
mysql-test/suite/federated/federated.result
mysql-test/suite/federated/federated_server.result
mysql-test/suite/funcs_1/r/innodb_trig_0102.result
mysql-test/suite/funcs_1/r/innodb_views.result
mysql-test/suite/funcs_1/r/memory_trig_0102.result
mysql-test/suite/funcs_1/r/memory_views.result
mysql-test/suite/funcs_1/r/myisam_trig_0102.result
mysql-test/suite/funcs_1/r/myisam_views.result
mysql-test/suite/funcs_1/r/storedproc.result
mysql-test/suite/innodb/r/innodb-autoinc.result
mysql-test/suite/innodb/r/innodb.result
mysql-test/suite/innodb/r/innodb_mysql.result
mysql-test/suite/innodb/t/innodb_mysql.test
mysql-test/suite/parts/r/part_ctype_utf32.result
mysql-test/suite/perfschema/include/upgrade_check.inc
mysql-test/suite/perfschema/r/privilege_table_io.result
mysql-test/suite/perfschema/r/server_init.result
mysql-test/suite/perfschema/r/start_server_no_cond_class.result
mysql-test/suite/perfschema/r/start_server_no_cond_inst.result
mysql-test/suite/perfschema/r/start_server_no_file_class.result
mysql-test/suite/perfschema/r/start_server_no_file_inst.result
mysql-test/suite/perfschema/r/start_server_no_mutex_class.result
mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result
mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result
mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result
mysql-test/suite/perfschema/r/start_server_no_table_hdl.result
mysql-test/suite/perfschema/r/start_server_no_table_inst.result
mysql-test/suite/perfschema/r/start_server_no_thread_class.result
mysql-test/suite/perfschema/r/start_server_no_thread_inst.result
mysql-test/suite/perfschema/r/start_server_off.result
mysql-test/suite/perfschema/r/start_server_on.result
mysql-test/suite/perfschema/t/privilege_table_io.test
mysql-test/suite/perfschema/t/server_init.test
mysql-test/suite/rpl/r/rpl000013.result
mysql-test/suite/rpl/r/rpl_delayed_slave.result
mysql-test/suite/rpl/r/rpl_drop.result
mysql-test/suite/rpl/r/rpl_drop_temp.result
mysql-test/suite/rpl/r/rpl_drop_view.result
mysql-test/suite/rpl/r/rpl_extraCol_innodb.result
mysql-test/suite/rpl/r/rpl_extraCol_myisam.result
mysql-test/suite/rpl/r/rpl_flush_logs.result
mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result
mysql-test/suite/rpl/r/rpl_mixed_drop_create_temp_table.result
mysql-test/suite/rpl/r/rpl_mixed_implicit_commit_binlog.result
mysql-test/suite/rpl/r/rpl_multi_update3.result
mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result
mysql-test/suite/rpl/r/rpl_row_colSize.result
mysql-test/suite/rpl/r/rpl_row_conflicts.result
mysql-test/suite/rpl/r/rpl_row_drop_create_temp_table.result
mysql-test/suite/rpl/r/rpl_row_implicit_commit_binlog.result
mysql-test/suite/rpl/r/rpl_session_var.result
mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result
mysql-test/suite/rpl/r/rpl_stm_drop_create_temp_table.result
mysql-test/suite/rpl/r/rpl_stm_implicit_commit_binlog.result
mysql-test/suite/rpl/r/rpl_stm_no_op.result
mysql-test/suite/rpl/r/rpl_stm_until.result
mysql-test/suite/rpl/r/rpl_temp_table.result
mysql-test/suite/rpl/t/disabled.def
mysql-test/suite/rpl/t/rpl_delayed_slave.test
mysql-test/suite/rpl/t/rpl_drop.test
mysql-test/suite/rpl/t/rpl_flush_logs.test
mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size-master.opt
mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size-master.opt
mysql-test/suite/rpl/t/rpl_row_flsh_tbls.test
mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size-master.opt
mysql-test/suite/rpl/t/rpl_stm_flsh_tbls.test
mysql-test/suite/rpl_ndb/r/rpl_ndb_multi.result
mysql-test/suite/sys_vars/r/max_binlog_cache_size_basic.result
mysql-test/suite/sys_vars/r/slow_query_log_func.result
mysql-test/suite/sys_vars/r/sql_notes_func.result
mysql-test/suite/sys_vars/t/max_binlog_cache_size_basic.test
mysql-test/t/ctype_utf16.test
mysql-test/t/ctype_utf32.test
mysql-test/t/ctype_utf8mb4.test
mysql-test/t/delete.test
mysql-test/t/disabled.def
mysql-test/t/drop.test
mysql-test/t/explain.test
mysql-test/t/func_gconcat.test
mysql-test/t/func_group.test
mysql-test/t/func_misc.test
mysql-test/t/func_time.test
mysql-test/t/strict.test
mysql-test/t/subquery_sj_firstmatch.test
mysql-test/t/subselect_innodb.test
mysql-test/t/type_datetime.test
mysql-test/t/variables.test
mysql-test/valgrind.supp
mysys/my_gethwaddr.c
mysys/my_getopt.c
mysys/my_init.c
mysys/my_sync.c
mysys/thr_lock.c
packaging/WiX/mysql_server.wxs.in
sql/CMakeLists.txt
sql/authors.h
sql/binlog.cc
sql/binlog.h
sql/derror.cc
sql/ha_partition.cc
sql/handler.cc
sql/item.cc
sql/item.h
sql/item_func.cc
sql/item_subselect.cc
sql/item_subselect.h
sql/item_sum.cc
sql/item_sum.h
sql/item_timefunc.cc
sql/item_timefunc.h
sql/log.cc
sql/log_event.cc
sql/log_event.h
sql/mysqld.cc
sql/mysqld.h
sql/opt_range.cc
sql/rpl_injector.cc
sql/rpl_master.cc
sql/rpl_rli.cc
sql/rpl_rli.h
sql/rpl_slave.cc
sql/scheduler.cc
sql/scheduler.h
sql/set_var.cc
sql/set_var.h
sql/share/errmsg-utf8.txt
sql/sql_admin.cc
sql/sql_base.cc
sql/sql_binlog.cc
sql/sql_class.cc
sql/sql_class.h
sql/sql_connect.cc
sql/sql_connect.h
sql/sql_insert.cc
sql/sql_lex.h
sql/sql_plugin.cc
sql/sql_plugin_services.h
sql/sql_select.cc
sql/sql_select.h
sql/sql_show.cc
sql/sql_table.cc
sql/sql_view.cc
sql/sql_yacc.yy
sql/sys_vars.cc
sql/sys_vars.h
sql/table.h
storage/innobase/buf/buf0flu.c
storage/innobase/buf/buf0rea.c
storage/innobase/srv/srv0srv.c
storage/myisam/mi_rprev.c
storage/perfschema/ha_perfschema.cc
storage/perfschema/pfs_engine_table.cc
storage/perfschema/table_events_waits.cc
storage/perfschema/table_events_waits.h
strings/ctype-ucs2.c
strings/ctype-utf8.c
strings/my_vsnprintf.c
unittest/mysys/my_vsnprintf-t.c
vio/vio.c
vio/vio_priv.h
vio/viosocket.c
vio/viossl.c
=== modified file 'client/mysqltest.cc'
--- a/client/mysqltest.cc 2010-09-08 07:10:51 +0000
+++ b/client/mysqltest.cc 2010-09-28 08:58:16 +0000
@@ -87,7 +87,7 @@ enum {
OPT_PS_PROTOCOL=OPT_MAX_CLIENT_OPTION, OPT_SP_PROTOCOL,
OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL, OPT_MAX_CONNECT_RETRIES,
OPT_MAX_CONNECTIONS, OPT_MARK_PROGRESS, OPT_LOG_DIR,
- OPT_TAIL_LINES, OPT_RESULT_FORMAT_VERSION
+ OPT_TAIL_LINES, OPT_RESULT_FORMAT_VERSION, OPT_TRACE_PROTOCOL
};
static int record= 0, opt_sleep= -1;
@@ -107,6 +107,7 @@ static my_bool opt_mark_progress= 0;
static my_bool ps_protocol= 0, ps_protocol_enabled= 0;
static my_bool sp_protocol= 0, sp_protocol_enabled= 0;
static my_bool view_protocol= 0, view_protocol_enabled= 0;
+static my_bool opt_trace_protocol= 0, opt_trace_protocol_enabled= 0;
static my_bool cursor_protocol= 0, cursor_protocol_enabled= 0;
static my_bool parsing_disabled= 0;
static my_bool display_result_vertically= FALSE, display_result_lower= FALSE,
@@ -194,6 +195,8 @@ static ulong connection_retry_sleep= 100
static my_regex_t ps_re; /* the query can be run using PS protocol */
static my_regex_t sp_re; /* the query can be run as a SP */
static my_regex_t view_re; /* the query can be run as a view*/
+/* the query can be traced with optimizer trace*/
+static my_regex_t opt_trace_re;
static void init_re(void);
static int match_re(my_regex_t *, char *);
@@ -6158,6 +6161,10 @@ static struct my_option my_long_options[
{"view-protocol", OPT_VIEW_PROTOCOL, "Use views for select.",
&view_protocol, &view_protocol, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
+ {"opt-trace-protocol", OPT_TRACE_PROTOCOL,
+ "Trace DML statements with optimizer trace",
+ &opt_trace_protocol, &opt_trace_protocol, 0,
+ GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"connect_timeout", OPT_CONNECT_TIMEOUT,
"Number of seconds before connection timeout.",
&opt_connect_timeout, &opt_connect_timeout, 0, GET_UINT, REQUIRED_ARG,
@@ -7630,6 +7637,36 @@ void run_query(struct st_connection *cn,
DBUG_VOID_RETURN;
}
+/**
+ Display the optimizer trace produced by the last executed statement.
+ */
+void display_opt_trace(struct st_connection *cn,
+ struct st_command *command,
+ int flags)
+{
+ if (!disable_query_log &&
+ opt_trace_protocol_enabled &&
+ !command->expected_errors.count &&
+ match_re(&opt_trace_re, command->query))
+ {
+ st_command save_command= *command;
+ DYNAMIC_STRING query_str;
+ init_dynamic_string(&query_str,
+ "SELECT trace FROM information_schema.optimizer_trace "
+ "/* injected by --opt-trace-mode */",
+ 128, 128);
+
+ command->query= query_str.str;
+ command->query_len= query_str.length;
+ command->end= strend(command->query);
+
+ run_query(cn, command, flags);
+
+ dynstr_free(&query_str);
+ *command= save_command;
+ }
+}
+
/****************************************************************************/
/*
Functions to detect different SQL statements
@@ -7689,9 +7726,18 @@ void init_re(void)
"^("
"[[:space:]]*SELECT[[:space:]])";
+ const char *opt_trace_re_str =
+ "^("
+ "[[:space:]]*INSERT[[:space:]]|"
+ "[[:space:]]*UPDATE[[:space:]]|"
+ "[[:space:]]*DELETE[[:space:]]|"
+ "[[:space:]]*EXPLAIN[[:space:]]|"
+ "[[:space:]]*SELECT[[:space:]])";
+
init_re_comp(&ps_re, ps_re_str);
init_re_comp(&sp_re, sp_re_str);
init_re_comp(&view_re, view_re_str);
+ init_re_comp(&opt_trace_re, opt_trace_re_str);
}
@@ -8028,6 +8074,7 @@ int main(int argc, char **argv)
var_set_int("$PS_PROTOCOL", ps_protocol);
var_set_int("$SP_PROTOCOL", sp_protocol);
var_set_int("$VIEW_PROTOCOL", view_protocol);
+ var_set_int("$OPT_TRACE_PROTOCOL", opt_trace_protocol);
var_set_int("$CURSOR_PROTOCOL", cursor_protocol);
DBUG_PRINT("info",("result_file: '%s'",
@@ -8050,6 +8097,7 @@ int main(int argc, char **argv)
ps_protocol_enabled= ps_protocol;
sp_protocol_enabled= sp_protocol;
view_protocol_enabled= view_protocol;
+ opt_trace_protocol_enabled= opt_trace_protocol;
cursor_protocol_enabled= cursor_protocol;
/* Cursor protcol implies ps protocol */
if (cursor_protocol_enabled)
@@ -8282,6 +8330,7 @@ int main(int argc, char **argv)
save_file[0]= 0;
}
run_query(cur_con, command, flags);
+ display_opt_trace(cur_con, command, flags);
command_executed++;
command->last_argument= command->end;
=== modified file 'mysql-test/mysql-test-run.pl'
--- a/mysql-test/mysql-test-run.pl 2010-09-03 20:49:28 +0000
+++ b/mysql-test/mysql-test-run.pl 2010-09-28 08:58:16 +0000
@@ -171,6 +171,7 @@ my $opt_ps_protocol;
my $opt_sp_protocol;
my $opt_cursor_protocol;
my $opt_view_protocol;
+my $opt_trace_protocol;
our $opt_debug;
our @opt_cases; # The test cases names in argv
@@ -843,6 +844,7 @@ sub command_line_setup {
'ps-protocol' => \$opt_ps_protocol,
'sp-protocol' => \$opt_sp_protocol,
'view-protocol' => \$opt_view_protocol,
+ 'opt-trace-protocol' => \$opt_trace_protocol,
'cursor-protocol' => \$opt_cursor_protocol,
'ssl|with-openssl' => \$opt_ssl,
'skip-ssl' => \$opt_skip_ssl,
@@ -1441,6 +1443,11 @@ sub command_line_setup {
unless @valgrind_args;
}
+ if ( $opt_trace_protocol )
+ {
+ push(@opt_extra_mysqld_opt, "--optimizer_trace=enabled=on,one_line=off");
+ }
+
if ( $opt_valgrind )
{
# Set valgrind_options to default unless already defined
@@ -5029,6 +5036,11 @@ sub start_mysqltest ($) {
mtr_add_arg($args, "--view-protocol");
}
+ if ( $opt_trace_protocol )
+ {
+ mtr_add_arg($args, "--opt-trace-protocol");
+ }
+
if ( $opt_cursor_protocol )
{
mtr_add_arg($args, "--cursor-protocol");
@@ -5450,6 +5462,7 @@ Options to control what engine/variation
cursor-protocol Use the cursor protocol between client and server
(implies --ps-protocol)
view-protocol Create a view to execute all non updating queries
+ opt-trace-protocol Print optimizer trace
sp-protocol Create a stored procedure to execute all queries
compress Use the compressed protocol between client and server
ssl Use ssl protocol between client and server
Attachment: [text/bzr-bundle] bzr/jorgen.loland@oracle.com-20100928085816-exj41towenor8rux.bundle
| Thread |
|---|
| • bzr push into mysql-next-mr-bugfixing branch (jorgen.loland:3215 to 3216)WL#5581 | Jorgen Loland | 28 Sep |