Deduplicate code between slot_getallattrs() and slot_getsomeattrs().
authorAndres Freund <andres@anarazel.de>
Thu, 23 Aug 2018 23:58:53 +0000 (16:58 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 23 Aug 2018 23:58:53 +0000 (16:58 -0700)
Code in slot_getallattrs() is the same as if slot_getsomeattrs() is
called with number of attributes specified in the tuple
descriptor. Implement it that way instead of duplicating the code
between those two functions.

This is part of a patchseries abstracting TupleTableSlots so they can
store arbitrary forms of tuples, but is a nice enough cleanup on its
own.

Author: Ashutosh Bapat
Reviewed-By: Andres Freund
Discussion: https://postgr.es/m/20180220224318.gw4oe5jadhpmcdnm@alap3.anarazel.de

src/backend/access/common/heaptuple.c
src/include/executor/tuptable.h

index 2ec7e6a439290e0956dff528d46f4ae4f80d6f71..d8b06bca7e7b81a3804e95c78260896ab418caac 100644 (file)
@@ -1601,51 +1601,6 @@ slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
        return slot->tts_values[attnum - 1];
 }
 
-/*
- * slot_getallattrs
- *             This function forces all the entries of the slot's Datum/isnull
- *             arrays to be valid.  The caller may then extract data directly
- *             from those arrays instead of using slot_getattr.
- */
-void
-slot_getallattrs(TupleTableSlot *slot)
-{
-       int                     tdesc_natts = slot->tts_tupleDescriptor->natts;
-       int                     attnum;
-       HeapTuple       tuple;
-
-       /* Quick out if we have 'em all already */
-       if (slot->tts_nvalid == tdesc_natts)
-               return;
-
-       /*
-        * otherwise we had better have a physical tuple (tts_nvalid should equal
-        * natts in all virtual-tuple cases)
-        */
-       tuple = slot->tts_tuple;
-       if (tuple == NULL)                      /* internal error */
-               elog(ERROR, "cannot extract attribute from empty tuple slot");
-
-       /*
-        * load up any slots available from physical tuple
-        */
-       attnum = HeapTupleHeaderGetNatts(tuple->t_data);
-       attnum = Min(attnum, tdesc_natts);
-
-       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.
-        */
-       if (attnum < tdesc_natts)
-               slot_getmissingattrs(slot, attnum, tdesc_natts);
-
-       slot->tts_nvalid = tdesc_natts;
-}
-
 /*
  * slot_getsomeattrs
  *             This function forces the entries of the slot's Datum/isnull
index 0b874d976384333be32f8a25191f1eb0836bce49..bb38aa655c05f3394e83411e6782e38002bea689 100644 (file)
@@ -174,11 +174,22 @@ extern TupleTableSlot *ExecCopySlot(TupleTableSlot *dstslot,
 
 /* in access/common/heaptuple.c */
 extern Datum slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull);
-extern void slot_getallattrs(TupleTableSlot *slot);
 extern void slot_getsomeattrs(TupleTableSlot *slot, int attnum);
 extern bool slot_attisnull(TupleTableSlot *slot, int attnum);
 extern bool slot_getsysattr(TupleTableSlot *slot, int attnum,
                                Datum *value, bool *isnull);
 extern void slot_getmissingattrs(TupleTableSlot *slot, int startAttNum, int lastAttNum);
 
+/*
+ * slot_getallattrs
+ *             This function forces all the entries of the slot's Datum/isnull
+ *             arrays to be valid.  The caller may then extract data directly
+ *             from those arrays instead of using slot_getattr.
+ */
+static inline void
+slot_getallattrs(TupleTableSlot *slot)
+{
+       slot_getsomeattrs(slot, slot->tts_tupleDescriptor->natts);
+}
+
 #endif                                                 /* TUPTABLE_H */