From e2a4af504ee3335ab40529d2555faab758022c09 Mon Sep 17 00:00:00 2001
From: "Chao Li (Evan)" <lic@highgo.com>
Date: Fri, 26 Sep 2025 13:46:08 +0800
Subject: [PATCH v2] Mark function arguments of type "Datum *" as "const Datum
 *" where possible

Several functions in the codebase accept "Datum *" parameters but do not
modify the pointed-to data. These have been updated to take "const Datum *"
instead, improving type safety and making the interfaces clearer about their
intent. This change helps the compiler catch accidental modifications and
better documents immutability of arguments.

No functional behavior is changed by this patch.

Author: Chao Li <lic@highgo.com>
---
 contrib/tsm_system_rows/tsm_system_rows.c     |  4 ++--
 contrib/tsm_system_time/tsm_system_time.c     |  4 ++--
 src/backend/access/brin/brin_minmax_multi.c   |  2 +-
 src/backend/access/hash/hashutil.c            |  2 +-
 src/backend/access/heap/heaptoast.c           |  2 +-
 src/backend/access/nbtree/nbtpreprocesskeys.c |  4 ++--
 src/backend/access/nbtree/nbtsort.c           |  4 ++--
 src/backend/access/spgist/spgdoinsert.c       |  2 +-
 src/backend/access/spgist/spgtextproc.c       |  2 +-
 src/backend/access/tablesample/bernoulli.c    |  4 ++--
 src/backend/access/tablesample/system.c       |  4 ++--
 src/backend/executor/execPartition.c          |  8 +++----
 src/backend/executor/nodeIndexscan.c          |  4 ++--
 src/backend/executor/spi.c                    | 12 +++++-----
 src/backend/partitioning/partbounds.c         |  6 ++---
 src/backend/partitioning/partprune.c          |  8 +++----
 src/backend/statistics/attribute_stats.c      |  4 ++--
 src/backend/tsearch/ts_selfuncs.c             |  4 ++--
 src/backend/utils/adt/array_selfuncs.c        | 24 +++++++++----------
 src/backend/utils/adt/arrayfuncs.c            |  2 +-
 src/backend/utils/adt/json.c                  |  4 ++--
 src/backend/utils/adt/jsonfuncs.c             | 18 +++++++-------
 .../utils/adt/multirangetypes_selfuncs.c      | 16 ++++++-------
 src/backend/utils/adt/network_selfuncs.c      | 20 ++++++++--------
 src/backend/utils/adt/orderedsetaggs.c        |  2 +-
 src/backend/utils/adt/rangetypes_selfuncs.c   | 16 ++++++-------
 src/backend/utils/adt/xml.c                   |  4 ++--
 src/backend/utils/cache/catcache.c            |  8 +++----
 src/include/access/hash.h                     |  2 +-
 src/include/access/heaptoast.h                |  2 +-
 src/include/access/spgist_private.h           |  2 +-
 src/include/access/tsmapi.h                   |  2 +-
 src/include/executor/spi.h                    |  8 +++----
 src/include/partitioning/partbounds.h         |  6 ++---
 src/include/utils/array.h                     |  2 +-
 src/include/utils/jsonb.h                     |  4 ++--
 src/include/utils/xml.h                       |  4 ++--
 .../modules/spgist_name_ops/spgist_name_ops.c |  2 +-
 38 files changed, 114 insertions(+), 114 deletions(-)

diff --git a/contrib/tsm_system_rows/tsm_system_rows.c b/contrib/tsm_system_rows/tsm_system_rows.c
index f401efa2131..63e95a5ec66 100644
--- a/contrib/tsm_system_rows/tsm_system_rows.c
+++ b/contrib/tsm_system_rows/tsm_system_rows.c
@@ -64,7 +64,7 @@ static void system_rows_samplescangetsamplesize(PlannerInfo *root,
 static void system_rows_initsamplescan(SampleScanState *node,
 									   int eflags);
 static void system_rows_beginsamplescan(SampleScanState *node,
-										Datum *params,
+										const Datum *params,
 										int nparams,
 										uint32 seed);
 static BlockNumber system_rows_nextsampleblock(SampleScanState *node, BlockNumber nblocks);
@@ -172,7 +172,7 @@ system_rows_initsamplescan(SampleScanState *node, int eflags)
  */
 static void
 system_rows_beginsamplescan(SampleScanState *node,
-							Datum *params,
+							const Datum *params,
 							int nparams,
 							uint32 seed)
 {
diff --git a/contrib/tsm_system_time/tsm_system_time.c b/contrib/tsm_system_time/tsm_system_time.c
index c9c71d8c3af..220d237e263 100644
--- a/contrib/tsm_system_time/tsm_system_time.c
+++ b/contrib/tsm_system_time/tsm_system_time.c
@@ -64,7 +64,7 @@ static void system_time_samplescangetsamplesize(PlannerInfo *root,
 static void system_time_initsamplescan(SampleScanState *node,
 									   int eflags);
 static void system_time_beginsamplescan(SampleScanState *node,
-										Datum *params,
+										const Datum *params,
 										int nparams,
 										uint32 seed);
 static BlockNumber system_time_nextsampleblock(SampleScanState *node, BlockNumber nblocks);
@@ -188,7 +188,7 @@ system_time_initsamplescan(SampleScanState *node, int eflags)
  */
 static void
 system_time_beginsamplescan(SampleScanState *node,
-							Datum *params,
+							const Datum *params,
 							int nparams,
 							uint32 seed)
 {
diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c
index c87f1b9cd7e..f8a11444d66 100644
--- a/src/backend/access/brin/brin_minmax_multi.c
+++ b/src/backend/access/brin/brin_minmax_multi.c
@@ -276,7 +276,7 @@ static int	compare_values(const void *a, const void *b, void *arg);
  * function (which should be BTLessStrategyNumber).
  */
 static void
-AssertArrayOrder(FmgrInfo *cmp, Oid colloid, Datum *values, int nvalues)
+AssertArrayOrder(FmgrInfo *cmp, Oid colloid, const Datum *values, int nvalues)
 {
 	int			i;
 	Datum		lt;
diff --git a/src/backend/access/hash/hashutil.c b/src/backend/access/hash/hashutil.c
index 66c39f60654..3996c132748 100644
--- a/src/backend/access/hash/hashutil.c
+++ b/src/backend/access/hash/hashutil.c
@@ -316,7 +316,7 @@ _hash_get_indextuple_hashkey(IndexTuple itup)
  */
 bool
 _hash_convert_tuple(Relation index,
-					Datum *user_values, bool *user_isnull,
+					const Datum *user_values, bool *user_isnull,
 					Datum *index_values, bool *index_isnull)
 {
 	uint32		hashkey;
diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c
index cb1e57030f6..fc3210cc194 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -561,7 +561,7 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup,
  */
 HeapTuple
 toast_build_flattened_tuple(TupleDesc tupleDesc,
-							Datum *values,
+							const Datum *values,
 							bool *isnull)
 {
 	HeapTuple	new_tuple;
diff --git a/src/backend/access/nbtree/nbtpreprocesskeys.c b/src/backend/access/nbtree/nbtpreprocesskeys.c
index 7b7d7860d8f..a871bf62cab 100644
--- a/src/backend/access/nbtree/nbtpreprocesskeys.c
+++ b/src/backend/access/nbtree/nbtpreprocesskeys.c
@@ -67,7 +67,7 @@ static int	_bt_num_array_keys(IndexScanDesc scan, Oid *skip_eq_ops_out,
 							   int *numSkipArrayKeys_out);
 static Datum _bt_find_extreme_element(IndexScanDesc scan, ScanKey skey,
 									  Oid elemtype, StrategyNumber strat,
-									  Datum *elems, int nelems);
+									  const Datum *elems, int nelems);
 static void _bt_setup_array_cmp(IndexScanDesc scan, ScanKey skey, Oid elemtype,
 								FmgrInfo *orderproc, FmgrInfo **sortprocp);
 static int	_bt_sort_array_elements(ScanKey skey, FmgrInfo *sortproc,
@@ -2569,7 +2569,7 @@ _bt_num_array_keys(IndexScanDesc scan, Oid *skip_eq_ops_out,
 static Datum
 _bt_find_extreme_element(IndexScanDesc scan, ScanKey skey, Oid elemtype,
 						 StrategyNumber strat,
-						 Datum *elems, int nelems)
+						 const Datum *elems, int nelems)
 {
 	Relation	rel = scan->indexRelation;
 	Oid			cmp_op;
diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c
index 8828a7a8f89..2200c789cf0 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -258,7 +258,7 @@ static double _bt_spools_heapscan(Relation heap, Relation index,
 								  BTBuildState *buildstate, IndexInfo *indexInfo);
 static void _bt_spooldestroy(BTSpool *btspool);
 static void _bt_spool(BTSpool *btspool, ItemPointer self,
-					  Datum *values, bool *isnull);
+					  const Datum *values, bool *isnull);
 static void _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2);
 static void _bt_build_callback(Relation index, ItemPointer tid, Datum *values,
 							   bool *isnull, bool tupleIsAlive, void *state);
@@ -525,7 +525,7 @@ _bt_spooldestroy(BTSpool *btspool)
  * spool an index entry into the sort file.
  */
 static void
-_bt_spool(BTSpool *btspool, ItemPointer self, Datum *values, bool *isnull)
+_bt_spool(BTSpool *btspool, ItemPointer self, const Datum *values, bool *isnull)
 {
 	tuplesort_putindextuplevalues(btspool->sortstate, btspool->index,
 								  self, values, isnull);
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c
index af6b27b2135..043dd71969f 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -1912,7 +1912,7 @@ spgSplitNodeAction(Relation index, SpGistState *state,
  */
 bool
 spgdoinsert(Relation index, SpGistState *state,
-			ItemPointer heapPtr, Datum *datums, bool *isnulls)
+			ItemPointer heapPtr, const Datum *datums, bool *isnulls)
 {
 	bool		result = true;
 	TupleDesc	leafDescriptor = state->leafTupDesc;
diff --git a/src/backend/access/spgist/spgtextproc.c b/src/backend/access/spgist/spgtextproc.c
index 73842655f08..91f4ab260c2 100644
--- a/src/backend/access/spgist/spgtextproc.c
+++ b/src/backend/access/spgist/spgtextproc.c
@@ -155,7 +155,7 @@ commonPrefix(const char *a, const char *b, int lena, int lenb)
  * On success, *i gets the match location; on failure, it gets where to insert
  */
 static bool
-searchChar(Datum *nodeLabels, int nNodes, int16 c, int *i)
+searchChar(const Datum *nodeLabels, int nNodes, int16 c, int *i)
 {
 	int			StopLow = 0,
 				StopHigh = nNodes;
diff --git a/src/backend/access/tablesample/bernoulli.c b/src/backend/access/tablesample/bernoulli.c
index 5e1c5d2b723..e5b124d949c 100644
--- a/src/backend/access/tablesample/bernoulli.c
+++ b/src/backend/access/tablesample/bernoulli.c
@@ -50,7 +50,7 @@ static void bernoulli_samplescangetsamplesize(PlannerInfo *root,
 static void bernoulli_initsamplescan(SampleScanState *node,
 									 int eflags);
 static void bernoulli_beginsamplescan(SampleScanState *node,
-									  Datum *params,
+									  const Datum *params,
 									  int nparams,
 									  uint32 seed);
 static OffsetNumber bernoulli_nextsampletuple(SampleScanState *node,
@@ -134,7 +134,7 @@ bernoulli_initsamplescan(SampleScanState *node, int eflags)
  */
 static void
 bernoulli_beginsamplescan(SampleScanState *node,
-						  Datum *params,
+						  const Datum *params,
 						  int nparams,
 						  uint32 seed)
 {
diff --git a/src/backend/access/tablesample/system.c b/src/backend/access/tablesample/system.c
index 8db813b89fc..d16aa0ba180 100644
--- a/src/backend/access/tablesample/system.c
+++ b/src/backend/access/tablesample/system.c
@@ -51,7 +51,7 @@ static void system_samplescangetsamplesize(PlannerInfo *root,
 static void system_initsamplescan(SampleScanState *node,
 								  int eflags);
 static void system_beginsamplescan(SampleScanState *node,
-								   Datum *params,
+								   const Datum *params,
 								   int nparams,
 								   uint32 seed);
 static BlockNumber system_nextsampleblock(SampleScanState *node, BlockNumber nblocks);
@@ -137,7 +137,7 @@ system_initsamplescan(SampleScanState *node, int eflags)
  */
 static void
 system_beginsamplescan(SampleScanState *node,
-					   Datum *params,
+					   const Datum *params,
 					   int nparams,
 					   uint32 seed)
 {
diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c
index 1f2da072632..0213c039c78 100644
--- a/src/backend/executor/execPartition.c
+++ b/src/backend/executor/execPartition.c
@@ -173,10 +173,10 @@ static void FormPartitionKeyDatum(PartitionDispatch pd,
 								  EState *estate,
 								  Datum *values,
 								  bool *isnull);
-static int	get_partition_for_tuple(PartitionDispatch pd, Datum *values,
+static int	get_partition_for_tuple(PartitionDispatch pd, const Datum *values,
 									bool *isnull);
 static char *ExecBuildSlotPartitionKeyDescription(Relation rel,
-												  Datum *values,
+												  const Datum *values,
 												  bool *isnull,
 												  int maxfieldlen);
 static List *adjust_partition_colnos(List *colnos, ResultRelInfo *leaf_part_rri);
@@ -1396,7 +1396,7 @@ FormPartitionKeyDatum(PartitionDispatch pd,
  * found or -1 if none found.
  */
 static int
-get_partition_for_tuple(PartitionDispatch pd, Datum *values, bool *isnull)
+get_partition_for_tuple(PartitionDispatch pd, const Datum *values, bool *isnull)
 {
 	int			bound_offset = -1;
 	int			part_index = -1;
@@ -1617,7 +1617,7 @@ get_partition_for_tuple(PartitionDispatch pd, Datum *values, bool *isnull)
  */
 static char *
 ExecBuildSlotPartitionKeyDescription(Relation rel,
-									 Datum *values,
+									 const Datum *values,
 									 bool *isnull,
 									 int maxfieldlen)
 {
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 7fcaa37fe62..bed72dc7ae5 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -65,7 +65,7 @@ static int	cmp_orderbyvals(const Datum *adist, const bool *anulls,
 static int	reorderqueue_cmp(const pairingheap_node *a,
 							 const pairingheap_node *b, void *arg);
 static void reorderqueue_push(IndexScanState *node, TupleTableSlot *slot,
-							  Datum *orderbyvals, bool *orderbynulls);
+							  const Datum *orderbyvals, bool *orderbynulls);
 static HeapTuple reorderqueue_pop(IndexScanState *node);
 
 
@@ -458,7 +458,7 @@ reorderqueue_cmp(const pairingheap_node *a, const pairingheap_node *b,
  */
 static void
 reorderqueue_push(IndexScanState *node, TupleTableSlot *slot,
-				  Datum *orderbyvals, bool *orderbynulls)
+				  const Datum *orderbyvals, bool *orderbynulls)
 {
 	IndexScanDesc scandesc = node->iss_ScanDesc;
 	EState	   *estate = node->ss.ps.state;
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 50fcd023776..653500b38dc 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -68,7 +68,7 @@ static int	_SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options,
 							  bool fire_triggers);
 
 static ParamListInfo _SPI_convert_params(int nargs, Oid *argtypes,
-										 Datum *Values, const char *Nulls);
+										 const Datum *Values, const char *Nulls);
 
 static int	_SPI_pquery(QueryDesc *queryDesc, bool fire_triggers, uint64 tcount);
 
@@ -669,7 +669,7 @@ SPI_execute_extended(const char *src,
 
 /* Execute a previously prepared plan */
 int
-SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls,
+SPI_execute_plan(SPIPlanPtr plan, const Datum *Values, const char *Nulls,
 				 bool read_only, long tcount)
 {
 	SPIExecuteOptions options;
@@ -771,7 +771,7 @@ SPI_execute_plan_with_paramlist(SPIPlanPtr plan, ParamListInfo params,
  */
 int
 SPI_execute_snapshot(SPIPlanPtr plan,
-					 Datum *Values, const char *Nulls,
+					 const Datum *Values, const char *Nulls,
 					 Snapshot snapshot, Snapshot crosscheck_snapshot,
 					 bool read_only, bool fire_triggers, long tcount)
 {
@@ -811,7 +811,7 @@ SPI_execute_snapshot(SPIPlanPtr plan,
 int
 SPI_execute_with_args(const char *src,
 					  int nargs, Oid *argtypes,
-					  Datum *Values, const char *Nulls,
+					  const Datum *Values, const char *Nulls,
 					  bool read_only, long tcount)
 {
 	int			res;
@@ -1443,7 +1443,7 @@ SPI_freetuptable(SPITupleTable *tuptable)
  */
 Portal
 SPI_cursor_open(const char *name, SPIPlanPtr plan,
-				Datum *Values, const char *Nulls,
+				const Datum *Values, const char *Nulls,
 				bool read_only)
 {
 	Portal		portal;
@@ -2847,7 +2847,7 @@ fail:
  */
 static ParamListInfo
 _SPI_convert_params(int nargs, Oid *argtypes,
-					Datum *Values, const char *Nulls)
+					const Datum *Values, const char *Nulls)
 {
 	ParamListInfo paramLI;
 
diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c
index 822cf4ec451..8ba038c5ef4 100644
--- a/src/backend/partitioning/partbounds.c
+++ b/src/backend/partitioning/partbounds.c
@@ -3555,8 +3555,8 @@ partition_rbound_cmp(int partnatts, FmgrInfo *partsupfunc,
  */
 int32
 partition_rbound_datum_cmp(FmgrInfo *partsupfunc, Oid *partcollation,
-						   Datum *rb_datums, PartitionRangeDatumKind *rb_kind,
-						   Datum *tuple_datums, int n_tuple_datums)
+						   const Datum *rb_datums, PartitionRangeDatumKind *rb_kind,
+						   const Datum *tuple_datums, int n_tuple_datums)
 {
 	int			i;
 	int32		cmpval = -1;
@@ -3695,7 +3695,7 @@ partition_range_bsearch(int partnatts, FmgrInfo *partsupfunc,
 int
 partition_range_datum_bsearch(FmgrInfo *partsupfunc, Oid *partcollation,
 							  PartitionBoundInfo boundinfo,
-							  int nvalues, Datum *values, bool *is_equal)
+							  int nvalues, const Datum *values, bool *is_equal)
 {
 	int			lo,
 				hi,
diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c
index 48a35f763e9..6fff4034c24 100644
--- a/src/backend/partitioning/partprune.c
+++ b/src/backend/partitioning/partprune.c
@@ -179,13 +179,13 @@ static List *get_steps_using_prefix_recurse(GeneratePruningStepsContext *context
 											List *step_exprs,
 											List *step_cmpfns);
 static PruneStepResult *get_matching_hash_bounds(PartitionPruneContext *context,
-												 StrategyNumber opstrategy, Datum *values, int nvalues,
+												 StrategyNumber opstrategy, const Datum *values, int nvalues,
 												 FmgrInfo *partsupfunc, Bitmapset *nullkeys);
 static PruneStepResult *get_matching_list_bounds(PartitionPruneContext *context,
 												 StrategyNumber opstrategy, Datum value, int nvalues,
 												 FmgrInfo *partsupfunc, Bitmapset *nullkeys);
 static PruneStepResult *get_matching_range_bounds(PartitionPruneContext *context,
-												  StrategyNumber opstrategy, Datum *values, int nvalues,
+												  StrategyNumber opstrategy, const Datum *values, int nvalues,
 												  FmgrInfo *partsupfunc, Bitmapset *nullkeys);
 static Bitmapset *pull_exec_paramids(Expr *expr);
 static bool pull_exec_paramids_walker(Node *node, Bitmapset **context);
@@ -2690,7 +2690,7 @@ get_steps_using_prefix_recurse(GeneratePruningStepsContext *context,
  */
 static PruneStepResult *
 get_matching_hash_bounds(PartitionPruneContext *context,
-						 StrategyNumber opstrategy, Datum *values, int nvalues,
+						 StrategyNumber opstrategy, const Datum *values, int nvalues,
 						 FmgrInfo *partsupfunc, Bitmapset *nullkeys)
 {
 	PruneStepResult *result = (PruneStepResult *) palloc0(sizeof(PruneStepResult));
@@ -2978,7 +2978,7 @@ get_matching_list_bounds(PartitionPruneContext *context,
  */
 static PruneStepResult *
 get_matching_range_bounds(PartitionPruneContext *context,
-						  StrategyNumber opstrategy, Datum *values, int nvalues,
+						  StrategyNumber opstrategy, const Datum *values, int nvalues,
 						  FmgrInfo *partsupfunc, Bitmapset *nullkeys)
 {
 	PruneStepResult *result = (PruneStepResult *) palloc0(sizeof(PruneStepResult));
diff --git a/src/backend/statistics/attribute_stats.c b/src/backend/statistics/attribute_stats.c
index 1db6a7f784c..20fb3c8b48c 100644
--- a/src/backend/statistics/attribute_stats.c
+++ b/src/backend/statistics/attribute_stats.c
@@ -113,7 +113,7 @@ static void set_stats_slot(Datum *values, bool *nulls, bool *replaces,
 						   Datum stanumbers, bool stanumbers_isnull,
 						   Datum stavalues, bool stavalues_isnull);
 static void upsert_pg_statistic(Relation starel, HeapTuple oldtup,
-								Datum *values, bool *nulls, bool *replaces);
+								const Datum *values, bool *nulls, bool *replaces);
 static bool delete_pg_statistic(Oid reloid, AttrNumber attnum, bool stainherit);
 static void init_empty_stats_tuple(Oid reloid, int16 attnum, bool inherited,
 								   Datum *values, bool *nulls, bool *replaces);
@@ -816,7 +816,7 @@ set_stats_slot(Datum *values, bool *nulls, bool *replaces,
  */
 static void
 upsert_pg_statistic(Relation starel, HeapTuple oldtup,
-					Datum *values, bool *nulls, bool *replaces)
+					const Datum *values, bool *nulls, bool *replaces)
 {
 	HeapTuple	newtup;
 
diff --git a/src/backend/tsearch/ts_selfuncs.c b/src/backend/tsearch/ts_selfuncs.c
index 6a71ae6452d..8aa47ca44ad 100644
--- a/src/backend/tsearch/ts_selfuncs.c
+++ b/src/backend/tsearch/ts_selfuncs.c
@@ -47,7 +47,7 @@ typedef struct
 
 static Selectivity tsquerysel(VariableStatData *vardata, Datum constval);
 static Selectivity mcelem_tsquery_selec(TSQuery query,
-										Datum *mcelem, int nmcelem,
+										const Datum *mcelem, int nmcelem,
 										float4 *numbers, int nnumbers);
 static Selectivity tsquery_opr_selec(QueryItem *item, char *operand,
 									 TextFreq *lookup, int length, float4 minfreq);
@@ -204,7 +204,7 @@ tsquerysel(VariableStatData *vardata, Datum constval)
  * Extract data from the pg_statistic arrays into useful format.
  */
 static Selectivity
-mcelem_tsquery_selec(TSQuery query, Datum *mcelem, int nmcelem,
+mcelem_tsquery_selec(TSQuery query, const Datum *mcelem, int nmcelem,
 					 float4 *numbers, int nnumbers)
 {
 	float4		minfreq;
diff --git a/src/backend/utils/adt/array_selfuncs.c b/src/backend/utils/adt/array_selfuncs.c
index cf6fbf8652c..57b89d908a5 100644
--- a/src/backend/utils/adt/array_selfuncs.c
+++ b/src/backend/utils/adt/array_selfuncs.c
@@ -41,23 +41,23 @@ static Selectivity calc_arraycontsel(VariableStatData *vardata, Datum constval,
 									 Oid elemtype, Oid operator);
 static Selectivity mcelem_array_selec(ArrayType *array,
 									  TypeCacheEntry *typentry,
-									  Datum *mcelem, int nmcelem,
+									  const Datum *mcelem, int nmcelem,
 									  float4 *numbers, int nnumbers,
 									  float4 *hist, int nhist,
 									  Oid operator);
-static Selectivity mcelem_array_contain_overlap_selec(Datum *mcelem, int nmcelem,
+static Selectivity mcelem_array_contain_overlap_selec(const Datum *mcelem, int nmcelem,
 													  float4 *numbers, int nnumbers,
-													  Datum *array_data, int nitems,
+													  const Datum *array_data, int nitems,
 													  Oid operator, TypeCacheEntry *typentry);
-static Selectivity mcelem_array_contained_selec(Datum *mcelem, int nmcelem,
+static Selectivity mcelem_array_contained_selec(const Datum *mcelem, int nmcelem,
 												float4 *numbers, int nnumbers,
-												Datum *array_data, int nitems,
+												const Datum *array_data, int nitems,
 												float4 *hist, int nhist,
 												Oid operator, TypeCacheEntry *typentry);
 static float *calc_hist(const float4 *hist, int nhist, int n);
 static float *calc_distr(const float *p, int n, int m, float rest);
 static int	floor_log2(uint32 n);
-static bool find_next_mcelem(Datum *mcelem, int nmcelem, Datum value,
+static bool find_next_mcelem(const Datum *mcelem, int nmcelem, Datum value,
 							 int *index, TypeCacheEntry *typentry);
 static int	element_compare(const void *key1, const void *key2, void *arg);
 static int	float_compare_desc(const void *key1, const void *key2);
@@ -426,7 +426,7 @@ calc_arraycontsel(VariableStatData *vardata, Datum constval,
  */
 static Selectivity
 mcelem_array_selec(ArrayType *array, TypeCacheEntry *typentry,
-				   Datum *mcelem, int nmcelem,
+				   const Datum *mcelem, int nmcelem,
 				   float4 *numbers, int nnumbers,
 				   float4 *hist, int nhist,
 				   Oid operator)
@@ -518,9 +518,9 @@ mcelem_array_selec(ArrayType *array, TypeCacheEntry *typentry,
  * fraction of nonempty arrays in the column.
  */
 static Selectivity
-mcelem_array_contain_overlap_selec(Datum *mcelem, int nmcelem,
+mcelem_array_contain_overlap_selec(const Datum *mcelem, int nmcelem,
 								   float4 *numbers, int nnumbers,
-								   Datum *array_data, int nitems,
+								   const Datum *array_data, int nitems,
 								   Oid operator, TypeCacheEntry *typentry)
 {
 	Selectivity selec,
@@ -699,9 +699,9 @@ mcelem_array_contain_overlap_selec(Datum *mcelem, int nmcelem,
  * ... * fn^on * (1 - fn)^(1 - on), o1, o2, ..., on) | o1 + o2 + .. on = m
  */
 static Selectivity
-mcelem_array_contained_selec(Datum *mcelem, int nmcelem,
+mcelem_array_contained_selec(const Datum *mcelem, int nmcelem,
 							 float4 *numbers, int nnumbers,
-							 Datum *array_data, int nitems,
+							 const Datum *array_data, int nitems,
 							 float4 *hist, int nhist,
 							 Oid operator, TypeCacheEntry *typentry)
 {
@@ -1136,7 +1136,7 @@ floor_log2(uint32 n)
  * exact match.)
  */
 static bool
-find_next_mcelem(Datum *mcelem, int nmcelem, Datum value, int *index,
+find_next_mcelem(const Datum *mcelem, int nmcelem, Datum value, int *index,
 				 TypeCacheEntry *typentry)
 {
 	int			l = *index,
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index e5f3e2da35c..b94302c76a9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -959,7 +959,7 @@ ending_error:
  */
 void
 CopyArrayEls(ArrayType *array,
-			 Datum *values,
+			 const Datum *values,
 			 bool *nulls,
 			 int nitems,
 			 int typlen,
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index e9d370cb3da..99785d1b6b5 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -88,7 +88,7 @@ typedef struct JsonAggState
 static void composite_to_json(Datum composite, StringInfo result,
 							  bool use_line_feeds);
 static void array_dim_to_json(StringInfo result, int dim, int ndims, int *dims,
-							  Datum *vals, bool *nulls, int *valcount,
+							  const Datum *vals, bool *nulls, int *valcount,
 							  JsonTypeCategory tcategory, Oid outfuncoid,
 							  bool use_line_feeds);
 static void array_to_json_internal(Datum array, StringInfo result,
@@ -428,7 +428,7 @@ JsonEncodeDateTime(char *buf, Datum value, Oid typid, const int *tzp)
  * ourselves recursively to process the next dimension.
  */
 static void
-array_dim_to_json(StringInfo result, int dim, int ndims, int *dims, Datum *vals,
+array_dim_to_json(StringInfo result, int dim, int ndims, int *dims, const Datum *vals,
 				  bool *nulls, int *valcount, JsonTypeCategory tcategory,
 				  Oid outfuncoid, bool use_line_feeds)
 {
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index c5e1a027956..c57fce0bf16 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -477,15 +477,15 @@ static Datum populate_domain(DomainIOData *io, Oid typid, const char *colname,
 /* functions supporting jsonb_delete, jsonb_set and jsonb_concat */
 static JsonbValue *IteratorConcat(JsonbIterator **it1, JsonbIterator **it2,
 								  JsonbParseState **state);
-static JsonbValue *setPath(JsonbIterator **it, Datum *path_elems,
+static JsonbValue *setPath(JsonbIterator **it, const Datum *path_elems,
 						   bool *path_nulls, int path_len,
 						   JsonbParseState **st, int level, JsonbValue *newval,
 						   int op_type);
-static void setPathObject(JsonbIterator **it, Datum *path_elems,
+static void setPathObject(JsonbIterator **it, const Datum *path_elems,
 						  bool *path_nulls, int path_len, JsonbParseState **st,
 						  int level,
 						  JsonbValue *newval, uint32 npairs, int op_type);
-static void setPathArray(JsonbIterator **it, Datum *path_elems,
+static void setPathArray(JsonbIterator **it, const Datum *path_elems,
 						 bool *path_nulls, int path_len, JsonbParseState **st,
 						 int level,
 						 JsonbValue *newval, uint32 nelems, int op_type);
@@ -1528,7 +1528,7 @@ get_jsonb_path_all(FunctionCallInfo fcinfo, bool as_text)
 }
 
 Datum
-jsonb_get_element(Jsonb *jb, Datum *path, int npath, bool *isnull, bool as_text)
+jsonb_get_element(Jsonb *jb, const Datum *path, int npath, bool *isnull, bool as_text)
 {
 	JsonbContainer *container = &jb->root;
 	JsonbValue *jbvp = NULL;
@@ -1676,7 +1676,7 @@ jsonb_get_element(Jsonb *jb, Datum *path, int npath, bool *isnull, bool as_text)
 }
 
 Datum
-jsonb_set_element(Jsonb *jb, Datum *path, int path_len,
+jsonb_set_element(Jsonb *jb, const Datum *path, int path_len,
 				  JsonbValue *newval)
 {
 	JsonbValue *res;
@@ -1718,7 +1718,7 @@ push_null_elements(JsonbParseState **ps, int num)
  * Caller is responsible to make sure such path does not exist yet.
  */
 static void
-push_path(JsonbParseState **st, int level, Datum *path_elems,
+push_path(JsonbParseState **st, int level, const Datum *path_elems,
 		  bool *path_nulls, int path_len, JsonbValue *newval)
 {
 	/*
@@ -5201,7 +5201,7 @@ IteratorConcat(JsonbIterator **it1, JsonbIterator **it2,
  * whatever bits in op_type are set, or nothing is done.
  */
 static JsonbValue *
-setPath(JsonbIterator **it, Datum *path_elems,
+setPath(JsonbIterator **it, const Datum *path_elems,
 		bool *path_nulls, int path_len,
 		JsonbParseState **st, int level, JsonbValue *newval, int op_type)
 {
@@ -5283,7 +5283,7 @@ setPath(JsonbIterator **it, Datum *path_elems,
  * Object walker for setPath
  */
 static void
-setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
+setPathObject(JsonbIterator **it, const Datum *path_elems, bool *path_nulls,
 			  int path_len, JsonbParseState **st, int level,
 			  JsonbValue *newval, uint32 npairs, int op_type)
 {
@@ -5422,7 +5422,7 @@ setPathObject(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
  * Array walker for setPath
  */
 static void
-setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
+setPathArray(JsonbIterator **it, const Datum *path_elems, bool *path_nulls,
 			 int path_len, JsonbParseState **st, int level,
 			 JsonbValue *newval, uint32 nelems, int op_type)
 {
diff --git a/src/backend/utils/adt/multirangetypes_selfuncs.c b/src/backend/utils/adt/multirangetypes_selfuncs.c
index b87bcf3ea30..21f0205d803 100644
--- a/src/backend/utils/adt/multirangetypes_selfuncs.c
+++ b/src/backend/utils/adt/multirangetypes_selfuncs.c
@@ -49,10 +49,10 @@ static float8 get_position(TypeCacheEntry *typcache, const RangeBound *value,
 static float8 get_len_position(double value, double hist1, double hist2);
 static float8 get_distance(TypeCacheEntry *typcache, const RangeBound *bound1,
 						   const RangeBound *bound2);
-static int	length_hist_bsearch(Datum *length_hist_values,
+static int	length_hist_bsearch(const Datum *length_hist_values,
 								int length_hist_nvalues, double value,
 								bool equal);
-static double calc_length_hist_frac(Datum *length_hist_values,
+static double calc_length_hist_frac(const Datum *length_hist_values,
 									int length_hist_nvalues, double length1,
 									double length2, bool equal);
 static double calc_hist_selectivity_contained(TypeCacheEntry *typcache,
@@ -60,14 +60,14 @@ static double calc_hist_selectivity_contained(TypeCacheEntry *typcache,
 											  RangeBound *upper,
 											  const RangeBound *hist_lower,
 											  int hist_nvalues,
-											  Datum *length_hist_values,
+											  const Datum *length_hist_values,
 											  int length_hist_nvalues);
 static double calc_hist_selectivity_contains(TypeCacheEntry *typcache,
 											 const RangeBound *lower,
 											 const RangeBound *upper,
 											 const RangeBound *hist_lower,
 											 int hist_nvalues,
-											 Datum *length_hist_values,
+											 const Datum *length_hist_values,
 											 int length_hist_nvalues);
 
 /*
@@ -765,7 +765,7 @@ rbound_bsearch(TypeCacheEntry *typcache, const RangeBound *value, const RangeBou
  * given length, returns -1.
  */
 static int
-length_hist_bsearch(Datum *length_hist_values, int length_hist_nvalues,
+length_hist_bsearch(const Datum *length_hist_values, int length_hist_nvalues,
 					double value, bool equal)
 {
 	int			lower = -1,
@@ -963,7 +963,7 @@ get_distance(TypeCacheEntry *typcache, const RangeBound *bound1, const RangeBoun
  * 'equal' is true).
  */
 static double
-calc_length_hist_frac(Datum *length_hist_values, int length_hist_nvalues,
+calc_length_hist_frac(const Datum *length_hist_values, int length_hist_nvalues,
 					  double length1, double length2, bool equal)
 {
 	double		frac;
@@ -1131,7 +1131,7 @@ static double
 calc_hist_selectivity_contained(TypeCacheEntry *typcache,
 								const RangeBound *lower, RangeBound *upper,
 								const RangeBound *hist_lower, int hist_nvalues,
-								Datum *length_hist_values, int length_hist_nvalues)
+								const Datum *length_hist_values, int length_hist_nvalues)
 {
 	int			i,
 				upper_index;
@@ -1252,7 +1252,7 @@ static double
 calc_hist_selectivity_contains(TypeCacheEntry *typcache,
 							   const RangeBound *lower, const RangeBound *upper,
 							   const RangeBound *hist_lower, int hist_nvalues,
-							   Datum *length_hist_values, int length_hist_nvalues)
+							   const Datum *length_hist_values, int length_hist_nvalues)
 {
 	int			i,
 				lower_index;
diff --git a/src/backend/utils/adt/network_selfuncs.c b/src/backend/utils/adt/network_selfuncs.c
index 940cdafa546..d08f40e0332 100644
--- a/src/backend/utils/adt/network_selfuncs.c
+++ b/src/backend/utils/adt/network_selfuncs.c
@@ -48,17 +48,17 @@ static Selectivity networkjoinsel_inner(Oid operator,
 static Selectivity networkjoinsel_semi(Oid operator,
 									   VariableStatData *vardata1, VariableStatData *vardata2);
 static Selectivity mcv_population(float4 *mcv_numbers, int mcv_nvalues);
-static Selectivity inet_hist_value_sel(Datum *values, int nvalues,
+static Selectivity inet_hist_value_sel(const Datum *values, int nvalues,
 									   Datum constvalue, int opr_codenum);
 static Selectivity inet_mcv_join_sel(Datum *mcv1_values,
 									 float4 *mcv1_numbers, int mcv1_nvalues, Datum *mcv2_values,
 									 float4 *mcv2_numbers, int mcv2_nvalues, Oid operator);
-static Selectivity inet_mcv_hist_sel(Datum *mcv_values, float4 *mcv_numbers,
-									 int mcv_nvalues, Datum *hist_values, int hist_nvalues,
+static Selectivity inet_mcv_hist_sel(const Datum *mcv_values, float4 *mcv_numbers,
+									 int mcv_nvalues, const Datum *hist_values, int hist_nvalues,
 									 int opr_codenum);
-static Selectivity inet_hist_inclusion_join_sel(Datum *hist1_values,
+static Selectivity inet_hist_inclusion_join_sel(const Datum *hist1_values,
 												int hist1_nvalues,
-												Datum *hist2_values, int hist2_nvalues,
+												const Datum *hist2_values, int hist2_nvalues,
 												int opr_codenum);
 static Selectivity inet_semi_join_sel(Datum lhs_value,
 									  bool mcv_exists, Datum *mcv_values, int mcv_nvalues,
@@ -601,7 +601,7 @@ mcv_population(float4 *mcv_numbers, int mcv_nvalues)
  * better option than not considering these buckets at all.
  */
 static Selectivity
-inet_hist_value_sel(Datum *values, int nvalues, Datum constvalue,
+inet_hist_value_sel(const Datum *values, int nvalues, Datum constvalue,
 					int opr_codenum)
 {
 	Selectivity match = 0.0;
@@ -702,8 +702,8 @@ inet_mcv_join_sel(Datum *mcv1_values, float4 *mcv1_numbers, int mcv1_nvalues,
  * the histogram.
  */
 static Selectivity
-inet_mcv_hist_sel(Datum *mcv_values, float4 *mcv_numbers, int mcv_nvalues,
-				  Datum *hist_values, int hist_nvalues,
+inet_mcv_hist_sel(const Datum *mcv_values, float4 *mcv_numbers, int mcv_nvalues,
+				  const Datum *hist_values, int hist_nvalues,
 				  int opr_codenum)
 {
 	Selectivity selec = 0.0;
@@ -739,8 +739,8 @@ inet_mcv_hist_sel(Datum *mcv_values, float4 *mcv_numbers, int mcv_nvalues,
  * average?  That would at least avoid non-commutative estimation results.
  */
 static Selectivity
-inet_hist_inclusion_join_sel(Datum *hist1_values, int hist1_nvalues,
-							 Datum *hist2_values, int hist2_nvalues,
+inet_hist_inclusion_join_sel(const Datum *hist1_values, int hist1_nvalues,
+							 const Datum *hist2_values, int hist2_nvalues,
 							 int opr_codenum)
 {
 	double		match = 0.0;
diff --git a/src/backend/utils/adt/orderedsetaggs.c b/src/backend/utils/adt/orderedsetaggs.c
index c41b191be62..d31c28ab166 100644
--- a/src/backend/utils/adt/orderedsetaggs.c
+++ b/src/backend/utils/adt/orderedsetaggs.c
@@ -660,7 +660,7 @@ pct_info_cmp(const void *pa, const void *pb)
  */
 static struct pct_info *
 setup_pct_info(int num_percentiles,
-			   Datum *percentiles_datum,
+			   const Datum *percentiles_datum,
 			   bool *percentiles_null,
 			   int64 rowcount,
 			   bool continuous)
diff --git a/src/backend/utils/adt/rangetypes_selfuncs.c b/src/backend/utils/adt/rangetypes_selfuncs.c
index d126abc5a82..d85252cafb2 100644
--- a/src/backend/utils/adt/rangetypes_selfuncs.c
+++ b/src/backend/utils/adt/rangetypes_selfuncs.c
@@ -46,18 +46,18 @@ static float8 get_position(TypeCacheEntry *typcache, const RangeBound *value,
 static float8 get_len_position(double value, double hist1, double hist2);
 static float8 get_distance(TypeCacheEntry *typcache, const RangeBound *bound1,
 						   const RangeBound *bound2);
-static int	length_hist_bsearch(Datum *length_hist_values,
+static int	length_hist_bsearch(const Datum *length_hist_values,
 								int length_hist_nvalues, double value, bool equal);
-static double calc_length_hist_frac(Datum *length_hist_values,
+static double calc_length_hist_frac(const Datum *length_hist_values,
 									int length_hist_nvalues, double length1, double length2, bool equal);
 static double calc_hist_selectivity_contained(TypeCacheEntry *typcache,
 											  const RangeBound *lower, RangeBound *upper,
 											  const RangeBound *hist_lower, int hist_nvalues,
-											  Datum *length_hist_values, int length_hist_nvalues);
+											  const Datum *length_hist_values, int length_hist_nvalues);
 static double calc_hist_selectivity_contains(TypeCacheEntry *typcache,
 											 const RangeBound *lower, const RangeBound *upper,
 											 const RangeBound *hist_lower, int hist_nvalues,
-											 Datum *length_hist_values, int length_hist_nvalues);
+											 const Datum *length_hist_values, int length_hist_nvalues);
 
 /*
  * Returns a default selectivity estimate for given operator, when we don't
@@ -654,7 +654,7 @@ rbound_bsearch(TypeCacheEntry *typcache, const RangeBound *value, const RangeBou
  * given length, returns -1.
  */
 static int
-length_hist_bsearch(Datum *length_hist_values, int length_hist_nvalues,
+length_hist_bsearch(const Datum *length_hist_values, int length_hist_nvalues,
 					double value, bool equal)
 {
 	int			lower = -1,
@@ -852,7 +852,7 @@ get_distance(TypeCacheEntry *typcache, const RangeBound *bound1, const RangeBoun
  * 'equal' is true).
  */
 static double
-calc_length_hist_frac(Datum *length_hist_values, int length_hist_nvalues,
+calc_length_hist_frac(const Datum *length_hist_values, int length_hist_nvalues,
 					  double length1, double length2, bool equal)
 {
 	double		frac;
@@ -1018,7 +1018,7 @@ static double
 calc_hist_selectivity_contained(TypeCacheEntry *typcache,
 								const RangeBound *lower, RangeBound *upper,
 								const RangeBound *hist_lower, int hist_nvalues,
-								Datum *length_hist_values, int length_hist_nvalues)
+								const Datum *length_hist_values, int length_hist_nvalues)
 {
 	int			i,
 				upper_index;
@@ -1139,7 +1139,7 @@ static double
 calc_hist_selectivity_contains(TypeCacheEntry *typcache,
 							   const RangeBound *lower, const RangeBound *upper,
 							   const RangeBound *hist_lower, int hist_nvalues,
-							   Datum *length_hist_values, int length_hist_nvalues)
+							   const Datum *length_hist_values, int length_hist_nvalues)
 {
 	int			i,
 				lower_index;
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index 66b44183695..9f5c8456f59 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -891,8 +891,8 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent)
 
 xmltype *
 xmlelement(XmlExpr *xexpr,
-		   Datum *named_argvalue, bool *named_argnull,
-		   Datum *argvalue, bool *argnull)
+		   const Datum *named_argvalue, bool *named_argnull,
+		   const Datum *argvalue, bool *argnull)
 {
 #ifdef USE_LIBXML
 	xmltype    *result;
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index fd1c7be8f53..3f774808499 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -118,9 +118,9 @@ static CatCTup *CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp,
 static void ReleaseCatCacheWithOwner(HeapTuple tuple, ResourceOwner resowner);
 static void ReleaseCatCacheListWithOwner(CatCList *list, ResourceOwner resowner);
 static void CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, int *attnos,
-							 Datum *keys);
+							 const Datum *keys);
 static void CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, int *attnos,
-							 Datum *srckeys, Datum *dstkeys);
+							 const Datum *srckeys, Datum *dstkeys);
 
 
 /*
@@ -2279,7 +2279,7 @@ CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments,
  * Helper routine that frees keys stored in the keys array.
  */
 static void
-CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, int *attnos, Datum *keys)
+CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, int *attnos, const Datum *keys)
 {
 	int			i;
 
@@ -2305,7 +2305,7 @@ CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, int *attnos, Datum *keys)
  */
 static void
 CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, int *attnos,
-				 Datum *srckeys, Datum *dstkeys)
+				 const Datum *srckeys, Datum *dstkeys)
 {
 	int			i;
 
diff --git a/src/include/access/hash.h b/src/include/access/hash.h
index 073ad29b19b..5193b97843f 100644
--- a/src/include/access/hash.h
+++ b/src/include/access/hash.h
@@ -468,7 +468,7 @@ extern uint32 _hash_get_totalbuckets(uint32 splitpoint_phase);
 extern void _hash_checkpage(Relation rel, Buffer buf, int flags);
 extern uint32 _hash_get_indextuple_hashkey(IndexTuple itup);
 extern bool _hash_convert_tuple(Relation index,
-								Datum *user_values, bool *user_isnull,
+								const Datum *user_values, bool *user_isnull,
 								Datum *index_values, bool *index_isnull);
 extern OffsetNumber _hash_binsearch(Page page, uint32 hash_value);
 extern OffsetNumber _hash_binsearch_last(Page page, uint32 hash_value);
diff --git a/src/include/access/heaptoast.h b/src/include/access/heaptoast.h
index 6385a27caf8..2840d6fe7fc 100644
--- a/src/include/access/heaptoast.h
+++ b/src/include/access/heaptoast.h
@@ -133,7 +133,7 @@ extern Datum toast_flatten_tuple_to_datum(HeapTupleHeader tup,
  * ----------
  */
 extern HeapTuple toast_build_flattened_tuple(TupleDesc tupleDesc,
-											 Datum *values,
+											 const Datum *values,
 											 bool *isnull);
 
 /* ----------
diff --git a/src/include/access/spgist_private.h b/src/include/access/spgist_private.h
index 56ac64f0597..3e04eaa0933 100644
--- a/src/include/access/spgist_private.h
+++ b/src/include/access/spgist_private.h
@@ -541,7 +541,7 @@ extern void spgPageIndexMultiDelete(SpGistState *state, Page page,
 									int firststate, int reststate,
 									BlockNumber blkno, OffsetNumber offnum);
 extern bool spgdoinsert(Relation index, SpGistState *state,
-						ItemPointer heapPtr, Datum *datums, bool *isnulls);
+						ItemPointer heapPtr, const Datum *datums, bool *isnulls);
 
 /* spgproc.c */
 extern double *spg_key_orderbys_distances(Datum key, bool isLeaf,
diff --git a/src/include/access/tsmapi.h b/src/include/access/tsmapi.h
index 94d230bf8ed..0cc0470c400 100644
--- a/src/include/access/tsmapi.h
+++ b/src/include/access/tsmapi.h
@@ -30,7 +30,7 @@ typedef void (*InitSampleScan_function) (SampleScanState *node,
 										 int eflags);
 
 typedef void (*BeginSampleScan_function) (SampleScanState *node,
-										  Datum *params,
+										  const Datum *params,
 										  int nparams,
 										  uint32 seed);
 
diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h
index d064d1a9b76..de516e5700a 100644
--- a/src/include/executor/spi.h
+++ b/src/include/executor/spi.h
@@ -111,7 +111,7 @@ extern int	SPI_finish(void);
 extern int	SPI_execute(const char *src, bool read_only, long tcount);
 extern int	SPI_execute_extended(const char *src,
 								 const SPIExecuteOptions *options);
-extern int	SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls,
+extern int	SPI_execute_plan(SPIPlanPtr plan, const Datum *Values, const char *Nulls,
 							 bool read_only, long tcount);
 extern int	SPI_execute_plan_extended(SPIPlanPtr plan,
 									  const SPIExecuteOptions *options);
@@ -122,13 +122,13 @@ extern int	SPI_exec(const char *src, long tcount);
 extern int	SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls,
 					  long tcount);
 extern int	SPI_execute_snapshot(SPIPlanPtr plan,
-								 Datum *Values, const char *Nulls,
+								 const Datum *Values, const char *Nulls,
 								 Snapshot snapshot,
 								 Snapshot crosscheck_snapshot,
 								 bool read_only, bool fire_triggers, long tcount);
 extern int	SPI_execute_with_args(const char *src,
 								  int nargs, Oid *argtypes,
-								  Datum *Values, const char *Nulls,
+								  const Datum *Values, const char *Nulls,
 								  bool read_only, long tcount);
 extern SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes);
 extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes,
@@ -172,7 +172,7 @@ extern void SPI_freetuple(HeapTuple tuple);
 extern void SPI_freetuptable(SPITupleTable *tuptable);
 
 extern Portal SPI_cursor_open(const char *name, SPIPlanPtr plan,
-							  Datum *Values, const char *Nulls, bool read_only);
+							  const Datum *Values, const char *Nulls, bool read_only);
 extern Portal SPI_cursor_open_with_args(const char *name,
 										const char *src,
 										int nargs, Oid *argtypes,
diff --git a/src/include/partitioning/partbounds.h b/src/include/partitioning/partbounds.h
index 083b6e3a88a..cf93f9e5bef 100644
--- a/src/include/partitioning/partbounds.h
+++ b/src/include/partitioning/partbounds.h
@@ -130,8 +130,8 @@ extern void check_default_partition_contents(Relation parent,
 
 extern int32 partition_rbound_datum_cmp(FmgrInfo *partsupfunc,
 										Oid *partcollation,
-										Datum *rb_datums, PartitionRangeDatumKind *rb_kind,
-										Datum *tuple_datums, int n_tuple_datums);
+										const Datum *rb_datums, PartitionRangeDatumKind *rb_kind,
+										const Datum *tuple_datums, int n_tuple_datums);
 extern int	partition_list_bsearch(FmgrInfo *partsupfunc,
 								   Oid *partcollation,
 								   PartitionBoundInfo boundinfo,
@@ -139,7 +139,7 @@ extern int	partition_list_bsearch(FmgrInfo *partsupfunc,
 extern int	partition_range_datum_bsearch(FmgrInfo *partsupfunc,
 										  Oid *partcollation,
 										  PartitionBoundInfo boundinfo,
-										  int nvalues, Datum *values, bool *is_equal);
+										  int nvalues, const Datum *values, bool *is_equal);
 extern int	partition_hash_bsearch(PartitionBoundInfo boundinfo,
 								   int modulus, int remainder);
 
diff --git a/src/include/utils/array.h b/src/include/utils/array.h
index 3383f16a3bb..ec5433fc0fe 100644
--- a/src/include/utils/array.h
+++ b/src/include/utils/array.h
@@ -352,7 +352,7 @@ extern PGDLLIMPORT bool Array_nulls;
  * prototypes for functions defined in arrayfuncs.c
  */
 extern void CopyArrayEls(ArrayType *array,
-						 Datum *values,
+						 const Datum *values,
 						 bool *nulls,
 						 int nitems,
 						 int typlen,
diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h
index fecb33b9c67..ff30fbcf6df 100644
--- a/src/include/utils/jsonb.h
+++ b/src/include/utils/jsonb.h
@@ -426,9 +426,9 @@ extern char *JsonbUnquote(Jsonb *jb);
 extern bool JsonbExtractScalar(JsonbContainer *jbc, JsonbValue *res);
 extern const char *JsonbTypeName(JsonbValue *val);
 
-extern Datum jsonb_set_element(Jsonb *jb, Datum *path, int path_len,
+extern Datum jsonb_set_element(Jsonb *jb, const Datum *path, int path_len,
 							   JsonbValue *newval);
-extern Datum jsonb_get_element(Jsonb *jb, Datum *path, int npath,
+extern Datum jsonb_get_element(Jsonb *jb, const Datum *path, int npath,
 							   bool *isnull, bool as_text);
 extern bool to_jsonb_is_immutable(Oid typoid);
 extern Datum jsonb_build_object_worker(int nargs, const Datum *args, const bool *nulls,
diff --git a/src/include/utils/xml.h b/src/include/utils/xml.h
index 0d7a816b9f9..b3bbf0e9395 100644
--- a/src/include/utils/xml.h
+++ b/src/include/utils/xml.h
@@ -71,8 +71,8 @@ extern void xml_ereport(PgXmlErrorContext *errcxt, int level, int sqlcode,
 
 extern xmltype *xmlconcat(List *args);
 extern xmltype *xmlelement(XmlExpr *xexpr,
-						   Datum *named_argvalue, bool *named_argnull,
-						   Datum *argvalue, bool *argnull);
+						   const Datum *named_argvalue, bool *named_argnull,
+						   const Datum *argvalue, bool *argnull);
 extern xmltype *xmlparse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace);
 extern xmltype *xmlpi(const char *target, text *arg, bool arg_is_null, bool *result_is_null);
 extern xmltype *xmlroot(xmltype *data, text *version, int standalone);
diff --git a/src/test/modules/spgist_name_ops/spgist_name_ops.c b/src/test/modules/spgist_name_ops/spgist_name_ops.c
index bcc16ce366e..38e54e0e0a4 100644
--- a/src/test/modules/spgist_name_ops/spgist_name_ops.c
+++ b/src/test/modules/spgist_name_ops/spgist_name_ops.c
@@ -94,7 +94,7 @@ commonPrefix(const char *a, const char *b, int lena, int lenb)
  * On success, *i gets the match location; on failure, it gets where to insert
  */
 static bool
-searchChar(Datum *nodeLabels, int nNodes, int16 c, int *i)
+searchChar(const Datum *nodeLabels, int nNodes, int16 c, int *i)
 {
 	int			StopLow = 0,
 				StopHigh = nNodes;
-- 
2.39.5 (Apple Git-154)

