Commit 019f7425 authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-4281 Assertion `maybe_null && item->null_value' fails in make_sortkey on...

MDEV-4281 Assertion `maybe_null && item->null_value' fails in make_sortkey on CASE with different return types, GROUP_CONCAT, GROUP BY

Fix Item::get_date() to mark the item NULL when returning an error.
parent 926b0f54
...@@ -268,37 +268,37 @@ cast(010203101112.121314 as datetime) ...@@ -268,37 +268,37 @@ cast(010203101112.121314 as datetime)
0001-02-03 10:11:12 0001-02-03 10:11:12
select cast(120010203101112.121314 as datetime); select cast(120010203101112.121314 as datetime);
cast(120010203101112.121314 as datetime) cast(120010203101112.121314 as datetime)
NULL 0000-00-00 00:00:00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '120010203101112.121314' Warning 1292 Incorrect datetime value: '120010203101112.121314'
select cast(cast(1.1 as decimal) as datetime); select cast(cast(1.1 as decimal) as datetime);
cast(cast(1.1 as decimal) as datetime) cast(cast(1.1 as decimal) as datetime)
NULL 0000-00-00 00:00:00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '1' Warning 1292 Incorrect datetime value: '1'
select cast(cast(-1.1 as decimal) as datetime); select cast(cast(-1.1 as decimal) as datetime);
cast(cast(-1.1 as decimal) as datetime) cast(cast(-1.1 as decimal) as datetime)
NULL 0000-00-00 00:00:00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '-1' Warning 1292 Incorrect datetime value: '-1'
select cast('0' as date); select cast('0' as date);
cast('0' as date) cast('0' as date)
NULL 0000-00-00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '0' Warning 1292 Incorrect datetime value: '0'
select cast('' as date); select cast('' as date);
cast('' as date) cast('' as date)
NULL 0000-00-00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '' Warning 1292 Incorrect datetime value: ''
select cast('0' as datetime); select cast('0' as datetime);
cast('0' as datetime) cast('0' as datetime)
NULL 0000-00-00 00:00:00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '0' Warning 1292 Incorrect datetime value: '0'
select cast('' as datetime); select cast('' as datetime);
cast('' as datetime) cast('' as datetime)
NULL 0000-00-00 00:00:00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '' Warning 1292 Incorrect datetime value: ''
select cast('0' as time); select cast('0' as time);
...@@ -306,7 +306,7 @@ cast('0' as time) ...@@ -306,7 +306,7 @@ cast('0' as time)
00:00:00 00:00:00
select cast('' as time); select cast('' as time);
cast('' as time) cast('' as time)
NULL 00:00:00
Warnings: Warnings:
Warning 1292 Truncated incorrect time value: '' Warning 1292 Truncated incorrect time value: ''
select cast(NULL as DATE); select cast(NULL as DATE);
...@@ -323,13 +323,13 @@ cast(NULL as BINARY) ...@@ -323,13 +323,13 @@ cast(NULL as BINARY)
NULL NULL
select cast(cast(120010203101112.121314 as double) as datetime); select cast(cast(120010203101112.121314 as double) as datetime);
cast(cast(120010203101112.121314 as double) as datetime) cast(cast(120010203101112.121314 as double) as datetime)
NULL 0000-00-00 00:00:00
select cast(cast(1.1 as double) as datetime); select cast(cast(1.1 as double) as datetime);
cast(cast(1.1 as double) as datetime) cast(cast(1.1 as double) as datetime)
0000-00-00 00:00:01 0000-00-00 00:00:01
select cast(cast(-1.1 as double) as datetime); select cast(cast(-1.1 as double) as datetime);
cast(cast(-1.1 as double) as datetime) cast(cast(-1.1 as double) as datetime)
NULL 0000-00-00 00:00:00
explain extended select cast(10 as double(5,2)); explain extended select cast(10 as double(5,2));
id select_type table type possible_keys key key_len ref rows filtered Extra 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 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
......
...@@ -586,7 +586,7 @@ TIME_FORMAT("25:00:00", '%l %p') ...@@ -586,7 +586,7 @@ TIME_FORMAT("25:00:00", '%l %p')
1 AM 1 AM
SELECT DATE_FORMAT('%Y-%m-%d %H:%i:%s', 1151414896); SELECT DATE_FORMAT('%Y-%m-%d %H:%i:%s', 1151414896);
DATE_FORMAT('%Y-%m-%d %H:%i:%s', 1151414896) DATE_FORMAT('%Y-%m-%d %H:%i:%s', 1151414896)
NULL 1151414896
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '%Y-%m-%d %H:%i:%s' Warning 1292 Incorrect datetime value: '%Y-%m-%d %H:%i:%s'
select str_to_date('04 /30/2004', '%m /%d/%Y'); select str_to_date('04 /30/2004', '%m /%d/%Y');
......
...@@ -168,7 +168,7 @@ date("1997-12-31 23:59:59.000001") ...@@ -168,7 +168,7 @@ date("1997-12-31 23:59:59.000001")
1997-12-31 1997-12-31
select date("1997-13-31 23:59:59.000001"); select date("1997-13-31 23:59:59.000001");
date("1997-13-31 23:59:59.000001") date("1997-13-31 23:59:59.000001")
NULL 0000-00-00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '1997-13-31 23:59:59.000001' Warning 1292 Incorrect datetime value: '1997-13-31 23:59:59.000001'
select time("1997-12-31 23:59:59.000001"); select time("1997-12-31 23:59:59.000001");
...@@ -176,7 +176,7 @@ time("1997-12-31 23:59:59.000001") ...@@ -176,7 +176,7 @@ time("1997-12-31 23:59:59.000001")
23:59:59.000001 23:59:59.000001
select time("1997-12-31 25:59:59.000001"); select time("1997-12-31 25:59:59.000001");
time("1997-12-31 25:59:59.000001") time("1997-12-31 25:59:59.000001")
NULL 00:00:00
Warnings: Warnings:
Warning 1292 Truncated incorrect time value: '1997-12-31 25:59:59.000001' Warning 1292 Truncated incorrect time value: '1997-12-31 25:59:59.000001'
select microsecond("1997-12-31 23:59:59.000001"); select microsecond("1997-12-31 23:59:59.000001");
......
...@@ -946,7 +946,6 @@ select f1 from t1 where cast("2006-1-1" as date) between f1 and cast('zzz' as da ...@@ -946,7 +946,6 @@ select f1 from t1 where cast("2006-1-1" as date) between f1 and cast('zzz' as da
f1 f1
Warnings: Warnings:
Warning 1292 Incorrect datetime value: 'zzz' Warning 1292 Incorrect datetime value: 'zzz'
Warning 1292 Incorrect datetime value: 'zzz'
select f1 from t1 where makedate(2006,1) between date(f1) and date(f3); select f1 from t1 where makedate(2006,1) between date(f1) and date(f3);
f1 f1
2006-01-01 2006-01-01
...@@ -1756,7 +1755,7 @@ Warnings: ...@@ -1756,7 +1755,7 @@ Warnings:
Warning 1441 Datetime function: time field overflow Warning 1441 Datetime function: time field overflow
select cast('131415.123e0' as time); select cast('131415.123e0' as time);
cast('131415.123e0' as time) cast('131415.123e0' as time)
NULL 00:00:00
Warnings: Warnings:
Warning 1292 Truncated incorrect time value: '131415.123e0' Warning 1292 Truncated incorrect time value: '131415.123e0'
select cast('2010-01-02 03:04:05' as datetime) between null and '2010-01-02 03:04:04'; select cast('2010-01-02 03:04:05' as datetime) between null and '2010-01-02 03:04:04';
...@@ -1776,12 +1775,12 @@ unix_timestamp(null) ...@@ -1776,12 +1775,12 @@ unix_timestamp(null)
NULL NULL
select truncate(date('2010-40-10'), 6); select truncate(date('2010-40-10'), 6);
truncate(date('2010-40-10'), 6) truncate(date('2010-40-10'), 6)
NULL 0.000000
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '2010-40-10' Warning 1292 Incorrect datetime value: '2010-40-10'
select extract(month from '2010-40-50'); select extract(month from '2010-40-50');
extract(month from '2010-40-50') extract(month from '2010-40-50')
NULL 0
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '2010-40-50' Warning 1292 Incorrect datetime value: '2010-40-50'
select subtime('0000-00-10 10:10:10', '30 10:00:00'); select subtime('0000-00-10 10:10:10', '30 10:00:00');
......
...@@ -1906,9 +1906,10 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (2, NULL); ...@@ -1906,9 +1906,10 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (2, NULL);
# test with an invalid date, which lead to item->null_value is set. # test with an invalid date, which lead to item->null_value is set.
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME); EXPLAIN PARTITIONS SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME);
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables 1 SIMPLE t1 p20090401 ALL NULL NULL NULL NULL 2 Using where
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '2009-04-99' Warning 1292 Incorrect datetime value: '2009-04-99'
Warning 1292 Incorrect datetime value: '2009-04-99'
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 CREATE TABLE t1
(a INT NOT NULL AUTO_INCREMENT, (a INT NOT NULL AUTO_INCREMENT,
......
...@@ -136,7 +136,7 @@ select @d:=1311; ...@@ -136,7 +136,7 @@ select @d:=1311;
1311 1311
select year(@d), month(@d), day(@d), cast(@d as date); select year(@d), month(@d), day(@d), cast(@d as date);
year(@d) month(@d) day(@d) cast(@d as date) year(@d) month(@d) day(@d) cast(@d as date)
NULL NULL NULL NULL 0 0 0 0000-00-00
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '1311' Warning 1292 Incorrect datetime value: '1311'
Warning 1292 Incorrect datetime value: '1311' Warning 1292 Incorrect datetime value: '1311'
......
...@@ -573,7 +573,7 @@ CAST('NULL' AS DATE) < CAST('2008-01-01' AS DATE) n7, ...@@ -573,7 +573,7 @@ CAST('NULL' AS DATE) < CAST('2008-01-01' AS DATE) n7,
CAST('2008-01-01' AS DATE) < CAST('NULL' AS DATE) n8, CAST('2008-01-01' AS DATE) < CAST('NULL' AS DATE) n8,
CAST('NULL' AS DATE) < CAST('NULL' AS DATE) n9; CAST('NULL' AS DATE) < CAST('NULL' AS DATE) n9;
n1 n2 n3 n4 n5 n6 n7 n8 n9 n1 n2 n3 n4 n5 n6 n7 n8 n9
0 0 1 NULL NULL NULL NULL NULL NULL 0 0 1 1 1 0 1 0 0
Warnings: Warnings:
Warning 1292 Incorrect datetime value: 'NULL' Warning 1292 Incorrect datetime value: 'NULL'
Warning 1292 Incorrect datetime value: 'NULL' Warning 1292 Incorrect datetime value: 'NULL'
...@@ -585,6 +585,8 @@ Warning 1292 Incorrect datetime value: 'NULL' ...@@ -585,6 +585,8 @@ Warning 1292 Incorrect datetime value: 'NULL'
Warning 1292 Incorrect datetime value: 'NULL' Warning 1292 Incorrect datetime value: 'NULL'
Warning 1292 Incorrect datetime value: 'NULL' Warning 1292 Incorrect datetime value: 'NULL'
Warning 1292 Incorrect datetime value: 'NULL' Warning 1292 Incorrect datetime value: 'NULL'
Warning 1292 Incorrect datetime value: 'NULL'
Warning 1292 Incorrect datetime value: 'NULL'
End of 5.0 tests End of 5.0 tests
set @org_mode=@@sql_mode; set @org_mode=@@sql_mode;
create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03'); create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03');
...@@ -651,3 +653,16 @@ SELECT * FROM t1; ...@@ -651,3 +653,16 @@ SELECT * FROM t1;
dt1 dt1
DROP TABLE t1; DROP TABLE t1;
End of 5.1 tests End of 5.1 tests
create table t1 (d date, t time) engine=myisam;
insert into t1 values ('2000-12-03','22:55:23'),('2008-05-03','10:19:31');
select case when d = '2012-12-12' then d else t end as cond, group_concat( d ) from t1 group by cond;
cond group_concat( d )
0000-00-00 00:00:00 2000-12-03
0000-00-00 00:00:00 2008-05-03
Warnings:
Warning 1292 Incorrect datetime value: '22:55:23'
Warning 1292 Incorrect datetime value: '10:19:31'
Warning 1292 Incorrect datetime value: '22:55:23'
Warning 1292 Incorrect datetime value: '10:19:31'
drop table t1;
End of 5.3 tests
...@@ -462,3 +462,14 @@ SELECT * FROM t1; ...@@ -462,3 +462,14 @@ SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
#
# MDEV-4281 Assertion `maybe_null && item->null_value' fails in make_sortkey on CASE with different return types, GROUP_CONCAT, GROUP BY
#
create table t1 (d date, t time) engine=myisam;
insert into t1 values ('2000-12-03','22:55:23'),('2008-05-03','10:19:31');
select case when d = '2012-12-12' then d else t end as cond, group_concat( d ) from t1 group by cond;
drop table t1;
--echo End of 5.3 tests
...@@ -869,7 +869,10 @@ static void make_sortkey(register SORTPARAM *param, ...@@ -869,7 +869,10 @@ static void make_sortkey(register SORTPARAM *param,
{ {
MYSQL_TIME buf; MYSQL_TIME buf;
if (item->get_date_result(&buf, TIME_FUZZY_DATE | TIME_INVALID_DATES)) if (item->get_date_result(&buf, TIME_FUZZY_DATE | TIME_INVALID_DATES))
DBUG_ASSERT(maybe_null && item->null_value); {
DBUG_ASSERT(maybe_null);
DBUG_ASSERT(item->null_value);
}
else else
value= pack_time(&buf); value= pack_time(&buf);
} }
......
...@@ -1197,11 +1197,15 @@ bool Item::get_date(MYSQL_TIME *ltime,uint fuzzydate) ...@@ -1197,11 +1197,15 @@ bool Item::get_date(MYSQL_TIME *ltime,uint fuzzydate)
DBUG_ASSERT(0); DBUG_ASSERT(0);
} }
return 0; return null_value= 0;
err: err:
/*
if the item was not null and convertion failed, we return a zero date
if allowed, otherwise - null.
*/
bzero((char*) ltime,sizeof(*ltime)); bzero((char*) ltime,sizeof(*ltime));
return 1; return null_value|= (fuzzydate & (TIME_NO_ZERO_DATE|TIME_NO_ZERO_IN_DATE));
} }
bool Item::get_seconds(ulonglong *sec, ulong *sec_part) bool Item::get_seconds(ulonglong *sec, ulong *sec_part)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment