1
0
mirror of https://github.com/MariaDB/server.git synced 2026-10-23 18:49:29 +03:00

Merge branch '10.11-elenst' into 11.4

This commit is contained in:
Elena Stepanova
2026-10-16 13:07:18 +03:00
7 changed files with 204 additions and 7 deletions

View File

@@ -104,3 +104,74 @@ BINLOG '-2079193929';
ERROR HY000: Decoding of base64 string failed
BINLOG 'xç↓%~∙D╒ƒ╡';
ERROR HY000: Decoding of base64 string failed
#
# MDEV-39074 trans_rollback_stmt(THD *): Assertion `! thd->in_sub_stmt' failed.
#
create table t0 (a int);
create table t1 (a int);
## Case 1: Trigger (disabled)
create trigger trig_t0_insert after insert on t0 for each row binlog 'enabled';
ERROR 0A000: BINLOG is not allowed in stored procedures
create trigger trig_t0_insert after insert on t0 for each row
binlog @a, @b;
ERROR 0A000: BINLOG is not allowed in stored procedures
## Case 2: SP (disabled)
create procedure proc_t1_insert() binlog 'AAAAAAIBAAAAPwAAAAAAAAAAAAEAAAAAAAAABAAAAAB0ZXN0AGluc2VydCBpbnRvIHQxIHZhbHVlcyAoOTkp';
ERROR 0A000: BINLOG is not allowed in stored procedures
## Case 3: SF (disabled)
create function func_t1_insert() returns int
begin
binlog 'TFtYRxMBAAAAKQAAAH8BAAAAABAAAAAAAAAABHRlc3QAAnQxAAEDAAE=TFtYRxcBAAAAIgAAAKEBAAAQABAAAAAAAAEAAf/+AwAAAA==';
return 0;
end|
ERROR 0A000: BINLOG is not allowed in stored procedures
create function func_t1_insert() returns int
begin
binlog @a, @b;
return 0;
end|
ERROR 0A000: BINLOG is not allowed in stored procedures
## Case 4: Event (disabled)
create event ev_t1_insert on schedule every 1 day do
binlog 'TFtYRxMBAAAAKQAAAH8BAAAAABAAAAAAAAAABHRlc3QAAnQxAAEDAAE=TFtYRxcBAAAAIgAAAKEBAAAQABAAAAAAAAEAAf/+AwAAAA==';
ERROR 0A000: BINLOG is not allowed in stored procedures
## Case 5: Anonymous block (disabled)
begin not atomic
binlog 'TFtYRxMBAAAAKQAAAH8BAAAAABAAAAAAAAAABHRlc3QAAnQxAAEDAAE=TFtYRxcBAAAAIgAAAKEBAAAQABAAAAAAAAEAAf/+AwAAAA==';
end|
ERROR 0A000: BINLOG is not allowed in stored procedures
## Case 6: Dynamic SQL in SP (disabled)
create procedure proc_t1_insert()
execute immediate "binlog 'TFtYRxMBAAAAKQAAAH8BAAAAABAAAAAAAAAABHRlc3QAAnQxAAEDAAE=TFtYRxcBAAAAIgAAAKEBAAAQABAAAAAAAAEAAf/+AwAAAA=='";
call proc_t1_insert();
ERROR 0A000: BINLOG is not allowed in stored procedures
drop procedure proc_t1_insert;
prepare stmt from "binlog 'TFtYRxMBAAAAKQAAAH8BAAAAABAAAAAAAAAABHRlc3QAAnQxAAEDAAE=TFtYRxcBAAAAIgAAAKEBAAAQABAAAAAAAAEAAf/+AwAAAA=='";
create procedure proc_t1_insert() execute stmt;
call proc_t1_insert();
ERROR 0A000: BINLOG is not allowed in stored procedures
drop procedure proc_t1_insert;
deallocate prepare stmt;
## Case 7: Row event in PS (works)
binlog 'ODdYRw8BAAAAZgAAAGoAAAABAAQANS4xLjIzLXJjLWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4N1hHEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC';
prepare stmt from "binlog 'TFtYRxMBAAAAKQAAAH8BAAAAABAAAAAAAAAABHRlc3QAAnQxAAEDAAE=TFtYRxcBAAAAIgAAAKEBAAAQABAAAAAAAAEAAf/+AwAAAA=='";
execute stmt;
execute stmt;
deallocate prepare stmt;
select * from t1;
a
3
3
## Case 8: Statement event in PS (works)
prepare stmt from "binlog 'AAAAAAIBAAAAPwAAAAAAAAAAAAEAAAAAAAAABAAAAAB0ZXN0AGluc2VydCBpbnRvIHQxIHZhbHVlcyAoOTkp'";
execute stmt;
execute stmt;
deallocate prepare stmt;
select * from t1;
a
3
3
99
99
drop table t0, t1;
# End of 10.11 tests

View File

@@ -164,3 +164,101 @@ BINLOG '123';
BINLOG '-2079193929';
--error ER_BASE64_DECODE_ERROR
BINLOG 'xç↓%~∙D╒ƒ╡';
--echo #
--echo # MDEV-39074 trans_rollback_stmt(THD *): Assertion `! thd->in_sub_stmt' failed.
--echo #
create table t0 (a int);
create table t1 (a int);
# Format_description_log_event, same as in the FD test above
--let $FORMAT_DESCR_LOG_EVENT= 'ODdYRw8BAAAAZgAAAGoAAAABAAQANS4xLjIzLXJjLWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4N1hHEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC'
# table_map+write_rows_log_event corresponding to: insert into t1 values (3)
--let $ROW_INSERT_T1= 'TFtYRxMBAAAAKQAAAH8BAAAAABAAAAAAAAAABHRlc3QAAnQxAAEDAAE=TFtYRxcBAAAAIgAAAKEBAAAQABAAAAAAAAEAAf/+AwAAAA=='
# Query_log_event (no checksum, matches the checksum-less FD event above)
# corresponding to: insert into t1 values (99)
--let $STMT_INSERT_T1= 'AAAAAAIBAAAAPwAAAAAAAAAAAAEAAAAAAAAABAAAAAB0ZXN0AGluc2VydCBpbnRvIHQxIHZhbHVlcyAoOTkp'
--echo ## Case 1: Trigger (disabled)
--error ER_SP_BADSTATEMENT
create trigger trig_t0_insert after insert on t0 for each row binlog 'enabled';
--error ER_SP_BADSTATEMENT
create trigger trig_t0_insert after insert on t0 for each row
binlog @a, @b;
--echo ## Case 2: SP (disabled)
--error ER_SP_BADSTATEMENT
eval create procedure proc_t1_insert() binlog $STMT_INSERT_T1;
--echo ## Case 3: SF (disabled)
delimiter |;
--error ER_SP_BADSTATEMENT
eval create function func_t1_insert() returns int
begin
binlog $ROW_INSERT_T1;
return 0;
end|
--error ER_SP_BADSTATEMENT
create function func_t1_insert() returns int
begin
binlog @a, @b;
return 0;
end|
delimiter ;|
--echo ## Case 4: Event (disabled)
--error ER_SP_BADSTATEMENT
eval create event ev_t1_insert on schedule every 1 day do
binlog $ROW_INSERT_T1;
--echo ## Case 5: Anonymous block (disabled)
delimiter |;
--error ER_SP_BADSTATEMENT
eval begin not atomic
binlog $ROW_INSERT_T1;
end|
delimiter ;|
--echo ## Case 6: Dynamic SQL in SP (disabled)
eval create procedure proc_t1_insert()
execute immediate "binlog $ROW_INSERT_T1";
--error ER_SP_BADSTATEMENT
call proc_t1_insert();
drop procedure proc_t1_insert;
eval prepare stmt from "binlog $ROW_INSERT_T1";
create procedure proc_t1_insert() execute stmt;
--error ER_SP_BADSTATEMENT
call proc_t1_insert();
drop procedure proc_t1_insert;
deallocate prepare stmt;
--echo ## Case 7: Row event in PS (works)
eval binlog $FORMAT_DESCR_LOG_EVENT;
eval prepare stmt from "binlog $ROW_INSERT_T1";
execute stmt;
execute stmt;
deallocate prepare stmt;
select * from t1;
--echo ## Case 8: Statement event in PS (works)
eval prepare stmt from "binlog $STMT_INSERT_T1";
execute stmt;
execute stmt;
deallocate prepare stmt;
select * from t1;
drop table t0, t1;
--echo # End of 10.11 tests

View File

@@ -10,6 +10,7 @@
# 3. Verify the server is still usable: a normal CHANGE MASTER for a
# new, short-named channel succeeds.
#
--source include/not_windows.inc
--source include/master-slave.inc
--connection slave

View File

@@ -52,13 +52,22 @@ if (`SELECT "$master_file" != "" OR
--source include/stop_slave.inc
# Create a relay-log.info file with a position value > 2^31
--let $MYSQLD_DATADIR= `select @@datadir`
--remove_file $MYSQLD_DATADIR/relay-log.info
--write_file $MYSQLD_DATADIR/relay-log.info
./slave-relay-bin.000001
2147483648
--let MYSQLD_DATADIR= `select @@datadir`
perl;
my $file = "$ENV{MYSQLD_DATADIR}/relay-log.info";
my $newpos = '2147483648';
0
open(my $in, "<", $file) or die "Cannot open $file: $!";
binmode($in); # To preserve line endings
my @lines = <$in>;
close($in);
$lines[1] = "$newpos\n";
open(my $out, ">", $file) or die "Cannot write to $file: $!";
binmode($out); # To preserve line endings
print $out @lines;
close($out) or die "Error closing $file: $!";
EOF
--let $rpl_server_number= 2

View File

@@ -238,7 +238,7 @@ connection master;
create table t4 (f text character set utf8);
create table t5 (f text character set cp932);
--exec $MYSQL --default-character-set=utf8 test -e "insert into t4 values(_utf8'ソ')"
--exec $MYSQL --default-character-set=cp932 test -e "insert into t5 values(_cp932'ƒ\');"
--exec $MYSQL --default-character-set=cp932 test -e "insert into t5 values(UNHEX('835C'))"
flush logs;
rename table t4 to t04, t5 to t05;
--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 | $MYSQL --default-character-set=utf8

View File

@@ -244,6 +244,16 @@ void mysql_client_binlog_statement(THD* thd)
thd->lex->comment.length : 2048),
thd->lex->comment.str));
/*
The parser refuses BINLOG in a routine body; this catches dynamic SQL
(EXECUTE IMMEDIATE, EXECUTE) run from a routine.
*/
if (thd->spcont)
{
my_error(ER_SP_BADSTATEMENT, MYF(0), "BINLOG");
DBUG_VOID_RETURN;
}
if (check_global_access(thd, PRIV_STMT_BINLOG))
DBUG_VOID_RETURN;
@@ -421,8 +431,12 @@ void mysql_client_binlog_statement(THD* thd)
applied in PS mode. So, reset the current lex temporary to point to
thd->main_lex before running ev->apply_event() and restore its
original value on return.
Likewise, point thd->stmt_arena to thd: otherwise a Query event's
statement leaks its allocations onto the PS's persistent arena.
*/
LEX *backup_lex;
SCOPE_VALUE(thd->stmt_arena, static_cast<Query_arena *>(thd));
thd->backup_and_reset_current_lex(&backup_lex);
err= save_restore_context_apply_event(ev, rgi);

View File

@@ -8378,6 +8378,8 @@ table_index_name:
binlog_base64_event:
BINLOG_SYM TEXT_STRING_sys
{
if (Lex->sphead)
my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BINLOG"));
Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT;
Lex->comment= $2;
Lex->ident.str= NULL;
@@ -8386,6 +8388,8 @@ binlog_base64_event:
|
BINLOG_SYM '@' ident_or_text ',' '@' ident_or_text
{
if (Lex->sphead)
my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BINLOG"));
Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT;
Lex->comment= $3;
Lex->ident= $6;