should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,226 @@
# name: test/sql/function/interval/test_date_part.test
# description: Extract function
# group: [interval]
statement ok
CREATE TABLE intervals(i INTERVAL, s VARCHAR);
statement ok
INSERT INTO intervals VALUES ('2 years', 'year'), ('16 months', 'quarter'), ('42 days', 'day'), ('2066343400 microseconds', 'minute');
# test date_part with different combinations of constant/non-constant columns
query I
SELECT date_part(NULL::VARCHAR, NULL::INTERVAL) FROM intervals;
----
NULL
NULL
NULL
NULL
query I
SELECT date_part(s, NULL::INTERVAL) FROM intervals;
----
NULL
NULL
NULL
NULL
# intervals
query I
SELECT date_part(NULL, i) FROM intervals;
----
NULL
NULL
NULL
NULL
query I
SELECT date_part(s, INTERVAL '4 years 5 months 18 days 128 seconds') FROM intervals;
----
4
2
18
2
query I
SELECT date_part('seconds', i) FROM intervals;
----
0
0
0
26
query I
SELECT date_part('epoch', i) FROM intervals;
----
63115200.0
41925600.0
3628800.0
2066.3434
query I
SELECT date_part(s, i) FROM intervals;
----
2
2
42
34
# interval gives errors for date-only parts
statement error
SELECT dayofweek(i) FROM intervals
----
statement error
SELECT isodow(i) FROM intervals
----
statement error
SELECT dayofyear(i) FROM intervals
----
statement error
SELECT week(i) FROM intervals
----
statement error
SELECT era(i) FROM intervals;
----
statement error
SELECT julian(i) FROM intervals;
----
statement error
SELECT extract(era from i) FROM intervals;
----
statement error
SELECT extract(julian from i) FROM intervals;
----
statement error
SELECT date_part('era', i) FROM intervals;
----
statement error
SELECT date_part('julian', i) FROM intervals;
----
statement error
SELECT date_part('offset', i) FROM intervals;
----
# Correctness: Compare date_part values with function values
foreach partcode millennium century decade year quarter month day hour minute second millisecond microsecond epoch
query III
SELECT i, DATE_PART('${partcode}', i) AS p, ${partcode}(i) AS f
FROM intervals
WHERE p <> f;
----
endloop
#
# Structs
#
# Correctness: Compare struct values with scalar values
foreach partcode millennium century decade year quarter month day hour minute second millisecond microsecond epoch
query III
SELECT i, DATE_PART('${partcode}', i) AS p, DATE_PART(['${partcode}'], i) AS st
FROM intervals
WHERE p <> st['${partcode}'];
----
endloop
# Day parts
query II
SELECT i, DATE_PART(['year', 'month', 'day'], i) AS parts
FROM intervals
ORDER BY 1;
----
00:34:26.3434 {'year': 0, 'month': 0, 'day': 0}
42 days {'year': 0, 'month': 0, 'day': 42}
1 year 4 months {'year': 1, 'month': 4, 'day': 0}
2 years {'year': 2, 'month': 0, 'day': 0}
# Year parts
query II
SELECT i, DATE_PART(['millennium', 'century', 'decade', 'quarter'], i) AS parts
FROM intervals
ORDER BY 1;
----
00:34:26.3434 {'millennium': 0, 'century': 0, 'decade': 0, 'quarter': 1}
42 days {'millennium': 0, 'century': 0, 'decade': 0, 'quarter': 1}
1 year 4 months {'millennium': 0, 'century': 0, 'decade': 0, 'quarter': 2}
2 years {'millennium': 0, 'century': 0, 'decade': 0, 'quarter': 1}
# Time parts
query II
SELECT i, DATE_PART(['hour', 'minute', 'second', 'epoch'], i) AS parts
FROM intervals
ORDER BY 1;
----
00:34:26.3434 {'hour': 0, 'minute': 34, 'second': 26, 'epoch': 2066.3434}
42 days {'hour': 0, 'minute': 0, 'second': 0, 'epoch': 3628800.0}
1 year 4 months {'hour': 0, 'minute': 0, 'second': 0, 'epoch': 41925600.0}
2 years {'hour': 0, 'minute': 0, 'second': 0, 'epoch': 63115200.0}
# Function-only parts
query II
SELECT i, epoch_ns(i) AS parts
FROM intervals
ORDER BY 1;
----
00:34:26.3434 2066343400000
42 days 3628800000000000
1 year 4 months 41472000000000000
2 years 62208000000000000
query II
SELECT i, epoch_us(i) AS parts
FROM intervals
ORDER BY 1;
----
00:34:26.3434 2066343400
42 days 3628800000000
1 year 4 months 41472000000000
2 years 62208000000000
query II
SELECT i, epoch_ms(i) AS parts
FROM intervals
ORDER BY 1;
----
00:34:26.3434 2066343
42 days 3628800000
1 year 4 months 41472000000
2 years 62208000000
query II
SELECT i, nanosecond(i) AS parts
FROM intervals
ORDER BY 1;
----
00:34:26.3434 26343400000
42 days 0
1 year 4 months 0
2 years 0
# Invalid parts
foreach datepart dow isodow doy week isoyear yearweek era timezone timezone_hour timezone_minute
statement error
SELECT i, DATE_PART(['${datepart}'], i) AS parts
FROM intervals
ORDER BY 1;
----
endloop

View File

@@ -0,0 +1,201 @@
# name: test/sql/function/interval/test_extract.test
# description: Extract function
# group: [interval]
statement ok
CREATE TABLE intervals(i INTERVAL);
statement ok
INSERT INTO intervals VALUES ('2 years'), ('16 months'), ('42 days'), ('2066343400 microseconds'), (NULL);
# extract various parts of the intervals
query I
SELECT EXTRACT(year FROM i) FROM intervals
----
2
1
0
0
NULL
query I
SELECT EXTRACT(month FROM i) FROM intervals
----
0
4
0
0
NULL
query I
SELECT EXTRACT(day FROM i) FROM intervals
----
0
0
42
0
NULL
query I
SELECT EXTRACT(decade FROM i) FROM intervals
----
0
0
0
0
NULL
query I
SELECT EXTRACT(century FROM i) FROM intervals
----
0
0
0
0
NULL
query I
SELECT EXTRACT(millennium FROM i) FROM intervals
----
0
0
0
0
NULL
query I
SELECT EXTRACT(quarter FROM i) FROM intervals
----
1
2
1
1
NULL
statement error
SELECT EXTRACT(dayofweek FROM i) FROM intervals
----
statement error
SELECT EXTRACT(isodow FROM i) FROM intervals
----
statement error
SELECT EXTRACT(dayofyear FROM i) FROM intervals
----
statement error
SELECT EXTRACT(week FROM i) FROM intervals
----
statement error
SELECT EXTRACT(yearweek FROM i) FROM intervals
----
query I
SELECT EXTRACT(epoch FROM i) FROM intervals
----
63115200.0
41925600.0
3628800.0
2066.3434
NULL
query I
SELECT EXTRACT(microsecond FROM i) FROM intervals
----
0
0
0
26343400
NULL
query I
SELECT EXTRACT(millisecond FROM i) FROM intervals
----
0
0
0
26343
NULL
query I
SELECT EXTRACT(second FROM i) FROM intervals
----
0
0
0
26
NULL
query I
SELECT EXTRACT(minute FROM i) FROM intervals
----
0
0
0
34
NULL
query I
SELECT EXTRACT(hour FROM i) FROM intervals
----
0
0
0
0
NULL
# negative intervals with months are strange in Postgres
query I
SELECT EXTRACT(year FROM interval '14 months ago')
----
-1
query I
SELECT EXTRACT(month FROM interval '14 months ago')
----
-2
query I
SELECT EXTRACT(day FROM interval '157 days ago')
----
-157
query I
SELECT EXTRACT(decade FROM interval '140 months ago')
----
-1
query I
SELECT EXTRACT(century FROM interval '1400 months ago')
----
-1
query I
SELECT EXTRACT(millennium FROM interval '14000 months ago')
----
-1
query I
SELECT EXTRACT(quarter FROM interval '14 months ago')
----
1
query I
SELECT EXTRACT(quarter FROM interval '21 months ago')
----
-2
query I
SELECT EXTRACT(epoch FROM interval '6 months ago')
----
-15552000
statement error
SELECT EXTRACT(doy FROM interval '6 months ago')
----
statement error
SELECT EXTRACT(dow FROM interval '6 months ago')
----

View File

@@ -0,0 +1,100 @@
# name: test/sql/function/interval/test_interval_muldiv.test
# description: Test PG INTERVAL DOUBLE multiply and divide.
# group: [interval]
# From src/test/regress/sql/interval.sql
# Test multiplication and division with intervals.
# Floating point arithmetic rounding errors can lead to unexpected results,
# though the code attempts to do the right thing and round up to days and
# minutes to avoid results such as '3 days 24:00 hours' or '14:20:60'.
# Note that it is expected for some day components to be greater than 29 and
# some time components be greater than 23:59:59 due to how intervals are
# stored internally.
statement ok
CREATE TABLE INTERVAL_MULDIV_TBL (span interval);
statement ok
INSERT INTO INTERVAL_MULDIV_TBL VALUES
('41 months 12 days 360:00'),
('-41 months -12 days 360:00'),
('-12 days'),
('9 months -27 days 12:34:56'),
('-3 years 482 days 76:54:32.189'),
('4 months'),
('14 months'),
('999 months 999 days'),
;
query I
SELECT span * 0.3 AS product
FROM INTERVAL_MULDIV_TBL;
----
1 year 12 days 122:24:00
-1 year -12 days 93:36:00
-3 days -14:24:00
2 months 13 days 01:22:28.8
-10 months 120 days 37:28:21.6567
1 month 6 days
4 months 6 days
24 years 11 months 320 days 16:48:00
query I
SELECT span * 8.2 AS product
FROM INTERVAL_MULDIV_TBL;
----
28 years 104 days 2961:36:00
-28 years -104 days 2942:24:00
-98 days -09:36:00
6 years 1 month -197 days 93:34:27.2
-24 years -7 months 3946 days 640:15:11.9498
2 years 8 months 24 days
9 years 6 months 24 days
682 years 7 months 8215 days 19:12:00
query I
SELECT span / 10 AS quotient
FROM INTERVAL_MULDIV_TBL;
----
4 months 4 days 40:48:00
-4 months -4 days 31:12:00
-1 day -04:48:00
25 days -15:32:30.4
-3 months 30 days 12:29:27.2189
12 days
1 month 12 days
8 years 3 months 126 days 21:36:00
query I
SELECT span / 100 AS quotient
FROM INTERVAL_MULDIV_TBL;
----
12 days 13:40:48
-12 days -06:28:48
-02:52:48
2 days 10:26:44.96
-6 days 01:14:56.72189
1 day 04:48:00
4 days 04:48:00
9 months 39 days 16:33:36
# Commutativity
query I
select (interval '1 days') * 0.5::DOUBLE;
----
12:00:00
query I
select 0.5::DOUBLE * (interval '1 days');
----
12:00:00
query I
select 2::BIGINT * (interval '1 days');
----
2 days
query I
select (interval '1 days') * 2::BIGINT;
----
2 days

View File

@@ -0,0 +1,491 @@
# name: test/sql/function/interval/test_interval_trunc.test
# description: Extract function
# group: [interval]
statement ok
CREATE TABLE intervals(i INTERVAL, s VARCHAR);
statement ok
INSERT INTO intervals VALUES
('1247 years 4 months', 'millennium'),
('-1448 years -5 months', 'millennium'),
('548 years 7 months', 'century'),
('-118 years -3 months', 'century'),
('45 years 1 months', 'decade'),
('-97 years -11 months', 'decade'),
('5 years 6 months', 'year'),
('-4 years -8 months', 'year'),
('2 years 2 months', 'quarter'),
('-3 years -10 months', 'quarter'),
('3 years 4 months 5 days', 'month'),
('-7 years -3 months 29 days', 'month'),
('4 months 22 days', 'week'),
('-3 months -3 days', 'week'),
('5 months 7 days 12:34:56.789012', 'day'),
('-3 months -3 days 12:34:56.789012', 'day'),
('1 month 11 days 12:34:56.789012', 'hour'),
('-1 month -2 days 12:34:56.789012', 'hour'),
('1 month 16 days 12:34:56.789012', 'minute'),
('-1 month -9 days 12:34:56.789012', 'minute'),
('1 month 24 days 12:34:56.789012', 'second'),
('-1 month -17 days 12:34:56.789012', 'second'),
('1 month 29 days 12:34:56.789012', 'milliseconds'),
('-1 month -26 days 12:34:56.789012', 'milliseconds'),
('1 month 7 days 12:34:56.789012', 'microseconds'),
('-1 month -29 days 12:34:56.789012', 'microseconds'),
(NULL, NULL),
;
query I
SELECT i FROM intervals;
----
1247 years 4 months
-1448 years -5 months
548 years 7 months
-118 years -3 months
45 years 1 month
-97 years -11 months
5 years 6 months
-4 years -8 months
2 years 2 months
-3 years -10 months
3 years 4 months 5 days
-7 years -3 months 29 days
4 months 22 days
-3 months -3 days
5 months 7 days 12:34:56.789012
-3 months -3 days 12:34:56.789012
1 month 11 days 12:34:56.789012
-1 month -2 days 12:34:56.789012
1 month 16 days 12:34:56.789012
-1 month -9 days 12:34:56.789012
1 month 24 days 12:34:56.789012
-1 month -17 days 12:34:56.789012
1 month 29 days 12:34:56.789012
-1 month -26 days 12:34:56.789012
1 month 7 days 12:34:56.789012
-1 month -29 days 12:34:56.789012
NULL
query I
SELECT DATE_TRUNC('millennium', i) FROM intervals
----
1000 years
-1000 years
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
NULL
query I
SELECT DATE_TRUNC('century', i) FROM intervals
----
1200 years
-1400 years
500 years
-100 years
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
NULL
query I
SELECT DATE_TRUNC('decade', i) FROM intervals
----
1240 years
-1440 years
540 years
-110 years
40 years
-90 years
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
NULL
foreach datepart year isoyear
query I
SELECT DATE_TRUNC('${datepart}', i) FROM intervals
----
1247 years
-1448 years
548 years
-118 years
45 years
-97 years
5 years
-4 years
2 years
-3 years
3 years
-7 years
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
NULL
endloop
foreach datepart week yearweek
query I
SELECT DATE_TRUNC('${datepart}', i) FROM intervals
----
1247 years 4 months
-1448 years -5 months
548 years 7 months
-118 years -3 months
45 years 1 month
-97 years -11 months
5 years 6 months
-4 years -8 months
2 years 2 months
-3 years -10 months
3 years 4 months
-7 years -3 months 28 days
4 months 21 days
-3 months
5 months 7 days
-3 months
1 month 7 days
-1 month
1 month 14 days
-1 month -7 days
1 month 21 days
-1 month -14 days
1 month 28 days
-1 month -21 days
1 month 7 days
-1 month -28 days
NULL
endloop
foreach datepart dayofmonth dayofweek isodow dayofyear
query I
SELECT DATE_TRUNC('${datepart}', i) FROM intervals
----
1247 years 4 months
-1448 years -5 months
548 years 7 months
-118 years -3 months
45 years 1 month
-97 years -11 months
5 years 6 months
-4 years -8 months
2 years 2 months
-3 years -10 months
3 years 4 months 5 days
-7 years -3 months 29 days
4 months 22 days
-3 months -3 days
5 months 7 days
-3 months -3 days
1 month 11 days
-1 month -2 days
1 month 16 days
-1 month -9 days
1 month 24 days
-1 month -17 days
1 month 29 days
-1 month -26 days
1 month 7 days
-1 month -29 days
NULL
endloop
query I
SELECT DATE_TRUNC('hour', i) FROM intervals
----
1247 years 4 months
-1448 years -5 months
548 years 7 months
-118 years -3 months
45 years 1 month
-97 years -11 months
5 years 6 months
-4 years -8 months
2 years 2 months
-3 years -10 months
3 years 4 months 5 days
-7 years -3 months 29 days
4 months 22 days
-3 months -3 days
5 months 7 days 12:00:00
-3 months -3 days 12:00:00
1 month 11 days 12:00:00
-1 month -2 days 12:00:00
1 month 16 days 12:00:00
-1 month -9 days 12:00:00
1 month 24 days 12:00:00
-1 month -17 days 12:00:00
1 month 29 days 12:00:00
-1 month -26 days 12:00:00
1 month 7 days 12:00:00
-1 month -29 days 12:00:00
NULL
query I
SELECT DATE_TRUNC('minute', i) FROM intervals
----
1247 years 4 months
-1448 years -5 months
548 years 7 months
-118 years -3 months
45 years 1 month
-97 years -11 months
5 years 6 months
-4 years -8 months
2 years 2 months
-3 years -10 months
3 years 4 months 5 days
-7 years -3 months 29 days
4 months 22 days
-3 months -3 days
5 months 7 days 12:34:00
-3 months -3 days 12:34:00
1 month 11 days 12:34:00
-1 month -2 days 12:34:00
1 month 16 days 12:34:00
-1 month -9 days 12:34:00
1 month 24 days 12:34:00
-1 month -17 days 12:34:00
1 month 29 days 12:34:00
-1 month -26 days 12:34:00
1 month 7 days 12:34:00
-1 month -29 days 12:34:00
NULL
foreach datepart second epoch
query I
SELECT DATE_TRUNC('${datepart}', i) FROM intervals
----
1247 years 4 months
-1448 years -5 months
548 years 7 months
-118 years -3 months
45 years 1 month
-97 years -11 months
5 years 6 months
-4 years -8 months
2 years 2 months
-3 years -10 months
3 years 4 months 5 days
-7 years -3 months 29 days
4 months 22 days
-3 months -3 days
5 months 7 days 12:34:56
-3 months -3 days 12:34:56
1 month 11 days 12:34:56
-1 month -2 days 12:34:56
1 month 16 days 12:34:56
-1 month -9 days 12:34:56
1 month 24 days 12:34:56
-1 month -17 days 12:34:56
1 month 29 days 12:34:56
-1 month -26 days 12:34:56
1 month 7 days 12:34:56
-1 month -29 days 12:34:56
NULL
endloop
query I
SELECT DATE_TRUNC('millisecond', i) FROM intervals
----
1247 years 4 months
-1448 years -5 months
548 years 7 months
-118 years -3 months
45 years 1 month
-97 years -11 months
5 years 6 months
-4 years -8 months
2 years 2 months
-3 years -10 months
3 years 4 months 5 days
-7 years -3 months 29 days
4 months 22 days
-3 months -3 days
5 months 7 days 12:34:56.789
-3 months -3 days 12:34:56.789
1 month 11 days 12:34:56.789
-1 month -2 days 12:34:56.789
1 month 16 days 12:34:56.789
-1 month -9 days 12:34:56.789
1 month 24 days 12:34:56.789
-1 month -17 days 12:34:56.789
1 month 29 days 12:34:56.789
-1 month -26 days 12:34:56.789
1 month 7 days 12:34:56.789
-1 month -29 days 12:34:56.789
NULL
query I
SELECT DATE_TRUNC('microsecond', i) FROM intervals
----
1247 years 4 months
-1448 years -5 months
548 years 7 months
-118 years -3 months
45 years 1 month
-97 years -11 months
5 years 6 months
-4 years -8 months
2 years 2 months
-3 years -10 months
3 years 4 months 5 days
-7 years -3 months 29 days
4 months 22 days
-3 months -3 days
5 months 7 days 12:34:56.789012
-3 months -3 days 12:34:56.789012
1 month 11 days 12:34:56.789012
-1 month -2 days 12:34:56.789012
1 month 16 days 12:34:56.789012
-1 month -9 days 12:34:56.789012
1 month 24 days 12:34:56.789012
-1 month -17 days 12:34:56.789012
1 month 29 days 12:34:56.789012
-1 month -26 days 12:34:56.789012
1 month 7 days 12:34:56.789012
-1 month -29 days 12:34:56.789012
NULL
# Variable part name
query I
SELECT DATE_TRUNC(s, i) FROM intervals
----
1000 years
-1000 years
500 years
-100 years
40 years
-90 years
5 years
-4 years
2 years
-3 years -9 months
3 years 4 months
-7 years -3 months
4 months 21 days
-3 months
5 months 7 days
-3 months -3 days
1 month 11 days 12:00:00
-1 month -2 days 12:00:00
1 month 16 days 12:34:00
-1 month -9 days 12:34:00
1 month 24 days 12:34:56
-1 month -17 days 12:34:56
1 month 29 days 12:34:56.789
-1 month -26 days 12:34:56.789
1 month 7 days 12:34:56.789012
-1 month -29 days 12:34:56.789012
NULL
# NULL part name
query I
SELECT DATE_TRUNC(NULL, i) FROM intervals
----
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL