################################################################################ # # Part of checking that REPEATABLE-READ transactions are indeed repeatable read. # # This test executes several queries in the same transaction which should return # the exact same results. Some of the queries will use LIMIT, others will not. # # In order to trigger Falcon's LIMIT optimization we need to ORDER BY an indexed # column, use a WHERE range predicate and include the LIMIT keyword. # ################################################################################ SET autocommit = 0; START TRANSACTION; --echo Comparing results from 2 queries (unless we deadlock or some such)... # Without LIMIT let $query= SELECT * FROM t1 WHERE `pk` > 1000 ORDER BY `int1_key`; --echo *** Query 1: $query --source suite/engines/rr_trx/include/record_query_all_columns.inc --echo *** Filler: SELECT SLEEP(1); # With LIMIT. We assume that t1 will not have more than rows. # With some large limit, just to exercise the optimization but return the same results: let $query= SELECT * FROM t1 WHERE `pk` > 1000 ORDER BY `int1_key` LIMIT 987654321; --echo *** Query 2: $query # Disable warnings (due to warning about unsafe binlogging with LIMIT). --disable_warnings --source suite/engines/rr_trx/include/record_query_all_columns.inc --enable_warnings --echo *** Filler: Do something other than sleep while waiting for other transactions to do stuff... CREATE TEMPORARY TABLE tmpSelectLimitNoLimit (a INT, b VARCHAR(255), c TIMESTAMP, KEY(a)); INSERT INTO tmpSelectLimitNoLimit VALUES (-1, 'This is a filler', NOW()), (0, 'More stuff', NOW()), (999999999, 'Even more bogus data', NOW()), (-98765, 'Even more bogus data', NOW()); SELECT * FROM tmpSelectLimitNoLimit WHERE a < -99999999 ORDER BY a; # With LIMIT. let $query= SELECT * FROM t1 WHERE `pk` > 1000 ORDER BY `int1_key` LIMIT 987654321; --echo *** Query 3: $query --disable_warnings --source suite/engines/rr_trx/include/record_query_all_columns.inc --enable_warnings --echo *** Filler: UPDATE tmpSelectLimitNoLimit SET a = 3; SELECT SLEEP(1); #Without LIMIT: let $query= SELECT * FROM t1 WHERE `pk` > 1000 ORDER BY `int1_key`; --echo *** Query 4: $query --source suite/engines/rr_trx/include/record_query_all_columns.inc # Compare queries --source suite/engines/rr_trx/include/check_repeatable_read_all_columns.inc COMMIT;