Revert 764da7710b
authorAlexander Korotkov <[email protected]>
Mon, 3 Apr 2023 13:55:09 +0000 (16:55 +0300)
committerAlexander Korotkov <[email protected]>
Mon, 3 Apr 2023 13:55:09 +0000 (16:55 +0300)
Discussion: https://postgr.es/m/20230323003003.plgaxjqahjgkuxrk%40awork3.anarazel.de

src/backend/executor/nodeModifyTable.c

index 93ebfdbb0d83080ea4676d7a4fd07c3d1e80f887..3a673895082a170914bcadd6da479bb1afc349b5 100644 (file)
@@ -1559,22 +1559,6 @@ ldelete:
                                        {
                                                case TM_Ok:
                                                        Assert(context->tmfd.traversed);
-
-                                                       /*
-                                                        * Save locked tuple for further processing of
-                                                        * RETURNING clause.
-                                                        */
-                                                       if (processReturning &&
-                                                               resultRelInfo->ri_projectReturning &&
-                                                               !resultRelInfo->ri_FdwRoutine)
-                                                       {
-                                                               TupleTableSlot *returningSlot;
-
-                                                               returningSlot = ExecGetReturningSlot(estate, resultRelInfo);
-                                                               ExecCopySlot(returningSlot, inputslot);
-                                                               ExecMaterializeSlot(returningSlot);
-                                                       }
-
                                                        epqslot = EvalPlanQual(context->epqstate,
                                                                                                   resultRelationDesc,
                                                                                                   resultRelInfo->ri_RangeTableIndex,
@@ -1689,17 +1673,12 @@ ldelete:
                }
                else
                {
-                       /*
-                        * Tuple can be already fetched to the returning slot in case
-                        * we've previously locked it.  Fetch the tuple only if the slot
-                        * is empty.
-                        */
                        slot = ExecGetReturningSlot(estate, resultRelInfo);
                        if (oldtuple != NULL)
                        {
                                ExecForceStoreHeapTuple(oldtuple, slot, false);
                        }
-                       else if (TupIsNull(slot))
+                       else
                        {
                                if (!table_tuple_fetch_row_version(resultRelationDesc, tupleid,
                                                                                                   SnapshotAny, slot))
@@ -2414,19 +2393,6 @@ redo_act:
                                                case TM_Ok:
                                                        Assert(context->tmfd.traversed);
 
-                                                       /* Make sure ri_oldTupleSlot is initialized. */
-                                                       if (unlikely(!resultRelInfo->ri_projectNewInfoValid))
-                                                               ExecInitUpdateProjection(context->mtstate,
-                                                                                                                resultRelInfo);
-
-                                                       /*
-                                                        * Save the locked tuple for further calculation
-                                                        * of the new tuple.
-                                                        */
-                                                       oldSlot = resultRelInfo->ri_oldTupleSlot;
-                                                       ExecCopySlot(oldSlot, inputslot);
-                                                       ExecMaterializeSlot(oldSlot);
-
                                                        epqslot = EvalPlanQual(context->epqstate,
                                                                                                   resultRelationDesc,
                                                                                                   resultRelInfo->ri_RangeTableIndex,
@@ -2435,6 +2401,18 @@ redo_act:
                                                                /* Tuple not passing quals anymore, exiting... */
                                                                return NULL;
 
+                                                       /* Make sure ri_oldTupleSlot is initialized. */
+                                                       if (unlikely(!resultRelInfo->ri_projectNewInfoValid))
+                                                               ExecInitUpdateProjection(context->mtstate,
+                                                                                                                resultRelInfo);
+
+                                                       /* Fetch the most recent version of old tuple. */
+                                                       oldSlot = resultRelInfo->ri_oldTupleSlot;
+                                                       if (!table_tuple_fetch_row_version(resultRelationDesc,
+                                                                                                                          tupleid,
+                                                                                                                          SnapshotAny,
+                                                                                                                          oldSlot))
+                                                               elog(ERROR, "failed to fetch tuple being updated");
                                                        slot = ExecGetUpdateNewTuple(resultRelInfo,
                                                                                                                 epqslot, oldSlot);
                                                        goto redo_act;