psergey@psergey-desktop:~/dev-git/mysql-5.7/mysql-test$ ./mysqld --defaults-file=~/my-local.cnf -bash: ./mysqld: No such file or directory psergey@psergey-desktop:~/dev-git/mysql-5.7/mysql-test$ ./mysql-test-run t/mdev10649.test Logging: ./mysql-test-run t/mdev10649.test MySQL Version 5.7.15 Checking supported features... - SSL connections supported - binaries are debug compiled Collecting tests... Checking leftover processes... Removing old var directory... Creating var directory '/home/psergey/dev-git/mysql-5.7/mysql-test/var'... Installing system database... Using parallel: 1 ============================================================================== TEST RESULT TIME (ms) or COMMENT -------------------------------------------------------------------------- worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009 set @stats_backup= @@innodb_stats_persistent; set @dbug_backup= @@debug; set global innodb_stats_persistent=ON; CREATE TABLE t1 ( pk bigint(20) unsigned NOT NULL, key1 int, col1 int, filler1 varchar(255), filler2 text, PRIMARY KEY (pk), KEY (key1) ) ENGINE=InnoDB; create table ten(a int primary key); insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); insert into t1 (pk, key1) select A.a+10*B.a+100*C.a+1000*D.a, A.a+10*B.a+100*C.a+1000*D.a from ten A, ten B, ten C, ten D; select count(*) from t1; count(*) 10000 # # Normal plan for UPDATE: # explain extended UPDATE t1 SET col1 = 1234 WHERE pk IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20); id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 UPDATE t1 NULL range PRIMARY PRIMARY 8 const 20 100.00 Using where Warnings: Warning 1681 'EXTENDED' is deprecated and will be removed in a future release. # # Check that it lives up to the plan: # flush status; UPDATE t1 SET col1 = 1234 WHERE pk IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20); show status like 'Handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 20 Handler_read_last 0 Handler_read_next 0 Handler_read_prev 0 Handler_read_rnd 0 Handler_read_rnd_next 0 # # Now let's trigger the race condition. # # First, we need to activate the sleep in dict_stats_update: # set global debug= '+d,innodb_wait_with_empty_stats'; set debug= '+d,innodb_wait_with_empty_stats'; # # The sync point is only needed if we want to reproduce the printout from the patch, # where Records == Records2 == 1 and Records3 is the real number. # Without the printing patch the sync point won't make any difference. set debug_sync= 'opt_range_wait_for_innodb_stats WAIT_FOR go'; # flush status; connect con1,localhost,root,,; # # Get the table evicted from the cache; # flush tables with read lock; unlock tables; # # Insert something into the table to trigger a call to dict_stats_update, # which will in turn trigger a call to dict_stats_empty_table and then will repopulate statistics. # Only we have a big delay between the call to dict_stats_empty_table and repopulating statistics, so it will wait there. # We are sending the INSERT now... insert into t1 (pk,key1,col1) select pk+100000, 345,345 from t1 limit 2000; connection default; # # Wait a bit to make sure the insert reached the injected sleep... # # Now, run our UPDATE. The table right now has "empty" statistics, which will give us 1 row, and full scan will be preferred. # Since we might have enabled the sync point, the UPDATE will wait for a signal after it has done the quick check. # We are sending the UPDATE now... # UPDATE t1 SET col1 = 1234 WHERE pk IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20); connection con1; # # Now wait for INSERT to finish, and send the signal to UPDATE to proceed (in case it's waiting on the sync point) # set debug_sync= 'now SIGNAL go'; connection default; # Now the UPDATE is finished too. This is how it ran: # show status like 'Handler_read%'; Variable_name Value Handler_read_first 1 Handler_read_key 1 Handler_read_last 0 Handler_read_next 0 Handler_read_prev 0 Handler_read_rnd 0 Handler_read_rnd_next 12001 # # Cleanup # disconnect con1; connection default; drop table t1; drop table ten; set global innodb_stats_persistent= @stats_backup; set global debug= @dbug_backup; set debug_sync= 'RESET'; main.mdev10649 [ fail ] Found warnings/errors in server log file! Test ended at 2016-09-12 13:32:46 line 2016-09-12T10:32:45.613779Z 3 [Warning] DEBUG: Full table scan on table t1. Reason: 'quick == 0' Records2: 1 Records3: 12337 Optimizer_flag: 523775 Query: UPDATE t1 SET col1 = 1234 WHERE pk IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20) ^ Found warnings in /home/psergey/dev-git/mysql-5.7/mysql-test/var/log/mysqld.1.err ok - the logfile can be found in '/home/psergey/dev-git/mysql-5.7/mysql-test/var/log/main.mdev10649/mdev10649.log' -------------------------------------------------------------------------- The servers were restarted 0 times Spent 0.000 of 51 seconds executing testcases mysql-test-run: WARNING: Got errors/warnings while running tests, please examine '/home/psergey/dev-git/mysql-5.7/mysql-test/var/log/warnings' for details. Completed: Failed 1/1 tests, 0.00% were successful. Failing test(s): main.mdev10649 The log files in var/log may give you some hint of what went wrong. If you want to report this error, please read first the documentation at http://dev.mysql.com/doc/mysql/en/mysql-test-suite.html mysql-test-run: *** ERROR: there were failing test cases psergey@psergey-desktop:~/dev-git/mysql-5.7/mysql-test$ ../sql/mysqld -V