From 8d43d10030a6fad989e2ed8bbde1d6b036d348ce Mon Sep 17 00:00:00 2001 From: Henson Choi 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)