# 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'); ----