From 7d0440cba17bfa22ef8a2e790c0208e6d963d57f Mon Sep 17 00:00:00 2001
From: Nikita Malakhov <n.malakhov@postgrespro.ru>
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 817ad358f0c..b863475599f 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 48a35f763e9..4792c614c3a 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 ee036d2b62f..6c8042e1285 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.
  */
-- 
2.34.1

