aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execTuples.c
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2018-11-16 10:25:34 -0800
committerAndres Freund <andres@anarazel.de>2018-11-16 10:29:01 -0800
commita7aa608e0f5910f9c73a530a66142c08e3d9043a (patch)
treecfe884e427c23fcf7a629bb7cb8276bf2b43e457 /src/backend/executor/execTuples.c
parent3f2393edefa5ef2b6970a5a2fa2c7e9c55cc10cf (diff)
downloadpostgresql-a7aa608e0f5910f9c73a530a66142c08e3d9043a.tar.gz
postgresql-a7aa608e0f5910f9c73a530a66142c08e3d9043a.zip
Inline hot path of slot_getsomeattrs().
This yields a minor speedup, which roughly balances the loss from the upcoming introduction of callbacks to do some operations on slots. Author: Andres Freund Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
Diffstat (limited to 'src/backend/executor/execTuples.c')
-rw-r--r--src/backend/executor/execTuples.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 2cd7e5c8669..4d92cf12699 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -1183,22 +1183,19 @@ slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
}
/*
- * slot_getsomeattrs
- * This function forces the entries of the slot's Datum/isnull
- * arrays to be valid at least up through the attnum'th entry.
+ * slot_getsomeattrs_int - workhorse for slot_getsomeattrs()
*/
void
-slot_getsomeattrs(TupleTableSlot *slot, int attnum)
+slot_getsomeattrs_int(TupleTableSlot *slot, int attnum)
{
HeapTuple tuple;
int attno;
- /* Quick out if we have 'em all already */
- if (slot->tts_nvalid >= attnum)
- return;
+ /* Check for caller errors */
+ Assert(slot->tts_nvalid < attnum); /* slot_getsomeattr checked */
+ Assert(attnum > 0);
- /* Check for caller error */
- if (attnum <= 0 || attnum > slot->tts_tupleDescriptor->natts)
+ if (unlikely(attnum > slot->tts_tupleDescriptor->natts))
elog(ERROR, "invalid attribute number %d", attnum);
/*
@@ -1209,9 +1206,7 @@ slot_getsomeattrs(TupleTableSlot *slot, int attnum)
if (tuple == NULL) /* internal error */
elog(ERROR, "cannot extract attribute from empty tuple slot");
- /*
- * load up any slots available from physical tuple
- */
+ /* Fetch as many attributes as possible from the underlying tuple. */
attno = HeapTupleHeaderGetNatts(tuple->t_data);
attno = Min(attno, attnum);
@@ -1220,13 +1215,14 @@ slot_getsomeattrs(TupleTableSlot *slot, int attnum)
attno = slot->tts_nvalid;
/*
- * If tuple doesn't have all the atts indicated by attnum, read the rest
- * as NULLs or missing values
+ * If the underlying tuple doesn't have enough attributes, tuple descriptor
+ * must have the missing attributes.
*/
- if (attno < attnum)
- slot_getmissingattrs(slot, attno, attnum);
-
- slot->tts_nvalid = attnum;
+ if (unlikely(slot->tts_nvalid < attnum))
+ {
+ slot_getmissingattrs(slot, slot->tts_nvalid, attnum);
+ slot->tts_nvalid = attnum;
+ }
}
/* ----------------------------------------------------------------