Re: Convert varatt.h macros to static inline functions - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Convert varatt.h macros to static inline functions
Date
Msg-id 2071302.1753970762@sss.pgh.pa.us
Whole thread Raw
In response to Convert varatt.h macros to static inline functions  (Peter Eisentraut <peter@eisentraut.org>)
Responses Re: Convert varatt.h macros to static inline functions
Re: Convert varatt.h macros to static inline functions
List pgsql-hackers
Peter Eisentraut <peter@eisentraut.org> writes:
> I had this lying around as a draft patch, as part of my ongoing campaign 
> to convert many complicated macros to static inline functions.  Since 
> the topic was mentioned in another thread [0], I cleaned up the patch so 
> that we can all look at it.

I had just finished doing exactly that, per my idea in the other
thread of providing both pointer and Datum variants where needed.
I'll look more closely at yours in a bit, but here's mine.

            regards, tom lane

diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c
index 0949c88983a..9b671a3ef6a 100644
--- a/contrib/amcheck/verify_nbtree.c
+++ b/contrib/amcheck/verify_nbtree.c
@@ -2893,15 +2893,15 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup)
          * index without further processing, so an external varlena header
          * should never be encountered here
          */
-        if (VARATT_IS_EXTERNAL(DatumGetPointer(normalized[i])))
+        if (VARATT_IS_EXTERNAL_D(normalized[i]))
             ereport(ERROR,
                     (errcode(ERRCODE_INDEX_CORRUPTED),
                      errmsg("external varlena datum in tuple that references heap row (%u,%u) in index \"%s\"",
                             ItemPointerGetBlockNumber(&(itup->t_tid)),
                             ItemPointerGetOffsetNumber(&(itup->t_tid)),
                             RelationGetRelationName(state->rel))));
-        else if (!VARATT_IS_COMPRESSED(DatumGetPointer(normalized[i])) &&
-                 VARSIZE(DatumGetPointer(normalized[i])) > TOAST_INDEX_TARGET &&
+        else if (!VARATT_IS_COMPRESSED_D(normalized[i]) &&
+                 VARSIZE_D(normalized[i]) > TOAST_INDEX_TARGET &&
                  (att->attstorage == TYPSTORAGE_EXTENDED ||
                   att->attstorage == TYPSTORAGE_MAIN))
         {
@@ -2912,7 +2912,7 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup)
              */
             formnewtup = true;
         }
-        else if (VARATT_IS_COMPRESSED(DatumGetPointer(normalized[i])))
+        else if (VARATT_IS_COMPRESSED_D(normalized[i]))
         {
             formnewtup = true;
             normalized[i] = PointerGetDatum(PG_DETOAST_DATUM(normalized[i]));
@@ -2930,7 +2930,7 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup)
             char       *data = palloc(len);

             SET_VARSIZE_SHORT(data, len);
-            memcpy(data + 1, VARDATA(DatumGetPointer(normalized[i])), len - 1);
+            memcpy(data + 1, VARDATA_D(normalized[i]), len - 1);

             formnewtup = true;
             normalized[i] = PointerGetDatum(data);
diff --git a/contrib/hstore/hstore_gin.c b/contrib/hstore/hstore_gin.c
index 766c00bb6a7..0ead2aaa272 100644
--- a/contrib/hstore/hstore_gin.c
+++ b/contrib/hstore/hstore_gin.c
@@ -127,7 +127,9 @@ gin_extract_hstore_query(PG_FUNCTION_ARGS)
             /* Nulls in the array are ignored, cf hstoreArrayToPairs */
             if (key_nulls[i])
                 continue;
-            item = makeitem(VARDATA(key_datums[i]), VARSIZE(key_datums[i]) - VARHDRSZ, KEYFLAG);
+            item = makeitem(VARDATA_D(key_datums[i]),
+                            VARSIZE_D(key_datums[i]) - VARHDRSZ,
+                            KEYFLAG);
             entries[j++] = PointerGetDatum(item);
         }

diff --git a/contrib/hstore/hstore_gist.c b/contrib/hstore/hstore_gist.c
index a3b08af3850..8d1b94e5238 100644
--- a/contrib/hstore/hstore_gist.c
+++ b/contrib/hstore/hstore_gist.c
@@ -576,7 +576,8 @@ ghstore_consistent(PG_FUNCTION_ARGS)

             if (key_nulls[i])
                 continue;
-            crc = crc32_sz(VARDATA(key_datums[i]), VARSIZE(key_datums[i]) - VARHDRSZ);
+            crc = crc32_sz(VARDATA_D(key_datums[i]),
+                           VARSIZE_D(key_datums[i]) - VARHDRSZ);
             if (!(GETBIT(sign, HASHVAL(crc, siglen))))
                 res = false;
         }
@@ -599,7 +600,8 @@ ghstore_consistent(PG_FUNCTION_ARGS)

             if (key_nulls[i])
                 continue;
-            crc = crc32_sz(VARDATA(key_datums[i]), VARSIZE(key_datums[i]) - VARHDRSZ);
+            crc = crc32_sz(VARDATA_D(key_datums[i]),
+                           VARSIZE_D(key_datums[i]) - VARHDRSZ);
             if (GETBIT(sign, HASHVAL(crc, siglen)))
                 res = true;
         }
diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c
index 4f867e4bd1f..ad384ccbe1f 100644
--- a/contrib/hstore/hstore_io.c
+++ b/contrib/hstore/hstore_io.c
@@ -684,22 +684,22 @@ hstore_from_arrays(PG_FUNCTION_ARGS)

         if (!value_nulls || value_nulls[i])
         {
-            pairs[i].key = VARDATA(key_datums[i]);
+            pairs[i].key = VARDATA_D(key_datums[i]);
             pairs[i].val = NULL;
             pairs[i].keylen =
-                hstoreCheckKeyLen(VARSIZE(key_datums[i]) - VARHDRSZ);
+                hstoreCheckKeyLen(VARSIZE_D(key_datums[i]) - VARHDRSZ);
             pairs[i].vallen = 4;
             pairs[i].isnull = true;
             pairs[i].needfree = false;
         }
         else
         {
-            pairs[i].key = VARDATA(key_datums[i]);
-            pairs[i].val = VARDATA(value_datums[i]);
+            pairs[i].key = VARDATA_D(key_datums[i]);
+            pairs[i].val = VARDATA_D(value_datums[i]);
             pairs[i].keylen =
-                hstoreCheckKeyLen(VARSIZE(key_datums[i]) - VARHDRSZ);
+                hstoreCheckKeyLen(VARSIZE_D(key_datums[i]) - VARHDRSZ);
             pairs[i].vallen =
-                hstoreCheckValLen(VARSIZE(value_datums[i]) - VARHDRSZ);
+                hstoreCheckValLen(VARSIZE_D(value_datums[i]) - VARHDRSZ);
             pairs[i].isnull = false;
             pairs[i].needfree = false;
         }
@@ -778,22 +778,22 @@ hstore_from_array(PG_FUNCTION_ARGS)

         if (in_nulls[i * 2 + 1])
         {
-            pairs[i].key = VARDATA(in_datums[i * 2]);
+            pairs[i].key = VARDATA_D(in_datums[i * 2]);
             pairs[i].val = NULL;
             pairs[i].keylen =
-                hstoreCheckKeyLen(VARSIZE(in_datums[i * 2]) - VARHDRSZ);
+                hstoreCheckKeyLen(VARSIZE_D(in_datums[i * 2]) - VARHDRSZ);
             pairs[i].vallen = 4;
             pairs[i].isnull = true;
             pairs[i].needfree = false;
         }
         else
         {
-            pairs[i].key = VARDATA(in_datums[i * 2]);
-            pairs[i].val = VARDATA(in_datums[i * 2 + 1]);
+            pairs[i].key = VARDATA_D(in_datums[i * 2]);
+            pairs[i].val = VARDATA_D(in_datums[i * 2 + 1]);
             pairs[i].keylen =
-                hstoreCheckKeyLen(VARSIZE(in_datums[i * 2]) - VARHDRSZ);
+                hstoreCheckKeyLen(VARSIZE_D(in_datums[i * 2]) - VARHDRSZ);
             pairs[i].vallen =
-                hstoreCheckValLen(VARSIZE(in_datums[i * 2 + 1]) - VARHDRSZ);
+                hstoreCheckValLen(VARSIZE_D(in_datums[i * 2 + 1]) - VARHDRSZ);
             pairs[i].isnull = false;
             pairs[i].needfree = false;
         }
diff --git a/contrib/hstore/hstore_op.c b/contrib/hstore/hstore_op.c
index 5e57eceffc8..90f85653fe5 100644
--- a/contrib/hstore/hstore_op.c
+++ b/contrib/hstore/hstore_op.c
@@ -107,8 +107,8 @@ hstoreArrayToPairs(ArrayType *a, int *npairs)
     {
         if (!key_nulls[i])
         {
-            key_pairs[j].key = VARDATA(key_datums[i]);
-            key_pairs[j].keylen = VARSIZE(key_datums[i]) - VARHDRSZ;
+            key_pairs[j].key = VARDATA_D(key_datums[i]);
+            key_pairs[j].keylen = VARSIZE_D(key_datums[i]) - VARHDRSZ;
             key_pairs[j].val = NULL;
             key_pairs[j].vallen = 0;
             key_pairs[j].needfree = 0;
diff --git a/contrib/test_decoding/test_decoding.c b/contrib/test_decoding/test_decoding.c
index bb495563200..135cf351d95 100644
--- a/contrib/test_decoding/test_decoding.c
+++ b/contrib/test_decoding/test_decoding.c
@@ -581,7 +581,7 @@ tuple_to_stringinfo(StringInfo s, TupleDesc tupdesc, HeapTuple tuple, bool skip_
         /* print data */
         if (isnull)
             appendStringInfoString(s, "null");
-        else if (typisvarlena && VARATT_IS_EXTERNAL_ONDISK(origval))
+        else if (typisvarlena && VARATT_IS_EXTERNAL_ONDISK_D(origval))
             appendStringInfoString(s, "unchanged-toast-datum");
         else if (!typisvarlena)
             print_literal(s, typid,
diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c
index 0d1507a2a36..d92c1f92569 100644
--- a/src/backend/access/brin/brin_minmax_multi.c
+++ b/src/backend/access/brin/brin_minmax_multi.c
@@ -624,7 +624,7 @@ brin_range_serialize(Ranges *range)

         for (i = 0; i < nvalues; i++)
         {
-            len += VARSIZE_ANY(range->values[i]);
+            len += VARSIZE_ANY_D(range->values[i]);
         }
     }
     else if (typlen == -2)        /* cstring */
@@ -687,7 +687,7 @@ brin_range_serialize(Ranges *range)
         }
         else if (typlen == -1)    /* varlena */
         {
-            int            tmp = VARSIZE_ANY(DatumGetPointer(range->values[i]));
+            int            tmp = VARSIZE_ANY_D(range->values[i]);

             memcpy(ptr, DatumGetPointer(range->values[i]), tmp);
             ptr += tmp;
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index 861f397e6db..5509354be48 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -205,7 +205,7 @@ brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno, BrinMemTuple *tuple,
              * even for range with non-NULL data? E.g. degenerate bloom filter
              * may be thrown away, etc.
              */
-            if (VARATT_IS_EXTERNAL(DatumGetPointer(value)))
+            if (VARATT_IS_EXTERNAL_D(value))
             {
                 value = PointerGetDatum(detoast_external_attr((struct varlena *)
                                                               DatumGetPointer(value)));
@@ -217,7 +217,7 @@ brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno, BrinMemTuple *tuple,
              * datatype, try to compress it in-line.
              */
             if (!VARATT_IS_EXTENDED(DatumGetPointer(value)) &&
-                VARSIZE(DatumGetPointer(value)) > TOAST_INDEX_TARGET &&
+                VARSIZE_D(value) > TOAST_INDEX_TARGET &&
                 (atttype->typstorage == TYPSTORAGE_EXTENDED ||
                  atttype->typstorage == TYPSTORAGE_MAIN))
             {
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 969d1028cae..ffb7b4d0a80 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -189,7 +189,7 @@ getmissingattr(TupleDesc tupleDesc,
             if (att->attlen > 0)
                 key.len = att->attlen;
             else
-                key.len = VARSIZE_ANY(attrmiss->am_value);
+                key.len = VARSIZE_ANY_D(attrmiss->am_value);
             key.value = attrmiss->am_value;

             entry = hash_search(missing_cache, &key, HASH_ENTER, &found);
@@ -245,7 +245,7 @@ heap_compute_data_size(TupleDesc tupleDesc,
             data_length += VARATT_CONVERTED_SHORT_SIZE(DatumGetPointer(val));
         }
         else if (atti->attlen == -1 &&
-                 VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(val)))
+                 VARATT_IS_EXTERNAL_EXPANDED_D(val))
         {
             /*
              * we want to flatten the expanded value so that the constructed
@@ -903,7 +903,7 @@ expand_tuple(HeapTuple *targetHeapTuple,

                 targetDataLen = att_addlength_pointer(targetDataLen,
                                                       att->attlen,
-                                                      attrmiss[attnum].am_value);
+                                                      DatumGetPointer(attrmiss[attnum].am_value));
             }
             else
             {
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index 1986b943a28..79cba541a58 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -105,7 +105,7 @@ index_form_tuple_context(TupleDesc tupleDescriptor,
          * If value is stored EXTERNAL, must fetch it so we are not depending
          * on outside storage.  This should be improved someday.
          */
-        if (VARATT_IS_EXTERNAL(DatumGetPointer(values[i])))
+        if (VARATT_IS_EXTERNAL_D(values[i]))
         {
             untoasted_values[i] =
                 PointerGetDatum(detoast_external_attr((struct varlena *)
@@ -118,7 +118,7 @@ index_form_tuple_context(TupleDesc tupleDescriptor,
          * try to compress it in-line.
          */
         if (!VARATT_IS_EXTENDED(DatumGetPointer(untoasted_values[i])) &&
-            VARSIZE(DatumGetPointer(untoasted_values[i])) > TOAST_INDEX_TARGET &&
+            VARSIZE_D(untoasted_values[i]) > TOAST_INDEX_TARGET &&
             (att->attstorage == TYPSTORAGE_EXTENDED ||
              att->attstorage == TYPSTORAGE_MAIN))
         {
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index 50747c16396..3582ccfcdc6 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -1190,8 +1190,8 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace,

         for (i = 0; i < noldoptions; i++)
         {
-            char       *text_str = VARDATA(oldoptions[i]);
-            int            text_len = VARSIZE(oldoptions[i]) - VARHDRSZ;
+            char       *text_str = VARDATA_D(oldoptions[i]);
+            int            text_len = VARSIZE_D(oldoptions[i]) - VARHDRSZ;

             /* Search for a match in defList */
             foreach(cell, defList)
@@ -1456,8 +1456,8 @@ parseRelOptionsInternal(Datum options, bool validate,

     for (i = 0; i < noptions; i++)
     {
-        char       *text_str = VARDATA(optiondatums[i]);
-        int            text_len = VARSIZE(optiondatums[i]) - VARHDRSZ;
+        char       *text_str = VARDATA_D(optiondatums[i]);
+        int            text_len = VARSIZE_D(optiondatums[i]) - VARHDRSZ;
         int            j;

         /* Search for a match in reloptions */
diff --git a/src/backend/access/common/toast_internals.c b/src/backend/access/common/toast_internals.c
index 7d8be8346ce..10f1cedcd6f 100644
--- a/src/backend/access/common/toast_internals.c
+++ b/src/backend/access/common/toast_internals.c
@@ -49,10 +49,10 @@ toast_compress_datum(Datum value, char cmethod)
     int32        valsize;
     ToastCompressionId cmid = TOAST_INVALID_COMPRESSION_ID;

-    Assert(!VARATT_IS_EXTERNAL(DatumGetPointer(value)));
-    Assert(!VARATT_IS_COMPRESSED(DatumGetPointer(value)));
+    Assert(!VARATT_IS_EXTERNAL_D(value));
+    Assert(!VARATT_IS_COMPRESSED_D(value));

-    valsize = VARSIZE_ANY_EXHDR(DatumGetPointer(value));
+    valsize = VARSIZE_ANY_EXHDR_D(value);

     /* If the compression method is not valid, use the current default */
     if (!CompressionMethodIsValid(cmethod))
@@ -144,7 +144,7 @@ toast_save_datum(Relation rel, Datum value,
     int            num_indexes;
     int            validIndex;

-    Assert(!VARATT_IS_EXTERNAL(value));
+    Assert(!VARATT_IS_EXTERNAL(dval));

     /*
      * Open the toast relation and its indexes.  We can use the index to check
diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c
index a65acd89104..374afe31211 100644
--- a/src/backend/access/gin/gininsert.c
+++ b/src/backend/access/gin/gininsert.c
@@ -2233,7 +2233,7 @@ _gin_build_tuple(OffsetNumber attrnum, unsigned char category,
     else if (typlen > 0)
         keylen = typlen;
     else if (typlen == -1)
-        keylen = VARSIZE_ANY(key);
+        keylen = VARSIZE_ANY_D(key);
     else if (typlen == -2)
         keylen = strlen(DatumGetPointer(key)) + 1;
     else
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 95fea74e296..de91a81f15b 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -785,7 +785,7 @@ SpGistGetInnerTypeSize(SpGistTypeDesc *att, Datum datum)
     else if (att->attlen > 0)
         size = att->attlen;
     else
-        size = VARSIZE_ANY(datum);
+        size = VARSIZE_ANY_D(datum);

     return MAXALIGN(size);
 }
@@ -804,7 +804,7 @@ memcpyInnerDatum(void *target, SpGistTypeDesc *att, Datum datum)
     }
     else
     {
-        size = (att->attlen > 0) ? att->attlen : VARSIZE_ANY(datum);
+        size = (att->attlen > 0) ? att->attlen : VARSIZE_ANY_D(datum);
         memcpy(target, DatumGetPointer(datum), size);
     }
 }
diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c
index b60fab0a4d2..7aae799cbe5 100644
--- a/src/backend/access/table/toast_helper.c
+++ b/src/backend/access/table/toast_helper.c
@@ -197,10 +197,10 @@ toast_tuple_find_biggest_attribute(ToastTupleContext *ttc,

         if ((ttc->ttc_attr[i].tai_colflags & skip_colflags) != 0)
             continue;
-        if (VARATT_IS_EXTERNAL(DatumGetPointer(ttc->ttc_values[i])))
+        if (VARATT_IS_EXTERNAL_D(ttc->ttc_values[i]))
             continue;            /* can't happen, toast_action would be PLAIN */
         if (for_compression &&
-            VARATT_IS_COMPRESSED(DatumGetPointer(ttc->ttc_values[i])))
+            VARATT_IS_COMPRESSED_D(ttc->ttc_values[i]))
             continue;
         if (check_main && att->attstorage != TYPSTORAGE_MAIN)
             continue;
@@ -239,7 +239,7 @@ toast_tuple_try_compression(ToastTupleContext *ttc, int attribute)
             pfree(DatumGetPointer(*value));
         *value = new_value;
         attr->tai_colflags |= TOASTCOL_NEEDS_FREE;
-        attr->tai_size = VARSIZE(DatumGetPointer(*value));
+        attr->tai_size = VARSIZE_D(*value);
         ttc->ttc_flags |= (TOAST_NEEDS_CHANGE | TOAST_NEEDS_FREE);
     }
     else
@@ -330,7 +330,7 @@ toast_delete_external(Relation rel, const Datum *values, const bool *isnull,

             if (isnull[i])
                 continue;
-            else if (VARATT_IS_EXTERNAL_ONDISK(value))
+            else if (VARATT_IS_EXTERNAL_ONDISK_D(value))
                 toast_delete_datum(rel, value, is_speculative);
         }
     }
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 7111d5d5334..db622c62947 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -2005,7 +2005,7 @@ compute_trivial_stats(VacAttrStatsP stats,
          */
         if (is_varlena)
         {
-            total_width += VARSIZE_ANY(DatumGetPointer(value));
+            total_width += VARSIZE_ANY_D(value);
         }
         else if (is_varwidth)
         {
@@ -2121,7 +2121,7 @@ compute_distinct_stats(VacAttrStatsP stats,
          */
         if (is_varlena)
         {
-            total_width += VARSIZE_ANY(DatumGetPointer(value));
+            total_width += VARSIZE_ANY_D(value);

             /*
              * If the value is toasted, we want to detoast it just once to
@@ -2468,7 +2468,7 @@ compute_scalar_stats(VacAttrStatsP stats,
          */
         if (is_varlena)
         {
-            total_width += VARSIZE_ANY(DatumGetPointer(value));
+            total_width += VARSIZE_ANY_D(value);

             /*
              * If the value is toasted, we want to detoast it just once to
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 1a37737d4a2..b919d95cf82 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -3744,7 +3744,7 @@ ExecEvalFieldSelect(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
     tupDatum = *op->resvalue;

     /* We can special-case expanded records for speed */
-    if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(tupDatum)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_D(tupDatum))
     {
         ExpandedRecordHeader *erh = (ExpandedRecordHeader *) DatumGetEOHP(tupDatum);

diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 8e02d68824f..f55c1e183e2 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -196,7 +196,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
         val = slot->tts_values[natt];

         if (att->attlen == -1 &&
-            VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(val)))
+            VARATT_IS_EXTERNAL_EXPANDED_D(val))
         {
             /*
              * We want to flatten the expanded value so that the materialized
@@ -232,7 +232,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
         val = slot->tts_values[natt];

         if (att->attlen == -1 &&
-            VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(val)))
+            VARATT_IS_EXTERNAL_EXPANDED_D(val))
         {
             Size        data_length;

diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index 562de676457..5acc8a157ac 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -158,7 +158,7 @@ tstoreReceiveSlot_detoast(TupleTableSlot *slot, DestReceiver *self)

         if (!attr->attisdropped && attr->attlen == -1 && !slot->tts_isnull[i])
         {
-            if (VARATT_IS_EXTERNAL(DatumGetPointer(val)))
+            if (VARATT_IS_EXTERNAL_D(val))
             {
                 val = PointerGetDatum(detoast_external_attr((struct varlena *)
                                                             DatumGetPointer(val)));
diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c
index 1a352b542dc..fdfe1f143a5 100644
--- a/src/backend/replication/logical/proto.c
+++ b/src/backend/replication/logical/proto.c
@@ -809,7 +809,7 @@ logicalrep_write_tuple(StringInfo out, Relation rel, TupleTableSlot *slot,
             continue;
         }

-        if (att->attlen == -1 && VARATT_IS_EXTERNAL_ONDISK(values[i]))
+        if (att->attlen == -1 && VARATT_IS_EXTERNAL_ONDISK_D(values[i]))
         {
             /*
              * Unchanged toasted datum.  (Note that we don't promise to detect
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index f4c977262c5..7ede271c03e 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -1374,8 +1374,8 @@ pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot,
          * VARTAG_INDIRECT. See ReorderBufferToastReplace.
          */
         if (att->attlen == -1 &&
-            VARATT_IS_EXTERNAL_ONDISK(new_slot->tts_values[i]) &&
-            !VARATT_IS_EXTERNAL_ONDISK(old_slot->tts_values[i]))
+            VARATT_IS_EXTERNAL_ONDISK_D(new_slot->tts_values[i]) &&
+            !VARATT_IS_EXTERNAL_ONDISK_D(old_slot->tts_values[i]))
         {
             if (!tmp_new_slot)
             {
diff --git a/src/backend/statistics/mcv.c b/src/backend/statistics/mcv.c
index d98cda698d9..283e25d77ab 100644
--- a/src/backend/statistics/mcv.c
+++ b/src/backend/statistics/mcv.c
@@ -767,7 +767,7 @@ statext_mcv_serialize(MCVList *mcvlist, VacAttrStats **stats)
                 values[dim][i] = PointerGetDatum(PG_DETOAST_DATUM(values[dim][i]));

                 /* serialized length (uint32 length + data) */
-                len = VARSIZE_ANY_EXHDR(values[dim][i]);
+                len = VARSIZE_ANY_EXHDR_D(values[dim][i]);
                 info[dim].nbytes += sizeof(uint32); /* length */
                 info[dim].nbytes += len;    /* value (no header) */

@@ -895,14 +895,14 @@ statext_mcv_serialize(MCVList *mcvlist, VacAttrStats **stats)
             }
             else if (info[dim].typlen == -1)    /* varlena */
             {
-                uint32        len = VARSIZE_ANY_EXHDR(DatumGetPointer(value));
+                uint32        len = VARSIZE_ANY_EXHDR_D(value);

                 /* copy the length */
                 memcpy(ptr, &len, sizeof(uint32));
                 ptr += sizeof(uint32);

                 /* data from the varlena value (without the header) */
-                memcpy(ptr, VARDATA_ANY(DatumGetPointer(value)), len);
+                memcpy(ptr, VARDATA_ANY_D(value), len);
                 ptr += len;
             }
             else if (info[dim].typlen == -2)    /* cstring */
diff --git a/src/backend/tsearch/ts_selfuncs.c b/src/backend/tsearch/ts_selfuncs.c
index 0c1d2bc1109..57534d41ab5 100644
--- a/src/backend/tsearch/ts_selfuncs.c
+++ b/src/backend/tsearch/ts_selfuncs.c
@@ -233,7 +233,8 @@ mcelem_tsquery_selec(TSQuery query, Datum *mcelem, int nmcelem,
          * The text Datums came from an array, so it cannot be compressed or
          * stored out-of-line -- it's safe to use VARSIZE_ANY*.
          */
-        Assert(!VARATT_IS_COMPRESSED(mcelem[i]) && !VARATT_IS_EXTERNAL(mcelem[i]));
+        Assert(!VARATT_IS_COMPRESSED_D(mcelem[i]) &&
+               !VARATT_IS_EXTERNAL_D(mcelem[i]));
         lookup[i].element = (text *) DatumGetPointer(mcelem[i]);
         lookup[i].frequency = numbers[i];
     }
diff --git a/src/backend/tsearch/ts_typanalyze.c b/src/backend/tsearch/ts_typanalyze.c
index c5a71331ce8..9346d0a2d69 100644
--- a/src/backend/tsearch/ts_typanalyze.c
+++ b/src/backend/tsearch/ts_typanalyze.c
@@ -223,7 +223,7 @@ compute_tsvector_stats(VacAttrStats *stats,
          * compute_minimal_stats function, we use the toasted width for this
          * calculation.
          */
-        total_width += VARSIZE_ANY(DatumGetPointer(value));
+        total_width += VARSIZE_ANY_D(value);

         /*
          * Now detoast the tsvector if needed.
diff --git a/src/backend/utils/adt/array_expanded.c b/src/backend/utils/adt/array_expanded.c
index fc036d1eb30..11ab7da3da1 100644
--- a/src/backend/utils/adt/array_expanded.c
+++ b/src/backend/utils/adt/array_expanded.c
@@ -73,7 +73,7 @@ expand_array(Datum arraydatum, MemoryContext parentcontext,
     eah->ea_magic = EA_MAGIC;

     /* If the source is an expanded array, we may be able to optimize */
-    if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(arraydatum)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_D(arraydatum))
     {
         ExpandedArrayHeader *oldeah = (ExpandedArrayHeader *) DatumGetEOHP(arraydatum);

@@ -352,7 +352,7 @@ ExpandedArrayHeader *
 DatumGetExpandedArray(Datum d)
 {
     /* If it's a writable expanded array already, just return it */
-    if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_RW_D(d))
     {
         ExpandedArrayHeader *eah = (ExpandedArrayHeader *) DatumGetEOHP(d);

@@ -372,7 +372,7 @@ ExpandedArrayHeader *
 DatumGetExpandedArrayX(Datum d, ArrayMetaState *metacache)
 {
     /* If it's a writable expanded array already, just return it */
-    if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_RW_D(d))
     {
         ExpandedArrayHeader *eah = (ExpandedArrayHeader *) DatumGetEOHP(d);

@@ -405,7 +405,7 @@ DatumGetAnyArrayP(Datum d)
     /*
      * If it's an expanded array (RW or RO), return the header pointer.
      */
-    if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(d)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_D(d))
     {
         eah = (ExpandedArrayHeader *) DatumGetEOHP(d);
         Assert(eah->ea_magic == EA_MAGIC);
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index c8f53c6fbe7..8f2aa856fd9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -1850,7 +1850,7 @@ array_get_element(Datum arraydatum,
         arraydataptr = (char *) DatumGetPointer(arraydatum);
         arraynullsptr = NULL;
     }
-    else if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(arraydatum)))
+    else if (VARATT_IS_EXTERNAL_EXPANDED_D(arraydatum))
     {
         /* expanded array: let's do this in a separate function */
         return array_get_element_expanded(arraydatum,
@@ -2270,7 +2270,7 @@ array_set_element(Datum arraydatum,
     if (elmlen == -1 && !isNull)
         dataValue = PointerGetDatum(PG_DETOAST_DATUM(dataValue));

-    if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(arraydatum)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_D(arraydatum))
     {
         /* expanded array: let's do this in a separate function */
         return array_set_element_expanded(arraydatum,
diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c
index fcd5b1653dd..268a99e5a06 100644
--- a/src/backend/utils/adt/datum.c
+++ b/src/backend/utils/adt/datum.c
@@ -194,7 +194,7 @@ Datum
 datumTransfer(Datum value, bool typByVal, int typLen)
 {
     if (!typByVal && typLen == -1 &&
-        VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(value)))
+        VARATT_IS_EXTERNAL_EXPANDED_RW_D(value))
         value = TransferExpandedObject(value, CurrentMemoryContext);
     else
         value = datumCopy(value, typByVal, typLen);
@@ -419,7 +419,7 @@ datumEstimateSpace(Datum value, bool isnull, bool typByVal, int typLen)
         if (typByVal)
             sz += sizeof(Datum);
         else if (typLen == -1 &&
-                 VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(value)))
+                 VARATT_IS_EXTERNAL_EXPANDED_D(value))
         {
             /* Expanded objects need to be flattened, see comment below */
             sz += EOH_get_flat_size(DatumGetEOHP(value));
@@ -468,7 +468,7 @@ datumSerialize(Datum value, bool isnull, bool typByVal, int typLen,
     else if (typByVal)
         header = -1;
     else if (typLen == -1 &&
-             VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(value)))
+             VARATT_IS_EXTERNAL_EXPANDED_D(value))
     {
         eoh = DatumGetEOHP(value);
         header = EOH_get_flat_size(eoh);
diff --git a/src/backend/utils/adt/expandeddatum.c b/src/backend/utils/adt/expandeddatum.c
index 6b4b8eaf005..882101caf5e 100644
--- a/src/backend/utils/adt/expandeddatum.c
+++ b/src/backend/utils/adt/expandeddatum.c
@@ -97,7 +97,7 @@ MakeExpandedObjectReadOnlyInternal(Datum d)
     ExpandedObjectHeader *eohptr;

     /* Nothing to do if not a read-write expanded-object pointer */
-    if (!VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+    if (!VARATT_IS_EXTERNAL_EXPANDED_RW_D(d))
         return d;

     /* Now safe to extract the object pointer */
@@ -120,7 +120,7 @@ TransferExpandedObject(Datum d, MemoryContext new_parent)
     ExpandedObjectHeader *eohptr = DatumGetEOHP(d);

     /* Assert caller gave a R/W pointer */
-    Assert(VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)));
+    Assert(VARATT_IS_EXTERNAL_EXPANDED_RW_D(d));

     /* Transfer ownership */
     MemoryContextSetParent(eohptr->eoh_context, new_parent);
@@ -138,7 +138,7 @@ DeleteExpandedObject(Datum d)
     ExpandedObjectHeader *eohptr = DatumGetEOHP(d);

     /* Assert caller gave a R/W pointer */
-    Assert(VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)));
+    Assert(VARATT_IS_EXTERNAL_EXPANDED_RW_D(d));

     /* Kill it */
     MemoryContextDelete(eohptr->eoh_context);
diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c
index 13752db44e8..a7a883c7d23 100644
--- a/src/backend/utils/adt/expandedrecord.c
+++ b/src/backend/utils/adt/expandedrecord.c
@@ -703,7 +703,7 @@ ER_get_flat_size(ExpandedObjectHeader *eohptr)

             if (!erh->dnulls[i] &&
                 !attr->attbyval && attr->attlen == -1 &&
-                VARATT_IS_EXTERNAL(DatumGetPointer(erh->dvalues[i])))
+                VARATT_IS_EXTERNAL_D(erh->dvalues[i]))
             {
                 /*
                  * expanded_record_set_field_internal can do the actual work
@@ -927,7 +927,7 @@ ExpandedRecordHeader *
 DatumGetExpandedRecord(Datum d)
 {
     /* If it's a writable expanded record already, just return it */
-    if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_RW_D(d))
     {
         ExpandedRecordHeader *erh = (ExpandedRecordHeader *) DatumGetEOHP(d);

@@ -1155,7 +1155,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
         if (expand_external)
         {
             if (attr->attlen == -1 &&
-                VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+                VARATT_IS_EXTERNAL_D(newValue))
             {
                 /* Detoasting should be done in short-lived context. */
                 oldcxt = MemoryContextSwitchTo(get_short_term_cxt(erh));
@@ -1185,7 +1185,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
          * by itself have made the value non-external.)
          */
         if (attr->attlen == -1 &&
-            VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+            VARATT_IS_EXTERNAL_D(newValue))
             erh->flags |= ER_FLAG_HAVE_EXTERNAL;
     }

@@ -1300,7 +1300,7 @@ expanded_record_set_fields(ExpandedRecordHeader *erh,
             {
                 /* Is it an external toasted value? */
                 if (attr->attlen == -1 &&
-                    VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+                    VARATT_IS_EXTERNAL_D(newValue))
                 {
                     if (expand_external)
                     {
@@ -1312,7 +1312,7 @@ expanded_record_set_fields(ExpandedRecordHeader *erh,
                         /* Just copy the value */
                         newValue = datumCopy(newValue, false, -1);
                         /* If it's still external, remember that */
-                        if (VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+                        if (VARATT_IS_EXTERNAL_D(newValue))
                             erh->flags |= ER_FLAG_HAVE_EXTERNAL;
                     }
                 }
@@ -1544,7 +1544,7 @@ check_domain_for_new_field(ExpandedRecordHeader *erh, int fnumber,
         CompactAttribute *attr = TupleDescCompactAttr(erh->er_tupdesc, fnumber - 1);

         if (!attr->attbyval && attr->attlen == -1 &&
-            VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
+            VARATT_IS_EXTERNAL_D(newValue))
             dummy_erh->flags |= ER_FLAG_HAVE_EXTERNAL;
     }

diff --git a/src/backend/utils/adt/jsonb_gin.c b/src/backend/utils/adt/jsonb_gin.c
index c1950792b5a..08888f8d919 100644
--- a/src/backend/utils/adt/jsonb_gin.c
+++ b/src/backend/utils/adt/jsonb_gin.c
@@ -896,8 +896,8 @@ gin_extract_jsonb_query(PG_FUNCTION_ARGS)
                 continue;
             /* We rely on the array elements not being toasted */
             entries[j++] = make_text_key(JGINFLAG_KEY,
-                                         VARDATA_ANY(key_datums[i]),
-                                         VARSIZE_ANY_EXHDR(key_datums[i]));
+                                         VARDATA_ANY_D(key_datums[i]),
+                                         VARSIZE_ANY_EXHDR_D(key_datums[i]));
         }

         *nentries = j;
diff --git a/src/backend/utils/adt/jsonb_op.c b/src/backend/utils/adt/jsonb_op.c
index fa5603f26e1..6a50c76bd0e 100644
--- a/src/backend/utils/adt/jsonb_op.c
+++ b/src/backend/utils/adt/jsonb_op.c
@@ -63,8 +63,8 @@ jsonb_exists_any(PG_FUNCTION_ARGS)

         strVal.type = jbvString;
         /* We rely on the array elements not being toasted */
-        strVal.val.string.val = VARDATA_ANY(key_datums[i]);
-        strVal.val.string.len = VARSIZE_ANY_EXHDR(key_datums[i]);
+        strVal.val.string.val = VARDATA_ANY_D(key_datums[i]);
+        strVal.val.string.len = VARSIZE_ANY_EXHDR_D(key_datums[i]);

         if (findJsonbValueFromContainer(&jb->root,
                                         JB_FOBJECT | JB_FARRAY,
@@ -96,8 +96,8 @@ jsonb_exists_all(PG_FUNCTION_ARGS)

         strVal.type = jbvString;
         /* We rely on the array elements not being toasted */
-        strVal.val.string.val = VARDATA_ANY(key_datums[i]);
-        strVal.val.string.len = VARSIZE_ANY_EXHDR(key_datums[i]);
+        strVal.val.string.val = VARDATA_ANY_D(key_datums[i]);
+        strVal.val.string.len = VARSIZE_ANY_EXHDR_D(key_datums[i]);

         if (findJsonbValueFromContainer(&jb->root,
                                         JB_FOBJECT | JB_FARRAY,
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index bcb1720b6cd..2de62891139 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -4766,8 +4766,8 @@ jsonb_delete_array(PG_FUNCTION_ARGS)
                     continue;

                 /* We rely on the array elements not being toasted */
-                keyptr = VARDATA_ANY(keys_elems[i]);
-                keylen = VARSIZE_ANY_EXHDR(keys_elems[i]);
+                keyptr = VARDATA_ANY_D(keys_elems[i]);
+                keylen = VARSIZE_ANY_EXHDR_D(keys_elems[i]);
                 if (keylen == v.val.string.len &&
                     memcmp(keyptr, v.val.string.val, keylen) == 0)
                 {
diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c
index dbab24737ef..bcc2fbf6f01 100644
--- a/src/backend/utils/adt/jsonpath_exec.c
+++ b/src/backend/utils/adt/jsonpath_exec.c
@@ -3074,8 +3074,8 @@ JsonItemFromDatum(Datum val, Oid typid, int32 typmod, JsonbValue *res)
         case TEXTOID:
         case VARCHAROID:
             res->type = jbvString;
-            res->val.string.val = VARDATA_ANY(val);
-            res->val.string.len = VARSIZE_ANY_EXHDR(val);
+            res->val.string.val = VARDATA_ANY_D(val);
+            res->val.string.len = VARSIZE_ANY_EXHDR_D(val);
             break;
         case DATEOID:
         case TIMEOID:
diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c
index cd84ced5b48..a92aa77e43b 100644
--- a/src/backend/utils/adt/multirangetypes.c
+++ b/src/backend/utils/adt/multirangetypes.c
@@ -398,8 +398,8 @@ multirange_send(PG_FUNCTION_ARGS)
         range = RangeTypePGetDatum(ranges[i]);
         range = PointerGetDatum(SendFunctionCall(&cache->typioproc, range));

-        pq_sendint32(buf, VARSIZE(range) - VARHDRSZ);
-        pq_sendbytes(buf, VARDATA(range), VARSIZE(range) - VARHDRSZ);
+        pq_sendint32(buf, VARSIZE_D(range) - VARHDRSZ);
+        pq_sendbytes(buf, VARDATA_D(range), VARSIZE_D(range) - VARHDRSZ);
     }

     PG_RETURN_BYTEA_P(pq_endtypsend(buf));
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
index 66cc0acf4a7..d1d22807644 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -287,8 +287,8 @@ range_send(PG_FUNCTION_ARGS)
     {
         Datum        bound = PointerGetDatum(SendFunctionCall(&cache->typioproc,
                                                              lower.val));
-        uint32        bound_len = VARSIZE(bound) - VARHDRSZ;
-        char       *bound_data = VARDATA(bound);
+        uint32        bound_len = VARSIZE_D(bound) - VARHDRSZ;
+        char       *bound_data = VARDATA_D(bound);

         pq_sendint32(buf, bound_len);
         pq_sendbytes(buf, bound_data, bound_len);
@@ -298,8 +298,8 @@ range_send(PG_FUNCTION_ARGS)
     {
         Datum        bound = PointerGetDatum(SendFunctionCall(&cache->typioproc,
                                                              upper.val));
-        uint32        bound_len = VARSIZE(bound) - VARHDRSZ;
-        char       *bound_data = VARDATA(bound);
+        uint32        bound_len = VARSIZE_D(bound) - VARHDRSZ;
+        char       *bound_data = VARDATA_D(bound);

         pq_sendint32(buf, bound_len);
         pq_sendbytes(buf, bound_data, bound_len);
diff --git a/src/backend/utils/adt/rangetypes_typanalyze.c b/src/backend/utils/adt/rangetypes_typanalyze.c
index a18196d8a34..266ab9d7a29 100644
--- a/src/backend/utils/adt/rangetypes_typanalyze.c
+++ b/src/backend/utils/adt/rangetypes_typanalyze.c
@@ -181,7 +181,7 @@ compute_range_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc,
          * XXX: should we ignore wide values, like std_typanalyze does, to
          * avoid bloating the statistics table?
          */
-        total_width += VARSIZE_ANY(DatumGetPointer(value));
+        total_width += VARSIZE_ANY_D(value);

         /* Get range and deserialize it for further analysis. */
         if (mltrng_typcache != NULL)
diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c
index 1fa1275ca63..5b1f08c349d 100644
--- a/src/backend/utils/adt/tsvector_op.c
+++ b/src/backend/utils/adt/tsvector_op.c
@@ -329,8 +329,8 @@ tsvector_setweight_by_filter(PG_FUNCTION_ARGS)
         if (nulls[i])
             continue;

-        lex = VARDATA(dlexemes[i]);
-        lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+        lex = VARDATA_D(dlexemes[i]);
+        lex_len = VARSIZE_D(dlexemes[i]) - VARHDRSZ;
         lex_pos = tsvector_bsearch(tsout, lex, lex_len);

         if (lex_pos >= 0 && (j = POSDATALEN(tsout, entry + lex_pos)) != 0)
@@ -443,10 +443,10 @@ compare_text_lexemes(const void *va, const void *vb)
 {
     Datum        a = *((const Datum *) va);
     Datum        b = *((const Datum *) vb);
-    char       *alex = VARDATA_ANY(a);
-    int            alex_len = VARSIZE_ANY_EXHDR(a);
-    char       *blex = VARDATA_ANY(b);
-    int            blex_len = VARSIZE_ANY_EXHDR(b);
+    char       *alex = VARDATA_ANY_D(a);
+    int            alex_len = VARSIZE_ANY_EXHDR_D(a);
+    char       *blex = VARDATA_ANY_D(b);
+    int            blex_len = VARSIZE_ANY_EXHDR_D(b);

     return tsCompareString(alex, alex_len, blex, blex_len, false);
 }
@@ -605,8 +605,8 @@ tsvector_delete_arr(PG_FUNCTION_ARGS)
         if (nulls[i])
             continue;

-        lex = VARDATA(dlexemes[i]);
-        lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+        lex = VARDATA_D(dlexemes[i]);
+        lex_len = VARSIZE_D(dlexemes[i]) - VARHDRSZ;
         lex_pos = tsvector_bsearch(tsin, lex, lex_len);

         if (lex_pos >= 0)
@@ -770,7 +770,7 @@ array_to_tsvector(PG_FUNCTION_ARGS)
                     (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
                      errmsg("lexeme array may not contain nulls")));

-        if (VARSIZE(dlexemes[i]) - VARHDRSZ == 0)
+        if (VARSIZE_D(dlexemes[i]) - VARHDRSZ == 0)
             ereport(ERROR,
                     (errcode(ERRCODE_ZERO_LENGTH_CHARACTER_STRING),
                      errmsg("lexeme array may not contain empty strings")));
@@ -786,7 +786,7 @@ array_to_tsvector(PG_FUNCTION_ARGS)

     /* Calculate space needed for surviving lexemes. */
     for (i = 0; i < nitems; i++)
-        datalen += VARSIZE(dlexemes[i]) - VARHDRSZ;
+        datalen += VARSIZE_D(dlexemes[i]) - VARHDRSZ;
     tslen = CALCDATASIZE(nitems, datalen);

     /* Allocate and fill tsvector. */
@@ -798,8 +798,8 @@ array_to_tsvector(PG_FUNCTION_ARGS)
     cur = STRPTR(tsout);
     for (i = 0; i < nitems; i++)
     {
-        char       *lex = VARDATA(dlexemes[i]);
-        int            lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+        char       *lex = VARDATA_D(dlexemes[i]);
+        int            lex_len = VARSIZE_D(dlexemes[i]) - VARHDRSZ;

         memcpy(cur, lex, lex_len);
         arrout[i].haspos = 0;
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index ffae8c23abf..b30a30a3900 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -707,8 +707,8 @@ text_substring(Datum str, int32 start, int32 length, bool length_not_specified)
          * If we're working with an untoasted source, no need to do an extra
          * copying step.
          */
-        if (VARATT_IS_COMPRESSED(DatumGetPointer(str)) ||
-            VARATT_IS_EXTERNAL(DatumGetPointer(str)))
+        if (VARATT_IS_COMPRESSED_D(str) ||
+            VARATT_IS_EXTERNAL_D(str))
             slice = DatumGetTextPSlice(str, slice_start, slice_size);
         else
             slice = (text *) DatumGetPointer(str);
diff --git a/src/include/utils/expandeddatum.h b/src/include/utils/expandeddatum.h
index cde9a0c073b..62ea104d30e 100644
--- a/src/include/utils/expandeddatum.h
+++ b/src/include/utils/expandeddatum.h
@@ -150,7 +150,7 @@ EOHPGetRODatum(const struct ExpandedObjectHeader *eohptr)
 /* Does the Datum represent a writable expanded object? */
 #define DatumIsReadWriteExpandedObject(d, isnull, typlen) \
     (((isnull) || (typlen) != -1) ? false : \
-     VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
+     VARATT_IS_EXTERNAL_EXPANDED_RW_D(d))

 #define MakeExpandedObjectReadOnly(d, isnull, typlen) \
     (((isnull) || (typlen) != -1) ? (d) : \
diff --git a/src/include/varatt.h b/src/include/varatt.h
index 2e8564d4998..b37cc04e58e 100644
--- a/src/include/varatt.h
+++ b/src/include/varatt.h
@@ -166,7 +166,9 @@ typedef struct

 /*
  * Endian-dependent macros.  These are considered internal --- use the
- * external macros below instead of using these directly.
+ * external functions below instead of using these directly.  All of these
+ * expect an argument that is a pointer, not a Datum.  Some of them have
+ * multiple-evaluation hazards, too.
  *
  * Note: IS_1B is true for external toast records but VARSIZE_1B will return 0
  * for such records. Hence you should usually check for IS_EXTERNAL before
@@ -247,19 +249,24 @@ typedef struct
 #define VARDATA_1B_E(PTR)    (((varattrib_1b_e *) (PTR))->va_data)

 /*
- * Externally visible TOAST macros begin here.
+ * Externally visible TOAST functions and macros begin here.  All of these
+ * were originally macros, accounting for the upper-case naming.
+ *
+ * The basic functions such as VARDATA() accept a pointer to a value of a
+ * toastable data type; the caller's variable might be declared "text *"
+ * or the like, so we use "void *" here.
+ *
+ * There are also functions named like VARDATA_D() that accept a Datum.
+ * It used to be okay to call the basic functions directly on a Datum,
+ * but no longer.  In the interests of compilation speed, there are _D()
+ * functions only for the commonly-used cases.  Apply DatumGetPointer()
+ * yourself if you need to use one of the other basic functions on a Datum.
  */

 #define VARHDRSZ_EXTERNAL        offsetof(varattrib_1b_e, va_data)
 #define VARHDRSZ_COMPRESSED        offsetof(varattrib_4b, va_compressed.va_data)
 #define VARHDRSZ_SHORT            offsetof(varattrib_1b, va_data)
-
 #define VARATT_SHORT_MAX        0x7F
-#define VARATT_CAN_MAKE_SHORT(PTR) \
-    (VARATT_IS_4B_U(PTR) && \
-     (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT) <= VARATT_SHORT_MAX)
-#define VARATT_CONVERTED_SHORT_SIZE(PTR) \
-    (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT)

 /*
  * In consumers oblivious to data alignment, call PG_DETOAST_DATUM_PACKED(),
@@ -275,67 +282,285 @@ typedef struct
  * Other macros here should usually be used only by tuple assembly/disassembly
  * code and code that specifically wants to work with still-toasted Datums.
  */
-#define VARDATA(PTR)                        VARDATA_4B(PTR)
-#define VARSIZE(PTR)                        VARSIZE_4B(PTR)
-
-#define VARSIZE_SHORT(PTR)                    VARSIZE_1B(PTR)
-#define VARDATA_SHORT(PTR)                    VARDATA_1B(PTR)
-
-#define VARTAG_EXTERNAL(PTR)                VARTAG_1B_E(PTR)
-#define VARSIZE_EXTERNAL(PTR)                (VARHDRSZ_EXTERNAL + VARTAG_SIZE(VARTAG_EXTERNAL(PTR)))
-#define VARDATA_EXTERNAL(PTR)                VARDATA_1B_E(PTR)
-
-#define VARATT_IS_COMPRESSED(PTR)            VARATT_IS_4B_C(PTR)
-#define VARATT_IS_EXTERNAL(PTR)                VARATT_IS_1B_E(PTR)
-#define VARATT_IS_EXTERNAL_ONDISK(PTR) \
-    (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_ONDISK)
-#define VARATT_IS_EXTERNAL_INDIRECT(PTR) \
-    (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_INDIRECT)
-#define VARATT_IS_EXTERNAL_EXPANDED_RO(PTR) \
-    (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_EXPANDED_RO)
-#define VARATT_IS_EXTERNAL_EXPANDED_RW(PTR) \
-    (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_EXPANDED_RW)
-#define VARATT_IS_EXTERNAL_EXPANDED(PTR) \
-    (VARATT_IS_EXTERNAL(PTR) && VARTAG_IS_EXPANDED(VARTAG_EXTERNAL(PTR)))
-#define VARATT_IS_EXTERNAL_NON_EXPANDED(PTR) \
-    (VARATT_IS_EXTERNAL(PTR) && !VARTAG_IS_EXPANDED(VARTAG_EXTERNAL(PTR)))
-#define VARATT_IS_SHORT(PTR)                VARATT_IS_1B(PTR)
-#define VARATT_IS_EXTENDED(PTR)                (!VARATT_IS_4B_U(PTR))
-
-#define SET_VARSIZE(PTR, len)                SET_VARSIZE_4B(PTR, len)
-#define SET_VARSIZE_SHORT(PTR, len)            SET_VARSIZE_1B(PTR, len)
-#define SET_VARSIZE_COMPRESSED(PTR, len)    SET_VARSIZE_4B_C(PTR, len)
-
-#define SET_VARTAG_EXTERNAL(PTR, tag)        SET_VARTAG_1B_E(PTR, tag)
-
-#define VARSIZE_ANY(PTR) \
-    (VARATT_IS_1B_E(PTR) ? VARSIZE_EXTERNAL(PTR) : \
-     (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR) : \
-      VARSIZE_4B(PTR)))
-
-/* Size of a varlena data, excluding header */
-#define VARSIZE_ANY_EXHDR(PTR) \
-    (VARATT_IS_1B_E(PTR) ? VARSIZE_EXTERNAL(PTR)-VARHDRSZ_EXTERNAL : \
-     (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR)-VARHDRSZ_SHORT : \
-      VARSIZE_4B(PTR)-VARHDRSZ))

+/* Size of a known-not-toasted varlena datum, including header */
+static inline Size
+VARSIZE(const void *PTR)
+{
+    return VARSIZE_4B(PTR);
+}
+
+static inline Size
+VARSIZE_D(Datum DAT)
+{
+    return VARSIZE(DatumGetPointer(DAT));
+}
+
+/* Start of data area of a known-not-toasted varlena datum */
+static inline char *
+VARDATA(const void *PTR)
+{
+    return VARDATA_4B(PTR);
+}
+
+static inline char *
+VARDATA_D(Datum DAT)
+{
+    return VARDATA(DatumGetPointer(DAT));
+}
+
+/* Size of a known-short-header varlena datum, including header */
+static inline Size
+VARSIZE_SHORT(const void *PTR)
+{
+    return VARSIZE_1B(PTR);
+}
+
+/* Start of data area of a known-short-header varlena datum */
+static inline char *
+VARDATA_SHORT(const void *PTR)
+{
+    return VARDATA_1B(PTR);
+}
+
+/* Type tag of a "TOAST pointer" datum */
+static inline uint8
+VARTAG_EXTERNAL(const void *PTR)
+{
+    return VARTAG_1B_E(PTR);
+}
+
+/* Size of a "TOAST pointer" datum, including header */
+static inline Size
+VARSIZE_EXTERNAL(const void *PTR)
+{
+    return VARHDRSZ_EXTERNAL + VARTAG_SIZE(VARTAG_EXTERNAL(PTR));
+}
+
+/* Start of data area of a "TOAST pointer" datum */
+static inline char *
+VARDATA_EXTERNAL(const void *PTR)
+{
+    return VARDATA_1B_E(PTR);
+}
+
+/* Is varlena datum in inline-compressed format? */
+static inline bool
+VARATT_IS_COMPRESSED(const void *PTR)
+{
+    return VARATT_IS_4B_C(PTR);
+}
+
+static inline bool
+VARATT_IS_COMPRESSED_D(Datum DAT)
+{
+    return VARATT_IS_COMPRESSED(DatumGetPointer(DAT));
+}
+
+/* Is varlena datum a "TOAST pointer" datum? */
+static inline bool
+VARATT_IS_EXTERNAL(const void *PTR)
+{
+    return VARATT_IS_1B_E(PTR);
+}
+
+static inline bool
+VARATT_IS_EXTERNAL_D(Datum DAT)
+{
+    return VARATT_IS_EXTERNAL(DatumGetPointer(DAT));
+}
+
+/* Is varlena datum a pointer to on-disk toasted data? */
+static inline bool
+VARATT_IS_EXTERNAL_ONDISK(const void *PTR)
+{
+    return VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_ONDISK;
+}
+
+static inline bool
+VARATT_IS_EXTERNAL_ONDISK_D(Datum DAT)
+{
+    return VARATT_IS_EXTERNAL_ONDISK(DatumGetPointer(DAT));
+}
+
+/* Is varlena datum an indirect pointer? */
+static inline bool
+VARATT_IS_EXTERNAL_INDIRECT(const void *PTR)
+{
+    return VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_INDIRECT;
+}
+
+/* Is varlena datum a read-only pointer to an expanded object? */
+static inline bool
+VARATT_IS_EXTERNAL_EXPANDED_RO(const void *PTR)
+{
+    return VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_EXPANDED_RO;
+}
+
+/* Is varlena datum a read-write pointer to an expanded object? */
+static inline bool
+VARATT_IS_EXTERNAL_EXPANDED_RW(const void *PTR)
+{
+    return VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_EXPANDED_RW;
+}
+
+static inline bool
+VARATT_IS_EXTERNAL_EXPANDED_RW_D(Datum DAT)
+{
+    return VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(DAT));
+}
+
+/* Is varlena datum either type of pointer to an expanded object? */
+static inline bool
+VARATT_IS_EXTERNAL_EXPANDED(const void *PTR)
+{
+    return VARATT_IS_EXTERNAL(PTR) && VARTAG_IS_EXPANDED(VARTAG_EXTERNAL(PTR));
+}
+
+static inline bool
+VARATT_IS_EXTERNAL_EXPANDED_D(Datum DAT)
+{
+    return VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(DAT));
+}
+
+/* Is varlena datum a "TOAST pointer", but not for an expanded object? */
+static inline bool
+VARATT_IS_EXTERNAL_NON_EXPANDED(const void *PTR)
+{
+    return VARATT_IS_EXTERNAL(PTR) && !VARTAG_IS_EXPANDED(VARTAG_EXTERNAL(PTR));
+}
+
+/* Is varlena datum a short-header datum? */
+static inline bool
+VARATT_IS_SHORT(const void *PTR)
+{
+    return VARATT_IS_1B(PTR);
+}
+
+/* Is varlena datum not in traditional (4-byte-header, uncompressed) format? */
+static inline bool
+VARATT_IS_EXTENDED(const void *PTR)
+{
+    return !VARATT_IS_4B_U(PTR);
+}
+
+/* Is varlena datum short enough to convert to short-header format? */
+static inline bool
+VARATT_CAN_MAKE_SHORT(const void *PTR)
+{
+    return VARATT_IS_4B_U(PTR) &&
+        (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT) <= VARATT_SHORT_MAX;
+}
+
+/* Size that datum will have in short-header format, including header */
+static inline Size
+VARATT_CONVERTED_SHORT_SIZE(const void *PTR)
+{
+    return VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT;
+}
+
+/* Set the size (including header) of a 4-byte-header varlena datum */
+static inline void
+SET_VARSIZE(void *PTR, Size len)
+{
+    SET_VARSIZE_4B(PTR, len);
+}
+
+/* Set the size (including header) of a short-header varlena datum */
+static inline void
+SET_VARSIZE_SHORT(void *PTR, Size len)
+{
+    SET_VARSIZE_1B(PTR, len);
+}
+
+/* Set the size (including header) of an inline-compressed varlena datum */
+static inline void
+SET_VARSIZE_COMPRESSED(void *PTR, Size len)
+{
+    SET_VARSIZE_4B_C(PTR, len);
+}
+
+/* Set the type tag of a "TOAST pointer" datum */
+static inline void
+SET_VARTAG_EXTERNAL(void *PTR, uint8 tag)
+{
+    SET_VARTAG_1B_E(PTR, tag);
+}
+
+/* Size of a varlena datum of any format, including header */
+static inline Size
+VARSIZE_ANY(const void *PTR)
+{
+    return VARATT_IS_1B_E(PTR) ? VARSIZE_EXTERNAL(PTR) :
+        (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR) :
+         VARSIZE_4B(PTR));
+}
+
+static inline Size
+VARSIZE_ANY_D(Datum DAT)
+{
+    return VARSIZE_ANY(DatumGetPointer(DAT));
+}
+
+/* Size of a varlena datum of any format, excluding header */
+static inline Size
+VARSIZE_ANY_EXHDR(const void *PTR)
+{
+    return VARATT_IS_1B_E(PTR) ? VARSIZE_EXTERNAL(PTR) - VARHDRSZ_EXTERNAL :
+        (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR) - VARHDRSZ_SHORT :
+         VARSIZE_4B(PTR) - VARHDRSZ);
+}
+
+static inline Size
+VARSIZE_ANY_EXHDR_D(Datum DAT)
+{
+    return VARSIZE_ANY_EXHDR(DatumGetPointer(DAT));
+}
+
+/* Start of data area of a plain or short-header varlena datum */
 /* caution: this will not work on an external or compressed-in-line Datum */
 /* caution: this will return a possibly unaligned pointer */
-#define VARDATA_ANY(PTR) \
-     (VARATT_IS_1B(PTR) ? VARDATA_1B(PTR) : VARDATA_4B(PTR))
+static inline char *
+VARDATA_ANY(const void *PTR)
+{
+    return VARATT_IS_1B(PTR) ? VARDATA_1B(PTR) : VARDATA_4B(PTR);
+}
+
+static inline char *
+VARDATA_ANY_D(Datum DAT)
+{
+    return VARDATA_ANY(DatumGetPointer(DAT));
+}
+
+/* Decompressed size of a compressed-in-line varlena datum */
+static inline Size
+VARDATA_COMPRESSED_GET_EXTSIZE(const void *PTR)
+{
+    return ((varattrib_4b *) PTR)->va_compressed.va_tcinfo & VARLENA_EXTSIZE_MASK;
+}

-/* Decompressed size and compression method of a compressed-in-line Datum */
-#define VARDATA_COMPRESSED_GET_EXTSIZE(PTR) \
-    (((varattrib_4b *) (PTR))->va_compressed.va_tcinfo & VARLENA_EXTSIZE_MASK)
-#define VARDATA_COMPRESSED_GET_COMPRESS_METHOD(PTR) \
-    (((varattrib_4b *) (PTR))->va_compressed.va_tcinfo >> VARLENA_EXTSIZE_BITS)
+/* Compression method of a compressed-in-line varlena datum */
+static inline uint32
+VARDATA_COMPRESSED_GET_COMPRESS_METHOD(const void *PTR)
+{
+    return ((varattrib_4b *) PTR)->va_compressed.va_tcinfo >> VARLENA_EXTSIZE_BITS;
+}

 /* Same for external Datums; but note argument is a struct varatt_external */
-#define VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) \
-    ((toast_pointer).va_extinfo & VARLENA_EXTSIZE_MASK)
-#define VARATT_EXTERNAL_GET_COMPRESS_METHOD(toast_pointer) \
-    ((toast_pointer).va_extinfo >> VARLENA_EXTSIZE_BITS)
+static inline Size
+VARATT_EXTERNAL_GET_EXTSIZE(struct varatt_external toast_pointer)
+{
+    return toast_pointer.va_extinfo & VARLENA_EXTSIZE_MASK;
+}

+static inline uint32
+VARATT_EXTERNAL_GET_COMPRESS_METHOD(struct varatt_external toast_pointer)
+{
+    return toast_pointer.va_extinfo >> VARLENA_EXTSIZE_BITS;
+}
+
+/* Set size and compress method of an externally-stored varlena datum */
+/* This has to remain a macro; beware multiple evaluations! */
 #define VARATT_EXTERNAL_SET_SIZE_AND_COMPRESS_METHOD(toast_pointer, len, cm) \
     do { \
         Assert((cm) == TOAST_PGLZ_COMPRESSION_ID || \
@@ -351,8 +576,11 @@ typedef struct
  * VARHDRSZ overhead, the former doesn't.  We never use compression unless it
  * actually saves space, so we expect either equality or less-than.
  */
-#define VARATT_EXTERNAL_IS_COMPRESSED(toast_pointer) \
-    (VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) < \
-     (toast_pointer).va_rawsize - VARHDRSZ)
+static inline bool
+VARATT_EXTERNAL_IS_COMPRESSED(struct varatt_external toast_pointer)
+{
+    return VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) <
+        toast_pointer.va_rawsize - VARHDRSZ;
+}

 #endif
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index d19425b7a71..487bb73408b 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -560,7 +560,7 @@ plpgsql_exec_function(PLpgSQL_function *func, FunctionCallInfo fcinfo,
                      */
                     if (!var->isnull && var->datatype->typlen == -1)
                     {
-                        if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(var->value)))
+                        if (VARATT_IS_EXTERNAL_EXPANDED_RW_D(var->value))
                         {
                             /* take ownership of R/W object */
                             assign_simple_var(&estate, var,
@@ -831,7 +831,7 @@ coerce_function_result_tuple(PLpgSQL_execstate *estate, TupleDesc tupdesc)
     Assert(type_is_rowtype(estate->rettype));

     /* We can special-case expanded records for speed */
-    if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(estate->retval)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_D(estate->retval))
     {
         ExpandedRecordHeader *erh = (ExpandedRecordHeader *) DatumGetEOHP(estate->retval);

@@ -1087,7 +1087,7 @@ plpgsql_exec_trigger(PLpgSQL_function *func,
         Assert(type_is_rowtype(estate.rettype));

         /* We can special-case expanded records for speed */
-        if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(estate.retval)))
+        if (VARATT_IS_EXTERNAL_EXPANDED_D(estate.retval))
         {
             ExpandedRecordHeader *erh = (ExpandedRecordHeader *) DatumGetEOHP(estate.retval);

@@ -5120,7 +5120,7 @@ exec_assign_value(PLpgSQL_execstate *estate,
                 if (!var->datatype->typbyval && !isNull)
                 {
                     if (var->datatype->typisarray &&
-                        !VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(newvalue)))
+                        !VARATT_IS_EXTERNAL_EXPANDED_RW_D(newvalue))
                     {
                         /* array and not already R/W, so apply expand_array */
                         newvalue = expand_array(newvalue,
@@ -6552,7 +6552,7 @@ plpgsql_param_eval_var_check(ExprState *state, ExprEvalStep *op,
      * decide whether/how to optimize the assignment.
      */
     if (!var->isnull &&
-        VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(var->value)))
+        VARATT_IS_EXTERNAL_EXPANDED_RW_D(var->value))
     {
         PLpgSQL_expr *expr = (PLpgSQL_expr *) op->d.cparam.paramarg;
         Param       *param = (Param *) op->d.cparam.paramarg2;
@@ -6652,7 +6652,7 @@ plpgsql_param_eval_var_transfer(ExprState *state, ExprEvalStep *op,
      * from the expression.
      */
     if (!var->isnull &&
-        VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(var->value)))
+        VARATT_IS_EXTERNAL_EXPANDED_RW_D(var->value))
     {
         *op->resvalue = TransferExpandedObject(var->value,
                                                get_eval_mcontext(estate));
@@ -7593,7 +7593,7 @@ exec_move_row_from_datum(PLpgSQL_execstate *estate,
                          Datum value)
 {
     /* Check to see if source is an expanded record */
-    if (VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(value)))
+    if (VARATT_IS_EXTERNAL_EXPANDED_D(value))
     {
         ExpandedRecordHeader *erh = (ExpandedRecordHeader *) DatumGetEOHP(value);
         ExpandedRecordHeader *newerh = NULL;
@@ -7628,7 +7628,7 @@ exec_move_row_from_datum(PLpgSQL_execstate *estate,
              * value.  We'll treat it as the base composite type instead;
              * compare logic in make_expanded_record_for_rec.)
              */
-            if (VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(value)) &&
+            if (VARATT_IS_EXTERNAL_EXPANDED_RW_D(value) &&
                 (rec->rectypeid == erh->er_decltypeid ||
                  (rec->rectypeid == RECORDOID &&
                   !ExpandedRecordIsDomain(erh))))

pgsql-hackers by date:

Previous
From: Pavel Luzanov
Date:
Subject: Re: Eagerly scan all-visible pages to amortize aggressive vacuum
Next
From: Tomas Vondra
Date:
Subject: Re: Fix tab completion in v18 for ALTER DATABASE/USER/ROLE ... RESET