Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vQn9g-000aJ5-1M for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Dec 2025 13:44:29 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vQn9f-00DPVf-1e for pgsql-hackers@arkaria.postgresql.org; Wed, 03 Dec 2025 13:44:27 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vQn9f-00DPVX-0W for pgsql-hackers@lists.postgresql.org; Wed, 03 Dec 2025 13:44:27 +0000 Received: from udcm-wwu2.uni-muenster.de ([128.176.118.28]) by makus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vQn9c-002vwA-0L for pgsql-hackers@lists.postgresql.org; Wed, 03 Dec 2025 13:44:26 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=uni-muenster.de; i=@uni-muenster.de; q=dns/txt; s=uniout; t=1764769465; x=1796305465; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=13t1Diq7GEVL3k3hakZIpfsPDZKPGyHhqSPYkXewn64=; b=mlKi45vlNpSh1Bf2ZQkDnDmSGpEHQBsbqJZeCVvJutqrpzYNkuIbs4S9 1tAgER8QW8B0FRt0CoSwF1ittOSCUzVzqi3/VXjTyEyj/NcyHBRzGidXQ p+TbMW/o3xB3y+IRNs2m3pHgDDaLB9GiIce+Y9D2SuyxODmiQaHfHWbos M6kaWHpJ2P0kVY53e3ZWtCdjIjxpJ3o09Tqkhyv3P2EFnKwRjC4sNYBvx hFRFeH/3d+VZMvrvqoSXytIw+8RWSBbGURQgMl4WeFkQiKg9MGFTZfXsi RILDJsrFjdNPMJrbAqgdq4Kw3BdxIIo6vGGouFfnxLSDwXp8vHhKxMuBE g==; X-CSE-ConnectionGUID: 2mmLOZxzTI2f+Cn67isUpg== X-CSE-MsgGUID: TiVmnv+OQDWfUz2KZaGuhg== X-IronPort-AV: E=Sophos;i="6.20,246,1758578400"; d="scan'208";a="377171322" Received: from secmail.uni-muenster.de ([128.176.118.4]) by UDCM-RELAY2.UNI-MUENSTER.DE with ESMTP; 03 Dec 2025 14:44:20 +0100 Received: from [192.168.178.27] (dynamic-078-048-100-129.78.48.pool.telefonica.de [78.48.100.129]) by SECMAIL.UNI-MUENSTER.DE (Postfix) with ESMTPSA id 597BD20ADF03; Wed, 3 Dec 2025 14:44:17 +0100 (CET) Message-ID: <62426ced-0795-4191-876a-4fa16d277757@uni-muenster.de> Date: Wed, 3 Dec 2025 14:44:16 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: proposal: schema variables To: Pavel Stehule Cc: Bruce Momjian , Dmitry Dolgov <9erthalion6@gmail.com>, Laurenz Albe , Erik Rijkers , Michael Paquier , Amit Kapila , DUVAL REMI , PostgreSQL Hackers , jian he , Alvaro Herrera , PegoraroF10 References: <9d6897bd-855d-44a6-8ebe-17b2b1d04430@uni-muenster.de> Content-Language: de-DE, en-GB From: Jim Jones In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk 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 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 postgres=# LET == 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