2013/4/9 Tom Lane <t...@sss.pgh.pa.us>

> dmit...@gmail.com writes:
> > CREATE OR REPLACE FUNCTION rec(type_name_ regclass, id_ bigint)
> >  RETURNS record
> >  LANGUAGE plpgsql
> >  STABLE
> > AS $function$
> > DECLARE
> >   r_ record;
> > BEGIN
> >   EXECUTE 'SELECT * FROM '||type_name_::text||' WHERE id = $1'
> >     INTO r_ USING id_;
>
> >   RAISE NOTICE '%', pg_typeof(r_.id);
>
> >   RETURN r_;
> > END;
> > $function$;
>
> > CREATE TABLE t1 (id integer);
> > CREATE TABLE t2 (id bigint);
>
> > SELECT rec('t1', 1); -- NOTICE:  integer
> > SELECT rec('t2', 2); -- Should NOTICE:  bigint, but RAISE ERROR:  type of
> > parameter 5 (bigint) does not match that when preparing the plan
> (integer)
>
> What's your grounds for calling that a regression?  It's always worked
> like that, or at least back to 8.4 which is as far as I checked (since
> pg_typeof didn't exist before that).  The fine manual documents the
> problem thus:
>
>         The mutable nature of record variables presents another problem
>         in this connection. When fields of a record variable are used in
>         expressions or statements, the data types of the fields must not
>         change from one call of the function to the next, since each
>         expression will be analyzed using the data type that is present
>         when the expression is first reached. EXECUTE can be used to get
>         around this problem when necessary.
>
Oops, I am sorry, it's documented indeed. It was too late tomorrow and I was
sure that variables (including record variables) are function-scoped,
rather than
session-scoped. (Which is natural.) So I was confused.


-- 
// Dmitriy.

Reply via email to