/* 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(DatumGetPointer(key_datums[i])), VARSIZE(DatumGetPointer(key_datums[i])) - VARHDRSZ, KEYFLAG);
            entries[j++] = PointerGetDatum(item);
        }
 
 
 
            if (key_nulls[i])
                continue;
-           crc = crc32_sz(VARDATA(key_datums[i]), VARSIZE(key_datums[i]) - VARHDRSZ);
+           crc = crc32_sz(VARDATA(DatumGetPointer(key_datums[i])), VARSIZE(DatumGetPointer(key_datums[i])) - VARHDRSZ);
            if (!(GETBIT(sign, HASHVAL(crc, siglen))))
                res = false;
        }
 
            if (key_nulls[i])
                continue;
-           crc = crc32_sz(VARDATA(key_datums[i]), VARSIZE(key_datums[i]) - VARHDRSZ);
+           crc = crc32_sz(VARDATA(DatumGetPointer(key_datums[i])), VARSIZE(DatumGetPointer(key_datums[i])) - VARHDRSZ);
            if (GETBIT(sign, HASHVAL(crc, siglen)))
                res = true;
        }
 
 
        if (!value_nulls || value_nulls[i])
        {
-           pairs[i].key = VARDATA(key_datums[i]);
+           pairs[i].key = VARDATA(DatumGetPointer(key_datums[i]));
            pairs[i].val = NULL;
            pairs[i].keylen =
-               hstoreCheckKeyLen(VARSIZE(key_datums[i]) - VARHDRSZ);
+               hstoreCheckKeyLen(VARSIZE(DatumGetPointer(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(DatumGetPointer(key_datums[i]));
+           pairs[i].val = VARDATA(DatumGetPointer(value_datums[i]));
            pairs[i].keylen =
-               hstoreCheckKeyLen(VARSIZE(key_datums[i]) - VARHDRSZ);
+               hstoreCheckKeyLen(VARSIZE(DatumGetPointer(key_datums[i])) - VARHDRSZ);
            pairs[i].vallen =
-               hstoreCheckValLen(VARSIZE(value_datums[i]) - VARHDRSZ);
+               hstoreCheckValLen(VARSIZE(DatumGetPointer(value_datums[i])) - VARHDRSZ);
            pairs[i].isnull = false;
            pairs[i].needfree = false;
        }
 
        if (in_nulls[i * 2 + 1])
        {
-           pairs[i].key = VARDATA(in_datums[i * 2]);
+           pairs[i].key = VARDATA(DatumGetPointer(in_datums[i * 2]));
            pairs[i].val = NULL;
            pairs[i].keylen =
-               hstoreCheckKeyLen(VARSIZE(in_datums[i * 2]) - VARHDRSZ);
+               hstoreCheckKeyLen(VARSIZE(DatumGetPointer(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(DatumGetPointer(in_datums[i * 2]));
+           pairs[i].val = VARDATA(DatumGetPointer(in_datums[i * 2 + 1]));
            pairs[i].keylen =
-               hstoreCheckKeyLen(VARSIZE(in_datums[i * 2]) - VARHDRSZ);
+               hstoreCheckKeyLen(VARSIZE(DatumGetPointer(in_datums[i * 2])) - VARHDRSZ);
            pairs[i].vallen =
-               hstoreCheckValLen(VARSIZE(in_datums[i * 2 + 1]) - VARHDRSZ);
+               hstoreCheckValLen(VARSIZE(DatumGetPointer(in_datums[i * 2 + 1])) - VARHDRSZ);
            pairs[i].isnull = false;
            pairs[i].needfree = false;
        }
 
    {
        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(DatumGetPointer(key_datums[i]));
+           key_pairs[j].keylen = VARSIZE(DatumGetPointer(key_datums[i])) - VARHDRSZ;
            key_pairs[j].val = NULL;
            key_pairs[j].vallen = 0;
            key_pairs[j].needfree = 0;
 
        /* print data */
        if (isnull)
            appendStringInfoString(s, "null");
-       else if (typisvarlena && VARATT_IS_EXTERNAL_ONDISK(origval))
+       else if (typisvarlena && VARATT_IS_EXTERNAL_ONDISK(DatumGetPointer(origval)))
            appendStringInfoString(s, "unchanged-toast-datum");
        else if (!typisvarlena)
            print_literal(s, typid,
 
 
        for (i = 0; i < nvalues; i++)
        {
-           len += VARSIZE_ANY(range->values[i]);
+           len += VARSIZE_ANY(DatumGetPointer(range->values[i]));
        }
    }
    else if (typlen == -2)      /* cstring */
 
            if (att->attlen > 0)
                key.len = att->attlen;
            else
-               key.len = VARSIZE_ANY(attrmiss->am_value);
+               key.len = VARSIZE_ANY(DatumGetPointer(attrmiss->am_value));
            key.value = attrmiss->am_value;
 
            entry = hash_search(missing_cache, &key, HASH_ENTER, &found);
                                                  att->attlen,
                                                  attrmiss[attnum].am_value);
 
-               targetDataLen = att_addlength_pointer(targetDataLen,
-                                                     att->attlen,
-                                                     attrmiss[attnum].am_value);
+               targetDataLen = att_addlength_datum(targetDataLen,
+                                                   att->attlen,
+                                                   attrmiss[attnum].am_value);
            }
            else
            {
 
 
        for (i = 0; i < noldoptions; i++)
        {
-           char       *text_str = VARDATA(oldoptions[i]);
-           int         text_len = VARSIZE(oldoptions[i]) - VARHDRSZ;
+           char       *text_str = VARDATA(DatumGetPointer(oldoptions[i]));
+           int         text_len = VARSIZE(DatumGetPointer(oldoptions[i])) - VARHDRSZ;
 
            /* Search for a match in defList */
            foreach(cell, defList)
 
    for (i = 0; i < noptions; i++)
    {
-       char       *text_str = VARDATA(optiondatums[i]);
-       int         text_len = VARSIZE(optiondatums[i]) - VARHDRSZ;
+       char       *text_str = VARDATA(DatumGetPointer(optiondatums[i]));
+       int         text_len = VARSIZE(DatumGetPointer(optiondatums[i])) - VARHDRSZ;
        int         j;
 
        /* Search for a match in reloptions */
 
    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
 
    else if (typlen > 0)
        keylen = typlen;
    else if (typlen == -1)
-       keylen = VARSIZE_ANY(key);
+       keylen = VARSIZE_ANY(DatumGetPointer(key));
    else if (typlen == -2)
        keylen = strlen(DatumGetPointer(key)) + 1;
    else
 
    else if (att->attlen > 0)
        size = att->attlen;
    else
-       size = VARSIZE_ANY(datum);
+       size = VARSIZE_ANY(DatumGetPointer(datum));
 
    return MAXALIGN(size);
 }
    }
    else
    {
-       size = (att->attlen > 0) ? att->attlen : VARSIZE_ANY(datum);
+       size = (att->attlen > 0) ? att->attlen : VARSIZE_ANY(DatumGetPointer(datum));
        memcpy(target, DatumGetPointer(datum), size);
    }
 }
 
 
            if (isnull[i])
                continue;
-           else if (VARATT_IS_EXTERNAL_ONDISK(value))
+           else if (VARATT_IS_EXTERNAL_ONDISK(DatumGetPointer(value)))
                toast_delete_datum(rel, value, is_speculative);
        }
    }
 
            continue;
        }
 
-       if (att->attlen == -1 && VARATT_IS_EXTERNAL_ONDISK(values[i]))
+       if (att->attlen == -1 && VARATT_IS_EXTERNAL_ONDISK(DatumGetPointer(values[i])))
        {
            /*
             * Unchanged toasted datum.  (Note that we don't promise to detect
 
         * 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(DatumGetPointer(new_slot->tts_values[i])) &&
+           !VARATT_IS_EXTERNAL_ONDISK(DatumGetPointer(old_slot->tts_values[i])))
        {
            if (!tmp_new_slot)
            {
 
                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(DatumGetPointer(values[dim][i]));
                info[dim].nbytes += sizeof(uint32); /* length */
                info[dim].nbytes += len;    /* value (no header) */
 
 
         * 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(DatumGetPointer(mcelem[i])) && !VARATT_IS_EXTERNAL(DatumGetPointer(mcelem[i])));
        lookup[i].element = (text *) DatumGetPointer(mcelem[i]);
        lookup[i].frequency = numbers[i];
    }
 
                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(DatumGetPointer(key_datums[i])),
+                                        VARSIZE_ANY_EXHDR(DatumGetPointer(key_datums[i])));
        }
 
        *nentries = j;
 
 
        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(DatumGetPointer(key_datums[i]));
+       strVal.val.string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(key_datums[i]));
 
        if (findJsonbValueFromContainer(&jb->root,
                                        JB_FOBJECT | JB_FARRAY,
 
        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(DatumGetPointer(key_datums[i]));
+       strVal.val.string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(key_datums[i]));
 
        if (findJsonbValueFromContainer(&jb->root,
                                        JB_FOBJECT | JB_FARRAY,
 
                    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(DatumGetPointer(keys_elems[i]));
+               keylen = VARSIZE_ANY_EXHDR(DatumGetPointer(keys_elems[i]));
                if (keylen == v.val.string.len &&
                    memcmp(keyptr, v.val.string.val, keylen) == 0)
                {
 
        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(DatumGetPointer(val));
+           res->val.string.len = VARSIZE_ANY_EXHDR(DatumGetPointer(val));
            break;
        case DATEOID:
        case TIMEOID:
 
    for (int i = 0; i < range_count; i++)
    {
        Datum       range;
+       bytea      *outputbytes;
 
        range = RangeTypePGetDatum(ranges[i]);
-       range = PointerGetDatum(SendFunctionCall(&cache->typioproc, range));
+       outputbytes = SendFunctionCall(&cache->typioproc, range);
 
-       pq_sendint32(buf, VARSIZE(range) - VARHDRSZ);
-       pq_sendbytes(buf, VARDATA(range), VARSIZE(range) - VARHDRSZ);
+       pq_sendint32(buf, VARSIZE(outputbytes) - VARHDRSZ);
+       pq_sendbytes(buf, VARDATA(outputbytes), VARSIZE(outputbytes) - VARHDRSZ);
    }
 
    PG_RETURN_BYTEA_P(pq_endtypsend(buf));
 
 
    if (RANGE_HAS_LBOUND(flags))
    {
-       Datum       bound = PointerGetDatum(SendFunctionCall(&cache->typioproc,
-                                                            lower.val));
+       bytea      *bound = SendFunctionCall(&cache->typioproc, lower.val);
        uint32      bound_len = VARSIZE(bound) - VARHDRSZ;
        char       *bound_data = VARDATA(bound);
 
 
    if (RANGE_HAS_UBOUND(flags))
    {
-       Datum       bound = PointerGetDatum(SendFunctionCall(&cache->typioproc,
-                                                            upper.val));
+       bytea      *bound = SendFunctionCall(&cache->typioproc, upper.val);
        uint32      bound_len = VARSIZE(bound) - VARHDRSZ;
        char       *bound_data = VARDATA(bound);
 
 
        if (nulls[i])
            continue;
 
-       lex = VARDATA(dlexemes[i]);
-       lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+       lex = VARDATA(DatumGetPointer(dlexemes[i]));
+       lex_len = VARSIZE(DatumGetPointer(dlexemes[i])) - VARHDRSZ;
        lex_pos = tsvector_bsearch(tsout, lex, lex_len);
 
        if (lex_pos >= 0 && (j = POSDATALEN(tsout, entry + lex_pos)) != 0)
 {
    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(DatumGetPointer(a));
+   int         alex_len = VARSIZE_ANY_EXHDR(DatumGetPointer(a));
+   char       *blex = VARDATA_ANY(DatumGetPointer(b));
+   int         blex_len = VARSIZE_ANY_EXHDR(DatumGetPointer(b));
 
    return tsCompareString(alex, alex_len, blex, blex_len, false);
 }
        if (nulls[i])
            continue;
 
-       lex = VARDATA(dlexemes[i]);
-       lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+       lex = VARDATA(DatumGetPointer(dlexemes[i]));
+       lex_len = VARSIZE(DatumGetPointer(dlexemes[i])) - VARHDRSZ;
        lex_pos = tsvector_bsearch(tsin, lex, lex_len);
 
        if (lex_pos >= 0)
                    (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
                     errmsg("lexeme array may not contain nulls")));
 
-       if (VARSIZE(dlexemes[i]) - VARHDRSZ == 0)
+       if (VARSIZE(DatumGetPointer(dlexemes[i])) - VARHDRSZ == 0)
            ereport(ERROR,
                    (errcode(ERRCODE_ZERO_LENGTH_CHARACTER_STRING),
                     errmsg("lexeme array may not contain empty strings")));
 
    /* Calculate space needed for surviving lexemes. */
    for (i = 0; i < nitems; i++)
-       datalen += VARSIZE(dlexemes[i]) - VARHDRSZ;
+       datalen += VARSIZE(DatumGetPointer(dlexemes[i])) - VARHDRSZ;
    tslen = CALCDATASIZE(nitems, datalen);
 
    /* Allocate and fill tsvector. */
    cur = STRPTR(tsout);
    for (i = 0; i < nitems; i++)
    {
-       char       *lex = VARDATA(dlexemes[i]);
-       int         lex_len = VARSIZE(dlexemes[i]) - VARHDRSZ;
+       char       *lex = VARDATA(DatumGetPointer(dlexemes[i]));
+       int         lex_len = VARSIZE(DatumGetPointer(dlexemes[i])) - VARHDRSZ;
 
        memcpy(cur, lex, lex_len);
        arrout[i].haspos = 0;