]> granicus.if.org Git - postgresql/commitdiff
Small cleanups in fast default code.
authorAndrew Dunstan <andrew@dunslane.net>
Sat, 31 Mar 2018 22:46:18 +0000 (08:16 +0930)
committerAndrew Dunstan <andrew@dunslane.net>
Sat, 31 Mar 2018 22:46:18 +0000 (08:16 +0930)
Problems identified by Andres Freund and Haribabu Kommi

src/backend/access/common/heaptuple.c
src/backend/executor/execTuples.c

index 960bbe42037e2b035a4923ce1f68c572c36a6c2f..c64645675e6867020aabf067b135eb3207f88a61 100644 (file)
@@ -127,7 +127,6 @@ slot_getmissingattrs(TupleTableSlot *slot, int startAttNum, int lastAttNum)
        if (slot->tts_tupleDescriptor->constr)
                attrmiss = slot->tts_tupleDescriptor->constr->missing;
 
-
        if (!attrmiss)
        {
                /* no missing values array at all, so just fill everything in as NULL */
@@ -139,9 +138,9 @@ slot_getmissingattrs(TupleTableSlot *slot, int startAttNum, int lastAttNum)
        else
        {
                /* if there is a missing values array we must process them one by one */
-               for (missattnum = lastAttNum - 1;
-                        missattnum >= startAttNum;
-                        missattnum--)
+               for (missattnum = startAttNum;
+                        missattnum < lastAttNum;
+                        missattnum++)
                {
                        slot->tts_values[missattnum] = attrmiss[missattnum].ammissing;
                        slot->tts_isnull[missattnum] =
@@ -1636,6 +1635,8 @@ slot_getallattrs(TupleTableSlot *slot)
 
        slot_deform_tuple(slot, attnum);
 
+       attnum = slot->tts_nvalid;
+
        /*
         * If tuple doesn't have all the atts indicated by tupleDesc, read the
         * rest as NULLS or missing values.
@@ -1681,8 +1682,10 @@ slot_getsomeattrs(TupleTableSlot *slot, int attnum)
 
        slot_deform_tuple(slot, attno);
 
+       attno = slot->tts_nvalid;
+
        /*
-        * If tuple doesn't have all the atts indicated by tupleDesc, read the
+        * If tuple doesn't have all the atts indicated by attnum, read the
         * rest as NULLs or missing values
         */
        if (attno < attnum)
index 78cfcadea0387c3c23c91fdebeb54509296526d5..ea06aeedb210917365d81bce9620f5813f3b55b3 100644 (file)
@@ -626,8 +626,7 @@ ExecCopySlotMinimalTuple(TupleTableSlot *slot)
                return heap_copy_minimal_tuple(slot->tts_mintuple);
        if (slot->tts_tuple)
        {
-               if (TTS_HAS_PHYSICAL_TUPLE(slot) &&
-                       HeapTupleHeaderGetNatts(slot->tts_tuple->t_data)
+               if (HeapTupleHeaderGetNatts(slot->tts_tuple->t_data)
                        < slot->tts_tupleDescriptor->natts)
                        return minimal_expand_tuple(slot->tts_tuple,
                                                                                slot->tts_tupleDescriptor);
@@ -675,18 +674,15 @@ ExecFetchSlotTuple(TupleTableSlot *slot)
                if (HeapTupleHeaderGetNatts(slot->tts_tuple->t_data) <
                        slot->tts_tupleDescriptor->natts)
                {
+                       HeapTuple tuple;
                        MemoryContext oldContext = MemoryContextSwitchTo(slot->tts_mcxt);
 
-                       slot->tts_tuple = heap_expand_tuple(slot->tts_tuple,
-                                                                                               slot->tts_tupleDescriptor);
-                       slot->tts_shouldFree = true;
+                       tuple = heap_expand_tuple(slot->tts_tuple,
+                                                                         slot->tts_tupleDescriptor);
                        MemoryContextSwitchTo(oldContext);
-                       return slot->tts_tuple;
-               }
-               else
-               {
-                       return slot->tts_tuple;
+                       slot = ExecStoreTuple(tuple, slot, InvalidBuffer, true);
                }
+               return slot->tts_tuple;
        }
 
        /*