Skip to content

Commit a71e2d2

Browse files
committed
MDEV-7006 MDEV-7007: SET STATEMENT and slow log
fixed embedded server tests MDEV-7009: SET STATEMENT min_examined_row_limit has no effect MDEV-6948:SET STATEMENT gtid_domain_id = ... FOR has no effect (same for gtid_seq_no and server_id) old values of SET STATENENT variables now saved in its own Query_arena and restored later
1 parent dab1236 commit a71e2d2

14 files changed

+314
-40
lines changed

mysql-test/r/set_statement.result

Lines changed: 84 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,10 +1034,92 @@ set statement lock_wait_timeout=1 for select @@lock_wait_timeout;
10341034
@@lock_wait_timeout
10351035
1
10361036
set global general_log=@save_general_log;
1037+
# MDEV-7006 MDEV-7007: SET statement and slow log
1038+
set @save_long_query_time= @@long_query_time;
1039+
set @save_slow_query_log= @@slow_query_log;
1040+
set @save_log_output= @@log_output;
1041+
set statement long_query_time=default for select @@long_query_time;
1042+
@@long_query_time
1043+
10.000000
1044+
set statement log_slow_filter=default for select @@log_slow_filter;
1045+
@@log_slow_filter
1046+
admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
1047+
set statement log_slow_verbosity=default for select @@log_slow_verbosity;
1048+
@@log_slow_verbosity
1049+
1050+
set statement log_slow_rate_limit=default for select @@log_slow_rate_limit;
1051+
@@log_slow_rate_limit
1052+
1
1053+
set statement slow_query_log=default for select @@slow_query_log;
1054+
@@slow_query_log
1055+
1
1056+
truncate table mysql.slow_log;
1057+
set slow_query_log= 1;
1058+
set global log_output='TABLE';
1059+
select sql_text from mysql.slow_log;
1060+
sql_text
1061+
set @@long_query_time=0.01;
1062+
#should be written
1063+
select sleep(0.1);
1064+
sleep(0.1)
1065+
0
1066+
set @@long_query_time=@save_long_query_time;
1067+
select sql_text from mysql.slow_log;
1068+
sql_text
1069+
select sleep(0.1)
1070+
#---
1071+
#should be written
1072+
set statement long_query_time=0.01 for select sleep(0.1);
1073+
sleep(0.1)
1074+
0
1075+
select sql_text from mysql.slow_log;
1076+
sql_text
1077+
select sleep(0.1)
1078+
set statement long_query_time=0.01 for select sleep(0.1)
1079+
#---
1080+
set @@long_query_time=0.01;
1081+
#should NOT be written
1082+
set statement slow_query_log=0 for select sleep(0.1);
1083+
sleep(0.1)
1084+
0
1085+
set @@long_query_time=@save_long_query_time;
1086+
select sql_text from mysql.slow_log;
1087+
sql_text
1088+
select sleep(0.1)
1089+
set statement long_query_time=0.01 for select sleep(0.1)
1090+
#---
1091+
#should NOT be written
1092+
set statement long_query_time=0.01,log_slow_filter='full_scan' for select sleep(0.1);
1093+
sleep(0.1)
1094+
0
1095+
select sql_text from mysql.slow_log;
1096+
sql_text
1097+
select sleep(0.1)
1098+
set statement long_query_time=0.01 for select sleep(0.1)
1099+
#---
1100+
#should NOT be written
1101+
set statement long_query_time=0.01,log_slow_rate_limit=9999 for select sleep(0.1);
1102+
sleep(0.1)
1103+
0
1104+
select sql_text from mysql.slow_log;
1105+
sql_text
1106+
select sleep(0.1)
1107+
set statement long_query_time=0.01 for select sleep(0.1)
1108+
#---
1109+
#should NOT be written
1110+
set statement long_query_time=0.01,min_examined_row_limit=50 for select sleep(0.1);
1111+
sleep(0.1)
1112+
0
1113+
select sql_text from mysql.slow_log;
1114+
sql_text
1115+
select sleep(0.1)
1116+
set statement long_query_time=0.01 for select sleep(0.1)
1117+
#---
1118+
set global log_output= @save_log_output;
1119+
set @@slow_query_log= @save_slow_query_log;
1120+
set @@long_query_time= @save_long_query_time;
10371121
set statement autocommit=default for select 1;
10381122
ERROR 42000: The system variable autocommit cannot be set in SET STATEMENT.
1039-
set statement gtid_domain_id=default for select 1;
1040-
ERROR 42000: The system variable gtid_domain_id cannot be set in SET STATEMENT.
10411123
set statement tx_isolation=default for select 1;
10421124
ERROR 42000: The system variable tx_isolation cannot be set in SET STATEMENT.
10431125
set statement rand_seed1=default for select 1;
@@ -1050,18 +1132,6 @@ set statement last_insert_id=1 for select 1;
10501132
ERROR 42000: The system variable last_insert_id cannot be set in SET STATEMENT.
10511133
set statement sql_log_off=default for select 1;
10521134
ERROR 42000: The system variable sql_log_off cannot be set in SET STATEMENT.
1053-
set statement long_query_time=default for select 1;
1054-
ERROR 42000: The system variable long_query_time cannot be set in SET STATEMENT.
1055-
set statement log_slow_filter=default for select 1;
1056-
ERROR 42000: The system variable log_slow_filter cannot be set in SET STATEMENT.
1057-
set statement log_slow_verbosity=default for select 1;
1058-
ERROR 42000: The system variable log_slow_verbosity cannot be set in SET STATEMENT.
1059-
set statement log_slow_rate_limit=default for select 1;
1060-
ERROR 42000: The system variable log_slow_rate_limit cannot be set in SET STATEMENT.
1061-
set statement slow_query_log=default for select 1;
1062-
ERROR 42000: The system variable slow_query_log cannot be set in SET STATEMENT.
1063-
set statement min_examined_row_limit=default for select 1;
1064-
ERROR 42000: The system variable min_examined_row_limit cannot be set in SET STATEMENT.
10651135
set statement character_set_client=default for select 1;
10661136
ERROR 42000: The system variable character_set_client cannot be set in SET STATEMENT.
10671137
set statement character_set_connection=default for select 1;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
drop table if exists t1;
2+
drop view if exists t1;
3+
#
4+
# MDEV-6948: SET STATEMENT gtid_domain_id = ... FOR has no effect
5+
# (same for gtid_seq_no and server_id)
6+
#
7+
reset master;
8+
create table t1 (i int);
9+
set gtid_domain_id = 10;
10+
insert into t1 values (1),(2);
11+
set statement gtid_domain_id = 20 for insert into t1 values (3),(4);
12+
show binlog events limit 5,5;
13+
Log_name Pos Event_type Server_id End_log_pos Info
14+
x x x x x BEGIN GTID 10-1-1
15+
x x x x x use `test`; insert into t1 values (1),(2)
16+
x x x x x COMMIT
17+
x x x x x BEGIN GTID 20-1-1
18+
x x x x x use `test`; set statement gtid_domain_id = 20 for insert into t1 values (3),(4)
19+
drop table t1;

mysql-test/t/set_statement.test

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -987,14 +987,67 @@ set global general_log=0;
987987
set statement lock_wait_timeout=1 for select @@lock_wait_timeout;
988988
set global general_log=@save_general_log;
989989

990+
--echo # MDEV-7006 MDEV-7007: SET statement and slow log
991+
992+
set @save_long_query_time= @@long_query_time;
993+
set @save_slow_query_log= @@slow_query_log;
994+
set @save_log_output= @@log_output;
995+
996+
set statement long_query_time=default for select @@long_query_time;
997+
set statement log_slow_filter=default for select @@log_slow_filter;
998+
set statement log_slow_verbosity=default for select @@log_slow_verbosity;
999+
set statement log_slow_rate_limit=default for select @@log_slow_rate_limit;
1000+
set statement slow_query_log=default for select @@slow_query_log;
1001+
1002+
truncate table mysql.slow_log;
1003+
set slow_query_log= 1;
1004+
set global log_output='TABLE';
1005+
1006+
select sql_text from mysql.slow_log;
1007+
set @@long_query_time=0.01;
1008+
--echo #should be written
1009+
select sleep(0.1);
1010+
set @@long_query_time=@save_long_query_time;
1011+
select sql_text from mysql.slow_log;
1012+
--echo #---
1013+
--echo #should be written
1014+
set statement long_query_time=0.01 for select sleep(0.1);
1015+
select sql_text from mysql.slow_log;
1016+
--echo #---
1017+
set @@long_query_time=0.01;
1018+
--echo #should NOT be written
1019+
set statement slow_query_log=0 for select sleep(0.1);
1020+
set @@long_query_time=@save_long_query_time;
1021+
select sql_text from mysql.slow_log;
1022+
--echo #---
1023+
--echo #should NOT be written
1024+
set statement long_query_time=0.01,log_slow_filter='full_scan' for select sleep(0.1);
1025+
select sql_text from mysql.slow_log;
1026+
--echo #---
1027+
--echo #should NOT be written
1028+
set statement long_query_time=0.01,log_slow_rate_limit=9999 for select sleep(0.1);
1029+
select sql_text from mysql.slow_log;
1030+
--echo #---
1031+
--echo #should NOT be written
1032+
set statement long_query_time=0.01,min_examined_row_limit=50 for select sleep(0.1);
1033+
select sql_text from mysql.slow_log;
1034+
--echo #---
1035+
#
1036+
# log_slow_verbosity is impossible to check because results are not written
1037+
# in TABLE mode
1038+
#
1039+
1040+
set global log_output= @save_log_output;
1041+
set @@slow_query_log= @save_slow_query_log;
1042+
set @@long_query_time= @save_long_query_time;
1043+
1044+
9901045
#
9911046
# Prohibited Variables
9921047
#
9931048
--error ER_SET_STATEMENT_NOT_SUPPORTED
9941049
set statement autocommit=default for select 1;
9951050
--error ER_SET_STATEMENT_NOT_SUPPORTED
996-
set statement gtid_domain_id=default for select 1;
997-
--error ER_SET_STATEMENT_NOT_SUPPORTED
9981051
set statement tx_isolation=default for select 1;
9991052
--error ER_SET_STATEMENT_NOT_SUPPORTED
10001053
set statement rand_seed1=default for select 1;
@@ -1007,18 +1060,6 @@ set statement last_insert_id=1 for select 1;
10071060
--error ER_SET_STATEMENT_NOT_SUPPORTED
10081061
set statement sql_log_off=default for select 1;
10091062
--error ER_SET_STATEMENT_NOT_SUPPORTED
1010-
set statement long_query_time=default for select 1;
1011-
--error ER_SET_STATEMENT_NOT_SUPPORTED
1012-
set statement log_slow_filter=default for select 1;
1013-
--error ER_SET_STATEMENT_NOT_SUPPORTED
1014-
set statement log_slow_verbosity=default for select 1;
1015-
--error ER_SET_STATEMENT_NOT_SUPPORTED
1016-
set statement log_slow_rate_limit=default for select 1;
1017-
--error ER_SET_STATEMENT_NOT_SUPPORTED
1018-
set statement slow_query_log=default for select 1;
1019-
--error ER_SET_STATEMENT_NOT_SUPPORTED
1020-
set statement min_examined_row_limit=default for select 1;
1021-
--error ER_SET_STATEMENT_NOT_SUPPORTED
10221063
set statement character_set_client=default for select 1;
10231064
--error ER_SET_STATEMENT_NOT_SUPPORTED
10241065
set statement character_set_connection=default for select 1;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--source include/have_log_bin.inc
2+
--source include/not_embedded.inc
3+
4+
--disable_warnings
5+
drop table if exists t1;
6+
drop view if exists t1;
7+
--enable_warnings
8+
9+
--echo #
10+
--echo # MDEV-6948: SET STATEMENT gtid_domain_id = ... FOR has no effect
11+
--echo # (same for gtid_seq_no and server_id)
12+
--echo #
13+
reset master;
14+
create table t1 (i int);
15+
set gtid_domain_id = 10;
16+
insert into t1 values (1),(2);
17+
set statement gtid_domain_id = 20 for insert into t1 values (3),(4);
18+
19+
--replace_column 1 x 2 x 3 x 4 x 5 x
20+
show binlog events limit 5,5;
21+
22+
drop table t1;

sql/log_event.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4284,6 +4284,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
42844284
/* Finalize server status flags after executing a statement. */
42854285
thd->update_server_status();
42864286
log_slow_statement(thd);
4287+
thd->lex->restore_set_statement_var();
42874288
}
42884289

42894290
thd->variables.option_bits&= ~OPTION_MASTER_SQL_ERROR;

sql/sp_head.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2975,6 +2975,7 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp,
29752975
29762976
cleanup_items() is called in sp_head::execute()
29772977
*/
2978+
thd->lex->restore_set_statement_var();
29782979
DBUG_RETURN(res || thd->is_error());
29792980
}
29802981

sql/sql_class.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1699,7 +1699,7 @@ THD::~THD()
16991699
if (rgi_slave)
17001700
rgi_slave->cleanup_after_session();
17011701
#endif
1702-
1702+
main_lex.free_set_stmt_mem_root();
17031703
free_root(&main_mem_root, MYF(0));
17041704
main_da.free_memory();
17051705
if (tdc_hash_pins)

sql/sql_class.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,19 @@ class Query_arena
920920
};
921921

922922

923+
class Query_arena_memroot: public Query_arena, public Sql_alloc
924+
{
925+
public:
926+
Query_arena_memroot(MEM_ROOT *mem_root_arg, enum enum_state state_arg) :
927+
Query_arena(mem_root_arg, state_arg)
928+
{}
929+
Query_arena_memroot() : Query_arena()
930+
{}
931+
932+
virtual ~Query_arena_memroot() {}
933+
};
934+
935+
923936
class Server_side_cursor;
924937

925938
/**
@@ -3674,6 +3687,7 @@ class THD :public Statement,
36743687
return backup;
36753688
}
36763689

3690+
36773691
void clear_wakeup_ready() { wakeup_ready= false; }
36783692
/*
36793693
Sleep waiting for others to wake us up with signal_wakeup_ready().

sql/sql_cursor.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ int mysql_open_cursor(THD *thd, select_result *result,
122122
/* Mark that we can't use query cache with cursors */
123123
thd->query_cache_is_applicable= 0;
124124
rc= mysql_execute_command(thd);
125+
thd->lex->restore_set_statement_var();
125126
thd->m_statement_psi= parent_locker;
126127
MYSQL_QUERY_EXEC_DONE(rc);
127128

sql/sql_lex.cc

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2628,7 +2628,8 @@ void Query_tables_list::destroy_query_tables_list()
26282628

26292629
LEX::LEX()
26302630
: explain(NULL),
2631-
result(0), option_type(OPT_DEFAULT), sphead(0),
2631+
result(0), arena_for_set_stmt(0), mem_root_for_set_stmt(0),
2632+
option_type(OPT_DEFAULT), sphead(0),
26322633
is_lex_started(0), limit_rows_examined_cnt(ULONGLONG_MAX)
26332634
{
26342635

@@ -4223,6 +4224,67 @@ int LEX::print_explain(select_result_sink *output, uint8 explain_flags,
42234224
return res;
42244225
}
42254226

4227+
4228+
/**
4229+
Allocates and set arena for SET STATEMENT old values.
4230+
4231+
@param backup where to save backup of arena.
4232+
4233+
@retval 1 Error
4234+
@retval 0 OK
4235+
*/
4236+
4237+
bool LEX::set_arena_for_set_stmt(Query_arena *backup)
4238+
{
4239+
DBUG_ENTER("LEX::set_arena_for_set_stmt");
4240+
DBUG_ASSERT(arena_for_set_stmt== 0);
4241+
if (!mem_root_for_set_stmt)
4242+
{
4243+
mem_root_for_set_stmt= new MEM_ROOT();
4244+
if (!(mem_root_for_set_stmt))
4245+
DBUG_RETURN(1);
4246+
init_sql_alloc(mem_root_for_set_stmt, ALLOC_ROOT_SET, ALLOC_ROOT_SET,
4247+
MYF(MY_THREAD_SPECIFIC));
4248+
}
4249+
if (!(arena_for_set_stmt= new(mem_root_for_set_stmt)
4250+
Query_arena_memroot(mem_root_for_set_stmt,
4251+
Query_arena::STMT_INITIALIZED)))
4252+
DBUG_RETURN(1);
4253+
DBUG_PRINT("info", ("mem_root: 0x%lx arena: 0x%lx",
4254+
(ulong) mem_root_for_set_stmt,
4255+
(ulong) arena_for_set_stmt));
4256+
thd->set_n_backup_active_arena(arena_for_set_stmt, backup);
4257+
DBUG_RETURN(0);
4258+
}
4259+
4260+
4261+
void LEX::reset_arena_for_set_stmt(Query_arena *backup)
4262+
{
4263+
DBUG_ENTER("LEX::reset_arena_for_set_stmt");
4264+
DBUG_ASSERT(arena_for_set_stmt);
4265+
thd->restore_active_arena(arena_for_set_stmt, backup);
4266+
DBUG_PRINT("info", ("mem_root: 0x%lx arena: 0x%lx",
4267+
(ulong) arena_for_set_stmt->mem_root,
4268+
(ulong) arena_for_set_stmt));
4269+
DBUG_VOID_RETURN;
4270+
}
4271+
4272+
4273+
void LEX::free_arena_for_set_stmt()
4274+
{
4275+
DBUG_ENTER("LEX::free_arena_for_set_stmt");
4276+
if (!arena_for_set_stmt)
4277+
return;
4278+
DBUG_PRINT("info", ("mem_root: 0x%lx arena: 0x%lx",
4279+
(ulong) arena_for_set_stmt->mem_root,
4280+
(ulong) arena_for_set_stmt));
4281+
arena_for_set_stmt->free_items();
4282+
delete(arena_for_set_stmt);
4283+
free_root(mem_root_for_set_stmt, MYF(MY_KEEP_PREALLOC));
4284+
arena_for_set_stmt= 0;
4285+
DBUG_VOID_RETURN;
4286+
}
4287+
42264288
void LEX::restore_set_statement_var()
42274289
{
42284290
DBUG_ENTER("LEX::restore_set_statement_var");
@@ -4231,7 +4293,9 @@ void LEX::restore_set_statement_var()
42314293
DBUG_PRINT("info", ("vars: %d", old_var_list.elements));
42324294
sql_set_variables(thd, &old_var_list, false);
42334295
old_var_list.empty();
4296+
free_arena_for_set_stmt();
42344297
}
4298+
DBUG_ASSERT(!is_arena_for_set_stmt());
42354299
DBUG_VOID_RETURN;
42364300
}
42374301

0 commit comments

Comments
 (0)