mirror of
https://github.com/postgres/postgres.git
synced 2026-03-18 00:22:18 -04:00
Fix the code changed by commit 5c056b0c2 so that we always generate
RelabelType, not something else, for a cast to unspecified typmod.
Otherwise planner optimizations might not happen.
It appears we missed this point because the previous experiments were
done on type numeric: the parser undesirably generates a call on the
numeric() length-coercion function, but then numeric_support()
optimizes that down to a RelabelType, so that everything seems fine.
It misbehaves for types that have a non-optimized length coercion
function, such as bpchar.
Per report from John Naylor. Back-patch to all supported branches,
as the previous patch eventually was. Unfortunately, that no longer
includes 9.6 ... we really shouldn't put this type of change into a
nearly-EOL branch.
Discussion: https://postgr.es/m/CAFBsxsEfbFHEkouc+FSj+3K1sHipLPbEC67L0SAe-9-da8QtYg@mail.gmail.com
103 lines
2.6 KiB
PL/PgSQL
103 lines
2.6 KiB
PL/PgSQL
--
|
|
-- expression evaluation tests that don't fit into a more specific file
|
|
--
|
|
|
|
--
|
|
-- Tests for SQLVAlueFunction
|
|
--
|
|
|
|
|
|
-- current_date (always matches because of transactional behaviour)
|
|
SELECT date(now())::text = current_date::text;
|
|
|
|
|
|
-- current_time / localtime
|
|
SELECT now()::timetz::text = current_time::text;
|
|
SELECT now()::timetz(4)::text = current_time(4)::text;
|
|
SELECT now()::time::text = localtime::text;
|
|
SELECT now()::time(3)::text = localtime(3)::text;
|
|
|
|
-- current_timestamp / localtimestamp (always matches because of transactional behaviour)
|
|
SELECT current_timestamp = NOW();
|
|
-- precision
|
|
SELECT length(current_timestamp::text) >= length(current_timestamp(0)::text);
|
|
-- localtimestamp
|
|
SELECT now()::timestamp::text = localtimestamp::text;
|
|
|
|
-- current_role/user/user is tested in rolnames.sql
|
|
|
|
-- current database / catalog
|
|
SELECT current_catalog = current_database();
|
|
|
|
-- current_schema
|
|
SELECT current_schema;
|
|
SET search_path = 'notme';
|
|
SELECT current_schema;
|
|
SET search_path = 'pg_catalog';
|
|
SELECT current_schema;
|
|
RESET search_path;
|
|
|
|
|
|
--
|
|
-- Tests for BETWEEN
|
|
--
|
|
|
|
explain (costs off)
|
|
select count(*) from date_tbl
|
|
where f1 between '1997-01-01' and '1998-01-01';
|
|
select count(*) from date_tbl
|
|
where f1 between '1997-01-01' and '1998-01-01';
|
|
|
|
explain (costs off)
|
|
select count(*) from date_tbl
|
|
where f1 not between '1997-01-01' and '1998-01-01';
|
|
select count(*) from date_tbl
|
|
where f1 not between '1997-01-01' and '1998-01-01';
|
|
|
|
explain (costs off)
|
|
select count(*) from date_tbl
|
|
where f1 between symmetric '1997-01-01' and '1998-01-01';
|
|
select count(*) from date_tbl
|
|
where f1 between symmetric '1997-01-01' and '1998-01-01';
|
|
|
|
explain (costs off)
|
|
select count(*) from date_tbl
|
|
where f1 not between symmetric '1997-01-01' and '1998-01-01';
|
|
select count(*) from date_tbl
|
|
where f1 not between symmetric '1997-01-01' and '1998-01-01';
|
|
|
|
|
|
--
|
|
-- Test parsing of a no-op cast to a type with unspecified typmod
|
|
--
|
|
begin;
|
|
|
|
create table numeric_tbl (f1 numeric(18,3), f2 numeric);
|
|
|
|
create view numeric_view as
|
|
select
|
|
f1, f1::numeric(16,4) as f1164, f1::numeric as f1n,
|
|
f2, f2::numeric(16,4) as f2164, f2::numeric as f2n
|
|
from numeric_tbl;
|
|
|
|
\d+ numeric_view
|
|
|
|
explain (verbose, costs off) select * from numeric_view;
|
|
|
|
-- bpchar, lacking planner support for its length coercion function,
|
|
-- could behave differently
|
|
|
|
create table bpchar_tbl (f1 character(16) unique, f2 bpchar);
|
|
|
|
create view bpchar_view as
|
|
select
|
|
f1, f1::character(14) as f114, f1::bpchar as f1n,
|
|
f2, f2::character(14) as f214, f2::bpchar as f2n
|
|
from bpchar_tbl;
|
|
|
|
\d+ bpchar_view
|
|
|
|
explain (verbose, costs off) select * from bpchar_view
|
|
where f1::bpchar = 'foo';
|
|
|
|
rollback;
|