nocfbot-0035-Use-Max-Min-macros-RPR-extremum.txt
text/plain
Filename: nocfbot-0035-Use-Max-Min-macros-RPR-extremum.txt
Type: text/plain
Part: 34
Message:
Re: Row pattern recognition
From c4d1fab1046b2f1d5c60ac71c0e139f0bc5eabce Mon Sep 17 00:00:00 2001
From: Henson Choi <assam258@gmail.com>
Date: Sat, 2 May 2026 00:46:05 +0900
Subject: [PATCH 35/40] Use Max()/Min() macros for RPR extremum accumulation
The RPR planner and executor accumulated extremum values (max
backward reach, min forward offset, NFA state/context high-water
marks, length statistics) with hand-written
"if (X > current) current = X" idioms. Replace these with the
existing Max()/Min() macros from c.h, matching the convention used
elsewhere in the codebase.
Six Max() sites and five Min() sites are converted across
createplan.c (nav_offset_walker), nodeWindowAgg.c
(eval_nav_max_offset_walker, eval_nav_first_offset_walker,
ExecWindowAgg navmark update), and execRPR.c (NFA state/context
allocators and length stats updater). Behavior is unchanged; all
operands are simple struct members or local variables, so the
macro's double-evaluation caveat does not apply.
---
src/backend/executor/execRPR.c | 14 ++++++--------
src/backend/executor/nodeWindowAgg.c | 9 +++------
src/backend/optimizer/plan/createplan.c | 16 ++++------------
3 files changed, 13 insertions(+), 26 deletions(-)
diff --git a/src/backend/executor/execRPR.c b/src/backend/executor/execRPR.c
index 7ba7b6fb672..84f09093b4b 100644
--- a/src/backend/executor/execRPR.c
+++ b/src/backend/executor/execRPR.c
@@ -1789,8 +1789,8 @@ nfa_state_alloc(WindowAggState *winstate)
/* Update statistics */
winstate->nfaStatesActive++;
winstate->nfaStatesTotalCreated++;
- if (winstate->nfaStatesActive > winstate->nfaStatesMax)
- winstate->nfaStatesMax = winstate->nfaStatesActive;
+ winstate->nfaStatesMax = Max(winstate->nfaStatesMax,
+ winstate->nfaStatesActive);
return state;
}
@@ -2001,8 +2001,8 @@ nfa_context_alloc(WindowAggState *winstate)
/* Update statistics */
winstate->nfaContextsActive++;
winstate->nfaContextsTotalCreated++;
- if (winstate->nfaContextsActive > winstate->nfaContextsMax)
- winstate->nfaContextsMax = winstate->nfaContextsActive;
+ winstate->nfaContextsMax = Max(winstate->nfaContextsMax,
+ winstate->nfaContextsActive);
return ctx;
}
@@ -2046,10 +2046,8 @@ nfa_update_length_stats(int64 count, NFALengthStats *stats, int64 newLen)
}
else
{
- if (newLen < stats->min)
- stats->min = newLen;
- if (newLen > stats->max)
- stats->max = newLen;
+ stats->min = Min(stats->min, newLen);
+ stats->max = Max(stats->max, newLen);
}
stats->total += newLen;
}
diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 02f17e5472c..89e66c73735 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -2536,8 +2536,7 @@ ExecWindowAgg(PlanState *pstate)
+ winstate->navFirstOffset;
else
firstreach = 0;
- if (firstreach < navmarkpos)
- navmarkpos = firstreach;
+ navmarkpos = Min(navmarkpos, firstreach);
}
if (navmarkpos > winstate->nav_winobj->markpos)
@@ -4007,8 +4006,7 @@ eval_nav_max_offset_walker(Node *node, void *ctx)
reach = (inner > outer) ? inner - outer : 0;
}
- if (reach > context->maxOffset)
- context->maxOffset = reach;
+ context->maxOffset = Max(context->maxOffset, reach);
return false; /* don't walk into children */
}
@@ -4118,8 +4116,7 @@ eval_nav_first_offset_walker(Node *node, void *ctx)
}
}
- if (combined < context->minOffset)
- context->minOffset = combined;
+ context->minOffset = Min(context->minOffset, combined);
return false;
}
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 50668f3b7ab..d7adf17a242 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -2551,10 +2551,7 @@ nav_offset_walker(Node *node, void *ctx)
int64 offset;
if (extract_const_offset(nav->offset_arg, 1, &offset))
- {
- if (offset > context->maxOffset)
- context->maxOffset = offset;
- }
+ context->maxOffset = Max(context->maxOffset, offset);
else
context->maxNeedsEval = true;
}
@@ -2573,10 +2570,7 @@ nav_offset_walker(Node *node, void *ctx)
int64 offset;
if (extract_const_offset(nav->offset_arg, 0, &offset))
- {
- if (offset < context->firstOffset)
- context->firstOffset = offset;
- }
+ context->firstOffset = Min(context->firstOffset, offset);
else
context->firstNeedsEval = true;
}
@@ -2610,8 +2604,7 @@ nav_offset_walker(Node *node, void *ctx)
else
combined = (inner > outer) ? inner - outer : 0;
- if (combined > context->maxOffset)
- context->maxOffset = combined;
+ context->maxOffset = Max(context->maxOffset, combined);
}
else
context->maxNeedsEval = true;
@@ -2659,8 +2652,7 @@ nav_offset_walker(Node *node, void *ctx)
combined = INT64_MAX;
}
- if (combined < context->firstOffset)
- context->firstOffset = combined;
+ context->firstOffset = Min(context->firstOffset, combined);
}
else
context->firstNeedsEval = true;
--
2.50.1 (Apple Git-155)