Обсуждение: BUG #15590: crosstab_hash unable to work with modified types(CreateTupleDescCopy returning dropped attributes?)
BUG #15590: crosstab_hash unable to work with modified types(CreateTupleDescCopy returning dropped attributes?)
От
PG Bug reporting form
Дата:
The following bug has been logged on the website: Bug reference: 15590 Logged by: Guillaume Outters Email address: guillaume-postgresql@outters.eu PostgreSQL version: 9.6.11 Operating system: FreeBSD 10.2 Description: Encapsulating crosstab_hash in a function (to define its return type) does not work when the (user-defined) return type owns 'dropped' attributes. begin transaction; create type t as (id int, i int, j int); create function ctt(text, text) returns setof t as '$libdir/tablefunc', 'crosstab_hash' language c; select * from ctt($$ select * from (values (1, 'j', 123), (1, 'i', 0)) t $$, $$ select * from (values ('i'), ('j')) t $$); -- -> Works as expected, returns 3 columns: 1 0 123 alter type t add attribute bla text; alter type t drop attribute bla; create table tab of t; select a.* from pg_class c, pg_attribute a where relname in ('t', 'tab') and c.oid = a.attrelid; -- -> Type t shows its 4 columns, with bla having been renamed to '........pg.dropped.4........' an flagged attisdropped -- -> Table tab was created with 3 columns (correctly ignored t's dropped column). select * from ctt($$ select * from (values (1, 'j', 123), (1, 'i', 0)) t $$, $$ select * from (values ('i'), ('j')) t $$); -- -> Crashes with: -- Error: ERROR: invalid return type -- Détail : Query-specified return tuple has 4 columns but crosstab returns 3. -- SQLState: 42601 -- ErrorCode: 0 rollback;
>>>>> "PG" == PG Bug reporting form <noreply@postgresql.org> writes: PG> Encapsulating crosstab_hash in a function (to define its return PG> type) does not work when the (user-defined) return type owns PG> 'dropped' attributes. Yeah. The code to generate tuples doesn't make any attempt to handle dropped columns in the result. This is nothing to do with CreateTupleDescCopy. I guess this has always been broken; there's no evidence that the code ever made any attempt to handle it. I'll see about fixing it. -- Andrew (irc:RhodiumToad)