Re: Re: BUG #9578: Undocumented behaviour for temp tables created inside query language (SQL) functions - Mailing list pgsql-bugs

From Haribabu Kommi
Subject Re: Re: BUG #9578: Undocumented behaviour for temp tables created inside query language (SQL) functions
Date
Msg-id CAJrrPGdUM9Et_VyeWHEpDxuKmCF2P0cM8kyTo52ww+3BefF62w@mail.gmail.com
Whole thread Raw
In response to Re: BUG #9578: Undocumented behaviour for temp tables created inside query language (SQL) functions  (David Johnston <polobo@yahoo.com>)
List pgsql-bugs
On Mon, Mar 17, 2014 at 4:15 PM, David Johnston <polobo@yahoo.com> wrote:
> Haribabu Kommi-2 wrote
>> On Mon, Mar 17, 2014 at 2:42 PM, David Johnston <
>
>> polobo@
>
>> > wrote:
>>> Haribabu Kommi-2 wrote
>>>> On Sun, Mar 16, 2014 at 3:50 AM,  <
>>>
>>>> jack@.co
>>>
>>>> > wrote:
>>>>> A temp table created inside an SQL function does not override existing
>>>>> permanent tables with the same name as the documentation here indicates
>>>>> it
>>>>> should:
>>>>>
>>>>> http://www.postgresql.org/docs/9.3/static/sql-createtable.html#AEN72676
>>>>>
>>>>> I've reproduced this on the major versions back to 8.4.
>>>>>
>>>>> More details, test case and investigation here:
>>>>>
>>>>> http://dba.stackexchange.com/q/60997/1396
>>>>
>>>> I checked the test case which you given in the above link.
>>>> As you are seeing the difference in behavior of accessing a temp table
>>>> inside an SQL function
>>>> and PLPGSQL function.
>>>>
>>>> Table:
>>>>
>>>> create table foo(id) as values (1);
>>>> select * from foo;
>>>>
>>>> SQL-function:
>>>>
>>>> create or replace function f() returns setof integer language sql as $$
>>>>   create temporary table foo(id) as values (2);
>>>>   select id from foo;
>>>> $$;
>>>> select * from f();
>>>>
>>>> PLPGSQL function:
>>>>
>>>> create or replace function f() returns setof integer language plpgsql as
>>>> $$
>>>> begin
>>>>   create temporary table foo(id) as values (2);
>>>>   return query select id from foo;
>>>> end;
>>>> $$;
>>>> select * from f();
>>>>
>>>> This is because while executing the SQL function the entire function
>>>> body is parsed and executed.
>>>> But with the PLPGSQL function statement by statement is parsed and
>>>> executed. Because of this
>>>> reason the SQL function not able to see the temp table which is
>>>> created during the function execution.
>>>> That is the reason the result is different.
>>>
>>>
>>>
>>> This seems to be the case; a DML statement inside an SQL function cannot
>>> access any temporary tables created within the same function.
>>>
>>> Based on this I have two documentation suggestions:
>>>
>>> Add a paragraph/sentence to: CREATE TABLE -> TEMPORARY or TEMP
>>> """
>>> Note that due to the nature of SQL-language function parsing (see section
>>> 35.4) it is not possible to both define and use a temporary table in the
>>> same function.
>>> """
>>>
>>> Add to 35.4 - Query Language (SQL) Functions
>>> 35.4.0 - Parsing Mechanics
>>> (this seems important enough for a sub-section and not just a paragraph
>>> in
>>> the introduction)
>>> """
>>> The body of an SQL function is parsed as if it were a single - multi-part
>>> -
>>> statement and thus uses a constant snapshot of the system catalog for
>>> every
>>> sub-statement therein.  Commands that alter the catalog will likely not
>>> work
>>> as expected.
>>>
>>> For example: Issuing "CREATE TEMP TABLE" within an SQL function will add
>>> the
>>> table to the catalog but subsequent statements in the same function will
>>> not
>>> see those additions and thus the temporary table will be invisible to
>>> them.
>>>
>>> Thus it is generally advised that pl/pgsql be used, instead of SQL, when
>>> non-SELECT/INSERT/UPDATE/DELETE statements are required.
>>> """
>>
>> Thanks. The proposed documentation changes are good for the user to
>> understand the behavior.
>
> Although "CREATE TEMP TABLE" probably shouldn't be special-cased for this
> since it is no more or less likely to be mis-used in this way than CREATE
> TYPE or CREATE FUNCTION.  The comment in the SQL language area should be
> sufficient as creating such a function can be expected to have at least read
> that section and to have seen the "parsing rules" note that pertains to all
> of these.

How about attached documentation patch as per the discussion?

Regards,
Hari Babu
Fujitsu Australia

Attachment

pgsql-bugs by date:

Previous
From: David Johnston
Date:
Subject: Re: BUG #9578: Undocumented behaviour for temp tables created inside query language (SQL) functions
Next
From: basti
Date:
Subject: November 2013 Replication Data Loss Issue