Re: Using Expanded Objects other than Arrays from plpgsql

Michel Pelletier <pelletier.michel@gmail.com>

From: Michel Pelletier <pelletier.michel@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-general <pgsql-general@lists.postgresql.org>
Date: 2024-10-21T03:29:13Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Allow extension functions to participate in in-place updates.

  2. Implement new optimization rule for updates of expanded variables.

  3. Detect whether plpgsql assignment targets are "local" variables.

  4. Preliminary refactoring of plpgsql expression construction.

  5. Refactor pl_funcs.c to provide a usage-independent tree walker.

  6. Generalize plpgsql's heuristic for importing expanded objects.

On Sun, Oct 20, 2024 at 10:13 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

>
> I'm not sure.  It seems certain that if the object is already expanded
> (either R/W or R/O), the paths for that in plpgsql_exec_function could
> be taken regardless of its specific type.
>


> But it seems like we could get an easy win by adjusting
> plpgsql_exec_function along the lines of
>
> l. 549:
> -                    if (!var->isnull && var->datatype->typisarray)
> +                    if (!var->isnull)
>
> l. 564:
> -                        else
> +                        else if (var->datatype->typisarray)
>
> How far does that improve matters for you?
>

I tried this change and couldn't get it to work, on the next line:

if (!var->isnull)
{
    if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(var->value)))

var->value might not be a pointer, as it seems at least from my gdb
scratching, but say an integer.  This segfaults on non-array but
non-expandable datum.

I guess this gets back into knowing if a flat thing is expandable or not.
I'm going to spend some more time looking at it, I haven't been in this
corner of Postgres before.

Another comment that caught my eye was this one:

https://github.com/postgres/postgres/blob/master/src/pl/plpgsql/src/pl_exec.c#L8304

Not sure what the implication is there.

-Michel