mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Added support for BETWEEN and IN in condition pushdown to ndbcluster by rewriting them as AND and OR expressions
This commit is contained in:
@ -251,6 +251,108 @@ auto
|
|||||||
1
|
1
|
||||||
3
|
3
|
||||||
4
|
4
|
||||||
|
select auto from t1 where
|
||||||
|
(string between "aaaa" and "cccc") and
|
||||||
|
(vstring between "aaaa" and "cccc") and
|
||||||
|
(bin between 0xAAAA and 0xCCCC) and
|
||||||
|
(vbin between 0xAAAA and 0xCCCC) and
|
||||||
|
(tiny between -3 and -1) and
|
||||||
|
(short between -3 and -1) and
|
||||||
|
(medium between -3 and -1) and
|
||||||
|
(long_int between -3 and -1) and
|
||||||
|
(longlong between -3 and -1) and
|
||||||
|
(utiny between 1 and 3) and
|
||||||
|
(ushort between 1 and 3) and
|
||||||
|
(umedium between 1 and 3) and
|
||||||
|
(ulong between 1 and 3) and
|
||||||
|
(ulonglong between 1 and 3) and
|
||||||
|
(bits between b'001' and b'011') and
|
||||||
|
(options between 'one' and 'three') and
|
||||||
|
(flags between 'one' and 'one,two,three') and
|
||||||
|
(date_field between '1901-01-01' and '1903-03-03') and
|
||||||
|
(year_field between '1901' and '1903') and
|
||||||
|
(time_field between '01:01:01' and '03:03:03') and
|
||||||
|
(date_time between '1901-01-01 01:01:01' and '1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
auto
|
||||||
|
1
|
||||||
|
3
|
||||||
|
select auto from t1 where
|
||||||
|
("aaaa" between string and string) and
|
||||||
|
("aaaa" between vstring and vstring) and
|
||||||
|
(0xAAAA between bin and bin) and
|
||||||
|
(0xAAAA between vbin and vbin) and
|
||||||
|
(-1 between tiny and tiny) and
|
||||||
|
(-1 between short and short) and
|
||||||
|
(-1 between medium and medium) and
|
||||||
|
(-1 between long_int and long_int) and
|
||||||
|
(-1 between longlong and longlong) and
|
||||||
|
(1 between utiny and utiny) and
|
||||||
|
(1 between ushort and ushort) and
|
||||||
|
(1 between umedium and umedium) and
|
||||||
|
(1 between ulong and ulong) and
|
||||||
|
(1 between ulonglong and ulonglong) and
|
||||||
|
(b'001' between bits and bits) and
|
||||||
|
('one' between options and options) and
|
||||||
|
('one' between flags and flags) and
|
||||||
|
('1901-01-01' between date_field and date_field) and
|
||||||
|
('1901' between year_field and year_field) and
|
||||||
|
('01:01:01' between time_field and time_field) and
|
||||||
|
('1901-01-01 01:01:01' between date_time and date_time)
|
||||||
|
order by auto;
|
||||||
|
auto
|
||||||
|
1
|
||||||
|
select auto from t1 where
|
||||||
|
string in("aaaa","cccc") and
|
||||||
|
vstring in("aaaa","cccc") and
|
||||||
|
bin in(0xAAAA,0xCCCC) and
|
||||||
|
vbin in(0xAAAA,0xCCCC) and
|
||||||
|
tiny in(-1,-3) and
|
||||||
|
short in(-1,-3) and
|
||||||
|
medium in(-1,-3) and
|
||||||
|
long_int in(-1,-3) and
|
||||||
|
longlong in(-1,-3) and
|
||||||
|
utiny in(1,3) and
|
||||||
|
ushort in(1,3) and
|
||||||
|
umedium in(1,3) and
|
||||||
|
ulong in(1,3) and
|
||||||
|
ulonglong in(1,3) and
|
||||||
|
bits in(b'001',b'011') and
|
||||||
|
options in('one','three') and
|
||||||
|
flags in('one','one,two,three') and
|
||||||
|
date_field in('1901-01-01','1903-03-03') and
|
||||||
|
year_field in('1901','1903') and
|
||||||
|
time_field in('01:01:01','03:03:03') and
|
||||||
|
date_time in('1901-01-01 01:01:01','1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
auto
|
||||||
|
1
|
||||||
|
3
|
||||||
|
select auto from t1 where
|
||||||
|
"aaaa" in(string) and
|
||||||
|
"aaaa" in(vstring) and
|
||||||
|
0xAAAA in(bin) and
|
||||||
|
0xAAAA in(vbin) and
|
||||||
|
/* -1 in(tiny) and */
|
||||||
|
/* -1 in (short) and */
|
||||||
|
/* -1 in(medium) and */
|
||||||
|
/* -1 in(long_int) and */
|
||||||
|
/* -1 in(longlong) and */
|
||||||
|
1 in(utiny) and
|
||||||
|
1 in(ushort) and
|
||||||
|
1 in(umedium) and
|
||||||
|
1 in(ulong) and
|
||||||
|
1 in(ulonglong) and
|
||||||
|
b'001' in(bits) and
|
||||||
|
'one' in(options) and
|
||||||
|
'one' in(flags) and
|
||||||
|
'1901-01-01' in(date_field) and
|
||||||
|
'1901' in(year_field) and
|
||||||
|
'01:01:01' in(time_field) and
|
||||||
|
'1901-01-01 01:01:01' in(date_time)
|
||||||
|
order by auto;
|
||||||
|
auto
|
||||||
|
1
|
||||||
select * from t2 where attr3 is null or attr1 > 2 and pk1= 3 order by pk1;
|
select * from t2 where attr3 is null or attr1 > 2 and pk1= 3 order by pk1;
|
||||||
pk1 attr1 attr2 attr3
|
pk1 attr1 attr2 attr3
|
||||||
2 2 NULL NULL
|
2 2 NULL NULL
|
||||||
@ -1023,6 +1125,212 @@ auto
|
|||||||
1
|
1
|
||||||
3
|
3
|
||||||
4
|
4
|
||||||
|
explain
|
||||||
|
select auto from t1 where
|
||||||
|
(string between "aaaa" and "cccc") and
|
||||||
|
(vstring between "aaaa" and "cccc") and
|
||||||
|
(bin between 0xAAAA and 0xCCCC) and
|
||||||
|
(vbin between 0xAAAA and 0xCCCC) and
|
||||||
|
(tiny between -3 and -1) and
|
||||||
|
(short between -3 and -1) and
|
||||||
|
(medium between -3 and -1) and
|
||||||
|
(long_int between -3 and -1) and
|
||||||
|
(longlong between -3 and -1) and
|
||||||
|
(utiny between 1 and 3) and
|
||||||
|
(ushort between 1 and 3) and
|
||||||
|
(umedium between 1 and 3) and
|
||||||
|
(ulong between 1 and 3) and
|
||||||
|
(ulonglong between 1 and 3) and
|
||||||
|
/* (bits between b'001' and b'011') and */
|
||||||
|
(options between 'one' and 'three') and
|
||||||
|
(flags between 'one' and 'one,two,three') and
|
||||||
|
(date_field between '1901-01-01' and '1903-03-03') and
|
||||||
|
(year_field between '1901' and '1903') and
|
||||||
|
(time_field between '01:01:01' and '03:03:03') and
|
||||||
|
(date_time between '1901-01-01 01:01:01' and '1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 range medium_index medium_index 3 NULL 10 Using where with pushed condition; Using filesort
|
||||||
|
select auto from t1 where
|
||||||
|
(string between "aaaa" and "cccc") and
|
||||||
|
(vstring between "aaaa" and "cccc") and
|
||||||
|
(bin between 0xAAAA and 0xCCCC) and
|
||||||
|
(vbin between 0xAAAA and 0xCCCC) and
|
||||||
|
(tiny between -3 and -1) and
|
||||||
|
(short between -3 and -1) and
|
||||||
|
(medium between -3 and -1) and
|
||||||
|
(long_int between -3 and -1) and
|
||||||
|
(longlong between -3 and -1) and
|
||||||
|
(utiny between 1 and 3) and
|
||||||
|
(ushort between 1 and 3) and
|
||||||
|
(umedium between 1 and 3) and
|
||||||
|
(ulong between 1 and 3) and
|
||||||
|
(ulonglong between 1 and 3) and
|
||||||
|
/* (bits between b'001' and b'011') and */
|
||||||
|
(options between 'one' and 'three') and
|
||||||
|
(flags between 'one' and 'one,two,three') and
|
||||||
|
(date_field between '1901-01-01' and '1903-03-03') and
|
||||||
|
(year_field between '1901' and '1903') and
|
||||||
|
(time_field between '01:01:01' and '03:03:03') and
|
||||||
|
(date_time between '1901-01-01 01:01:01' and '1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
auto
|
||||||
|
1
|
||||||
|
3
|
||||||
|
explain
|
||||||
|
select auto from t1 where
|
||||||
|
("aaaa" between string and string) and
|
||||||
|
("aaaa" between vstring and vstring) and
|
||||||
|
(0xAAAA between bin and bin) and
|
||||||
|
(0xAAAA between vbin and vbin) and
|
||||||
|
(-1 between tiny and tiny) and
|
||||||
|
(-1 between short and short) and
|
||||||
|
(-1 between medium and medium) and
|
||||||
|
(-1 between long_int and long_int) and
|
||||||
|
(-1 between longlong and longlong) and
|
||||||
|
(1 between utiny and utiny) and
|
||||||
|
(1 between ushort and ushort) and
|
||||||
|
(1 between umedium and umedium) and
|
||||||
|
(1 between ulong and ulong) and
|
||||||
|
(1 between ulonglong and ulonglong) and
|
||||||
|
/* (b'001' between bits and bits) and */
|
||||||
|
('one' between options and options) and
|
||||||
|
('one' between flags and flags) and
|
||||||
|
('1901-01-01' between date_field and date_field) and
|
||||||
|
('1901' between year_field and year_field) and
|
||||||
|
('01:01:01' between time_field and time_field) and
|
||||||
|
('1901-01-01 01:01:01' between date_time and date_time)
|
||||||
|
order by auto;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where with pushed condition; Using filesort
|
||||||
|
select auto from t1 where
|
||||||
|
("aaaa" between string and string) and
|
||||||
|
("aaaa" between vstring and vstring) and
|
||||||
|
(0xAAAA between bin and bin) and
|
||||||
|
(0xAAAA between vbin and vbin) and
|
||||||
|
(-1 between tiny and tiny) and
|
||||||
|
(-1 between short and short) and
|
||||||
|
(-1 between medium and medium) and
|
||||||
|
(-1 between long_int and long_int) and
|
||||||
|
(-1 between longlong and longlong) and
|
||||||
|
(1 between utiny and utiny) and
|
||||||
|
(1 between ushort and ushort) and
|
||||||
|
(1 between umedium and umedium) and
|
||||||
|
(1 between ulong and ulong) and
|
||||||
|
(1 between ulonglong and ulonglong) and
|
||||||
|
/* (b'001' between bits and bits) and */
|
||||||
|
('one' between options and options) and
|
||||||
|
('one' between flags and flags) and
|
||||||
|
('1901-01-01' between date_field and date_field) and
|
||||||
|
('1901' between year_field and year_field) and
|
||||||
|
('01:01:01' between time_field and time_field) and
|
||||||
|
('1901-01-01 01:01:01' between date_time and date_time)
|
||||||
|
order by auto;
|
||||||
|
auto
|
||||||
|
1
|
||||||
|
explain
|
||||||
|
select auto from t1 where
|
||||||
|
string in("aaaa","cccc") and
|
||||||
|
vstring in("aaaa","cccc") and
|
||||||
|
bin in(0xAAAA,0xCCCC) and
|
||||||
|
vbin in(0xAAAA,0xCCCC) and
|
||||||
|
tiny in(-1,-3) and
|
||||||
|
short in(-1,-3) and
|
||||||
|
medium in(-1,-3) and
|
||||||
|
long_int in(-1,-3) and
|
||||||
|
longlong in(-1,-3) and
|
||||||
|
utiny in(1,3) and
|
||||||
|
ushort in(1,3) and
|
||||||
|
umedium in(1,3) and
|
||||||
|
ulong in(1,3) and
|
||||||
|
ulonglong in(1,3) and
|
||||||
|
/* bits in(b'001',b'011') and */
|
||||||
|
options in('one','three') and
|
||||||
|
flags in('one','one,two,three') and
|
||||||
|
date_field in('1901-01-01','1903-03-03') and
|
||||||
|
year_field in('1901','1903') and
|
||||||
|
time_field in('01:01:01','03:03:03') and
|
||||||
|
date_time in('1901-01-01 01:01:01','1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 range medium_index medium_index 3 NULL 20 Using where with pushed condition; Using filesort
|
||||||
|
select auto from t1 where
|
||||||
|
string in("aaaa","cccc") and
|
||||||
|
vstring in("aaaa","cccc") and
|
||||||
|
bin in(0xAAAA,0xCCCC) and
|
||||||
|
vbin in(0xAAAA,0xCCCC) and
|
||||||
|
tiny in(-1,-3) and
|
||||||
|
short in(-1,-3) and
|
||||||
|
medium in(-1,-3) and
|
||||||
|
long_int in(-1,-3) and
|
||||||
|
longlong in(-1,-3) and
|
||||||
|
utiny in(1,3) and
|
||||||
|
ushort in(1,3) and
|
||||||
|
umedium in(1,3) and
|
||||||
|
ulong in(1,3) and
|
||||||
|
ulonglong in(1,3) and
|
||||||
|
/* bits in(b'001',b'011') and */
|
||||||
|
options in('one','three') and
|
||||||
|
flags in('one','one,two,three') and
|
||||||
|
date_field in('1901-01-01','1903-03-03') and
|
||||||
|
year_field in('1901','1903') and
|
||||||
|
time_field in('01:01:01','03:03:03') and
|
||||||
|
date_time in('1901-01-01 01:01:01','1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
auto
|
||||||
|
1
|
||||||
|
3
|
||||||
|
explain
|
||||||
|
select auto from t1 where
|
||||||
|
"aaaa" in(string) and
|
||||||
|
"aaaa" in(vstring) and
|
||||||
|
0xAAAA in(bin) and
|
||||||
|
0xAAAA in(vbin) and
|
||||||
|
/* -1 in(tiny) and */
|
||||||
|
/* -1 in (short) and */
|
||||||
|
/* -1 in(medium) and */
|
||||||
|
/* -1 in(long_int) and */
|
||||||
|
/* -1 in(longlong) and */
|
||||||
|
1 in(utiny) and
|
||||||
|
1 in(ushort) and
|
||||||
|
1 in(umedium) and
|
||||||
|
1 in(ulong) and
|
||||||
|
1 in(ulonglong) and
|
||||||
|
/* b'001' in(bits) and */
|
||||||
|
'one' in(options) and
|
||||||
|
'one' in(flags) and
|
||||||
|
'1901-01-01' in(date_field) and
|
||||||
|
'1901' in(year_field) and
|
||||||
|
'01:01:01' in(time_field) and
|
||||||
|
'1901-01-01 01:01:01' in(date_time)
|
||||||
|
order by auto;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where with pushed condition; Using filesort
|
||||||
|
select auto from t1 where
|
||||||
|
"aaaa" in(string) and
|
||||||
|
"aaaa" in(vstring) and
|
||||||
|
0xAAAA in(bin) and
|
||||||
|
0xAAAA in(vbin) and
|
||||||
|
/* -1 in(tiny) and */
|
||||||
|
/* -1 in (short) and */
|
||||||
|
/* -1 in(medium) and */
|
||||||
|
/* -1 in(long_int) and */
|
||||||
|
/* -1 in(longlong) and */
|
||||||
|
1 in(utiny) and
|
||||||
|
1 in(ushort) and
|
||||||
|
1 in(umedium) and
|
||||||
|
1 in(ulong) and
|
||||||
|
1 in(ulonglong) and
|
||||||
|
/* b'001' in(bits) and */
|
||||||
|
'one' in(options) and
|
||||||
|
'one' in(flags) and
|
||||||
|
'1901-01-01' in(date_field) and
|
||||||
|
'1901' in(year_field) and
|
||||||
|
'01:01:01' in(time_field) and
|
||||||
|
'1901-01-01 01:01:01' in(date_time)
|
||||||
|
order by auto;
|
||||||
|
auto
|
||||||
|
1
|
||||||
update t1
|
update t1
|
||||||
set medium = 17
|
set medium = 17
|
||||||
where
|
where
|
||||||
@ -1138,7 +1446,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
explain
|
explain
|
||||||
select * from t2 where (attr1 < 2) = (attr2 < 2) order by pk1;
|
select * from t2 where (attr1 < 2) = (attr2 < 2) order by pk1;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 6 Using where; Using filesort
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 6 Using where with pushed condition; Using filesort
|
||||||
explain
|
explain
|
||||||
select * from t3 left join t4 on t4.attr2 = t3.attr2 where t4.attr1 > 1 and t4.attr3 < 5 or t4.attr1 is null order by t4.pk1;
|
select * from t3 left join t4 on t4.attr2 = t3.attr2 where t4.attr1 > 1 and t4.attr3 < 5 or t4.attr1 is null order by t4.pk1;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
@ -249,6 +249,104 @@ bin not like concat(0xBB, '%') and
|
|||||||
vbin not like concat(0xBB, '%')
|
vbin not like concat(0xBB, '%')
|
||||||
order by auto;
|
order by auto;
|
||||||
|
|
||||||
|
# BETWEEN
|
||||||
|
select auto from t1 where
|
||||||
|
(string between "aaaa" and "cccc") and
|
||||||
|
(vstring between "aaaa" and "cccc") and
|
||||||
|
(bin between 0xAAAA and 0xCCCC) and
|
||||||
|
(vbin between 0xAAAA and 0xCCCC) and
|
||||||
|
(tiny between -3 and -1) and
|
||||||
|
(short between -3 and -1) and
|
||||||
|
(medium between -3 and -1) and
|
||||||
|
(long_int between -3 and -1) and
|
||||||
|
(longlong between -3 and -1) and
|
||||||
|
(utiny between 1 and 3) and
|
||||||
|
(ushort between 1 and 3) and
|
||||||
|
(umedium between 1 and 3) and
|
||||||
|
(ulong between 1 and 3) and
|
||||||
|
(ulonglong between 1 and 3) and
|
||||||
|
(bits between b'001' and b'011') and
|
||||||
|
(options between 'one' and 'three') and
|
||||||
|
(flags between 'one' and 'one,two,three') and
|
||||||
|
(date_field between '1901-01-01' and '1903-03-03') and
|
||||||
|
(year_field between '1901' and '1903') and
|
||||||
|
(time_field between '01:01:01' and '03:03:03') and
|
||||||
|
(date_time between '1901-01-01 01:01:01' and '1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
select auto from t1 where
|
||||||
|
("aaaa" between string and string) and
|
||||||
|
("aaaa" between vstring and vstring) and
|
||||||
|
(0xAAAA between bin and bin) and
|
||||||
|
(0xAAAA between vbin and vbin) and
|
||||||
|
(-1 between tiny and tiny) and
|
||||||
|
(-1 between short and short) and
|
||||||
|
(-1 between medium and medium) and
|
||||||
|
(-1 between long_int and long_int) and
|
||||||
|
(-1 between longlong and longlong) and
|
||||||
|
(1 between utiny and utiny) and
|
||||||
|
(1 between ushort and ushort) and
|
||||||
|
(1 between umedium and umedium) and
|
||||||
|
(1 between ulong and ulong) and
|
||||||
|
(1 between ulonglong and ulonglong) and
|
||||||
|
(b'001' between bits and bits) and
|
||||||
|
('one' between options and options) and
|
||||||
|
('one' between flags and flags) and
|
||||||
|
('1901-01-01' between date_field and date_field) and
|
||||||
|
('1901' between year_field and year_field) and
|
||||||
|
('01:01:01' between time_field and time_field) and
|
||||||
|
('1901-01-01 01:01:01' between date_time and date_time)
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
# IN
|
||||||
|
select auto from t1 where
|
||||||
|
string in("aaaa","cccc") and
|
||||||
|
vstring in("aaaa","cccc") and
|
||||||
|
bin in(0xAAAA,0xCCCC) and
|
||||||
|
vbin in(0xAAAA,0xCCCC) and
|
||||||
|
tiny in(-1,-3) and
|
||||||
|
short in(-1,-3) and
|
||||||
|
medium in(-1,-3) and
|
||||||
|
long_int in(-1,-3) and
|
||||||
|
longlong in(-1,-3) and
|
||||||
|
utiny in(1,3) and
|
||||||
|
ushort in(1,3) and
|
||||||
|
umedium in(1,3) and
|
||||||
|
ulong in(1,3) and
|
||||||
|
ulonglong in(1,3) and
|
||||||
|
bits in(b'001',b'011') and
|
||||||
|
options in('one','three') and
|
||||||
|
flags in('one','one,two,three') and
|
||||||
|
date_field in('1901-01-01','1903-03-03') and
|
||||||
|
year_field in('1901','1903') and
|
||||||
|
time_field in('01:01:01','03:03:03') and
|
||||||
|
date_time in('1901-01-01 01:01:01','1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
select auto from t1 where
|
||||||
|
"aaaa" in(string) and
|
||||||
|
"aaaa" in(vstring) and
|
||||||
|
0xAAAA in(bin) and
|
||||||
|
0xAAAA in(vbin) and
|
||||||
|
/* -1 in(tiny) and */
|
||||||
|
/* -1 in (short) and */
|
||||||
|
/* -1 in(medium) and */
|
||||||
|
/* -1 in(long_int) and */
|
||||||
|
/* -1 in(longlong) and */
|
||||||
|
1 in(utiny) and
|
||||||
|
1 in(ushort) and
|
||||||
|
1 in(umedium) and
|
||||||
|
1 in(ulong) and
|
||||||
|
1 in(ulonglong) and
|
||||||
|
b'001' in(bits) and
|
||||||
|
'one' in(options) and
|
||||||
|
'one' in(flags) and
|
||||||
|
'1901-01-01' in(date_field) and
|
||||||
|
'1901' in(year_field) and
|
||||||
|
'01:01:01' in(time_field) and
|
||||||
|
'1901-01-01 01:01:01' in(date_time)
|
||||||
|
order by auto;
|
||||||
|
|
||||||
# Various tests
|
# Various tests
|
||||||
select * from t2 where attr3 is null or attr1 > 2 and pk1= 3 order by pk1;
|
select * from t2 where attr3 is null or attr1 > 2 and pk1= 3 order by pk1;
|
||||||
select * from t2 where attr3 is not null and attr1 > 2 order by pk1;
|
select * from t2 where attr3 is not null and attr1 > 2 order by pk1;
|
||||||
@ -955,6 +1053,204 @@ bin not like concat(0xBB, '%') and
|
|||||||
vbin not like concat(0xBB, '%')
|
vbin not like concat(0xBB, '%')
|
||||||
order by auto;
|
order by auto;
|
||||||
|
|
||||||
|
# BETWEEN
|
||||||
|
explain
|
||||||
|
select auto from t1 where
|
||||||
|
(string between "aaaa" and "cccc") and
|
||||||
|
(vstring between "aaaa" and "cccc") and
|
||||||
|
(bin between 0xAAAA and 0xCCCC) and
|
||||||
|
(vbin between 0xAAAA and 0xCCCC) and
|
||||||
|
(tiny between -3 and -1) and
|
||||||
|
(short between -3 and -1) and
|
||||||
|
(medium between -3 and -1) and
|
||||||
|
(long_int between -3 and -1) and
|
||||||
|
(longlong between -3 and -1) and
|
||||||
|
(utiny between 1 and 3) and
|
||||||
|
(ushort between 1 and 3) and
|
||||||
|
(umedium between 1 and 3) and
|
||||||
|
(ulong between 1 and 3) and
|
||||||
|
(ulonglong between 1 and 3) and
|
||||||
|
/* (bits between b'001' and b'011') and */
|
||||||
|
(options between 'one' and 'three') and
|
||||||
|
(flags between 'one' and 'one,two,three') and
|
||||||
|
(date_field between '1901-01-01' and '1903-03-03') and
|
||||||
|
(year_field between '1901' and '1903') and
|
||||||
|
(time_field between '01:01:01' and '03:03:03') and
|
||||||
|
(date_time between '1901-01-01 01:01:01' and '1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
select auto from t1 where
|
||||||
|
(string between "aaaa" and "cccc") and
|
||||||
|
(vstring between "aaaa" and "cccc") and
|
||||||
|
(bin between 0xAAAA and 0xCCCC) and
|
||||||
|
(vbin between 0xAAAA and 0xCCCC) and
|
||||||
|
(tiny between -3 and -1) and
|
||||||
|
(short between -3 and -1) and
|
||||||
|
(medium between -3 and -1) and
|
||||||
|
(long_int between -3 and -1) and
|
||||||
|
(longlong between -3 and -1) and
|
||||||
|
(utiny between 1 and 3) and
|
||||||
|
(ushort between 1 and 3) and
|
||||||
|
(umedium between 1 and 3) and
|
||||||
|
(ulong between 1 and 3) and
|
||||||
|
(ulonglong between 1 and 3) and
|
||||||
|
/* (bits between b'001' and b'011') and */
|
||||||
|
(options between 'one' and 'three') and
|
||||||
|
(flags between 'one' and 'one,two,three') and
|
||||||
|
(date_field between '1901-01-01' and '1903-03-03') and
|
||||||
|
(year_field between '1901' and '1903') and
|
||||||
|
(time_field between '01:01:01' and '03:03:03') and
|
||||||
|
(date_time between '1901-01-01 01:01:01' and '1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
explain
|
||||||
|
select auto from t1 where
|
||||||
|
("aaaa" between string and string) and
|
||||||
|
("aaaa" between vstring and vstring) and
|
||||||
|
(0xAAAA between bin and bin) and
|
||||||
|
(0xAAAA between vbin and vbin) and
|
||||||
|
(-1 between tiny and tiny) and
|
||||||
|
(-1 between short and short) and
|
||||||
|
(-1 between medium and medium) and
|
||||||
|
(-1 between long_int and long_int) and
|
||||||
|
(-1 between longlong and longlong) and
|
||||||
|
(1 between utiny and utiny) and
|
||||||
|
(1 between ushort and ushort) and
|
||||||
|
(1 between umedium and umedium) and
|
||||||
|
(1 between ulong and ulong) and
|
||||||
|
(1 between ulonglong and ulonglong) and
|
||||||
|
/* (b'001' between bits and bits) and */
|
||||||
|
('one' between options and options) and
|
||||||
|
('one' between flags and flags) and
|
||||||
|
('1901-01-01' between date_field and date_field) and
|
||||||
|
('1901' between year_field and year_field) and
|
||||||
|
('01:01:01' between time_field and time_field) and
|
||||||
|
('1901-01-01 01:01:01' between date_time and date_time)
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
select auto from t1 where
|
||||||
|
("aaaa" between string and string) and
|
||||||
|
("aaaa" between vstring and vstring) and
|
||||||
|
(0xAAAA between bin and bin) and
|
||||||
|
(0xAAAA between vbin and vbin) and
|
||||||
|
(-1 between tiny and tiny) and
|
||||||
|
(-1 between short and short) and
|
||||||
|
(-1 between medium and medium) and
|
||||||
|
(-1 between long_int and long_int) and
|
||||||
|
(-1 between longlong and longlong) and
|
||||||
|
(1 between utiny and utiny) and
|
||||||
|
(1 between ushort and ushort) and
|
||||||
|
(1 between umedium and umedium) and
|
||||||
|
(1 between ulong and ulong) and
|
||||||
|
(1 between ulonglong and ulonglong) and
|
||||||
|
/* (b'001' between bits and bits) and */
|
||||||
|
('one' between options and options) and
|
||||||
|
('one' between flags and flags) and
|
||||||
|
('1901-01-01' between date_field and date_field) and
|
||||||
|
('1901' between year_field and year_field) and
|
||||||
|
('01:01:01' between time_field and time_field) and
|
||||||
|
('1901-01-01 01:01:01' between date_time and date_time)
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
# IN
|
||||||
|
explain
|
||||||
|
select auto from t1 where
|
||||||
|
string in("aaaa","cccc") and
|
||||||
|
vstring in("aaaa","cccc") and
|
||||||
|
bin in(0xAAAA,0xCCCC) and
|
||||||
|
vbin in(0xAAAA,0xCCCC) and
|
||||||
|
tiny in(-1,-3) and
|
||||||
|
short in(-1,-3) and
|
||||||
|
medium in(-1,-3) and
|
||||||
|
long_int in(-1,-3) and
|
||||||
|
longlong in(-1,-3) and
|
||||||
|
utiny in(1,3) and
|
||||||
|
ushort in(1,3) and
|
||||||
|
umedium in(1,3) and
|
||||||
|
ulong in(1,3) and
|
||||||
|
ulonglong in(1,3) and
|
||||||
|
/* bits in(b'001',b'011') and */
|
||||||
|
options in('one','three') and
|
||||||
|
flags in('one','one,two,three') and
|
||||||
|
date_field in('1901-01-01','1903-03-03') and
|
||||||
|
year_field in('1901','1903') and
|
||||||
|
time_field in('01:01:01','03:03:03') and
|
||||||
|
date_time in('1901-01-01 01:01:01','1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
select auto from t1 where
|
||||||
|
string in("aaaa","cccc") and
|
||||||
|
vstring in("aaaa","cccc") and
|
||||||
|
bin in(0xAAAA,0xCCCC) and
|
||||||
|
vbin in(0xAAAA,0xCCCC) and
|
||||||
|
tiny in(-1,-3) and
|
||||||
|
short in(-1,-3) and
|
||||||
|
medium in(-1,-3) and
|
||||||
|
long_int in(-1,-3) and
|
||||||
|
longlong in(-1,-3) and
|
||||||
|
utiny in(1,3) and
|
||||||
|
ushort in(1,3) and
|
||||||
|
umedium in(1,3) and
|
||||||
|
ulong in(1,3) and
|
||||||
|
ulonglong in(1,3) and
|
||||||
|
/* bits in(b'001',b'011') and */
|
||||||
|
options in('one','three') and
|
||||||
|
flags in('one','one,two,three') and
|
||||||
|
date_field in('1901-01-01','1903-03-03') and
|
||||||
|
year_field in('1901','1903') and
|
||||||
|
time_field in('01:01:01','03:03:03') and
|
||||||
|
date_time in('1901-01-01 01:01:01','1903-03-03 03:03:03')
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
explain
|
||||||
|
select auto from t1 where
|
||||||
|
"aaaa" in(string) and
|
||||||
|
"aaaa" in(vstring) and
|
||||||
|
0xAAAA in(bin) and
|
||||||
|
0xAAAA in(vbin) and
|
||||||
|
/* -1 in(tiny) and */
|
||||||
|
/* -1 in (short) and */
|
||||||
|
/* -1 in(medium) and */
|
||||||
|
/* -1 in(long_int) and */
|
||||||
|
/* -1 in(longlong) and */
|
||||||
|
1 in(utiny) and
|
||||||
|
1 in(ushort) and
|
||||||
|
1 in(umedium) and
|
||||||
|
1 in(ulong) and
|
||||||
|
1 in(ulonglong) and
|
||||||
|
/* b'001' in(bits) and */
|
||||||
|
'one' in(options) and
|
||||||
|
'one' in(flags) and
|
||||||
|
'1901-01-01' in(date_field) and
|
||||||
|
'1901' in(year_field) and
|
||||||
|
'01:01:01' in(time_field) and
|
||||||
|
'1901-01-01 01:01:01' in(date_time)
|
||||||
|
order by auto;
|
||||||
|
|
||||||
|
select auto from t1 where
|
||||||
|
"aaaa" in(string) and
|
||||||
|
"aaaa" in(vstring) and
|
||||||
|
0xAAAA in(bin) and
|
||||||
|
0xAAAA in(vbin) and
|
||||||
|
/* -1 in(tiny) and */
|
||||||
|
/* -1 in (short) and */
|
||||||
|
/* -1 in(medium) and */
|
||||||
|
/* -1 in(long_int) and */
|
||||||
|
/* -1 in(longlong) and */
|
||||||
|
1 in(utiny) and
|
||||||
|
1 in(ushort) and
|
||||||
|
1 in(umedium) and
|
||||||
|
1 in(ulong) and
|
||||||
|
1 in(ulonglong) and
|
||||||
|
/* b'001' in(bits) and */
|
||||||
|
'one' in(options) and
|
||||||
|
'one' in(flags) and
|
||||||
|
'1901-01-01' in(date_field) and
|
||||||
|
'1901' in(year_field) and
|
||||||
|
'01:01:01' in(time_field) and
|
||||||
|
'1901-01-01 01:01:01' in(date_time)
|
||||||
|
order by auto;
|
||||||
|
|
||||||
# Update test
|
# Update test
|
||||||
update t1
|
update t1
|
||||||
set medium = 17
|
set medium = 17
|
||||||
|
1286
sql/ha_ndbcluster.cc
1286
sql/ha_ndbcluster.cc
File diff suppressed because it is too large
Load Diff
@ -86,6 +86,7 @@ typedef struct ndb_item_field_value {
|
|||||||
typedef union ndb_item_value {
|
typedef union ndb_item_value {
|
||||||
const Item *item;
|
const Item *item;
|
||||||
NDB_ITEM_FIELD_VALUE *field_value;
|
NDB_ITEM_FIELD_VALUE *field_value;
|
||||||
|
uint arg_count;
|
||||||
} NDB_ITEM_VALUE;
|
} NDB_ITEM_VALUE;
|
||||||
|
|
||||||
struct negated_function_mapping
|
struct negated_function_mapping
|
||||||
@ -144,6 +145,7 @@ class Ndb_item {
|
|||||||
}
|
}
|
||||||
case(NDB_FUNCTION):
|
case(NDB_FUNCTION):
|
||||||
value.item= item_value;
|
value.item= item_value;
|
||||||
|
value.arg_count= ((Item_func *) item_value)->argument_count();
|
||||||
break;
|
break;
|
||||||
case(NDB_END_COND):
|
case(NDB_END_COND):
|
||||||
break;
|
break;
|
||||||
@ -162,6 +164,13 @@ class Ndb_item {
|
|||||||
{
|
{
|
||||||
qualification.function_type= func_type;
|
qualification.function_type= func_type;
|
||||||
value.item= item_value;
|
value.item= item_value;
|
||||||
|
value.arg_count= ((Item_func *) item_value)->argument_count();
|
||||||
|
};
|
||||||
|
Ndb_item(Item_func::Functype func_type, uint no_args)
|
||||||
|
: type(NDB_FUNCTION)
|
||||||
|
{
|
||||||
|
qualification.function_type= func_type;
|
||||||
|
value.arg_count= no_args;
|
||||||
};
|
};
|
||||||
~Ndb_item()
|
~Ndb_item()
|
||||||
{
|
{
|
||||||
@ -194,7 +203,7 @@ class Ndb_item {
|
|||||||
|
|
||||||
int argument_count()
|
int argument_count()
|
||||||
{
|
{
|
||||||
return ((Item_func *) value.item)->argument_count();
|
return value.arg_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* get_val()
|
const char* get_val()
|
||||||
@ -273,12 +282,28 @@ class Ndb_cond_stack
|
|||||||
{
|
{
|
||||||
if (ndb_cond) delete ndb_cond;
|
if (ndb_cond) delete ndb_cond;
|
||||||
ndb_cond= NULL;
|
ndb_cond= NULL;
|
||||||
|
if (next) delete next;
|
||||||
next= NULL;
|
next= NULL;
|
||||||
};
|
};
|
||||||
Ndb_cond *ndb_cond;
|
Ndb_cond *ndb_cond;
|
||||||
Ndb_cond_stack *next;
|
Ndb_cond_stack *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Ndb_rewrite_context
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Ndb_rewrite_context(Item_func *func)
|
||||||
|
: func_item(func), left_hand_item(NULL), count(0) {};
|
||||||
|
~Ndb_rewrite_context()
|
||||||
|
{
|
||||||
|
if (next) delete next;
|
||||||
|
}
|
||||||
|
const Item_func *func_item;
|
||||||
|
const Item *left_hand_item;
|
||||||
|
uint count;
|
||||||
|
Ndb_rewrite_context *next;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This class is used for storing the context when traversing
|
This class is used for storing the context when traversing
|
||||||
the Item tree. It stores a reference to the table the condition
|
the Item tree. It stores a reference to the table the condition
|
||||||
@ -292,11 +317,16 @@ class Ndb_cond_traverse_context
|
|||||||
Ndb_cond_traverse_context(TABLE *tab, void* ndb_tab, Ndb_cond_stack* stack)
|
Ndb_cond_traverse_context(TABLE *tab, void* ndb_tab, Ndb_cond_stack* stack)
|
||||||
: table(tab), ndb_table(ndb_tab),
|
: table(tab), ndb_table(ndb_tab),
|
||||||
supported(TRUE), stack_ptr(stack), cond_ptr(NULL),
|
supported(TRUE), stack_ptr(stack), cond_ptr(NULL),
|
||||||
expect_mask(0), expect_field_result_mask(0), skip(0), collation(NULL)
|
expect_mask(0), expect_field_result_mask(0), skip(0), collation(NULL),
|
||||||
|
rewrite_stack(NULL)
|
||||||
{
|
{
|
||||||
if (stack)
|
if (stack)
|
||||||
cond_ptr= stack->ndb_cond;
|
cond_ptr= stack->ndb_cond;
|
||||||
};
|
};
|
||||||
|
~Ndb_cond_traverse_context()
|
||||||
|
{
|
||||||
|
if (rewrite_stack) delete rewrite_stack;
|
||||||
|
}
|
||||||
void expect(Item::Type type)
|
void expect(Item::Type type)
|
||||||
{
|
{
|
||||||
expect_mask|= (1 << type);
|
expect_mask|= (1 << type);
|
||||||
@ -357,7 +387,7 @@ class Ndb_cond_traverse_context
|
|||||||
uint expect_field_result_mask;
|
uint expect_field_result_mask;
|
||||||
uint skip;
|
uint skip;
|
||||||
CHARSET_INFO* collation;
|
CHARSET_INFO* collation;
|
||||||
|
Ndb_rewrite_context *rewrite_stack;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user