From 6fb262ad6fa24f481692c62d0e90940ab44bbd96 Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Wed, 6 Dec 2023 22:29:13 +0900 Subject: [PATCH v28 5/6] JSON_TABLE: don't assign precedence to NESTED, PATH --- src/backend/parser/gram.y | 37 +++++++++++++++++++++++++++---------- src/backend/parser/parser.c | 11 +++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 3755434af0..9bed5168e3 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -817,7 +817,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); * FORMAT_LA, NULLS_LA, WITH_LA, and WITHOUT_LA are needed to make the grammar * LALR(1). */ -%token FORMAT_LA NOT_LA NULLS_LA WITH_LA WITHOUT_LA +%token FORMAT_LA NESTED_LA NOT_LA NULLS_LA WITH_LA WITHOUT_LA /* * The grammar likewise thinks these tokens are keywords, but they are never @@ -911,8 +911,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); */ %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL -%nonassoc NESTED -%left PATH %% /* @@ -16771,7 +16769,7 @@ json_table_column_definition: n->location = @1; $$ = (Node *) n; } - | NESTED path_opt Sconst + | NESTED_LA PATH Sconst COLUMNS '(' json_table_column_definition_list ')' { JsonTableColumn *n = makeNode(JsonTableColumn); @@ -16783,7 +16781,7 @@ json_table_column_definition: n->location = @1; $$ = (Node *) n; } - | NESTED path_opt Sconst AS name + | NESTED_LA PATH Sconst AS name COLUMNS '(' json_table_column_definition_list ')' { JsonTableColumn *n = makeNode(JsonTableColumn); @@ -16795,6 +16793,30 @@ json_table_column_definition: n->location = @1; $$ = (Node *) n; } + | NESTED Sconst + COLUMNS '(' json_table_column_definition_list ')' + { + JsonTableColumn *n = makeNode(JsonTableColumn); + + n->coltype = JTC_NESTED; + n->pathspec = $2; + n->pathname = NULL; + n->columns = $5; + n->location = @1; + $$ = (Node *) n; + } + | NESTED Sconst AS name + COLUMNS '(' json_table_column_definition_list ')' + { + JsonTableColumn *n = makeNode(JsonTableColumn); + + n->coltype = JTC_NESTED; + n->pathspec = $2; + n->pathname = $4; + n->columns = $7; + n->location = @1; + $$ = (Node *) n; + } ; json_table_column_path_specification_clause_opt: @@ -16802,11 +16824,6 @@ json_table_column_path_specification_clause_opt: | /* EMPTY */ { $$ = NULL; } ; -path_opt: - PATH { } - | /* EMPTY */ { } - ; - json_table_plan_clause_opt: PLAN '(' json_table_plan ')' { $$ = $3; } | PLAN DEFAULT '(' json_table_default_plan_choices ')' diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c index e17c310cc1..e3092f2c3e 100644 --- a/src/backend/parser/parser.c +++ b/src/backend/parser/parser.c @@ -138,6 +138,7 @@ base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner) switch (cur_token) { case FORMAT: + case NESTED: cur_token_length = 6; break; case NOT: @@ -204,6 +205,16 @@ base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner) } break; + case NESTED: + /* Replace NESTED by NESTED_LA if it's followed by PATH */ + switch (next_token) + { + case PATH: + cur_token = NESTED_LA; + break; + } + break; + case NOT: /* Replace NOT by NOT_LA if it's followed by BETWEEN, IN, etc */ switch (next_token) -- 2.35.3