mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	The main idea is to exploit the fact that key scans for "key=const" return ordered sequences of rowids.
include/my_base.h:
  Added HA_EXTRA_KEYREAD_PRESERVE_FIELDS flag
include/my_bitmap.h:
  Added a couple of utility functions
include/my_sys.h:
  Added my_conunt_bits_ushort function
innobase/include/row0mysql.h:
  Added support for HA_EXTRA_KEYREAD_PRESERVE_FIELDS
innobase/row/row0sel.c:
  Added support for HA_EXTRA_KEYREAD_PRESERVE_FIELDS
mysys/my_bit.c:
  Added my_count_bits_ushort function
mysys/my_bitmap.c:
  Added a couple of utility functions
sql/ha_berkeley.cc:
  Added cmp_ref rowid comparison function.
sql/ha_berkeley.h:
  Added cmp_ref rowid comparison function.
sql/ha_heap.h:
  Added cmp_ref rowid comparison function.
sql/ha_innodb.cc:
  Added cmp_ref rowid comparison function and support from HA_EXTRA_KEYREAD_PRESERVE_FIELDS
sql/ha_innodb.h:
  Added cmp_ref rowid comparison function.
sql/handler.h:
  Added cmp_ref rowid comparison function.
sql/opt_range.cc:
  Added QUICK_ROR_{INTERSECT,UNION}_SELECT classes and related optimizer code
sql/opt_range.h:
  Added QUICK_ROR_{INTERSECT,UNION}_SELECT classes
sql/sql_delete.cc:
  Changed to use new ROWID comparison function
  also always call quick->reset() for quick selects
sql/sql_select.cc:
  Account for new quick select types
sql/sql_select.h:
  New, proper rowid ordering/comparison function to be used with Unique class etc.
sql/sql_test.cc:
  Account for new quick select types
sql/sql_update.cc:
  Account for new quick select types
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#
 | 
						|
# Test for rowid ordering (and comparison) functions.
 | 
						|
# do index_merge select for tables with PK of various types. 
 | 
						|
#
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1, t2, t3,t4;
 | 
						|
--enable_warnings
 | 
						|
 | 
						|
-- source include/have_innodb.inc
 | 
						|
 | 
						|
# Signed number as rowid 
 | 
						|
create table t1 ( 
 | 
						|
  pk1 int not NULL,
 | 
						|
  key1 int(11),
 | 
						|
  key2 int(11),
 | 
						|
  PRIMARY KEY  (pk1),
 | 
						|
  KEY key1 (key1),
 | 
						|
  KEY key2 (key2)
 | 
						|
) engine=innodb; 
 | 
						|
insert into t1 values (-5, 1, 1),
 | 
						|
  (-100, 1, 1),
 | 
						|
  (3, 1, 1),
 | 
						|
  (0, 1, 1),
 | 
						|
  (10, 1, 1);
 | 
						|
explain select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
 | 
						|
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
# Unsigned numbers as rowids 
 | 
						|
create table t1 ( 
 | 
						|
  pk1 int unsigned not NULL,
 | 
						|
  key1 int(11),
 | 
						|
  key2 int(11),
 | 
						|
  PRIMARY KEY  (pk1),
 | 
						|
  KEY key1 (key1),
 | 
						|
  KEY key2 (key2)
 | 
						|
) engine=innodb; 
 | 
						|
insert into t1 values (0, 1, 1),
 | 
						|
  (0xFFFFFFFF, 1, 1),
 | 
						|
  (0xFFFFFFFE, 1, 1),
 | 
						|
  (1, 1, 1),
 | 
						|
  (2, 1, 1);
 | 
						|
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
# Case-insensitive char(N)
 | 
						|
create table t1 ( 
 | 
						|
  pk1 char(4) not NULL,
 | 
						|
  key1 int(11),
 | 
						|
  key2 int(11),
 | 
						|
  PRIMARY KEY  (pk1),
 | 
						|
  KEY key1 (key1),
 | 
						|
  KEY key2 (key2)
 | 
						|
) engine=innodb collate latin2_general_ci;
 | 
						|
insert into t1 values ('a1', 1, 1),
 | 
						|
  ('b2', 1, 1),
 | 
						|
  ('A3', 1, 1),
 | 
						|
  ('B4', 1, 1);
 | 
						|
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
# Multi-part PK
 | 
						|
create table t1 (
 | 
						|
  pk1 int not NULL,
 | 
						|
  pk2 char(4) not NULL collate latin1_german1_ci,
 | 
						|
  pk3 char(4) not NULL collate latin1_bin,
 | 
						|
  key1 int(11),
 | 
						|
  key2 int(11),
 | 
						|
  PRIMARY KEY  (pk1,pk2,pk3),
 | 
						|
  KEY key1 (key1),
 | 
						|
  KEY key2 (key2)
 | 
						|
) engine=innodb;
 | 
						|
insert into t1 values 
 | 
						|
  (1, 'u', 'u',        1, 1),
 | 
						|
  (1, 'u', char(0xEC), 1, 1),
 | 
						|
  (1, 'u', 'x',        1, 1);
 | 
						|
insert ignore into t1 select pk1, char(0xEC), pk3, key1, key2  from t1;
 | 
						|
insert ignore into t1 select pk1, 'x', pk3, key1, key2  from t1 where pk2='u';
 | 
						|
insert ignore into t1 select 2, pk2, pk3, key1, key2  from t1;
 | 
						|
select * from t1;
 | 
						|
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
 | 
						|
 | 
						|
# Hidden PK
 | 
						|
alter table t1 drop primary key;
 | 
						|
select * from t1;
 | 
						|
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
# Variable-length PK
 | 
						|
# this is also test for Bug#2688
 | 
						|
create table t1  (
 | 
						|
  pk1 varchar(8) NOT NULL default '',
 | 
						|
  pk2 varchar(4) NOT NULL default '',
 | 
						|
  key1 int(11),
 | 
						|
  key2 int(11),
 | 
						|
  primary key(pk1, pk2),
 | 
						|
  KEY key1 (key1),
 | 
						|
  KEY key2 (key2)
 | 
						|
) engine=innodb;
 | 
						|
insert into t1 values ('','empt',2,2),
 | 
						|
  ('a','a--a',2,2),
 | 
						|
  ('bb','b--b',2,2),
 | 
						|
  ('ccc','c--c',2,2),
 | 
						|
  ('dddd','d--d',2,2);
 | 
						|
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
 | 
						|
 | 
						|
drop table t1;
 | 
						|
 |