From a8ab18bd29e7059c9a5622239902d985ebe7eff2 Mon Sep 17 00:00:00 2001 From: Fariha Shaikh Date: Wed, 29 Jan 2025 18:53:39 +0000 Subject: [PATCH] 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. --- mysql-test/main/func_extract.result | 32 +++++++++++++++++++++++++++++ mysql-test/main/func_time.result | 3 +++ sql-common/my_time.c | 2 ++ 3 files changed, 37 insertions(+) diff --git a/mysql-test/main/func_extract.result b/mysql-test/main/func_extract.result index cab0d1852708e..b8dcb86ae24af 100644 --- a/mysql-test/main/func_extract.result +++ b/mysql-test/main/func_extract.result @@ -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') diff --git a/mysql-test/main/func_time.result b/mysql-test/main/func_time.result index b4bca9cffe0fa..a24507d431cb3 100644 --- a/mysql-test/main/func_time.result +++ b/mysql-test/main/func_time.result @@ -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 diff --git a/sql-common/my_time.c b/sql-common/my_time.c index 3d96695cd5c52..79d6c5691a837 100644 --- a/sql-common/my_time.c +++ b/sql-common/my_time.c @@ -171,6 +171,8 @@ static int get_date_time_separator(uint *number_of_fields, if (*s == 'T') { (*str)++; + if (s + 1 >= end) + return 1; return 0; }