From 2458ca3bf6313fbef5f2169d62187522bacbf274 Mon Sep 17 00:00:00 2001 From: Nikita Malakhov Date: Sun, 31 Aug 2025 23:14:22 +0300 Subject: [PATCH] Introduce enum for BTStrategy with validation macro/function instead of each value defined by macro. --- src/backend/access/nbtree/nbtvalidate.c | 3 +-- src/backend/partitioning/partprune.c | 21 ++++++++++++---- src/include/access/stratnum.h | 33 +++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/backend/access/nbtree/nbtvalidate.c b/src/backend/access/nbtree/nbtvalidate.c index 817ad358f0ca..b863475599f2 100644 --- a/src/backend/access/nbtree/nbtvalidate.c +++ b/src/backend/access/nbtree/nbtvalidate.c @@ -140,8 +140,7 @@ btvalidate(Oid opclassoid) Form_pg_amop oprform = (Form_pg_amop) GETSTRUCT(oprtup); /* Check that only allowed strategy numbers exist */ - if (oprform->amopstrategy < 1 || - oprform->amopstrategy > BTMaxStrategyNumber) + if (!BTStrategyIsValid(oprform->amopstrategy)) { ereport(INFO, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c index 48a35f763e90..4792c614c3a4 100644 --- a/src/backend/partitioning/partprune.c +++ b/src/backend/partitioning/partprune.c @@ -1414,7 +1414,7 @@ gen_prune_steps_from_opexps(GeneratePruningStepsContext *context, { PartitionScheme part_scheme = context->rel->part_scheme; List *opsteps = NIL; - List *btree_clauses[BTMaxStrategyNumber + 1], + List *btree_clauses[BTNumOfStrategies], *hash_clauses[HTMaxStrategyNumber + 1]; int i; ListCell *lc; @@ -1509,11 +1509,22 @@ gen_prune_steps_from_opexps(GeneratePruningStepsContext *context, case PARTITION_STRATEGY_LIST: case PARTITION_STRATEGY_RANGE: { - List *eq_clauses = btree_clauses[BTEqualStrategyNumber]; - List *le_clauses = btree_clauses[BTLessEqualStrategyNumber]; - List *ge_clauses = btree_clauses[BTGreaterEqualStrategyNumber]; + List *eq_clauses = btree_clauses[BTEqualStrategy]; + List *le_clauses = btree_clauses[BTLessEqualStrategy]; + List *ge_clauses = btree_clauses[BTGreaterEqualStrategy]; int strat; +/* +typedef enum +{ + BTInvalidStrategy, + BTLessStrategy, + BTLessEqualStrategy, + BTEqualStrategy, + BTGreaterEqualStrategy, + BTGreaterStrategy +} BTStrategy; +*/ /* * For each clause under consideration for a given strategy, * we collect expressions from clauses for earlier keys, whose @@ -1526,7 +1537,7 @@ gen_prune_steps_from_opexps(GeneratePruningStepsContext *context, * combinations of expressions of different keys, which * get_steps_using_prefix takes care of for us. */ - for (strat = 1; strat <= BTMaxStrategyNumber; strat++) + for (strat = BTLessStrategy; strat < BTNumOfStrategies; strat++) { foreach(lc, btree_clauses[strat]) { diff --git a/src/include/access/stratnum.h b/src/include/access/stratnum.h index ee036d2b62fd..6c8042e12858 100644 --- a/src/include/access/stratnum.h +++ b/src/include/access/stratnum.h @@ -23,6 +23,39 @@ typedef uint16 StrategyNumber; #define InvalidStrategy ((StrategyNumber) 0) +typedef enum BTStrategy +{ + BTInvalidStrategy, + BTLessStrategy, + BTLessEqualStrategy, + BTEqualStrategy, + BTGreaterEqualStrategy, + BTGreaterStrategy, + BTNumOfStrategies +} BTStrategy; + +/* Macro check, like most such checks in Pg */ +#define BTStrategyIsValid(strat) \ + ((bool) (strat == BTLessStrategy || strat == BTLessEqualStrategy || strat == BTEqualStrategy || strat == BTGreaterEqualStrategy || strat == BTGreaterStrategy)) + +/* Static inline function check */ +static inline bool BTStrategyIsValidFunc(uint16 strat) +{ + switch(strat) + { + case BTLessStrategy: + case BTLessEqualStrategy: + case BTEqualStrategy: + case BTGreaterEqualStrategy: + case BTGreaterStrategy: + return true; + case BTInvalidStrategy: + case BTNumOfStrategies: + default: + return false; + } +} + /* * Strategy numbers for B-tree indexes. */