nocfbot-0061-Assert-that-row-pattern-nesting-depth-never-alias.txt

text/plain

Filename: nocfbot-0061-Assert-that-row-pattern-nesting-depth-never-alias.txt
Type: text/plain
Part: 59
Message: Re: Row pattern recognition
From 0e7e3a4dc36b9820f6e1bae4300f59161adf0c70 Mon Sep 17 00:00:00 2001
From: Henson Choi <assam258@gmail.com>
Date: Mon, 8 Jun 2026 12:22:21 +0900
Subject: [PATCH 61/68] Assert that row pattern nesting depth never aliases the
 RPR_DEPTH_NONE sentinel

allocateRPRPattern stores maxDepth + 1, and scanRPRPatternRecursive rejects
nesting at or above RPR_DEPTH_MAX, so the stored value stays <= RPR_DEPTH_MAX
and never reaches the RPR_DEPTH_NONE sentinel (UINT8_MAX).  Assert that bound
so raising RPR_DEPTH_MAX or the depth limit trips immediately.  Also note in
compute_define_metadata that its default offset (1) serves only PREV; the
guarded LAST sub-case never uses it.
---
 src/backend/optimizer/plan/createplan.c | 3 +++
 src/backend/optimizer/plan/rpr.c        | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index c8ecaeea7cf..c5b0857ff20 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -2581,6 +2581,9 @@ visit_nav_plan(NavTraversal *t, RPRNavExpr *nav)
 		{
 			int64		offset;
 
+			/*
+			 * default 1 is for PREV; the guarded LAST sub-case never uses it.
+			 */
 			if (extract_const_offset(nav->offset_arg, 1, &offset))
 				context->maxOffset = Max(context->maxOffset, offset);
 			else
diff --git a/src/backend/optimizer/plan/rpr.c b/src/backend/optimizer/plan/rpr.c
index 43114088c3f..e7276c42ca6 100644
--- a/src/backend/optimizer/plan/rpr.c
+++ b/src/backend/optimizer/plan/rpr.c
@@ -1157,6 +1157,9 @@ allocateRPRPattern(int numVars, int numElements, RPRDepth maxDepth,
 
 	result = makeNode(RPRPattern);
 	result->numVars = numVars;
+
+	/* depth < RPR_DEPTH_MAX, so maxDepth+1 never aliases RPR_DEPTH_NONE. */
+	Assert(maxDepth < RPR_DEPTH_MAX);
 	result->maxDepth = maxDepth + 1;	/* +1: depth is 0-based */
 	result->numElements = numElements;
 
-- 
2.50.1 (Apple Git-155)