nocfbot-0037-Replace-non-ASCII-characters-RPR-code-tests.txt
text/plain
Filename: nocfbot-0037-Replace-non-ASCII-characters-RPR-code-tests.txt
Type: text/plain
Part: 36
Message:
Re: Row pattern recognition
From 1c5d2a431ca85a5e74b4448aacb8c8cc1da0dd0c Mon Sep 17 00:00:00 2001
From: Henson Choi <assam258@gmail.com>
Date: Sat, 2 May 2026 00:59:10 +0900
Subject: [PATCH 37/40] Replace non-ASCII characters in RPR code and tests
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The RPR patches accumulated a few Unicode characters (arrows, the
not-equal sign, plus-minus, em dash, section sign) in regression
test comments and a handful of source-code comments. The PostgreSQL
project conventionally keeps source and regression test files in
plain ASCII. Replace these with their ASCII equivalents:
-> for U+2192 RIGHTWARDS ARROW
!= for U+2260 NOT EQUAL TO
+/- for U+00B1 PLUS-MINUS SIGN
-- for U+2014 EM DASH
SQL standard <n> for "§<n>" references (matching the existing
"SQL standard 5.6.4" idiom in parse_rpr.c)
Affected: createplan.c, execRPR.c, parse_func.c (comments), and the
rpr / rpr_base / rpr_nfa regression test files (sql + expected).
Two short comment line breaks in createplan.c are reflowed by
pgindent as a mechanical consequence of the slightly longer ASCII
replacements.
Documentation/comment-only change; no functional effect.
---
src/backend/executor/execRPR.c | 2 +-
src/backend/optimizer/plan/createplan.c | 8 ++---
src/backend/parser/parse_func.c | 2 +-
src/test/regress/expected/rpr.out | 30 ++++++++--------
src/test/regress/expected/rpr_base.out | 6 ++--
src/test/regress/expected/rpr_nfa.out | 48 ++++++++++++-------------
src/test/regress/sql/rpr.sql | 30 ++++++++--------
src/test/regress/sql/rpr_base.sql | 6 ++--
src/test/regress/sql/rpr_nfa.sql | 48 ++++++++++++-------------
9 files changed, 90 insertions(+), 90 deletions(-)
diff --git a/src/backend/executor/execRPR.c b/src/backend/executor/execRPR.c
index 84f09093b4b..15e439daaae 100644
--- a/src/backend/executor/execRPR.c
+++ b/src/backend/executor/execRPR.c
@@ -631,7 +631,7 @@
* with a compound kind (RPR_NAV_PREV_FIRST, etc.). The executor
* computes the target position in two steps: first the inner reference
* point (match_start + N or currentpos - N) with match-range validation,
- * then the outer adjustment (± M) with partition-range validation.
+ * then the outer adjustment (+/- M) with partition-range validation.
* If either step is out of range, the result is NULL.
*
* nav_slot caches the last fetched position (nav_slot_pos) to avoid
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index d7adf17a242..a1643e40be4 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -2578,8 +2578,8 @@ nav_offset_walker(Node *node, void *ctx)
/*
* Compound PREV_LAST / NEXT_LAST: base = currentpos. PREV_LAST(v, N,
- * M): target = currentpos - N - M → lookback = N + M NEXT_LAST(v,
- * N, M): target = currentpos - N + M → lookback = max(N - M, 0)
+ * M): target = currentpos - N - M -> lookback = N + M NEXT_LAST(v, N,
+ * M): target = currentpos - N + M -> lookback = max(N - M, 0)
*/
if (nav->kind == RPR_NAV_PREV_LAST ||
nav->kind == RPR_NAV_NEXT_LAST)
@@ -2614,8 +2614,8 @@ nav_offset_walker(Node *node, void *ctx)
/*
* Compound PREV_FIRST / NEXT_FIRST: base = match_start. PREV_FIRST(v,
* N, M): target = match_start + N - M NEXT_FIRST(v, N, M): target =
- * match_start + N + M The combined offset (N±M) from match_start can
- * be negative, meaning rows before match_start are needed.
+ * match_start + N + M The combined offset (N+/-M) from match_start
+ * can be negative, meaning rows before match_start are needed.
*/
if (nav->kind == RPR_NAV_PREV_FIRST ||
nav->kind == RPR_NAV_NEXT_FIRST)
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c
index 07bf11965b8..07eccd6de32 100644
--- a/src/backend/parser/parse_func.c
+++ b/src/backend/parser/parse_func.c
@@ -787,7 +787,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
return projection;
}
- /* Not a column projection — report error */
+ /* Not a column projection -- report error */
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("cannot use %s outside a DEFINE clause",
diff --git a/src/test/regress/expected/rpr.out b/src/test/regress/expected/rpr.out
index 3520c5c5d76..85384f6b096 100644
--- a/src/test/regress/expected/rpr.out
+++ b/src/test/regress/expected/rpr.out
@@ -1723,9 +1723,9 @@ WINDOW w AS (
CREATE TEMP TABLE rpr_nav (id int, val int);
INSERT INTO rpr_nav VALUES (1,10),(2,20),(3,30),(4,10),(5,50),(6,10);
-- FIRST(val) = constant: B matches when match_start has val=10
--- match_start=1(10): A=id1, B=id2, FIRST(val)=10 → match {1,2}
--- match_start=3(30): A=id3, B=id4, FIRST(val)=30≠10 → no match
--- match_start=4(10): A=id4, B=id5, FIRST(val)=10 → match {4,5}
+-- match_start=1(10): A=id1, B=id2, FIRST(val)=10 -> match {1,2}
+-- match_start=3(30): A=id3, B=id4, FIRST(val)=30!=10 -> no match
+-- match_start=4(10): A=id4, B=id5, FIRST(val)=10 -> match {4,5}
SELECT id, val, first_value(id) OVER w AS mf, last_value(id) OVER w AS ml
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -1767,8 +1767,8 @@ FROM rpr_nav WINDOW w AS (
-- Reluctant A+? with FIRST(val) = LAST(val): find shortest match where
-- first and last rows have the same val.
-- match_start=1(10): reluctant tries B early:
--- id2(20≠10), id3(30≠10), id4(10=10) → match {1,2,3,4}
--- match_start=5(50): id6(10≠50) → no match
+-- id2(20!=10), id3(30!=10), id4(10=10) -> match {1,2,3,4}
+-- match_start=5(50): id6(10!=50) -> no match
SELECT id, val, first_value(id) OVER w AS mf, last_value(id) OVER w AS ml
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -1790,7 +1790,7 @@ FROM rpr_nav WINDOW w AS (
-- Greedy A+ with FIRST(val) = LAST(val): find longest match where
-- first and last rows have the same val.
-- match_start=1(10): greedy A eats all, B tries last:
--- id6(10=10) → match {1,2,3,4,5,6}
+-- id6(10=10) -> match {1,2,3,4,5,6}
SELECT id, val, first_value(id) OVER w AS mf, last_value(id) OVER w AS ml
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -1851,8 +1851,8 @@ FROM rpr_nav WINDOW w AS (
(6 rows)
-- FIRST(val, 1): match_start + 1 row (second row of match)
--- match_start=1(10): FIRST(val,1)=20, B needs val=20 → id2(20) match, id3(30) no
--- match_start=3(30): FIRST(val,1)=10, B needs val=10 → id4(10) match
+-- match_start=1(10): FIRST(val,1)=20, B needs val=20 -> id2(20) match, id3(30) no
+-- match_start=3(30): FIRST(val,1)=10, B needs val=10 -> id4(10) match
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -1871,7 +1871,7 @@ FROM rpr_nav WINDOW w AS (
6 | 10 | | 0
(6 rows)
--- FIRST(val, 99): offset beyond match range → NULL, no match
+-- FIRST(val, 99): offset beyond match range -> NULL, no match
SELECT id, val, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -1930,7 +1930,7 @@ FROM rpr_nav WINDOW w AS (
6 | 10 | | 0
(6 rows)
--- LAST(val, 99): offset before match_start → NULL
+-- LAST(val, 99): offset before match_start -> NULL
SELECT id, val, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -1991,8 +1991,8 @@ DROP TABLE rpr_names;
-- Compound navigation: PREV(FIRST(val), M)
-- rpr_nav: (1,10),(2,20),(3,30),(4,10),(5,50),(6,10)
-- PREV(FIRST(val), 1): target = match_start + 0 - 1 = match_start - 1
--- At match_start=1: target=0 → out of range → NULL
--- At match_start=3: target=2(val=20) → 20 > 0 → true
+-- At match_start=1: target=0 -> out of range -> NULL
+-- At match_start=3: target=2(val=20) -> 20 > 0 -> true
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -2012,7 +2012,7 @@ FROM rpr_nav WINDOW w AS (
(6 rows)
-- NEXT(FIRST(val, 1), 1): target = match_start + 1 + 1 = match_start + 2
--- At match_start=1, B on id2: target=1+1+1=3(val=30), 30>0 → true
+-- At match_start=1, B on id2: target=1+1+1=3(val=30), 30>0 -> true
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -2160,7 +2160,7 @@ SELECT id, val, count(*) OVER w FROM rpr_nav WINDOW w AS (
);
ERROR: row pattern navigation offset must not be negative
-- Compound: default offsets on both sides
--- PREV(FIRST(val)): inner=0 (match_start), outer=1 → target = match_start - 1
+-- PREV(FIRST(val)): inner=0 (match_start), outer=1 -> target = match_start - 1
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -2179,7 +2179,7 @@ FROM rpr_nav WINDOW w AS (
6 | 10 | | 0
(6 rows)
--- NEXT(LAST(val)): inner=0 (currentpos), outer=1 → target = currentpos + 1
+-- NEXT(LAST(val)): inner=0 (currentpos), outer=1 -> target = currentpos + 1
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
diff --git a/src/test/regress/expected/rpr_base.out b/src/test/regress/expected/rpr_base.out
index 3637a5c8002..a63211ff364 100644
--- a/src/test/regress/expected/rpr_base.out
+++ b/src/test/regress/expected/rpr_base.out
@@ -3065,7 +3065,7 @@ LINE 6: DEFINE A AS val > 0
^
-- Expected: Syntax error
-- Qualified column references (NOT SUPPORTED)
--- Pattern variable qualified name: not supported (valid per §4.16, not yet implemented)
+-- Pattern variable qualified name: not supported (valid per SQL standard 4.16, not yet implemented)
SELECT COUNT(*) OVER w
FROM rpr_err
WINDOW w AS (
@@ -3104,7 +3104,7 @@ ERROR: DEFINE variable "b" is not used in PATTERN
LINE 7: DEFINE A AS val > 0, B AS B.val > 0
^
-- Expected: ERROR: pattern variable qualified column reference "b.val" is not supported
--- FROM-clause range variable qualified name: not allowed (prohibited by §6.5)
+-- FROM-clause range variable qualified name: not allowed (prohibited by SQL standard 6.5)
SELECT COUNT(*) OVER w
FROM rpr_err
WINDOW w AS (
@@ -5821,7 +5821,7 @@ CREATE TABLE rpr_sort (id INT, category VARCHAR(10), val INT);
INSERT INTO rpr_sort VALUES
(1, 'A', 30), (2, 'B', 20), (3, 'A', 10),
(4, 'B', 40), (5, 'A', 50), (6, 'B', 60);
--- RPR with GROUP BY (aggregate in DEFINE → ERROR before GROUP BY interaction)
+-- RPR with GROUP BY (aggregate in DEFINE -> ERROR before GROUP BY interaction)
-- Expected: ERROR: aggregate functions are not allowed in DEFINE
SELECT category,
COUNT(*) as group_cnt,
diff --git a/src/test/regress/expected/rpr_nfa.out b/src/test/regress/expected/rpr_nfa.out
index 250f7f131b1..a19b26c3b94 100644
--- a/src/test/regress/expected/rpr_nfa.out
+++ b/src/test/regress/expected/rpr_nfa.out
@@ -1151,7 +1151,7 @@ WINDOW w AS (
-- Optional reluctant group: (A B)?? C
-- nfa_advance_begin: reluctant tries skip first, but skip path needs C
--- at row 1 which is A → skip fails. Enter path succeeds: A(1) B(2) C(3).
+-- at row 1 which is A -> skip fails. Enter path succeeds: A(1) B(2) C(3).
WITH test_optional_reluctant AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -2961,8 +2961,8 @@ WINDOW w AS (
9 | {_} | |
(9 rows)
--- Nested END→END max reached
--- Inner group (A B){2} reaches max=2 → exits to outer END
+-- Nested END->END max reached
+-- Inner group (A B){2} reaches max=2 -> exits to outer END
WITH test_end_nested_max AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -3002,8 +3002,8 @@ WINDOW w AS (
9 | {_} | |
(9 rows)
--- Nested END→END between min/max
--- Inner group (A B){1,3} exits between min/max → outer END count++
+-- Nested END->END between min/max
+-- Inner group (A B){1,3} exits between min/max -> outer END count++
WITH test_end_nested_mid AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -3884,9 +3884,9 @@ WINDOW w AS (
-- Coverage failure: older can't cover newer's states
-- Pattern A+ | B+ with SKIP PAST LAST ROW.
--- Row 1: only A → Ctx1 takes A branch only (B fails).
--- Row 2: A and B → Ctx2 takes both branches.
--- Absorption: Ctx1 has A but no B → can't cover Ctx2's B state → fails.
+-- Row 1: only A -> Ctx1 takes A branch only (B fails).
+-- Row 2: A and B -> Ctx2 takes both branches.
+-- Absorption: Ctx1 has A but no B -> can't cover Ctx2's B state -> fails.
WITH test_coverage_fail AS (
SELECT * FROM (VALUES
(1, ARRAY['A', '_']),
@@ -3920,8 +3920,8 @@ WINDOW w AS (
-- Absorb skips completed context (older->states==NULL)
-- Pattern A+ | B+ with SKIP PAST LAST ROW.
--- Row 1: A only → Ctx1 takes A branch. Row 2: B only → Ctx1 A fails (completed).
--- Ctx2 takes B branch. Absorption: Ctx1 states==NULL → skip.
+-- Row 1: A only -> Ctx1 takes A branch. Row 2: B only -> Ctx1 A fails (completed).
+-- Ctx2 takes B branch. Absorption: Ctx1 states==NULL -> skip.
WITH test_older_completed AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -3953,9 +3953,9 @@ WINDOW w AS (
-- Absorb skips non-absorbable context (!hasAbsorbableState)
-- Pattern A+ | B C with SKIP PAST LAST ROW (only A+ branch absorbable).
--- Row 1: B only → Ctx1 takes B branch (non-absorbable), advances to C.
--- Row 2: C,A → Ctx1 C matches (hasAbsorbableState=false). Ctx2 takes A (absorbable).
--- Absorption: Ctx1 !hasAbsorbableState → skip.
+-- Row 1: B only -> Ctx1 takes B branch (non-absorbable), advances to C.
+-- Row 2: C,A -> Ctx1 C matches (hasAbsorbableState=false). Ctx2 takes A (absorbable).
+-- Absorption: Ctx1 !hasAbsorbableState -> skip.
WITH test_older_non_absorbable AS (
SELECT * FROM (VALUES
(1, ARRAY['B', '_']),
@@ -4397,7 +4397,7 @@ WINDOW w AS (
-- (A?){0,3}: min=0, nullable inner.
-- A never matches. A? matches empty, min=0 satisfied immediately.
-- Per standard: empty match expected for every row.
--- XXX: visited bitmap blocks empty iteration → no match (same as {2,3})
+-- XXX: visited bitmap blocks empty iteration -> no match (same as {2,3})
WITH test_728_min0 AS (
SELECT * FROM (VALUES
(1, ARRAY['B']),
@@ -4427,7 +4427,7 @@ WINDOW w AS (
-- (A?){1,3}: min=1, nullable inner.
-- A never matches. Need 1 empty iteration to satisfy min=1.
-- Per standard: empty match expected for every row.
--- XXX: visited bitmap blocks empty iteration → no match (same as {2,3})
+-- XXX: visited bitmap blocks empty iteration -> no match (same as {2,3})
WITH test_728_min1 AS (
SELECT * FROM (VALUES
(1, ARRAY['B']),
@@ -4458,7 +4458,7 @@ WINDOW w AS (
-- A never matches. Need 2 empty iterations to satisfy min=2.
-- Per standard: STR06=(STRE STRE) is valid for min=2.
-- Expected: empty match for every row
--- XXX: visited bitmap blocks second empty iteration → match failure
+-- XXX: visited bitmap blocks second empty iteration -> match failure
WITH test_728_min2 AS (
SELECT * FROM (VALUES
(1, ARRAY['B']),
@@ -4486,10 +4486,10 @@ WINDOW w AS (
(3 rows)
-- (A?){2,3} mixed: some rows match A, some don't
--- Rows 1-2: A matches, greedy takes 2 → min satisfied
+-- Rows 1-2: A matches, greedy takes 2 -> min satisfied
-- Row 3: A doesn't match, needs 2 empty iterations for min=2
-- XXX: Row 3 fails due to visited bitmap (same as pure empty {2,3})
--- Row 4: A matches 1 real iter + 1 ff empty exit → match 4-4
+-- Row 4: A matches 1 real iter + 1 ff empty exit -> match 4-4
WITH test_728_min2_mixed AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -4524,8 +4524,8 @@ WINDOW w AS (
-- fires as a parallel exit path (EXIT ONLY, no greedy/reluctant loop).
-- Data: alternating A, B rows (6 rows)
-- Greedy: each row gets the longest match from its starting position.
--- Row 1: 3 iters (A@1,B@2)(A@3,B@4)(A@5,B@6) → 1-6
--- Row 5: 1 real iter + 1 ff empty exit → 5-6
+-- Row 1: 3 iters (A@1,B@2)(A@3,B@4)(A@5,B@6) -> 1-6
+-- Row 5: 1 real iter + 1 ff empty exit -> 5-6
WITH test_728_multi_body AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -4590,9 +4590,9 @@ WINDOW w AS (
(3 rows)
-- (A? B?){2,3}: mixed real and empty iterations
--- Row 1: iter1 real (A@1,B@2), iter2 at row 3 empty → ff exit, match 1-2
--- Row 3: C doesn't match A or B → NULL
--- Row 4: iter1 real (A@4,B@5), iter2 at end empty → ff exit, match 4-5
+-- Row 1: iter1 real (A@1,B@2), iter2 at row 3 empty -> ff exit, match 1-2
+-- Row 3: C doesn't match A or B -> NULL
+-- Row 4: iter1 real (A@4,B@5), iter2 at end empty -> ff exit, match 4-5
WITH test_728_multi_mixed AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -4629,7 +4629,7 @@ WINDOW w AS (
-- ------------------------------------------------------------
-- Standard's worked example: A? B+ with specific data
-- Preferment order: (A)(BBB), (A)(BB), (A)(B), ()(BBB), ()(BB), ()(B)
--- Row 1: A condition (price>100) is false → A fails
+-- Row 1: A condition (price>100) is false -> A fails
-- Backtrack: empty A?, then B+ from row 1
-- Expected: rows 1-3 match as B (A? takes empty match)
WITH test_73_example AS (
diff --git a/src/test/regress/sql/rpr.sql b/src/test/regress/sql/rpr.sql
index 724d460b2da..5563e062cde 100644
--- a/src/test/regress/sql/rpr.sql
+++ b/src/test/regress/sql/rpr.sql
@@ -820,9 +820,9 @@ CREATE TEMP TABLE rpr_nav (id int, val int);
INSERT INTO rpr_nav VALUES (1,10),(2,20),(3,30),(4,10),(5,50),(6,10);
-- FIRST(val) = constant: B matches when match_start has val=10
--- match_start=1(10): A=id1, B=id2, FIRST(val)=10 → match {1,2}
--- match_start=3(30): A=id3, B=id4, FIRST(val)=30≠10 → no match
--- match_start=4(10): A=id4, B=id5, FIRST(val)=10 → match {4,5}
+-- match_start=1(10): A=id1, B=id2, FIRST(val)=10 -> match {1,2}
+-- match_start=3(30): A=id3, B=id4, FIRST(val)=30!=10 -> no match
+-- match_start=4(10): A=id4, B=id5, FIRST(val)=10 -> match {4,5}
SELECT id, val, first_value(id) OVER w AS mf, last_value(id) OVER w AS ml
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -846,8 +846,8 @@ FROM rpr_nav WINDOW w AS (
-- Reluctant A+? with FIRST(val) = LAST(val): find shortest match where
-- first and last rows have the same val.
-- match_start=1(10): reluctant tries B early:
--- id2(20≠10), id3(30≠10), id4(10=10) → match {1,2,3,4}
--- match_start=5(50): id6(10≠50) → no match
+-- id2(20!=10), id3(30!=10), id4(10=10) -> match {1,2,3,4}
+-- match_start=5(50): id6(10!=50) -> no match
SELECT id, val, first_value(id) OVER w AS mf, last_value(id) OVER w AS ml
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -860,7 +860,7 @@ FROM rpr_nav WINDOW w AS (
-- Greedy A+ with FIRST(val) = LAST(val): find longest match where
-- first and last rows have the same val.
-- match_start=1(10): greedy A eats all, B tries last:
--- id6(10=10) → match {1,2,3,4,5,6}
+-- id6(10=10) -> match {1,2,3,4,5,6}
SELECT id, val, first_value(id) OVER w AS mf, last_value(id) OVER w AS ml
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -894,8 +894,8 @@ FROM rpr_nav WINDOW w AS (
);
-- FIRST(val, 1): match_start + 1 row (second row of match)
--- match_start=1(10): FIRST(val,1)=20, B needs val=20 → id2(20) match, id3(30) no
--- match_start=3(30): FIRST(val,1)=10, B needs val=10 → id4(10) match
+-- match_start=1(10): FIRST(val,1)=20, B needs val=20 -> id2(20) match, id3(30) no
+-- match_start=3(30): FIRST(val,1)=10, B needs val=10 -> id4(10) match
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -905,7 +905,7 @@ FROM rpr_nav WINDOW w AS (
DEFINE A AS TRUE, B AS val = FIRST(val, 1)
);
--- FIRST(val, 99): offset beyond match range → NULL, no match
+-- FIRST(val, 99): offset beyond match range -> NULL, no match
SELECT id, val, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -937,7 +937,7 @@ FROM rpr_nav WINDOW w AS (
DEFINE A AS TRUE, B AS LAST(val, 1) < 30
);
--- LAST(val, 99): offset before match_start → NULL
+-- LAST(val, 99): offset before match_start -> NULL
SELECT id, val, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -977,8 +977,8 @@ DROP TABLE rpr_names;
-- Compound navigation: PREV(FIRST(val), M)
-- rpr_nav: (1,10),(2,20),(3,30),(4,10),(5,50),(6,10)
-- PREV(FIRST(val), 1): target = match_start + 0 - 1 = match_start - 1
--- At match_start=1: target=0 → out of range → NULL
--- At match_start=3: target=2(val=20) → 20 > 0 → true
+-- At match_start=1: target=0 -> out of range -> NULL
+-- At match_start=3: target=2(val=20) -> 20 > 0 -> true
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -989,7 +989,7 @@ FROM rpr_nav WINDOW w AS (
);
-- NEXT(FIRST(val, 1), 1): target = match_start + 1 + 1 = match_start + 2
--- At match_start=1, B on id2: target=1+1+1=3(val=30), 30>0 → true
+-- At match_start=1, B on id2: target=1+1+1=3(val=30), 30>0 -> true
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -1074,7 +1074,7 @@ SELECT id, val, count(*) OVER w FROM rpr_nav WINDOW w AS (
);
-- Compound: default offsets on both sides
--- PREV(FIRST(val)): inner=0 (match_start), outer=1 → target = match_start - 1
+-- PREV(FIRST(val)): inner=0 (match_start), outer=1 -> target = match_start - 1
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
@@ -1084,7 +1084,7 @@ FROM rpr_nav WINDOW w AS (
DEFINE A AS TRUE, B AS PREV(FIRST(val)) IS NOT NULL
);
--- NEXT(LAST(val)): inner=0 (currentpos), outer=1 → target = currentpos + 1
+-- NEXT(LAST(val)): inner=0 (currentpos), outer=1 -> target = currentpos + 1
SELECT id, val, first_value(id) OVER w AS mf, count(*) OVER w AS cnt
FROM rpr_nav WINDOW w AS (
ORDER BY id
diff --git a/src/test/regress/sql/rpr_base.sql b/src/test/regress/sql/rpr_base.sql
index 90b1ae96a0e..86ed06fec68 100644
--- a/src/test/regress/sql/rpr_base.sql
+++ b/src/test/regress/sql/rpr_base.sql
@@ -2083,7 +2083,7 @@ WINDOW w AS (
-- Qualified column references (NOT SUPPORTED)
--- Pattern variable qualified name: not supported (valid per §4.16, not yet implemented)
+-- Pattern variable qualified name: not supported (valid per SQL standard 4.16, not yet implemented)
SELECT COUNT(*) OVER w
FROM rpr_err
WINDOW w AS (
@@ -2116,7 +2116,7 @@ WINDOW w AS (
);
-- Expected: ERROR: pattern variable qualified column reference "b.val" is not supported
--- FROM-clause range variable qualified name: not allowed (prohibited by §6.5)
+-- FROM-clause range variable qualified name: not allowed (prohibited by SQL standard 6.5)
SELECT COUNT(*) OVER w
FROM rpr_err
WINDOW w AS (
@@ -3611,7 +3611,7 @@ INSERT INTO rpr_sort VALUES
(1, 'A', 30), (2, 'B', 20), (3, 'A', 10),
(4, 'B', 40), (5, 'A', 50), (6, 'B', 60);
--- RPR with GROUP BY (aggregate in DEFINE → ERROR before GROUP BY interaction)
+-- RPR with GROUP BY (aggregate in DEFINE -> ERROR before GROUP BY interaction)
-- Expected: ERROR: aggregate functions are not allowed in DEFINE
SELECT category,
diff --git a/src/test/regress/sql/rpr_nfa.sql b/src/test/regress/sql/rpr_nfa.sql
index aaa7b44f789..1d27e0dc09e 100644
--- a/src/test/regress/sql/rpr_nfa.sql
+++ b/src/test/regress/sql/rpr_nfa.sql
@@ -806,7 +806,7 @@ WINDOW w AS (
-- Optional reluctant group: (A B)?? C
-- nfa_advance_begin: reluctant tries skip first, but skip path needs C
--- at row 1 which is A → skip fails. Enter path succeeds: A(1) B(2) C(3).
+-- at row 1 which is A -> skip fails. Enter path succeeds: A(1) B(2) C(3).
WITH test_optional_reluctant AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -2102,8 +2102,8 @@ WINDOW w AS (
D AS 'D' = ANY(flags)
);
--- Nested END→END max reached
--- Inner group (A B){2} reaches max=2 → exits to outer END
+-- Nested END->END max reached
+-- Inner group (A B){2} reaches max=2 -> exits to outer END
WITH test_end_nested_max AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -2131,8 +2131,8 @@ WINDOW w AS (
B AS 'B' = ANY(flags)
);
--- Nested END→END between min/max
--- Inner group (A B){1,3} exits between min/max → outer END count++
+-- Nested END->END between min/max
+-- Inner group (A B){1,3} exits between min/max -> outer END count++
WITH test_end_nested_mid AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -2820,9 +2820,9 @@ WINDOW w AS (
-- Coverage failure: older can't cover newer's states
-- Pattern A+ | B+ with SKIP PAST LAST ROW.
--- Row 1: only A → Ctx1 takes A branch only (B fails).
--- Row 2: A and B → Ctx2 takes both branches.
--- Absorption: Ctx1 has A but no B → can't cover Ctx2's B state → fails.
+-- Row 1: only A -> Ctx1 takes A branch only (B fails).
+-- Row 2: A and B -> Ctx2 takes both branches.
+-- Absorption: Ctx1 has A but no B -> can't cover Ctx2's B state -> fails.
WITH test_coverage_fail AS (
SELECT * FROM (VALUES
(1, ARRAY['A', '_']),
@@ -2848,8 +2848,8 @@ WINDOW w AS (
-- Absorb skips completed context (older->states==NULL)
-- Pattern A+ | B+ with SKIP PAST LAST ROW.
--- Row 1: A only → Ctx1 takes A branch. Row 2: B only → Ctx1 A fails (completed).
--- Ctx2 takes B branch. Absorption: Ctx1 states==NULL → skip.
+-- Row 1: A only -> Ctx1 takes A branch. Row 2: B only -> Ctx1 A fails (completed).
+-- Ctx2 takes B branch. Absorption: Ctx1 states==NULL -> skip.
WITH test_older_completed AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -2874,9 +2874,9 @@ WINDOW w AS (
-- Absorb skips non-absorbable context (!hasAbsorbableState)
-- Pattern A+ | B C with SKIP PAST LAST ROW (only A+ branch absorbable).
--- Row 1: B only → Ctx1 takes B branch (non-absorbable), advances to C.
--- Row 2: C,A → Ctx1 C matches (hasAbsorbableState=false). Ctx2 takes A (absorbable).
--- Absorption: Ctx1 !hasAbsorbableState → skip.
+-- Row 1: B only -> Ctx1 takes B branch (non-absorbable), advances to C.
+-- Row 2: C,A -> Ctx1 C matches (hasAbsorbableState=false). Ctx2 takes A (absorbable).
+-- Absorption: Ctx1 !hasAbsorbableState -> skip.
WITH test_older_non_absorbable AS (
SELECT * FROM (VALUES
(1, ARRAY['B', '_']),
@@ -3236,7 +3236,7 @@ WINDOW w AS (
-- (A?){0,3}: min=0, nullable inner.
-- A never matches. A? matches empty, min=0 satisfied immediately.
-- Per standard: empty match expected for every row.
--- XXX: visited bitmap blocks empty iteration → no match (same as {2,3})
+-- XXX: visited bitmap blocks empty iteration -> no match (same as {2,3})
WITH test_728_min0 AS (
SELECT * FROM (VALUES
(1, ARRAY['B']),
@@ -3260,7 +3260,7 @@ WINDOW w AS (
-- (A?){1,3}: min=1, nullable inner.
-- A never matches. Need 1 empty iteration to satisfy min=1.
-- Per standard: empty match expected for every row.
--- XXX: visited bitmap blocks empty iteration → no match (same as {2,3})
+-- XXX: visited bitmap blocks empty iteration -> no match (same as {2,3})
WITH test_728_min1 AS (
SELECT * FROM (VALUES
(1, ARRAY['B']),
@@ -3285,7 +3285,7 @@ WINDOW w AS (
-- A never matches. Need 2 empty iterations to satisfy min=2.
-- Per standard: STR06=(STRE STRE) is valid for min=2.
-- Expected: empty match for every row
--- XXX: visited bitmap blocks second empty iteration → match failure
+-- XXX: visited bitmap blocks second empty iteration -> match failure
WITH test_728_min2 AS (
SELECT * FROM (VALUES
(1, ARRAY['B']),
@@ -3307,10 +3307,10 @@ WINDOW w AS (
);
-- (A?){2,3} mixed: some rows match A, some don't
--- Rows 1-2: A matches, greedy takes 2 → min satisfied
+-- Rows 1-2: A matches, greedy takes 2 -> min satisfied
-- Row 3: A doesn't match, needs 2 empty iterations for min=2
-- XXX: Row 3 fails due to visited bitmap (same as pure empty {2,3})
--- Row 4: A matches 1 real iter + 1 ff empty exit → match 4-4
+-- Row 4: A matches 1 real iter + 1 ff empty exit -> match 4-4
WITH test_728_min2_mixed AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -3338,8 +3338,8 @@ WINDOW w AS (
-- fires as a parallel exit path (EXIT ONLY, no greedy/reluctant loop).
-- Data: alternating A, B rows (6 rows)
-- Greedy: each row gets the longest match from its starting position.
--- Row 1: 3 iters (A@1,B@2)(A@3,B@4)(A@5,B@6) → 1-6
--- Row 5: 1 real iter + 1 ff empty exit → 5-6
+-- Row 1: 3 iters (A@1,B@2)(A@3,B@4)(A@5,B@6) -> 1-6
+-- Row 5: 1 real iter + 1 ff empty exit -> 5-6
WITH test_728_multi_body AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -3389,9 +3389,9 @@ WINDOW w AS (
);
-- (A? B?){2,3}: mixed real and empty iterations
--- Row 1: iter1 real (A@1,B@2), iter2 at row 3 empty → ff exit, match 1-2
--- Row 3: C doesn't match A or B → NULL
--- Row 4: iter1 real (A@4,B@5), iter2 at end empty → ff exit, match 4-5
+-- Row 1: iter1 real (A@1,B@2), iter2 at row 3 empty -> ff exit, match 1-2
+-- Row 3: C doesn't match A or B -> NULL
+-- Row 4: iter1 real (A@4,B@5), iter2 at end empty -> ff exit, match 4-5
WITH test_728_multi_mixed AS (
SELECT * FROM (VALUES
(1, ARRAY['A']),
@@ -3421,7 +3421,7 @@ WINDOW w AS (
-- Standard's worked example: A? B+ with specific data
-- Preferment order: (A)(BBB), (A)(BB), (A)(B), ()(BBB), ()(BB), ()(B)
--- Row 1: A condition (price>100) is false → A fails
+-- Row 1: A condition (price>100) is false -> A fails
-- Backtrack: empty A?, then B+ from row 1
-- Expected: rows 1-3 match as B (A? takes empty match)
WITH test_73_example AS (
--
2.50.1 (Apple Git-155)