MDEV-31334: Consider dates ending in 'T' as malformed
According to ISO 8601 standard, 'T' should be followed by the time of day. If a date ends with only 'T', throw an error in strict mode and a warning in other modes. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc.
This commit is contained in:
parent
22efc2c784
commit
cb2d6abae1
@ -368,6 +368,8 @@ EXTRACT(DAY FROM '01-02-03')
|
|||||||
SELECT EXTRACT(DAY FROM '24:02:03T');
|
SELECT EXTRACT(DAY FROM '24:02:03T');
|
||||||
EXTRACT(DAY FROM '24:02:03T')
|
EXTRACT(DAY FROM '24:02:03T')
|
||||||
3
|
3
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '24:02:03T'
|
||||||
SELECT EXTRACT(DAY FROM '24-02-03');
|
SELECT EXTRACT(DAY FROM '24-02-03');
|
||||||
EXTRACT(DAY FROM '24-02-03')
|
EXTRACT(DAY FROM '24-02-03')
|
||||||
3
|
3
|
||||||
@ -380,33 +382,63 @@ EXTRACT(DAY FROM '11111')
|
|||||||
SELECT TIME('2001-01-01T'), TIME('2001-01-01T ');
|
SELECT TIME('2001-01-01T'), TIME('2001-01-01T ');
|
||||||
TIME('2001-01-01T') TIME('2001-01-01T ')
|
TIME('2001-01-01T') TIME('2001-01-01T ')
|
||||||
00:00:00 00:00:00
|
00:00:00 00:00:00
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001-01-01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001-01-01T '
|
||||||
SELECT TIME('2001/01/01T'), TIME('2001/01/01T ');
|
SELECT TIME('2001/01/01T'), TIME('2001/01/01T ');
|
||||||
TIME('2001/01/01T') TIME('2001/01/01T ')
|
TIME('2001/01/01T') TIME('2001/01/01T ')
|
||||||
00:00:00 00:00:00
|
00:00:00 00:00:00
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001/01/01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001/01/01T '
|
||||||
SELECT TIME('2001:01:01T'), TIME('2001:01:01T ');
|
SELECT TIME('2001:01:01T'), TIME('2001:01:01T ');
|
||||||
TIME('2001:01:01T') TIME('2001:01:01T ')
|
TIME('2001:01:01T') TIME('2001:01:01T ')
|
||||||
00:00:00 00:00:00
|
00:00:00 00:00:00
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001:01:01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001:01:01T '
|
||||||
SELECT EXTRACT(DAY FROM '2001-01-01T'), EXTRACT(DAY FROM '2001-01-01T ');
|
SELECT EXTRACT(DAY FROM '2001-01-01T'), EXTRACT(DAY FROM '2001-01-01T ');
|
||||||
EXTRACT(DAY FROM '2001-01-01T') EXTRACT(DAY FROM '2001-01-01T ')
|
EXTRACT(DAY FROM '2001-01-01T') EXTRACT(DAY FROM '2001-01-01T ')
|
||||||
1 1
|
1 1
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001-01-01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001-01-01T '
|
||||||
SELECT EXTRACT(DAY FROM '2001/01/01T'), EXTRACT(DAY FROM '2001/01/01T ');
|
SELECT EXTRACT(DAY FROM '2001/01/01T'), EXTRACT(DAY FROM '2001/01/01T ');
|
||||||
EXTRACT(DAY FROM '2001/01/01T') EXTRACT(DAY FROM '2001/01/01T ')
|
EXTRACT(DAY FROM '2001/01/01T') EXTRACT(DAY FROM '2001/01/01T ')
|
||||||
1 1
|
1 1
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001/01/01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001/01/01T '
|
||||||
SELECT EXTRACT(DAY FROM '2001:01:01T'), EXTRACT(DAY FROM '2001:01:01T ');
|
SELECT EXTRACT(DAY FROM '2001:01:01T'), EXTRACT(DAY FROM '2001:01:01T ');
|
||||||
EXTRACT(DAY FROM '2001:01:01T') EXTRACT(DAY FROM '2001:01:01T ')
|
EXTRACT(DAY FROM '2001:01:01T') EXTRACT(DAY FROM '2001:01:01T ')
|
||||||
1 1
|
1 1
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001:01:01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001:01:01T '
|
||||||
SELECT TIME('2001:01:01T'), TIME('2001:01:01T ');
|
SELECT TIME('2001:01:01T'), TIME('2001:01:01T ');
|
||||||
TIME('2001:01:01T') TIME('2001:01:01T ')
|
TIME('2001:01:01T') TIME('2001:01:01T ')
|
||||||
00:00:00 00:00:00
|
00:00:00 00:00:00
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001:01:01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001:01:01T '
|
||||||
SELECT EXTRACT(HOUR FROM '2001-01-01T'), EXTRACT(HOUR FROM '2001-01-01T ');
|
SELECT EXTRACT(HOUR FROM '2001-01-01T'), EXTRACT(HOUR FROM '2001-01-01T ');
|
||||||
EXTRACT(HOUR FROM '2001-01-01T') EXTRACT(HOUR FROM '2001-01-01T ')
|
EXTRACT(HOUR FROM '2001-01-01T') EXTRACT(HOUR FROM '2001-01-01T ')
|
||||||
0 0
|
0 0
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001-01-01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001-01-01T '
|
||||||
SELECT EXTRACT(HOUR FROM '2001/01/01T'), EXTRACT(HOUR FROM '2001/01/01T ');
|
SELECT EXTRACT(HOUR FROM '2001/01/01T'), EXTRACT(HOUR FROM '2001/01/01T ');
|
||||||
EXTRACT(HOUR FROM '2001/01/01T') EXTRACT(HOUR FROM '2001/01/01T ')
|
EXTRACT(HOUR FROM '2001/01/01T') EXTRACT(HOUR FROM '2001/01/01T ')
|
||||||
0 0
|
0 0
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001/01/01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001/01/01T '
|
||||||
SELECT EXTRACT(HOUR FROM '2001:01:01T'), EXTRACT(HOUR FROM '2001:01:01T ');
|
SELECT EXTRACT(HOUR FROM '2001:01:01T'), EXTRACT(HOUR FROM '2001:01:01T ');
|
||||||
EXTRACT(HOUR FROM '2001:01:01T') EXTRACT(HOUR FROM '2001:01:01T ')
|
EXTRACT(HOUR FROM '2001:01:01T') EXTRACT(HOUR FROM '2001:01:01T ')
|
||||||
0 0
|
0 0
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001:01:01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001:01:01T '
|
||||||
# This still parses as DATE and returns NULL (without trying TIME)
|
# This still parses as DATE and returns NULL (without trying TIME)
|
||||||
SELECT EXTRACT(DAY FROM '100000:02:03T');
|
SELECT EXTRACT(DAY FROM '100000:02:03T');
|
||||||
EXTRACT(DAY FROM '100000:02:03T')
|
EXTRACT(DAY FROM '100000:02:03T')
|
||||||
|
@ -6253,6 +6253,9 @@ Warning 1292 Truncated incorrect time value: '1 2 '
|
|||||||
SELECT TIME('2001-01-01T'), TIME('2001-01-01T ');
|
SELECT TIME('2001-01-01T'), TIME('2001-01-01T ');
|
||||||
TIME('2001-01-01T') TIME('2001-01-01T ')
|
TIME('2001-01-01T') TIME('2001-01-01T ')
|
||||||
00:00:00 00:00:00
|
00:00:00 00:00:00
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001-01-01T'
|
||||||
|
Warning 1292 Truncated incorrect date value: '2001-01-01T '
|
||||||
SELECT TIME('901-01-01T1'), TIME('901-01-01T10');
|
SELECT TIME('901-01-01T1'), TIME('901-01-01T10');
|
||||||
TIME('901-01-01T1') TIME('901-01-01T10')
|
TIME('901-01-01T1') TIME('901-01-01T10')
|
||||||
01:00:00 10:00:00
|
01:00:00 10:00:00
|
||||||
|
@ -85,6 +85,27 @@ ERROR 22007: Incorrect date value: '2003-02-29' for column `test`.`t1`.`col1` at
|
|||||||
INSERT ignore INTO t1 VALUES('2003-02-30');
|
INSERT ignore INTO t1 VALUES('2003-02-30');
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1265 Data truncated for column 'col1' at row 1
|
Warning 1265 Data truncated for column 'col1' at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01W' for column `test`.`t1`.`col1` at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01T' for column `test`.`t1`.`col1` at row 1
|
||||||
|
set @@sql_mode='strict_all_tables';
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01W' for column `test`.`t1`.`col1` at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01T' for column `test`.`t1`.`col1` at row 1
|
||||||
|
set @@sql_mode='strict_all_tables,strict_trans_tables';
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01W' for column `test`.`t1`.`col1` at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01T' for column `test`.`t1`.`col1` at row 1
|
||||||
|
set @@sql_mode='';
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'col1' at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'col1' at row 1
|
||||||
set @@sql_mode='STRICT_ALL_TABLES,ALLOW_INVALID_DATES';
|
set @@sql_mode='STRICT_ALL_TABLES,ALLOW_INVALID_DATES';
|
||||||
INSERT ignore INTO t1 VALUES('2003-02-31');
|
INSERT ignore INTO t1 VALUES('2003-02-31');
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -95,6 +116,8 @@ col1
|
|||||||
0000-00-00
|
0000-00-00
|
||||||
2004-01-04
|
2004-01-04
|
||||||
0000-00-00
|
0000-00-00
|
||||||
|
2001-01-01
|
||||||
|
2001-01-01
|
||||||
2003-02-31
|
2003-02-31
|
||||||
drop table t1;
|
drop table t1;
|
||||||
set @@sql_mode='strict_trans_tables';
|
set @@sql_mode='strict_trans_tables';
|
||||||
@ -111,6 +134,27 @@ ERROR 22007: Incorrect date value: '2003-02-29' for column `test`.`t1`.`col1` at
|
|||||||
INSERT ignore INTO t1 VALUES('2003-02-30');
|
INSERT ignore INTO t1 VALUES('2003-02-30');
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1265 Data truncated for column 'col1' at row 1
|
Warning 1265 Data truncated for column 'col1' at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01W' for column `test`.`t1`.`col1` at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01T' for column `test`.`t1`.`col1` at row 1
|
||||||
|
set @@sql_mode='strict_all_tables';
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01W' for column `test`.`t1`.`col1` at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01T' for column `test`.`t1`.`col1` at row 1
|
||||||
|
set @@sql_mode='strict_all_tables,strict_trans_tables';
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01W' for column `test`.`t1`.`col1` at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
ERROR 22007: Incorrect date value: '2001-01-01T' for column `test`.`t1`.`col1` at row 1
|
||||||
|
set @@sql_mode='';
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'col1' at row 1
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'col1' at row 1
|
||||||
set @@sql_mode='STRICT_ALL_TABLES,ALLOW_INVALID_DATES';
|
set @@sql_mode='STRICT_ALL_TABLES,ALLOW_INVALID_DATES';
|
||||||
INSERT ignore INTO t1 VALUES('2003-02-31');
|
INSERT ignore INTO t1 VALUES('2003-02-31');
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -118,6 +162,8 @@ col1
|
|||||||
0000-00-00
|
0000-00-00
|
||||||
2004-01-04
|
2004-01-04
|
||||||
0000-00-00
|
0000-00-00
|
||||||
|
2001-01-01
|
||||||
|
2001-01-01
|
||||||
2003-02-31
|
2003-02-31
|
||||||
drop table t1;
|
drop table t1;
|
||||||
set @@sql_mode='ansi,traditional';
|
set @@sql_mode='ansi,traditional';
|
||||||
|
@ -77,6 +77,23 @@ INSERT IGNORE INTO t1 VALUES('2004-13-31'),('2004-1-4');
|
|||||||
--error 1292
|
--error 1292
|
||||||
INSERT INTO t1 VALUES ('2003-02-29');
|
INSERT INTO t1 VALUES ('2003-02-29');
|
||||||
INSERT ignore INTO t1 VALUES('2003-02-30');
|
INSERT ignore INTO t1 VALUES('2003-02-30');
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
set @@sql_mode='strict_all_tables';
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
set @@sql_mode='strict_all_tables,strict_trans_tables';
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
set @@sql_mode='';
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
set @@sql_mode='STRICT_ALL_TABLES,ALLOW_INVALID_DATES';
|
set @@sql_mode='STRICT_ALL_TABLES,ALLOW_INVALID_DATES';
|
||||||
INSERT ignore INTO t1 VALUES('2003-02-31');
|
INSERT ignore INTO t1 VALUES('2003-02-31');
|
||||||
select * from t1;
|
select * from t1;
|
||||||
@ -92,6 +109,23 @@ INSERT IGNORE INTO t1 VALUES('2004-13-31'),('2004-1-4');
|
|||||||
--error 1292
|
--error 1292
|
||||||
INSERT INTO t1 VALUES ('2003-02-29');
|
INSERT INTO t1 VALUES ('2003-02-29');
|
||||||
INSERT ignore INTO t1 VALUES('2003-02-30');
|
INSERT ignore INTO t1 VALUES('2003-02-30');
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
set @@sql_mode='strict_all_tables';
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
set @@sql_mode='strict_all_tables,strict_trans_tables';
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
--error 1292
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
|
set @@sql_mode='';
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01W');
|
||||||
|
INSERT INTO t1 VALUES('2001-01-01T');
|
||||||
set @@sql_mode='STRICT_ALL_TABLES,ALLOW_INVALID_DATES';
|
set @@sql_mode='STRICT_ALL_TABLES,ALLOW_INVALID_DATES';
|
||||||
INSERT ignore INTO t1 VALUES('2003-02-31');
|
INSERT ignore INTO t1 VALUES('2003-02-31');
|
||||||
select * from t1;
|
select * from t1;
|
||||||
|
@ -168,9 +168,20 @@ static int get_date_time_separator(uint *number_of_fields,
|
|||||||
if (s >= end)
|
if (s >= end)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
According to ISO_8601 - 2016
|
||||||
|
"
|
||||||
|
The character [T] shall be used as time designator to indicate the start of the
|
||||||
|
representation of the time of day component in these expressions.
|
||||||
|
"
|
||||||
|
|
||||||
|
That means that after T there *must* be a time component.
|
||||||
|
*/
|
||||||
if (*s == 'T')
|
if (*s == 'T')
|
||||||
{
|
{
|
||||||
(*str)++;
|
(*str)++;
|
||||||
|
if (s + 1 >= end)
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user