Skip to content

Commit 173b16f

Browse files
gengtianuiowasvoj
authored andcommitted
MDEV-11341 STR_TO_DATE does not return NULL for invalid dates
STR_TO_DATE function in MariaDB does date to string conversion for invalid dates strings, e.g.: 1949-02-30, and 1949-06-31, but null is return by other invalid dates such as 1949-01-32 because the checking function returns null for any date whose day is larger than 31, which is too naive and needs to be changed. This commit changed the rule of check_date in extract_date_time function, which is executed after extracting date and time and check if the result is valid. Now the conversion will consider the number of days in a month, including skip years. 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.
1 parent f11504a commit 173b16f

File tree

5 files changed

+71
-13
lines changed

5 files changed

+71
-13
lines changed

mysql-test/main/func_time.result

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,6 +1314,47 @@ SELECT UTC_TIMESTAMP();
13141314
SET TIMESTAMP=1;
13151315
SELECT UTC_TIMESTAMP();
13161316
SET TIMESTAMP=0;
1317+
#
1318+
# MDEV-11341 STR_TO_DATE does not return NULL for invalid dates
1319+
#
1320+
SELECT STR_TO_DATE('1949-02-30','%Y-%m-%d');
1321+
STR_TO_DATE('1949-02-30','%Y-%m-%d')
1322+
NULL
1323+
Warnings:
1324+
Warning 1411 Incorrect datetime value: '1949-02-30' for function str_to_date
1325+
SELECT STR_TO_DATE('1949-02-28','%Y-%m-%d');
1326+
STR_TO_DATE('1949-02-28','%Y-%m-%d')
1327+
1949-02-28
1328+
SELECT STR_TO_DATE('1949-06-31','%Y-%m-%d');
1329+
STR_TO_DATE('1949-06-31','%Y-%m-%d')
1330+
NULL
1331+
Warnings:
1332+
Warning 1411 Incorrect datetime value: '1949-06-31' for function str_to_date
1333+
SELECT STR_TO_DATE('2000-02-29','%Y-%m-%d');
1334+
STR_TO_DATE('2000-02-29','%Y-%m-%d')
1335+
2000-02-29
1336+
SELECT STR_TO_DATE('1900-02-29','%Y-%m-%d');
1337+
STR_TO_DATE('1900-02-29','%Y-%m-%d')
1338+
NULL
1339+
Warnings:
1340+
Warning 1411 Incorrect datetime value: '1900-02-29' for function str_to_date
1341+
SET sql_mode=ALLOW_INVALID_DATES;
1342+
SELECT STR_TO_DATE('1949-02-30','%Y-%m-%d');
1343+
STR_TO_DATE('1949-02-30','%Y-%m-%d')
1344+
1949-02-30
1345+
SELECT STR_TO_DATE('1949-02-28','%Y-%m-%d');
1346+
STR_TO_DATE('1949-02-28','%Y-%m-%d')
1347+
1949-02-28
1348+
SELECT STR_TO_DATE('1949-06-31','%Y-%m-%d');
1349+
STR_TO_DATE('1949-06-31','%Y-%m-%d')
1350+
1949-06-31
1351+
SELECT STR_TO_DATE('2000-02-29','%Y-%m-%d');
1352+
STR_TO_DATE('2000-02-29','%Y-%m-%d')
1353+
2000-02-29
1354+
SELECT STR_TO_DATE('1900-02-29','%Y-%m-%d');
1355+
STR_TO_DATE('1900-02-29','%Y-%m-%d')
1356+
1900-02-29
1357+
SET sql_mode=DEFAULT;
13171358
End of 5.0 tests
13181359
select date_sub("0050-01-01 00:00:01",INTERVAL 2 SECOND);
13191360
date_sub("0050-01-01 00:00:01",INTERVAL 2 SECOND)

mysql-test/main/func_time.test

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,23 @@ SET TIMESTAMP=1; SELECT UTC_TIMESTAMP();
838838
#reset back the timestamp value
839839
SET TIMESTAMP=0;
840840

841+
--echo #
842+
--echo # MDEV-11341 STR_TO_DATE does not return NULL for invalid dates
843+
--echo #
844+
845+
SELECT STR_TO_DATE('1949-02-30','%Y-%m-%d');
846+
SELECT STR_TO_DATE('1949-02-28','%Y-%m-%d');
847+
SELECT STR_TO_DATE('1949-06-31','%Y-%m-%d');
848+
SELECT STR_TO_DATE('2000-02-29','%Y-%m-%d');
849+
SELECT STR_TO_DATE('1900-02-29','%Y-%m-%d');
850+
851+
SET sql_mode=ALLOW_INVALID_DATES;
852+
SELECT STR_TO_DATE('1949-02-30','%Y-%m-%d');
853+
SELECT STR_TO_DATE('1949-02-28','%Y-%m-%d');
854+
SELECT STR_TO_DATE('1949-06-31','%Y-%m-%d');
855+
SELECT STR_TO_DATE('2000-02-29','%Y-%m-%d');
856+
SELECT STR_TO_DATE('1900-02-29','%Y-%m-%d');
857+
SET sql_mode=DEFAULT;
841858

842859
--echo End of 5.0 tests
843860

mysql-test/main/strict.result

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,11 +260,11 @@ ERROR HY000: Incorrect datetime value: '31.0.2004 15.30' for function str_to_dat
260260
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
261261
ERROR HY000: Incorrect datetime value: '0.10.2004 15.30' for function str_to_date
262262
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
263-
ERROR 22007: Incorrect date value: '2004-09-31 15:30:00' for column `test`.`t1`.`col1` at row 1
263+
ERROR HY000: Incorrect datetime value: '31.9.2004 15.30' for function str_to_date
264264
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
265265
ERROR HY000: Incorrect datetime value: '32.10.2004 15.30' for function str_to_date
266266
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
267-
ERROR 22007: Incorrect date value: '2003-02-29 15:30:00' for column `test`.`t1`.`col1` at row 1
267+
ERROR HY000: Incorrect datetime value: '29.02.2003 15.30' for function str_to_date
268268
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));
269269
ERROR HY000: Incorrect datetime value: '15.13.2004 15.30' for function str_to_date
270270
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));
@@ -274,11 +274,11 @@ ERROR HY000: Incorrect datetime value: '31.0.2004 15.30' for function str_to_dat
274274
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
275275
ERROR HY000: Incorrect datetime value: '0.10.2004 15.30' for function str_to_date
276276
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
277-
ERROR 22007: Incorrect datetime value: '2004-09-31 15:30:00' for column `test`.`t1`.`col2` at row 1
277+
ERROR HY000: Incorrect datetime value: '31.9.2004 15.30' for function str_to_date
278278
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
279279
ERROR HY000: Incorrect datetime value: '32.10.2004 15.30' for function str_to_date
280280
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
281-
ERROR 22007: Incorrect datetime value: '2003-02-29 15:30:00' for column `test`.`t1`.`col2` at row 1
281+
ERROR HY000: Incorrect datetime value: '29.02.2003 15.30' for function str_to_date
282282
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));
283283
ERROR HY000: Incorrect datetime value: '15.13.2004 15.30' for function str_to_date
284284
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));
@@ -290,11 +290,11 @@ ERROR HY000: Incorrect datetime value: '31.0.2004 15.30' for function str_to_dat
290290
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
291291
ERROR HY000: Incorrect datetime value: '0.10.2004 15.30' for function str_to_date
292292
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
293-
ERROR 22007: Incorrect datetime value: '2004-09-31 15:30:00' for column `test`.`t1`.`col3` at row 1
293+
ERROR HY000: Incorrect datetime value: '31.9.2004 15.30' for function str_to_date
294294
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
295295
ERROR HY000: Incorrect datetime value: '32.10.2004 15.30' for function str_to_date
296296
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
297-
ERROR 22007: Incorrect datetime value: '2003-02-29 15:30:00' for column `test`.`t1`.`col3` at row 1
297+
ERROR HY000: Incorrect datetime value: '29.02.2003 15.30' for function str_to_date
298298
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));
299299
ERROR HY000: Incorrect datetime value: '15.13.2004 15.30' for function str_to_date
300300
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));

mysql-test/main/strict.test

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,11 @@ INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
237237
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
238238
--error 1411
239239
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
240-
--error 1292
240+
--error ER_WRONG_VALUE_FOR_TYPE
241241
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
242242
--error 1411
243243
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
244-
--error 1292
244+
--error ER_WRONG_VALUE_FOR_TYPE
245245
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
246246
--error 1411
247247
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));
@@ -256,11 +256,11 @@ INSERT INTO t1 (col1) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));
256256
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
257257
--error 1411
258258
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
259-
--error 1292
259+
--error ER_WRONG_VALUE_FOR_TYPE
260260
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
261261
--error 1411
262262
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
263-
--error 1292
263+
--error ER_WRONG_VALUE_FOR_TYPE
264264
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
265265
--error 1411
266266
INSERT INTO t1 (col2) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));
@@ -277,11 +277,11 @@ INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
277277
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
278278
--error 1411
279279
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
280-
--error 1292
280+
--error ER_WRONG_VALUE_FOR_TYPE
281281
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
282282
--error 1411
283283
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
284-
--error 1292
284+
--error ER_WRONG_VALUE_FOR_TYPE
285285
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
286286
--error 1411
287287
INSERT INTO t1 (col3) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));

sql/item_timefunc.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ static bool extract_date_time(THD *thd, DATE_TIME_FORMAT *format,
433433
goto err;
434434

435435
int was_cut;
436-
if (check_date(l_time, fuzzydate | TIME_INVALID_DATES, &was_cut))
436+
if (check_date(l_time, fuzzydate, &was_cut))
437437
goto err;
438438

439439
if (val != val_end)

0 commit comments

Comments
 (0)