agora inbox for pgsql-hackers@postgresql.orghelp / color / mirror / Atom feed
[PATCH v3 4/7] Row pattern recognition patch (executor). 105+ messages / 2 participants [nested] [flat]
* [PATCH v3 4/7] Row pattern recognition patch (executor). @ 2023-07-26 10:49 Tatsuo Ishii <ishii@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Tatsuo Ishii @ 2023-07-26 10:49 UTC (permalink / raw) --- src/backend/executor/nodeWindowAgg.c | 701 ++++++++++++++++++++++++++- src/backend/utils/adt/windowfuncs.c | 38 +- src/include/catalog/pg_proc.dat | 6 + src/include/nodes/execnodes.h | 18 + src/include/windowapi.h | 8 + 5 files changed, 758 insertions(+), 13 deletions(-) diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 310ac23e3a..0586bf57d6 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -36,6 +36,7 @@ #include "access/htup_details.h" #include "catalog/objectaccess.h" #include "catalog/pg_aggregate.h" +#include "catalog/pg_collation_d.h" #include "catalog/pg_proc.h" #include "executor/executor.h" #include "executor/nodeWindowAgg.h" @@ -48,6 +49,7 @@ #include "utils/acl.h" #include "utils/builtins.h" #include "utils/datum.h" +#include "utils/fmgroids.h" #include "utils/expandeddatum.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -159,6 +161,14 @@ typedef struct WindowStatePerAggData bool restart; /* need to restart this agg in this cycle? */ } WindowStatePerAggData; +/* + * Map between Var attno in a target list and the parsed attno. + */ +typedef struct AttnoMap { + List *attno; /* att number in target list (list of AttNumber) */ + List *attnosyn; /* parsed att number (list of AttNumber) */ +} AttnoMap; + static void initialize_windowaggregate(WindowAggState *winstate, WindowStatePerFunc perfuncstate, WindowStatePerAgg peraggstate); @@ -182,8 +192,9 @@ static void begin_partition(WindowAggState *winstate); static void spool_tuples(WindowAggState *winstate, int64 pos); static void release_partition(WindowAggState *winstate); -static int row_is_in_frame(WindowAggState *winstate, int64 pos, +static int row_is_in_frame(WindowAggState *winstate, int64 pos, TupleTableSlot *slot); + static void update_frameheadpos(WindowAggState *winstate); static void update_frametailpos(WindowAggState *winstate); static void update_grouptailpos(WindowAggState *winstate); @@ -195,9 +206,19 @@ static Datum GetAggInitVal(Datum textInitVal, Oid transtype); static bool are_peers(WindowAggState *winstate, TupleTableSlot *slot1, TupleTableSlot *slot2); -static bool window_gettupleslot(WindowObject winobj, int64 pos, - TupleTableSlot *slot); +static void attno_map(Node *node, AttnoMap *map); +static bool attno_map_walker(Node *node, void *context); +static int row_is_in_reduced_frame(WindowObject winobj, int64 pos); + +static int64 evaluate_pattern(WindowObject winobj, int64 current_pos, + char *vname, StringInfo encoded_str, bool *result); + +static bool get_slots(WindowObject winobj, int64 current_pos); + +static int search_str_set(char *pattern, StringInfo *str_set, int set_size); +static void search_str_set_recurse(char *pattern, StringInfo *str_set, int set_size, int set_index, + char *encoded_str, int *resultlen); /* * initialize_windowaggregate @@ -673,6 +694,9 @@ eval_windowaggregates(WindowAggState *winstate) WindowObject agg_winobj; TupleTableSlot *agg_row_slot; TupleTableSlot *temp_slot; + bool reduced_frame_set; + bool check_reduced_frame; + int num_rows_in_reduced_frame; numaggs = winstate->numaggs; if (numaggs == 0) @@ -790,6 +814,7 @@ eval_windowaggregates(WindowAggState *winstate) (winstate->frameOptions & FRAMEOPTION_EXCLUSION) || winstate->aggregatedupto <= winstate->frameheadpos) { + elog(DEBUG1, "peraggstate->restart is set"); peraggstate->restart = true; numaggs_restart++; } @@ -861,8 +886,10 @@ eval_windowaggregates(WindowAggState *winstate) * If we created a mark pointer for aggregates, keep it pushed up to frame * head, so that tuplestore can discard unnecessary rows. */ +#ifdef NOT_USED if (agg_winobj->markptr >= 0) WinSetMarkPosition(agg_winobj, winstate->frameheadpos); +#endif /* * Now restart the aggregates that require it. @@ -919,6 +946,10 @@ eval_windowaggregates(WindowAggState *winstate) ExecClearTuple(agg_row_slot); } + reduced_frame_set = false; + check_reduced_frame = false; + num_rows_in_reduced_frame = 0; + /* * Advance until we reach a row not in frame (or end of partition). * @@ -930,12 +961,18 @@ eval_windowaggregates(WindowAggState *winstate) { int ret; + elog(DEBUG1, "===== loop in frame starts: " INT64_FORMAT, winstate->aggregatedupto); + /* Fetch next row if we didn't already */ if (TupIsNull(agg_row_slot)) { if (!window_gettupleslot(agg_winobj, winstate->aggregatedupto, agg_row_slot)) + { + if (check_reduced_frame) + winstate->aggregatedupto--; break; /* must be end of partition */ + } } /* @@ -944,10 +981,47 @@ eval_windowaggregates(WindowAggState *winstate) */ ret = row_is_in_frame(winstate, winstate->aggregatedupto, agg_row_slot); if (ret < 0) + { + if (winstate->patternVariableList != NIL && check_reduced_frame) + winstate->aggregatedupto--; break; + } if (ret == 0) goto next_tuple; + if (winstate->patternVariableList != NIL) + { + if (!reduced_frame_set) + { + num_rows_in_reduced_frame = row_is_in_reduced_frame(winstate->agg_winobj, winstate->aggregatedupto); + reduced_frame_set = true; + elog(DEBUG1, "set num_rows_in_reduced_frame: %d pos: " INT64_FORMAT, + num_rows_in_reduced_frame, winstate->aggregatedupto); + + if (num_rows_in_reduced_frame <= 0) + break; + + else if (num_rows_in_reduced_frame > 0) + check_reduced_frame = true; + } + + if (check_reduced_frame) + { + elog(DEBUG1, "decrease num_rows_in_reduced_frame: %d pos: " INT64_FORMAT, + num_rows_in_reduced_frame, winstate->aggregatedupto); + num_rows_in_reduced_frame--; + if (num_rows_in_reduced_frame < 0) + { + /* + * No more rows remain in the reduced frame. Finish + * accumulating row into the aggregates. + */ + winstate->aggregatedupto--; + break; + } + } + } + /* Set tuple context for evaluation of aggregate arguments */ winstate->tmpcontext->ecxt_outertuple = agg_row_slot; @@ -976,6 +1050,8 @@ next_tuple: ExecClearTuple(agg_row_slot); } + elog(DEBUG1, "===== break loop in frame starts: " INT64_FORMAT, winstate->aggregatedupto); + /* The frame's end is not supposed to move backwards, ever */ Assert(aggregatedupto_nonrestarted <= winstate->aggregatedupto); @@ -2053,6 +2129,8 @@ ExecWindowAgg(PlanState *pstate) CHECK_FOR_INTERRUPTS(); + elog(DEBUG1, "ExecWindowAgg called. pos: " INT64_FORMAT , winstate->currentpos); + if (winstate->status == WINDOWAGG_DONE) return NULL; @@ -2388,6 +2466,12 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) TupleDesc scanDesc; ListCell *l; + TargetEntry *te; + Expr *expr; + Var *var; + int nargs; + AttnoMap attnomap; + /* check for unsupported flags */ Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK))); @@ -2483,6 +2567,16 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) winstate->temp_slot_2 = ExecInitExtraTupleSlot(estate, scanDesc, &TTSOpsMinimalTuple); + winstate->prev_slot = ExecInitExtraTupleSlot(estate, scanDesc, + &TTSOpsMinimalTuple); + + winstate->next_slot = ExecInitExtraTupleSlot(estate, scanDesc, + &TTSOpsMinimalTuple); + + winstate->null_slot = ExecInitExtraTupleSlot(estate, scanDesc, + &TTSOpsMinimalTuple); + winstate->null_slot = ExecStoreAllNullTuple(winstate->null_slot); + /* * create frame head and tail slots only if needed (must create slots in * exactly the same cases that update_frameheadpos and update_frametailpos @@ -2667,6 +2761,69 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) winstate->inRangeAsc = node->inRangeAsc; winstate->inRangeNullsFirst = node->inRangeNullsFirst; + /* Set up SKIP TO type */ + winstate->rpSkipTo = node->rpSkipTo; + /* Set up row pattern recognition PATTERN clause */ + winstate->patternVariableList = node->patternVariable; + winstate->patternRegexpList = node->patternRegexp; + + /* Set up row pattern recognition DEFINE clause */ + + /* + * Collect mapping between varattno and varattnosyn in the targetlist. + * XXX: For now we only check RPR's argument. Eventually we have to + * recurse the targetlist to find out all mappings in Var nodes. + */ + attnomap.attno = NIL; + attnomap.attnosyn = NIL; + + foreach (l, node->plan.targetlist) + { + te = lfirst(l); + if (IsA(te->expr, WindowFunc)) + { + WindowFunc *func = (WindowFunc *)te->expr; + + /* sanity check */ + nargs = list_length(func->args); + if (nargs != 1) + continue; + + expr = (Expr *) lfirst(list_head(func->args)); + if (!IsA(expr, Var)) + continue; + + var = (Var *)expr; + elog(DEBUG1, "resname: %s varattno: %d varattnosyn: %d", + te->resname, var->varattno, var->varattnosyn); + attnomap.attno = lappend_int(attnomap.attno, var->varattno); + attnomap.attnosyn = lappend_int(attnomap.attnosyn, var->varattnosyn); + } + } + + winstate->defineVariableList = NIL; + winstate->defineClauseList = NIL; + if (node->defineClause != NIL) + { + foreach(l, node->defineClause) + { + char *name; + ExprState *exps; + + te = lfirst(l); + name = te->resname; + expr = te->expr; + + elog(DEBUG1, "defineVariable name: %s", name); + winstate->defineVariableList = lappend(winstate->defineVariableList, + makeString(pstrdup(name))); + /* tweak expr so that it referes to outer slot */ + attno_map((Node *)expr, &attnomap); + exps = ExecInitExpr(expr, (PlanState *) winstate); + winstate->defineClauseList = lappend(winstate->defineClauseList, exps); + } + } + winstate->all_first = true; winstate->partition_spooled = false; winstate->more_partitions = false; @@ -2674,6 +2831,77 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) return winstate; } +/* + * Rewrite Var node's varattno to the varattno which is used in the target + * list using AttnoMap. We also rewrite varno so that it sees outer tuple + * (PREV) or inner tuple (NEXT). + */ +static void +attno_map(Node *node, AttnoMap *map) +{ + (void) expression_tree_walker(node, attno_map_walker, (void *) map); +} + +static bool +attno_map_walker(Node *node, void *context) +{ + FuncExpr *func; + int nargs; + Expr *expr; + Var *var; + AttnoMap *attnomap; + ListCell *lc1, *lc2; + + if (node == NULL) + return false; + + attnomap = (AttnoMap *) context; + + if (IsA(node, FuncExpr)) + { + func = (FuncExpr *)node; + + if (func->funcid == F_PREV || func->funcid == F_NEXT) + { + /* sanity check */ + nargs = list_length(func->args); + if (list_length(func->args) != 1) + elog(ERROR, "PREV/NEXT must have 1 argument but function %d has %d args", func->funcid, nargs); + + expr = (Expr *) lfirst(list_head(func->args)); + if (!IsA(expr, Var)) + elog(ERROR, "PREV/NEXT's arg is not Var"); /* XXX: is it possible that arg type is Const? */ + var = (Var *)expr; + + if (func->funcid == F_PREV) + var->varno = OUTER_VAR; + else + var->varno = INNER_VAR; + } + return expression_tree_walker(node, attno_map_walker, (void *) context); + } + else if (IsA(node, Var)) + { + var = (Var *)node; + + elog(DEBUG1, "original varno: %d varattno: %d", var->varno, var->varattno); + + forboth(lc1, attnomap->attno, lc2, attnomap->attnosyn) + { + int attno = lfirst_int(lc1); + int attnosyn = lfirst_int(lc2); + + elog(DEBUG1, "walker: varattno: %d varattnosyn: %d",attno, attnosyn); + if (var->varattno == attnosyn) + { + elog(DEBUG1, "loc: %d rewrite varattno from: %d to %d", var->location, attnosyn, attno); + var->varattno = attno; + } + } + } + return expression_tree_walker(node, attno_map_walker, (void *) context); +} + /* ----------------- * ExecEndWindowAgg * ----------------- @@ -2691,6 +2919,8 @@ ExecEndWindowAgg(WindowAggState *node) ExecClearTuple(node->agg_row_slot); ExecClearTuple(node->temp_slot_1); ExecClearTuple(node->temp_slot_2); + ExecClearTuple(node->prev_slot); + ExecClearTuple(node->next_slot); if (node->framehead_slot) ExecClearTuple(node->framehead_slot); if (node->frametail_slot) @@ -2740,6 +2970,8 @@ ExecReScanWindowAgg(WindowAggState *node) ExecClearTuple(node->agg_row_slot); ExecClearTuple(node->temp_slot_1); ExecClearTuple(node->temp_slot_2); + ExecClearTuple(node->prev_slot); + ExecClearTuple(node->next_slot); if (node->framehead_slot) ExecClearTuple(node->framehead_slot); if (node->frametail_slot) @@ -3080,7 +3312,7 @@ are_peers(WindowAggState *winstate, TupleTableSlot *slot1, * * Returns true if successful, false if no such row */ -static bool +bool window_gettupleslot(WindowObject winobj, int64 pos, TupleTableSlot *slot) { WindowAggState *winstate = winobj->winstate; @@ -3100,7 +3332,7 @@ window_gettupleslot(WindowObject winobj, int64 pos, TupleTableSlot *slot) return false; if (pos < winobj->markpos) - elog(ERROR, "cannot fetch row before WindowObject's mark position"); + elog(ERROR, "cannot fetch row: " INT64_FORMAT " before WindowObject's mark position: " INT64_FORMAT, pos, winobj->markpos ); oldcontext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_query_memory); @@ -3420,14 +3652,54 @@ WinGetFuncArgInFrame(WindowObject winobj, int argno, WindowAggState *winstate; ExprContext *econtext; TupleTableSlot *slot; - int64 abs_pos; - int64 mark_pos; Assert(WindowObjectIsValid(winobj)); winstate = winobj->winstate; econtext = winstate->ss.ps.ps_ExprContext; slot = winstate->temp_slot_1; + if (WinGetSlotInFrame(winobj, slot, + relpos, seektype, set_mark, + isnull, isout) == 0) + { + econtext->ecxt_outertuple = slot; + return ExecEvalExpr((ExprState *) list_nth(winobj->argstates, argno), + econtext, isnull); + } + + if (isout) + *isout = true; + *isnull = true; + return (Datum) 0; +} + +/* + * WinGetSlotInFrame + * slot: TupleTableSlot to store the result + * relpos: signed rowcount offset from the seek position + * seektype: WINDOW_SEEK_HEAD or WINDOW_SEEK_TAIL + * set_mark: If the row is found/in frame and set_mark is true, the mark is + * moved to the row as a side-effect. + * isnull: output argument, receives isnull status of result + * isout: output argument, set to indicate whether target row position + * is out of frame (can pass NULL if caller doesn't care about this) + * + * Returns 0 if we successfullt got the slot. false if out of frame. + * (also isout is set) + */ +int +WinGetSlotInFrame(WindowObject winobj, TupleTableSlot *slot, + int relpos, int seektype, bool set_mark, + bool *isnull, bool *isout) +{ + WindowAggState *winstate; + int64 abs_pos; + int64 mark_pos; + int num_reduced_frame; + + Assert(WindowObjectIsValid(winobj)); + winstate = winobj->winstate; + switch (seektype) { case WINDOW_SEEK_CURRENT: @@ -3494,6 +3766,12 @@ WinGetFuncArgInFrame(WindowObject winobj, int argno, winstate->frameOptions); break; } + num_reduced_frame = row_is_in_reduced_frame(winobj, winstate->frameheadpos); + if (num_reduced_frame < 0) + goto out_of_frame; + else if (num_reduced_frame > 0) + if (relpos >= num_reduced_frame) + goto out_of_frame; break; case WINDOW_SEEK_TAIL: /* rejecting relpos > 0 is easy and simplifies code below */ @@ -3565,6 +3843,12 @@ WinGetFuncArgInFrame(WindowObject winobj, int argno, mark_pos = 0; /* keep compiler quiet */ break; } + + num_reduced_frame = row_is_in_reduced_frame(winobj, winstate->frameheadpos + relpos); + if (num_reduced_frame < 0) + goto out_of_frame; + else if (num_reduced_frame > 0) + abs_pos = winstate->frameheadpos + relpos + num_reduced_frame - 1; break; default: elog(ERROR, "unrecognized window seek type: %d", seektype); @@ -3583,15 +3867,13 @@ WinGetFuncArgInFrame(WindowObject winobj, int argno, *isout = false; if (set_mark) WinSetMarkPosition(winobj, mark_pos); - econtext->ecxt_outertuple = slot; - return ExecEvalExpr((ExprState *) list_nth(winobj->argstates, argno), - econtext, isnull); + return 0; out_of_frame: if (isout) *isout = true; *isnull = true; - return (Datum) 0; + return -1; } /* @@ -3622,3 +3904,400 @@ WinGetFuncArgCurrent(WindowObject winobj, int argno, bool *isnull) return ExecEvalExpr((ExprState *) list_nth(winobj->argstates, argno), econtext, isnull); } + +WindowAggState * +WinGetAggState(WindowObject winobj) +{ + return winobj->winstate; +} + +/* + * row_is_in_reduced_frame + * Determine whether a row is in the current row's reduced window frame according + * to row pattern matching + * + * The row must has been already determined that it is in a full window frame + * and fetched it into slot. + * + * Returns: + * = 0, RPR is not defined. + * >0, if the row is the first in the reduced frame. Return the number of rows in the reduced frame. + * -1, if the row is unmatched row + * -2, if the row is in the reduced frame but needed to be skipped because of + * AFTER MATCH SKIP PAST LAST ROW + */ +static +int row_is_in_reduced_frame(WindowObject winobj, int64 pos) +{ + WindowAggState *winstate = winobj->winstate; + ListCell *lc1, *lc2; + bool expression_result; + int num_matched_rows; + int64 original_pos; + bool anymatch; + StringInfo encoded_str; + StringInfo pattern_str = makeStringInfo(); + + /* + * Array of pattern variables evaluted to true. + * Each character corresponds to pattern variable. + * Example: + * str_set[0] = "AB"; + * str_set[1] = "AC"; + * In this case at row 0 A and B are true, and A and C are true in row 1. + */ + #define ENCODED_STR_ARRAY_ALLOC_SIZE 128 + StringInfo *str_set = NULL; + int str_set_index; + int str_set_size; + + if (winstate->patternVariableList == NIL) + { + /* + * RPR is not defined. Assume that we are always in the the reduced + * window frame. + */ + return 0; + } + + /* save original pos */ + original_pos = pos; + + /* + * Check whether the row speicied by pos is in the reduced frame. The + * second and subsequent rows need to be recognized as "unmatched" rows if + * AFTER MATCH SKIP PAST LAST ROW is defined. + */ + if (winstate->rpSkipTo == ST_PAST_LAST_ROW && + pos > winstate->headpos_in_reduced_frame && + pos < (winstate->headpos_in_reduced_frame + winstate->num_rows_in_reduced_frame)) + return -2; + + /* + * Loop over until none of pattern matches or encounters end of frame. + */ + for (;;) + { + int64 result_pos = -1; + + /* + * Loop over each PATTERN variable. + */ + anymatch = false; + encoded_str = makeStringInfo(); + + forboth(lc1, winstate->patternVariableList, lc2, winstate->patternRegexpList) + { + char *vname = strVal(lfirst(lc1)); + char *quantifier = strVal(lfirst(lc2)); + + elog(DEBUG1, "pos: " INT64_FORMAT " pattern vname: %s quantifier: %s", pos, vname, quantifier); + + expression_result = false; + + /* evaluate row pattern against current row */ + result_pos = evaluate_pattern(winobj, pos, vname, encoded_str, &expression_result); + if (expression_result) + { + elog(DEBUG1, "expression result is true"); + anymatch = true; + } + + /* + * If out of frame, we are done. + */ + if (result_pos < 0) + break; + } + + if (!anymatch) + { + /* none of patterns matched. */ + break; + } + + /* build encoded string array */ + if (str_set == NULL) + { + str_set_index = 0; + str_set_size = ENCODED_STR_ARRAY_ALLOC_SIZE * sizeof(StringInfo); + str_set = palloc(str_set_size); + } + + str_set[str_set_index++] = encoded_str; + + elog(DEBUG1, "pos: " INT64_FORMAT " str_set_index: %d encoded_str: %s", pos, str_set_index, encoded_str->data); + + if (str_set_index >= str_set_size) + { + str_set_size *= 2; + str_set = repalloc(str_set, str_set_size); + } + + /* move to next row */ + pos++; + + if (result_pos < 0) + { + /* out of frame */ + break; + } + } + + if (str_set == NULL) + { + /* no matches found in the first row */ + return -1; + } + + elog(DEBUG1, "pos: " INT64_FORMAT " encoded_str: %s", pos, encoded_str->data); + + /* build regular expression */ + pattern_str = makeStringInfo(); + appendStringInfoChar(pattern_str, '^'); + forboth(lc1, winstate->patternVariableList, lc2, winstate->patternRegexpList) + { + char *vname = strVal(lfirst(lc1)); + char *quantifier = strVal(lfirst(lc2)); + + appendStringInfoChar(pattern_str, vname[0]); + if (quantifier[0]) + appendStringInfoChar(pattern_str, quantifier[0]); + elog(DEBUG1, "vname: %s quantifier: %s", vname, quantifier); + } + + elog(DEBUG1, "pos: " INT64_FORMAT " pattern: %s", pos, pattern_str->data); + + /* look for matching pattern variable sequence */ + num_matched_rows = search_str_set(pattern_str->data, str_set, str_set_index); + if (num_matched_rows <= 0) + return -1; + + /* + * We are at the first row in the reduced frame. Save the number of + * matched rows as the number of rows in the reduced frame. + */ + winstate->headpos_in_reduced_frame = original_pos; + winstate->num_rows_in_reduced_frame = num_matched_rows; + + return num_matched_rows; +} + +/* + * search set of encode_str. + * set_size: size of set_str array. + */ +static +int search_str_set(char *pattern, StringInfo *str_set, int set_size) +{ + char *encoded_str = palloc0(set_size+1); + int resultlen = 0; + + search_str_set_recurse(pattern, str_set, set_size, 0, encoded_str, &resultlen); + elog(DEBUG1, "search_str_set returns %d", resultlen); + return resultlen; +} + +static +void search_str_set_recurse(char *pattern, StringInfo *str_set, int set_size, int set_index, char *encoded_str, int *resultlen) +{ + char *p; + + if (set_index >= set_size) + { + Datum d; + text *res; + char *substr; + + /* + * We first perform pattern matching using regexp_instr, then call + * textregexsubstr to get matched substring to know how log the + * matched string is. That is the number of rows in the reduced window + * frame. The reason why we can't call textregexsubstr is, it error + * out if pattern is not match. + */ + if (DatumGetInt32(DirectFunctionCall2Coll(regexp_instr, DEFAULT_COLLATION_OID, + PointerGetDatum(cstring_to_text(encoded_str)), + PointerGetDatum(cstring_to_text(pattern)))) > 0) + { + d = DirectFunctionCall2Coll(textregexsubstr, + DEFAULT_COLLATION_OID, + PointerGetDatum(cstring_to_text(encoded_str)), + PointerGetDatum(cstring_to_text(pattern))); + if (d != 0) + { + int len; + + res = DatumGetTextPP(d); + substr = text_to_cstring(res); + len = strlen(substr); + if (len > *resultlen) + /* remember the longest match */ + *resultlen = len; + } + } + return; + } + + p = str_set[set_index]->data; + while (*p) + { + encoded_str[set_index] = *p; + p++; + search_str_set_recurse(pattern, str_set, set_size, set_index + 1, encoded_str, resultlen); + } +} + + +/* + * Evaluate expression associated with PATTERN variable vname. + * relpos is relative row position in a frame (starting from 0). + * "quantifier" is the quatifier part of the PATTERN regular expression. + * Currently only '+' is allowed. + * result is out paramater representing the expression evaluation result + * is true of false. + * Return values are: + * >=0: the last match absolute row position + * other wise out of frame. + */ +static +int64 evaluate_pattern(WindowObject winobj, int64 current_pos, + char *vname, StringInfo encoded_str, bool *result) +{ + WindowAggState *winstate = winobj->winstate; + ExprContext *econtext = winstate->ss.ps.ps_ExprContext; + ListCell *lc1, *lc2; + ExprState *pat; + Datum eval_result; + bool out_of_frame = false; + bool isnull; + + forboth (lc1, winstate->defineVariableList, lc2, winstate->defineClauseList) + { + char *name = strVal(lfirst(lc1)); + + if (strcmp(vname, name)) + continue; + + /* set expression to evaluate */ + pat = lfirst(lc2); + + /* get current, previous and next tuples */ + if (!get_slots(winobj, current_pos)) + { + out_of_frame = true; + } + else + { + /* evaluate the expression */ + eval_result = ExecEvalExpr(pat, econtext, &isnull); + if (isnull) + { + /* expression is NULL */ + elog(DEBUG1, "expression for %s is NULL at row: " INT64_FORMAT, vname, current_pos); + *result = false; + } + else + { + if (!DatumGetBool(eval_result)) + { + /* expression is false */ + elog(DEBUG1, "expression for %s is false at row: " INT64_FORMAT, vname, current_pos); + *result = false; + } + else + { + /* expression is true */ + elog(DEBUG1, "expression for %s is true at row: " INT64_FORMAT, vname, current_pos); + appendStringInfoChar(encoded_str, vname[0]); + *result = true; + } + } + break; + } + + if (out_of_frame) + { + *result = false; + return -1; + } + } + return current_pos; +} + +/* + * Get current, previous and next tuples. + * Returns false if current row is out of partition/full frame. + */ +static +bool get_slots(WindowObject winobj, int64 current_pos) +{ + WindowAggState *winstate = winobj->winstate; + TupleTableSlot *slot; + int ret; + ExprContext *econtext; + + econtext = winstate->ss.ps.ps_ExprContext; + + /* set up current row tuple slot */ + slot = winstate->temp_slot_1; + if (!window_gettupleslot(winobj, current_pos, slot)) + { + elog(DEBUG1, "current row is out of partition at:" INT64_FORMAT, current_pos); + return false; + + ret = row_is_in_frame(winstate, current_pos, slot); + if (ret <= 0) + { + elog(DEBUG1, "current row is out of frame at: " INT64_FORMAT, current_pos); + return false; + } + } + econtext->ecxt_scantuple = slot; + + /* for PREV */ + if (current_pos > 0) + { + slot = winstate->prev_slot; + if (!window_gettupleslot(winobj, current_pos - 1, slot)) + { + elog(DEBUG1, "previous row is out of partition at: " INT64_FORMAT, current_pos - 1); + econtext->ecxt_outertuple = winstate->null_slot; + } + else + { + ret = row_is_in_frame(winstate, current_pos - 1, slot); + if (ret <= 0) + { + elog(DEBUG1, "previous row is out of frame at: " INT64_FORMAT, current_pos - 1); + econtext->ecxt_outertuple = winstate->null_slot; + } + else + { + econtext->ecxt_outertuple = slot; + } + } + } + else + econtext->ecxt_outertuple = winstate->null_slot; + + /* for NEXT */ + slot = winstate->next_slot; + if (!window_gettupleslot(winobj, current_pos + 1, slot)) + { + elog(DEBUG1, "next row is out of partiton at: " INT64_FORMAT, current_pos + 1); + econtext->ecxt_innertuple = winstate->null_slot; + } + else + { + ret = row_is_in_frame(winstate, current_pos + 1, slot); + if (ret <= 0) + { + elog(DEBUG1, "next row is out of frame at: " INT64_FORMAT, current_pos + 1); + econtext->ecxt_innertuple = winstate->null_slot; + } + else + econtext->ecxt_innertuple = slot; + } + return true; +} diff --git a/src/backend/utils/adt/windowfuncs.c b/src/backend/utils/adt/windowfuncs.c index b87a624fb2..e4cab36ec9 100644 --- a/src/backend/utils/adt/windowfuncs.c +++ b/src/backend/utils/adt/windowfuncs.c @@ -13,6 +13,9 @@ */ #include "postgres.h" +#include "catalog/pg_collation_d.h" +#include "executor/executor.h" +#include "nodes/execnodes.h" #include "nodes/supportnodes.h" #include "utils/builtins.h" #include "windowapi.h" @@ -36,11 +39,19 @@ typedef struct int64 remainder; /* (total rows) % (bucket num) */ } ntile_context; +/* + * rpr process information. + * Used for AFTER MATCH SKIP PAST LAST ROW + */ +typedef struct SkipContext +{ + int64 pos; /* last row absolute position */ +} SkipContext; + static bool rank_up(WindowObject winobj); static Datum leadlag_common(FunctionCallInfo fcinfo, bool forward, bool withoffset, bool withdefault); - /* * utility routine for *_rank functions. */ @@ -673,7 +684,7 @@ window_last_value(PG_FUNCTION_ARGS) bool isnull; result = WinGetFuncArgInFrame(winobj, 0, - 0, WINDOW_SEEK_TAIL, true, + 0, WINDOW_SEEK_TAIL, false, &isnull, NULL); if (isnull) PG_RETURN_NULL(); @@ -713,3 +724,26 @@ window_nth_value(PG_FUNCTION_ARGS) PG_RETURN_DATUM(result); } + +/* + * prev + * Dummy function to invoke RPR's navigation operator "PREV". + * This is *not* a window function. + */ +Datum +window_prev(PG_FUNCTION_ARGS) +{ + PG_RETURN_DATUM(PG_GETARG_DATUM(0)); +} + +/* + * next + * Dummy function to invoke RPR's navigation operation "NEXT". + * This is *not* a window function. + */ +Datum +window_next(PG_FUNCTION_ARGS) +{ + PG_RETURN_DATUM(PG_GETARG_DATUM(0)); +} + diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 6996073989..fa100b2665 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -10397,6 +10397,12 @@ { oid => '3114', descr => 'fetch the Nth row value', proname => 'nth_value', prokind => 'w', prorettype => 'anyelement', proargtypes => 'anyelement int4', prosrc => 'window_nth_value' }, +{ oid => '6122', descr => 'previous value', + proname => 'prev', provolatile => 's', prorettype => 'anyelement', + proargtypes => 'anyelement', prosrc => 'window_prev' }, +{ oid => '6123', descr => 'next value', + proname => 'next', provolatile => 's', prorettype => 'anyelement', + proargtypes => 'anyelement', prosrc => 'window_next' }, # functions for range types { oid => '3832', descr => 'I/O', diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index cb714f4a19..4fd3bd1a93 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -2519,6 +2519,14 @@ typedef struct WindowAggState int64 groupheadpos; /* current row's peer group head position */ int64 grouptailpos; /* " " " " tail position (group end+1) */ + /* these fields are used in Row pattern recognition: */ + RPSkipTo rpSkipTo; /* Row Pattern Skip To type */ + List *patternVariableList; /* list of row pattern variables names (list of String) */ + List *patternRegexpList; /* list of row pattern regular expressions ('+' or ''. list of String) */ + List *defineVariableList; /* list of row pattern definition variables (list of String) */ + List *defineClauseList; /* expression for row pattern definition + * search conditions ExprState list */ + MemoryContext partcontext; /* context for partition-lifespan data */ MemoryContext aggcontext; /* shared context for aggregate working data */ MemoryContext curaggcontext; /* current aggregate's working data */ @@ -2555,6 +2563,16 @@ typedef struct WindowAggState TupleTableSlot *agg_row_slot; TupleTableSlot *temp_slot_1; TupleTableSlot *temp_slot_2; + + /* temporary slots for RPR */ + TupleTableSlot *prev_slot; /* PREV row navigation operator */ + TupleTableSlot *next_slot; /* NEXT row navigation operator */ + TupleTableSlot *null_slot; /* all NULL slot */ + + /* head of the reduced window frame */ + int64 headpos_in_reduced_frame; + /* number of rows in the reduced window frame */ + int64 num_rows_in_reduced_frame; } WindowAggState; /* ---------------- diff --git a/src/include/windowapi.h b/src/include/windowapi.h index b8c2c565d1..1e292648e9 100644 --- a/src/include/windowapi.h +++ b/src/include/windowapi.h @@ -58,7 +58,15 @@ extern Datum WinGetFuncArgInFrame(WindowObject winobj, int argno, int relpos, int seektype, bool set_mark, bool *isnull, bool *isout); +extern int WinGetSlotInFrame(WindowObject winobj, TupleTableSlot *slot, + int relpos, int seektype, bool set_mark, + bool *isnull, bool *isout); + extern Datum WinGetFuncArgCurrent(WindowObject winobj, int argno, bool *isnull); +extern WindowAggState *WinGetAggState(WindowObject winobj); + +extern bool window_gettupleslot(WindowObject winobj, int64 pos, TupleTableSlot *slot); + #endif /* WINDOWAPI_H */ -- 2.25.1 ----Next_Part(Wed_Jul_26_21_21_34_2023_317)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="v3-0005-Row-pattern-recognition-patch-docs.patch" ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
* [PATCH v8 3/3] Use new overflow-aware integer comparison functions. @ 2024-02-15 23:28 Nathan Bossart <nathan@postgresql.org> 0 siblings, 0 replies; 105+ messages in thread From: Nathan Bossart @ 2024-02-15 23:28 UTC (permalink / raw) 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 --AhhlLboLdkugWU4S-- ^ permalink raw reply [nested|flat] 105+ messages in thread
end of thread, other threads:[~2024-02-15 23:28 UTC | newest] Thread overview: 105+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2023-07-26 10:49 [PATCH v3 4/7] Row pattern recognition patch (executor). Tatsuo Ishii <ishii@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org> 2024-02-15 23:28 [PATCH v8 3/3] Use new overflow-aware integer comparison functions. Nathan Bossart <nathan@postgresql.org>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox