# # Bug#38691 segfault/abort in ``UPDATE ...JOIN'' while # ``FLUSH TABLES WITH READ LOCK'' # MySQL >= 5.0 # # The test can take hours with valgrind --source include/not_valgrind.inc # Save the initial number of concurrent sessions --source include/count_sessions.inc SET @odl_sync_frm = @@global.sync_frm; SET @@global.sync_frm = OFF; # Test to see if select will get the lock ahead of low priority update connect (locker,localhost,root,,); connect (writer,localhost,root,,); --connection default --disable_warnings DROP TABLE IF EXISTS t1,t2,t3; --enable_warnings CREATE TABLE t1 ( a int(11) unsigned default NULL, b varchar(255) default NULL, UNIQUE KEY a (a), KEY b (b) ); INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3); CREATE TABLE t2 SELECT * FROM t1; CREATE TABLE t3 SELECT * FROM t1; --echo # test altering of columns that multiupdate doesn't use --echo # normal mode --disable_query_log let $i = 100; while ($i) { --dec $i --connection writer send UPDATE t2 INNER JOIN (t1 JOIN t3 USING(a)) USING(a) SET a = NULL WHERE t1.b <> t2.b; --connection locker ALTER TABLE t2 ADD COLUMN (c INT), LOCK=SHARED; ALTER TABLE t2 DROP COLUMN c, LOCK=SHARED; --connection writer --reap } --echo # PS mode --connection writer PREPARE stmt FROM 'UPDATE t2 INNER JOIN (t1 JOIN t3 USING(a)) USING(a) SET a = NULL WHERE t1.b <> t2.b'; let $i = 100; while ($i) { --dec $i --connection writer --send EXECUTE stmt --connection locker ALTER TABLE t2 ADD COLUMN (c INT), LOCK=SHARED; ALTER TABLE t2 DROP COLUMN c, LOCK=SHARED; --connection writer --reap } --enable_query_log --echo # test altering of columns that multiupdate uses --echo # normal mode --connection default --disable_query_log let $i = 100; while ($i) { dec $i; --connection locker --error 0,ER_DUP_FIELDNAME ALTER TABLE t2 ADD COLUMN a int(11) unsigned default NULL, LOCK=SHARED; UPDATE t2 SET a=b; --connection writer --send UPDATE t2 INNER JOIN (t1 JOIN t3 USING(a)) USING(a) SET a = NULL WHERE t1.b <> t2.b --connection locker --error 0,ER_CANT_DROP_FIELD_OR_KEY ALTER TABLE t2 DROP COLUMN a, LOCK=SHARED; --connection writer --error 0,ER_BAD_FIELD_ERROR --reap } --enable_query_log --echo # PS mode --disable_query_log let $i = 100; while ($i) { dec $i; --connection locker --error 0,ER_DUP_FIELDNAME ALTER TABLE t2 ADD COLUMN a int(11) unsigned default NULL, LOCK=SHARED; UPDATE t2 SET a=b; --connection writer PREPARE stmt FROM 'UPDATE t2 INNER JOIN (t1 JOIN t3 USING(a)) USING(a) SET a = NULL WHERE t1.b <> t2.b'; --send EXECUTE stmt --connection locker --error 0,ER_CANT_DROP_FIELD_OR_KEY ALTER TABLE t2 DROP COLUMN a, LOCK=SHARED; --connection writer --error 0,ER_BAD_FIELD_ERROR --reap } --enable_query_log --connection default DROP TABLE t1, t2, t3; # Close connections --disconnect locker --disconnect writer SET @@global.sync_frm = @odl_sync_frm; # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc