mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Ensure casting to typmod -1 generates a RelabelType.
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
This commit is contained in:
@@ -84,6 +84,22 @@ create view numeric_view as
|
||||
|
||||
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;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user