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;