diff --git a/contrib/intarray/_int_selfuncs.c b/contrib/intarray/_int_selfuncs.c
index 3dad7ee..ce498d3 100644
--- a/contrib/intarray/_int_selfuncs.c
+++ b/contrib/intarray/_int_selfuncs.c
@@ -334,7 +334,7 @@ int_query_opr_selec(ITEM *item, Datum *mcelems, float4 *mcefreqs,
 static int
 compare_val_int4(const void *a, const void *b)
 {
-	int32		key = *(int32 *) a;
+	int32		key = *(const int32 *) a;
 	const Datum *t = (const Datum *) b;
 
 	return key - DatumGetInt32(*t);
diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c
index 71c64e4..c2921e2 100644
--- a/src/backend/access/gin/ginbulk.c
+++ b/src/backend/access/gin/ginbulk.c
@@ -244,7 +244,9 @@ ginInsertBAEntries(BuildAccumulator *accum,
 static int
 qsortCompareItemPointers(const void *a, const void *b)
 {
-	int			res = ginCompareItemPointers((ItemPointer) a, (ItemPointer) b);
+	int			res = ginCompareItemPointers(
+						(const ItemPointerData *) a,
+						(const ItemPointerData *) b);
 
 	/* Assert that there are no equal item pointers being sorted */
 	Assert(res != 0);
diff --git a/src/backend/access/spgist/spgkdtreeproc.c b/src/backend/access/spgist/spgkdtreeproc.c
index 1ab9335..b4f7443 100644
--- a/src/backend/access/spgist/spgkdtreeproc.c
+++ b/src/backend/access/spgist/spgkdtreeproc.c
@@ -82,8 +82,8 @@ typedef struct SortedPoint
 static int
 x_cmp(const void *a, const void *b)
 {
-	SortedPoint *pa = (SortedPoint *) a;
-	SortedPoint *pb = (SortedPoint *) b;
+	const SortedPoint *pa = (const SortedPoint *) a;
+	const SortedPoint *pb = (const SortedPoint *) b;
 
 	if (pa->p->x == pb->p->x)
 		return 0;
@@ -93,8 +93,8 @@ x_cmp(const void *a, const void *b)
 static int
 y_cmp(const void *a, const void *b)
 {
-	SortedPoint *pa = (SortedPoint *) a;
-	SortedPoint *pb = (SortedPoint *) b;
+	const SortedPoint *pa = (const SortedPoint *) a;
+	const SortedPoint *pb = (const SortedPoint *) b;
 
 	if (pa->p->y == pb->p->y)
 		return 0;
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c
index b5fb325..b075ef8 100644
--- a/src/backend/commands/vacuumlazy.c
+++ b/src/backend/commands/vacuumlazy.c
@@ -2026,16 +2026,16 @@ vac_cmp_itemptr(const void *left, const void *right)
 	OffsetNumber loff,
 				roff;
 
-	lblk = ItemPointerGetBlockNumber((ItemPointer) left);
-	rblk = ItemPointerGetBlockNumber((ItemPointer) right);
+	lblk = ItemPointerGetBlockNumber((const ItemPointerData *) left);
+	rblk = ItemPointerGetBlockNumber((const ItemPointerData *) right);
 
 	if (lblk < rblk)
 		return -1;
 	if (lblk > rblk)
 		return 1;
 
-	loff = ItemPointerGetOffsetNumber((ItemPointer) left);
-	roff = ItemPointerGetOffsetNumber((ItemPointer) right);
+	loff = ItemPointerGetOffsetNumber((const ItemPointerData *) left);
+	roff = ItemPointerGetOffsetNumber((const ItemPointerData *) right);
 
 	if (loff < roff)
 		return -1;
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 3143bd9..fe2cfc2 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -409,8 +409,8 @@ static int
 reorderqueue_cmp(const pairingheap_node *a, const pairingheap_node *b,
 				 void *arg)
 {
-	ReorderTuple *rta = (ReorderTuple *) a;
-	ReorderTuple *rtb = (ReorderTuple *) b;
+	const ReorderTuple *rta = (const ReorderTuple *) a;
+	const ReorderTuple *rtb = (const ReorderTuple *) b;
 	IndexScanState *node = (IndexScanState *) arg;
 
 	return -cmp_orderbyvals(rta->orderbyvals, rta->orderbynulls,
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index da9b7a6..44c8d95 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -494,8 +494,8 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir)
 static int
 compareWalFileNames(const void *a, const void *b)
 {
-	char	   *fna = *((char **) a);
-	char	   *fnb = *((char **) b);
+	const char	   *fna = *((const char * const*) a);
+	const char	   *fnb = *((const char * const*) b);
 
 	return strcmp(fna + 8, fnb + 8);
 }
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 9b430b9..b5ce6cc 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -3161,8 +3161,8 @@ TransactionIdInArray(TransactionId xid, TransactionId *xip, Size num)
 static int
 file_sort_by_lsn(const void *a_p, const void *b_p)
 {
-	RewriteMappingFile *a = *(RewriteMappingFile **) a_p;
-	RewriteMappingFile *b = *(RewriteMappingFile **) b_p;
+	const RewriteMappingFile *a = *(const RewriteMappingFile * const*) a_p;
+	const RewriteMappingFile *b = *(const RewriteMappingFile * const*) b_p;
 
 	if (a->lsn < b->lsn)
 		return -1;
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 90804a3..616d7ae 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -4003,8 +4003,8 @@ local_buffer_write_error_callback(void *arg)
 static int
 rnode_comparator(const void *p1, const void *p2)
 {
-	RelFileNode n1 = *(RelFileNode *) p1;
-	RelFileNode n2 = *(RelFileNode *) p2;
+	const RelFileNode n1 = *(const RelFileNode *) p1;
+	const RelFileNode n2 = *(const RelFileNode *) p2;
 
 	if (n1.relNode < n2.relNode)
 		return -1;
@@ -4113,8 +4113,8 @@ buffertag_comparator(const void *a, const void *b)
 static int
 ckpt_buforder_comparator(const void *pa, const void *pb)
 {
-	const CkptSortItem *a = (CkptSortItem *) pa;
-	const CkptSortItem *b = (CkptSortItem *) pb;
+	const CkptSortItem *a = (const CkptSortItem *) pa;
+	const CkptSortItem *b = (const CkptSortItem *) pb;
 
 	/* compare tablespace */
 	if (a->tsId < b->tsId)
diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index 73aa0c0..51a5de6 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -429,8 +429,8 @@ static int
 itemoffcompare(const void *itemidp1, const void *itemidp2)
 {
 	/* Sort in decreasing itemoff order */
-	return ((itemIdSort) itemidp2)->itemoff -
-		((itemIdSort) itemidp1)->itemoff;
+	return ((const itemIdSortData *) itemidp2)->itemoff -
+		((const itemIdSortData *) itemidp1)->itemoff;
 }
 
 /*
diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c
index 9c7ba85..29f0b68 100644
--- a/src/backend/tsearch/spell.c
+++ b/src/backend/tsearch/spell.c
@@ -208,8 +208,8 @@ cmpspellaffix(const void *s1, const void *s2)
 static int
 cmpcmdflag(const void *f1, const void *f2)
 {
-	CompoundAffixFlag *fv1 = (CompoundAffixFlag *) f1,
-			   *fv2 = (CompoundAffixFlag *) f2;
+	const CompoundAffixFlag *fv1 = (const CompoundAffixFlag *) f1;
+	const CompoundAffixFlag *fv2 = (const CompoundAffixFlag *) f2;
 
 	Assert(fv1->flagMode == fv2->flagMode);
 
diff --git a/src/backend/utils/adt/geo_spgist.c b/src/backend/utils/adt/geo_spgist.c
index 0190156..7bf5283 100644
--- a/src/backend/utils/adt/geo_spgist.c
+++ b/src/backend/utils/adt/geo_spgist.c
@@ -89,8 +89,8 @@
 static int
 compareDoubles(const void *a, const void *b)
 {
-	double		x = *(double *) a;
-	double		y = *(double *) b;
+	double		x = *(const double *) a;
+	double		y = *(const double *) b;
 
 	if (x == y)
 		return 0;
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
index 900bcb5..24a0e2c 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -1775,7 +1775,7 @@ make_range(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper,
  * but one is an upper bound and the other a lower bound.
  */
 int
-range_cmp_bounds(TypeCacheEntry *typcache, RangeBound *b1, RangeBound *b2)
+range_cmp_bounds(TypeCacheEntry *typcache, const RangeBound *b1, const RangeBound *b2)
 {
 	int32		result;
 
@@ -1849,8 +1849,8 @@ range_cmp_bounds(TypeCacheEntry *typcache, RangeBound *b1, RangeBound *b2)
  * infinity is plus or minus.
  */
 int
-range_cmp_bound_values(TypeCacheEntry *typcache, RangeBound *b1,
-					   RangeBound *b2)
+range_cmp_bound_values(TypeCacheEntry *typcache, const RangeBound *b1,
+					   const RangeBound *b2)
 {
 	/*
 	 * First, handle cases involving infinity, which don't require invoking
diff --git a/src/backend/utils/adt/rangetypes_gist.c b/src/backend/utils/adt/rangetypes_gist.c
index 01cd234..863ccca 100644
--- a/src/backend/utils/adt/rangetypes_gist.c
+++ b/src/backend/utils/adt/rangetypes_gist.c
@@ -1481,8 +1481,8 @@ get_gist_range_class(RangeType *range)
 static int
 single_bound_cmp(const void *a, const void *b, void *arg)
 {
-	SingleBoundSortItem *i1 = (SingleBoundSortItem *) a;
-	SingleBoundSortItem *i2 = (SingleBoundSortItem *) b;
+	const SingleBoundSortItem *i1 = (const SingleBoundSortItem *) a;
+	const SingleBoundSortItem *i2 = (const SingleBoundSortItem *) b;
 	TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
 
 	return range_cmp_bounds(typcache, &i1->bound, &i2->bound);
@@ -1494,8 +1494,8 @@ single_bound_cmp(const void *a, const void *b, void *arg)
 static int
 interval_cmp_lower(const void *a, const void *b, void *arg)
 {
-	NonEmptyRange *i1 = (NonEmptyRange *) a;
-	NonEmptyRange *i2 = (NonEmptyRange *) b;
+	const NonEmptyRange *i1 = (const NonEmptyRange *) a;
+	const NonEmptyRange *i2 = (const NonEmptyRange *) b;
 	TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
 
 	return range_cmp_bounds(typcache, &i1->lower, &i2->lower);
@@ -1507,8 +1507,8 @@ interval_cmp_lower(const void *a, const void *b, void *arg)
 static int
 interval_cmp_upper(const void *a, const void *b, void *arg)
 {
-	NonEmptyRange *i1 = (NonEmptyRange *) a;
-	NonEmptyRange *i2 = (NonEmptyRange *) b;
+	const NonEmptyRange *i1 = (const NonEmptyRange *) a;
+	const NonEmptyRange *i2 = (const NonEmptyRange *) b;
 	TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
 
 	return range_cmp_bounds(typcache, &i1->upper, &i2->upper);
@@ -1520,8 +1520,8 @@ interval_cmp_upper(const void *a, const void *b, void *arg)
 static int
 common_entry_cmp(const void *i1, const void *i2)
 {
-	double		delta1 = ((CommonEntry *) i1)->delta;
-	double		delta2 = ((CommonEntry *) i2)->delta;
+	double		delta1 = ((const CommonEntry *) i1)->delta;
+	double		delta2 = ((const CommonEntry *) i2)->delta;
 
 	if (delta1 < delta2)
 		return -1;
diff --git a/src/backend/utils/adt/rangetypes_spgist.c b/src/backend/utils/adt/rangetypes_spgist.c
index b89e90f..774a2d5 100644
--- a/src/backend/utils/adt/rangetypes_spgist.c
+++ b/src/backend/utils/adt/rangetypes_spgist.c
@@ -192,8 +192,8 @@ spg_range_quad_choose(PG_FUNCTION_ARGS)
 static int
 bound_cmp(const void *a, const void *b, void *arg)
 {
-	RangeBound *ba = (RangeBound *) a;
-	RangeBound *bb = (RangeBound *) b;
+	const RangeBound *ba = (const RangeBound *) a;
+	const RangeBound *bb = (const RangeBound *) b;
 	TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
 
 	return range_cmp_bounds(typcache, ba, bb);
diff --git a/src/backend/utils/adt/rangetypes_typanalyze.c b/src/backend/utils/adt/rangetypes_typanalyze.c
index 56504fc..13b289f 100644
--- a/src/backend/utils/adt/rangetypes_typanalyze.c
+++ b/src/backend/utils/adt/rangetypes_typanalyze.c
@@ -82,8 +82,8 @@ float8_qsort_cmp(const void *a1, const void *a2)
 static int
 range_bound_qsort_cmp(const void *a1, const void *a2, void *arg)
 {
-	RangeBound *b1 = (RangeBound *) a1;
-	RangeBound *b2 = (RangeBound *) a2;
+	const RangeBound *b1 = (const RangeBound *) a1;
+	const RangeBound *b2 = (const RangeBound *) a2;
 	TypeCacheEntry *typcache = (TypeCacheEntry *) arg;
 
 	return range_cmp_bounds(typcache, b1, b2);
diff --git a/src/backend/utils/adt/tsquery_op.c b/src/backend/utils/adt/tsquery_op.c
index a574b4b..91604ee 100644
--- a/src/backend/utils/adt/tsquery_op.c
+++ b/src/backend/utils/adt/tsquery_op.c
@@ -295,8 +295,8 @@ collectTSQueryValues(TSQuery a, int *nvalues_p)
 static int
 cmp_string(const void *a, const void *b)
 {
-	const char *sa = *((const char **) a);
-	const char *sb = *((const char **) b);
+	const char *sa = *((const char * const*) a);
+	const char *sb = *((const char * const*) b);
 
 	return strcmp(sa, sb);
 }
diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c
index d87f08d..679b9b0 100644
--- a/src/bin/pg_dump/pg_dump_sort.c
+++ b/src/bin/pg_dump/pg_dump_sort.c
@@ -220,20 +220,20 @@ sortDataAndIndexObjectsBySize(DumpableObject **objs, int numObjs)
 static int
 DOSizeCompare(const void *p1, const void *p2)
 {
-	DumpableObject *obj1 = *(DumpableObject **) p1;
-	DumpableObject *obj2 = *(DumpableObject **) p2;
+	const DumpableObject *obj1 = *(const DumpableObject * const*) p1;
+	const DumpableObject *obj2 = *(const DumpableObject * const*) p2;
 	int			obj1_size = 0;
 	int			obj2_size = 0;
 
 	if (obj1->objType == DO_TABLE_DATA)
-		obj1_size = ((TableDataInfo *) obj1)->tdtable->relpages;
+		obj1_size = ((const TableDataInfo *) obj1)->tdtable->relpages;
 	if (obj1->objType == DO_INDEX)
-		obj1_size = ((IndxInfo *) obj1)->relpages;
+		obj1_size = ((const IndxInfo *) obj1)->relpages;
 
 	if (obj2->objType == DO_TABLE_DATA)
-		obj2_size = ((TableDataInfo *) obj2)->tdtable->relpages;
+		obj2_size = ((const TableDataInfo *) obj2)->tdtable->relpages;
 	if (obj2->objType == DO_INDEX)
-		obj2_size = ((IndxInfo *) obj2)->relpages;
+		obj2_size = ((const IndxInfo *) obj2)->relpages;
 
 	/* we want to see the biggest item go first */
 	if (obj1_size > obj2_size)
diff --git a/src/bin/psql/crosstabview.c b/src/bin/psql/crosstabview.c
index b283c24..8a0fc02 100644
--- a/src/bin/psql/crosstabview.c
+++ b/src/bin/psql/crosstabview.c
@@ -694,8 +694,8 @@ indexOfColumn(char *arg, const PGresult *res)
 static int
 pivotFieldCompare(const void *a, const void *b)
 {
-	pivot_field *pa = (pivot_field *) a;
-	pivot_field *pb = (pivot_field *) b;
+	const pivot_field *pa = (const pivot_field *) a;
+	const pivot_field *pb = (const pivot_field *) b;
 
 	/* test null values */
 	if (!pb->name)
@@ -711,5 +711,5 @@ pivotFieldCompare(const void *a, const void *b)
 static int
 rankCompare(const void *a, const void *b)
 {
-	return *((int *) a) - *((int *) b);
+	return *((const int *) a) - *((const int *) b);
 }
diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h
index bf589ab..2e5a7dff 100644
--- a/src/include/access/gin_private.h
+++ b/src/include/access/gin_private.h
@@ -968,7 +968,7 @@ extern ItemPointer ginMergeItemPointers(ItemPointerData *a, uint32 na,
  * so we want this to be inlined.
  */
 static inline int
-ginCompareItemPointers(ItemPointer a, ItemPointer b)
+ginCompareItemPointers(const ItemPointerData *a, const ItemPointerData *b)
 {
 	uint64		ia = (uint64) a->ip_blkid.bi_hi << 32 | (uint64) a->ip_blkid.bi_lo << 16 | a->ip_posid;
 	uint64		ib = (uint64) b->ip_blkid.bi_hi << 32 | (uint64) b->ip_blkid.bi_lo << 16 | b->ip_posid;
diff --git a/src/include/utils/rangetypes.h b/src/include/utils/rangetypes.h
index a774ca0..946c970 100644
--- a/src/include/utils/rangetypes.h
+++ b/src/include/utils/rangetypes.h
@@ -197,10 +197,10 @@ extern char range_get_flags(RangeType *range);
 extern void range_set_contain_empty(RangeType *range);
 extern RangeType *make_range(TypeCacheEntry *typcache, RangeBound *lower,
 		   RangeBound *upper, bool empty);
-extern int range_cmp_bounds(TypeCacheEntry *typcache, RangeBound *b1,
-				 RangeBound *b2);
-extern int range_cmp_bound_values(TypeCacheEntry *typcache, RangeBound *b1,
-					   RangeBound *b2);
+extern int range_cmp_bounds(TypeCacheEntry *typcache, const RangeBound *b1,
+				 const RangeBound *b2);
+extern int range_cmp_bound_values(TypeCacheEntry *typcache, const RangeBound *b1,
+					   const RangeBound *b2);
 extern bool bounds_adjacent(TypeCacheEntry *typcache, RangeBound bound1,
 				RangeBound bound2);
 extern RangeType *make_empty_range(TypeCacheEntry *typcache);
diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index db2b559..fc0e5c6 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -375,8 +375,8 @@ run_named_permutations(TestSpec *testspec)
 static int
 step_qsort_cmp(const void *a, const void *b)
 {
-	Step	   *stepa = *((Step **) a);
-	Step	   *stepb = *((Step **) b);
+	const Step	   *stepa = *((const Step * const*) a);
+	const Step	   *stepb = *((const Step * const*) b);
 
 	return strcmp(stepa->name, stepb->name);
 }
@@ -384,8 +384,8 @@ step_qsort_cmp(const void *a, const void *b)
 static int
 step_bsearch_cmp(const void *a, const void *b)
 {
-	char	   *stepname = (char *) a;
-	Step	   *step = *((Step **) b);
+	const char	   *stepname = (const char *) a;
+	const Step	   *step = *((const Step * const*) b);
 
 	return strcmp(stepname, step->name);
 }
