You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
fix(ubsan): MCOL-5844 - iron out UBSAN reports
The most important fix here is the fix of possible buffer overrun in DATEFORMAT() function. A "%W" format, repeated enough times, would overflow the 256-bytes buffer for result. Now we use ostringstream to construct result and we are safe. Changes in date/time projection functions made me fix difference between us and server behavior. The new, better behavior is reflected in changes in tests' results. Also, there was incorrect logic in TRUNCATE() and ROUND() functions in computing the decimal "shift."
This commit is contained in:
committed by
Leonid Fedorov
parent
3bcc2e2fda
commit
39a976c39a
@ -71,14 +71,14 @@ INSERT INTO t1 VALUES('2016-02-01', '11:11:11', '2017-02-01 12:12:12');
|
||||
SELECT t1_dt, DATE_FORMAT(t1_dt, '%Y-%m-%d') a, DATE_FORMAT(t1_d, '%a %D %b %Y') b, DATE_FORMAT(t1_d, '%W %D %M %Y') c FROM t1;
|
||||
t1_dt a b c
|
||||
NULL NULL NULL NULL
|
||||
0000-00-00 00:00:00 0000-00-00 Sun 0th NON_VALID 0000 Sunday 0th NON_VALID 0000
|
||||
0000-00-00 00:00:00 0000-00-00 NULL NULL
|
||||
2020-11-11 12:12:12 2020-11-11 Mon 11th Nov 2222 Monday 11th November 2222
|
||||
2020-12-31 12:34:56 2020-12-31 Wed 1st Jan 2020 Wednesday 1st January 2020
|
||||
2017-02-01 12:12:12 2017-02-01 Mon 1st Feb 2016 Monday 1st February 2016
|
||||
SELECT t1_dt, DATE_FORMAT(t1_dt, '%Y/%m/%d %T') a, DATE_FORMAT(t1_dt, '%a %D %b %Y %H:%i') b, DATE_FORMAT(t1_dt, '%W %D %M %Y %T') c FROM t1;
|
||||
t1_dt a b c
|
||||
NULL NULL NULL NULL
|
||||
0000-00-00 00:00:00 0000/00/00 00:00:00 Sun 0th NON_VALID 0000 00:00 Sunday 0th NON_VALID 0000 00:00:00
|
||||
0000-00-00 00:00:00 0000/00/00 00:00:00 NULL NULL
|
||||
2020-11-11 12:12:12 2020/11/11 12:12:12 Wed 11th Nov 2020 12:12 Wednesday 11th November 2020 12:12:12
|
||||
2020-12-31 12:34:56 2020/12/31 12:34:56 Thu 31st Dec 2020 12:34 Thursday 31st December 2020 12:34:56
|
||||
2017-02-01 12:12:12 2017/02/01 12:12:12 Wed 1st Feb 2017 12:12 Wednesday 1st February 2017 12:12:12
|
||||
|
@ -18,12 +18,12 @@ DAYNAME('2020-12-22')
|
||||
Tuesday
|
||||
SELECT a, DAYNAME(a) FROM t1 ORDER BY 1;
|
||||
a DAYNAME(a)
|
||||
0000-00-00 Sunday
|
||||
0000-00-00 NULL
|
||||
1212-12-12 Wednesday
|
||||
3333-03-03 Tuesday
|
||||
SELECT b, DAYNAME(b) FROM t1 ORDER BY 1;
|
||||
b DAYNAME(b)
|
||||
0000-00-00 00:00:00 Sunday
|
||||
0000-00-00 00:00:00 NULL
|
||||
1212-12-11 11:11:11 Tuesday
|
||||
3333-03-04 03:33:33 Wednesday
|
||||
DROP DATABASE mcs185_db;
|
||||
|
@ -18,12 +18,12 @@ DAYOFYEAR('2020-12-22')
|
||||
357
|
||||
SELECT a, DAYOFYEAR(a) FROM t1 ORDER BY 1;
|
||||
a DAYOFYEAR(a)
|
||||
0000-00-00 2147483647
|
||||
0000-00-00 NULL
|
||||
1212-12-12 347
|
||||
3333-03-03 62
|
||||
SELECT b, DAYOFYEAR(b) FROM t1 ORDER BY 1;
|
||||
b DAYOFYEAR(b)
|
||||
0000-00-00 00:00:00 2147483647
|
||||
0000-00-00 00:00:00 NULL
|
||||
1212-12-11 11:11:11 346
|
||||
3333-03-04 03:33:33 63
|
||||
DROP DATABASE mcs186_db;
|
||||
|
@ -321,9 +321,9 @@ NULL NULL
|
||||
SELECT t1_t, EXTRACT(HOUR_MICROSECOND FROM t1_t) FROM t1 ORDER BY 1;
|
||||
t1_t EXTRACT(HOUR_MICROSECOND FROM t1_t)
|
||||
NULL NULL
|
||||
11:11:11 -558149696
|
||||
11:11:11 -558149696
|
||||
12:12:12 952915712
|
||||
11:11:11 111111000000
|
||||
11:11:11 111111000000
|
||||
12:12:12 121212000000
|
||||
SELECT t1_t, EXTRACT(HOUR_SECOND FROM t1_t) FROM t1 ORDER BY 1;
|
||||
t1_t EXTRACT(HOUR_SECOND FROM t1_t)
|
||||
NULL NULL
|
||||
@ -339,9 +339,9 @@ NULL NULL
|
||||
SELECT t1_t, EXTRACT(DAY_MICROSECOND FROM t1_t) FROM t1 ORDER BY 1;
|
||||
t1_t EXTRACT(DAY_MICROSECOND FROM t1_t)
|
||||
NULL NULL
|
||||
11:11:11 -558149696
|
||||
11:11:11 -558149696
|
||||
12:12:12 952915712
|
||||
11:11:11 111111000000
|
||||
11:11:11 111111000000
|
||||
12:12:12 121212000000
|
||||
SELECT t1_t, EXTRACT(DAY_SECOND FROM t1_t) FROM t1 ORDER BY 1;
|
||||
t1_t EXTRACT(DAY_SECOND FROM t1_t)
|
||||
NULL NULL
|
||||
|
@ -33,9 +33,9 @@ t1_TIME TIMEDIFF(t1_TIME, '2008-02-19 22:22:22')
|
||||
23:59:59 NULL
|
||||
SELECT t1_TIME, TIMEDIFF(t1_TIME, '23:59:59') FROM t1 ORDER BY 1;
|
||||
t1_TIME TIMEDIFF(t1_TIME, '23:59:59')
|
||||
01:37:50 -838:59:59
|
||||
22:12:02 -838:59:59
|
||||
23:59:59 -838:59:59
|
||||
01:37:50 -22:22:09
|
||||
22:12:02 -01:47:57
|
||||
23:59:59 00:00:00
|
||||
SELECT t1_DATETIME, TIMEDIFF(t1_DATETIME, '2001-02-19 22:22:22') FROM t1 ORDER BY 1;
|
||||
t1_DATETIME TIMEDIFF(t1_DATETIME, '2001-02-19 22:22:22')
|
||||
1997-12-12 22:12:02 -838:59:59
|
||||
|
@ -295,14 +295,14 @@ NULL NULL
|
||||
SELECT t1_dt, DATE_FORMAT(t1_dt, '%Y-%m-%d') a, DATE_FORMAT(t1_d, '%a %D %b %Y') b, DATE_FORMAT(t1_d, '%W %D %M %Y') c FROM t1;
|
||||
t1_dt a b c
|
||||
NULL NULL NULL NULL
|
||||
0000-00-00 00:00:00 0000-00-00 Sun 0th NON_VALID 0000 Sunday 0th NON_VALID 0000
|
||||
0000-00-00 00:00:00 0000-00-00 NULL NULL
|
||||
2020-11-11 12:12:12 2020-11-11 Mon 11th Nov 2222 Monday 11th November 2222
|
||||
2020-12-31 12:34:56 2020-12-31 Wed 1st Jan 2020 Wednesday 1st January 2020
|
||||
2017-02-01 12:12:12 2017-02-01 Mon 1st Feb 2016 Monday 1st February 2016
|
||||
SELECT t1_dt, DATE_FORMAT(t1_dt, '%Y/%m/%d %T') a, DATE_FORMAT(t1_dt, '%a %D %b %Y %H:%i') b, DATE_FORMAT(t1_dt, '%W %D %M %Y %T') c FROM t1;
|
||||
t1_dt a b c
|
||||
NULL NULL NULL NULL
|
||||
0000-00-00 00:00:00 0000/00/00 00:00:00 Sun 0th NON_VALID 0000 00:00 Sunday 0th NON_VALID 0000 00:00:00
|
||||
0000-00-00 00:00:00 0000/00/00 00:00:00 NULL NULL
|
||||
2020-11-11 12:12:12 2020/11/11 12:12:12 Wed 11th Nov 2020 12:12 Wednesday 11th November 2020 12:12:12
|
||||
2020-12-31 12:34:56 2020/12/31 12:34:56 Thu 31st Dec 2020 12:34 Thursday 31st December 2020 12:34:56
|
||||
2017-02-01 12:12:12 2017/02/01 12:12:12 Wed 1st Feb 2017 12:12 Wednesday 1st February 2017 12:12:12
|
||||
@ -312,14 +312,14 @@ en_US
|
||||
SELECT t1_dt, DAYNAME(t1_dt), DAYOFWEEK(t1_dt), WEEKDAY(t1_dt) FROM t1;
|
||||
t1_dt DAYNAME(t1_dt) DAYOFWEEK(t1_dt) WEEKDAY(t1_dt)
|
||||
NULL NULL NULL NULL
|
||||
0000-00-00 00:00:00 Sunday 1 6
|
||||
0000-00-00 00:00:00 NULL NULL NULL
|
||||
2020-11-11 12:12:12 Wednesday 4 2
|
||||
2020-12-31 12:34:56 Thursday 5 3
|
||||
2017-02-01 12:12:12 Wednesday 4 2
|
||||
SELECT t1_d, DAYNAME(t1_d), DAYOFWEEK(t1_d), WEEKDAY(t1_d) FROM t1;
|
||||
t1_d DAYNAME(t1_d) DAYOFWEEK(t1_d) WEEKDAY(t1_d)
|
||||
NULL NULL NULL NULL
|
||||
0000-00-00 Sunday 1 6
|
||||
0000-00-00 NULL NULL NULL
|
||||
2222-11-11 Monday 2 0
|
||||
2020-01-01 Wednesday 4 2
|
||||
2016-02-01 Monday 2 0
|
||||
@ -333,7 +333,7 @@ NULL NULL NULL NULL NULL
|
||||
SELECT t1_dt, EXTRACT(DAY FROM t1_dt) 'DAY', EXTRACT(YEAR FROM t1_dt) 'YEAR', EXTRACT(MONTH FROM t1_dt) 'MONTH', EXTRACT(WEEK FROM t1_dt) 'WEEK' FROM t1;
|
||||
t1_dt DAY YEAR MONTH WEEK
|
||||
NULL NULL NULL NULL NULL
|
||||
0000-00-00 00:00:00 0 0 0 613566753
|
||||
0000-00-00 00:00:00 0 0 0 1
|
||||
2020-11-11 12:12:12 11 2020 11 46
|
||||
2020-12-31 12:34:56 31 2020 12 53
|
||||
2017-02-01 12:12:12 1 2017 2 5
|
||||
@ -361,10 +361,10 @@ NULL NULL
|
||||
SELECT t1_t, TIMEDIFF('12:58:11', t1_t) FROM t1;
|
||||
t1_t TIMEDIFF('12:58:11', t1_t)
|
||||
NULL NULL
|
||||
00:00:00 838:59:59
|
||||
12:12:12 838:59:59
|
||||
11:11:11 838:59:59
|
||||
11:11:11 838:59:59
|
||||
00:00:00 12:58:11
|
||||
12:12:12 00:45:59
|
||||
11:11:11 01:47:00
|
||||
11:11:11 01:47:00
|
||||
SELECT t1_d, t1_dt, TIMESTAMPDIFF(MONTH, t1_d, t1_dt) FROM t1;
|
||||
t1_d t1_dt TIMESTAMPDIFF(MONTH, t1_d, t1_dt)
|
||||
NULL NULL NULL
|
||||
@ -396,7 +396,7 @@ NULL NULL NULL
|
||||
SELECT t1_d, WEEK(t1_d), t1_dt, WEEK(t1_dt) FROM t1;
|
||||
t1_d WEEK(t1_d) t1_dt WEEK(t1_dt)
|
||||
NULL NULL NULL NULL
|
||||
0000-00-00 613566753 0000-00-00 00:00:00 613566753
|
||||
0000-00-00 1 0000-00-00 00:00:00 1
|
||||
2222-11-11 45 2020-11-11 12:12:12 45
|
||||
2020-01-01 0 2020-12-31 12:34:56 52
|
||||
2016-02-01 5 2017-02-01 12:12:12 5
|
||||
|
@ -70,6 +70,8 @@ SELECT t1_dt, DAYNAME(t1_dt), DAYOFWEEK(t1_dt), WEEKDAY(t1_dt) FROM t1;
|
||||
SELECT t1_d, DAYNAME(t1_d), DAYOFWEEK(t1_d), WEEKDAY(t1_d) FROM t1;
|
||||
|
||||
SELECT t1_dt, EXTRACT(SECOND FROM t1_dt) 'SECOND', EXTRACT(DAY_HOUR FROM t1_dt) 'DAY_HOUR', EXTRACT(HOUR FROM t1_dt) 'HOUR', EXTRACT(MINUTE FROM t1_dt) 'MINUTE' FROM t1;
|
||||
# please note that server's 613566753 is much more nonsensical than our new 1.
|
||||
# returning NULL would be even more sensible.
|
||||
SELECT t1_dt, EXTRACT(DAY FROM t1_dt) 'DAY', EXTRACT(YEAR FROM t1_dt) 'YEAR', EXTRACT(MONTH FROM t1_dt) 'MONTH', EXTRACT(WEEK FROM t1_dt) 'WEEK' FROM t1;
|
||||
|
||||
SELECT t1_dt, MONTH(t1_dt) FROM t1;
|
||||
@ -82,6 +84,8 @@ SELECT t1_d, t1_dt, TIMESTAMPDIFF(DAY, t1_d, t1_dt) FROM t1;
|
||||
SELECT t1_d, t1_dt, TIMESTAMPDIFF(MINUTE, t1_d, t1_dt) FROM t1;
|
||||
SELECT t1_d, t1_dt, TIMESTAMPDIFF(SECOND, t1_d, t1_dt) FROM t1;
|
||||
|
||||
# please note that server's 613566753 is much more nonsensical than our new 1.
|
||||
# returning NULL would be even more sensible.
|
||||
SELECT t1_d, WEEK(t1_d), t1_dt, WEEK(t1_dt) FROM t1;
|
||||
SELECT t1_d, YEAR(t1_d), t1_dt, YEAR(t1_dt) FROM t1;
|
||||
|
||||
|
Reference in New Issue
Block a user