mariadb/mysql-test/suite/perfschema/t/transaction_gtid.test
2020-03-14 09:51:36 +01:00

194 lines
6.1 KiB
Text

# ==== 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