summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/perfschema/t/transaction_gtid.test
blob: c97c042b94380da1f9ebaceba58007a2aed80f9a (plain)
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# ==== Purpose ====
#
# Verify that the GTID column of
# performance_schema.events_transactions_current and
# performance_schema.events_transactions_history has the correct
# value, during different parts of the transaction life cycle.
#
# There are several cases:
#
# - When GTID_MODE=ON, a GTID of the form UUID:NUMBER is generated.
#   When GTID_MODE=OFF, transactions have the special GTID
#   "ANONYMOUS".
#
# - On a master, the GTID is generated during the transaction commit;
#   prior to that it is "AUTOMATIC". On a slave, the GTID is specified
#   (using SET GTID_NEXT) prior to executing the transaction.
#
# ==== Implementation ====
#
# Execute a transaction like:
#   BEGIN;
#   INSERT;
#   COMMIT;
# On a different connection, check the GTID columns of the tables
# between each statement.
#
# Transactions to be checked are executed on connection
# 'default'. Auxiliary statements to read or truncate the tables are
# executed on connection 'server_1'.
#
# Also execute a ROLLBACK transaction.
#
# Execute the transaction in these two cases:
# - GTID_MODE=ON,
# - GTID_MODE=OFF.
#
# Execute the transaction in these two cases:
# - GTID_NEXT='UUID:NUMBER'/'ANONYMOUS' (when GTID_MODE=ON/OFF)
# - GTID_NEXT='AUTOMATIC'.
#
# Due to implementation details, there is a window in time at the
# beginning of the transaction when the GTID has not been copied from
# the server to the performance_schema internal structures.  During
# this window, the GTID should be AUTOMATIC even if GTID_NEXT is set
# to 'UUID:NUMBER' or 'ANONYMOUS'.  To verify this, we use a debug
# sync point during the execution of the BEGIN statement.
#
# ==== References ====
#
# WL#7592: GTIDS: generate Gtid_log_event and Previous_gtids_log_event always
# - The current behavior was specified and the test was introduced in
#   this worklog.

--source include/have_debug_sync.inc
--source include/not_gtid_enabled.inc
--let $rpl_topology= none
--let $rpl_server_count= 1
--source include/rpl_init.inc

--echo # ==== Configure ====

--connection default

SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;

--let $thread_id= `SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID()`
--let $server_uuid= `SELECT @@GLOBAL.SERVER_UUID`

CREATE TABLE t1 (a INT);

# These are parameters to include/execute_at_sync_point.inc,
# which will remain the same each time the script is invoked.
--let $statement_connection= default
--let $auxiliary_connection= server_1
--let $auxiliary_file= suite/perfschema/include/show_transaction_gtid.inc
--let $quiet= 1

--echo # ==== Test ====

--let $n= 1
while ($n <= 4) {
  if ($n == 1) {
    --echo ---- Case 1: Specify ANONYMOUS prior to transaction ----
    --let $gtid= ANONYMOUS
  }
  if ($n == 2) {
    --echo ---- Case 2: Generate ANONYMOUS at commit ----
    --let $gtid= AUTOMATIC
  }
  if ($n == 3) {
    --let $rpl_gtid_mode= ON
    --source include/rpl_set_gtid_mode.inc
    --echo ---- Case 3: Specify GTID prior to transaction ----
    --let $gtid= aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1
  }
  if ($n == 4) {
    --echo ---- Case 4: Generate GTID at commit ----
    --let $gtid= AUTOMATIC
  }

  # Execute a transaction, show the GTID column of the tables
  # after ROLLBACK.

  --echo * BEGIN ... ROLLBACK
  --source ../include/reset_transaction_gtid.inc

  --source ../include/show_transaction_gtid.inc
  eval SET SESSION GTID_NEXT = '$gtid';
  BEGIN;
  eval INSERT INTO t1 VALUES ($n);
  ROLLBACK;
  --source ../include/show_transaction_gtid.inc

  # Same transaction as above, but with a commit. Show the GTID column
  # of the tables between each statement, as well as in the middle of
  # the BEGIN statement.

  --echo * BEGIN ... COMMIT
  --source ../include/reset_transaction_gtid.inc

  --source ../include/show_transaction_gtid.inc
  eval SET SESSION GTID_NEXT = '$gtid';
  --source ../include/show_transaction_gtid.inc
  --let $statement= BEGIN
  --let $sync_point= after_set_transaction_psi_before_set_transaction_gtid
  --source include/execute_at_sync_point.inc
  --source ../include/show_transaction_gtid.inc
  eval INSERT INTO t1 VALUES ($n);
  --source ../include/show_transaction_gtid.inc
  COMMIT;
  --source ../include/show_transaction_gtid.inc

  # A transaction executed with AUTOCOMMIT=OFF and no BEGIN.  Show the
  # GTID column between each statement, as well as in the middle of
  # the first DML statement.

  --echo * AUTOCOMMIT = OFF
  SET @@SESSION.AUTOCOMMIT = 0;
  --source ../include/reset_transaction_gtid.inc

  --source ../include/show_transaction_gtid.inc
  eval SET SESSION GTID_NEXT = '$gtid';
  --source ../include/show_transaction_gtid.inc
  --let $statement= INSERT INTO t1 VALUES ($n)
  --let $sync_point= begin_decide_logging_format
  --source include/execute_at_sync_point.inc
  --source ../include/show_transaction_gtid.inc
  COMMIT;
  --source ../include/show_transaction_gtid.inc

  # A single-statement transaction executed with AUTOCOMMIT=ON and no
  # BEGIN.  Show the GTID column before and after, as well as in the
  # middle of the statement.

  --echo * AUTOCOMMIT = ON
  SET @@SESSION.AUTOCOMMIT = 1;
  --source ../include/reset_transaction_gtid.inc

  --source ../include/show_transaction_gtid.inc
  eval SET SESSION GTID_NEXT = '$gtid';
  --source ../include/show_transaction_gtid.inc
  --let $statement= INSERT INTO t1 VALUES ($n)
  --let $sync_point= begin_decide_logging_format
  --source include/execute_at_sync_point.inc
  --source ../include/show_transaction_gtid.inc

  # Disabled because DDL is not inserted into the tables
  if (0) {
  # An implicitly committing statement (DDL), no BEGIN.
  --echo * implicit commit (DDL)
  --source ../include/reset_transaction_gtid.inc

  --source ../include/show_transaction_gtid.inc
  eval SET SESSION GTID_NEXT = '$gtid';
  --source ../include/show_transaction_gtid.inc
  --let $statement= CREATE TABLE t_$n (a INT)
  --let $sync_point= begin_decide_logging_format
  --source include/execute_at_sync_point.inc
  --source ../include/show_transaction_gtid.inc
  }

  --inc $n
}

--echo # ==== Clean up ====

DROP TABLE t1;
# DROP TABLE t_1, t_2, t_3, t_4;

--let $rpl_gtid_mode= OFF
--source include/rpl_set_gtid_mode.inc
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;

--source include/rpl_end.inc