170 lines
4.4 KiB
SQL
170 lines
4.4 KiB
SQL
# name: test/sql/table_function/range_timestamp.test
|
|
# description: Test range function with DATE/TIMESTAMP
|
|
# group: [table_function]
|
|
|
|
# date
|
|
query I
|
|
SELECT d::DATE FROM range(DATE '1992-01-01', DATE '1992-10-01', INTERVAL (1) MONTH) tbl(d)
|
|
----
|
|
1992-01-01
|
|
1992-02-01
|
|
1992-03-01
|
|
1992-04-01
|
|
1992-05-01
|
|
1992-06-01
|
|
1992-07-01
|
|
1992-08-01
|
|
1992-09-01
|
|
|
|
# range is exclusive
|
|
query I
|
|
SELECT * FROM range(date '1992-01-01', date '1992-01-01', interval '1' month);
|
|
----
|
|
|
|
# generate_series is inclusive
|
|
query I
|
|
SELECT d::DATE FROM generate_series(DATE '1992-01-01', DATE '1992-10-01', INTERVAL (1) MONTH) tbl(d)
|
|
----
|
|
1992-01-01
|
|
1992-02-01
|
|
1992-03-01
|
|
1992-04-01
|
|
1992-05-01
|
|
1992-06-01
|
|
1992-07-01
|
|
1992-08-01
|
|
1992-09-01
|
|
1992-10-01
|
|
|
|
# timestamp
|
|
query I
|
|
SELECT d FROM range(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '1992-01-01 12:00:00', INTERVAL (1) HOUR) tbl(d)
|
|
----
|
|
1992-01-01 00:00:00
|
|
1992-01-01 01:00:00
|
|
1992-01-01 02:00:00
|
|
1992-01-01 03:00:00
|
|
1992-01-01 04:00:00
|
|
1992-01-01 05:00:00
|
|
1992-01-01 06:00:00
|
|
1992-01-01 07:00:00
|
|
1992-01-01 08:00:00
|
|
1992-01-01 09:00:00
|
|
1992-01-01 10:00:00
|
|
1992-01-01 11:00:00
|
|
|
|
# range is exclusive
|
|
query I
|
|
SELECT * FROM range(timestamp '1992-01-01 00:00:00', timestamp '1992-01-01 00:00:00', interval '1' month);
|
|
----
|
|
|
|
query I
|
|
SELECT * FROM range(timestamp '1992-01-01 00:00:00', timestamp '1992-01-01 00:00:01', interval '1' month);
|
|
----
|
|
1992-01-01 00:00:00
|
|
|
|
# negative interval
|
|
query I
|
|
SELECT d FROM range(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '1991-06-01 00:00:00', INTERVAL '1 MONTH ago') tbl(d)
|
|
----
|
|
1992-01-01 00:00:00
|
|
1991-12-01 00:00:00
|
|
1991-11-01 00:00:00
|
|
1991-10-01 00:00:00
|
|
1991-09-01 00:00:00
|
|
1991-08-01 00:00:00
|
|
1991-07-01 00:00:00
|
|
|
|
query I
|
|
SELECT d FROM generate_series(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '1991-06-01 00:00:00', -INTERVAL '1 MONTH') tbl(d)
|
|
----
|
|
1992-01-01 00:00:00
|
|
1991-12-01 00:00:00
|
|
1991-11-01 00:00:00
|
|
1991-10-01 00:00:00
|
|
1991-09-01 00:00:00
|
|
1991-08-01 00:00:00
|
|
1991-07-01 00:00:00
|
|
1991-06-01 00:00:00
|
|
|
|
# composite interval
|
|
query I
|
|
SELECT d FROM range(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '1992-12-31 12:00:00', INTERVAL '1 MONTH 1 DAY 1 HOUR') tbl(d)
|
|
----
|
|
1992-01-01 00:00:00
|
|
1992-02-02 01:00:00
|
|
1992-03-03 02:00:00
|
|
1992-04-04 03:00:00
|
|
1992-05-05 04:00:00
|
|
1992-06-06 05:00:00
|
|
1992-07-07 06:00:00
|
|
1992-08-08 07:00:00
|
|
1992-09-09 08:00:00
|
|
1992-10-10 09:00:00
|
|
1992-11-11 10:00:00
|
|
1992-12-12 11:00:00
|
|
|
|
# large result
|
|
query I
|
|
SELECT COUNT(*) FROM range(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '2020-01-01 00:00:00', INTERVAL '1 DAY') tbl(d)
|
|
----
|
|
10227
|
|
|
|
query I
|
|
SELECT COUNT(*) FROM generate_series(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '2020-01-01 00:00:00', INTERVAL '1 DAY') tbl(d)
|
|
----
|
|
10228
|
|
|
|
# null values result in no rows
|
|
query I
|
|
SELECT COUNT(*) FROM range(NULL, TIMESTAMP '1992-12-31 12:00:00', INTERVAL '1 MONTH') tbl(d)
|
|
----
|
|
0
|
|
|
|
query I
|
|
SELECT COUNT(*) FROM generate_series(NULL, TIMESTAMP '1992-12-31 12:00:00', INTERVAL '1 MONTH') tbl(d)
|
|
----
|
|
0
|
|
|
|
# Extreme ranges should not overflow in the binder.
|
|
statement ok
|
|
explain
|
|
from range('290309-12-22 (BC) 00:00:00'::TIMESTAMP, '294247-01-10 04:00:54.775806'::TIMESTAMP, interval '1 hour');
|
|
|
|
# zero interval not supported
|
|
statement error
|
|
SELECT d FROM range(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '1992-12-31 12:00:00', INTERVAL '0 MONTH') tbl(d)
|
|
----
|
|
|
|
# start is smaller than end but we have a negative interval
|
|
query I
|
|
SELECT d FROM range(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '1992-12-31 12:00:00', INTERVAL '1 MONTH ago') tbl(d)
|
|
----
|
|
|
|
# start is bigger than end but we have a positive interval
|
|
query I
|
|
SELECT d FROM range(TIMESTAMP '1993-01-01 00:00:00', TIMESTAMP '1992-01-01 00:00:00', INTERVAL '1 MONTH') tbl(d)
|
|
----
|
|
|
|
# composite interval with negative types not supported
|
|
statement error
|
|
SELECT d FROM range(TIMESTAMP '1992-01-01 00:00:00', TIMESTAMP '1992-12-31 12:00:00', INTERVAL '1 MONTH' - INTERVAL '1 HOUR') tbl(d)
|
|
----
|
|
|
|
# Infinities will overflow or cause infinite loops (PG behaviour!) so we ban them
|
|
statement error
|
|
SELECT COUNT(*) FROM generate_series('294247-01-10'::TIMESTAMP, 'infinity'::TIMESTAMP, INTERVAL '1 DAY');
|
|
----
|
|
|
|
statement error
|
|
SELECT COUNT(*) FROM range('294247-01-10'::TIMESTAMP, 'infinity'::TIMESTAMP, INTERVAL '1 DAY');
|
|
----
|
|
|
|
statement error
|
|
SELECT COUNT(*) FROM generate_series('-infinity'::TIMESTAMP, '290309-12-22 (BC) 00:00:00'::TIMESTAMP, INTERVAL '1 DAY');
|
|
----
|
|
|
|
statement error
|
|
SELECT COUNT(*) FROM range('-infinity'::TIMESTAMP, '290309-12-22 (BC) 00:00:00'::TIMESTAMP, INTERVAL '1 DAY');
|
|
----
|