From eb5b611ae8e8a4b70b7d965e86d775285c37232f Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Wed, 11 Dec 2024 09:48:55 -0500 Subject: [PATCH 1/3] Add tests for date_part on columns + timestamps with / without timezones --- .../test_files/expr/date_part.slt | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) diff --git a/datafusion/sqllogictest/test_files/expr/date_part.slt b/datafusion/sqllogictest/test_files/expr/date_part.slt index cec80a165f30..d9886dd0a951 100644 --- a/datafusion/sqllogictest/test_files/expr/date_part.slt +++ b/datafusion/sqllogictest/test_files/expr/date_part.slt @@ -18,6 +18,190 @@ # Tests for `date_part` and `EXTRACT` (which is a different syntax # for the same function). + +## Begin tests fo rdate_part with columns and timestamp's with timezones + +# Source data table has +# timestamps with millisecond (very common timestamp precision) and nanosecond (maximum precision) timestamps +statement count 0 +CREATE TABLE source_ts AS +with t as (values + ('2020-01-01T00:00:00+00:00'), + ('2021-01-01T00:00:00+00:00'), -- year + ('2020-09-01T00:00:00+00:00'), -- month + ('2020-01-25T00:00:00+00:00'), -- day + ('2020-01-24T00:00:00+00:00'), -- day + ('2020-01-01T12:00:00+00:00'), -- hour + ('2020-01-01T00:30:00+00:00'), -- minute + ('2020-01-01T00:00:30+00:00'), -- second + ('2020-01-01T00:00:00.123+00:00'), -- ms + ('2020-01-01T00:00:00.123456+00:00'), -- us + ('2020-01-01T00:00:00.123456789+00:00') -- ns +) +SELECT + -- nanoseconds, with no, utc, and local timezone + arrow_cast(column1, 'Timestamp(Nanosecond, None)') as ts_nano_no_tz, + arrow_cast(column1, 'Timestamp(Nanosecond, Some("UTC"))') as ts_nano_utc, + arrow_cast(column1, 'Timestamp(Nanosecond, Some("America/New_York"))') as ts_nano_eastern, + -- milliseconds, with no, utc, and local timezone + arrow_cast(column1, 'Timestamp(Millisecond, None)') as ts_milli_no_tz, + arrow_cast(column1, 'Timestamp(Millisecond, Some("UTC"))') as ts_milli_utc, + arrow_cast(column1, 'Timestamp(Millisecond, Some("America/New_York"))') as ts_milli_eastern +FROM t; + + +query PPPPPP +SELECT * FROM source_ts; +---- +2020-01-01T00:00:00 2020-01-01T00:00:00Z 2019-12-31T19:00:00-05:00 2020-01-01T00:00:00 2020-01-01T00:00:00Z 2019-12-31T19:00:00-05:00 +2021-01-01T00:00:00 2021-01-01T00:00:00Z 2020-12-31T19:00:00-05:00 2021-01-01T00:00:00 2021-01-01T00:00:00Z 2020-12-31T19:00:00-05:00 +2020-09-01T00:00:00 2020-09-01T00:00:00Z 2020-08-31T20:00:00-04:00 2020-09-01T00:00:00 2020-09-01T00:00:00Z 2020-08-31T20:00:00-04:00 +2020-01-25T00:00:00 2020-01-25T00:00:00Z 2020-01-24T19:00:00-05:00 2020-01-25T00:00:00 2020-01-25T00:00:00Z 2020-01-24T19:00:00-05:00 +2020-01-24T00:00:00 2020-01-24T00:00:00Z 2020-01-23T19:00:00-05:00 2020-01-24T00:00:00 2020-01-24T00:00:00Z 2020-01-23T19:00:00-05:00 +2020-01-01T12:00:00 2020-01-01T12:00:00Z 2020-01-01T07:00:00-05:00 2020-01-01T12:00:00 2020-01-01T12:00:00Z 2020-01-01T07:00:00-05:00 +2020-01-01T00:30:00 2020-01-01T00:30:00Z 2019-12-31T19:30:00-05:00 2020-01-01T00:30:00 2020-01-01T00:30:00Z 2019-12-31T19:30:00-05:00 +2020-01-01T00:00:30 2020-01-01T00:00:30Z 2019-12-31T19:00:30-05:00 2020-01-01T00:00:30 2020-01-01T00:00:30Z 2019-12-31T19:00:30-05:00 +2020-01-01T00:00:00.123 2020-01-01T00:00:00.123Z 2019-12-31T19:00:00.123-05:00 2020-01-01T00:00:00.123 2020-01-01T00:00:00.123Z 2019-12-31T19:00:00.123-05:00 +2020-01-01T00:00:00.123456 2020-01-01T00:00:00.123456Z 2019-12-31T19:00:00.123456-05:00 2020-01-01T00:00:00.123 2020-01-01T00:00:00.123Z 2019-12-31T19:00:00.123-05:00 +2020-01-01T00:00:00.123456789 2020-01-01T00:00:00.123456789Z 2019-12-31T19:00:00.123456789-05:00 2020-01-01T00:00:00.123 2020-01-01T00:00:00.123Z 2019-12-31T19:00:00.123-05:00 + +# date_part (year) with columns and explicit timestamp +query IIIIII +SELECT date_part('year', ts_nano_no_tz), date_part('year', ts_nano_utc), date_part('year', ts_nano_eastern), date_part('year', ts_milli_no_tz), date_part('year', ts_milli_utc), date_part('year', ts_milli_eastern) FROM source_ts; +---- +2020 2020 2019 2020 2020 2019 +2021 2021 2020 2021 2021 2020 +2020 2020 2020 2020 2020 2020 +2020 2020 2020 2020 2020 2020 +2020 2020 2020 2020 2020 2020 +2020 2020 2020 2020 2020 2020 +2020 2020 2019 2020 2020 2019 +2020 2020 2019 2020 2020 2019 +2020 2020 2019 2020 2020 2019 +2020 2020 2019 2020 2020 2019 +2020 2020 2019 2020 2020 2019 + +# date_part (month) +query IIIIII +SELECT date_part('month', ts_nano_no_tz), date_part('month', ts_nano_utc), date_part('month', ts_nano_eastern), date_part('month', ts_milli_no_tz), date_part('month', ts_milli_utc), date_part('month', ts_milli_eastern) FROM source_ts; +---- +1 1 12 1 1 12 +1 1 12 1 1 12 +9 9 8 9 9 8 +1 1 1 1 1 1 +1 1 1 1 1 1 +1 1 1 1 1 1 +1 1 12 1 1 12 +1 1 12 1 1 12 +1 1 12 1 1 12 +1 1 12 1 1 12 +1 1 12 1 1 12 + +# date_part (day) +query IIIIII +SELECT date_part('day', ts_nano_no_tz), date_part('day', ts_nano_utc), date_part('day', ts_nano_eastern), date_part('day', ts_milli_no_tz), date_part('day', ts_milli_utc), date_part('day', ts_milli_eastern) FROM source_ts; +---- +1 1 31 1 1 31 +1 1 31 1 1 31 +1 1 31 1 1 31 +25 25 24 25 25 24 +24 24 23 24 24 23 +1 1 1 1 1 1 +1 1 31 1 1 31 +1 1 31 1 1 31 +1 1 31 1 1 31 +1 1 31 1 1 31 +1 1 31 1 1 31 + +# date_part (hour) +query IIIIII +SELECT date_part('hour', ts_nano_no_tz), date_part('hour', ts_nano_utc), date_part('hour', ts_nano_eastern), date_part('hour', ts_milli_no_tz), date_part('hour', ts_milli_utc), date_part('hour', ts_milli_eastern) FROM source_ts; +---- +0 0 19 0 0 19 +0 0 19 0 0 19 +0 0 20 0 0 20 +0 0 19 0 0 19 +0 0 19 0 0 19 +12 12 7 12 12 7 +0 0 19 0 0 19 +0 0 19 0 0 19 +0 0 19 0 0 19 +0 0 19 0 0 19 +0 0 19 0 0 19 + +# date_part (minute) +query IIIIII +SELECT date_part('minute', ts_nano_no_tz), date_part('minute', ts_nano_utc), date_part('minute', ts_nano_eastern), date_part('minute', ts_milli_no_tz), date_part('minute', ts_milli_utc), date_part('minute', ts_milli_eastern) FROM source_ts; +---- +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +30 30 30 30 30 30 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 + +# date_part (second) +query IIIIII +SELECT date_part('second', ts_nano_no_tz), date_part('second', ts_nano_utc), date_part('second', ts_nano_eastern), date_part('second', ts_milli_no_tz), date_part('second', ts_milli_utc), date_part('second', ts_milli_eastern) FROM source_ts; +---- +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +30 30 30 30 30 30 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 + +# date_part (millisecond) +query IIIIII +SELECT date_part('millisecond', ts_nano_no_tz), date_part('millisecond', ts_nano_utc), date_part('millisecond', ts_nano_eastern), date_part('millisecond', ts_milli_no_tz), date_part('millisecond', ts_milli_utc), date_part('millisecond', ts_milli_eastern) FROM source_ts; +---- +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +30000 30000 30000 30000 30000 30000 +123 123 123 123 123 123 +123 123 123 123 123 123 +123 123 123 123 123 123 + +# date_part (microsecond) +query IIIIII +SELECT date_part('microsecond', ts_nano_no_tz), date_part('microsecond', ts_nano_utc), date_part('microsecond', ts_nano_eastern), date_part('microsecond', ts_milli_no_tz), date_part('microsecond', ts_milli_utc), date_part('microsecond', ts_milli_eastern) FROM source_ts; +---- +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +0 0 0 0 0 0 +30000000 30000000 30000000 30000000 30000000 30000000 +123000 123000 123000 123000 123000 123000 +123456 123456 123456 123000 123000 123000 +123456 123456 123456 123000 123000 123000 + +### Cleanup +statement ok +drop table source_ts; + + + +## "Unit style" tests for types and units on scalar values + + query error SELECT EXTRACT("'''year'''" FROM timestamp '2020-09-08T12:00:00+00:00') From 5c8de1feec1d3d4200756d1b48f4d1a74af95864 Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Wed, 11 Dec 2024 09:00:43 -0500 Subject: [PATCH 2/3] Add tests from https://github.com/apache/datafusion/pull/13372 --- .../sqllogictest/test_files/expr/date_part.slt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/datafusion/sqllogictest/test_files/expr/date_part.slt b/datafusion/sqllogictest/test_files/expr/date_part.slt index d9886dd0a951..6413e1f2d408 100644 --- a/datafusion/sqllogictest/test_files/expr/date_part.slt +++ b/datafusion/sqllogictest/test_files/expr/date_part.slt @@ -712,11 +712,21 @@ select extract(second from '2024-08-09T12:13:14') ---- 14 +query I +select extract(second from timestamp '2024-08-09T12:13:14') +---- +14 + query I select extract(seconds from '2024-08-09T12:13:14') ---- 14 +query I +select extract(seconds from timestamp '2024-08-09T12:13:14') +---- +14 + query I SELECT extract(second from arrow_cast('23:32:50.123456789'::time, 'Time64(Nanosecond)')) ---- @@ -1060,3 +1070,5 @@ true query error DataFusion error: Internal error: unit Nanosecond not supported SELECT (date_part('nanosecond', now()) = EXTRACT(nanosecond FROM now())) + + From bc90fcc1e341f5de60137b0a8997c3e83dadd7e2 Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Thu, 12 Dec 2024 16:23:24 -0500 Subject: [PATCH 3/3] remove trailing whitespace --- datafusion/sqllogictest/test_files/expr/date_part.slt | 2 -- 1 file changed, 2 deletions(-) diff --git a/datafusion/sqllogictest/test_files/expr/date_part.slt b/datafusion/sqllogictest/test_files/expr/date_part.slt index 19151b38d2cd..dec796aa59cb 100644 --- a/datafusion/sqllogictest/test_files/expr/date_part.slt +++ b/datafusion/sqllogictest/test_files/expr/date_part.slt @@ -1070,5 +1070,3 @@ true query error DataFusion error: This feature is not implemented: Date part Nanosecond not supported SELECT (date_part('nanosecond', now()) = EXTRACT(nanosecond FROM now())) - -