Re: BUG #8046: PL/pgSQL plan caching regression

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: BUG #8046: PL/pgSQL plan caching regression
Дата
Msg-id 26744.1365463397@sss.pgh.pa.us
обсуждение исходный текст
Ответ на BUG #8046: PL/pgSQL plan caching regression  (dmitigr@gmail.com)
Ответы Re: BUG #8046: PL/pgSQL plan caching regression  (Dmitriy Igrishin <dmitigr@gmail.com>)
Список pgsql-bugs
dmitigr@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.

We might think of a nicer solution sooner or later, but don't hold your
breath (and don't expect it to be back-patched into released branches).

            regards, tom lane

В списке pgsql-bugs по дате отправления:

Предыдущее
От: dmitigr@gmail.com
Дата:
Сообщение: BUG #8046: PL/pgSQL plan caching regression
Следующее
От: Dmitriy Igrishin
Дата:
Сообщение: Re: BUG #8046: PL/pgSQL plan caching regression