1
0
mirror of https://github.com/MariaDB/server.git synced 2026-10-23 18:49:29 +03:00

fix(func): time functions fixes and tests.

This commit is contained in:
drrtuy
2026-07-04 15:38:48 +01:00
parent a3a458edf7
commit 03cb6bc4f2
6 changed files with 1562 additions and 540 deletions

View File

@@ -17,7 +17,7 @@ duckdb_kill : DEBUG sync points not implemented, timeout
duckdb_numeric_func : ACOS domain error in DuckDB
duckdb_refuse_xa : XA PREPARED state handling
duckdb_sql_mode : strict GROUP BY in DuckDB
duckdb_time_func : ADDDATE() not in DuckDB
duckdb_time_func_unsupported : unsupported time functions
rename_duckdb_table : server log warnings on cross-schema rename
supported_copy_ddl : cross-schema rename not supported
system_timezone : hangs on mariadbd-safe restart

View File

@@ -0,0 +1,516 @@
CREATE DATABASE test_duckdb;
USE test_duckdb;
CREATE TABLE t (id INT PRIMARY KEY) ENGINE = DuckDB;
INSERT INTO t VALUES (1);
---------------------------
1. ADDDATE()
---------------------------
SELECT ADDDATE(DATE '2020-01-01', interval 1 day);
ADDDATE(DATE '2020-01-01', interval 1 day)
2020-01-02
SELECT ADDDATE(DATE '2020-01-01', interval 1 day) FROM t;
ADDDATE(DATE '2020-01-01', interval 1 day)
2020-01-02
SELECT ADDDATE(DATE '2020-01-01', interval 1 hour);
ADDDATE(DATE '2020-01-01', interval 1 hour)
2020-01-01 01:00:00
SELECT ADDDATE(DATE '2020-01-01', interval 1 hour) FROM t;
ADDDATE(DATE '2020-01-01', interval 1 hour)
2020-01-01 01:00:00
SELECT ADDDATE(DATE '2020-01-01', 1);
ADDDATE(DATE '2020-01-01', 1)
2020-01-02
SELECT ADDDATE(DATE '2020-01-01', 1) FROM t;
ADDDATE(DATE '2020-01-01', 1)
2020-01-02
SELECT ADDDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day);
ADDDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day)
2020-01-02 12:00:00
SELECT ADDDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day) FROM t;
ADDDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day)
2020-01-02 12:00:00
---------------------------
2. ADDTIME()
---------------------------
SELECT addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002');
addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002')
2008-01-02 01:01:01.000001
SELECT addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002') FROM t;
addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002')
2008-01-02 01:01:01.000001
SELECT addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002');
addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002')
2008-01-01 01:01:01.000001
SELECT addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002') FROM t;
addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002')
2008-01-01 01:01:01.000001
---------------------------
8. DATE()
---------------------------
SELECT DATE(TIMESTAMP '2003-12-31 01:02:03');
DATE(TIMESTAMP '2003-12-31 01:02:03')
2003-12-31
SELECT DATE(TIMESTAMP '2003-12-31 01:02:03') FROM t;
DATE(TIMESTAMP '2003-12-31 01:02:03')
2003-12-31
SELECT DATE(DATE '2003-12-31');
DATE(DATE '2003-12-31')
2003-12-31
SELECT DATE(DATE '2003-12-31') FROM t;
DATE(DATE '2003-12-31')
2003-12-31
---------------------------
9. DATEDIFF()
---------------------------
SELECT DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', DATE '2007-12-30');
DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', DATE '2007-12-30')
1
SELECT DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', DATE '2007-12-30') FROM t;
DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', DATE '2007-12-30')
1
SELECT DATEDIFF(TIMESTAMP '2010-11-30 23:59:59', DATE '2010-12-31');
DATEDIFF(TIMESTAMP '2010-11-30 23:59:59', DATE '2010-12-31')
-31
SELECT DATEDIFF(TIMESTAMP '2010-11-30 23:59:59', DATE '2010-12-31') FROM t;
DATEDIFF(TIMESTAMP '2010-11-30 23:59:59', DATE '2010-12-31')
-31
---------------------------
10. DATE_ADD()
---------------------------
SELECT DATE_ADD(DATE '2020-01-01', interval 1 day);
DATE_ADD(DATE '2020-01-01', interval 1 day)
2020-01-02
SELECT DATE_ADD(DATE '2020-01-01', interval 1 day) FROM t;
DATE_ADD(DATE '2020-01-01', interval 1 day)
2020-01-02
SELECT DATE_ADD(DATE '2020-01-01', interval 1 hour);
DATE_ADD(DATE '2020-01-01', interval 1 hour)
2020-01-01 01:00:00
SELECT DATE_ADD(DATE '2020-01-01', interval 1 hour) FROM t;
DATE_ADD(DATE '2020-01-01', interval 1 hour)
2020-01-01 01:00:00
SELECT DATE_ADD(TIMESTAMP '2020-01-01 12:00:00', interval 1 day);
DATE_ADD(TIMESTAMP '2020-01-01 12:00:00', interval 1 day)
2020-01-02 12:00:00
SELECT DATE_ADD(TIMESTAMP '2020-01-01 12:00:00', interval 1 day) FROM t;
DATE_ADD(TIMESTAMP '2020-01-01 12:00:00', interval 1 day)
2020-01-02 12:00:00
---------------------------
12. DAY()
---------------------------
SELECT DAY(DATE '2007-02-03');
DAY(DATE '2007-02-03')
3
SELECT DAY(DATE '2007-02-03') FROM t;
DAY(DATE '2007-02-03')
3
SELECT DAY(TIMESTAMP '2007-02-03 22:23:00.123456');
DAY(TIMESTAMP '2007-02-03 22:23:00.123456')
3
SELECT DAY(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
DAY(TIMESTAMP '2007-02-03 22:23:00.123456')
3
--------------------------
13. DAYNAME()
--------------------------
SELECT DAYNAME(DATE '2007-02-03');
DAYNAME(DATE '2007-02-03')
Saturday
SELECT DAYNAME(DATE '2007-02-03') FROM t;
DAYNAME(DATE '2007-02-03')
Saturday
SELECT DAYNAME(TIMESTAMP '2007-02-03 22:23:00.123456');
DAYNAME(TIMESTAMP '2007-02-03 22:23:00.123456')
Saturday
SELECT DAYNAME(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
DAYNAME(TIMESTAMP '2007-02-03 22:23:00.123456')
Saturday
--------------------------
14. DAYOFMONTH()
--------------------------
SELECT DAYOFMONTH(DATE '2007-02-03');
DAYOFMONTH(DATE '2007-02-03')
3
SELECT DAYOFMONTH(DATE '2007-02-03') FROM t;
DAYOFMONTH(DATE '2007-02-03')
3
SELECT DAYOFMONTH(TIMESTAMP '2007-02-03 22:23:00.123456');
DAYOFMONTH(TIMESTAMP '2007-02-03 22:23:00.123456')
3
SELECT DAYOFMONTH(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
DAYOFMONTH(TIMESTAMP '2007-02-03 22:23:00.123456')
3
--------------------------
15. DAYOFWEEK()
--------------------------
SELECT DAYOFWEEK(DATE '2007-02-03');
DAYOFWEEK(DATE '2007-02-03')
7
SELECT DAYOFWEEK(DATE '2007-02-03') FROM t;
DAYOFWEEK(DATE '2007-02-03')
7
SELECT DAYOFWEEK(TIMESTAMP '2007-02-03 22:23:00.123456');
DAYOFWEEK(TIMESTAMP '2007-02-03 22:23:00.123456')
7
SELECT DAYOFWEEK(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
DAYOFWEEK(TIMESTAMP '2007-02-03 22:23:00.123456')
7
--------------------------
16. DAYOFYEAR()
--------------------------
SELECT DAYOFYEAR(DATE '2007-02-03');
DAYOFYEAR(DATE '2007-02-03')
34
SELECT DAYOFYEAR(DATE '2007-02-03') FROM t;
DAYOFYEAR(DATE '2007-02-03')
34
SELECT DAYOFYEAR(TIMESTAMP '2007-02-03 22:23:00.123456');
DAYOFYEAR(TIMESTAMP '2007-02-03 22:23:00.123456')
34
SELECT DAYOFYEAR(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
DAYOFYEAR(TIMESTAMP '2007-02-03 22:23:00.123456')
34
--------------------------
17. EXTRACT()
--------------------------
SELECT EXTRACT(YEAR FROM DATE '2019-07-02');
EXTRACT(YEAR FROM DATE '2019-07-02')
2019
SELECT EXTRACT(HOUR FROM DATE '2019-07-02');
EXTRACT(HOUR FROM DATE '2019-07-02')
0
SELECT EXTRACT(YEAR FROM DATE '2019-07-02') FROM t;
EXTRACT(YEAR FROM DATE '2019-07-02')
2019
SELECT EXTRACT(HOUR FROM DATE '2019-07-02') FROM t;
EXTRACT(HOUR FROM DATE '2019-07-02')
0
SELECT EXTRACT(YEAR FROM TIMESTAMP '2019-07-02 01:02:03');
EXTRACT(YEAR FROM TIMESTAMP '2019-07-02 01:02:03')
2019
SELECT EXTRACT(HOUR FROM TIMESTAMP '2019-07-02 01:02:03');
EXTRACT(HOUR FROM TIMESTAMP '2019-07-02 01:02:03')
1
SELECT EXTRACT(YEAR FROM TIMESTAMP '2019-07-02 01:02:03') FROM t;
EXTRACT(YEAR FROM TIMESTAMP '2019-07-02 01:02:03')
2019
SELECT EXTRACT(HOUR FROM TIMESTAMP '2019-07-02 01:02:03') FROM t;
EXTRACT(HOUR FROM TIMESTAMP '2019-07-02 01:02:03')
1
SELECT EXTRACT(HOUR FROM TIME '01:02:03');
EXTRACT(HOUR FROM TIME '01:02:03')
1
SELECT EXTRACT(HOUR FROM TIME '01:02:03') FROM t;
EXTRACT(HOUR FROM TIME '01:02:03')
1
--------------------------
21. HOUR()
--------------------------
SELECT HOUR(TIME '10:05:03');
HOUR(TIME '10:05:03')
10
SELECT HOUR(TIME '10:05:03') FROM t;
HOUR(TIME '10:05:03')
10
SELECT HOUR(DATE '2019-07-02');
HOUR(DATE '2019-07-02')
0
SELECT HOUR(DATE '2019-07-02') FROM t;
HOUR(DATE '2019-07-02')
0
--------------------------
22. LAST_DAY()
--------------------------
SELECT LAST_DAY(DATE '2003-02-05');
LAST_DAY(DATE '2003-02-05')
2003-02-28
SELECT LAST_DAY(DATE '2003-02-05') FROM t;
LAST_DAY(DATE '2003-02-05')
2003-02-28
SELECT LAST_DAY(DATE '2004-02-05');
LAST_DAY(DATE '2004-02-05')
2004-02-29
SELECT LAST_DAY(DATE '2004-02-05') FROM t;
LAST_DAY(DATE '2004-02-05')
2004-02-29
SELECT LAST_DAY(TIMESTAMP '2004-01-01 01:01:01');
LAST_DAY(TIMESTAMP '2004-01-01 01:01:01')
2004-01-31
SELECT LAST_DAY(TIMESTAMP '2004-01-01 01:01:01') FROM t;
LAST_DAY(TIMESTAMP '2004-01-01 01:01:01')
2004-01-31
--------------------------
27. MICROSECOND()
--------------------------
SELECT MICROSECOND(DATE '2007-02-03');
MICROSECOND(DATE '2007-02-03')
0
SELECT MICROSECOND(DATE '2007-02-03') FROM t;
MICROSECOND(DATE '2007-02-03')
0
SELECT MICROSECOND(TIMESTAMP '2007-02-03 22:23:00.123456');
MICROSECOND(TIMESTAMP '2007-02-03 22:23:00.123456')
123456
SELECT MICROSECOND(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
MICROSECOND(TIMESTAMP '2007-02-03 22:23:00.123456')
123456
SELECT MICROSECOND(TIME '22:23:00.123456');
MICROSECOND(TIME '22:23:00.123456')
123456
SELECT MICROSECOND(TIME '22:23:00.123456') FROM t;
MICROSECOND(TIME '22:23:00.123456')
123456
--------------------------
28. MINUTE()
--------------------------
SELECT MINUTE(DATE '2007-02-03');
MINUTE(DATE '2007-02-03')
0
SELECT MINUTE(DATE '2007-02-03') FROM t;
MINUTE(DATE '2007-02-03')
0
SELECT MINUTE(TIMESTAMP '2007-02-03 22:23:00.123456');
MINUTE(TIMESTAMP '2007-02-03 22:23:00.123456')
23
SELECT MINUTE(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
MINUTE(TIMESTAMP '2007-02-03 22:23:00.123456')
23
SELECT MINUTE(TIME '22:23:00.123456');
MINUTE(TIME '22:23:00.123456')
23
SELECT MINUTE(TIME '22:23:00.123456') FROM t;
MINUTE(TIME '22:23:00.123456')
23
--------------------------
29. MONTHNAME()
--------------------------
SELECT MONTHNAME(DATE '2007-02-03');
MONTHNAME(DATE '2007-02-03')
February
SELECT MONTHNAME(DATE '2007-02-03') FROM t;
MONTHNAME(DATE '2007-02-03')
February
SELECT MONTHNAME(TIMESTAMP '2007-02-03 22:23:00.123456');
MONTHNAME(TIMESTAMP '2007-02-03 22:23:00.123456')
February
SELECT MONTHNAME(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
MONTHNAME(TIMESTAMP '2007-02-03 22:23:00.123456')
February
--------------------------
33. QUARTER()
--------------------------
SELECT QUARTER(DATE '2007-02-03');
QUARTER(DATE '2007-02-03')
1
SELECT QUARTER(DATE '2007-02-03') FROM t;
QUARTER(DATE '2007-02-03')
1
SELECT QUARTER(TIMESTAMP '2007-02-03 22:23:00.123456');
QUARTER(TIMESTAMP '2007-02-03 22:23:00.123456')
1
SELECT QUARTER(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
QUARTER(TIMESTAMP '2007-02-03 22:23:00.123456')
1
--------------------------
34. SECOND()
--------------------------
SELECT SECOND(DATE '2007-02-03');
SECOND(DATE '2007-02-03')
0
SELECT SECOND(DATE '2007-02-03') FROM t;
SECOND(DATE '2007-02-03')
0
SELECT SECOND(TIMESTAMP '2007-02-03 22:23:00.123456');
SECOND(TIMESTAMP '2007-02-03 22:23:00.123456')
0
SELECT SECOND(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SECOND(TIMESTAMP '2007-02-03 22:23:00.123456')
0
SELECT SECOND(TIME '22:23:00.123456');
SECOND(TIME '22:23:00.123456')
0
SELECT SECOND(TIME '22:23:00.123456') FROM t;
SECOND(TIME '22:23:00.123456')
0
--------------------------
37. SUBDATE()
--------------------------
SELECT SUBDATE(DATE '2020-01-01', interval 1 day);
SUBDATE(DATE '2020-01-01', interval 1 day)
2019-12-31
SELECT SUBDATE(DATE '2020-01-01', interval 1 day) FROM t;
SUBDATE(DATE '2020-01-01', interval 1 day)
2019-12-31
SELECT SUBDATE(DATE '2020-01-01', interval 1 hour);
SUBDATE(DATE '2020-01-01', interval 1 hour)
2019-12-31 23:00:00
SELECT SUBDATE(DATE '2020-01-01', interval 1 hour) FROM t;
SUBDATE(DATE '2020-01-01', interval 1 hour)
2019-12-31 23:00:00
SELECT SUBDATE(DATE '2020-01-01', 1);
SUBDATE(DATE '2020-01-01', 1)
2019-12-31
SELECT SUBDATE(DATE '2020-01-01', 1) FROM t;
SUBDATE(DATE '2020-01-01', 1)
2019-12-31
SELECT SUBDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day);
SUBDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day)
2019-12-31 12:00:00
SELECT SUBDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day) FROM t;
SUBDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day)
2019-12-31 12:00:00
--------------------------
38. SUBTIME()
--------------------------
SELECT SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002');
SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002')
2007-12-30 22:58:58.999997
SELECT SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002') FROM t;
SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002')
2007-12-30 22:58:58.999997
SELECT SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002');
SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002')
2007-12-31 22:58:58.999997
SELECT SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002') FROM t;
SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002')
2007-12-31 22:58:58.999997
--------------------------
44. TIME_TO_SEC()
--------------------------
SELECT TIME_TO_SEC(TIME '22:23:00');
TIME_TO_SEC(TIME '22:23:00')
80580
SELECT TIME_TO_SEC(TIME '22:23:00') FROM t;
TIME_TO_SEC(TIME '22:23:00')
80580
--------------------------
45. TO_DAYS()
--------------------------
SELECT TO_DAYS('2007-10-07');
TO_DAYS('2007-10-07')
733321
SELECT TO_DAYS('2007-10-07') FROM t;
TO_DAYS('2007-10-07')
733321
--------------------------
47. UNIX_TIMESTAMP()
--------------------------
SELECT UNIX_TIMESTAMP(TIMESTAMP '2015-11-13 10:20:19');
UNIX_TIMESTAMP(TIMESTAMP '2015-11-13 10:20:19')
1447410019
SELECT UNIX_TIMESTAMP(TIMESTAMP '2015-11-13 10:20:19') FROM t;
UNIX_TIMESTAMP(TIMESTAMP '2015-11-13 10:20:19')
1447410019
--------------------------
51. WEEK()
--------------------------
SELECT WEEK(DATE '2009-01-01', 4);
WEEK(DATE '2009-01-01', 4)
0
SELECT WEEK(DATE '2009-01-01', 4) FROM t;
WEEK(DATE '2009-01-01', 4)
0
SELECT WEEK(DATE '2009-01-01', 5);
WEEK(DATE '2009-01-01', 5)
0
SELECT WEEK(DATE '2009-01-01', 5) FROM t;
WEEK(DATE '2009-01-01', 5)
0
SELECT WEEK(DATE '2009-01-01', 6);
WEEK(DATE '2009-01-01', 6)
53
SELECT WEEK(DATE '2009-01-01', 6) FROM t;
WEEK(DATE '2009-01-01', 6)
53
SELECT WEEK(DATE '2009-01-01', 7);
WEEK(DATE '2009-01-01', 7)
52
SELECT WEEK(DATE '2009-01-01', 7) FROM t;
WEEK(DATE '2009-01-01', 7)
52
--------------------------
52. WEEKDAY()
--------------------------
SELECT WEEKDAY(TIMESTAMP '2008-02-03 22:23:00');
WEEKDAY(TIMESTAMP '2008-02-03 22:23:00')
6
SELECT WEEKDAY(TIMESTAMP '2008-02-03 22:23:00') FROM t;
WEEKDAY(TIMESTAMP '2008-02-03 22:23:00')
6
--------------------------
53. WEEKOFYEAR()
--------------------------
SELECT WEEKOFYEAR(DATE '2008-02-20');
WEEKOFYEAR(DATE '2008-02-20')
8
SELECT WEEKOFYEAR(DATE '2008-02-20') FROM t;
WEEKOFYEAR(DATE '2008-02-20')
8
SELECT WEEKOFYEAR(TIMESTAMP '2008-02-03 22:23:00');
WEEKOFYEAR(TIMESTAMP '2008-02-03 22:23:00')
5
SELECT WEEKOFYEAR(TIMESTAMP '2008-02-03 22:23:00') FROM t;
WEEKOFYEAR(TIMESTAMP '2008-02-03 22:23:00')
5
--------------------------
54. YEAR()
--------------------------
SELECT YEAR(DATE '1987-01-01');
YEAR(DATE '1987-01-01')
1987
SELECT YEAR(DATE '1987-01-01') FROM t;
YEAR(DATE '1987-01-01')
1987
SELECT YEAR(TIMESTAMP '1987-01-01 13:12:14');
YEAR(TIMESTAMP '1987-01-01 13:12:14')
1987
SELECT YEAR(TIMESTAMP '1987-01-01 13:12:14') FROM t;
YEAR(TIMESTAMP '1987-01-01 13:12:14')
1987
--------------------------
55. YEARWEEK()
--------------------------
SELECT YEARWEEK(DATE '2009-01-01', 1);
YEARWEEK(DATE '2009-01-01', 1)
200901
SELECT YEARWEEK(DATE '2009-01-01', 1) FROM t;
YEARWEEK(DATE '2009-01-01', 1)
200901
SELECT YEARWEEK(DATE '2009-01-01', 2);
YEARWEEK(DATE '2009-01-01', 2)
200852
SELECT YEARWEEK(DATE '2009-01-01', 2) FROM t;
YEARWEEK(DATE '2009-01-01', 2)
200852
SELECT YEARWEEK(DATE '2009-01-01', 3);
YEARWEEK(DATE '2009-01-01', 3)
200901
SELECT YEARWEEK(DATE '2009-01-01', 3) FROM t;
YEARWEEK(DATE '2009-01-01', 3)
200901
SELECT YEARWEEK(DATE '2009-01-01', 4);
YEARWEEK(DATE '2009-01-01', 4)
200853
SELECT YEARWEEK(DATE '2009-01-01', 4) FROM t;
YEARWEEK(DATE '2009-01-01', 4)
200853
SELECT YEARWEEK(DATE '2009-01-01', 5);
YEARWEEK(DATE '2009-01-01', 5)
200852
SELECT YEARWEEK(DATE '2009-01-01', 5) FROM t;
YEARWEEK(DATE '2009-01-01', 5)
200852
SELECT YEARWEEK(DATE '2009-01-01', 6);
YEARWEEK(DATE '2009-01-01', 6)
200853
SELECT YEARWEEK(DATE '2009-01-01', 6) FROM t;
YEARWEEK(DATE '2009-01-01', 6)
200853
SELECT YEARWEEK(DATE '2009-01-01', 7);
YEARWEEK(DATE '2009-01-01', 7)
200852
SELECT YEARWEEK(DATE '2009-01-01', 7) FROM t;
YEARWEEK(DATE '2009-01-01', 7)
200852
DROP TABLE t;
DROP DATABASE test_duckdb;

View File

@@ -11,6 +11,11 @@
# 8. [Solved] For CURRENT_TIME(), CURRENT_TIMESTAMP(), CURTIME(), LOCALTIME(), LOCALTIMESTAMP(), NOW(), UTC_TIME(), UTC_TIMESTAMP(), the fsp argument is not support.
# 9. MySQL accepts NULL as function input but DuckDB does not.
# The above scenarios cannot guarantee compatibility and therefore will not appear in this test case.
#
# This test keeps only the SUPPORTED cases: deterministic queries on DATE /
# TIMESTAMP literals (and TIME-component extraction) whose DuckDB pushdown
# matches MariaDB. The incompatible / non-deterministic / erroring cases live
# in duckdb_time_func_unsupported.test.
CREATE DATABASE test_duckdb;
USE test_duckdb;
@@ -28,14 +33,6 @@ SELECT ADDDATE(DATE '2020-01-01', 1);
SELECT ADDDATE(DATE '2020-01-01', 1) FROM t;
SELECT ADDDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day);
SELECT ADDDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day) FROM t;
SET timestamp = 1753226301;
SELECT ADDDATE(TIME '12:00:00', interval 1 hour);
SELECT ADDDATE(TIME '12:00:00', interval 1 hour) FROM t;
# Incompatibilities 7
SELECT ADDDATE(TIME '12:00:00', interval 1 day);
SELECT ADDDATE(TIME '12:00:00', interval 1 day) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 2. ADDTIME()
@@ -46,85 +43,6 @@ SELECT addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002') FROM t;
SELECT addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002');
SELECT addtime(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002') FROM t;
# Incompatibilities 3
SET timestamp = 1753226301;
SELECT addtime(TIME '23:59:59.999999', '1 1:1:1.000002');
SELECT addtime(TIME '23:59:59.999999', '1 1:1:1.000002') FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 3. CONVERT_TZ()
--echo ---------------------------
SELECT CONVERT_TZ(TIMESTAMP '2004-01-01 12:00:00','GMT','MET');
SELECT CONVERT_TZ(TIMESTAMP '2004-01-01 12:00:00','GMT','MET') FROM t;
# timezone
SELECT CONVERT_TZ(TIMESTAMP '2004-01-01 12:00:00','+00:00','+10:00');
--error ER_GET_ERRMSG
SELECT CONVERT_TZ(TIMESTAMP '2004-01-01 12:00:00','+00:00','+10:00') FROM t;
--echo ---------------------------
--echo 4. CURDATE()
--echo ---------------------------
SET timestamp = 1753226301;
SELECT CURDATE();
SELECT CURDATE() FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 5. CURRENT_DATE, CURRENT_TIME()
--echo ---------------------------
SET timestamp = 1753226301;
SELECT CURRENT_DATE;
SELECT CURRENT_DATE FROM t;
SELECT CURRENT_DATE();
SELECT CURRENT_DATE() FROM t;
SELECT CURRENT_TIME;
SELECT CURRENT_TIME FROM t;
SELECT CURRENT_TIME();
SELECT CURRENT_TIME() FROM t;
SELECT CURRENT_TIME(1);
SELECT CURRENT_TIME(1) FROM t;
SELECT CURRENT_TIME(6);
SELECT CURRENT_TIME(6) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 6. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP()
--echo ---------------------------
SET timestamp = 1753226301;
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP FROM t;
SELECT CURRENT_TIMESTAMP();
SELECT CURRENT_TIMESTAMP() FROM t;
SELECT CURRENT_TIMESTAMP(1);
SELECT CURRENT_TIMESTAMP(1) FROM t;
SELECT CURRENT_TIMESTAMP(6);
SELECT CURRENT_TIMESTAMP(6) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 7. CURTIME()
--echo ---------------------------
SET timestamp = 1753226301;
SELECT CURTIME();
SELECT CURTIME() FROM t;
SELECT CURTIME(1);
SELECT CURTIME(1) FROM t;
SELECT CURTIME(6);
SELECT CURTIME(6) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 8. DATE()
--echo ---------------------------
@@ -134,13 +52,6 @@ SELECT DATE(TIMESTAMP '2003-12-31 01:02:03') FROM t;
SELECT DATE(DATE '2003-12-31');
SELECT DATE(DATE '2003-12-31') FROM t;
# Incompatibilities 7
SET timestamp = 1753226301;
SELECT DATE(TIME '01:02:03');
--error ER_GET_ERRMSG
SELECT DATE(TIME '01:02:03') FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 9. DATEDIFF()
--echo ---------------------------
@@ -150,13 +61,8 @@ SELECT DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', DATE '2007-12-30') FROM t;
SELECT DATEDIFF(TIMESTAMP '2010-11-30 23:59:59', DATE '2010-12-31');
SELECT DATEDIFF(TIMESTAMP '2010-11-30 23:59:59', DATE '2010-12-31') FROM t;
SET timestamp = 1753226301;
SELECT DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', TIME '23:59:59');
SELECT DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', TIME '23:59:59') FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 10. DATE_ADD(),DATE_SUB()
--echo 10. DATE_ADD()
--echo ---------------------------
SELECT DATE_ADD(DATE '2020-01-01', interval 1 day);
@@ -165,50 +71,6 @@ SELECT DATE_ADD(DATE '2020-01-01', interval 1 hour);
SELECT DATE_ADD(DATE '2020-01-01', interval 1 hour) FROM t;
SELECT DATE_ADD(TIMESTAMP '2020-01-01 12:00:00', interval 1 day);
SELECT DATE_ADD(TIMESTAMP '2020-01-01 12:00:00', interval 1 day) FROM t;
SELECT DATE_ADD(TIME '12:00:00', interval 1 hour);
SELECT DATE_ADD(TIME '12:00:00', interval 1 hour) FROM t;
# Incompatibilities 3
SET timestamp = 1753226301;
SELECT DATE_ADD(TIME '12:00:00', interval 1 day);
SELECT DATE_ADD(TIME '12:00:00', interval 1 day) FROM t;
SET timestamp = default;
SELECT DATE_SUB(DATE '2020-01-01', interval 1 day);
SELECT DATE_SUB(DATE '2020-01-01', interval 1 day) FROM t;
SELECT DATE_SUB(DATE '2020-01-01', interval 1 hour);
SELECT DATE_SUB(DATE '2020-01-01', interval 1 hour) FROM t;
SELECT DATE_SUB(TIMESTAMP '2020-01-01 12:00:00', interval 1 day);
SELECT DATE_SUB(TIMESTAMP '2020-01-01 12:00:00', interval 1 day) FROM t;
SET timestamp = 1753226301;
SELECT DATE_SUB(TIME '12:00:00', interval 1 hour);
SELECT DATE_SUB(TIME '12:00:00', interval 1 hour) FROM t;
# Incompatibilities 7
SELECT DATE_SUB(TIME '12:00:00', interval 1 day);
SELECT DATE_SUB(TIME '12:00:00', interval 1 day) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 11. DATE_FORMAT()
--echo ---------------------------
SELECT DATE_FORMAT(TIMESTAMP '2009-10-04 22:23:00.123456', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v');
SELECT DATE_FORMAT(TIMESTAMP '2009-10-04 22:23:00.123456', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v') FROM t;
SELECT DATE_FORMAT(DATE '2009-10-04', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v');
SELECT DATE_FORMAT(DATE '2009-10-04', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v') FROM t;
# Incompatibilities 3
SET timestamp = 1753226301;
SELECT DATE_FORMAT(TIME '22:23:00.123456', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v');
SELECT DATE_FORMAT(TIME '22:23:00.123456', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v') FROM t;
SET timestamp = default;
# Incompatibilities 6: %u, %V, %X is not supoorted now.
SELECT DATE_FORMAT(TIMESTAMP '2009-10-04 22:23:00.123456', '%V, %X, %u');
--error ER_GET_ERRMSG
SELECT DATE_FORMAT(TIMESTAMP '2009-10-04 22:23:00.123456', '%V, %X, %u') FROM t;
--echo ---------------------------
--echo 12. DAY()
@@ -219,11 +81,6 @@ SELECT DAY(DATE '2007-02-03') FROM t;
SELECT DAY(TIMESTAMP '2007-02-03 22:23:00.123456');
SELECT DAY(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SET timestamp = 1753226301;
SELECT DAY(TIME '22:23:00.123456');
SELECT DAY(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 13. DAYNAME()
--echo --------------------------
@@ -233,11 +90,6 @@ SELECT DAYNAME(DATE '2007-02-03') FROM t;
SELECT DAYNAME(TIMESTAMP '2007-02-03 22:23:00.123456');
SELECT DAYNAME(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SET timestamp = 1753226301;
SELECT DAYNAME(TIME '22:23:00.123456');
SELECT DAYNAME(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 14. DAYOFMONTH()
--echo --------------------------
@@ -247,11 +99,6 @@ SELECT DAYOFMONTH(DATE '2007-02-03') FROM t;
SELECT DAYOFMONTH(TIMESTAMP '2007-02-03 22:23:00.123456');
SELECT DAYOFMONTH(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SET timestamp = 1753226301;
SELECT DAYOFMONTH(TIME '22:23:00.123456');
SELECT DAYOFMONTH(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 15. DAYOFWEEK()
--echo --------------------------
@@ -261,11 +108,6 @@ SELECT DAYOFWEEK(DATE '2007-02-03') FROM t;
SELECT DAYOFWEEK(TIMESTAMP '2007-02-03 22:23:00.123456');
SELECT DAYOFWEEK(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SET timestamp = 1753226301;
SELECT DAYOFWEEK(TIME '22:23:00.123456');
SELECT DAYOFWEEK(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 16. DAYOFYEAR()
--echo --------------------------
@@ -275,11 +117,6 @@ SELECT DAYOFYEAR(DATE '2007-02-03') FROM t;
SELECT DAYOFYEAR(TIMESTAMP '2007-02-03 22:23:00.123456');
SELECT DAYOFYEAR(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SET timestamp = 1753226301;
SELECT DAYOFYEAR(TIME '22:23:00.123456');
SELECT DAYOFYEAR(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 17. EXTRACT()
--echo --------------------------
@@ -297,36 +134,6 @@ SELECT EXTRACT(HOUR FROM TIMESTAMP '2019-07-02 01:02:03') FROM t;
SELECT EXTRACT(HOUR FROM TIME '01:02:03');
SELECT EXTRACT(HOUR FROM TIME '01:02:03') FROM t;
SET timestamp = 1753226301;
SELECT EXTRACT(YEAR FROM TIME '01:02:03');
SELECT EXTRACT(YEAR FROM TIME '01:02:03') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 18. FROM_DAYS()
--echo --------------------------
SELECT FROM_DAYS(0);
SELECT FROM_DAYS(0) FROM t;
SELECT FROM_DAYS(730669);
SELECT FROM_DAYS(730669) FROM t;
--echo --------------------------
--echo 19. FROM_UNIXTIME()
--echo --------------------------
SELECT FROM_UNIXTIME(1447430881);
SELECT FROM_UNIXTIME(1447430881) FROM t;
SELECT FROM_UNIXTIME(1447430881, '%Y %D %M %h:%i:%s');
SELECT FROM_UNIXTIME(1447430881, '%Y %D %M %h:%i:%s') FROM t;
--echo --------------------------
--echo 20. GET_FORMAT()
--echo --------------------------
# Not support yet
--echo --------------------------
--echo 21. HOUR()
--echo --------------------------
@@ -350,66 +157,6 @@ SELECT LAST_DAY(DATE '2004-02-05') FROM t;
SELECT LAST_DAY(TIMESTAMP '2004-01-01 01:01:01');
SELECT LAST_DAY(TIMESTAMP '2004-01-01 01:01:01') FROM t;
SET timestamp = 1753226301;
SELECT LAST_DAY(TIME '01:01:01');
SELECT LAST_DAY(TIME '01:01:01') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 23. LOCALTIME, LOCALTIME()
--echo --------------------------
SET timestamp = 1753226301;
SELECT LOCALTIME;
SELECT LOCALTIME FROM t;
SELECT LOCALTIME();
SELECT LOCALTIME() FROM t;
SELECT LOCALTIME(1);
SELECT LOCALTIME(1) FROM t;
SELECT LOCALTIME(6);
SELECT LOCALTIME(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 24. LOCALTIMESTAMP, LOCALTIMESTAMP()
--echo --------------------------
SET timestamp = 1753226301;
SELECT LOCALTIMESTAMP;
SELECT LOCALTIMESTAMP FROM t;
SELECT LOCALTIMESTAMP();
SELECT LOCALTIMESTAMP() FROM t;
SELECT LOCALTIMESTAMP(1);
SELECT LOCALTIMESTAMP(1) FROM t;
SELECT LOCALTIMESTAMP(6);
SELECT LOCALTIMESTAMP(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 25. MAKEDATE()
--echo --------------------------
SELECT MAKEDATE(2011,31), MAKEDATE(2011,32);
SELECT MAKEDATE(2011,31), MAKEDATE(2011,32) FROM t;
SELECT MAKEDATE(2011,365), MAKEDATE(2014,365);
SELECT MAKEDATE(2011,365), MAKEDATE(2014,365) FROM t;
SELECT MAKEDATE(2011,0);
SELECT MAKEDATE(2011,0) FROM t;
--echo --------------------------
--echo 26. MAKETIME()
--echo --------------------------
SELECT MAKETIME(12,15,30);
SELECT MAKETIME(12,15,30) FROM t;
# Incompatibilities 3
SELECT MAKETIME(838,59,59);
--error ER_GET_ERRMSG
SELECT MAKETIME(838,59,59) FROM t;
--echo --------------------------
--echo 27. MICROSECOND()
--echo --------------------------
@@ -443,63 +190,6 @@ SELECT MONTHNAME(DATE '2007-02-03') FROM t;
SELECT MONTHNAME(TIMESTAMP '2007-02-03 22:23:00.123456');
SELECT MONTHNAME(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SET timestamp = 1753226301;
SELECT MONTHNAME(TIME '22:23:00.123456');
SELECT MONTHNAME(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 30. NOW()
--echo --------------------------
SET timestamp = 1753226301;
SELECT NOW();
SELECT NOW() FROM t;
SELECT NOW(1);
SELECT NOW(1) FROM t;
SELECT NOW(6);
SELECT NOW(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 31. PERIOD_ADD()
--echo --------------------------
SELECT PERIOD_ADD(200801,2);
SELECT PERIOD_ADD(200801,2) FROM t;
SELECT PERIOD_ADD(801,2);
SELECT PERIOD_ADD(801,2) FROM t;
SELECT PERIOD_ADD(8801,2);
SELECT PERIOD_ADD(8801,2) FROM t;
SELECT PERIOD_ADD(1,2);
SELECT PERIOD_ADD(1,2) FROM t;
SELECT PERIOD_ADD(10101, 2);
SELECT PERIOD_ADD(10101, 2) FROM t;
# The year range of duckdb only supports 0000~9999
SELECT PERIOD_ADD(12340101, 2);
SELECT PERIOD_ADD(12340101, 2) FROM t;
--echo --------------------------
--echo 32. PERIOD_DIFF()
--echo --------------------------
SELECT PERIOD_DIFF(200801,801);
SELECT PERIOD_DIFF(200801,801) FROM t;
SELECT PERIOD_DIFF(200801,8801);
SELECT PERIOD_DIFF(200801,8801) FROM t;
SELECT PERIOD_DIFF(200801,1);
SELECT PERIOD_DIFF(200801,1) FROM t;
SELECT PERIOD_DIFF(200801,10101);
SELECT PERIOD_DIFF(200801,10101) FROM t;
# The year range of duckdb only supports 0000~9999
SELECT PERIOD_DIFF(200801, 12340101);
SELECT PERIOD_DIFF(200801, 12340101) FROM t;
--echo --------------------------
--echo 33. QUARTER()
--echo --------------------------
@@ -509,11 +199,6 @@ SELECT QUARTER(DATE '2007-02-03') FROM t;
SELECT QUARTER(TIMESTAMP '2007-02-03 22:23:00.123456');
SELECT QUARTER(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SET timestamp = 1753226301;
SELECT QUARTER(TIME '22:23:00.123456');
SELECT QUARTER(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 34. SECOND()
--echo --------------------------
@@ -526,44 +211,6 @@ SELECT SECOND(TIMESTAMP '2007-02-03 22:23:00.123456') FROM t;
SELECT SECOND(TIME '22:23:00.123456');
SELECT SECOND(TIME '22:23:00.123456') FROM t;
--echo --------------------------
--echo 35. SEC_TO_TIME()
--echo --------------------------
SELECT SEC_TO_TIME(10000);
SELECT SEC_TO_TIME(10000) FROM t;
# Incompatibilities 3
SELECT SEC_TO_TIME(100000);
SELECT SEC_TO_TIME(100000) FROM t;
--echo --------------------------
--echo 36. STR_TO_DATE()
--echo --------------------------
SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y');
SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y') FROM t;
SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s');
SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s') FROM t;
SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y');
SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y') FROM t;
SELECT STR_TO_DATE('a09:30:17','%h:%i:%s');
SELECT STR_TO_DATE('a09:30:17','%h:%i:%s') FROM t;
SELECT STR_TO_DATE('abc','abc');
SELECT STR_TO_DATE('abc','abc') FROM t;
SELECT STR_TO_DATE('9','%m');
SELECT STR_TO_DATE('9','%m') FROM t;
SELECT STR_TO_DATE('09:30:17a','%h:%i:%s');
SELECT STR_TO_DATE('09:30:17a','%h:%i:%s') FROM t;
# Besides, the sql_mode will affect sql results in MySQL.
--echo --------------------------
--echo 37. SUBDATE()
--echo --------------------------
@@ -576,14 +223,6 @@ SELECT SUBDATE(DATE '2020-01-01', 1);
SELECT SUBDATE(DATE '2020-01-01', 1) FROM t;
SELECT SUBDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day);
SELECT SUBDATE(TIMESTAMP '2020-01-01 12:00:00', interval 1 day) FROM t;
SET timestamp = 1753226301;
SELECT SUBDATE(TIME '12:00:00', interval 1 hour);
SELECT SUBDATE(TIME '12:00:00', interval 1 hour) FROM t;
# Incompatibilities 7
SELECT SUBDATE(TIME '12:00:00', interval 1 day);
SELECT SUBDATE(TIME '12:00:00', interval 1 day) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 38. SUBTIME()
@@ -594,70 +233,6 @@ SELECT SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1 1:1:1.000002') FROM t;
SELECT SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002');
SELECT SUBTIME(TIMESTAMP '2007-12-31 23:59:59.999999', '1:1:1.000002') FROM t;
# Incompatibilities 3
SELECT SUBTIME(TIME '23:59:59.999999', '1 1:1:1.000002');
SELECT SUBTIME(TIME '23:59:59.999999', '1 1:1:1.000002') FROM t;
--echo --------------------------
--echo 39. SYSDATE()
--echo --------------------------
# SELECT SYSDATE();
# SELECT SYSDATE() FROM t;
--echo --------------------------
--echo 40. TIME()
--echo --------------------------
# Not support yet
--echo --------------------------
--echo 41. TIMEDIFF()
--echo --------------------------
# Not support yet
--echo --------------------------
--echo 42. TIMESTAMP()
--echo --------------------------
# Not support yet
--echo --------------------------
--echo 42. TIMESTAMPADD()
--echo --------------------------
SELECT TIMESTAMPADD(MINUTE, 1, DATE '2003-01-02');
SELECT TIMESTAMPADD(MINUTE, 1, DATE '2003-01-02') FROM t;
SELECT TIMESTAMPADD(WEEK, 1, DATE '2003-01-02');
SELECT TIMESTAMPADD(WEEK, 1, DATE '2003-01-02') FROM t;
--echo --------------------------
--echo 43. TIMESTAMPDIFF()
--echo --------------------------
SELECT TIMESTAMPDIFF(MONTH, DATE '2003-02-01', DATE '2003-05-01');
SELECT TIMESTAMPDIFF(MONTH, DATE '2003-02-01', DATE '2003-05-01') FROM t;
SELECT TIMESTAMPDIFF(YEAR, DATE '2002-05-01', DATE '2001-01-01');
SELECT TIMESTAMPDIFF(YEAR, DATE '2002-05-01', DATE '2001-01-01') FROM t;
SELECT TIMESTAMPDIFF(MINUTE, DATE '2003-02-01', TIMESTAMP '2003-05-01 12:05:55');
SELECT TIMESTAMPDIFF(MINUTE, DATE '2003-02-01', TIMESTAMP '2003-05-01 12:05:55') FROM t;
--echo --------------------------
--echo 44. TIME_FORMAT()
--echo --------------------------
SELECT TIME_FORMAT(TIME '01:02:03', '%H %k %h %I %l');
SELECT TIME_FORMAT(TIME '01:02:03', '%H %k %h %I %l') FROM t;
# Incompatibilities 3
SELECT TIME_FORMAT(TIME '100:02:03', '%H %k %h %I %l');
--error ER_GET_ERRMSG
SELECT TIME_FORMAT(TIME '100:02:03', '%H %k %h %I %l') FROM t;
--echo --------------------------
--echo 44. TIME_TO_SEC()
--echo --------------------------
@@ -665,11 +240,6 @@ SELECT TIME_FORMAT(TIME '100:02:03', '%H %k %h %I %l') FROM t;
SELECT TIME_TO_SEC(TIME '22:23:00');
SELECT TIME_TO_SEC(TIME '22:23:00') FROM t;
# Incompatibilities 3
SELECT TIME_TO_SEC(TIME '220:23:00');
--error ER_GET_ERRMSG
SELECT TIME_TO_SEC(TIME '220:23:00') FROM t;
--echo --------------------------
--echo 45. TO_DAYS()
--echo --------------------------
@@ -677,28 +247,6 @@ SELECT TIME_TO_SEC(TIME '220:23:00') FROM t;
SELECT TO_DAYS('2007-10-07');
SELECT TO_DAYS('2007-10-07') FROM t;
# Incompatibilities 7
SET timestamp = 1753226301;
SELECT TO_DAYS(TIME '12:00:00');
--error ER_GET_ERRMSG
SELECT TO_DAYS(TIME '12:00:00') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 46. TO_SECONDS()
--echo --------------------------
SELECT TO_SECONDS(DATE '2009-11-29');
SELECT TO_SECONDS(DATE '2009-11-29') FROM t;
SELECT TO_SECONDS(TIMESTAMP '2009-11-29 13:43:32');
SELECT TO_SECONDS(TIMESTAMP '2009-11-29 13:43:32') FROM t;
SET timestamp = 1753226301;
SELECT TO_SECONDS(TIME '12:00:00');
SELECT TO_SECONDS(TIME '12:00:00') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 47. UNIX_TIMESTAMP()
--echo --------------------------
@@ -706,71 +254,10 @@ SET timestamp = default;
SELECT UNIX_TIMESTAMP(TIMESTAMP '2015-11-13 10:20:19');
SELECT UNIX_TIMESTAMP(TIMESTAMP '2015-11-13 10:20:19') FROM t;
SET timestamp = 1753226301;
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP() FROM t;
SET timestamp = default;
--echo --------------------------
--echo 48. UTC_DATE()
--echo --------------------------
SET timestamp = 1753226301;
SELECT UTC_DATE();
SELECT UTC_DATE() FROM t;
SELECT UTC_DATE;
SELECT UTC_DATE FROM t;
SET timestamp = default;
--echo --------------------------
--echo 49. UTC_TIME()
--echo --------------------------
SET timestamp = 1753226301;
SELECT UTC_TIME();
SELECT UTC_TIME() FROM t;
SELECT UTC_TIME;
SELECT UTC_TIME FROM t;
SELECT UTC_TIME(1);
SELECT UTC_TIME(1) FROM t;
SELECT UTC_TIME(6);
SELECT UTC_TIME(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 50. UTC_TIMESTAMP()
--echo --------------------------
SET timestamp = 1753226301;
SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP() FROM t;
SELECT UTC_TIMESTAMP;
SELECT UTC_TIMESTAMP FROM t;
SELECT UTC_TIMESTAMP(1);
SELECT UTC_TIMESTAMP(1) FROM t;
SELECT UTC_TIMESTAMP(6);
SELECT UTC_TIMESTAMP(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 51. WEEK()
--echo --------------------------
SELECT WEEK(DATE '2009-01-01');
SELECT WEEK(DATE '2009-01-01') FROM t;
set @old_default_week_format = @@default_week_format;
set default_week_format = 1;
SELECT WEEK(DATE '2009-01-01');
SELECT WEEK(DATE '2009-01-01') FROM t;
set default_week_format = 2;
SELECT WEEK(DATE '2009-01-01');
SELECT WEEK(DATE '2009-01-01') FROM t;
set default_week_format = 3;
SELECT WEEK(DATE '2009-01-01');
SELECT WEEK(DATE '2009-01-01') FROM t;
set default_week_format = @old_default_week_format;
SELECT WEEK(DATE '2009-01-01', 4);
SELECT WEEK(DATE '2009-01-01', 4) FROM t;
SELECT WEEK(DATE '2009-01-01', 5);
@@ -796,11 +283,6 @@ SELECT WEEKOFYEAR(DATE '2008-02-20') FROM t;
SELECT WEEKOFYEAR(TIMESTAMP '2008-02-03 22:23:00');
SELECT WEEKOFYEAR(TIMESTAMP '2008-02-03 22:23:00') FROM t;
SET timestamp = 1753226301;
SELECT WEEKOFYEAR(TIME '12:20:22');
SELECT WEEKOFYEAR(TIME '12:20:22') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 54. YEAR()
--echo --------------------------
@@ -810,24 +292,10 @@ SELECT YEAR(DATE '1987-01-01') FROM t;
SELECT YEAR(TIMESTAMP '1987-01-01 13:12:14');
SELECT YEAR(TIMESTAMP '1987-01-01 13:12:14') FROM t;
SET timestamp = 1753226301;
SELECT YEAR(TIME '12:20:22');
SELECT YEAR(TIME '12:20:22') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 55. YEARWEEK()
--echo --------------------------
SELECT YEARWEEK(DATE '2009-01-01');
SELECT YEARWEEK(DATE '2009-01-01') FROM t;
set @old_default_week_format = @@default_week_format;
set default_week_format = 1;
SELECT YEARWEEK(DATE '2009-01-01');
SELECT YEARWEEK(DATE '2009-01-01') FROM t;
set default_week_format = @old_default_week_format;
SELECT YEARWEEK(DATE '2009-01-01', 1);
SELECT YEARWEEK(DATE '2009-01-01', 1) FROM t;
SELECT YEARWEEK(DATE '2009-01-01', 2);

View File

@@ -0,0 +1,698 @@
--source ../include/have_duckdb.inc
# Unsupported / incompatible date-time functions for DuckDB pushdown.
# This is the companion of duckdb_time_func.test which keeps only the
# supported (deterministic and matching) cases.
#
# The queries below are collected here because their "FROM t" pushdown to
# DuckDB either:
# (a) is non-deterministic - current-time functions return DuckDB's real
# clock, which never matches MariaDB's SET timestamp value;
# (b) is a hard error - DuckDB lacks the signature (TIME input,
# different function meaning, unsupported format specifier);
# (c) produces a mismatch - different convention (WEEKDAY numbering,
# default_week_format not honoured by DuckDB).
#
# Incompatibility references (see duckdb_time_func.test header):
# 3 - MySQL time range -838:59:59..838:59:59 vs DuckDB 00:00:00..23:59:59
# 6 - DuckDB does not honour default_week_format
# 7 - TIME implicitly converted to TIMESTAMP: MySQL uses current_date,
# DuckDB uses 1970-01-01 or cannot convert
# 8 - fsp argument not supported for current-time functions
CREATE DATABASE test_duckdb;
USE test_duckdb;
CREATE TABLE t (id INT PRIMARY KEY) ENGINE = DuckDB;
INSERT INTO t VALUES (1);
--echo ---------------------------
--echo 1. ADDDATE() - TIME input (incompatibility 7)
--echo ---------------------------
SET timestamp = 1753226301;
SELECT ADDDATE(TIME '12:00:00', interval 1 hour);
SELECT ADDDATE(TIME '12:00:00', interval 1 hour) FROM t;
SELECT ADDDATE(TIME '12:00:00', interval 1 day);
SELECT ADDDATE(TIME '12:00:00', interval 1 day) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 2. ADDTIME() - TIME input (incompatibility 3)
--echo ---------------------------
SET timestamp = 1753226301;
SELECT addtime(TIME '23:59:59.999999', '1 1:1:1.000002');
SELECT addtime(TIME '23:59:59.999999', '1 1:1:1.000002') FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 3. CONVERT_TZ() - numeric offset unsupported
--echo ---------------------------
SELECT CONVERT_TZ(TIMESTAMP '2004-01-01 12:00:00','+00:00','+10:00');
--error ER_GET_ERRMSG
SELECT CONVERT_TZ(TIMESTAMP '2004-01-01 12:00:00','+00:00','+10:00') FROM t;
--echo ---------------------------
--echo 4. CURDATE() - non-deterministic
--echo ---------------------------
SET timestamp = 1753226301;
SELECT CURDATE();
SELECT CURDATE() FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 5. CURRENT_DATE, CURRENT_TIME() - non-deterministic
--echo ---------------------------
SET timestamp = 1753226301;
SELECT CURRENT_DATE;
SELECT CURRENT_DATE FROM t;
SELECT CURRENT_DATE();
SELECT CURRENT_DATE() FROM t;
SELECT CURRENT_TIME;
SELECT CURRENT_TIME FROM t;
SELECT CURRENT_TIME();
SELECT CURRENT_TIME() FROM t;
SELECT CURRENT_TIME(1);
SELECT CURRENT_TIME(1) FROM t;
SELECT CURRENT_TIME(6);
SELECT CURRENT_TIME(6) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 6. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP() - non-deterministic
--echo ---------------------------
SET timestamp = 1753226301;
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP FROM t;
SELECT CURRENT_TIMESTAMP();
SELECT CURRENT_TIMESTAMP() FROM t;
SELECT CURRENT_TIMESTAMP(1);
SELECT CURRENT_TIMESTAMP(1) FROM t;
SELECT CURRENT_TIMESTAMP(6);
SELECT CURRENT_TIMESTAMP(6) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 7. CURTIME() - non-deterministic
--echo ---------------------------
SET timestamp = 1753226301;
SELECT CURTIME();
SELECT CURTIME() FROM t;
SELECT CURTIME(1);
SELECT CURTIME(1) FROM t;
SELECT CURTIME(6);
SELECT CURTIME(6) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 8. DATE() - TIME input (incompatibility 7)
--echo ---------------------------
SET timestamp = 1753226301;
SELECT DATE(TIME '01:02:03');
--error ER_GET_ERRMSG
SELECT DATE(TIME '01:02:03') FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 9. DATEDIFF() - TIME input (incompatibility 7)
--echo ---------------------------
SET timestamp = 1753226301;
SELECT DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', TIME '23:59:59');
SELECT DATEDIFF(TIMESTAMP '2007-12-31 23:59:59', TIME '23:59:59') FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 10. DATE_ADD(),DATE_SUB() - TIME input (incompatibility 3,7)
--echo ---------------------------
SELECT DATE_ADD(TIME '12:00:00', interval 1 hour);
SELECT DATE_ADD(TIME '12:00:00', interval 1 hour) FROM t;
SET timestamp = 1753226301;
SELECT DATE_ADD(TIME '12:00:00', interval 1 day);
SELECT DATE_ADD(TIME '12:00:00', interval 1 day) FROM t;
SET timestamp = default;
SET timestamp = 1753226301;
SELECT DATE_SUB(TIME '12:00:00', interval 1 hour);
SELECT DATE_SUB(TIME '12:00:00', interval 1 hour) FROM t;
SELECT DATE_SUB(TIME '12:00:00', interval 1 day);
SELECT DATE_SUB(TIME '12:00:00', interval 1 day) FROM t;
SET timestamp = default;
--echo ---------------------------
--echo 11. DATE_FORMAT() - TIME input & unsupported specifiers (incompatibility 3,6)
--echo ---------------------------
SET timestamp = 1753226301;
SELECT DATE_FORMAT(TIME '22:23:00.123456', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v');
SELECT DATE_FORMAT(TIME '22:23:00.123456', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v') FROM t;
SET timestamp = default;
# %u, %V, %X are not supported
SELECT DATE_FORMAT(TIMESTAMP '2009-10-04 22:23:00.123456', '%V, %X, %u');
--error ER_GET_ERRMSG
SELECT DATE_FORMAT(TIMESTAMP '2009-10-04 22:23:00.123456', '%V, %X, %u') FROM t;
--echo --------------------------
--echo 12. DAY() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT DAY(TIME '22:23:00.123456');
SELECT DAY(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 13. DAYNAME() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT DAYNAME(TIME '22:23:00.123456');
SELECT DAYNAME(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 14. DAYOFMONTH() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT DAYOFMONTH(TIME '22:23:00.123456');
SELECT DAYOFMONTH(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 15. DAYOFWEEK() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT DAYOFWEEK(TIME '22:23:00.123456');
SELECT DAYOFWEEK(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 16. DAYOFYEAR() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT DAYOFYEAR(TIME '22:23:00.123456');
SELECT DAYOFYEAR(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 17. EXTRACT() - YEAR FROM TIME (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT EXTRACT(YEAR FROM TIME '01:02:03');
SELECT EXTRACT(YEAR FROM TIME '01:02:03') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 22. LAST_DAY() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT LAST_DAY(TIME '01:01:01');
SELECT LAST_DAY(TIME '01:01:01') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 23. LOCALTIME, LOCALTIME() - non-deterministic
--echo --------------------------
SET timestamp = 1753226301;
SELECT LOCALTIME;
SELECT LOCALTIME FROM t;
SELECT LOCALTIME();
SELECT LOCALTIME() FROM t;
SELECT LOCALTIME(1);
SELECT LOCALTIME(1) FROM t;
SELECT LOCALTIME(6);
SELECT LOCALTIME(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 24. LOCALTIMESTAMP, LOCALTIMESTAMP() - non-deterministic
--echo --------------------------
SET timestamp = 1753226301;
SELECT LOCALTIMESTAMP;
SELECT LOCALTIMESTAMP FROM t;
SELECT LOCALTIMESTAMP();
SELECT LOCALTIMESTAMP() FROM t;
SELECT LOCALTIMESTAMP(1);
SELECT LOCALTIMESTAMP(1) FROM t;
SELECT LOCALTIMESTAMP(6);
SELECT LOCALTIMESTAMP(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 26. MAKETIME() - out of DuckDB time range (incompatibility 3)
--echo --------------------------
SELECT MAKETIME(838,59,59);
--error ER_GET_ERRMSG
SELECT MAKETIME(838,59,59) FROM t;
--echo --------------------------
--echo 29. MONTHNAME() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT MONTHNAME(TIME '22:23:00.123456');
SELECT MONTHNAME(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 30. NOW() - non-deterministic
--echo --------------------------
SET timestamp = 1753226301;
SELECT NOW();
SELECT NOW() FROM t;
SELECT NOW(1);
SELECT NOW(1) FROM t;
SELECT NOW(6);
SELECT NOW(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 33. QUARTER() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT QUARTER(TIME '22:23:00.123456');
SELECT QUARTER(TIME '22:23:00.123456') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 37. SUBDATE() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT SUBDATE(TIME '12:00:00', interval 1 hour);
SELECT SUBDATE(TIME '12:00:00', interval 1 hour) FROM t;
SELECT SUBDATE(TIME '12:00:00', interval 1 day);
SELECT SUBDATE(TIME '12:00:00', interval 1 day) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 35. SEC_TO_TIME() - out of DuckDB time range (incompatibility 3)
--echo --------------------------
SELECT SEC_TO_TIME(100000);
SELECT SEC_TO_TIME(100000) FROM t;
--echo --------------------------
--echo 38. SUBTIME() - TIME input (incompatibility 3)
--echo --------------------------
SELECT SUBTIME(TIME '23:59:59.999999', '1 1:1:1.000002');
SELECT SUBTIME(TIME '23:59:59.999999', '1 1:1:1.000002') FROM t;
--echo --------------------------
--echo 39. SYSDATE() - not supported yet
--echo --------------------------
# SELECT SYSDATE();
# SELECT SYSDATE() FROM t;
--echo --------------------------
--echo 40. TIME() - not supported yet
--echo --------------------------
--echo --------------------------
--echo 41. TIMEDIFF() - not supported yet
--echo --------------------------
--echo --------------------------
--echo 42. TIMESTAMP() - not supported yet
--echo --------------------------
--echo --------------------------
--echo 42. TIMESTAMPADD() - not in DuckDB; unit keyword unbindable
--echo --------------------------
SELECT TIMESTAMPADD(MINUTE, 1, DATE '2003-01-02');
--error ER_GET_ERRMSG
SELECT TIMESTAMPADD(MINUTE, 1, DATE '2003-01-02') FROM t;
SELECT TIMESTAMPADD(WEEK, 1, DATE '2003-01-02');
--error ER_GET_ERRMSG
SELECT TIMESTAMPADD(WEEK, 1, DATE '2003-01-02') FROM t;
--echo --------------------------
--echo 43. TIMESTAMPDIFF() - not in DuckDB; unit keyword unbindable
--echo --------------------------
SELECT TIMESTAMPDIFF(MONTH, DATE '2003-02-01', DATE '2003-05-01');
--error ER_GET_ERRMSG
SELECT TIMESTAMPDIFF(MONTH, DATE '2003-02-01', DATE '2003-05-01') FROM t;
SELECT TIMESTAMPDIFF(YEAR, DATE '2002-05-01', DATE '2001-01-01');
--error ER_GET_ERRMSG
SELECT TIMESTAMPDIFF(YEAR, DATE '2002-05-01', DATE '2001-01-01') FROM t;
SELECT TIMESTAMPDIFF(MINUTE, DATE '2003-02-01', TIMESTAMP '2003-05-01 12:05:55');
--error ER_GET_ERRMSG
SELECT TIMESTAMPDIFF(MINUTE, DATE '2003-02-01', TIMESTAMP '2003-05-01 12:05:55') FROM t;
--echo --------------------------
--echo 44. TIME_FORMAT() - time_format() not in DuckDB (also incompatibility 3 for >24h)
--echo --------------------------
SELECT TIME_FORMAT(TIME '01:02:03', '%H %k %h %I %l');
--error ER_GET_ERRMSG
SELECT TIME_FORMAT(TIME '01:02:03', '%H %k %h %I %l') FROM t;
SELECT TIME_FORMAT(TIME '100:02:03', '%H %k %h %I %l');
--error ER_GET_ERRMSG
SELECT TIME_FORMAT(TIME '100:02:03', '%H %k %h %I %l') FROM t;
--echo --------------------------
--echo 44. TIME_TO_SEC() - out of DuckDB time range (incompatibility 3)
--echo --------------------------
SELECT TIME_TO_SEC(TIME '220:23:00');
--error ER_GET_ERRMSG
SELECT TIME_TO_SEC(TIME '220:23:00') FROM t;
--echo --------------------------
--echo 45. TO_DAYS() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT TO_DAYS(TIME '12:00:00');
--error ER_GET_ERRMSG
SELECT TO_DAYS(TIME '12:00:00') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 46. TO_SECONDS() - DuckDB to_seconds() builds an INTERVAL, not seconds
--echo --------------------------
SELECT TO_SECONDS(DATE '2009-11-29');
--error ER_GET_ERRMSG
SELECT TO_SECONDS(DATE '2009-11-29') FROM t;
SELECT TO_SECONDS(TIMESTAMP '2009-11-29 13:43:32');
--error ER_GET_ERRMSG
SELECT TO_SECONDS(TIMESTAMP '2009-11-29 13:43:32') FROM t;
SET timestamp = 1753226301;
SELECT TO_SECONDS(TIME '12:00:00');
--error ER_GET_ERRMSG
SELECT TO_SECONDS(TIME '12:00:00') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 47. UNIX_TIMESTAMP() - no-arg form is non-deterministic
--echo --------------------------
SET timestamp = 1753226301;
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP() FROM t;
SET timestamp = default;
--echo --------------------------
--echo 48. UTC_DATE() - non-deterministic; bareword resolved as column
--echo --------------------------
SET timestamp = 1753226301;
SELECT UTC_DATE();
SELECT UTC_DATE() FROM t;
SELECT UTC_DATE;
--error ER_GET_ERRMSG
SELECT UTC_DATE FROM t;
SET timestamp = default;
--echo --------------------------
--echo 49. UTC_TIME() - non-deterministic; bareword resolved as column
--echo --------------------------
SET timestamp = 1753226301;
SELECT UTC_TIME();
SELECT UTC_TIME() FROM t;
SELECT UTC_TIME;
--error ER_GET_ERRMSG
SELECT UTC_TIME FROM t;
SELECT UTC_TIME(1);
SELECT UTC_TIME(1) FROM t;
SELECT UTC_TIME(6);
SELECT UTC_TIME(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 50. UTC_TIMESTAMP() - non-deterministic; bareword resolved as column
--echo --------------------------
SET timestamp = 1753226301;
SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP() FROM t;
SELECT UTC_TIMESTAMP;
--error ER_GET_ERRMSG
SELECT UTC_TIMESTAMP FROM t;
SELECT UTC_TIMESTAMP(1);
SELECT UTC_TIMESTAMP(1) FROM t;
SELECT UTC_TIMESTAMP(6);
SELECT UTC_TIMESTAMP(6) FROM t;
SET timestamp = default;
--echo --------------------------
--echo 51. WEEK() - single-arg default_week_format not honoured (incompatibility 6)
--echo --------------------------
SELECT WEEK(DATE '2009-01-01');
SELECT WEEK(DATE '2009-01-01') FROM t;
set @old_default_week_format = @@default_week_format;
set default_week_format = 1;
SELECT WEEK(DATE '2009-01-01');
SELECT WEEK(DATE '2009-01-01') FROM t;
set default_week_format = 2;
SELECT WEEK(DATE '2009-01-01');
SELECT WEEK(DATE '2009-01-01') FROM t;
set default_week_format = 3;
SELECT WEEK(DATE '2009-01-01');
SELECT WEEK(DATE '2009-01-01') FROM t;
set default_week_format = @old_default_week_format;
--echo --------------------------
--echo 53. WEEKOFYEAR() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT WEEKOFYEAR(TIME '12:20:22');
--error ER_GET_ERRMSG
SELECT WEEKOFYEAR(TIME '12:20:22') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 54. YEAR() - TIME input (incompatibility 7)
--echo --------------------------
SET timestamp = 1753226301;
SELECT YEAR(TIME '12:20:22');
--error ER_GET_ERRMSG
SELECT YEAR(TIME '12:20:22') FROM t;
SET timestamp = default;
--echo --------------------------
--echo 55. YEARWEEK() - single-arg default_week_format not honoured (incompatibility 6)
--echo --------------------------
SELECT YEARWEEK(DATE '2009-01-01');
SELECT YEARWEEK(DATE '2009-01-01') FROM t;
set @old_default_week_format = @@default_week_format;
set default_week_format = 1;
SELECT YEARWEEK(DATE '2009-01-01');
SELECT YEARWEEK(DATE '2009-01-01') FROM t;
set default_week_format = @old_default_week_format;
--echo ==========================================================
--echo Functions absent in DuckDB (base DATE/TIMESTAMP/numeric cases)
--echo ==========================================================
--echo --------------------------
--echo 3. CONVERT_TZ() - named zone: MariaDB returns NULL without tz tables
--echo --------------------------
SELECT CONVERT_TZ(TIMESTAMP '2004-01-01 12:00:00','GMT','MET');
SELECT CONVERT_TZ(TIMESTAMP '2004-01-01 12:00:00','GMT','MET') FROM t;
--echo --------------------------
--echo 10. DATE_SUB() - date_sub(DATE/TIMESTAMP, INTERVAL) not in DuckDB
--echo --------------------------
SELECT DATE_SUB(DATE '2020-01-01', interval 1 day);
--error ER_GET_ERRMSG
SELECT DATE_SUB(DATE '2020-01-01', interval 1 day) FROM t;
SELECT DATE_SUB(DATE '2020-01-01', interval 1 hour);
--error ER_GET_ERRMSG
SELECT DATE_SUB(DATE '2020-01-01', interval 1 hour) FROM t;
SELECT DATE_SUB(TIMESTAMP '2020-01-01 12:00:00', interval 1 day);
--error ER_GET_ERRMSG
SELECT DATE_SUB(TIMESTAMP '2020-01-01 12:00:00', interval 1 day) FROM t;
--echo --------------------------
--echo 11. DATE_FORMAT() - date_format() not in DuckDB
--echo --------------------------
SELECT DATE_FORMAT(TIMESTAMP '2009-10-04 22:23:00.123456', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v');
--error ER_GET_ERRMSG
SELECT DATE_FORMAT(TIMESTAMP '2009-10-04 22:23:00.123456', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v') FROM t;
SELECT DATE_FORMAT(DATE '2009-10-04', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v');
--error ER_GET_ERRMSG
SELECT DATE_FORMAT(DATE '2009-10-04', '%a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %W %w %Y %y %U %x %v') FROM t;
--echo --------------------------
--echo 18. FROM_DAYS() - from_days() not in DuckDB
--echo --------------------------
SELECT FROM_DAYS(0);
--error ER_GET_ERRMSG
SELECT FROM_DAYS(0) FROM t;
SELECT FROM_DAYS(730669);
--error ER_GET_ERRMSG
SELECT FROM_DAYS(730669) FROM t;
--echo --------------------------
--echo 19. FROM_UNIXTIME() - from_unixtime() not in DuckDB
--echo --------------------------
SELECT FROM_UNIXTIME(1447430881);
--error ER_GET_ERRMSG
SELECT FROM_UNIXTIME(1447430881) FROM t;
SELECT FROM_UNIXTIME(1447430881, '%Y %D %M %h:%i:%s');
--error ER_GET_ERRMSG
SELECT FROM_UNIXTIME(1447430881, '%Y %D %M %h:%i:%s') FROM t;
--echo --------------------------
--echo 25. MAKEDATE() - makedate() not in DuckDB (has make_date)
--echo --------------------------
SELECT MAKEDATE(2011,31), MAKEDATE(2011,32);
--error ER_GET_ERRMSG
SELECT MAKEDATE(2011,31), MAKEDATE(2011,32) FROM t;
SELECT MAKEDATE(2011,365), MAKEDATE(2014,365);
--error ER_GET_ERRMSG
SELECT MAKEDATE(2011,365), MAKEDATE(2014,365) FROM t;
SELECT MAKEDATE(2011,0);
--error ER_GET_ERRMSG
SELECT MAKEDATE(2011,0) FROM t;
--echo --------------------------
--echo 26. MAKETIME() - maketime() not in DuckDB (has make_time)
--echo --------------------------
SELECT MAKETIME(12,15,30);
--error ER_GET_ERRMSG
SELECT MAKETIME(12,15,30) FROM t;
--echo --------------------------
--echo 31. PERIOD_ADD() - period_add() not in DuckDB
--echo --------------------------
SELECT PERIOD_ADD(200801,2);
--error ER_GET_ERRMSG
SELECT PERIOD_ADD(200801,2) FROM t;
SELECT PERIOD_ADD(801,2);
--error ER_GET_ERRMSG
SELECT PERIOD_ADD(801,2) FROM t;
SELECT PERIOD_ADD(8801,2);
--error ER_GET_ERRMSG
SELECT PERIOD_ADD(8801,2) FROM t;
SELECT PERIOD_ADD(1,2);
--error ER_GET_ERRMSG
SELECT PERIOD_ADD(1,2) FROM t;
SELECT PERIOD_ADD(10101, 2);
--error ER_GET_ERRMSG
SELECT PERIOD_ADD(10101, 2) FROM t;
SELECT PERIOD_ADD(12340101, 2);
--error ER_GET_ERRMSG
SELECT PERIOD_ADD(12340101, 2) FROM t;
--echo --------------------------
--echo 32. PERIOD_DIFF() - period_diff() not in DuckDB
--echo --------------------------
SELECT PERIOD_DIFF(200801,801);
--error ER_GET_ERRMSG
SELECT PERIOD_DIFF(200801,801) FROM t;
SELECT PERIOD_DIFF(200801,8801);
--error ER_GET_ERRMSG
SELECT PERIOD_DIFF(200801,8801) FROM t;
SELECT PERIOD_DIFF(200801,1);
--error ER_GET_ERRMSG
SELECT PERIOD_DIFF(200801,1) FROM t;
SELECT PERIOD_DIFF(200801,10101);
--error ER_GET_ERRMSG
SELECT PERIOD_DIFF(200801,10101) FROM t;
SELECT PERIOD_DIFF(200801, 12340101);
--error ER_GET_ERRMSG
SELECT PERIOD_DIFF(200801, 12340101) FROM t;
--echo --------------------------
--echo 35. SEC_TO_TIME() - sec_to_time() not in DuckDB
--echo --------------------------
SELECT SEC_TO_TIME(10000);
--error ER_GET_ERRMSG
SELECT SEC_TO_TIME(10000) FROM t;
--echo --------------------------
--echo 36. STR_TO_DATE() - str_to_date() not in DuckDB
--echo --------------------------
SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y');
--error ER_GET_ERRMSG
SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y') FROM t;
SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s');
--error ER_GET_ERRMSG
SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s') FROM t;
SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y');
--error ER_GET_ERRMSG
SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y') FROM t;
SELECT STR_TO_DATE('a09:30:17','%h:%i:%s');
--error ER_GET_ERRMSG
SELECT STR_TO_DATE('a09:30:17','%h:%i:%s') FROM t;
SELECT STR_TO_DATE('abc','abc');
--error ER_GET_ERRMSG
SELECT STR_TO_DATE('abc','abc') FROM t;
SELECT STR_TO_DATE('9','%m');
--error ER_GET_ERRMSG
SELECT STR_TO_DATE('9','%m') FROM t;
SELECT STR_TO_DATE('09:30:17a','%h:%i:%s');
--error ER_GET_ERRMSG
SELECT STR_TO_DATE('09:30:17a','%h:%i:%s') FROM t;
DROP TABLE t;
DROP DATABASE test_duckdb;

View File

@@ -138,6 +138,20 @@ bool DuckdbManager::Initialize()
"(d1::DATE - d2::DATE)");
con->Query("CREATE OR REPLACE MACRO curdate() AS current_date");
con->Query("CREATE OR REPLACE MACRO curtime(fsp := 0) AS current_time");
/* utc_time/utc_timestamp/utc_date — UTC wall-clock; fsp ignored */
con->Query("CREATE OR REPLACE MACRO utc_timestamp(fsp := 0) AS "
"timezone('UTC', now())::TIMESTAMP");
con->Query("CREATE OR REPLACE MACRO utc_time(fsp := 0) AS "
"timezone('UTC', now())::TIME");
con->Query("CREATE OR REPLACE MACRO utc_date() AS "
"timezone('UTC', now())::DATE");
/* unix_timestamp([ts]) — epoch seconds; no arg = now() */
con->Query("CREATE OR REPLACE MACRO unix_timestamp(ts := now()) AS "
"epoch(ts)::BIGINT");
/* time_to_sec(t) — seconds since midnight */
con->Query("CREATE OR REPLACE MACRO time_to_sec(t) AS "
"(date_part('hour', t)*3600 + date_part('minute', t)*60 "
"+ date_part('second', t))::BIGINT");
/* convert_tz(ts, from_tz, to_tz) */
con->Query("CREATE OR REPLACE MACRO convert_tz(ts, from_tz, to_tz) AS "
"timezone(to_tz, timezone(from_tz, ts))");

View File

@@ -50,6 +50,7 @@
#include "duckdb/function/function_set.hpp"
#include "duckdb/parser/parsed_data/create_scalar_function_info.hpp"
#include "duckdb/common/types/timestamp.hpp"
#include "duckdb/common/types/date.hpp"
#include "duckdb/main/database.hpp"
#include "duckdb/main/connection.hpp"
@@ -1065,6 +1066,260 @@ static void regexp_replace_global_func(duckdb::DataChunk &args,
}
}
/* ================================================================
WEEK(date, mode) / YEARWEEK(date, mode)
DuckDB builtins only accept a single argument. MariaDB pushes
down the 2-arg form which carries the week-format mode.
Logic ported from MariaDB sql_time.cc / sql-common/my_time.c:
calc_daynr(), calc_days_in_year(), calc_weekday(), calc_week().
================================================================ */
/* MariaDB week_behaviour bit flags (sql/sql_time.h) */
static constexpr uint32_t MC_WEEK_MONDAY_FIRST= 1;
static constexpr uint32_t MC_WEEK_YEAR= 2;
static constexpr uint32_t MC_WEEK_FIRST_WEEKDAY= 4;
static uint32_t mc_week_mode(uint32_t mode)
{
uint32_t week_format= (mode & 7);
if (!(week_format & MC_WEEK_MONDAY_FIRST))
week_format^= MC_WEEK_FIRST_WEEKDAY;
return week_format;
}
static uint32_t mc_calc_days_in_year(uint32_t year)
{
return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)))
? 366
: 365;
}
static long mc_calc_daynr(uint32_t year, uint32_t month, uint32_t day)
{
long delsum;
int temp;
int y= (int) year;
if (y == 0 && month == 0)
return 0;
delsum= (long) (365 * y + 31 * ((int) month - 1) + (int) day);
if (month <= 2)
y--;
else
delsum-= (long) ((int) month * 4 + 23) / 10;
temp= (int) ((y / 100 + 1) * 3) / 4;
return delsum + y / 4 - temp;
}
static int mc_calc_weekday(long daynr, bool sunday_first_day_of_week)
{
return (int) ((daynr + 5L + (sunday_first_day_of_week ? 1L : 0L)) % 7);
}
static uint32_t mc_calc_week(uint32_t l_year, uint32_t l_month, uint32_t l_day,
uint32_t week_behaviour, uint32_t *year)
{
uint32_t days;
long daynr= mc_calc_daynr(l_year, l_month, l_day);
long first_daynr= mc_calc_daynr(l_year, 1, 1);
bool monday_first= (week_behaviour & MC_WEEK_MONDAY_FIRST) != 0;
bool week_year= (week_behaviour & MC_WEEK_YEAR) != 0;
bool first_weekday= (week_behaviour & MC_WEEK_FIRST_WEEKDAY) != 0;
uint32_t weekday= (uint32_t) mc_calc_weekday(first_daynr, !monday_first);
*year= l_year;
if (l_month == 1 && l_day <= 7 - weekday)
{
if (!week_year &&
((first_weekday && weekday != 0) ||
(!first_weekday && weekday >= 4)))
return 0;
week_year= true;
(*year)--;
first_daynr-= (days= mc_calc_days_in_year(*year));
weekday= (weekday + 53 * 7 - days) % 7;
}
if ((first_weekday && weekday != 0) ||
(!first_weekday && weekday >= 4))
days= daynr - (first_daynr + (7 - weekday));
else
days= daynr - (first_daynr - weekday);
if (week_year && days >= 52 * 7)
{
weekday= (weekday + mc_calc_days_in_year(*year)) % 7;
if ((!first_weekday && weekday < 4) ||
(first_weekday && weekday == 0))
{
(*year)++;
return 1;
}
}
return days / 7 + 1;
}
/* WEEK(DATE, INTEGER) -> BIGINT */
static void week_2arg_date_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::BinaryExecutor::Execute<duckdb::date_t, int32_t, int64_t>(
args.data[0], args.data[1], result, args.size(),
[](duckdb::date_t d, int32_t mode) -> int64_t {
int32_t y, m, day;
duckdb::Date::Convert(d, y, m, day);
uint32_t year;
return (int64_t) mc_calc_week((uint32_t) y, (uint32_t) m,
(uint32_t) day,
mc_week_mode((uint32_t) mode), &year);
});
}
/* WEEK(TIMESTAMP, INTEGER) -> BIGINT */
static void week_2arg_ts_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::BinaryExecutor::Execute<duckdb::timestamp_t, int32_t, int64_t>(
args.data[0], args.data[1], result, args.size(),
[](duckdb::timestamp_t ts, int32_t mode) -> int64_t {
int32_t y, m, day;
duckdb::Date::Convert(duckdb::Timestamp::GetDate(ts), y, m, day);
uint32_t year;
return (int64_t) mc_calc_week((uint32_t) y, (uint32_t) m,
(uint32_t) day,
mc_week_mode((uint32_t) mode), &year);
});
}
/* YEARWEEK(DATE, INTEGER) -> BIGINT */
static void yearweek_2arg_date_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::BinaryExecutor::Execute<duckdb::date_t, int32_t, int64_t>(
args.data[0], args.data[1], result, args.size(),
[](duckdb::date_t d, int32_t mode) -> int64_t {
int32_t y, m, day;
duckdb::Date::Convert(d, y, m, day);
uint32_t year;
uint32_t week= mc_calc_week(
(uint32_t) y, (uint32_t) m, (uint32_t) day,
mc_week_mode((uint32_t) mode) | MC_WEEK_YEAR, &year);
return (int64_t) (week + year * 100);
});
}
/* YEARWEEK(TIMESTAMP, INTEGER) -> BIGINT */
static void yearweek_2arg_ts_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::BinaryExecutor::Execute<duckdb::timestamp_t, int32_t, int64_t>(
args.data[0], args.data[1], result, args.size(),
[](duckdb::timestamp_t ts, int32_t mode) -> int64_t {
int32_t y, m, day;
duckdb::Date::Convert(duckdb::Timestamp::GetDate(ts), y, m, day);
uint32_t year;
uint32_t week= mc_calc_week(
(uint32_t) y, (uint32_t) m, (uint32_t) day,
mc_week_mode((uint32_t) mode) | MC_WEEK_YEAR, &year);
return (int64_t) (week + year * 100);
});
}
/* ================================================================
TO_DAYS(date) -> BIGINT
MariaDB day number since year 0. DuckDB's builtin to_days(BIGINT)
constructs an INTERVAL instead, and has no date/string overload.
Relation: to_days(d) = epoch_days(d) + 719528
(since MariaDB TO_DAYS('1970-01-01') = 719528).
================================================================ */
static constexpr int64_t MC_TO_DAYS_EPOCH_OFFSET= 719528;
static void to_days_date_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::UnaryExecutor::Execute<duckdb::date_t, int64_t>(
args.data[0], result, args.size(),
[](duckdb::date_t d) -> int64_t {
return (int64_t) duckdb::Date::EpochDays(d) + MC_TO_DAYS_EPOCH_OFFSET;
});
}
static void to_days_varchar_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::UnaryExecutor::Execute<duckdb::string_t, int64_t>(
args.data[0], result, args.size(),
[](duckdb::string_t s) -> int64_t {
duckdb::date_t d=
duckdb::Date::FromCString(s.GetData(), s.GetSize());
return (int64_t) duckdb::Date::EpochDays(d) + MC_TO_DAYS_EPOCH_OFFSET;
});
}
/* ================================================================
DAYOFWEEK(date) / WEEKDAY(date)
DuckDB's dayofweek is 0=Sunday..6=Saturday; MariaDB DAYOFWEEK is
1=Sunday..7=Saturday and WEEKDAY is 0=Monday..6=Sunday.
Derived from ISO day-of-week (1=Monday..7=Sunday):
DAYOFWEEK = (iso % 7) + 1
WEEKDAY = iso - 1
================================================================ */
static void dayofweek_date_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::UnaryExecutor::Execute<duckdb::date_t, int64_t>(
args.data[0], result, args.size(),
[](duckdb::date_t d) -> int64_t {
return (int64_t) (duckdb::Date::ExtractISODayOfTheWeek(d) % 7) + 1;
});
}
static void dayofweek_ts_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::UnaryExecutor::Execute<duckdb::timestamp_t, int64_t>(
args.data[0], result, args.size(),
[](duckdb::timestamp_t ts) -> int64_t {
duckdb::date_t d= duckdb::Timestamp::GetDate(ts);
return (int64_t) (duckdb::Date::ExtractISODayOfTheWeek(d) % 7) + 1;
});
}
static void weekday_date_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::UnaryExecutor::Execute<duckdb::date_t, int64_t>(
args.data[0], result, args.size(),
[](duckdb::date_t d) -> int64_t {
return (int64_t) duckdb::Date::ExtractISODayOfTheWeek(d) - 1;
});
}
static void weekday_ts_func(duckdb::DataChunk &args,
duckdb::ExpressionState &,
duckdb::Vector &result)
{
duckdb::UnaryExecutor::Execute<duckdb::timestamp_t, int64_t>(
args.data[0], result, args.size(),
[](duckdb::timestamp_t ts) -> int64_t {
duckdb::date_t d= duckdb::Timestamp::GetDate(ts);
return (int64_t) duckdb::Date::ExtractISODayOfTheWeek(d) - 1;
});
}
/* ================================================================
Registration
================================================================ */
@@ -1469,11 +1724,82 @@ void register_mysql_compat_functions(duckdb::DatabaseInstance &db)
catalog.CreateFunction(transaction, info);
}
/* week(DATE/TIMESTAMP, INTEGER) -> BIGINT (MariaDB mode arg) */
{
duckdb::ScalarFunctionSet set("week");
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::DATE, duckdb::LogicalType::INTEGER},
duckdb::LogicalType::BIGINT, week_2arg_date_func));
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::TIMESTAMP, duckdb::LogicalType::INTEGER},
duckdb::LogicalType::BIGINT, week_2arg_ts_func));
duckdb::CreateScalarFunctionInfo info(std::move(set));
info.on_conflict= duckdb::OnCreateConflict::ALTER_ON_CONFLICT;
catalog.CreateFunction(transaction, info);
}
/* yearweek(DATE/TIMESTAMP, INTEGER) -> BIGINT (MariaDB mode arg) */
{
duckdb::ScalarFunctionSet set("yearweek");
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::DATE, duckdb::LogicalType::INTEGER},
duckdb::LogicalType::BIGINT, yearweek_2arg_date_func));
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::TIMESTAMP, duckdb::LogicalType::INTEGER},
duckdb::LogicalType::BIGINT, yearweek_2arg_ts_func));
duckdb::CreateScalarFunctionInfo info(std::move(set));
info.on_conflict= duckdb::OnCreateConflict::ALTER_ON_CONFLICT;
catalog.CreateFunction(transaction, info);
}
/* to_days(DATE/VARCHAR) -> BIGINT (MariaDB day number since year 0) */
{
duckdb::ScalarFunctionSet set("to_days");
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::DATE}, duckdb::LogicalType::BIGINT,
to_days_date_func));
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::VARCHAR}, duckdb::LogicalType::BIGINT,
to_days_varchar_func));
duckdb::CreateScalarFunctionInfo info(std::move(set));
info.on_conflict= duckdb::OnCreateConflict::ALTER_ON_CONFLICT;
catalog.CreateFunction(transaction, info);
}
/* dayofweek(DATE/TIMESTAMP) -> BIGINT (MariaDB 1=Sunday..7=Saturday) */
{
duckdb::ScalarFunctionSet set("dayofweek");
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::DATE}, duckdb::LogicalType::BIGINT,
dayofweek_date_func));
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::TIMESTAMP}, duckdb::LogicalType::BIGINT,
dayofweek_ts_func));
duckdb::CreateScalarFunctionInfo info(std::move(set));
info.on_conflict= duckdb::OnCreateConflict::ALTER_ON_CONFLICT;
catalog.CreateFunction(transaction, info);
}
/* weekday(DATE/TIMESTAMP) -> BIGINT (MariaDB 0=Monday..6=Sunday) */
{
duckdb::ScalarFunctionSet set("weekday");
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::DATE}, duckdb::LogicalType::BIGINT,
weekday_date_func));
set.AddFunction(duckdb::ScalarFunction(
{duckdb::LogicalType::TIMESTAMP}, duckdb::LogicalType::BIGINT,
weekday_ts_func));
duckdb::CreateScalarFunctionInfo info(std::move(set));
info.on_conflict= duckdb::OnCreateConflict::ALTER_ON_CONFLICT;
catalog.CreateFunction(transaction, info);
}
sql_print_information(
"DuckDB: registered MySQL-compatible function overloads "
"(octet_length, length, ascii, ord, hex, oct, bin, locate, mid, "
"rtrim, ltrim, regexp_instr, regexp_replace, regexp_substr, "
"json_unquote, json_contains)");
"json_unquote, json_contains, week, yearweek, to_days, dayofweek, "
"weekday)");
}
} /* namespace myduck */