Fix breakage in AlterFunction().
authorTom Lane
Wed, 20 Apr 2022 03:03:59 +0000 (23:03 -0400)
committerTom Lane
Wed, 20 Apr 2022 03:03:59 +0000 (23:03 -0400)
An ALTER FUNCTION command that tried to update both the function's
proparallel property and its proconfig list failed to do the former,
because it stored the new proparallel value into a tuple that was
no longer the interesting one.  Carelessness in 7aea8e4f2.

(I did not bother with a regression test, because the only likely
future breakage would be for someone to ignore the comment I added
and add some other field update after the heap_modify_tuple step.
A test using existing function properties could not catch that.)

Per report from Bryn Llewellyn.  Back-patch to all supported branches.

Discussion: https://postgr.es/m/8AC9A37F-99BD-446F-A2F7-B89AD0022774@yugabyte.com

src/backend/commands/functioncmds.c

index a707394faad68d705e3467a8b3038f189dbfcfbe..c24a85dc8c89f22625f0d2cc042c525f36fc14f1 100644 (file)
@@ -1354,6 +1354,8 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt)
 
        procForm->prosupport = newsupport;
    }
+   if (parallel_item)
+       procForm->proparallel = interpret_func_parallel(parallel_item);
    if (set_items)
    {
        Datum       datum;
@@ -1388,8 +1390,7 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt)
        tup = heap_modify_tuple(tup, RelationGetDescr(rel),
                                repl_val, repl_null, repl_repl);
    }
-   if (parallel_item)
-       procForm->proparallel = interpret_func_parallel(parallel_item);
+   /* DO NOT put more touches of procForm below here; it's now dangling. */
 
    /* Do the update */
    CatalogTupleUpdate(rel, &tup->t_self, tup);