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)