Here is what I have staged for commit. -- Nathan Bossart Amazon Web Services: https://aws.amazon.com
>From 8e5a66fb3a0787f15a900a89742862c89da38a1d Mon Sep 17 00:00:00 2001 From: Nathan Bossart <nat...@postgresql.org> Date: Thu, 15 Feb 2024 10:53:11 -0600 Subject: [PATCH v8 1/3] Remove direct calls to pg_qsort().
Calls to this function might give the idea that pg_qsort() is somehow different than qsort(), when in fact all calls to qsort() in the Postgres tree are redirected to pg_qsort() via a macro. This commit removes all direct calls to pg_qsort() in favor of letting the macro handle the conversions. Discussion: https://postgr.es/m/CA%2B14426g2Wa9QuUpmakwPxXFWG_1FaY0AsApkvcTBy-YfS6uaw%40mail.gmail.com --- contrib/pg_prewarm/autoprewarm.c | 4 ++-- src/backend/access/brin/brin_minmax_multi.c | 2 +- src/backend/optimizer/plan/analyzejoins.c | 4 ++-- src/backend/storage/buffer/bufmgr.c | 4 ++-- src/backend/utils/cache/syscache.c | 10 +++++----- src/include/port.h | 3 +++ src/port/qsort.c | 3 +++ 7 files changed, 18 insertions(+), 12 deletions(-) diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c index 06ee21d496..248b9914a3 100644 --- a/contrib/pg_prewarm/autoprewarm.c +++ b/contrib/pg_prewarm/autoprewarm.c @@ -346,8 +346,8 @@ apw_load_buffers(void) FreeFile(file); /* Sort the blocks to be loaded. */ - pg_qsort(blkinfo, num_elements, sizeof(BlockInfoRecord), - apw_compare_blockinfo); + qsort(blkinfo, num_elements, sizeof(BlockInfoRecord), + apw_compare_blockinfo); /* Populate shared memory state. */ apw_state->block_info_handle = dsm_segment_handle(seg); diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c index 3ffaad3e42..2c29aa3d4e 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -1369,7 +1369,7 @@ build_distances(FmgrInfo *distanceFn, Oid colloid, * Sort the distances in descending order, so that the longest gaps are at * the front. */ - pg_qsort(distances, ndistances, sizeof(DistanceValue), compare_distances); + qsort(distances, ndistances, sizeof(DistanceValue), compare_distances); return distances; } diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 7dcb74572a..e494acd51a 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -2307,8 +2307,8 @@ remove_self_joins_recurse(PlannerInfo *root, List *joinlist, Relids toRemove) j++; } - pg_qsort(candidates, numRels, sizeof(SelfJoinCandidate), - self_join_candidates_cmp); + qsort(candidates, numRels, sizeof(SelfJoinCandidate), + self_join_candidates_cmp); /* * Iteratively form a group of relation indexes with the same oid and diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index eb1ec3b86d..07575ef312 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -3915,7 +3915,7 @@ DropRelationsAllBuffers(SMgrRelation *smgr_reln, int nlocators) /* sort the list of rlocators if necessary */ if (use_bsearch) - pg_qsort(locators, n, sizeof(RelFileLocator), rlocator_comparator); + qsort(locators, n, sizeof(RelFileLocator), rlocator_comparator); for (i = 0; i < NBuffers; i++) { @@ -4269,7 +4269,7 @@ FlushRelationsAllBuffers(SMgrRelation *smgrs, int nrels) /* sort the list of SMgrRelations if necessary */ if (use_bsearch) - pg_qsort(srels, nrels, sizeof(SMgrSortArray), rlocator_comparator); + qsort(srels, nrels, sizeof(SMgrSortArray), rlocator_comparator); for (i = 0; i < NBuffers; i++) { diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index 162855b158..662f930864 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -146,14 +146,14 @@ InitCatalogCache(void) Assert(SysCacheSupportingRelOidSize <= lengthof(SysCacheSupportingRelOid)); /* Sort and de-dup OID arrays, so we can use binary search. */ - pg_qsort(SysCacheRelationOid, SysCacheRelationOidSize, - sizeof(Oid), oid_compare); + qsort(SysCacheRelationOid, SysCacheRelationOidSize, + sizeof(Oid), oid_compare); SysCacheRelationOidSize = qunique(SysCacheRelationOid, SysCacheRelationOidSize, sizeof(Oid), oid_compare); - pg_qsort(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize, - sizeof(Oid), oid_compare); + qsort(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize, + sizeof(Oid), oid_compare); SysCacheSupportingRelOidSize = qunique(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize, sizeof(Oid), oid_compare); @@ -668,7 +668,7 @@ RelationSupportsSysCache(Oid relid) /* - * OID comparator for pg_qsort + * OID comparator for qsort */ static int oid_compare(const void *a, const void *b) diff --git a/src/include/port.h b/src/include/port.h index 263cf791a3..a2cebbbd68 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -438,6 +438,9 @@ extern bool pg_get_user_name(uid_t user_id, char *buffer, size_t buflen); extern bool pg_get_user_home_dir(uid_t user_id, char *buffer, size_t buflen); #endif +/* + * NB: Callers should use qsort() instead of calling pg_qsort() directly. + */ extern void pg_qsort(void *base, size_t nel, size_t elsize, int (*cmp) (const void *, const void *)); extern int pg_qsort_strcmp(const void *a, const void *b); diff --git a/src/port/qsort.c b/src/port/qsort.c index 7879e6cd56..78354584af 100644 --- a/src/port/qsort.c +++ b/src/port/qsort.c @@ -4,6 +4,9 @@ #include "c.h" +/* + * NB: Callers should use qsort() instead of calling pg_qsort() directly. + */ #define ST_SORT pg_qsort #define ST_ELEMENT_TYPE_VOID #define ST_COMPARE_RUNTIME_POINTER -- 2.25.1
>From f91fe2d895bc19acccac06a098fe947df7d3ac41 Mon Sep 17 00:00:00 2001 From: Nathan Bossart <nat...@postgresql.org> Date: Thu, 15 Feb 2024 15:52:10 -0600 Subject: [PATCH v8 2/3] Introduce efficient, overflow-aware integer comparison functions. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds integer comparison functions that are designed to be as efficient as possible while avoiding overflow. A follow-up commit will make use of these functions in many of the in-tree qsort() comparators. The new functions are not a clear win in all cases (e.g., when the comparator function is inlined), so it is important to consider the context before using them. Author: Mats Kindahl Reviewed-by: Tom Lane, Heikki Linnakangas, Andres Freund, Thomas Munro, Andrey Borodin, Fabrízio de Royes Mello Discussion: https://postgr.es/m/CA%2B14426g2Wa9QuUpmakwPxXFWG_1FaY0AsApkvcTBy-YfS6uaw%40mail.gmail.com --- src/include/common/int.h | 75 ++++++++++++++++++++++++++++++++- src/include/lib/sort_template.h | 13 ++++++ 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/include/common/int.h b/src/include/common/int.h index fedf7b3999..fa2d6329f1 100644 --- a/src/include/common/int.h +++ b/src/include/common/int.h @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * * int.h - * Routines to perform integer math, while checking for overflows. + * Overflow-aware integer math and integer comparison routines. * * The routines in this file are intended to be well defined C, without * relying on compiler flags like -fwrapv. @@ -22,7 +22,7 @@ /*--------- - * The following guidelines apply to all the routines: + * The following guidelines apply to all the overflow routines: * - If a + b overflows, return true, otherwise store the result of a + b * into *result. The content of *result is implementation defined in case of * overflow. @@ -438,4 +438,75 @@ pg_mul_u64_overflow(uint64 a, uint64 b, uint64 *result) #endif } +/*------------------------------------------------------------------------ + * + * Comparison routines for integer types. + * + * These routines are primarily intended for use in qsort() comparator + * functions and therefore return a positive integer, 0, or a negative + * integer depending on whether "a" is greater than, equal to, or less + * than "b", respectively. These functions are written to be as efficient + * as possible without introducing overflow risks, thereby helping ensure + * the comparators that use them are transitive. + * + * Types with fewer than 32 bits are cast to signed integers and + * subtracted. Other types are compared using > and <, and the results of + * those comparisons (which are either (int) 0 or (int) 1 per the C + * standard) are subtracted. + * + * NB: If the comparator functions are inlined, some compilers may produce + * worse code with these helper functions than with code with the + * following form: + * + * if (a < b) + * return -1; + * if (a > b) + * return 1; + * return 0; + * + *------------------------------------------------------------------------ + */ + +static inline int +pg_cmp_s16(int16 a, int16 b) +{ + return (int32) a - (int32) b; +} + +static inline int +pg_cmp_u16(uint16 a, uint16 b) +{ + return (int32) a - (int32) b; +} + +static inline int +pg_cmp_s32(int32 a, int32 b) +{ + return (a > b) - (a < b); +} + +static inline int +pg_cmp_u32(uint32 a, uint32 b) +{ + return (a > b) - (a < b); +} + +static inline int +pg_cmp_s64(int64 a, int64 b) +{ + return (a > b) - (a < b); +} + +static inline int +pg_cmp_u64(uint64 a, uint64 b) +{ + return (a > b) - (a < b); +} + +static inline int +pg_cmp_size(size_t a, size_t b) +{ + return (a > b) - (a < b); +} + #endif /* COMMON_INT_H */ diff --git a/src/include/lib/sort_template.h b/src/include/lib/sort_template.h index a470fa1103..6772bf5ee3 100644 --- a/src/include/lib/sort_template.h +++ b/src/include/lib/sort_template.h @@ -34,6 +34,16 @@ * - ST_COMPARE(a, b, arg) - variant that takes an extra argument * - ST_COMPARE_RUNTIME_POINTER - sort function takes a function pointer * + * NB: If the comparator function is inlined, some compilers may produce + * worse code with the optimized comparison routines in common/int.h than + * with code with the following form: + * + * if (a < b) + * return -1; + * if (a > b) + * return 1; + * return 0; + * * To say that the comparator and therefore also sort function should * receive an extra pass-through argument, specify the type of the * argument. @@ -243,6 +253,9 @@ ST_SCOPE void ST_SORT(ST_ELEMENT_TYPE * first, size_t n * Find the median of three values. Currently, performance seems to be best * if the comparator is inlined here, but the med3 function is not inlined * in the qsort function. + * + * Refer to the comment at the top of this file for known caveats to consider + * when writing inlined comparator functions. */ static pg_noinline ST_ELEMENT_TYPE * ST_MED3(ST_ELEMENT_TYPE * a, -- 2.25.1
>From ee28e9a09bd024e4fbe3f59a0d462d0f1dba3000 Mon Sep 17 00:00:00 2001 From: Nathan Bossart <nat...@postgresql.org> Date: Thu, 15 Feb 2024 17:28:50 -0600 Subject: [PATCH v8 3/3] Use new overflow-aware integer comparison functions. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit XXXXXXXXXX introduced integer comparison functions designed to be as efficient as possible while avoiding overflow. This commit makes use of these functions in many of the in-tree qsort() comparators, which helps ensure transitivity. The comparator functions that previously had trivial implementations (i.e., "if" statements) should also see a small performance boost. Author: Mats Kindahl Reviewed-by: Tom Lane, Heikki Linnakangas, Andres Freund, Fabrízio de Royes Mello Discussion: https://postgr.es/m/CA%2B14426g2Wa9QuUpmakwPxXFWG_1FaY0AsApkvcTBy-YfS6uaw%40mail.gmail.com --- contrib/hstore/hstore_gist.c | 4 +++- contrib/intarray/_int_tool.c | 9 +++------ contrib/intarray/_intbig_gist.c | 4 +++- contrib/pg_stat_statements/pg_stat_statements.c | 8 ++------ contrib/pg_trgm/trgm_op.c | 8 ++------ src/backend/access/nbtree/nbtinsert.c | 8 ++------ src/backend/access/nbtree/nbtpage.c | 10 +++------- src/backend/access/nbtree/nbtsplitloc.c | 8 ++------ src/backend/access/spgist/spgdoinsert.c | 5 ++--- src/backend/access/spgist/spgtextproc.c | 3 ++- src/backend/backup/basebackup_incremental.c | 8 ++------ src/backend/backup/walsummary.c | 7 ++----- src/backend/catalog/heap.c | 7 ++----- src/backend/nodes/list.c | 13 +++---------- src/backend/nodes/tidbitmap.c | 7 ++----- src/backend/parser/parse_agg.c | 3 ++- src/backend/postmaster/autovacuum.c | 7 +++---- src/backend/replication/logical/reorderbuffer.c | 7 ++----- src/backend/replication/syncrep.c | 8 ++------ src/backend/utils/adt/oid.c | 7 ++----- src/backend/utils/adt/tsgistidx.c | 10 +++------- src/backend/utils/adt/tsquery_gist.c | 7 +++---- src/backend/utils/adt/tsvector.c | 5 ++--- src/backend/utils/adt/tsvector_op.c | 5 ++--- src/backend/utils/adt/xid.c | 7 ++----- src/backend/utils/cache/relcache.c | 3 ++- src/backend/utils/cache/syscache.c | 5 ++--- src/backend/utils/cache/typcache.c | 8 ++------ src/backend/utils/resowner/resowner.c | 10 ++-------- src/bin/pg_dump/pg_dump_sort.c | 7 ++----- src/bin/pg_upgrade/function.c | 12 ++++++------ src/bin/pg_walsummary/pg_walsummary.c | 8 ++------ src/bin/psql/crosstabview.c | 3 ++- src/include/access/gin_private.h | 8 ++------ 34 files changed, 80 insertions(+), 159 deletions(-) diff --git a/contrib/hstore/hstore_gist.c b/contrib/hstore/hstore_gist.c index fe343739eb..a3b08af385 100644 --- a/contrib/hstore/hstore_gist.c +++ b/contrib/hstore/hstore_gist.c @@ -7,6 +7,7 @@ #include "access/reloptions.h" #include "access/stratnum.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "hstore.h" #include "utils/pg_crc.h" @@ -356,7 +357,8 @@ typedef struct static int comparecost(const void *a, const void *b) { - return ((const SPLITCOST *) a)->cost - ((const SPLITCOST *) b)->cost; + return pg_cmp_s32(((const SPLITCOST *) a)->cost, + ((const SPLITCOST *) b)->cost); } diff --git a/contrib/intarray/_int_tool.c b/contrib/intarray/_int_tool.c index 68f624e085..c85280c842 100644 --- a/contrib/intarray/_int_tool.c +++ b/contrib/intarray/_int_tool.c @@ -7,6 +7,7 @@ #include "_int.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "lib/qunique.h" /* arguments are assumed sorted & unique-ified */ @@ -396,15 +397,11 @@ int_to_intset(int32 elem) int compASC(const void *a, const void *b) { - if (*(const int32 *) a == *(const int32 *) b) - return 0; - return (*(const int32 *) a > *(const int32 *) b) ? 1 : -1; + return pg_cmp_s32(*(const int32 *) a, *(const int32 *) b); } int compDESC(const void *a, const void *b) { - if (*(const int32 *) a == *(const int32 *) b) - return 0; - return (*(const int32 *) a < *(const int32 *) b) ? 1 : -1; + return pg_cmp_s32(*(const int32 *) b, *(const int32 *) a); } diff --git a/contrib/intarray/_intbig_gist.c b/contrib/intarray/_intbig_gist.c index 8c6c4b5d05..9699fbf3b4 100644 --- a/contrib/intarray/_intbig_gist.c +++ b/contrib/intarray/_intbig_gist.c @@ -9,6 +9,7 @@ #include "access/gist.h" #include "access/reloptions.h" #include "access/stratnum.h" +#include "common/int.h" #include "port/pg_bitutils.h" #define GETENTRY(vec,pos) ((GISTTYPE *) DatumGetPointer((vec)->vector[(pos)].key)) @@ -312,7 +313,8 @@ typedef struct static int comparecost(const void *a, const void *b) { - return ((const SPLITCOST *) a)->cost - ((const SPLITCOST *) b)->cost; + return pg_cmp_s32(((const SPLITCOST *) a)->cost, + ((const SPLITCOST *) b)->cost); } diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 8c6a3a2d08..67cec865ba 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -50,6 +50,7 @@ #include "access/parallel.h" #include "catalog/pg_authid.h" #include "common/hashfn.h" +#include "common/int.h" #include "executor/instrument.h" #include "funcapi.h" #include "jit/jit.h" @@ -3007,10 +3008,5 @@ comp_location(const void *a, const void *b) int l = ((const LocationLen *) a)->location; int r = ((const LocationLen *) b)->location; - if (l < r) - return -1; - else if (l > r) - return +1; - else - return 0; + return pg_cmp_s32(l, r); } diff --git a/contrib/pg_trgm/trgm_op.c b/contrib/pg_trgm/trgm_op.c index 49d4497b4f..c509d15ee4 100644 --- a/contrib/pg_trgm/trgm_op.c +++ b/contrib/pg_trgm/trgm_op.c @@ -6,6 +6,7 @@ #include <ctype.h> #include "catalog/pg_type.h" +#include "common/int.h" #include "lib/qunique.h" #include "miscadmin.h" #include "trgm.h" @@ -433,12 +434,7 @@ comp_ptrgm(const void *v1, const void *v2) if (cmp != 0) return cmp; - if (p1->index < p2->index) - return -1; - else if (p1->index == p2->index) - return 0; - else - return 1; + return pg_cmp_s32(p1->index, p2->index); } /* diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index 709edd1c17..e9cfc13604 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -19,6 +19,7 @@ #include "access/nbtxlog.h" #include "access/transam.h" #include "access/xloginsert.h" +#include "common/int.h" #include "common/pg_prng.h" #include "lib/qunique.h" #include "miscadmin.h" @@ -3013,10 +3014,5 @@ _bt_blk_cmp(const void *arg1, const void *arg2) BlockNumber b1 = *((BlockNumber *) arg1); BlockNumber b2 = *((BlockNumber *) arg2); - if (b1 < b2) - return -1; - else if (b1 > b2) - return 1; - - return 0; + return pg_cmp_u32(b1, b2); } diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 567bade9f4..90990ea77a 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -28,6 +28,7 @@ #include "access/transam.h" #include "access/xlog.h" #include "access/xloginsert.h" +#include "common/int.h" #include "miscadmin.h" #include "storage/indexfsm.h" #include "storage/lmgr.h" @@ -1466,14 +1467,9 @@ _bt_delitems_cmp(const void *a, const void *b) TM_IndexDelete *indexdelete1 = (TM_IndexDelete *) a; TM_IndexDelete *indexdelete2 = (TM_IndexDelete *) b; - if (indexdelete1->id > indexdelete2->id) - return 1; - if (indexdelete1->id < indexdelete2->id) - return -1; + Assert(indexdelete1->id != indexdelete2->id); - Assert(false); - - return 0; + return pg_cmp_s16(indexdelete1->id, indexdelete2->id); } /* diff --git a/src/backend/access/nbtree/nbtsplitloc.c b/src/backend/access/nbtree/nbtsplitloc.c index d0b1d82578..490e7bfd4d 100644 --- a/src/backend/access/nbtree/nbtsplitloc.c +++ b/src/backend/access/nbtree/nbtsplitloc.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/nbtree.h" +#include "common/int.h" #include "storage/lmgr.h" typedef enum @@ -596,12 +597,7 @@ _bt_splitcmp(const void *arg1, const void *arg2) SplitPoint *split1 = (SplitPoint *) arg1; SplitPoint *split2 = (SplitPoint *) arg2; - if (split1->curdelta > split2->curdelta) - return 1; - if (split1->curdelta < split2->curdelta) - return -1; - - return 0; + return pg_cmp_s16(split1->curdelta, split2->curdelta); } /* diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c index bb063c858d..a4995c168b 100644 --- a/src/backend/access/spgist/spgdoinsert.c +++ b/src/backend/access/spgist/spgdoinsert.c @@ -19,6 +19,7 @@ #include "access/spgist_private.h" #include "access/spgxlog.h" #include "access/xloginsert.h" +#include "common/int.h" #include "common/pg_prng.h" #include "miscadmin.h" #include "storage/bufmgr.h" @@ -110,9 +111,7 @@ addNode(SpGistState *state, SpGistInnerTuple tuple, Datum label, int offset) static int cmpOffsetNumbers(const void *a, const void *b) { - if (*(const OffsetNumber *) a == *(const OffsetNumber *) b) - return 0; - return (*(const OffsetNumber *) a > *(const OffsetNumber *) b) ? 1 : -1; + return pg_cmp_u16(*(const OffsetNumber *) a, *(const OffsetNumber *) b); } /* diff --git a/src/backend/access/spgist/spgtextproc.c b/src/backend/access/spgist/spgtextproc.c index b8fd0c2ad8..d5db5225a9 100644 --- a/src/backend/access/spgist/spgtextproc.c +++ b/src/backend/access/spgist/spgtextproc.c @@ -40,6 +40,7 @@ #include "postgres.h" #include "access/spgist.h" +#include "common/int.h" #include "catalog/pg_type.h" #include "mb/pg_wchar.h" #include "utils/builtins.h" @@ -325,7 +326,7 @@ cmpNodePtr(const void *a, const void *b) const spgNodePtr *aa = (const spgNodePtr *) a; const spgNodePtr *bb = (const spgNodePtr *) b; - return aa->c - bb->c; + return pg_cmp_s16(aa->c, bb->c); } Datum diff --git a/src/backend/backup/basebackup_incremental.c b/src/backend/backup/basebackup_incremental.c index 0504c465db..e994ee66bb 100644 --- a/src/backend/backup/basebackup_incremental.c +++ b/src/backend/backup/basebackup_incremental.c @@ -27,6 +27,7 @@ #include "common/blkreftable.h" #include "common/parse_manifest.h" #include "common/hashfn.h" +#include "common/int.h" #include "postmaster/walsummarizer.h" #define BLOCKS_PER_READ 512 @@ -994,10 +995,5 @@ compare_block_numbers(const void *a, const void *b) BlockNumber aa = *(BlockNumber *) a; BlockNumber bb = *(BlockNumber *) b; - if (aa > bb) - return 1; - else if (aa == bb) - return 0; - else - return -1; + return pg_cmp_u32(aa, bb); } diff --git a/src/backend/backup/walsummary.c b/src/backend/backup/walsummary.c index 867870aaad..4d047e1c02 100644 --- a/src/backend/backup/walsummary.c +++ b/src/backend/backup/walsummary.c @@ -17,6 +17,7 @@ #include "access/xlog_internal.h" #include "backup/walsummary.h" +#include "common/int.h" #include "utils/wait_event.h" static bool IsWalSummaryFilename(char *filename); @@ -355,9 +356,5 @@ ListComparatorForWalSummaryFiles(const ListCell *a, const ListCell *b) WalSummaryFile *ws1 = lfirst(a); WalSummaryFile *ws2 = lfirst(b); - if (ws1->start_lsn < ws2->start_lsn) - return -1; - if (ws1->start_lsn > ws2->start_lsn) - return 1; - return 0; + return pg_cmp_u64(ws1->start_lsn, ws2->start_lsn); } diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index c73f7bcd01..03368b93d7 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -56,6 +56,7 @@ #include "catalog/storage.h" #include "commands/tablecmds.h" #include "commands/typecmds.h" +#include "common/int.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" @@ -2759,11 +2760,7 @@ list_cookedconstr_attnum_cmp(const ListCell *p1, const ListCell *p2) AttrNumber v1 = ((CookedConstraint *) lfirst(p1))->attnum; AttrNumber v2 = ((CookedConstraint *) lfirst(p2))->attnum; - if (v1 < v2) - return -1; - if (v1 > v2) - return 1; - return 0; + return pg_cmp_s16(v1, v2); } /* diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c index 957186bef5..e2615ab105 100644 --- a/src/backend/nodes/list.c +++ b/src/backend/nodes/list.c @@ -17,6 +17,7 @@ */ #include "postgres.h" +#include "common/int.h" #include "nodes/pg_list.h" #include "port/pg_bitutils.h" #include "utils/memdebug.h" @@ -1692,11 +1693,7 @@ list_int_cmp(const ListCell *p1, const ListCell *p2) int v1 = lfirst_int(p1); int v2 = lfirst_int(p2); - if (v1 < v2) - return -1; - if (v1 > v2) - return 1; - return 0; + return pg_cmp_s32(v1, v2); } /* @@ -1708,9 +1705,5 @@ list_oid_cmp(const ListCell *p1, const ListCell *p2) Oid v1 = lfirst_oid(p1); Oid v2 = lfirst_oid(p2); - if (v1 < v2) - return -1; - if (v1 > v2) - return 1; - return 0; + return pg_cmp_u32(v1, v2); } diff --git a/src/backend/nodes/tidbitmap.c b/src/backend/nodes/tidbitmap.c index 0f4850065f..e8ab5d78fc 100644 --- a/src/backend/nodes/tidbitmap.c +++ b/src/backend/nodes/tidbitmap.c @@ -42,6 +42,7 @@ #include "access/htup_details.h" #include "common/hashfn.h" +#include "common/int.h" #include "nodes/bitmapset.h" #include "nodes/tidbitmap.h" #include "storage/lwlock.h" @@ -1425,11 +1426,7 @@ tbm_comparator(const void *left, const void *right) BlockNumber l = (*((PagetableEntry *const *) left))->blockno; BlockNumber r = (*((PagetableEntry *const *) right))->blockno; - if (l < r) - return -1; - else if (l > r) - return 1; - return 0; + return pg_cmp_u32(l, r); } /* diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index 7b211a7743..9d151a880b 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -18,6 +18,7 @@ #include "catalog/pg_aggregate.h" #include "catalog/pg_constraint.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" @@ -1760,7 +1761,7 @@ cmp_list_len_asc(const ListCell *a, const ListCell *b) int la = list_length((const List *) lfirst(a)); int lb = list_length((const List *) lfirst(b)); - return (la > lb) ? 1 : (la == lb) ? 0 : -1; + return pg_cmp_s32(la, lb); } /* list_sort comparator to sort sub-lists by length and contents */ diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 37998f7387..2ab344c1f8 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -78,6 +78,7 @@ #include "catalog/pg_database.h" #include "commands/dbcommands.h" #include "commands/vacuum.h" +#include "common/int.h" #include "lib/ilist.h" #include "libpq/pqsignal.h" #include "miscadmin.h" @@ -1120,10 +1121,8 @@ rebuild_database_list(Oid newdb) static int db_comparator(const void *a, const void *b) { - if (((const avl_dbase *) a)->adl_score == ((const avl_dbase *) b)->adl_score) - return 0; - else - return (((const avl_dbase *) a)->adl_score < ((const avl_dbase *) b)->adl_score) ? 1 : -1; + return pg_cmp_s32(((const avl_dbase *) a)->adl_score, + ((const avl_dbase *) b)->adl_score); } /* diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index bbf0966182..5446df3c64 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -91,6 +91,7 @@ #include "access/xact.h" #include "access/xlog_internal.h" #include "catalog/catalog.h" +#include "common/int.h" #include "lib/binaryheap.h" #include "miscadmin.h" #include "pgstat.h" @@ -5119,11 +5120,7 @@ file_sort_by_lsn(const ListCell *a_p, const ListCell *b_p) RewriteMappingFile *a = (RewriteMappingFile *) lfirst(a_p); RewriteMappingFile *b = (RewriteMappingFile *) lfirst(b_p); - if (a->lsn < b->lsn) - return -1; - else if (a->lsn > b->lsn) - return 1; - return 0; + return pg_cmp_u64(a->lsn, b->lsn); } /* diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c index 2e6493aaaa..bfcd8fa13e 100644 --- a/src/backend/replication/syncrep.c +++ b/src/backend/replication/syncrep.c @@ -75,6 +75,7 @@ #include <unistd.h> #include "access/xact.h" +#include "common/int.h" #include "miscadmin.h" #include "pgstat.h" #include "replication/syncrep.h" @@ -698,12 +699,7 @@ cmp_lsn(const void *a, const void *b) XLogRecPtr lsn1 = *((const XLogRecPtr *) a); XLogRecPtr lsn2 = *((const XLogRecPtr *) b); - if (lsn1 > lsn2) - return -1; - else if (lsn1 == lsn2) - return 0; - else - return 1; + return pg_cmp_u64(lsn2, lsn1); } /* diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c index 62bcfc5b56..56fb1fd77c 100644 --- a/src/backend/utils/adt/oid.c +++ b/src/backend/utils/adt/oid.c @@ -18,6 +18,7 @@ #include <limits.h> #include "catalog/pg_type.h" +#include "common/int.h" #include "libpq/pqformat.h" #include "nodes/miscnodes.h" #include "nodes/value.h" @@ -259,11 +260,7 @@ oid_cmp(const void *p1, const void *p2) Oid v1 = *((const Oid *) p1); Oid v2 = *((const Oid *) p2); - if (v1 < v2) - return -1; - if (v1 > v2) - return 1; - return 0; + return pg_cmp_u32(v1, v2); } diff --git a/src/backend/utils/adt/tsgistidx.c b/src/backend/utils/adt/tsgistidx.c index a62b285365..3fb7696434 100644 --- a/src/backend/utils/adt/tsgistidx.c +++ b/src/backend/utils/adt/tsgistidx.c @@ -17,6 +17,7 @@ #include "access/gist.h" #include "access/heaptoast.h" #include "access/reloptions.h" +#include "common/int.h" #include "lib/qunique.h" #include "port/pg_bitutils.h" #include "tsearch/ts_utils.h" @@ -136,9 +137,7 @@ compareint(const void *va, const void *vb) int32 a = *((const int32 *) va); int32 b = *((const int32 *) vb); - if (a == b) - return 0; - return (a > b) ? 1 : -1; + return pg_cmp_s32(a, b); } static void @@ -598,10 +597,7 @@ comparecost(const void *va, const void *vb) const SPLITCOST *a = (const SPLITCOST *) va; const SPLITCOST *b = (const SPLITCOST *) vb; - if (a->cost == b->cost) - return 0; - else - return (a->cost > b->cost) ? 1 : -1; + return pg_cmp_s32(a->cost, b->cost); } diff --git a/src/backend/utils/adt/tsquery_gist.c b/src/backend/utils/adt/tsquery_gist.c index f0b1c81c81..2db304b10b 100644 --- a/src/backend/utils/adt/tsquery_gist.c +++ b/src/backend/utils/adt/tsquery_gist.c @@ -16,6 +16,7 @@ #include "access/gist.h" #include "access/stratnum.h" +#include "common/int.h" #include "tsearch/ts_utils.h" #include "utils/builtins.h" @@ -156,10 +157,8 @@ typedef struct static int comparecost(const void *a, const void *b) { - if (((const SPLITCOST *) a)->cost == ((const SPLITCOST *) b)->cost) - return 0; - else - return (((const SPLITCOST *) a)->cost > ((const SPLITCOST *) b)->cost) ? 1 : -1; + return pg_cmp_s32(((const SPLITCOST *) a)->cost, + ((const SPLITCOST *) b)->cost); } #define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) ) diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c index fb7b7c712a..10bc4f2234 100644 --- a/src/backend/utils/adt/tsvector.c +++ b/src/backend/utils/adt/tsvector.c @@ -14,6 +14,7 @@ #include "postgres.h" +#include "common/int.h" #include "libpq/pqformat.h" #include "nodes/miscnodes.h" #include "tsearch/ts_locale.h" @@ -37,9 +38,7 @@ compareWordEntryPos(const void *a, const void *b) int apos = WEP_GETPOS(*(const WordEntryPos *) a); int bpos = WEP_GETPOS(*(const WordEntryPos *) b); - if (apos == bpos) - return 0; - return (apos > bpos) ? 1 : -1; + return pg_cmp_s32(apos, bpos); } /* diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c index 71386d0a1f..947a592ed2 100644 --- a/src/backend/utils/adt/tsvector_op.c +++ b/src/backend/utils/adt/tsvector_op.c @@ -19,6 +19,7 @@ #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "commands/trigger.h" +#include "common/int.h" #include "executor/spi.h" #include "funcapi.h" #include "lib/qunique.h" @@ -435,9 +436,7 @@ compare_int(const void *va, const void *vb) int a = *((const int *) va); int b = *((const int *) vb); - if (a == b) - return 0; - return (a > b) ? 1 : -1; + return pg_cmp_s32(a, b); } static int diff --git a/src/backend/utils/adt/xid.c b/src/backend/utils/adt/xid.c index 63adf5668b..ae273b1961 100644 --- a/src/backend/utils/adt/xid.c +++ b/src/backend/utils/adt/xid.c @@ -19,6 +19,7 @@ #include "access/multixact.h" #include "access/transam.h" #include "access/xact.h" +#include "common/int.h" #include "libpq/pqformat.h" #include "utils/builtins.h" #include "utils/xid8.h" @@ -140,11 +141,7 @@ xidComparator(const void *arg1, const void *arg2) TransactionId xid1 = *(const TransactionId *) arg1; TransactionId xid2 = *(const TransactionId *) arg2; - if (xid1 > xid2) - return 1; - if (xid1 < xid2) - return -1; - return 0; + return pg_cmp_u32(xid1, xid2); } /* diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index ac106b40e3..50acae4529 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -69,6 +69,7 @@ #include "commands/policy.h" #include "commands/publicationcmds.h" #include "commands/trigger.h" +#include "common/int.h" #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" @@ -4520,7 +4521,7 @@ AttrDefaultCmp(const void *a, const void *b) const AttrDefault *ada = (const AttrDefault *) a; const AttrDefault *adb = (const AttrDefault *) b; - return ada->adnum - adb->adnum; + return pg_cmp_s16(ada->adnum, adb->adnum); } /* diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index 662f930864..2292237f85 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -29,6 +29,7 @@ #include "catalog/pg_shdepend_d.h" #include "catalog/pg_shdescription_d.h" #include "catalog/pg_shseclabel_d.h" +#include "common/int.h" #include "lib/qunique.h" #include "utils/catcache.h" #include "utils/lsyscache.h" @@ -676,7 +677,5 @@ oid_compare(const void *a, const void *b) Oid oa = *((const Oid *) a); Oid ob = *((const Oid *) b); - if (oa == ob) - return 0; - return (oa > ob) ? 1 : -1; + return pg_cmp_u32(oa, ob); } diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c index 84fc83cb11..2842bde907 100644 --- a/src/backend/utils/cache/typcache.c +++ b/src/backend/utils/cache/typcache.c @@ -57,6 +57,7 @@ #include "catalog/pg_range.h" #include "catalog/pg_type.h" #include "commands/defrem.h" +#include "common/int.h" #include "executor/executor.h" #include "lib/dshash.h" #include "optimizer/optimizer.h" @@ -2722,12 +2723,7 @@ enum_oid_cmp(const void *left, const void *right) const EnumItem *l = (const EnumItem *) left; const EnumItem *r = (const EnumItem *) right; - if (l->enum_oid < r->enum_oid) - return -1; - else if (l->enum_oid > r->enum_oid) - return 1; - else - return 0; + return pg_cmp_u32(l->enum_oid, r->enum_oid); } /* diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index aa199b23ff..ab9343bc5c 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -46,6 +46,7 @@ #include "postgres.h" #include "common/hashfn.h" +#include "common/int.h" #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" @@ -264,14 +265,7 @@ resource_priority_cmp(const void *a, const void *b) /* Note: reverse order */ if (ra->kind->release_phase == rb->kind->release_phase) - { - if (ra->kind->release_priority == rb->kind->release_priority) - return 0; - else if (ra->kind->release_priority > rb->kind->release_priority) - return -1; - else - return 1; - } + return pg_cmp_u32(rb->kind->release_priority, ra->kind->release_priority); else if (ra->kind->release_phase > rb->kind->release_phase) return -1; else diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index f358dd22b9..8ee8a42781 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -16,6 +16,7 @@ #include "postgres_fe.h" #include "catalog/pg_class_d.h" +#include "common/int.h" #include "lib/binaryheap.h" #include "pg_backup_archiver.h" #include "pg_backup_utils.h" @@ -1504,9 +1505,5 @@ int_cmp(void *a, void *b, void *arg) int ai = (int) (intptr_t) a; int bi = (int) (intptr_t) b; - if (ai < bi) - return -1; - if (ai > bi) - return 1; - return 0; + return pg_cmp_s32(ai, bi); } diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c index af998f74d3..d65153de81 100644 --- a/src/bin/pg_upgrade/function.c +++ b/src/bin/pg_upgrade/function.c @@ -11,6 +11,7 @@ #include "access/transam.h" #include "catalog/pg_language_d.h" +#include "common/int.h" #include "pg_upgrade.h" /* @@ -29,17 +30,16 @@ library_name_compare(const void *p1, const void *p2) { const char *str1 = ((const LibraryInfo *) p1)->name; const char *str2 = ((const LibraryInfo *) p2)->name; - int slen1 = strlen(str1); - int slen2 = strlen(str2); + size_t slen1 = strlen(str1); + size_t slen2 = strlen(str2); int cmp = strcmp(str1, str2); if (slen1 != slen2) - return slen1 - slen2; + return pg_cmp_size(slen1, slen2); if (cmp != 0) return cmp; - else - return ((const LibraryInfo *) p1)->dbnum - - ((const LibraryInfo *) p2)->dbnum; + return pg_cmp_s32(((const LibraryInfo *) p1)->dbnum, + ((const LibraryInfo *) p2)->dbnum); } diff --git a/src/bin/pg_walsummary/pg_walsummary.c b/src/bin/pg_walsummary/pg_walsummary.c index 1341c83c69..485c72d939 100644 --- a/src/bin/pg_walsummary/pg_walsummary.c +++ b/src/bin/pg_walsummary/pg_walsummary.c @@ -16,6 +16,7 @@ #include <limits.h> #include "common/blkreftable.h" +#include "common/int.h" #include "common/logging.h" #include "fe_utils/option_utils.h" #include "lib/stringinfo.h" @@ -219,12 +220,7 @@ compare_block_numbers(const void *a, const void *b) BlockNumber aa = *(BlockNumber *) a; BlockNumber bb = *(BlockNumber *) b; - if (aa > bb) - return 1; - else if (aa == bb) - return 0; - else - return -1; + return pg_cmp_u32(aa, bb); } /* diff --git a/src/bin/psql/crosstabview.c b/src/bin/psql/crosstabview.c index c6116b7238..305ed4ab0a 100644 --- a/src/bin/psql/crosstabview.c +++ b/src/bin/psql/crosstabview.c @@ -8,6 +8,7 @@ #include "postgres_fe.h" #include "common.h" +#include "common/int.h" #include "common/logging.h" #include "crosstabview.h" #include "pqexpbuffer.h" @@ -709,5 +710,5 @@ pivotFieldCompare(const void *a, const void *b) static int rankCompare(const void *a, const void *b) { - return *((const int *) a) - *((const int *) b); + return pg_cmp_s32(*(const int *) a, *(const int *) b); } diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h index 51d0c74a6b..3013a44bae 100644 --- a/src/include/access/gin_private.h +++ b/src/include/access/gin_private.h @@ -14,6 +14,7 @@ #include "access/gin.h" #include "access/ginblock.h" #include "access/itup.h" +#include "common/int.h" #include "catalog/pg_am_d.h" #include "fmgr.h" #include "lib/rbtree.h" @@ -489,12 +490,7 @@ ginCompareItemPointers(ItemPointer a, ItemPointer b) uint64 ia = (uint64) GinItemPointerGetBlockNumber(a) << 32 | GinItemPointerGetOffsetNumber(a); uint64 ib = (uint64) GinItemPointerGetBlockNumber(b) << 32 | GinItemPointerGetOffsetNumber(b); - if (ia == ib) - return 0; - else if (ia > ib) - return 1; - else - return -1; + return pg_cmp_u64(ia, ib); } extern int ginTraverseLock(Buffer buffer, bool searchMode); -- 2.25.1