mariadb/mysql-test/suite/versioning/t/rpl_row.test
Aleksey Midenkov d37bb140b1 MDEV-31297 Create table as select on system versioned tables do not
work consistently on replication

Row-based replication does not execute CREATE .. SELECT but instead
CREATE TABLE. CREATE .. SELECT creates implict system fields on
unusual place: in-between declared fields and select fields. That was
done because select_field_pos logic requires select fields go last in
create_list.

So, CREATE .. SELECT on master and CREATE TABLE on slave create system
fields on different positions and replication gets field mismatch.

To fix this we've changed CREATE .. SELECT to create implicit system
fields on usual place in the end and updated select_field_pos for
handling this case.
2024-10-08 13:08:10 +03:00

74 lines
2.1 KiB
Text

--source include/have_binlog_format_row.inc
--source include/master-slave.inc
--source include/have_innodb.inc
--echo # MDEV-16252: MINIMAL binlog_row_image does not work for versioned tables
set @old_row_image= @@binlog_row_image;
set binlog_row_image= minimal;
create or replace table t1 (pk int, i int, primary key(pk))
with system versioning;
insert into t1 values (1,10),(2,20);
update t1 set i = 0;
--sync_slave_with_master
--connection master
drop table t1;
set binlog_row_image= @old_row_image;
--echo #
--echo # MDEV-28254 Wrong position for row_start, row_end after adding column
--echo # to implicit versioned table
--echo #
--let TMP= $MYSQLTEST_VARDIR/tmp
--let $MYSQLD_DATADIR= `select @@datadir`
set @@system_versioning_alter_history= keep;
set @@session.time_zone='+00:00';
create table t1 (x int) with system versioning engine innodb;
alter table t1 add column y int, algorithm=inplace;
check table t1;
--exec $MYSQL_DUMP --databases test > $TMP/dump.sql
--sync_slave_with_master
drop table t1;
--exec $MYSQL_SLAVE test < $TMP/dump.sql
show create table t1;
--connection master
set timestamp= 12345;
--let $start_pos= query_get_value("SHOW MASTER STATUS", Position, 1)
insert t1 values (1, 1);
select *, unix_timestamp(row_start) as row_start, unix_timestamp(row_end) as row_end from t1;
--let $stop_pos= query_get_value("SHOW MASTER STATUS", Position, 1)
set timestamp= default;
# NOTE: pipe grep is not Windows-compatible
--let grep_file= $TMP/out.txt
--let grep_regex= ^###
--exec $MYSQL_BINLOG -v -j $start_pos --stop-position=$stop_pos -o 3 $MYSQLD_DATADIR/master-bin.000001 > $grep_file
--source include/grep.inc
--sync_slave_with_master
select * from t1;
--connection master
drop table t1;
--remove_files_wildcard $TMP *.txt
--remove_files_wildcard $TMP *.sql
--echo #
--echo # MDEV-31297 Create table as select on system versioned tables do not work consistently on replication
--echo #
--connection master
create table t engine=innodb with system versioning as select 1 as i;
show create table t;
select * from t;
--sync_slave_with_master
show create table t;
select * from t;
--connection master
drop table t;
--source include/rpl_end.inc