Skip to content

Commit eef8e6e

Browse files
feat: allow simple expressions for JsonExpression
- fixes #2181 Signed-off-by: Andreas Reichel <[email protected]>
1 parent b9dc866 commit eef8e6e

File tree

2 files changed

+64
-19
lines changed

2 files changed

+64
-19
lines changed

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

+35-19
Original file line numberDiff line numberDiff line change
@@ -5385,15 +5385,23 @@ Expression PrimaryExpression() #PrimaryExpression:
53855385

53865386
// Check for JSON operands
53875387
[
5388-
LOOKAHEAD(2) (
5388+
LOOKAHEAD(2) (
53895389
LOOKAHEAD(2) (
5390-
( token="->" | token=":" /*Snowflake GET_PATH Operator*/ ) expression=Expression()
5390+
token="->"
5391+
|
5392+
token=":"
5393+
|
5394+
token="->>"
53915395
|
5392-
token="->>" expression=Expression()
5396+
token="#>"
53935397
|
5394-
token="#>" expression=Expression()
5398+
token="#>>"
5399+
)
5400+
5401+
(
5402+
LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing) && !interrupted }) expression=Expression()
53955403
|
5396-
token="#>>" expression=Expression()
5404+
expression=SimpleExpression()
53975405
)
53985406
{
53995407
jsonIdents.add(new AbstractMap.SimpleEntry<Expression, String>(expression, token.image ));
@@ -5641,7 +5649,7 @@ StructType StructType() #StruckType:
56415649
JsonExpression JsonExpression(Expression expr, List<Map.Entry<Expression, String>> idents) : {
56425650
JsonExpression result = new JsonExpression(expr, idents);
56435651
Expression expression;
5644-
Token token;
5652+
Token token=null;
56455653
ColDataType type = null;
56465654
CastExpression castExpr = null;
56475655
}
@@ -5666,19 +5674,27 @@ JsonExpression JsonExpression(Expression expr, List<Map.Entry<Expression, String
56665674
result = new JsonExpression(expr);
56675675
}
56685676

5669-
(
5670-
LOOKAHEAD(2) (
5671-
( token="->" | token=":" /*Snowflake GET_PATH Operator*/ ) expression=Expression()
5672-
|
5673-
token="->>" expression=Expression()
5674-
|
5675-
token="#>" expression=Expression()
5676-
|
5677-
token="#>>" expression=Expression()
5678-
)
5679-
{
5680-
result.addIdent( expression, token.image );
5681-
}
5677+
LOOKAHEAD(2) (
5678+
LOOKAHEAD(2) (
5679+
token="->"
5680+
|
5681+
token=":"
5682+
|
5683+
token="->>"
5684+
|
5685+
token="#>"
5686+
|
5687+
token="#>>"
5688+
)
5689+
5690+
(
5691+
LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing) && !interrupted}) expression=Expression()
5692+
|
5693+
expression=SimpleExpression()
5694+
)
5695+
{
5696+
result.addIdent( expression, token.image );
5697+
}
56825698
)*
56835699
)*
56845700

src/test/java/net/sf/jsqlparser/expression/JsonExpressionTest.java

+29
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,33 @@ void testParenthesedJsonExpressionsIssue1792() throws JSQLParserException {
149149
void testIssue2054(String sqlStr) throws JSQLParserException {
150150
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
151151
}
152+
153+
@Test
154+
void testIssue2181() throws JSQLParserException {
155+
String sqlStr =
156+
"SELECT\n" +
157+
" 1\n" +
158+
"FROM\n" +
159+
" public.tbl\n" +
160+
"WHERE\n" +
161+
" fieldd ->> 'att1' = 1\n" +
162+
" OR fieldd ->> 'att1' = 1\n" +
163+
" OR fieldd ->> 'att1' = 1\n" +
164+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
165+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
166+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
167+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
168+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
169+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
170+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
171+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
172+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
173+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
174+
" OR fieldd::jsonb -> 'att2' @> 1\n" +
175+
"ORDER BY\n" +
176+
" att ASC\n" +
177+
"LIMIT\n" +
178+
" 1";
179+
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
180+
}
152181
}

0 commit comments

Comments
 (0)