Search Postgresql Archives

Re: Potentially undocumented behaviour change in Postgres 11 concerning OLD record in an after insert trigger

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 1/4/19 4:20 AM, Kristjan Tammekivi wrote:
Hi,
I've read the documentation, that's why I said this might be undocumented. Try the SQL in Postgres 11 and see that it works for yourself. I have an analogous trigger in production from yesterday and I've tested it in local environment as well.

I can confirm:

select version();
version
------------------------------------------------------------------------------------
PostgreSQL 11.1 on x86_64-pc-linux-gnu, compiled by gcc (SUSE Linux) 4.8.5, 64-bit


INSERT INTO _tmp_test1 (val) VALUES (5);
INSERT 0 1

select * from _tmp_test1_changes ;
 id |         changes
----+-------------------------
  1 | "id"=>NULL, "val"=>NULL
(1 row)

I would file a bug report:

https://www.postgresql.org/account/submitbug/


On Fri, Jan 4, 2019 at 12:56 PM Charles Clavadetscher <clavadetscher@xxxxxxxxxxxx <mailto:clavadetscher@xxxxxxxxxxxx>> wrote:

    Hello____

    __ __

    *From:*Kristjan Tammekivi <kristjantammekivi@xxxxxxxxx
    <mailto:kristjantammekivi@xxxxxxxxx>>
    *Sent:* Freitag, 4. Januar 2019 11:46
    *To:* pgsql-general@xxxxxxxxxxxxxx <mailto:pgsql-general@xxxxxxxxxxxxxx>
    *Subject:* Potentially undocumented behaviour change in Postgres 11
    concerning OLD record in an after insert trigger____

    __ __

    Hi,____

    __ __

    I've noticed a change in the behaviour in triggers / hstores in
    Postgres 11.1 when compared to Postgres 10.5.____

    The following won't work on Postgres 10.5 but in Postgres 11.1 it
    works just fine:____

    __ __

    CREATE EXTENSION hstore;

    CREATE TABLE _tmp_test1 (id serial PRIMARY KEY, val INTEGER);
    CREATE TABLE _tmp_test1_changes (id INTEGER, changes HSTORE);

    CREATE FUNCTION test1_trigger ()
    RETURNS TRIGGER
    LANGUAGE plpgsql
    AS
    $BODY$
    BEGIN
    INSERT INTO _tmp_test1_changes (id, changes) VALUES (NEW.id,
    hstore(OLD) - hstore(NEW));
    RETURN NEW;
    END
    $BODY$;

    CREATE TRIGGER table_update AFTER INSERT OR UPDATE ON _tmp_test1
    FOR EACH ROW EXECUTE PROCEDURE test1_trigger();____

    __ __

    INSERT INTO _tmp_test1 (val) VALUES (5);____

    ERROR:  record "old" is not assigned yet____

    DETAIL:  The tuple structure of a not-yet-assigned record is
    indeterminate.____

    CONTEXT:  SQL statement "INSERT INTO _tmp_test1_changes (id,
    changes) VALUES (NEW.id, hstore(OLD) - hstore(NEW))"____

    PL/pgSQL function test1_trigger() line 3 at SQL statement____

    __ __

    I couldn't find anything about this in the release notes
    (https://www.postgresql.org/docs/11/release-11.html), but maybe I
    just didn't know what to look for.____

    __ __

    *I doubt that this works on any PG version for INSERT.____*

    *__ __*

    *According to the documentation:____*

    *__ __*

    *https://www.postgresql.org/docs/10/plpgsql-trigger.html and
    https://www.postgresql.org/docs/11/plpgsql-trigger.html____*

    *__ __*

    *OLD: **Data type **RECORD**; variable holding the old database row
    for **UPDATE**/**DELETE**operations in row-level triggers. This
    variable is unassigned in statement-level triggers and for
    **INSERT**operations.**____*

    *__ __*

    *Regards____*

    *Charles____*



--
Adrian Klaver
adrian.klaver@xxxxxxxxxxx




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux