On Fri, Aug 29, 2025 at 12:07 PM Tom Lane <t...@sss.pgh.pa.us> wrote:

> Merlin Moncure <mmonc...@gmail.com> writes:
> > How does that work in practice?  for current SQL (not pl/pgsql)
> functions,
> > this will fail:
>
> > create function f() returns int as $$ create temp table i(i int); select
> *
> > from i; $$ language sql;
> > ERROR:  relation "i" does not exist
>
> Slightly off-topic: that example does actually work as of v18,
> although you need to turn off check_function_bodies while
> creating the function:
>

Right, thanks.  The veiled note was this behavior specifically is not
uniformly better, given that pl/pgsql can be utilized to work around it.  I
have a lot more questions regarding standards compatibility coming to
procedures, but not for this thread.

merlin


>
> $ psql regression
> psql (18beta3)
> Type "help" for help.
>
> regression=# create function f() returns int as $$ create temp table i(i
> int); select *
> from i; $$ language sql;
> ERROR:  relation "i" does not exist
> LINE 2: from i; $$ language sql;
>              ^
> regression=# set check_function_bodies to off;
> SET
> regression=# create function f() returns int as $$ create temp table i(i
> int); select *
> from i; $$ language sql;
> CREATE FUNCTION
> regression=# select f();
>  f
> ---
>
> (1 row)
>
> regression=# \d i
>                Table "pg_temp_70.i"
>  Column |  Type   | Collation | Nullable | Default
> --------+---------+-----------+----------+---------
>  i      | integer |           |          |
>
>
> But David is correct that this is irrelevant to the case of
> SQL-standard functions.  Everything mentioned in such a function has
> to exist at function creation time, no exceptions.
>
> There's a closely related complaint at [1], which I rather doubt
> we're going to do anything about.
>
>                         regards, tom lane
>
> [1]
> https://www.postgresql.org/message-id/19034-de0857b4f94ec10c%40postgresql.org
>

Reply via email to