#At file:///export/home/jl208045/mysql/wl4800/mysql-next-mr-opt-backporting-wl4800-patchcleanup/ based on revid:jorgen.loland@stripped
3232 Jorgen Loland 2010-11-11 [merge]
local merge
modified:
WL4800_TODO.txt
mysql-test/include/optimizer_trace.inc
mysql-test/r/mysqld--help-notwin.result
mysql-test/r/mysqld--help-win.result
mysql-test/r/optimizer_trace_ps_prot.result
sql/opt_trace.cc
sql/opt_trace.h
sql/sql_parse.cc
sql/sql_select.cc
sql/sql_select.h
sql/sys_vars.cc
=== modified file 'WL4800_TODO.txt'
--- a/WL4800_TODO.txt 2010-10-15 12:46:54 +0000
+++ b/WL4800_TODO.txt 2010-11-05 10:20:12 +0000
@@ -29,7 +29,6 @@ changes? any little change? maybe).
Coding style:
Make sure long code lines are wrapped.
-Change true/false to TRUE/FALSE
Sort out any charset-related problems (security-wise, for example: can
I find a proper combination of client/server charsets so that creating
@@ -38,5 +37,7 @@ opt_trace.cc.
Review comments left:
- in doc, mention DUMPFILE instead of OUTFILE
+- in changelog, mention /*select#*/; in doc, mention use of this (to
+decrypt what "id" is about in EXPLAIN).
- more checks for non-unique keys?
=== modified file 'mysql-test/include/optimizer_trace.inc'
--- a/mysql-test/include/optimizer_trace.inc 2010-10-22 13:28:18 +0000
+++ b/mysql-test/include/optimizer_trace.inc 2010-11-11 13:25:53 +0000
@@ -481,7 +481,7 @@ select * from information_schema.OPTIMIZ
drop view v1;
# I_S tables
-select * from information_schema.SESSION_VARIABLES where
+select * from information_schema.session_variables where
VARIABLE_NAME="optimizer_trace";
select * from information_schema.OPTIMIZER_TRACE;
@@ -496,6 +496,11 @@ select 1 union select 2;
--cat_file $file
--remove_file $file
+# Test for crashing bug
+--error ER_WRONG_VALUE_FOR_VAR
+set optimizer_switch='default,index_merge=on,index_merge=off,default';
+select @@optimizer_switch;
+
drop table t1,t2;
DROP TABLE t5,t6;
set optimizer_trace=default;
=== modified file 'mysql-test/r/mysqld--help-notwin.result'
--- a/mysql-test/r/mysqld--help-notwin.result 2010-10-09 15:04:30 +0000
+++ b/mysql-test/r/mysqld--help-notwin.result 2010-11-05 10:20:12 +0000
@@ -423,8 +423,7 @@ The following options may be given as th
--optimizer-trace-limit=#
Maximum number of shown optimizer traces
--optimizer-trace-max-mem-size=#
- maximum allowed cumulated size of remembered optimizer
- traces
+ Maximum allowed cumulated size of stored optimizer traces
--optimizer-trace-offset=#
Offset of first optimizer trace to show; see manual
--performance-schema
=== modified file 'mysql-test/r/mysqld--help-win.result'
--- a/mysql-test/r/mysqld--help-win.result 2010-10-22 09:05:11 +0000
+++ b/mysql-test/r/mysqld--help-win.result 2010-11-05 10:20:12 +0000
@@ -423,7 +423,7 @@ The following options may be given as th
--optimizer-trace-limit=#
Maximum number of shown optimizer traces
--optimizer-trace-max-mem-size=#
- maximum allowed cumulated size of remembered optimizer
+ Maximum allowed cumulated size of stored optimizer
traces
--optimizer-trace-offset=#
Offset of first optimizer trace to show; see manual
=== modified file 'mysql-test/r/optimizer_trace_ps_prot.result'
--- a/mysql-test/r/optimizer_trace_ps_prot.result 2010-10-22 09:05:11 +0000
+++ b/mysql-test/r/optimizer_trace_ps_prot.result 2010-11-06 09:56:51 +0000
@@ -5553,17 +5553,17 @@ explain select * from v1 where id="b" {
] /* steps */
} 0 0
drop view v1;
-select * from information_schema.SESSION_VARIABLES where
+select * from information_schema.session_variables where
VARIABLE_NAME="optimizer_trace";
VARIABLE_NAME VARIABLE_VALUE
OPTIMIZER_TRACE enabled=on,end_marker=on,one_line=off
select * from information_schema.OPTIMIZER_TRACE;
QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE OS_MALLOC_ERROR
-select * from information_schema.SESSION_VARIABLES where
+select * from information_schema.session_variables where
VARIABLE_NAME="optimizer_trace" {
"steps": [
{
- "expanded_query": "/* select#1 */ select `information_schema`.`SESSION_VARIABLES`.`VARIABLE_NAME` AS `VARIABLE_NAME`,`information_schema`.`SESSION_VARIABLES`.`VARIABLE_VALUE` AS `VARIABLE_VALUE` from `information_schema`.`SESSION_VARIABLES` where (`VARIABLE_NAME` = 'optimizer_trace')"
+ "expanded_query": "/* select#1 */ select `information_schema`.`session_variables`.`VARIABLE_NAME` AS `VARIABLE_NAME`,`information_schema`.`session_variables`.`VARIABLE_VALUE` AS `VARIABLE_VALUE` from `information_schema`.`session_variables` where (`VARIABLE_NAME` = 'optimizer_trace')"
},
{
"join_preparation": {
@@ -5579,10 +5579,10 @@ VARIABLE_NAME="optimizer_trace" {
{
"condition_processing": {
"condition": "WHERE",
- "original_condition": "(`information_schema`.`SESSION_VARIABLES`.`VARIABLE_NAME` = 'optimizer_trace')",
- "after_equality_propagation": "(`information_schema`.`SESSION_VARIABLES`.`VARIABLE_NAME` = 'optimizer_trace')",
- "after_constant_propagation": "(`information_schema`.`SESSION_VARIABLES`.`VARIABLE_NAME` = 'optimizer_trace')",
- "after_trivial_conditions_removal": "(`information_schema`.`SESSION_VARIABLES`.`VARIABLE_NAME` = 'optimizer_trace')"
+ "original_condition": "(`information_schema`.`session_variables`.`VARIABLE_NAME` = 'optimizer_trace')",
+ "after_equality_propagation": "(`information_schema`.`session_variables`.`VARIABLE_NAME` = 'optimizer_trace')",
+ "after_constant_propagation": "(`information_schema`.`session_variables`.`VARIABLE_NAME` = 'optimizer_trace')",
+ "after_trivial_conditions_removal": "(`information_schema`.`session_variables`.`VARIABLE_NAME` = 'optimizer_trace')"
} /* condition_processing */
},
{
@@ -5594,7 +5594,7 @@ VARIABLE_NAME="optimizer_trace" {
] /* constant_tables */,
"records_estimation": [
{
- "table": "SESSION_VARIABLES",
+ "table": "session_variables",
"table_scan": {
"records": 2,
"cost": 10
@@ -5605,7 +5605,7 @@ VARIABLE_NAME="optimizer_trace" {
{
"considered_execution_plans": [
{
- "table": "SESSION_VARIABLES",
+ "table": "session_variables",
"best_access_path": {
"considered_access_paths": [
{
@@ -5624,11 +5624,11 @@ VARIABLE_NAME="optimizer_trace" {
},
{
"attaching_conditions_to_tables": {
- "original_condition": "(`information_schema`.`SESSION_VARIABLES`.`VARIABLE_NAME` = 'optimizer_trace')",
+ "original_condition": "(`information_schema`.`session_variables`.`VARIABLE_NAME` = 'optimizer_trace')",
"attached_conditions": [
{
- "table": "SESSION_VARIABLES",
- "attached": "(`information_schema`.`SESSION_VARIABLES`.`VARIABLE_NAME` = 'optimizer_trace')"
+ "table": "session_variables",
+ "attached": "(`information_schema`.`session_variables`.`VARIABLE_NAME` = 'optimizer_trace')"
}
] /* attached_conditions */
} /* attaching_conditions_to_tables */
@@ -5736,6 +5736,11 @@ select TRACE into dumpfile 'MYSQLTEST_VA
}
}
]
-}drop table t1,t2;
+}set optimizer_switch='default,index_merge=on,index_merge=off,default';
+ERROR 42000: Variable 'optimizer_switch' can't be set to the value of 'index_merge=off,default'
+select @@optimizer_switch;
+@@optimizer_switch
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,materialization=on,semijoin=on,loosescan=on,firstmatch=on,mrr=on,mrr_cost_based=off,index_condition_pushdown=on
+drop table t1,t2;
DROP TABLE t5,t6;
set optimizer_trace=default;
=== modified file 'sql/opt_trace.cc'
--- a/sql/opt_trace.cc 2010-10-22 08:31:43 +0000
+++ b/sql/opt_trace.cc 2010-11-11 13:25:53 +0000
@@ -203,6 +203,7 @@ void Opt_trace_struct::do_destruct(void)
}
}
stmt->support_I_S= save_stmt_support_I_S;
+ started= false;
}
@@ -828,7 +829,9 @@ void Opt_trace_stmt::next_line(void)
return;
buffer.append('\n');
char spaces[]= " ";
+ // 2 spaces per nesting level
const int nb= depth * 2, spaces_len= sizeof(spaces) - 1;
+ // add spaces in chunks of spaces_len, better than many append(' ')
for (int i= 0; i < nb/spaces_len; i++)
buffer.append(spaces, spaces_len);
buffer.append(spaces, (nb % spaces_len));
=== modified file 'sql/opt_trace.h'
--- a/sql/opt_trace.h 2010-10-22 08:31:43 +0000
+++ b/sql/opt_trace.h 2010-11-11 13:25:53 +0000
@@ -951,6 +951,12 @@ public:
return *this;
return do_add(NULL, value);
}
+ /**
+ The exception to RAII: this function is an explicit way to end a
+ structure before it goes out of scope. Don't use it unless RAII mandates
+ a new scope which mandates re-indenting lots of code lines.
+ */
+ void end(void) { if (unlikely(started)) do_destruct(); }
private:
/** Full initialization. @sa Opt_trace_struct::Opt_trace_struct */
@@ -1298,6 +1304,7 @@ int make_optimizer_trace_table_for_show(
/* all empty */
+/** Empty implementation used when optimizer trace is not compiled in */
class Opt_trace_context
{
public:
@@ -1305,6 +1312,7 @@ public:
enum feature_value { MISC= 1, GREEDY_SEARCH= 2 };
};
+/** Empty implementation used when optimizer trace is not compiled in */
class Opt_trace_object
{
public:
@@ -1328,6 +1336,7 @@ public:
Opt_trace_object& add(const char *key, double value) { return *this; }
};
+/** Empty implementation used when optimizer trace is not compiled in */
class Opt_trace_array
{
public:
@@ -1349,6 +1358,7 @@ public:
Opt_trace_array& add(double value) { return *this; }
};
+/** Empty implementation used when optimizer trace is not compiled in */
class Opt_trace_disable_I_S
{
public:
=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc 2010-10-09 15:04:30 +0000
+++ b/sql/sql_parse.cc 2010-11-06 09:56:51 +0000
@@ -2072,13 +2072,8 @@ mysql_execute_command(THD *thd)
*/
}
- {
- /*
- need to open scope because oto/ota must be destroyed before calling
- opt_trace_end().
- */
- Opt_trace_object oto(thd->opt_trace);
- Opt_trace_array ota(thd->opt_trace, "steps");
+ Opt_trace_object trace_command(thd->opt_trace);
+ Opt_trace_array trace_command_steps(thd->opt_trace, "steps");
DBUG_ASSERT(thd->transaction.stmt.modified_non_trans_table == FALSE);
@@ -4455,8 +4450,6 @@ create_sp_error:
goto finish;
- } // end of scope for opt_trace structures
-
error:
res= TRUE;
@@ -4530,6 +4523,8 @@ finish:
thd->mdl_context.release_transactional_locks();
}
+ trace_command_steps.end();
+ trace_command.end(); // must be closed before trace is ended below
opt_trace_end(thd, started_optimizer_trace);
DBUG_RETURN(res || thd->is_error());
=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc 2010-10-22 08:31:43 +0000
+++ b/sql/sql_select.cc 2010-11-11 13:25:53 +0000
@@ -1801,8 +1801,11 @@ static int clear_sj_tmp_tables(JOIN *joi
int
JOIN::optimize()
{
+ bool need_distinct;
+ ulonglong select_opts_for_readinfo;
+ uint no_jbuf_after;
+
DBUG_ENTER("JOIN::optimize");
- Opt_trace_context * const trace= thd->opt_trace;
// to prevent double initialization on EXPLAIN
if (optimized)
DBUG_RETURN(0);
@@ -1810,44 +1813,11 @@ JOIN::optimize()
thd_proc_info(thd, "optimizing");
+ Opt_trace_context * const trace= thd->opt_trace;
Opt_trace_object trace_wrapper(trace);
Opt_trace_object trace_optimize(trace, "join_optimization");
opt_trace_add_select_number(&trace_optimize, select_lex->select_number);
-
- int rc= JOIN::optimize_steps();
-
- if (zero_result_cause != NULL)
- {
- Opt_trace_object oto2(trace, "empty_result");
- oto2.add_str("cause", zero_result_cause);
- /*
- Even with zero matching rows, subqueries in the HAVING clause may
- need to be evaluated if there are aggregate functions in the
- query. If we have planned to materialize the subquery, we need to
- set it up properly before prematurely leaving optimize().
- */
- if (setup_subquery_materialization())
- rc= 1;
- else
- error= rc= 0;
- }
-
- DBUG_RETURN(rc);
-}
-
-/**
- All steps of JOIN::optimize()
- @retval 0 ok
- @retval !=0 error
-*/
-int JOIN::optimize_steps()
-{
- DBUG_ENTER("JOIN::optimize_steps");
- Opt_trace_context * const trace= thd->opt_trace;
Opt_trace_array trace_steps(trace, "steps");
- bool need_distinct;
- ulonglong select_opts_for_readinfo;
- uint no_jbuf_after;
/* dump_TABLE_LIST_graph(select_lex, select_lex->leaf_tables); */
if (flatten_subqueries())
@@ -1937,7 +1907,7 @@ int JOIN::optimize_steps()
zero_result_cause= select_lex->having_value == Item::COND_FALSE ?
"Impossible HAVING" : "Impossible WHERE";
tables= 0;
- goto end;
+ goto setup_subq_exit;
}
}
@@ -1987,7 +1957,7 @@ int JOIN::optimize_steps()
DBUG_PRINT("info",("No matching min/max row"));
zero_result_cause= "No matching min/max row";
tables= 0;
- goto end;
+ goto setup_subq_exit;
}
if (res > 1)
{
@@ -2000,7 +1970,7 @@ int JOIN::optimize_steps()
DBUG_PRINT("info",("No matching min/max row"));
zero_result_cause= "No matching min/max row";
tables= 0;
- goto end;
+ goto setup_subq_exit;
}
DBUG_PRINT("info",("Select tables optimized away"));
zero_result_cause= "Select tables optimized away";
@@ -2026,14 +1996,14 @@ int JOIN::optimize_steps()
QT_ORDINARY););
conds= table_independent_conds;
}
- goto end;
+ goto setup_subq_exit;
}
}
if (!tables_list)
{
DBUG_PRINT("info",("No tables"));
error= 0;
- goto end;
+ DBUG_RETURN(0);
}
error= -1; // Error is sent to client
sort_by_table= get_sort_by_table(order, group_list, select_lex->leaf_tables);
@@ -2075,7 +2045,7 @@ int JOIN::optimize_steps()
{
zero_result_cause= "no matching row in const table";
DBUG_PRINT("error",("Error: %s", zero_result_cause));
- goto end;
+ goto setup_subq_exit;
}
if (!(thd->variables.option_bits & OPTION_BIG_SELECTS) &&
best_read > (double) thd->variables.max_join_size &&
@@ -2139,7 +2109,7 @@ int JOIN::optimize_steps()
{
zero_result_cause=
"Impossible WHERE noticed after reading const tables";
- goto end;
+ goto setup_subq_exit;
}
error= -1; /* if goto err */
@@ -2410,7 +2380,7 @@ int JOIN::optimize_steps()
having= new Item_int((longlong) 0,1);
zero_result_cause= "Impossible HAVING noticed after reading const tables";
error= 0;
- goto end;
+ DBUG_RETURN(0);
}
}
@@ -2487,13 +2457,11 @@ int JOIN::optimize_steps()
for (uint i = const_tables; i < tables; i++)
join_tab[i].table->prepare_for_position();
}
- {
- DBUG_EXECUTE("info",
- {
- Opt_trace_disable_I_S otd(trace, true);
- TEST_join(this);
- });
- }
+ DBUG_EXECUTE("info",
+ {
+ Opt_trace_disable_I_S otd(trace, true);
+ TEST_join(this);
+ });
if (const_tables != tables)
{
@@ -2549,7 +2517,7 @@ int JOIN::optimize_steps()
if (select_options & SELECT_DESCRIBE)
{
error= 0;
- goto end;
+ DBUG_RETURN(0);
}
having= 0;
@@ -2691,7 +2659,23 @@ int JOIN::optimize_steps()
}
error= 0;
-end:
+ DBUG_RETURN(0);
+
+setup_subq_exit:
+
+ DBUG_ASSERT(zero_result_cause != NULL);
+ trace_steps.end(); // because all steps are done
+ Opt_trace_object trace_empty_result(trace, "empty_result");
+ trace_empty_result.add_str("cause", zero_result_cause);
+ /*
+ Even with zero matching rows, subqueries in the HAVING clause may
+ need to be evaluated if there are aggregate functions in the
+ query. If we have planned to materialize the subquery, we need to
+ set it up properly before prematurely leaving optimize().
+ */
+ if (setup_subquery_materialization())
+ DBUG_RETURN(1);
+ error= 0;
DBUG_RETURN(0);
}
=== modified file 'sql/sql_select.h'
--- a/sql/sql_select.h 2010-09-27 09:26:39 +0000
+++ b/sql/sql_select.h 2010-11-06 09:56:51 +0000
@@ -1959,7 +1959,6 @@ private:
*/
bool implicit_grouping;
bool make_simple_join(JOIN *join, TABLE *tmp_table);
- int optimize_steps();
};
=== modified file 'sql/sys_vars.cc'
--- a/sql/sys_vars.cc 2010-10-09 15:04:30 +0000
+++ b/sql/sys_vars.cc 2010-11-05 10:20:12 +0000
@@ -1462,7 +1462,7 @@ static Sys_var_long Sys_optimizer_trace_
static Sys_var_ulong Sys_optimizer_trace_max_mem_size(
"optimizer_trace_max_mem_size",
- "maximum allowed cumulated size of remembered optimizer traces",
+ "Maximum allowed cumulated size of stored optimizer traces",
SESSION_VAR(optimizer_trace_max_mem_size), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, ULONG_MAX), DEFAULT(1024*16), BLOCK_SIZE(1));
No bundle (reason: revision is a merge).
| Thread |
|---|
| • bzr commit into mysql-next-mr-bugfixing branch (jorgen.loland:3232) | Jorgen Loland | 11 Nov |