Re: "ERROR: Query-specified return tuple and actual function
От | Andrzej Kosmala |
---|---|
Тема | Re: "ERROR: Query-specified return tuple and actual function |
Дата | |
Msg-id | 005201c2bb5a$91841b40$0301a8c0@abit обсуждение исходный текст |
Ответ на | "ERROR: Query-specified return tuple and actual function return tuple do not match" after dropping column ("Andrzej Kosmala" <ak@webproject.pl>) |
Список | pgsql-bugs |
Tom Lane <tgl@sss.pgh.pa.us> writes: > Joe Conway <mail@joeconway.com> writes: > > Andrzej Kosmala wrote: > >> PostgreSQL 7.3 on Linux > >> After dropping column functions return error message: "ERROR: > >> Query-specified return tuple and actual function return tuple do not match" > > > Hmmm, looks like nodeFunctionscan.c:tupledesc_mismatch needs to be > > taught about attisdropped. I'll submit a patch this evening if no one > > else gets to it first. > > Actually, I believe I deliberately left it like that because I was > concerned about what would happen in this scenario. I don't think that > changing tupledesc_mismatch to ignore attisdropped columns will make > things work nicely. If a function is expecting to return (a,b,c) and > then you drop b from the table that defines its return type, is the > function likely to magically return (a,c)? I doubt it. Letting the > code get past the mismatch check is likely to result in core dumps. > > I had toyed with the notion of forbidding column drop (and maybe column > add too, not sure) whenever a table's rowtype appears as a function > argument or result type; but I'm not sure that's sufficient to protect > against problems ... > OK, but after dropping column, it is impossible to create _any_ proper working function. Only drop/create table solves this problem. template1=# create table test(id integer, name text); CREATE TABLE template1=# INSERT INTO test VALUES (1,'a'); INSERT 25332 1 template1=# create function ftest() returns setof test as 'select * from test' language 'sql'; CREATE FUNCTION template1=# select * from ftest(); id | name ----+------ 1 | a (1 row) template1=# DROP FUNCTION ftest(); DROP FUNCTION template1=# alter table test drop column name; ALTER TABLE template1=# create function ftest() returns setof test as 'select * from test' language 'sql'; CREATE FUNCTION template1=# select * from ftest(); ERROR: Query-specified return tuple and actual function return tuple do not match Andrzej Kosmala
В списке pgsql-bugs по дате отправления: