Re: proposal: schema variables

From: Jim Jones <jim(dot)jones(at)uni-muenster(dot)de>
To: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Cc: Bruce Momjian <bruce(at)momjian(dot)us>, Dmitry Dolgov <9erthalion6(at)gmail(dot)com>, Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>, Erik Rijkers <er(at)xs4all(dot)nl>, Michael Paquier <michael(at)paquier(dot)xyz>, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, DUVAL REMI <REMI(dot)DUVAL(at)cheops(dot)fr>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, jian he <jian(dot)universality(at)gmail(dot)com>, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, PegoraroF10 <marcos(at)f10(dot)com(dot)br>
Subject: Re: proposal: schema variables
Date: 2025-12-03 13:44:16
Message-ID: 62426ced-0795-4191-876a-4fa16d277757@uni-muenster.de
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-performance

Hi Pavel

On 03/12/2025 05:27, Pavel Stehule wrote:
> Hi
>
> fresh rebase after a87987cafca683e9076c424f99bae117211a83a4

I'm going through the patch again and have a few initial comments.

== Memory Management ==

DROP VARIABLE seems to be leaking memory:

postgres=# CREATE TEMPORARY VARIABLE var AS text;
CREATE VARIABLE
postgres=# LET var = repeat('🐘', 100000000);
LET
postgres=# SELECT pg_size_pretty(used_bytes)
FROM pg_backend_memory_contexts
WHERE name = 'session variables';
pg_size_pretty
----------------
381 MB
(1 row)

postgres=# DROP VARIABLE var;
DROP VARIABLE
postgres=# SELECT pg_size_pretty(used_bytes)
FROM pg_backend_memory_contexts
WHERE name = 'session variables';
pg_size_pretty
----------------
381 MB
(1 row)

If we simply set the variable to NULL it works as expected:

postgres=# LET var = repeat('🐘', 100000000);
LET
postgres=# SELECT pg_size_pretty(used_bytes)
FROM pg_backend_memory_contexts
WHERE name = 'session variables';
pg_size_pretty
----------------
381 MB
(1 row)

postgres=# LET var = NULL;
LET
postgres=# SELECT pg_size_pretty(used_bytes)
FROM pg_backend_memory_contexts
WHERE name = 'session variables';
pg_size_pretty
----------------
240 bytes
(1 row)

Most likely you forgot to pfree "svar->value" at DropVariableByName(), e.g.

void
DropVariableByName(char *varname)
{

...

if (!svar->typbyval && !svar->isnull)
pfree(DatumGetPointer(svar->value));

(void) hash_search(sessionvars,
varname,
HASH_REMOVE,
NULL);

}

== TAB completion ==

Why suggest CREATE VARIABLE (non-temporary) if it is not supported?

postgres=# CREATE V<TAB>
VARIABLE VIEW
postgres=# CREATE VARIABLE var AS int;
ERROR: only temporal session variables are supported

It would be nice to have tab completion for DROP VARIABLE and LET as well:

postgres=# DROP VARIABLE <TAB>

postgres=# LET <TAB>

== Missing IF EXISTS in DROP VARIABLE ==

DROP VARIABLE IF EXISTS var;
ERROR: syntax error at or near "EXISTS"
LINE 1: DROP VARIABLE IF EXISTS var;

^

Best, Jim

In response to

Browse pgsql-hackers by date

  From Date Subject
Previous Message cca5507 2025-12-03 13:18:57 Re: Support loser tree for k-way merge

Browse pgsql-performance by date

  From Date Subject
Previous Message Pavel Stehule 2025-12-03 04:27:04 Re: proposal: schema variables