From 51da7f3666e514745ed7d5c317587a89bdc5e282 Mon Sep 17 00:00:00 2001 From: bsrikanth-mariadb Date: Fri, 3 Apr 2026 16:23:19 +0530 Subject: [PATCH] MDEV-39222: After loading saved optimizer context, further queries cause errors The problem can be seen as: source /tmp/saved_optimizer_context.sql INSERT ..(or any DML); -- This causes "Failed to match the stats from replay context" warning-turned-error. The cause is that saved_optimizer_context.sql ends with: set @opt_context=...; set optimizer_replay_context='opt_context'; Note that optimizer_replay_context remains set and will apply for any further query. == SOLUTION == Make saved optimizer context have this as last statement: set optimizer_replay_context=NULL; If one desires to replay the context, it's still available in @opt_context. --- mysql-test/include/opt_ctx_cmp_2_runs_of_query.inc | 1 + ...e_sys_vars.opt => opt_context_replay_basic.opt} | 0 ...vars.result => opt_context_replay_basic.result} | 8 +++++++- ...sys_vars.test => opt_context_replay_basic.test} | 8 +++++++- .../main/opt_ctx_replay_innodb_complement.result | 14 ++++++++++++++ .../main/opt_ctx_replay_innodb_preferably.result | 14 ++++++++++++++ sql/opt_context_store_replay.cc | 1 + 7 files changed, 44 insertions(+), 2 deletions(-) rename mysql-test/main/{opt_context_store_sys_vars.opt => opt_context_replay_basic.opt} (100%) rename mysql-test/main/{opt_context_store_sys_vars.result => opt_context_replay_basic.result} (96%) rename mysql-test/main/{opt_context_store_sys_vars.test => opt_context_replay_basic.test} (83%) diff --git a/mysql-test/include/opt_ctx_cmp_2_runs_of_query.inc b/mysql-test/include/opt_ctx_cmp_2_runs_of_query.inc index 38c2ef7476816..ab05efa6964fd 100644 --- a/mysql-test/include/opt_ctx_cmp_2_runs_of_query.inc +++ b/mysql-test/include/opt_ctx_cmp_2_runs_of_query.inc @@ -36,6 +36,7 @@ eval drop table $table_name; -- source "$MYSQLTEST_VARDIR/tmp/dump1.sql" -- enable_query_log +set optimizer_replay_context= 'opt_context'; let $explain_output=`$explain_query`; evalp set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); diff --git a/mysql-test/main/opt_context_store_sys_vars.opt b/mysql-test/main/opt_context_replay_basic.opt similarity index 100% rename from mysql-test/main/opt_context_store_sys_vars.opt rename to mysql-test/main/opt_context_replay_basic.opt diff --git a/mysql-test/main/opt_context_store_sys_vars.result b/mysql-test/main/opt_context_replay_basic.result similarity index 96% rename from mysql-test/main/opt_context_store_sys_vars.result rename to mysql-test/main/opt_context_replay_basic.result index 6fbb2c8d02711..0564a0dad4ed0 100644 --- a/mysql-test/main/opt_context_store_sys_vars.result +++ b/mysql-test/main/opt_context_replay_basic.result @@ -159,5 +159,11 @@ set optimizer_replay_context='opt_context'; select count(*) from t1; count(*) 0 -drop table t1; +set optimizer_replay_context=''; +create table t2( a int); +# +# MDEV-39222: Errors shown when inserting data into a new table +# +insert into t2 select seq from seq_1_to_10; +drop table t1, t2; drop database db1; diff --git a/mysql-test/main/opt_context_store_sys_vars.test b/mysql-test/main/opt_context_replay_basic.test similarity index 83% rename from mysql-test/main/opt_context_store_sys_vars.test rename to mysql-test/main/opt_context_replay_basic.test index e86d7e2fedbf7..236553ee77502 100644 --- a/mysql-test/main/opt_context_store_sys_vars.test +++ b/mysql-test/main/opt_context_replay_basic.test @@ -35,7 +35,13 @@ drop table t1; --source "$MYSQLTEST_VARDIR/tmp/dump1.sql" +create table t2( a int); +--echo # +--echo # MDEV-39222: Errors shown when inserting data into a new table +--echo # +insert into t2 select seq from seq_1_to_10; + --remove_file "$MYSQLTEST_VARDIR/tmp/dump1.sql" -drop table t1; +drop table t1, t2; drop database db1; diff --git a/mysql-test/main/opt_ctx_replay_innodb_complement.result b/mysql-test/main/opt_ctx_replay_innodb_complement.result index 68c0de73381d9..53eed0c2335c7 100644 --- a/mysql-test/main/opt_ctx_replay_innodb_complement.result +++ b/mysql-test/main/opt_ctx_replay_innodb_complement.result @@ -148,6 +148,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -265,6 +266,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -379,6 +381,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -499,6 +502,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -629,6 +633,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -743,6 +748,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -848,6 +854,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -932,6 +939,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1005,6 +1013,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1095,6 +1104,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1179,6 +1189,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1258,6 +1269,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1384,6 +1396,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1518,6 +1531,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); diff --git a/mysql-test/main/opt_ctx_replay_innodb_preferably.result b/mysql-test/main/opt_ctx_replay_innodb_preferably.result index 09de9f83a919e..e5bed53a00711 100644 --- a/mysql-test/main/opt_ctx_replay_innodb_preferably.result +++ b/mysql-test/main/opt_ctx_replay_innodb_preferably.result @@ -148,6 +148,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -265,6 +266,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -379,6 +381,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -499,6 +502,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -629,6 +633,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -743,6 +748,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -848,6 +854,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -932,6 +939,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1005,6 +1013,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1095,6 +1104,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1179,6 +1189,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1258,6 +1269,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1384,6 +1396,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); @@ -1518,6 +1531,7 @@ EXPLAIN ] } } +set optimizer_replay_context= 'opt_context'; set @explain_output= '$explain_output'; set @explain_output= (select json_pretty(round_cost(@explain_output))); select JSON_EQUALS(@saved_explain_output, @explain_output); diff --git a/sql/opt_context_store_replay.cc b/sql/opt_context_store_replay.cc index dca60e674c067..ea8dcf1ff25e4 100644 --- a/sql/opt_context_store_replay.cc +++ b/sql/opt_context_store_replay.cc @@ -610,6 +610,7 @@ bool store_optimizer_context(THD *thd) sql_script.append(STRING_WITH_LEN(";\n\n")); sql_script.append(thd->query(), thd->query_length()); sql_script.append(STRING_WITH_LEN(";\n\n")); + sql_script.append(STRING_WITH_LEN("set optimizer_replay_context='';\n\n")); thd->captured_opt_ctx= new Optimizer_context_capture(thd, sql_script); if (!thd->captured_opt_ctx) return true; // OOM