v47-0003-nfa-refactor-argument.no-cfbot

application/octet-stream

Filename: v47-0003-nfa-refactor-argument.no-cfbot
Type: application/octet-stream
Part: 2
Message: Re: Row pattern recognition
From 11a0c30782f456dc883dcbde69b025026898d90f Mon Sep 17 00:00:00 2001
From: jian he <jian.universality@gmail.com>
Date: Fri, 29 May 2026 23:34:50 +0800
Subject: [PATCH v47 3/3] nfa refactor argument

The functions nfa_advance_alt, nfa_advance_begin, nfa_advance_end, and
nfa_advance_var currently all take the same two parameters:
(RPRNFAState *state, RPRPatternElement *elem)

However (RPRPatternElement *elem) can already be derived from (RPRNFAState *state).
Passing it explicitly is redundant and make it feel confusing.
So I propose to emove the (RPRPatternElement *elem) parameter from these functions.
---
 src/backend/executor/execRPR.c | 36 +++++++++++++++-------------------
 1 file changed, 16 insertions(+), 20 deletions(-)

diff --git a/src/backend/executor/execRPR.c b/src/backend/executor/execRPR.c
index a76bb97cb7d..a81e425337d 100644
--- a/src/backend/executor/execRPR.c
+++ b/src/backend/executor/execRPR.c
@@ -78,17 +78,13 @@ static void nfa_route_to_elem(WindowAggState *winstate, RPRNFAContext *ctx,
 							  RPRNFAState *state, RPRPatternElement *nextElem,
 							  int64 currentPos);
 static void nfa_advance_alt(WindowAggState *winstate, RPRNFAContext *ctx,
-							RPRNFAState *state, RPRPatternElement *elem,
-							int64 currentPos);
+							RPRNFAState *state, int64 currentPos);
 static void nfa_advance_begin(WindowAggState *winstate, RPRNFAContext *ctx,
-							  RPRNFAState *state, RPRPatternElement *elem,
-							  int64 currentPos);
+							  RPRNFAState *state, int64 currentPos);
 static void nfa_advance_end(WindowAggState *winstate, RPRNFAContext *ctx,
-							RPRNFAState *state, RPRPatternElement *elem,
-							int64 currentPos);
+							RPRNFAState *state, int64 currentPos);
 static void nfa_advance_var(WindowAggState *winstate, RPRNFAContext *ctx,
-							RPRNFAState *state, RPRPatternElement *elem,
-							int64 currentPos);
+							RPRNFAState *state, int64 currentPos);
 static void nfa_advance(WindowAggState *winstate, RPRNFAContext *ctx,
 						int64 currentPos);
 
@@ -925,11 +921,11 @@ nfa_route_to_elem(WindowAggState *winstate, RPRNFAContext *ctx,
  */
 static void
 nfa_advance_alt(WindowAggState *winstate, RPRNFAContext *ctx,
-				RPRNFAState *state, RPRPatternElement *elem,
-				int64 currentPos)
+				RPRNFAState *state, int64 currentPos)
 {
 	RPRPattern *pattern = winstate->rpPattern;
 	RPRPatternElement *elements = pattern->elements;
+	RPRPatternElement *elem = &elements[state->elemIdx];
 	RPRElemIdx	altIdx = elem->next;
 
 	while (altIdx >= 0 && altIdx < pattern->numElements)
@@ -963,11 +959,11 @@ nfa_advance_alt(WindowAggState *winstate, RPRNFAContext *ctx,
  */
 static void
 nfa_advance_begin(WindowAggState *winstate, RPRNFAContext *ctx,
-				  RPRNFAState *state, RPRPatternElement *elem,
-				  int64 currentPos)
+				  RPRNFAState *state, int64 currentPos)
 {
 	RPRPattern *pattern = winstate->rpPattern;
 	RPRPatternElement *elements = pattern->elements;
+	RPRPatternElement *elem = &elements[state->elemIdx];
 	RPRNFAState *skipState = NULL;
 
 	state->counts[elem->depth] = 0;
@@ -1024,11 +1020,11 @@ nfa_advance_begin(WindowAggState *winstate, RPRNFAContext *ctx,
  */
 static void
 nfa_advance_end(WindowAggState *winstate, RPRNFAContext *ctx,
-				RPRNFAState *state, RPRPatternElement *elem,
-				int64 currentPos)
+				RPRNFAState *state, int64 currentPos)
 {
 	RPRPattern *pattern = winstate->rpPattern;
 	RPRPatternElement *elements = pattern->elements;
+	RPRPatternElement *elem = &elements[state->elemIdx];
 	int			depth = elem->depth;
 	int32		count = state->counts[depth];
 
@@ -1179,11 +1175,11 @@ nfa_advance_end(WindowAggState *winstate, RPRNFAContext *ctx,
  */
 static void
 nfa_advance_var(WindowAggState *winstate, RPRNFAContext *ctx,
-				RPRNFAState *state, RPRPatternElement *elem,
-				int64 currentPos)
+				RPRNFAState *state, int64 currentPos)
 {
 	RPRPattern *pattern = winstate->rpPattern;
 	RPRPatternElement *elements = pattern->elements;
+	RPRPatternElement *elem = &elements[state->elemIdx];
 	int			depth = elem->depth;
 	int32		count = state->counts[depth];
 	bool		canLoop = (elem->max == RPR_QUANTITY_INF || count < elem->max);
@@ -1354,20 +1350,20 @@ nfa_advance_state(WindowAggState *winstate, RPRNFAContext *ctx,
 			break;
 
 		case RPR_VARID_ALT:
-			nfa_advance_alt(winstate, ctx, state, elem, currentPos);
+			nfa_advance_alt(winstate, ctx, state, currentPos);
 			break;
 
 		case RPR_VARID_BEGIN:
-			nfa_advance_begin(winstate, ctx, state, elem, currentPos);
+			nfa_advance_begin(winstate, ctx, state, currentPos);
 			break;
 
 		case RPR_VARID_END:
-			nfa_advance_end(winstate, ctx, state, elem, currentPos);
+			nfa_advance_end(winstate, ctx, state, currentPos);
 			break;
 
 		default:
 			/* VAR element */
-			nfa_advance_var(winstate, ctx, state, elem, currentPos);
+			nfa_advance_var(winstate, ctx, state, currentPos);
 			break;
 	}
 }
-- 
2.34.1