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;
    }
 
    /*