File: binlog_commit_fail.test

package info (click to toggle)
mariadb 1%3A11.8.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 772,520 kB
  • sloc: ansic: 2,414,714; cpp: 1,791,394; asm: 381,336; perl: 62,905; sh: 49,647; pascal: 40,897; java: 39,363; python: 20,791; yacc: 20,432; sql: 17,907; xml: 12,344; ruby: 8,544; cs: 6,542; makefile: 6,145; ada: 1,879; lex: 1,193; javascript: 996; objc: 80; tcl: 73; awk: 46; php: 22
file content (135 lines) | stat: -rw-r--r-- 4,348 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# Tests of commit time failures.
# At committing of an auto-commit statement a failure to commit in its
# binlog branch should rollback at least the transactional part of the statement.
#
# References:
# MDEV-35506 commit policy of one-phase-commit even at errored-out binlogging leads to assert
# MDEV-36027 Errored-out CREATE-SELECT does not binlog results of non-transactional table modification

source include/have_innodb.inc;
source include/have_binlog_format_row.inc;

set @@session.gtid_domain_id=1;
set @save_gtid_stric_mode=@@global.gtid_strict_mode;

create table ta (a int) engine=aria;
create table ti (a int) engine=innodb;
create table ti_pk (a int primary key) engine=innodb;
create table t  (a int) engine=innodb;
delimiter |;
create function f_i()
returns integer
begin
  insert into ti set a=1;
return 1;
end |
create function f_ia(arg int)
returns integer
begin
  insert into ti_pk set a=1;
  insert into ta set a=1;
  insert into ti_pk set a=arg;
  return 1;
end |
delimiter ;|

call mtr.add_suppression("Error writing file");

# Naturally all empty now
select count(*) as zero from t;
select count(*) as zero from ta;
select count(*) as zero from ti;

# Force manual value assignement to gtid::seq_no while in the strict mode
# so that the value is rejected. Despite the errorred out statement
# being at its commit phase it will eventually be rolled back.
# Side effects of non-transactional engines, like Aria, are displayed.
--echo # 1. simple Innodb test
set @@global.gtid_strict_mode=0; set @@session.gtid_seq_no=1;
set @@global.gtid_strict_mode=1;
# mask possible allowed seq_no shift
--replace_regex /GTID 1-1-[0-9]+/GTID VALUE/
--error ER_GTID_STRICT_OUT_OF_ORDER
insert into t set a=1;

--echo # observe effective rollback
select count(*) as zero from t;

--echo # 2. simple Aira test
set @@global.gtid_strict_mode=0; set @@session.gtid_seq_no=1;
set @@global.gtid_strict_mode=1;
--replace_regex /GTID 1-1-[0-9]+/GTID VALUE/
--error ER_GTID_STRICT_OUT_OF_ORDER
insert into ta values (1),(2);

--echo # note no rollback
select count(*) as '*NON-zero*' from ta;
# local cleanup
delete from ta;

--echo # 3. multi-engine test
# A. non-transactional top-level
set @@global.gtid_strict_mode=0; set @@session.gtid_seq_no=1;
set @@global.gtid_strict_mode=1;
--replace_regex /GTID 1-1-[0-9]+/GTID VALUE/
--error ER_GTID_STRICT_OUT_OF_ORDER
insert into ta set a=f_i();
--echo # note no rollback..
select count(*) as one from ta;
--echo # ..except transactional engine
select count(*) as zero from ti;
delete from ta;

# B. non-transactional in the leaf
set @@global.gtid_strict_mode=0; set @@session.gtid_seq_no=1;
set @@global.gtid_strict_mode=1;
--replace_regex /GTID 1-1-[0-9]+/GTID VALUE/
--error ER_GTID_STRICT_OUT_OF_ORDER
insert into t set a=f_ia(0);

--echo # note no rollback..
select count(*) as one from ta;
--echo # ..except transactional engine
select count(*) as zero from t;
select count(*) as zero from ti_pk;
delete from ta;

--echo # 4. create-table-select-f()
--let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
--let $binlog_start = query_get_value(SHOW MASTER STATUS, Position, 1)
# A. two phase commit branch
set @@global.gtid_strict_mode=0; set @@session.gtid_seq_no=1;
set @@global.gtid_strict_mode=1;
--replace_regex /GTID 1-1-[0-9]+/GTID VALUE/
--error ER_GTID_STRICT_OUT_OF_ORDER
create table f_x (a int) select f_i() as a;
--echo # rollback indeed takes place in the pure transactional case
select count(*) as zero from ti;

# B. one phase commit branch
--let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
--let $binlog_start = query_get_value(SHOW MASTER STATUS, Position, 1)
set @@global.gtid_strict_mode=0; set @@session.gtid_seq_no=1;
set @@global.gtid_strict_mode=1;
--replace_regex /GTID 1-1-[0-9]+/GTID VALUE/
--error ER_GTID_STRICT_OUT_OF_ORDER
create table t_x (a int) engine=aria select f_ia(0) as a;
--error ER_NO_SUCH_TABLE
select * from t_x;

--echo # **TODO**: fix MDEV-36027
--echo # **TODO**: the empty binlog is buggy ..
--source include/show_binlog_events.inc
--echo # .. as non-transactional `ta` (and `t_x` sic!) are modified
select count(*) as one from ta;
select count(*) as zero from ti;

delete from ta;
--echo #.

# cleanup

set  @@global.gtid_strict_mode=@save_gtid_stric_mode;
drop function f_i;
drop function f_ia;
drop table t, ta, ti, ti_pk;