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