WL#5344: Testing binlogging of operations on temporary tables
Affects: Server-5.5
—
Status: Complete
CONTEXT ======= In this test case, we check how changes to temporary tables are written to the binary log. RELATED BUGS ============ BUG#53259.
Changing Temporary Tables ========================= Temporary tables that are changed, i.e., (1) created by a CREATE TEMPORARY, CREATE TEMPORARY SELECT or CREATE LIKE; (2) dropped by a DROP; (3) dropped by a DROP TEMPORARY; (4) have a row inserted, deleted or updated; are subjected to the following rules regarding what is written to the binary log. RULES ===== If there is an on-going transaction, changes to temporary tables are written to the binary log according to the type of the engine in use, until something is written to the transactional cache. After that, any change is kept in the context of the on-going transaction. To easy the presentation, in what follows, we assume that something was already written to the transactional cache. (1) If the format is ROW: (1.1) DROP TEMPORARY TABLE is written to the binary log with an IF EXISTS appended to the statement if a temporary table is dropped. (1.2) DROP TEMPORARY TABLE returns an error, i.e. table does not exist, if we try to drop a regular table. (1.3) Any DROP that affects a temporary table has the temporary table logged as part of a DROP TEMPORARY TABLE IF EXISTS. (1.4) Other tables, if there is any, are written to the binary log as part of the DROP TABLE. (1.5) DROP is written to the binary log as a single statement because it commits any on-going transaction. (1.6) Other changes to temporary tables are not written to the binary log. (2) If the format is STATEMENT, changes to temporary tables are written to the binary log as follows: (2.1) INSERTS, UPDATES and DELETES are kept in the context of any on-going transaction and wrapped by a COMMIT/ROLLBACK. (2.2) CREATE TEMPORARY, CREATE TEMPORARY SELECT, CREATE LIKE and DROP TEMPORARY TABLE are kept in the context of any on-going transaction if there is one. (2.3) Otherwise, such commands are written as single statements. (2.4) There is no special procedure for DROP TEMPORARY TABLE [IF EXISTS]. (2.5) DROP TEMPORARY TABLE returns an error, i.e. table does not exist, if we try to drop a regular table. (2.6) DROP is written to the binary log as a single statement because it commits any on-going transaction. (3) If the format is MIXED and the execution switched from statements to rows due to any reason, the system behaves as in the ROW format. (4) If the format is MIXED and the execution did not switch from statements to rows, the system behaves as in the STATEMENT format. REMARKS: ======== . In (1.1), a statement written to the binary log with an appended IF EXISTS, because a temporary table "could" be created and replicated when a different format was in use. . In (1.3), any DROP that affects a temporary table has the drop re-written as DROP TEMPORARY IF EXISTS and DROP because the IF EXISTS needed to be appended to the DROP TEMPORARY. . DROP TEMPORARY TABLE, when the table is regular, raises an error as the table does not exist. . DROP TEMPORARY TABLE, when the table is temporary, works fine. EXPECTED RESULTS: ================= So we verify if DROP TEMPORARY works correctly by dropping different types of tables and checking if the statement is written to the binary log as expected: DROP TEMPORARY TABLE: --------------------- (STATEMENT) Temp T-Table Temp N-Table Xe Temp T-Table k k k with error Temp N-Table k k k with error Xe k with error k with error - T-table k with error k with error - N-table k with error k with error - (ROW) Temp T-Table Temp N-Table Xe Temp T-Table k with IF k with IF k with IF and Temp T-Table Temp N-Table k with IF k with IF k with IF and Temp N-Table Xe k with IF and k with IF and - Temp T-Table Temp N-Table T-Table k with IF and k with IF and - Temp T-Table Temp N-Table DROP TEMPORARY TABLE IF EXISTS: ------------------------------- (STATEMENT) Temp T-table Temp N-Table Xe Temp T-Table k k k Temp N-Table k k k Xe k k k (ROW) Temp T-Table Temp N-Table Xe Temp T-Table k with IF k with IF k with IF and Temp T-Table Temp N-Table k with IF k with IF k with IF and Temp N-Table Xe k with IF and k with IF and - Temp T-Table Temp N-Table T-Table k with IF and k with IF and - Temp T-Table Temp N-Table DROP TABLE: ----------- (STATEMENT) Temp T-Table Temp N-Table Xe Temp T-Table y y y with error Temp N-Table y y y with error Xe y with error y with error - T-Table y y y with error N-Table y y y with error (ROW) Temp T-Table Temp N-Table Xe Temp T-Table k with IF k with IF . k with IF and Temp T-Table . y with error and Xe Temp N-Table k with IF k with IF . k with IF and Temp N-Table . y with error and Xe Xe . k with IF and . k with IF and - Temp T-Table Temp N-Table . y with error . y with error and Xe and Xe T-Table . k with IF and . k with IF and y with error Temp T-Table Temp N-Table . y and T-Table . y and T-Table N-Table . k with IF and . k with IF and y with error Temp T-Table Temp N-Table . y and N-Table . y and N-Table DROP TABLE IF EXISTS: --------------------- (STATEMENT) Temp T-Table Temp N-Table Xe Temp T-Table y y y Temp N-Table y y y Xe y y - T-Table y y y N-Table y y y (ROW) Temp T-Table Temp N-Table Xe Temp T-Table k with IF k with IF . k with IF and Temp T-Table . y and Xe Temp N-Table k with IF k with IF . k with IF and Temp N-Table . y and Xe Xe . k with IF and . k with IF and y Temp T-Table Temp N-Table . y and Xe . y and Xe T-Table . k with IF and . k with IF and y Temp T-Table Temp N-Table . y and T-Table . y and T-Table N-Table . k with IF and . k with IF and y Temp T-Table Temp N-Table . y and N-Table . y and N-Table LEGEND: ------- . k - DROP TEMPORARY [IF EXISTS] . y - DROP [IF EXISTS]
TEST CASES: =========== We should add the following files: . an engine to processes commands involving temporary tables in order to ease the creation of different permutations. mysql-test/extra/rpl_tests/rpl_drop_create_temp_table.inc . definition of the permutations: mysql-test/extra/rpl_tests/rpl_drop_create_temp_table.test . test cases that call the rpl_drop_create_temp_table.test for the different logging formats: mysql-test/suite/rpl/t/rpl_mixed_drop_create_temp_table.test mysql-test/suite/rpl/t/rpl_row_drop_create_temp_table.test mysql-test/suite/rpl/t/rpl_stm_drop_create_temp_table.test . their result files: mysql-test/suite/rpl/r/rpl_mixed_drop_create_temp_table.result mysql-test/suite/rpl/r/rpl_row_drop_create_temp_table.result mysql-test/suite/rpl/r/rpl_stm_drop_create_temp_table.result We should remove the following tests that were temporarily introduced while this worklog was not ready: mysql-test/suite/rpl/t/rpl_temp_temporary.test mysql-test/suite/rpl/t/rpl_temp_temporary-master.opt mysql-test/suite/rpl/r/rpl_temp_temporary.result The engine allows the following commands: B - Begin C - Commit R - Rollback T - Inserts a row into a T-table N-Temp - Inserts a row into a temporary N-table. T-SELECT-N-Temp - Selects from a temporary N-table and inserts into a T-table. N-SELECT-N-Temp - Selects from a temporary N-table and inserts into a N-table. T-SELECT-T-Temp - Selects from a temporary T-table and inserts into a T-table. N-SELECT-T-Temp - Selects from a temporary T-table and inserts into a N-table. Create-N-Temp - Creates a temporary N-table if a temporary N-table was dropped before Create-T-Temp - Creates a temporary T-table if a temporary T-table was dropped before Drop-Temp-T-Temp - Drops a temporary T-table if there is any Drop-Temp-N-Temp - Drops a temporary N-table if there is any Drop-Temp-TN-Temp - Drops both a temporary T-table and N-table if there is any Drop-Temp-TT-Temp - Drops two temporary T-tables if there is any Drop-Temp-NN-Temp - Drops two temporary N-tables if there is any Drop-Temp-Xe-Temp - Tries to drop a temporary table that does not exist Drop-Temp-NXe-Temp - Drops a temporary N-table if there is any and a temporary table that does not exist Drop-Temp-TXe-Temp - Drops a temporary T-table if there is any and a temporary table that does not exist Drop-Temp-If-Xe-Temp - Tries to drop a temporary table that does not exist Drop-Temp-If-TXe-Temp - Drops a temporary T-table if there is any and a temporary table that does not exist Drop-T - Drops a T-table if there is any Drop-N - Drops a N-table if there is any Drop-Xe - Tries to drop a table that does not exist Drop-TXe - Drops a T-table if there is any and a table that does not exist Drop-NXe - Drops a N-table if there is any and a table that does not exist Drop-TN - Drops both a T-table and N-table if there is any Drop-TT - Drops two T-tables if there is any Drop-NN - Drops two N-tables if there is any Drop-N-TN-Temp - Drops a N-table and both a temporary T-table and N-table if there is any Drop-If-Xe - Tries to drop a table that does not exist Drop-If-TXe - Drops a T-table if there is any and a table that does not exist Drop-If-NXe - Drops a N-table if there is any and a table that does not exist
Copyright (c) 2000, 2024, Oracle Corporation and/or its affiliates. All rights reserved.