1
0
mirror of https://github.com/MariaDB/server.git synced 2025-04-18 21:44:20 +03:00

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:
Fariha Shaikh 2025-01-29 18:53:39 +00:00 committed by Vicențiu-Marian Ciorbaru
parent 22efc2c784
commit cb2d6abae1
5 changed files with 126 additions and 0 deletions

View File

@ -368,6 +368,8 @@ EXTRACT(DAY FROM '01-02-03')
SELECT EXTRACT(DAY FROM '24:02:03T');
EXTRACT(DAY FROM '24:02:03T')
3
Warnings:
Warning 1292 Truncated incorrect date value: '24:02:03T'
SELECT EXTRACT(DAY FROM '24-02-03');
EXTRACT(DAY FROM '24-02-03')
3
@ -380,33 +382,63 @@ EXTRACT(DAY FROM '11111')
SELECT TIME('2001-01-01T'), TIME('2001-01-01T ');
TIME('2001-01-01T') TIME('2001-01-01T ')
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 ');
TIME('2001/01/01T') TIME('2001/01/01T ')
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 ');
TIME('2001:01:01T') TIME('2001:01:01T ')
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 ');
EXTRACT(DAY FROM '2001-01-01T') EXTRACT(DAY FROM '2001-01-01T ')
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 ');
EXTRACT(DAY FROM '2001/01/01T') EXTRACT(DAY FROM '2001/01/01T ')
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 ');
EXTRACT(DAY FROM '2001:01:01T') EXTRACT(DAY FROM '2001:01:01T ')
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 ');
TIME('2001:01:01T') TIME('2001:01:01T ')
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 ');
EXTRACT(HOUR FROM '2001-01-01T') EXTRACT(HOUR FROM '2001-01-01T ')
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 ');
EXTRACT(HOUR FROM '2001/01/01T') EXTRACT(HOUR FROM '2001/01/01T ')
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 ');
EXTRACT(HOUR FROM '2001:01:01T') EXTRACT(HOUR FROM '2001:01:01T ')
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)
SELECT EXTRACT(DAY FROM '100000:02:03T');
EXTRACT(DAY FROM '100000:02:03T')

View File

@ -6253,6 +6253,9 @@ Warning 1292 Truncated incorrect time value: '1 2 '
SELECT TIME('2001-01-01T'), TIME('2001-01-01T ');
TIME('2001-01-01T') TIME('2001-01-01T ')
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');
TIME('901-01-01T1') TIME('901-01-01T10')
01:00:00 10:00:00

View File

@ -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');
Warnings:
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';
INSERT ignore INTO t1 VALUES('2003-02-31');
select * from t1;
@ -95,6 +116,8 @@ col1
0000-00-00
2004-01-04
0000-00-00
2001-01-01
2001-01-01
2003-02-31
drop table t1;
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');
Warnings:
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';
INSERT ignore INTO t1 VALUES('2003-02-31');
select * from t1;
@ -118,6 +162,8 @@ col1
0000-00-00
2004-01-04
0000-00-00
2001-01-01
2001-01-01
2003-02-31
drop table t1;
set @@sql_mode='ansi,traditional';

View File

@ -77,6 +77,23 @@ INSERT IGNORE INTO t1 VALUES('2004-13-31'),('2004-1-4');
--error 1292
INSERT INTO t1 VALUES ('2003-02-29');
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';
INSERT ignore INTO t1 VALUES('2003-02-31');
select * from t1;
@ -92,6 +109,23 @@ INSERT IGNORE INTO t1 VALUES('2004-13-31'),('2004-1-4');
--error 1292
INSERT INTO t1 VALUES ('2003-02-29');
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';
INSERT ignore INTO t1 VALUES('2003-02-31');
select * from t1;

View File

@ -168,9 +168,20 @@ static int get_date_time_separator(uint *number_of_fields,
if (s >= end)
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')
{
(*str)++;
if (s + 1 >= end)
return 1;
return 0;
}