From: | "Andrzej Kosmala" <ak(at)webproject(dot)pl> |
---|---|
To: | <pgsql-bugs(at)postgresql(dot)org> |
Cc: | "Tom Lane" <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Subject: | Re: "ERROR: Query-specified return tuple and actual function |
Date: | 2003-01-13 23:21:57 |
Message-ID: | 005201c2bb5a$91841b40$0301a8c0@abit |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> writes:
> Joe Conway <mail(at)joeconway(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Joe Conway | 2003-01-14 02:13:01 | Re: "ERROR: Query-specified return tuple and actual function |
Previous Message | Tom Lane | 2003-01-13 19:52:25 | Re: "ERROR: Query-specified return tuple and actual function |