Re: Schema variables - new implementation for Postgres 15 - Mailing list pgsql-hackers

From Julien Rouhaud
Subject Re: Schema variables - new implementation for Postgres 15
Date
Msg-id 20220904043120.jhb3yo4rbnv4qrki@jrouhaud
Whole thread Raw
In response to Re: Schema variables - new implementation for Postgres 15  (Julien Rouhaud <rjuju123@gmail.com>)
Responses Re: Schema variables - new implementation for Postgres 15
List pgsql-hackers
On Sat, Sep 03, 2022 at 11:00:51PM +0800, Julien Rouhaud wrote:
> Hi,
>
> On Fri, Sep 02, 2022 at 07:42:00AM +0200, Pavel Stehule wrote:
> >
> > rebased today
>
> After some off-list discussion with Pavel, I'm sending some proposal patches
> (in .txt extension) to apply to the last patchset.
>
> To sum up, when a session issues a DROP VARIABLE, the session will receive an
> sinval notification for its own drop and we don't want to process it
> immediately as we need to hold the value in case the transaction is rollbacked.
> The current patch avoided that by forcing a single processing of sinval per
> transaction, and forcing it before dropping the variable.  It works but it
> seems to me that postponing all but the first VARIABLEOID sinval to the next
> transaction is a big hammer, and the sooner we can free some memory the better.
>
> For an alternative approach the attached patch store the lxid in the SVariable
> itself when dropping a currently set variable, so we can process all sinval and
> simply defer to the next transaction the memory cleanup of the variable(s) we
> know we just dropped.  What do you think of that approach?
>
> As I was working on some changes I also made a pass on session_variable.c.  I
> tried to improve a bit some comments, and also got rid of the "first_time"
> variable.  The name wasn't really great, and AFAICS it can be replaced by
> testing whether the memory context has been created yet or not.
>
> But once that done I noticed the get_rowtype_value() function.  I don't think
> this function is necessary as the core code already knows how to deal with
> stored datum when the underlying composite type was modified.  I tried to
> bypass that function and always simply return the stored value and all the
> tests run fine.  Is there really any cases when this extra code is needed?
>
> FTR I tried to do a bunch of additional testing using relation as base type for
> variable, as you can do more with those than plain composite types, but it
> still always works just fine.
>
> However, while doing so I noticed that find_composite_type_dependencies()
> failed to properly handle dependencies on relation (plain tables, matviews and
> partitioned tables).  I'm also adding 2 additional patches to fix this corner
> case and add an additional regression test for the plain table case.

I forgot to mention this chunk:

+    /*
+     * Although the value of domain type should be valid (it is
+     * checked when it is assigned to session variable), we have to
+     * check related constraints anytime. It can be more expensive
+     * than in PL/pgSQL. PL/pgSQL forces domain checks when value
+     * is assigned to the variable or when value is returned from
+     * function. Fortunately, domain types manage cache of constraints by
+     * self.
+     */
+    if (svar->is_domain)
+    {
+        MemoryContext oldcxt = CurrentMemoryContext;
+
+        /*
+         * Store domain_check extra in CurTransactionContext. When we are
+         * in other transaction, the domain_check_extra cache is not valid.
+         */
+        if (svar->domain_check_extra_lxid != MyProc->lxid)
+            svar->domain_check_extra = NULL;
+
+        domain_check(svar->value, svar->isnull,
+                     svar->typid, &svar->domain_check_extra,
+                     CurTransactionContext);
+
+        svar->domain_check_extra_lxid = MyProc->lxid;
+
+        MemoryContextSwitchTo(oldcxt);
+    }

I agree that storing the domain_check_extra in the transaction context sounds
sensible, but the memory context handling is not quite right.

Looking at domain_check, it doesn't change the current memory context, so as-is
all the code related to oldcxt is unnecessary.

Some other callers like expandedrecord.c do switch to a short lived context to
limit the lifetime of the possible leak by the expression evaluation, but I
don't think that's an option here.



pgsql-hackers by date:

Previous
From: Dilip Kumar
Date:
Subject: Re: Add 64-bit XIDs into PostgreSQL 15
Next
From: John Naylor
Date:
Subject: Re: build remaining Flex files standalone