Re: BUG #19454: PL/pgSQL mishandling jsonb attribute reference - Mailing list pgsql-bugs

From Tom Lane
Subject Re: BUG #19454: PL/pgSQL mishandling jsonb attribute reference
Date
Msg-id 822926.1776089551@sss.pgh.pa.us
Whole thread
In response to BUG #19454: PL/pgSQL mishandling jsonb attribute reference  (PG Bug reporting form <noreply@postgresql.org>)
List pgsql-bugs
PG Bug reporting form <noreply@postgresql.org> writes:
> It appears the PL/pgSQL assignment operator := fails to maintain the
> stability of a jsonb attribute reference (from a function result) during a
> self-concatenation operation, whereas a SELECT wrapper forces correct
> materialization.

Your problem is operator precedence:

> v_payload := v_payload || tj->'delta'; -- The problematic line
> v_payload := (SELECT v_payload || (tj->'delta')); --This avoids the issue.

The second formulation works because of the "extra" parentheses;
that is,
    v_payload || tj->'delta'
is parsed as
    (v_payload || tj)->'delta'
but what you need is
    v_payload || (tj->'delta')

Yeah, this isn't super intuitive, but all our non-SQL-standard
operators have the same precedence [1], so || and -> associate
left-to-right by default.

            regards, tom lane

[1] https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-PRECEDENCE



pgsql-bugs by date:

Previous
From: "David G. Johnston"
Date:
Subject: Re: BUG #19454: PL/pgSQL mishandling jsonb attribute reference
Next
From: Tom Lane
Date:
Subject: Re: BUG #19455: ALTER TABLE RENAME will rename a sequence