mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
40d72add32
from 5.1 to 5.5 (Former 59405) In this bug, args[0] in an Item_func_find_in_set stored an Item_func_weekday that was constant. In Item_func_find_in_set::fix_length_and_dec(), args[0]->val_str() was called. Later, when Item_func_find_in_set::val_int() was called, args[0]->null_value was checked. However, the Item_func_weekday in args[0] had now been replaced with an Item_cache. No val_*() calls had been made to this Item_cache, thus null_value was incorrectly 'true', resulting in missing rows in the result set. enum_value gets a value in fix_length_and_dec() iff args[0] is both constant and non-null. It is therefore unnecessary to check the null_value of args[0] in val_int(). An alternative fix would be to call args[0]->val_int() inside Item_func_find_in_set::val_int(). This would ensure args[0]->null_value was set correctly (always false in this case), but that would have to be done for every record this const value is checked against.
203 lines
7.5 KiB
Text
203 lines
7.5 KiB
Text
select interval(55,10,20,30,40,50,60,70,80,90,100),interval(3,1,1+1,1+1+1+1),field("IBM","NCA","ICL","SUN","IBM","DIGITAL"),field("A","B","C"),elt(2,"ONE","TWO","THREE"),interval(0,1,2,3,4),elt(1,1,2,3)|0,elt(1,1.1,1.2,1.3)+0;
|
|
interval(55,10,20,30,40,50,60,70,80,90,100) interval(3,1,1+1,1+1+1+1) field("IBM","NCA","ICL","SUN","IBM","DIGITAL") field("A","B","C") elt(2,"ONE","TWO","THREE") interval(0,1,2,3,4) elt(1,1,2,3)|0 elt(1,1.1,1.2,1.3)+0
|
|
5 2 4 0 TWO 0 1 1.1
|
|
explain extended select INTERVAL(55,10,20,30,40,50,60,70,80,90,100),interval(3,1,1+1,1+1+1+1),field("IBM","NCA","ICL","SUN","IBM","DIGITAL"),field("A","B","C"),elt(2,"ONE","TWO","THREE"),interval(0,1,2,3,4),elt(1,1,2,3)|0,elt(1,1.1,1.2,1.3)+0;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
Warnings:
|
|
Note 1003 select interval((55,10,20,30,40,50,60,70,80,90,100)) AS `INTERVAL(55,10,20,30,40,50,60,70,80,90,100)`,interval((3,1,(1 + 1),(((1 + 1) + 1) + 1))) AS `interval(3,1,1+1,1+1+1+1)`,field('IBM','NCA','ICL','SUN','IBM','DIGITAL') AS `field("IBM","NCA","ICL","SUN","IBM","DIGITAL")`,field('A','B','C') AS `field("A","B","C")`,elt(2,'ONE','TWO','THREE') AS `elt(2,"ONE","TWO","THREE")`,interval((0,1,2,3,4)) AS `interval(0,1,2,3,4)`,(elt(1,1,2,3) | 0) AS `elt(1,1,2,3)|0`,(elt(1,1.1,1.2,1.3) + 0) AS `elt(1,1.1,1.2,1.3)+0`
|
|
SELECT INTERVAL(13, 7, 14, 21, 28, 35, 42, 49, 56);
|
|
INTERVAL(13, 7, 14, 21, 28, 35, 42, 49, 56)
|
|
1
|
|
SELECT INTERVAL(13, 7, 14, 21, 28, 35, 42, 49, 56, 77);
|
|
INTERVAL(13, 7, 14, 21, 28, 35, 42, 49, 56, 77)
|
|
1
|
|
select find_in_set("b","a,b,c"),find_in_set("c","a,b,c"),find_in_set("dd","a,bbb,dd"),find_in_set("bbb","a,bbb,dd");
|
|
find_in_set("b","a,b,c") find_in_set("c","a,b,c") find_in_set("dd","a,bbb,dd") find_in_set("bbb","a,bbb,dd")
|
|
2 3 3 2
|
|
select find_in_set("d","a,b,c"),find_in_set("dd","a,bbb,d"),find_in_set("bb","a,bbb,dd");
|
|
find_in_set("d","a,b,c") find_in_set("dd","a,bbb,d") find_in_set("bb","a,bbb,dd")
|
|
0 0 0
|
|
select make_set(0,'a','b','c'),make_set(-1,'a','b','c'),make_set(1,'a','b','c'),make_set(2,'a','b','c'),make_set(1+2,concat('a','b'),'c');
|
|
make_set(0,'a','b','c') make_set(-1,'a','b','c') make_set(1,'a','b','c') make_set(2,'a','b','c') make_set(1+2,concat('a','b'),'c')
|
|
a,b,c a b ab,c
|
|
select make_set(NULL,'a','b','c'),make_set(1|4,'a',NULL,'c'),make_set(1+2,'a',NULL,'c');
|
|
make_set(NULL,'a','b','c') make_set(1|4,'a',NULL,'c') make_set(1+2,'a',NULL,'c')
|
|
NULL a,c a
|
|
select export_set(9,"Y","N","-",5),export_set(9,"Y","N"),export_set(9,"Y","N","");
|
|
export_set(9,"Y","N","-",5) export_set(9,"Y","N") export_set(9,"Y","N","")
|
|
Y-N-N-Y-N Y,N,N,Y,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N YNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
|
|
select elt(2,1),field(NULL,"a","b","c");
|
|
elt(2,1) field(NULL,"a","b","c")
|
|
NULL 0
|
|
select field("b","a",NULL),field(1,0,NULL)+0,field(1.0,0.0,NULL)+0.0,field(1.0e1,0.0e1,NULL)+0.0e1;
|
|
field("b","a",NULL) field(1,0,NULL)+0 field(1.0,0.0,NULL)+0.0 field(1.0e1,0.0e1,NULL)+0.0e1
|
|
0 0 0.0 0
|
|
select field(NULL,"a",NULL),field(NULL,0,NULL)+0,field(NULL,0.0,NULL)+0.0,field(NULL,0.0e1,NULL)+0.0e1;
|
|
field(NULL,"a",NULL) field(NULL,0,NULL)+0 field(NULL,0.0,NULL)+0.0 field(NULL,0.0e1,NULL)+0.0e1
|
|
0 0 0.0 0
|
|
select find_in_set("","a,b,c"),find_in_set("","a,b,c,"),find_in_set("",",a,b,c");
|
|
find_in_set("","a,b,c") find_in_set("","a,b,c,") find_in_set("",",a,b,c")
|
|
0 4 1
|
|
select find_in_set("abc","abc"),find_in_set("ab","abc"),find_in_set("abcd","abc");
|
|
find_in_set("abc","abc") find_in_set("ab","abc") find_in_set("abcd","abc")
|
|
1 0 0
|
|
select interval(null, 1, 10, 100);
|
|
interval(null, 1, 10, 100)
|
|
-1
|
|
drop table if exists t1,t2;
|
|
create table t1 (id int(10) not null unique);
|
|
create table t2 (id int(10) not null primary key, val int(10) not null);
|
|
insert into t1 values (1),(2),(4);
|
|
insert into t2 values (1,1),(2,1),(3,1),(4,2);
|
|
select one.id, elt(two.val,'one','two') from t1 one, t2 two where two.id=one.id;
|
|
id elt(two.val,'one','two')
|
|
1 one
|
|
2 one
|
|
4 two
|
|
select one.id, elt(two.val,'one','two') from t1 one, t2 two where two.id=one.id order by one.id;
|
|
id elt(two.val,'one','two')
|
|
1 one
|
|
2 one
|
|
4 two
|
|
drop table t1,t2;
|
|
select find_in_set(binary 'a',binary 'A,B,C');
|
|
find_in_set(binary 'a',binary 'A,B,C')
|
|
0
|
|
select find_in_set('a',binary 'A,B,C');
|
|
find_in_set('a',binary 'A,B,C')
|
|
0
|
|
select find_in_set(binary 'a', 'A,B,C');
|
|
find_in_set(binary 'a', 'A,B,C')
|
|
0
|
|
select find_in_set('1','3,1,');
|
|
find_in_set('1','3,1,')
|
|
2
|
|
End of 4.1 tests
|
|
SELECT INTERVAL(0.0, NULL);
|
|
INTERVAL(0.0, NULL)
|
|
1
|
|
SELECT INTERVAL(0.0, CAST(NULL AS DECIMAL));
|
|
INTERVAL(0.0, CAST(NULL AS DECIMAL))
|
|
1
|
|
SELECT INTERVAL(0.0, CAST(DATE(NULL) AS DECIMAL));
|
|
INTERVAL(0.0, CAST(DATE(NULL) AS DECIMAL))
|
|
1
|
|
SELECT INTERVAL(0.0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
|
INTERVAL(0.0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
|
|
8
|
|
SELECT INTERVAL(0.0, CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL),
|
|
CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL),
|
|
CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL));
|
|
INTERVAL(0.0, CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL),
|
|
CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL),
|
|
CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL), CAST(NULL AS DECIMAL))
|
|
8
|
|
SELECT INTERVAL(0.0, CAST(DATE(NULL) AS DECIMAL), CAST(DATE(NULL) AS DECIMAL),
|
|
CAST(DATE(NULL) AS DECIMAL), CAST(DATE(NULL) AS DECIMAL),
|
|
CAST(DATE(NULL) AS DECIMAL), CAST(DATE(NULL) AS DECIMAL),
|
|
CAST(DATE(NULL) AS DECIMAL), CAST(DATE(NULL) AS DECIMAL));
|
|
INTERVAL(0.0, CAST(DATE(NULL) AS DECIMAL), CAST(DATE(NULL) AS DECIMAL),
|
|
CAST(DATE(NULL) AS DECIMAL), CAST(DATE(NULL) AS DECIMAL),
|
|
CAST(DATE(NULL) AS DECIMAL), CAST(DATE(NULL) AS DECIMAL),
|
|
CAST(DATE(NULL) AS DECIMAL), CAST(DATE(NULL) AS DECIMAL))
|
|
8
|
|
End of 5.0 tests
|
|
drop table if exists t1;
|
|
create table t1 (f1 set('test1','test2','test3') character set utf8 default null)
|
|
engine=myisam default charset=latin1;
|
|
insert into t1 values (''),(null),(null),(''),(''),('');
|
|
select find_in_set(f1,f1) as a from t1,(select find_in_set(f1,f1) as b from t1) a;
|
|
a
|
|
0
|
|
NULL
|
|
NULL
|
|
0
|
|
0
|
|
0
|
|
0
|
|
NULL
|
|
NULL
|
|
0
|
|
0
|
|
0
|
|
0
|
|
NULL
|
|
NULL
|
|
0
|
|
0
|
|
0
|
|
0
|
|
NULL
|
|
NULL
|
|
0
|
|
0
|
|
0
|
|
0
|
|
NULL
|
|
NULL
|
|
0
|
|
0
|
|
0
|
|
0
|
|
NULL
|
|
NULL
|
|
0
|
|
0
|
|
0
|
|
drop table t1;
|
|
CREATE TABLE t1( a SET('a', 'b', 'c') );
|
|
CREATE TABLE t2( a SET('a', 'b', 'c') );
|
|
INSERT INTO t1 VALUES ('d');
|
|
Warnings:
|
|
Warning 1265 Data truncated for column 'a' at row 1
|
|
INSERT INTO t2 VALUES ('');
|
|
SELECT CONVERT( a USING latin1 ) FROM t1;
|
|
CONVERT( a USING latin1 )
|
|
|
|
SELECT CONVERT( a USING latin1 ) FROM t2;
|
|
CONVERT( a USING latin1 )
|
|
|
|
DROP TABLE t1, t2;
|
|
#
|
|
# BUG#59405: FIND_IN_SET won't work normaly after upgrade from 5.1 to 5.5
|
|
#
|
|
CREATE TABLE t1(days set('1','2','3','4','5','6','7'));
|
|
INSERT INTO t1 VALUES('1,2,3,4,5,6,7'), (NULL), ('1,2,3,4,5,6,7');
|
|
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), days);
|
|
days
|
|
1,2,3,4,5,6,7
|
|
1,2,3,4,5,6,7
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), days) IS UNKNOWN;
|
|
days
|
|
NULL
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), NULL);
|
|
days
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(DAYOFWEEK(CURRENT_DATE()), NULL) IS UNKNOWN;
|
|
days
|
|
1,2,3,4,5,6,7
|
|
NULL
|
|
1,2,3,4,5,6,7
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(7, days);
|
|
days
|
|
1,2,3,4,5,6,7
|
|
1,2,3,4,5,6,7
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(8, days);
|
|
days
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(NULL, days);
|
|
days
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(NULL, days) IS UNKNOWN;
|
|
days
|
|
1,2,3,4,5,6,7
|
|
NULL
|
|
1,2,3,4,5,6,7
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(NULL, NULL);
|
|
days
|
|
SELECT * FROM t1 WHERE FIND_IN_SET(NULL, NULL) IS UNKNOWN;
|
|
days
|
|
1,2,3,4,5,6,7
|
|
NULL
|
|
1,2,3,4,5,6,7
|
|
|
|
DROP TABLE t1;
|