Fix incorrect uses of Datum conversion macros
authorPeter Eisentraut <[email protected]>
Sun, 28 Aug 2022 08:47:10 +0000 (10:47 +0200)
committerPeter Eisentraut <[email protected]>
Mon, 5 Sep 2022 11:30:44 +0000 (13:30 +0200)
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 <[email protected]>
Discussion: https://www.postgresql.org/message-id/flat/8528fb7e-0aa2-6b54-85fb-0c0886dbd6ed%40enterprisedb.com

22 files changed:
contrib/btree_gist/btree_utils_num.c
contrib/dblink/dblink.c
contrib/hstore/hstore_op.c
contrib/pageinspect/heapfuncs.c
src/backend/access/brin/brin_bloom.c
src/backend/access/brin/brin_minmax_multi.c
src/backend/access/common/toast_compression.c
src/backend/access/table/toast_helper.c
src/backend/access/transam/xlogfuncs.c
src/backend/statistics/mcv.c
src/backend/utils/adt/amutils.c
src/backend/utils/adt/multirangetypes.c
src/backend/utils/adt/pg_lsn.c
src/backend/utils/adt/pgstatfuncs.c
src/backend/utils/adt/rangetypes_spgist.c
src/backend/utils/adt/regexp.c
src/backend/utils/adt/tsgistidx.c
src/backend/utils/adt/tsquery_op.c
src/backend/utils/adt/varlena.c
src/backend/utils/adt/xml.c
src/backend/utils/resowner/resowner.c
src/pl/plperl/plperl.c

index 5632ee0586ca8b963234dadbc74cc932e4e471f6..05c154afa3406da9f7ae21089f5637b179b71fd0 100644 (file)
@@ -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));
index e323fdd0e67ea354e08450c0c1afb247486cc1ef..7940387920ca5cb887820c9c160507f2b1016607 100644 (file)
@@ -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();
index 2f540d7ed6cda3fef671ab1fa0a6f1e324dba099..0d4ec16d1e5401ebbbd9d414798dc667e078e83e 100644 (file)
@@ -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);
index 2ff70405cf8f558b8e5f118487b94828655ae67b..aed2753253d2e10a348912a5d67044525af0e6b3 100644 (file)
@@ -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);
 }
 
 /*
index 6812ca9fd1c943a26661a43a43268d09ff316b2a..6b0af7267d592b214cefee96e0568b217867d5ba 100644 (file)
@@ -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, '{');
index a581659fe2b4dc2c4cb8fc656a71a3c66b3ddf56..c8f22d5d17f2215469e9fa35a0f461432b8f71c1 100644 (file)
@@ -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);
 
index f90f9f11e341309ea9a4aae4ee67010fb618fef9..7156ae9c47e72b938924ec022fb222abd9169317 100644 (file)
@@ -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
index 0cc5a30f9b49111cc02804b9f8707741d6395235..74ba2189f0a26ef7f4d554975c9a3cda3329970c 100644 (file)
@@ -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);
                }
        }
index 61e0f4a29cad6a3bafcdf48d70f4b1ed87d487c1..9cc757f1aff7b6b16d2e9135301ce88561012bfc 100644 (file)
@@ -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);
 }
 
 /*
index 6eeacb0d4766a29786c89662a79a293b84ffa89c..f5a7c3127281c624ecaad019e06de0b9034860c4 100644 (file)
@@ -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);
 
index 9d78a90d69fb9b706e31e48a6a82f1c13525b7bf..60fd396f24b94bf8587c2be3cb9f877ae6a0167a 100644 (file)
@@ -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));
 }
index da5c7d0906999247ca9c70a3606a1cf3d27d15f0..307d087c977b543b50a90440d96a4ef37a4dbc41 100644 (file)
@@ -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);
 }
 
 
index 45408787da968eb124a6d0c35cda0db4b44d9b98..15266f36f598372fa3704b9ae059eefbb2c38cd2 100644 (file)
@@ -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 */
index 4cca30aae7ce3e383641ef730d2fc5b9d9bccfca..be15b4b2e57ce74953d6aa4ba16f1ea0386ad158 100644 (file)
@@ -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)));
 }
 
index 71a6053b6a0baeb01cc1f887fb4e3f42dfcb662d..a47f04d975a15460e3f6adf1ecd82f7645ccfed2 100644 (file)
@@ -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, &centroidLower, &centroidUpper,
                                                  &centroidEmpty);
 
@@ -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);
                                        }
index 0e0c5d5ce86310c580794bbfeaf80e218044ae6c..dcf6681ef24c3fbf54215b4e5e4e2be894bcd6a1 100644 (file)
@@ -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 */
index 47daf8199ef3fb5ad29f04cfad2fdf23648cfdda..fe438f1c4d3f0ade32cfcf1ca0c279418845b619 100644 (file)
@@ -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)
index a784157ba58d0a7e12b376f6569a7b0f80c8b4da..8d815fa7a804e654e5e176d2e5dc97a74ef2702a 100644 (file)
@@ -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)));
index 8539cef024616e6a23a941073b85d30a7cbdbec3..6ef317e1f93a301934b15b7cd14fc4cd324fbe7d 100644 (file)
@@ -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));
 }
 
index 60a85c46971395c5d72292d5ef654af179a89064..606088cdfcca805ee0ee3d4ca992542d97140c11 100644 (file)
@@ -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;
index ceb4b0e3f7518a001fc0ca2de418006a73b6b386..ece5d98261ac75c5bac86fcd8ed939f28cf20983 100644 (file)
@@ -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);
index 5d192a0ce517e52520f4cde062590ad29e55bba9..8f21e0d70112dfd3c634923251d55d5db6f7066e 100644 (file)
@@ -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);