Re: proposal: schema variables
Jim Jones <jim.jones@uni-muenster.de>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Move WAL sequence code into its own file
- a87987cafca6 19 (unreleased) cited
-
Add ExplainState argument to pg_plan_query() and planner().
- c83ac02ec730 19 (unreleased) cited
-
Don't include access/htup_details.h in executor/tuptable.h
- 1a8b5b11e48a 19 (unreleased) cited
-
Refactor to avoid code duplication in transformPLAssignStmt.
- b0fb2c6aa5a4 19 (unreleased) cited
-
Avoid including commands/dbcommands.h in so many places
- 325fc0ab14d1 19 (unreleased) cited
-
Restrict psql meta-commands in plain-text dumps.
- 71ea0d679543 19 (unreleased) cited
-
Split func.sgml into more manageable pieces
- 4e23c9ef65ac 19 (unreleased) cited
-
Fix squashing algorithm for query texts
- 0f65f3eec478 18.0 cited
-
EXPLAIN: Always use two fractional digits for row counts.
- 95dbd827f2ed 18.0 cited
-
Preliminary refactoring of plpgsql expression construction.
- a654af21ae52 18.0 cited
-
plpgsql: pure parser and reentrant scanner
- 7b27f5fd36cb 18.0 cited
-
Add some sanity checks in executor for query ID reporting
- 24f520594809 18.0 cited
-
Fix misleading error message context
- 4af123ad45bd 18.0 cited
-
Add macros for looping through a List without a ListCell.
- 14dd0f27d7cd 17.0 cited
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