Test the date-time division overloads
This page documents the preview version (v2.23). Preview includes features under active development and is for development and testing only. For production, use the stable version (v2024.1). To learn more, see Versioning.
Try this:
drop procedure if exists test_date_time_division_overloads(text) cascade;
create procedure test_date_time_division_overloads(i in text)
language plpgsql
as $body$
declare
d1 constant date not null := '01-01-2020';
d2 constant date not null := '02-01-2020';
t1 constant time not null := '12:00:00';
t2 constant time not null := '13:00:00';
ts1 constant timestamp not null := '01-01-2020 12:00:00';
ts2 constant timestamp not null := '02-01-2020 12:00:00';
tstz1 constant timestamptz not null := '01-01-2020 12:00:00 UTC';
tstz2 constant timestamptz not null := '02-01-2020 12:00:00 UTC';
i1 constant interval not null := '12 hours';
i2 constant interval not null := '13 hours';
begin
case i
-- "date" row.
when 'date-date' then
if d2 / d1 then null; end if;
when 'date-time' then
if d2 / t1 then null; end if;
when 'date-ts' then
if d2 / ts1 then null; end if;
when 'date-tstz' then
if d2 / tstz1 then null; end if;
when 'date-interval' then
if d2 / i1 then null; end if;
-- "time" row.
when 'time-date' then
if t2 / d1 then null; end if;
when 'time-time' then
if t2 / t1 then null; end if;
when 'time-ts' then
if t2 / ts1 then null; end if;
when 'time-tstz' then
if t2 / tstz1 then null; end if;
when 'time-interval' then
if t2 / i1 then null; end if;
-- Plain "timestamp" row.
when 'ts-date' then
if ts2 / d1 then null; end if;
when 'ts-time' then
if ts2 / t1 then null; end if;
when 'ts-ts' then
if ts2 / ts1 then null; end if;
when 'ts-tstz' then
if ts2 / tstz1 then null; end if;
when 'ts-interval' then
if ts2 / i1 then null; end if;
-- "timestamptz" row.
when 'tstz-date' then
if tstz2 / d1 then null; end if;
when 'tstz-time' then
if tstz2 / t1 then null; end if;
when 'tstz-ts' then
if tstz2 / ts1 then null; end if;
when 'tstz-tstz' then
if tstz2 / tstz1 then null; end if;
when 'tstz-interval' then
if tstz2 / i1 then null; end if;
-- "interval" row.
when 'interval-date' then
if i2 / d1 then null; end if;
when 'interval-time' then
if i2 / t1 then null; end if;
when 'interval-ts' then
if i2 / ts1 then null; end if;
when 'interval-tstz' then
if i2 / tstz1 then null; end if;
when 'interval-interval' then
if i2 / i1 then null; end if;
end case;
end;
$body$;
drop procedure if exists confirm_expected_42883(text) cascade;
create procedure confirm_expected_42883(i in text)
language plpgsql
as $body$
begin
call test_date_time_division_overloads(i);
assert true, 'Unexpected';
-- 42883: operator does not exist...
exception when undefined_function then
null;
end;
$body$;
do $body$
begin
call confirm_expected_42883('date-date');
call confirm_expected_42883('date-time');
call confirm_expected_42883('date-ts');
call confirm_expected_42883('date-tstz');
call confirm_expected_42883('date-interval');
call confirm_expected_42883('time-date');
call confirm_expected_42883('time-time');
call confirm_expected_42883('time-ts');
call confirm_expected_42883('time-tstz');
call confirm_expected_42883('time-interval');
call confirm_expected_42883('ts-date');
call confirm_expected_42883('ts-time');
call confirm_expected_42883('ts-ts');
call confirm_expected_42883('ts-tstz');
call confirm_expected_42883('ts-interval');
call confirm_expected_42883('tstz-date');
call confirm_expected_42883('tstz-time');
call confirm_expected_42883('tstz-ts');
call confirm_expected_42883('tstz-tstz');
call confirm_expected_42883('tstz-interval');
call confirm_expected_42883('interval-date');
call confirm_expected_42883('interval-time');
call confirm_expected_42883('interval-ts');
call confirm_expected_42883('interval-tstz');
call confirm_expected_42883('interval-interval');
end;
$body$;
The final anonymous block finishes silently, confirming that division is not supported between a pair of date-time data types.