diff options
author | Sergei Petrunia <psergey@askmonty.org> | 2021-12-19 17:19:02 +0300 |
---|---|---|
committer | Sergei Petrunia <psergey@askmonty.org> | 2021-12-19 17:19:02 +0300 |
commit | 32692140e1a4f9aa87359f3ef6efe4a615119e71 (patch) | |
tree | 3db2fc477fa84e4b39ad67f63ecad57235b39539 /sql/sql_parse.cc | |
parent | 946dafb260fc5683e1ec1410a801f2235ba2313a (diff) | |
download | mariadb-git-bb-10.6-mdev27306.tar.gz |
MDEV-27306: SET STATEMENT optimizer_trace=1 Doesn't save the tracebb-10.6-mdev27306
In mysql_execute_command(), move optimizer trace initialization to be
after run_set_statement_if_requested() call.
Unfortunately, mysql_execute_command() code uses "goto error" a lot, and
this means optimizer trace code cannot use RAII objects. Work this around
by:
- Make Opt_trace_start a non-RAII object, add init() method.
- Move the code that writes the top-level object and array into
Opt_trace_start::init().
Diffstat (limited to 'sql/sql_parse.cc')
-rw-r--r-- | sql/sql_parse.cc | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 2a48c8fb1ce..0886fc85151 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3644,12 +3644,7 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt) #ifdef HAVE_REPLICATION } /* endif unlikely slave */ #endif - Opt_trace_start ots(thd, all_tables, lex->sql_command, &lex->var_list, - thd->query(), thd->query_length(), - thd->variables.character_set_client); - - Json_writer_object trace_command(thd); - Json_writer_array trace_command_steps(thd, "steps"); + Opt_trace_start ots(thd); /* store old value of binlog format */ enum_binlog_format orig_binlog_format,orig_current_stmt_binlog_format; @@ -3715,6 +3710,10 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt) if (run_set_statement_if_requested(thd, lex)) goto error; + /* After SET STATEMENT is done, we can initialize the Optimizer Trace: */ + ots.init(thd, all_tables, lex->sql_command, &lex->var_list, thd->query(), + thd->query_length(), thd->variables.character_set_client); + if (thd->lex->mi.connection_name.str == NULL) thd->lex->mi.connection_name= thd->variables.default_master_connection; |