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: