nocfbot-0002-Fix-RPR-error-codes-and-GROUPS-typo.txt

text/plain

Filename: nocfbot-0002-Fix-RPR-error-codes-and-GROUPS-typo.txt
Type: text/plain
Part: 1
Message: Re: Row pattern recognition
From 9abc7a58b48d389e279d1a3676351f36b9ebc6c3 Mon Sep 17 00:00:00 2001
From: Henson Choi <assam258@gmail.com>
Date: Thu, 19 Mar 2026 16:40:35 +0900
Subject: [PATCH] Fix RPR error codes and GROUPS typo in frame validation

Frame validation errors in transformRPR() were reported with
ERRCODE_SYNTAX_ERROR. These are semantic errors detected after parsing,
so ERRCODE_WINDOWING_ERROR is the correct code per SQL standard.

Also fix a typo in the error message: "FRAME option GROUP" ->
"FRAME option GROUPS" to match the actual SQL keyword.
---
 src/backend/parser/parse_rpr.c         | 10 +++++-----
 src/test/regress/expected/rpr_base.out |  8 ++++----
 src/test/regress/sql/rpr_base.sql      |  4 ++--
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/backend/parser/parse_rpr.c b/src/backend/parser/parse_rpr.c
index e574b69d9b5..66252cd185e 100644
--- a/src/backend/parser/parse_rpr.c
+++ b/src/backend/parser/parse_rpr.c
@@ -72,15 +72,15 @@ transformRPR(ParseState *pstate, WindowClause *wc, WindowDef *windef,
 	/* Frame type must be "ROW" */
 	if (wc->frameOptions & FRAMEOPTION_GROUPS)
 		ereport(ERROR,
-				(errcode(ERRCODE_SYNTAX_ERROR),
-				 errmsg("FRAME option GROUP is not permitted when row pattern recognition is used"),
+				(errcode(ERRCODE_WINDOWING_ERROR),
+				 errmsg("FRAME option GROUPS is not permitted when row pattern recognition is used"),
 				 errhint("Use: ROWS instead"),
 				 parser_errposition(pstate,
 									windef->frameLocation >= 0 ?
 									windef->frameLocation : windef->location)));
 	if (wc->frameOptions & FRAMEOPTION_RANGE)
 		ereport(ERROR,
-				(errcode(ERRCODE_SYNTAX_ERROR),
+				(errcode(ERRCODE_WINDOWING_ERROR),
 				 errmsg("FRAME option RANGE is not permitted when row pattern recognition is used"),
 				 errhint("Use: ROWS instead"),
 				 parser_errposition(pstate,
@@ -107,7 +107,7 @@ transformRPR(ParseState *pstate, WindowClause *wc, WindowDef *windef,
 			   (wc->frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING));
 
 		ereport(ERROR,
-				(errcode(ERRCODE_SYNTAX_ERROR),
+				(errcode(ERRCODE_WINDOWING_ERROR),
 				 errmsg("FRAME must start at CURRENT ROW when row pattern recognition is used"),
 				 errdetail("Current frame starts with %s.", startBound),
 				 errhint("Use: %s BETWEEN CURRENT ROW AND ...", frameType),
@@ -133,7 +133,7 @@ transformRPR(ParseState *pstate, WindowClause *wc, WindowDef *windef,
 			   (wc->frameOptions & FRAMEOPTION_EXCLUDE_TIES));
 
 		ereport(ERROR,
-				(errcode(ERRCODE_SYNTAX_ERROR),
+				(errcode(ERRCODE_WINDOWING_ERROR),
 				 errmsg("EXCLUDE options are not permitted when row pattern recognition is used"),
 				 errdetail("Frame definition includes %s.", excludeType),
 				 errhint("Remove the EXCLUDE clause from the window definition."),
diff --git a/src/test/regress/expected/rpr_base.out b/src/test/regress/expected/rpr_base.out
index 7931ad07d7d..50a9e7daea9 100644
--- a/src/test/regress/expected/rpr_base.out
+++ b/src/test/regress/expected/rpr_base.out
@@ -483,11 +483,11 @@ WINDOW w AS (
     PATTERN (A+)
     DEFINE A AS val > 0
 );
-ERROR:  FRAME option GROUP is not permitted when row pattern recognition is used
+ERROR:  FRAME option GROUPS is not permitted when row pattern recognition is used
 LINE 5:     GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWI...
             ^
 HINT:  Use: ROWS instead
--- Expected: ERROR: FRAME option GROUP is not permitted when row pattern recognition is used
+-- Expected: ERROR: FRAME option GROUPS is not permitted when row pattern recognition is used
 -- Starting with N PRECEDING
 SELECT COUNT(*) OVER w
 FROM rpr_frame
@@ -656,11 +656,11 @@ WINDOW w AS (
     DEFINE A AS val >= 0, B AS val >= 0
 )
 ORDER BY id;
-ERROR:  FRAME option GROUP is not permitted when row pattern recognition is used
+ERROR:  FRAME option GROUPS is not permitted when row pattern recognition is used
 LINE 5:     GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING
             ^
 HINT:  Use: ROWS instead
--- Expected: ERROR: FRAME option GROUP is not permitted when row pattern recognition is used
+-- Expected: ERROR: FRAME option GROUPS is not permitted when row pattern recognition is used
 DROP TABLE rpr_frame;
 -- ============================================================
 -- PARTITION BY + FRAME Tests
diff --git a/src/test/regress/sql/rpr_base.sql b/src/test/regress/sql/rpr_base.sql
index f8815c7376a..e54d54e400a 100644
--- a/src/test/regress/sql/rpr_base.sql
+++ b/src/test/regress/sql/rpr_base.sql
@@ -397,7 +397,7 @@ WINDOW w AS (
     PATTERN (A+)
     DEFINE A AS val > 0
 );
--- Expected: ERROR: FRAME option GROUP is not permitted when row pattern recognition is used
+-- Expected: ERROR: FRAME option GROUPS is not permitted when row pattern recognition is used
 
 -- Starting with N PRECEDING
 SELECT COUNT(*) OVER w
@@ -517,7 +517,7 @@ WINDOW w AS (
     DEFINE A AS val >= 0, B AS val >= 0
 )
 ORDER BY id;
--- Expected: ERROR: FRAME option GROUP is not permitted when row pattern recognition is used
+-- Expected: ERROR: FRAME option GROUPS is not permitted when row pattern recognition is used
 
 DROP TABLE rpr_frame;
 
-- 
2.50.1 (Apple Git-155)