Обсуждение: 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)