From 6bcda4a72123c3aa29fa3f03d952095675ad4468 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sun, 28 Aug 2022 10:47:10 +0200 Subject: [PATCH] Fix incorrect uses of Datum conversion macros Since these macros just cast whatever you give them to the designated output type, and many normal uses also cast the output type further, a number of incorrect uses go undiscovered. The fixes in this patch have been discovered by changing these macros to inline functions, which is the subject of a future patch. Reviewed-by: Aleksander Alekseev Discussion: https://www.postgresql.org/message-id/flat/8528fb7e-0aa2-6b54-85fb-0c0886dbd6ed%40enterprisedb.com --- contrib/btree_gist/btree_utils_num.c | 2 +- contrib/dblink/dblink.c | 2 +- contrib/hstore/hstore_op.c | 2 +- contrib/pageinspect/heapfuncs.c | 4 ++-- src/backend/access/brin/brin_bloom.c | 2 +- src/backend/access/brin/brin_minmax_multi.c | 12 ++++++------ src/backend/access/common/toast_compression.c | 2 +- src/backend/access/table/toast_helper.c | 2 +- src/backend/access/transam/xlogfuncs.c | 2 +- src/backend/statistics/mcv.c | 4 ++-- src/backend/utils/adt/amutils.c | 2 +- src/backend/utils/adt/multirangetypes.c | 2 +- src/backend/utils/adt/pg_lsn.c | 4 ++-- src/backend/utils/adt/pgstatfuncs.c | 2 +- src/backend/utils/adt/rangetypes_spgist.c | 4 ++-- src/backend/utils/adt/regexp.c | 2 +- src/backend/utils/adt/tsgistidx.c | 2 +- src/backend/utils/adt/tsquery_op.c | 2 +- src/backend/utils/adt/varlena.c | 2 +- src/backend/utils/adt/xml.c | 2 +- src/backend/utils/resowner/resowner.c | 6 +++--- src/pl/plperl/plperl.c | 2 +- 22 files changed, 33 insertions(+), 33 deletions(-) diff --git a/contrib/btree_gist/btree_utils_num.c b/contrib/btree_gist/btree_utils_num.c index 5632ee0586..05c154afa3 100644 --- a/contrib/btree_gist/btree_utils_num.c +++ b/contrib/btree_gist/btree_utils_num.c @@ -153,7 +153,7 @@ gbt_num_fetch(GISTENTRY *entry, const gbtree_ninfo *tinfo) datum = CashGetDatum(*(Cash *) entry->key); break; default: - datum = PointerGetDatum(entry->key); + datum = entry->key; } retval = palloc(sizeof(GISTENTRY)); diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index e323fdd0e6..7940387920 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -1336,7 +1336,7 @@ dblink_get_connections(PG_FUNCTION_ARGS) } if (astate) - PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, + PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext)); else PG_RETURN_NULL(); diff --git a/contrib/hstore/hstore_op.c b/contrib/hstore/hstore_op.c index 2f540d7ed6..0d4ec16d1e 100644 --- a/contrib/hstore/hstore_op.c +++ b/contrib/hstore/hstore_op.c @@ -1064,7 +1064,7 @@ hstore_each(PG_FUNCTION_ARGS) tuple = heap_form_tuple(funcctx->tuple_desc, dvalues, nulls); res = HeapTupleGetDatum(tuple); - SRF_RETURN_NEXT(funcctx, PointerGetDatum(res)); + SRF_RETURN_NEXT(funcctx, res); } SRF_RETURN_DONE(funcctx); diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c index 2ff70405cf..aed2753253 100644 --- a/contrib/pageinspect/heapfuncs.c +++ b/contrib/pageinspect/heapfuncs.c @@ -383,7 +383,7 @@ tuple_data_split_internal(Oid relid, char *tupdata, errmsg("unexpected end of tuple data"))); if (attr->attlen == -1 && do_detoast) - attr_data = DatumGetByteaPCopy(tupdata + off); + attr_data = pg_detoast_datum_copy((struct varlena *) (tupdata + off)); else { attr_data = (bytea *) palloc(len + VARHDRSZ); @@ -492,7 +492,7 @@ tuple_data_split(PG_FUNCTION_ARGS) if (t_bits) pfree(t_bits); - PG_RETURN_ARRAYTYPE_P(res); + PG_RETURN_DATUM(res); } /* diff --git a/src/backend/access/brin/brin_bloom.c b/src/backend/access/brin/brin_bloom.c index 6812ca9fd1..6b0af7267d 100644 --- a/src/backend/access/brin/brin_bloom.c +++ b/src/backend/access/brin/brin_bloom.c @@ -767,7 +767,7 @@ brin_bloom_summary_out(PG_FUNCTION_ARGS) StringInfoData str; /* detoast the data to get value with a full 4B header */ - filter = (BloomFilter *) PG_DETOAST_DATUM(PG_GETARG_BYTEA_PP(0)); + filter = (BloomFilter *) PG_DETOAST_DATUM_PACKED(PG_GETARG_DATUM(0)); initStringInfo(&str); appendStringInfoChar(&str, '{'); diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c index a581659fe2..c8f22d5d17 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -774,12 +774,12 @@ brin_range_deserialize(int maxvalues, SerializedRanges *serialized) datalen += MAXALIGN(typlen); else if (typlen == -1) /* varlena */ { - datalen += MAXALIGN(VARSIZE_ANY(DatumGetPointer(ptr))); - ptr += VARSIZE_ANY(DatumGetPointer(ptr)); + datalen += MAXALIGN(VARSIZE_ANY(ptr)); + ptr += VARSIZE_ANY(ptr); } else if (typlen == -2) /* cstring */ { - Size slen = strlen(DatumGetCString(ptr)) + 1; + Size slen = strlen(ptr) + 1; datalen += MAXALIGN(slen); ptr += slen; @@ -3033,7 +3033,7 @@ brin_minmax_multi_summary_out(PG_FUNCTION_ARGS) * Detoast to get value with full 4B header (can't be stored in a toast * table, but can use 1B header). */ - ranges = (SerializedRanges *) PG_DETOAST_DATUM(PG_GETARG_BYTEA_PP(0)); + ranges = (SerializedRanges *) PG_DETOAST_DATUM_PACKED(PG_GETARG_DATUM(0)); /* lookup output func for the type */ getTypeOutputInfo(ranges->typid, &outfunc, &isvarlena); @@ -3081,7 +3081,7 @@ brin_minmax_multi_summary_out(PG_FUNCTION_ARGS) getTypeOutputInfo(ANYARRAYOID, &typoutput, &typIsVarlena); - val = PointerGetDatum(makeArrayResult(astate_values, CurrentMemoryContext)); + val = makeArrayResult(astate_values, CurrentMemoryContext); extval = OidOutputFunctionCall(typoutput, val); @@ -3121,7 +3121,7 @@ brin_minmax_multi_summary_out(PG_FUNCTION_ARGS) getTypeOutputInfo(ANYARRAYOID, &typoutput, &typIsVarlena); - val = PointerGetDatum(makeArrayResult(astate_values, CurrentMemoryContext)); + val = makeArrayResult(astate_values, CurrentMemoryContext); extval = OidOutputFunctionCall(typoutput, val); diff --git a/src/backend/access/common/toast_compression.c b/src/backend/access/common/toast_compression.c index f90f9f11e3..7156ae9c47 100644 --- a/src/backend/access/common/toast_compression.c +++ b/src/backend/access/common/toast_compression.c @@ -44,7 +44,7 @@ pglz_compress_datum(const struct varlena *value) len; struct varlena *tmp = NULL; - valsize = VARSIZE_ANY_EXHDR(DatumGetPointer(value)); + valsize = VARSIZE_ANY_EXHDR(value); /* * No point in wasting a palloc cycle if value size is outside the allowed diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c index 0cc5a30f9b..74ba2189f0 100644 --- a/src/backend/access/table/toast_helper.c +++ b/src/backend/access/table/toast_helper.c @@ -330,7 +330,7 @@ toast_delete_external(Relation rel, Datum *values, bool *isnull, if (isnull[i]) continue; - else if (VARATT_IS_EXTERNAL_ONDISK(PointerGetDatum(value))) + else if (VARATT_IS_EXTERNAL_ONDISK(value)) toast_delete_datum(rel, value, is_speculative); } } diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 61e0f4a29c..9cc757f1af 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -555,7 +555,7 @@ pg_wal_lsn_diff(PG_FUNCTION_ARGS) PG_GETARG_DATUM(0), PG_GETARG_DATUM(1)); - PG_RETURN_NUMERIC(result); + PG_RETURN_DATUM(result); } /* diff --git a/src/backend/statistics/mcv.c b/src/backend/statistics/mcv.c index 6eeacb0d47..f5a7c31272 100644 --- a/src/backend/statistics/mcv.c +++ b/src/backend/statistics/mcv.c @@ -1444,8 +1444,8 @@ pg_stats_ext_mcvlist_items(PG_FUNCTION_ARGS) } values[0] = Int32GetDatum(funcctx->call_cntr); - values[1] = PointerGetDatum(makeArrayResult(astate_values, CurrentMemoryContext)); - values[2] = PointerGetDatum(makeArrayResult(astate_nulls, CurrentMemoryContext)); + values[1] = makeArrayResult(astate_values, CurrentMemoryContext); + values[2] = makeArrayResult(astate_nulls, CurrentMemoryContext); values[3] = Float8GetDatum(item->frequency); values[4] = Float8GetDatum(item->base_frequency); diff --git a/src/backend/utils/adt/amutils.c b/src/backend/utils/adt/amutils.c index 9d78a90d69..60fd396f24 100644 --- a/src/backend/utils/adt/amutils.c +++ b/src/backend/utils/adt/amutils.c @@ -466,5 +466,5 @@ pg_indexam_progress_phasename(PG_FUNCTION_ARGS) if (!name) PG_RETURN_NULL(); - PG_RETURN_TEXT_P(CStringGetTextDatum(name)); + PG_RETURN_DATUM(CStringGetTextDatum(name)); } diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c index da5c7d0906..307d087c97 100644 --- a/src/backend/utils/adt/multirangetypes.c +++ b/src/backend/utils/adt/multirangetypes.c @@ -1491,7 +1491,7 @@ multirange_intersect_agg_transfn(PG_FUNCTION_ARGS) ranges1, range_count2, ranges2); - PG_RETURN_RANGE_P(result); + PG_RETURN_MULTIRANGE_P(result); } diff --git a/src/backend/utils/adt/pg_lsn.c b/src/backend/utils/adt/pg_lsn.c index 45408787da..15266f36f5 100644 --- a/src/backend/utils/adt/pg_lsn.c +++ b/src/backend/utils/adt/pg_lsn.c @@ -271,7 +271,7 @@ pg_lsn_pli(PG_FUNCTION_ARGS) /* Add two numerics */ res = DirectFunctionCall2(numeric_add, - NumericGetDatum(num), + num, NumericGetDatum(nbytes)); /* Convert to pg_lsn */ @@ -305,7 +305,7 @@ pg_lsn_mii(PG_FUNCTION_ARGS) /* Subtract two numerics */ res = DirectFunctionCall2(numeric_sub, - NumericGetDatum(num), + num, NumericGetDatum(nbytes)); /* Convert to pg_lsn */ diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 4cca30aae7..be15b4b2e5 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -1119,7 +1119,7 @@ pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS) clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host); - PG_RETURN_INET_P(DirectFunctionCall1(inet_in, + PG_RETURN_DATUM(DirectFunctionCall1(inet_in, CStringGetDatum(remote_host))); } diff --git a/src/backend/utils/adt/rangetypes_spgist.c b/src/backend/utils/adt/rangetypes_spgist.c index 71a6053b6a..a47f04d975 100644 --- a/src/backend/utils/adt/rangetypes_spgist.c +++ b/src/backend/utils/adt/rangetypes_spgist.c @@ -416,7 +416,7 @@ spg_range_quad_inner_consistent(PG_FUNCTION_ARGS) /* This node has a centroid. Fetch it. */ centroid = DatumGetRangeTypeP(in->prefixDatum); typcache = range_get_typcache(fcinfo, - RangeTypeGetOid(DatumGetRangeTypeP(centroid))); + RangeTypeGetOid(centroid)); range_deserialize(typcache, centroid, ¢roidLower, ¢roidUpper, ¢roidEmpty); @@ -557,7 +557,7 @@ spg_range_quad_inner_consistent(PG_FUNCTION_ARGS) */ if (in->traversalValue) { - prevCentroid = DatumGetRangeTypeP(in->traversalValue); + prevCentroid = in->traversalValue; range_deserialize(typcache, prevCentroid, &prevLower, &prevUpper, &prevEmpty); } diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 0e0c5d5ce8..dcf6681ef2 100644 --- a/src/backend/utils/adt/regexp.c +++ b/src/backend/utils/adt/regexp.c @@ -1757,7 +1757,7 @@ regexp_split_to_array(PG_FUNCTION_ARGS) splitctx->next_match++; } - PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, CurrentMemoryContext)); + PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext)); } /* This is separate to keep the opr_sanity regression test from complaining */ diff --git a/src/backend/utils/adt/tsgistidx.c b/src/backend/utils/adt/tsgistidx.c index 47daf8199e..fe438f1c4d 100644 --- a/src/backend/utils/adt/tsgistidx.c +++ b/src/backend/utils/adt/tsgistidx.c @@ -102,7 +102,7 @@ static int outbuf_maxlen = 0; Datum gtsvectorout(PG_FUNCTION_ARGS) { - SignTSVector *key = (SignTSVector *) PG_DETOAST_DATUM(PG_GETARG_POINTER(0)); + SignTSVector *key = (SignTSVector *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); char *outbuf; if (outbuf_maxlen == 0) diff --git a/src/backend/utils/adt/tsquery_op.c b/src/backend/utils/adt/tsquery_op.c index a784157ba5..8d815fa7a8 100644 --- a/src/backend/utils/adt/tsquery_op.c +++ b/src/backend/utils/adt/tsquery_op.c @@ -148,7 +148,7 @@ tsquery_phrase_distance(PG_FUNCTION_ARGS) Datum tsquery_phrase(PG_FUNCTION_ARGS) { - PG_RETURN_POINTER(DirectFunctionCall3(tsquery_phrase_distance, + PG_RETURN_DATUM(DirectFunctionCall3(tsquery_phrase_distance, PG_GETARG_DATUM(0), PG_GETARG_DATUM(1), Int32GetDatum(1))); diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 8539cef024..6ef317e1f9 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -4779,7 +4779,7 @@ text_to_array(PG_FUNCTION_ARGS) if (tstate.astate == NULL) PG_RETURN_ARRAYTYPE_P(construct_empty_array(TEXTOID)); - PG_RETURN_ARRAYTYPE_P(makeArrayResult(tstate.astate, + PG_RETURN_DATUM(makeArrayResult(tstate.astate, CurrentMemoryContext)); } diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 60a85c4697..606088cdfc 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -4174,7 +4174,7 @@ xpath(PG_FUNCTION_ARGS) astate = initArrayResult(XMLOID, CurrentMemoryContext, true); xpath_internal(xpath_expr_text, data, namespaces, NULL, astate); - PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, CurrentMemoryContext)); + PG_RETURN_DATUM(makeArrayResult(astate, CurrentMemoryContext)); #else NO_XML_SUPPORT(); return 0; diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index ceb4b0e3f7..ece5d98261 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -557,7 +557,7 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, /* Ditto for JIT contexts */ while (ResourceArrayGetAny(&(owner->jitarr), &foundres)) { - JitContext *context = (JitContext *) PointerGetDatum(foundres); + JitContext *context = (JitContext *) DatumGetPointer(foundres); jit_release_context(context); } @@ -566,7 +566,7 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, while (ResourceArrayGetAny(&(owner->cryptohasharr), &foundres)) { pg_cryptohash_ctx *context = - (pg_cryptohash_ctx *) PointerGetDatum(foundres); + (pg_cryptohash_ctx *) DatumGetPointer(foundres); if (isCommit) PrintCryptoHashLeakWarning(foundres); @@ -576,7 +576,7 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, /* Ditto for HMAC contexts */ while (ResourceArrayGetAny(&(owner->hmacarr), &foundres)) { - pg_hmac_ctx *context = (pg_hmac_ctx *) PointerGetDatum(foundres); + pg_hmac_ctx *context = (pg_hmac_ctx *) DatumGetPointer(foundres); if (isCommit) PrintHMACLeakWarning(foundres); diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 5d192a0ce5..8f21e0d701 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1848,7 +1848,7 @@ plperl_call_handler(PG_FUNCTION_ARGS) { current_call_data = &this_call_data; if (CALLED_AS_TRIGGER(fcinfo)) - retval = PointerGetDatum(plperl_trigger_handler(fcinfo)); + retval = plperl_trigger_handler(fcinfo); else if (CALLED_AS_EVENT_TRIGGER(fcinfo)) { plperl_event_trigger_handler(fcinfo);