mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 14:54:20 +01:00
be75593165
Several problems here : 1. The conversion to double of an hex string const item was not taking into account the unsigned flag. 2. IN was not behaving in the same was way as comparisons when performed over an INT/DATE/DATETIME/TIMESTAMP column and a constant. The ordinary comparisons in that case convert the constant to an INTEGER value and do int comparisons. Fixed the IN to do the same. 3. IN is not taking into account the unsigned flag when calculating <expr> IN (<int_const1>, <int_const2>, ...). Extended the implementation of IN to store and process the unsigned flag for its arguments.
467 lines
12 KiB
Text
467 lines
12 KiB
Text
drop table if exists t1, t2;
|
||
select 1 in (1,2,3);
|
||
1 in (1,2,3)
|
||
1
|
||
select 10 in (1,2,3);
|
||
10 in (1,2,3)
|
||
0
|
||
select NULL in (1,2,3);
|
||
NULL in (1,2,3)
|
||
NULL
|
||
select 1 in (1,NULL,3);
|
||
1 in (1,NULL,3)
|
||
1
|
||
select 3 in (1,NULL,3);
|
||
3 in (1,NULL,3)
|
||
1
|
||
select 10 in (1,NULL,3);
|
||
10 in (1,NULL,3)
|
||
NULL
|
||
select 1.5 in (1.5,2.5,3.5);
|
||
1.5 in (1.5,2.5,3.5)
|
||
1
|
||
select 10.5 in (1.5,2.5,3.5);
|
||
10.5 in (1.5,2.5,3.5)
|
||
0
|
||
select NULL in (1.5,2.5,3.5);
|
||
NULL in (1.5,2.5,3.5)
|
||
NULL
|
||
select 1.5 in (1.5,NULL,3.5);
|
||
1.5 in (1.5,NULL,3.5)
|
||
1
|
||
select 3.5 in (1.5,NULL,3.5);
|
||
3.5 in (1.5,NULL,3.5)
|
||
1
|
||
select 10.5 in (1.5,NULL,3.5);
|
||
10.5 in (1.5,NULL,3.5)
|
||
NULL
|
||
CREATE TABLE t1 (a int, b int, c int);
|
||
insert into t1 values (1,2,3), (1,NULL,3);
|
||
select 1 in (a,b,c) from t1;
|
||
1 in (a,b,c)
|
||
1
|
||
1
|
||
select 3 in (a,b,c) from t1;
|
||
3 in (a,b,c)
|
||
1
|
||
1
|
||
select 10 in (a,b,c) from t1;
|
||
10 in (a,b,c)
|
||
0
|
||
NULL
|
||
select NULL in (a,b,c) from t1;
|
||
NULL in (a,b,c)
|
||
NULL
|
||
NULL
|
||
drop table t1;
|
||
CREATE TABLE t1 (a float, b float, c float);
|
||
insert into t1 values (1.5,2.5,3.5), (1.5,NULL,3.5);
|
||
select 1.5 in (a,b,c) from t1;
|
||
1.5 in (a,b,c)
|
||
1
|
||
1
|
||
select 3.5 in (a,b,c) from t1;
|
||
3.5 in (a,b,c)
|
||
1
|
||
1
|
||
select 10.5 in (a,b,c) from t1;
|
||
10.5 in (a,b,c)
|
||
0
|
||
NULL
|
||
drop table t1;
|
||
CREATE TABLE t1 (a varchar(10), b varchar(10), c varchar(10));
|
||
insert into t1 values ('A','BC','EFD'), ('A',NULL,'EFD');
|
||
select 'A' in (a,b,c) from t1;
|
||
'A' in (a,b,c)
|
||
1
|
||
1
|
||
select 'EFD' in (a,b,c) from t1;
|
||
'EFD' in (a,b,c)
|
||
1
|
||
1
|
||
select 'XSFGGHF' in (a,b,c) from t1;
|
||
'XSFGGHF' in (a,b,c)
|
||
0
|
||
NULL
|
||
drop table t1;
|
||
CREATE TABLE t1 (field char(1));
|
||
INSERT INTO t1 VALUES ('A'),(NULL);
|
||
SELECT * from t1 WHERE field IN (NULL);
|
||
field
|
||
SELECT * from t1 WHERE field NOT IN (NULL);
|
||
field
|
||
SELECT * from t1 where field = field;
|
||
field
|
||
A
|
||
SELECT * from t1 where field <=> field;
|
||
field
|
||
A
|
||
NULL
|
||
DELETE FROM t1 WHERE field NOT IN (NULL);
|
||
SELECT * FROM t1;
|
||
field
|
||
A
|
||
NULL
|
||
drop table t1;
|
||
create table t1 (id int(10) primary key);
|
||
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||
select * from t1 where id in (2,5,9);
|
||
id
|
||
2
|
||
5
|
||
9
|
||
drop table t1;
|
||
create table t1 (
|
||
a char(1) character set latin1 collate latin1_general_ci,
|
||
b char(1) character set latin1 collate latin1_swedish_ci,
|
||
c char(1) character set latin1 collate latin1_danish_ci
|
||
);
|
||
insert into t1 values ('A','B','C');
|
||
insert into t1 values ('a','c','c');
|
||
select * from t1 where a in (b);
|
||
ERROR HY000: Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='
|
||
select * from t1 where a in (b,c);
|
||
ERROR HY000: Illegal mix of collations (latin1_general_ci,IMPLICIT), (latin1_swedish_ci,IMPLICIT), (latin1_danish_ci,IMPLICIT) for operation ' IN '
|
||
select * from t1 where 'a' in (a,b,c);
|
||
ERROR HY000: Illegal mix of collations for operation ' IN '
|
||
select * from t1 where 'a' in (a);
|
||
a b c
|
||
A B C
|
||
a c c
|
||
select * from t1 where a in ('a');
|
||
a b c
|
||
A B C
|
||
a c c
|
||
select * from t1 where 'a' collate latin1_general_ci in (a,b,c);
|
||
a b c
|
||
A B C
|
||
a c c
|
||
select * from t1 where 'a' collate latin1_bin in (a,b,c);
|
||
a b c
|
||
a c c
|
||
select * from t1 where 'a' in (a,b,c collate latin1_bin);
|
||
a b c
|
||
a c c
|
||
explain extended select * from t1 where 'a' in (a,b,c collate latin1_bin);
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
|
||
Warnings:
|
||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t1` where (_latin1'a' in (`test`.`t1`.`a`,`test`.`t1`.`b`,(`test`.`t1`.`c` collate latin1_bin)))
|
||
drop table t1;
|
||
set names utf8;
|
||
create table t1 (a char(10) character set utf8 not null);
|
||
insert into t1 values ('bbbb'),(_koi8r'<27><><EFBFBD><EFBFBD>'),(_latin1'<27><><EFBFBD><EFBFBD>');
|
||
select a from t1 where a in ('bbbb',_koi8r'<27><><EFBFBD><EFBFBD>',_latin1'<27><><EFBFBD><EFBFBD>') order by a;
|
||
a
|
||
ÄÄÄÄ
|
||
bbbb
|
||
цццц
|
||
drop table t1;
|
||
create table t1 (a char(10) character set latin1 not null);
|
||
insert into t1 values ('a'),('b'),('c');
|
||
select a from t1 where a IN ('a','b','c') order by a;
|
||
a
|
||
a
|
||
b
|
||
c
|
||
drop table t1;
|
||
set names latin1;
|
||
select '1.0' in (1,2);
|
||
'1.0' in (1,2)
|
||
1
|
||
select 1 in ('1.0',2);
|
||
1 in ('1.0',2)
|
||
1
|
||
select 1 in (1,'2.0');
|
||
1 in (1,'2.0')
|
||
1
|
||
select 1 in ('1.0',2.0);
|
||
1 in ('1.0',2.0)
|
||
1
|
||
select 1 in (1.0,'2.0');
|
||
1 in (1.0,'2.0')
|
||
1
|
||
select 1 in ('1.1',2);
|
||
1 in ('1.1',2)
|
||
0
|
||
select 1 in ('1.1',2.0);
|
||
1 in ('1.1',2.0)
|
||
0
|
||
create table t1 (a char(2) character set binary);
|
||
insert into t1 values ('aa'), ('bb');
|
||
select * from t1 where a in (NULL, 'aa');
|
||
a
|
||
aa
|
||
drop table t1;
|
||
create table t1 (id int, key(id));
|
||
insert into t1 values (1),(2),(3);
|
||
select count(*) from t1 where id not in (1);
|
||
count(*)
|
||
2
|
||
select count(*) from t1 where id not in (1,2);
|
||
count(*)
|
||
1
|
||
drop table t1;
|
||
DROP TABLE IF EXISTS t1;
|
||
CREATE TABLE t1 SELECT 1 IN (2, NULL);
|
||
SELECT should return NULL.
|
||
SELECT * FROM t1;
|
||
1 IN (2, NULL)
|
||
NULL
|
||
DROP TABLE t1;
|
||
End of 4.1 tests
|
||
CREATE TABLE t1 (a int PRIMARY KEY);
|
||
INSERT INTO t1 VALUES (44), (45), (46);
|
||
SELECT * FROM t1 WHERE a IN (45);
|
||
a
|
||
45
|
||
SELECT * FROM t1 WHERE a NOT IN (0, 45);
|
||
a
|
||
44
|
||
46
|
||
SELECT * FROM t1 WHERE a NOT IN (45);
|
||
a
|
||
44
|
||
46
|
||
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a NOT IN (45);
|
||
SHOW CREATE VIEW v1;
|
||
View Create View
|
||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` where (`t1`.`a` <> 45)
|
||
SELECT * FROM v1;
|
||
a
|
||
44
|
||
46
|
||
DROP VIEW v1;
|
||
DROP TABLE t1;
|
||
create table t1 (a int);
|
||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||
create table t2 (a int, filler char(200), key(a));
|
||
insert into t2 select C.a*2, 'no' from t1 A, t1 B, t1 C;
|
||
insert into t2 select C.a*2+1, 'yes' from t1 C;
|
||
explain
|
||
select * from t2 where a NOT IN (0, 2,4,6,8,10,12,14,16,18);
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 SIMPLE t2 range a a 5 NULL 12 Using where
|
||
select * from t2 where a NOT IN (0, 2,4,6,8,10,12,14,16,18);
|
||
a filler
|
||
1 yes
|
||
3 yes
|
||
5 yes
|
||
7 yes
|
||
9 yes
|
||
11 yes
|
||
13 yes
|
||
15 yes
|
||
17 yes
|
||
19 yes
|
||
explain select * from t2 force index(a) where a NOT IN (2,2,2,2,2,2);
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 SIMPLE t2 range a a 5 NULL 912 Using where
|
||
explain select * from t2 force index(a) where a <> 2;
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 SIMPLE t2 range a a 5 NULL 912 Using where
|
||
drop table t2;
|
||
create table t2 (a datetime, filler char(200), key(a));
|
||
insert into t2 select '2006-04-25 10:00:00' + interval C.a minute,
|
||
'no' from t1 A, t1 B, t1 C where C.a % 2 = 0;
|
||
insert into t2 select '2006-04-25 10:00:00' + interval C.a*2+1 minute,
|
||
'yes' from t1 C;
|
||
explain
|
||
select * from t2 where a NOT IN (
|
||
'2006-04-25 10:00:00','2006-04-25 10:02:00','2006-04-25 10:04:00',
|
||
'2006-04-25 10:06:00', '2006-04-25 10:08:00');
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 SIMPLE t2 range a a 9 NULL 18 Using where
|
||
select * from t2 where a NOT IN (
|
||
'2006-04-25 10:00:00','2006-04-25 10:02:00','2006-04-25 10:04:00',
|
||
'2006-04-25 10:06:00', '2006-04-25 10:08:00');
|
||
a filler
|
||
2006-04-25 10:01:00 yes
|
||
2006-04-25 10:03:00 yes
|
||
2006-04-25 10:05:00 yes
|
||
2006-04-25 10:07:00 yes
|
||
2006-04-25 10:09:00 yes
|
||
2006-04-25 10:11:00 yes
|
||
2006-04-25 10:13:00 yes
|
||
2006-04-25 10:15:00 yes
|
||
2006-04-25 10:17:00 yes
|
||
2006-04-25 10:19:00 yes
|
||
drop table t2;
|
||
create table t2 (a varchar(10), filler char(200), key(a));
|
||
insert into t2 select 'foo', 'no' from t1 A, t1 B;
|
||
insert into t2 select 'barbar', 'no' from t1 A, t1 B;
|
||
insert into t2 select 'bazbazbaz', 'no' from t1 A, t1 B;
|
||
insert into t2 values ('fon', '1'), ('fop','1'), ('barbaq','1'),
|
||
('barbas','1'), ('bazbazbay', '1'),('zz','1');
|
||
explain select * from t2 where a not in('foo','barbar', 'bazbazbaz');
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 SIMPLE t2 range a a 13 NULL 7 Using where
|
||
drop table t2;
|
||
create table t2 (a decimal(10,5), filler char(200), key(a));
|
||
insert into t2 select 345.67890, 'no' from t1 A, t1 B;
|
||
insert into t2 select 43245.34, 'no' from t1 A, t1 B;
|
||
insert into t2 select 64224.56344, 'no' from t1 A, t1 B;
|
||
insert into t2 values (0, '1'), (22334.123,'1'), (33333,'1'),
|
||
(55555,'1'), (77777, '1');
|
||
explain
|
||
select * from t2 where a not in (345.67890, 43245.34, 64224.56344);
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 SIMPLE t2 range a a 7 NULL 7 Using where
|
||
select * from t2 where a not in (345.67890, 43245.34, 64224.56344);
|
||
a filler
|
||
0.00000 1
|
||
22334.12300 1
|
||
33333.00000 1
|
||
55555.00000 1
|
||
77777.00000 1
|
||
drop table t2;
|
||
create table t2 (a int, key(a), b int);
|
||
insert into t2 values (1,1),(2,2);
|
||
set @cnt= 1;
|
||
set @str="update t2 set b=1 where a not in (";
|
||
select count(*) from (
|
||
select @str:=concat(@str, @cnt:=@cnt+1, ",")
|
||
from t1 A, t1 B, t1 C, t1 D) Z;
|
||
count(*)
|
||
10000
|
||
set @str:=concat(@str, "10000)");
|
||
select substr(@str, 1, 50);
|
||
substr(@str, 1, 50)
|
||
update t2 set b=1 where a not in (2,3,4,5,6,7,8,9,
|
||
prepare s from @str;
|
||
execute s;
|
||
deallocate prepare s;
|
||
set @str=NULL;
|
||
drop table t2;
|
||
drop table t1;
|
||
create table t1 (
|
||
some_id smallint(5) unsigned,
|
||
key (some_id)
|
||
);
|
||
insert into t1 values (1),(2);
|
||
select some_id from t1 where some_id not in(2,-1);
|
||
some_id
|
||
1
|
||
select some_id from t1 where some_id not in(-4,-1,-4);
|
||
some_id
|
||
1
|
||
2
|
||
select some_id from t1 where some_id not in(-4,-1,3423534,2342342);
|
||
some_id
|
||
1
|
||
2
|
||
select some_id from t1 where some_id not in('-1', '0');
|
||
some_id
|
||
1
|
||
2
|
||
drop table t1;
|
||
CREATE TABLE t1 (a int, b int, PRIMARY KEY (a));
|
||
INSERT INTO t1 VALUES (1,1),(2,1),(3,1),(4,1),(5,1),(6,1);
|
||
CREATE TABLE t2 (a int, b int, PRIMARY KEY (a));
|
||
INSERT INTO t2 VALUES (3,2),(4,2);
|
||
CREATE TABLE t3 (a int PRIMARY KEY);
|
||
INSERT INTO t3 VALUES (1),(2),(3),(4);
|
||
CREATE TABLE t4 (a int PRIMARY KEY);
|
||
INSERT INTO t4 VALUES (1),(2);
|
||
EXPLAIN SELECT STRAIGHT_JOIN * FROM t3
|
||
JOIN t1 ON t3.a=t1.a
|
||
JOIN t2 ON t3.a=t2.a
|
||
JOIN t4 WHERE t4.a IN (t1.b, t2.b);
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 SIMPLE t3 index PRIMARY PRIMARY 4 NULL 4 Using index
|
||
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t3.a 1
|
||
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t3.a 1
|
||
1 SIMPLE t4 ALL PRIMARY NULL NULL NULL 2 Range checked for each record (index map: 0x1)
|
||
SELECT STRAIGHT_JOIN * FROM t3
|
||
JOIN t1 ON t3.a=t1.a
|
||
JOIN t2 ON t3.a=t2.a
|
||
JOIN t4 WHERE t4.a IN (t1.b, t2.b);
|
||
a a b a b a
|
||
3 3 1 3 2 1
|
||
3 3 1 3 2 2
|
||
4 4 1 4 2 1
|
||
4 4 1 4 2 2
|
||
EXPLAIN SELECT STRAIGHT_JOIN
|
||
(SELECT SUM(t4.a) FROM t4 WHERE t4.a IN (t1.b, t2.b))
|
||
FROM t3, t1, t2
|
||
WHERE t3.a=t1.a AND t3.a=t2.a;
|
||
id select_type table type possible_keys key key_len ref rows Extra
|
||
1 PRIMARY t3 index PRIMARY PRIMARY 4 NULL 4 Using index
|
||
1 PRIMARY t1 eq_ref PRIMARY PRIMARY 4 test.t3.a 1
|
||
1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 test.t3.a 1
|
||
2 DEPENDENT SUBQUERY t4 index NULL PRIMARY 4 NULL 2 Using where; Using index
|
||
SELECT STRAIGHT_JOIN
|
||
(SELECT SUM(t4.a) FROM t4 WHERE t4.a IN (t1.b, t2.b))
|
||
FROM t3, t1, t2
|
||
WHERE t3.a=t1.a AND t3.a=t2.a;
|
||
(SELECT SUM(t4.a) FROM t4 WHERE t4.a IN (t1.b, t2.b))
|
||
3
|
||
3
|
||
DROP TABLE t1,t2,t3,t4;
|
||
CREATE TABLE t1(a BIGINT UNSIGNED);
|
||
INSERT INTO t1 VALUES (0xFFFFFFFFFFFFFFFF);
|
||
SELECT * FROM t1 WHERE a=-1 OR a=-2 ;
|
||
a
|
||
SELECT * FROM t1 WHERE a IN (-1, -2);
|
||
a
|
||
CREATE TABLE t2 (a BIGINT UNSIGNED);
|
||
insert into t2 values(13491727406643098568),
|
||
(0x7fffffefffffffff),
|
||
(0x7ffffffeffffffff),
|
||
(0x7fffffffefffffff),
|
||
(0x7ffffffffeffffff),
|
||
(0x7fffffffffefffff),
|
||
(0x7ffffffffffeffff),
|
||
(0x7fffffffffffefff),
|
||
(0x7ffffffffffffeff),
|
||
(0x7fffffffffffffef),
|
||
(0x7ffffffffffffffe),
|
||
(0x7fffffffffffffff),
|
||
(0x8000000000000000),
|
||
(0x8000000000000001),
|
||
(0x8000000000000002),
|
||
(0x8000000000000300),
|
||
(0x8000000000000400),
|
||
(0x8000000000000401),
|
||
(0x8000000000004001),
|
||
(0x8000000000040001),
|
||
(0x8000000000400001),
|
||
(0x8000000004000001),
|
||
(0x8000000040000001),
|
||
(0x8000000400000001),
|
||
(0x8000004000000001),
|
||
(0x8000040000000001);
|
||
SELECT HEX(a) FROM t2 WHERE a IN (0xBB3C3E98175D33C8, 42);
|
||
HEX(a)
|
||
BB3C3E98175D33C8
|
||
SELECT HEX(a) FROM t2 WHERE a IN
|
||
(0xBB3C3E98175D33C8,
|
||
0x7fffffffffffffff,
|
||
0x8000000000000000,
|
||
0x8000000000000400,
|
||
0x8000000000000401,
|
||
42);
|
||
HEX(a)
|
||
BB3C3E98175D33C8
|
||
7FFFFFFFFFFFFFFF
|
||
8000000000000000
|
||
8000000000000400
|
||
8000000000000401
|
||
SELECT HEX(a) FROM t2 WHERE a IN (0x7fffffffffffffff,0x8000000000000001);
|
||
HEX(a)
|
||
7FFFFFFFFFFFFFFF
|
||
8000000000000001
|
||
SELECT HEX(a) FROM t2 WHERE a IN (0x7ffffffffffffffe,0x7fffffffffffffff);
|
||
HEX(a)
|
||
7FFFFFFFFFFFFFFE
|
||
7FFFFFFFFFFFFFFF
|
||
SELECT HEX(a) FROM t2 WHERE a IN (0x7ffffffffffffffe,0x7fffffffffffffff,'abc');
|
||
HEX(a)
|
||
7FFFFFFFFFFFFFFE
|
||
7FFFFFFFFFFFFFFF
|
||
CREATE TABLE t3 (a BIGINT UNSIGNED);
|
||
INSERT INTO t3 VALUES (9223372036854775551);
|
||
SELECT HEX(a) FROM t3 WHERE a IN (9223372036854775807, 42);
|
||
HEX(a)
|
||
DROP TABLE t1,t2,t3;
|
||
End of 5.0 tests
|