Skip to content

Commit 21680e9

Browse files
committed
Add "**" as a new token in scanners
DOUBLE_ASTERISK is now recognized but not yet implemented. This change improves error message readability, as "**" is supported in jsonpath_scan.l as ANY_P. However, the SQL standard for simplified JSON accessors does not specify "**", so it is not supported in that context.
1 parent 233423f commit 21680e9

File tree

6 files changed

+22
-4
lines changed

6 files changed

+22
-4
lines changed

src/backend/parser/gram.y

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
687687
*/
688688
%token <str> IDENT UIDENT FCONST SCONST USCONST BCONST XCONST Op
689689
%token <ival> ICONST PARAM
690-
%token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
690+
%token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER DOUBLE_ASTERISK
691691
%token LESS_EQUALS GREATER_EQUALS NOT_EQUALS
692692

693693
/*
@@ -16941,6 +16941,13 @@ indirection_el:
1694116941
{
1694216942
$$ = (Node *) makeNode(A_Star);
1694316943
}
16944+
| '.' DOUBLE_ASTERISK
16945+
{
16946+
ereport(ERROR,
16947+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16948+
errmsg("arbitrary depth wild card in simple json accessor not supported"),
16949+
parser_errposition(@2)));
16950+
}
1694416951
| '[' a_expr ']'
1694516952
{
1694616953
A_Indices *ai = makeNode(A_Indices);

src/backend/parser/scan.l

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ identifier {ident_start}{ident_cont}*
338338
typecast "::"
339339
dot_dot \.\.
340340
colon_equals ":="
341+
double_asterisk "**"
341342

342343
/*
343344
* These operator-like tokens (unlike the above ones) also match the {operator}
@@ -851,6 +852,11 @@ other .
851852
return COLON_EQUALS;
852853
}
853854

855+
{double_asterisk} {
856+
SET_YYLLOC();
857+
return DOUBLE_ASTERISK;
858+
}
859+
854860
{equals_greater} {
855861
SET_YYLLOC();
856862
return EQUALS_GREATER;

src/include/parser/scanner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ typedef union core_YYSTYPE
5050
* the ASCII characters plus these:
5151
* %token <str> IDENT UIDENT FCONST SCONST USCONST BCONST XCONST Op
5252
* %token <ival> ICONST PARAM
53-
* %token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
53+
* %token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER DOUBLE_ASTERISK
5454
* %token LESS_EQUALS GREATER_EQUALS NOT_EQUALS
5555
* The above token definitions *must* be the first ones declared in any
5656
* bison parser built atop this scanner, so that they will have consistent

src/interfaces/ecpg/preproc/pgc.l

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ array ({ident_cont}|{whitespace}|[\[\]\+\-\*\%\/\(\)\>\.])*
321321
typecast "::"
322322
dot_dot \.\.
323323
colon_equals ":="
324+
double_asterisk "**"
324325

325326
/*
326327
* These operator-like tokens (unlike the above ones) also match the {operator}
@@ -832,6 +833,10 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
832833
return COLON_EQUALS;
833834
}
834835

836+
{double_asterisk} {
837+
return DOUBLE_ASTERISK;
838+
}
839+
835840
{equals_greater} {
836841
return EQUALS_GREATER;
837842
}

src/pl/plpgsql/src/pl_gram.y

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt);
245245
*/
246246
%token <str> IDENT UIDENT FCONST SCONST USCONST BCONST XCONST Op
247247
%token <ival> ICONST PARAM
248-
%token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
248+
%token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER DOUBLE_ASTERISK
249249
%token LESS_EQUALS GREATER_EQUALS NOT_EQUALS
250250

251251
/*

src/test/regress/expected/jsonb.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6131,7 +6131,7 @@ SELECT (jb).a.b.c.* FROM test_jsonb_dot_notation;
61316131
(1 row)
61326132

61336133
SELECT (jb).a.**.x FROM test_jsonb_dot_notation; -- not supported
6134-
ERROR: syntax error at or near "**"
6134+
ERROR: arbitrary depth wild card in simple json accessor not supported yet
61356135
LINE 1: SELECT (jb).a.**.x FROM test_jsonb_dot_notation;
61366136
^
61376137
EXPLAIN (VERBOSE, COSTS OFF) SELECT (jb).* FROM test_jsonb_dot_notation;

0 commit comments

Comments
 (0)