v3-0001-poc-get-rid-of-magic-numbers.patch
application/octet-stream
Filename: v3-0001-poc-get-rid-of-magic-numbers.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v3-0001
Subject: Introduce enum for BTStrategy with validation macro/function instead of each value defined by macro.
| File | + | − |
|---|---|---|
| src/backend/access/nbtree/nbtvalidate.c | 1 | 2 |
| src/backend/partitioning/partprune.c | 16 | 5 |
| src/include/access/stratnum.h | 33 | 0 |
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