Fix breakage in AlterFunction().
authorTom Lane <[email protected]>
Wed, 20 Apr 2022 03:03:59 +0000 (23:03 -0400)
committerTom Lane <[email protected]>
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 7de844b2cadff52a6d295eb66c30c0278f58d8e1..a2275a0c6bd469efdd4bd649d0136dc68caaad38 100644 (file)
@@ -1253,6 +1253,8 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt)
                    (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                     errmsg("ROWS is not applicable when function does not return a set")));
    }
+   if (parallel_item)
+       procForm->proparallel = interpret_func_parallel(parallel_item);
    if (set_items)
    {
        Datum       datum;
@@ -1287,8 +1289,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);