From: Andrew Dunstan Date: Sat, 31 Mar 2018 22:46:18 +0000 (+0930) Subject: Small cleanups in fast default code. X-Git-Tag: REL_11_BETA1~408 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed69864350a59c51c8570900601ebd335956b638;p=postgresql Small cleanups in fast default code. Problems identified by Andres Freund and Haribabu Kommi --- diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c index 960bbe4203..c64645675e 100644 --- a/src/backend/access/common/heaptuple.c +++ b/src/backend/access/common/heaptuple.c @@ -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) diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 78cfcadea0..ea06aeedb2 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -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; } /*