189 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			189 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								# t/index_merge_myisam.test
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Index merge tests
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Last update:
							 | 
						||
| 
								 | 
							
								# 2006-08-07 ML test refactored (MySQL 5.1)
							 | 
						||
| 
								 | 
							
								#               Main code of several index_merge tests
							 | 
						||
| 
								 | 
							
								#                            -> include/index_merge*.inc
							 | 
						||
| 
								 | 
							
								#               wrapper t/index_merge_innodb.test sources now several 
							 | 
						||
| 
								 | 
							
								#               include/index_merge*.inc files
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let $engine_type= MyISAM;
							 | 
						||
| 
								 | 
							
								# MyISAM supports Merge tables
							 | 
						||
| 
								 | 
							
								let $merge_table_support= 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--source include/index_merge1.inc
							 | 
						||
| 
								 | 
							
								--source include/index_merge_ror.inc
							 | 
						||
| 
								 | 
							
								--source include/index_merge2.inc
							 | 
						||
| 
								 | 
							
								--source include/index_merge_2sweeps.inc
							 | 
						||
| 
								 | 
							
								--source include/index_merge_ror_cpk.inc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo #
							 | 
						||
| 
								 | 
							
								--echo # Generic @@optimizer_switch tests (move those into a separate file if
							 | 
						||
| 
								 | 
							
								--echo #  we get another @@optimizer_switch user)
							 | 
						||
| 
								 | 
							
								--echo #
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @@optimizer_switch;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge=off,index_merge_union=off';
							 | 
						||
| 
								 | 
							
								select @@optimizer_switch;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge_union=on';
							 | 
						||
| 
								 | 
							
								select @@optimizer_switch;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_sort_union=off';
							 | 
						||
| 
								 | 
							
								select @@optimizer_switch;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch=4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch=NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge=index_merge';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge=on,but...';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge=';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='on';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge=on,index_merge=off';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge_union=on,index_merge_union=default';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--error ER_WRONG_VALUE_FOR_VAR
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge=on,index_merge=off,default';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set optimizer_switch=default;
							 | 
						||
| 
								 | 
							
								set optimizer_switch='index_merge=off,index_merge_union=off,default';
							 | 
						||
| 
								 | 
							
								select @@optimizer_switch;
							 | 
						||
| 
								 | 
							
								set optimizer_switch=default;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check setting defaults for global vars
							 | 
						||
| 
								 | 
							
								select @@global.optimizer_switch;
							 | 
						||
| 
								 | 
							
								set @@global.optimizer_switch=default;
							 | 
						||
| 
								 | 
							
								select @@global.optimizer_switch;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo #
							 | 
						||
| 
								 | 
							
								--echo # Check index_merge's @@optimizer_switch flags
							 | 
						||
| 
								 | 
							
								--echo #
							 | 
						||
| 
								 | 
							
								select @@optimizer_switch;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create table t0 (a int);
							 | 
						||
| 
								 | 
							
								insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
							 | 
						||
| 
								 | 
							
								create table t1 (a int, b int, c int, filler char(100), 
							 | 
						||
| 
								 | 
							
								                 key(a), key(b), key(c));
							 | 
						||
| 
								 | 
							
								insert into t1 select 
							 | 
						||
| 
								 | 
							
								  A.a * B.a*10 + C.a*100, 
							 | 
						||
| 
								 | 
							
								  A.a * B.a*10 + C.a*100,
							 | 
						||
| 
								 | 
							
								  A.a, 
							 | 
						||
| 
								 | 
							
								  'filler'
							 | 
						||
| 
								 | 
							
								from t0 A, t0 B, t0 C; 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This should use union:
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=1 or b=1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This should use ALL:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=1 or b=1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This should use sort-union:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_union=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=1 or b=1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This will use sort-union:
							 | 
						||
| 
								 | 
							
								set optimizer_switch=default;
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a<1 or b <1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This should use ALL:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_sort_union=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a<1 or b <1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This should use ALL:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a<1 or b <1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This will use sort-union:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_union=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a<1 or b <1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 add d int, add key(d);
							 | 
						||
| 
								 | 
							
								update t1 set d=a;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This will use sort_union:
							 | 
						||
| 
								 | 
							
								set optimizer_switch=default;
							 | 
						||
| 
								 | 
							
								explain select * from t1 where (a=3 or b in (1,2)) and (c=3 or d=4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo And if we disable sort_union, union:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_sort_union=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where (a=3 or b in (1,2)) and (c=3 or d=4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Now test that intersection can be disabled
							 | 
						||
| 
								 | 
							
								create table t1 (
							 | 
						||
| 
								 | 
							
								  a int, b int, c int,
							 | 
						||
| 
								 | 
							
								  filler1 char(200), filler2 char(200), 
							 | 
						||
| 
								 | 
							
								  key(a),key(b),key(c)
							 | 
						||
| 
								 | 
							
								); 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								insert into t1 
							 | 
						||
| 
								 | 
							
								select A.a+10*B.a, A.a+10*B.a, A.a+10*B.a+100*C.a, 'foo', 'bar' 
							 | 
						||
| 
								 | 
							
								from t0 A, t0 B, t0 C, t0 D where D.a<5;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This should be intersect:
							 | 
						||
| 
								 | 
							
								set optimizer_switch=default;
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=10 and b=10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo No intersect when index_merge is disabled:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=10 and b=10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo No intersect if it is disabled:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_intersection=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=10 and b=10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo Do intersect when union was disabled
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_union=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=10 and b=10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo Do intersect when sort_union was disabled
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_sort_union=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=10 and b=10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Now take union-of-intersection and see how we can disable parts of it
							 | 
						||
| 
								 | 
							
								--echo This will use intersection inside a union:
							 | 
						||
| 
								 | 
							
								set optimizer_switch=default;
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=10 and b=10 or c=10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo Should be only union left:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_intersection=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=10 and b=10 or c=10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo This will switch to sort-union (intersection will be gone, too,
							 | 
						||
| 
								 | 
							
								--echo   thats a known limitation:
							 | 
						||
| 
								 | 
							
								set optimizer_switch='default,index_merge_union=off';
							 | 
						||
| 
								 | 
							
								explain select * from t1 where a=10 and b=10 or c=10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set optimizer_switch=default;
							 | 
						||
| 
								 | 
							
								show variables like 'optimizer_switch';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t0, t1;
							 | 
						||
| 
								 | 
							
								
							 |