From 2d6c8a8801c45cf2e26a72f3a59cdc0a18ce4f8f Mon Sep 17 00:00:00 2001 From: jian he Date: Fri, 12 Jun 2026 17:52:47 +0800 Subject: [PATCH v47 2/6] refactor gram.y --- src/backend/parser/gram.y | 87 ++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 4ae951aaeb..ace2e7fd59 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -17734,9 +17734,11 @@ row_pattern_primary: ; row_pattern_quantifier_opt: - /* EMPTY - no quantifier means exactly once; @$ is unused since - * min=max=1 never produces an error */ { + /* + * EMPTY - no quantifier means exactly once; @$ is unused + * since min=max=1 never produces an error + */ $$ = (Node *) makeRPRQuantifier(1, 1, false, @$); } | '*' @@ -17749,15 +17751,34 @@ row_pattern_quantifier_opt: } | Op { - /* Handle single Op: ? or reluctant quantifiers *?, +?, ?? */ - if (strcmp($1, "?") == 0) + if (strcmp($1, "?") == 0 || strcmp($1, "?|") == 0) + { $$ = (Node *) makeRPRQuantifier(0, 1, false, @1); - else if (strcmp($1, "*?") == 0) + + if (strcmp($1, "?|") == 0) + ((RPRPatternNode *) $$)->trailing_alt = true; + } + else if (strcmp($1, "*?") == 0 || strcmp($1, "*?|") == 0) + { $$ = (Node *) makeRPRQuantifier(0, PG_INT32_MAX, true, @1); - else if (strcmp($1, "+?") == 0) + + if (strcmp($1, "*?|") == 0) + ((RPRPatternNode *) $$)->trailing_alt = true; + } + else if (strcmp($1, "+?") == 0 || strcmp($1, "+?|") == 0) + { $$ = (Node *) makeRPRQuantifier(1, PG_INT32_MAX, true, @1); - else if (strcmp($1, "??") == 0) + + if (strcmp($1, "+?|") == 0) + ((RPRPatternNode *) $$)->trailing_alt = true; + } + else if (strcmp($1, "??") == 0 || strcmp($1, "??|") == 0) + { $$ = (Node *) makeRPRQuantifier(0, 1, true, @1); + + if (strcmp($1, "??|") == 0) + ((RPRPatternNode *) $$)->trailing_alt = true; + } else if (strcmp($1, "*|") == 0) { $$ = (Node *) makeRPRQuantifier(0, PG_INT32_MAX, false, @1); @@ -17766,26 +17787,7 @@ row_pattern_quantifier_opt: else if (strcmp($1, "+|") == 0) { $$ = (Node *) makeRPRQuantifier(1, PG_INT32_MAX, false, @1); - ((RPRPatternNode *) $$)->trailing_alt = true; - } - else if (strcmp($1, "?|") == 0) - { - $$ = (Node *) makeRPRQuantifier(0, 1, false, @1); - ((RPRPatternNode *) $$)->trailing_alt = true; - } - else if (strcmp($1, "*?|") == 0) - { - $$ = (Node *) makeRPRQuantifier(0, PG_INT32_MAX, true, @1); - ((RPRPatternNode *) $$)->trailing_alt = true; - } - else if (strcmp($1, "+?|") == 0) - { - $$ = (Node *) makeRPRQuantifier(1, PG_INT32_MAX, true, @1); - ((RPRPatternNode *) $$)->trailing_alt = true; - } - else if (strcmp($1, "??|") == 0) - { - $$ = (Node *) makeRPRQuantifier(0, 1, true, @1); + ((RPRPatternNode *) $$)->trailing_alt = true; } else @@ -17798,13 +17800,13 @@ row_pattern_quantifier_opt: /* RELUCTANT quantifiers (when lexer separates tokens) */ | '*' Op { - if (strcmp($2, "?") == 0) - $$ = (Node *) makeRPRQuantifier(0, PG_INT32_MAX, true, @1); - else if (strcmp($2, "?|") == 0) + if (strcmp($2, "?") == 0 || strcmp($2, "?|") == 0) { + $$ = (Node *) makeRPRQuantifier(0, PG_INT32_MAX, true, @1); + /* "A* ?|B" = reluctant "A*?" plus alternation */ - $$ = (Node *) makeRPRQuantifier(0, PG_INT32_MAX, true, @1); - ((RPRPatternNode *) $$)->trailing_alt = true; + if (strcmp($2, "?|") == 0) + ((RPRPatternNode *) $$)->trailing_alt = true; } else ereport(ERROR, @@ -17815,13 +17817,13 @@ row_pattern_quantifier_opt: } | '+' Op { - if (strcmp($2, "?") == 0) - $$ = (Node *) makeRPRQuantifier(1, PG_INT32_MAX, true, @1); - else if (strcmp($2, "?|") == 0) + if (strcmp($2, "?") == 0 || strcmp($2, "?|") == 0) { + $$ = (Node *) makeRPRQuantifier(1, PG_INT32_MAX, true, @1); + /* "A+ ?|B" = reluctant "A+?" plus alternation */ - $$ = (Node *) makeRPRQuantifier(1, PG_INT32_MAX, true, @1); - ((RPRPatternNode *) $$)->trailing_alt = true; + if (strcmp($2, "?|") == 0) + ((RPRPatternNode *) $$)->trailing_alt = true; } else ereport(ERROR, @@ -17838,13 +17840,13 @@ row_pattern_quantifier_opt: errmsg("invalid quantifier combination: \"%s%s\"", $1, $2), errhint("Did you mean \"??\" for reluctant quantifier?"), parser_errposition(@1)); - if (strcmp($2, "?") == 0) - $$ = (Node *) makeRPRQuantifier(0, 1, true, @1); - else if (strcmp($2, "?|") == 0) + if (strcmp($2, "?") == 0 || strcmp($2, "?|") == 0) { + $$ = (Node *) makeRPRQuantifier(0, 1, true, @1); + /* "A? ?|B" = reluctant "A??" plus alternation */ - $$ = (Node *) makeRPRQuantifier(0, 1, true, @1); - ((RPRPatternNode *) $$)->trailing_alt = true; + if (strcmp($2, "?|") == 0) + ((RPRPatternNode *) $$)->trailing_alt = true; } else ereport(ERROR, @@ -21403,6 +21405,7 @@ makeRPRQuantifier(int32 min, int32 max, bool reluctant, int location) n->min = min; n->max = max; n->reluctant = reluctant; + n->trailing_alt = false; n->location = location; return n; } -- 2.34.1