Thread

  1. Re: proposal: schema variables

    Pavel Stehule <pavel.stehule@gmail.com> — 2025-12-05T06:50:25Z

    Hi
    
    st 3. 12. 2025 v 14:44 odesílatel Jim Jones <jim.jones@uni-muenster.de>
    napsal:
    
    > 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);
    >
    > }
    >
    >
    yes, there was a bug, fixed
    
    
    >
    > == 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;
    >
    >                ^
    >
    
    Both mentioned issues are related to the declared target of this patchset -
    maximal reduction of the size.
    
    But It not difficult to support these requested features - see the patches
    0008 and 0009
    
    Best regards
    
    Pavel
    
    
    
    >
    >
    > Best, Jim
    >
    >
    >
    >