147 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			147 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#38691 segfault/abort in ``UPDATE ...JOIN'' while
							 | 
						||
| 
								 | 
							
								#           ``FLUSH TABLES WITH READ LOCK''
							 | 
						||
| 
								 | 
							
								# MySQL >= 5.0
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# 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);
							 | 
						||
| 
								 | 
							
								  ALTER TABLE t2 DROP COLUMN c;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--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);
							 | 
						||
| 
								 | 
							
								  ALTER TABLE t2 DROP COLUMN c;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--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;
							 | 
						||
| 
								 | 
							
								  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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--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;
							 | 
						||
| 
								 | 
							
								  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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--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
							 | 
						||
| 
								 | 
							
								
							 |