Skip to content

Commit a470fe2

Browse files
KEYs can be SQL Value Expressions
Add another testcase
1 parent c30e29d commit a470fe2

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3680,10 +3680,9 @@ JsonFunction JsonFunction() : {
36803680
(
36813681
// --- First Element
36823682
[ "KEY" { usingKeyKeyword = true; } ]
3683-
keyToken = <S_IDENTIFIER>
3683+
( keyToken = <DT_ZONE> | keyToken = <S_DOUBLE> | keyToken = <S_LONG> | keyToken = <S_HEX> | keyToken = <S_CHAR_LITERAL> | keyToken = <S_IDENTIFIER> | keyToken = <S_QUOTED_IDENTIFIER> )
36843684
( ":" | "VALUE" { usingValueKeyword = true; } )
3685-
// token = <DT_ZONE> | <S_DOUBLE> | <S_LONG> | <S_HEX> | <S_CHAR_LITERAL> { result.setValue( token.image ); }
3686-
valueToken = <S_IDENTIFIER> { keyValuePair = new JsonKeyValuePair( keyToken.image, valueToken.image, usingKeyKeyword, usingValueKeyword ); result.add(keyValuePair); }
3685+
( valueToken = <S_IDENTIFIER> | valueToken = <S_QUOTED_IDENTIFIER> ) { keyValuePair = new JsonKeyValuePair( keyToken.image, valueToken.image, usingKeyKeyword, usingValueKeyword ); result.add(keyValuePair); }
36873686

36883687
[ <K_FORMAT> <K_JSON> { keyValuePair.setUsingFormatJson( true ); } ]
36893688

@@ -3772,10 +3771,9 @@ JsonAggregateFunction JsonAggregateFunction() : {
37723771
( <K_JSON_OBJECTAGG>
37733772
"(" { result.setType( JsonFunctionType.OBJECT ); }
37743773
[ "KEY" { result.setUsingKeyKeyword( true ); } ]
3775-
token = <S_IDENTIFIER> { result.setKey( token.image ); }
3774+
( token = <DT_ZONE> | token = <S_DOUBLE> | token = <S_LONG> | token = <S_HEX> | token = <S_CHAR_LITERAL> | token = <S_IDENTIFIER> | token = <S_QUOTED_IDENTIFIER> ) { result.setKey( token.image ); }
37763775
( ":" | "VALUE" {result.setUsingValueKeyword( true ); } )
3777-
// token = <DT_ZONE> | <S_DOUBLE> | <S_LONG> | <S_HEX> | <S_CHAR_LITERAL> { result.setValue( token.image ); }
3778-
token = <S_IDENTIFIER> { result.setValue( token.image ); }
3776+
( token = <S_IDENTIFIER> | token = <S_QUOTED_IDENTIFIER> ) { result.setValue( token.image ); }
37793777

37803778
[ <K_FORMAT> <K_JSON> { result.setUsingFormatJson( true ); } ]
37813779

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,25 @@ public void testIssue1260() throws JSQLParserException {
169169
+ " json_array(null on null)\n" + " )\n" + " from (\n"
170170
+ " select 2 \"v0\"\n" + " union\n" + " select 4 \"ID\"\n" + " ) \"t\"\n"
171171
+ " ) as text)", true);
172+
173+
TestUtils.assertExpressionCanBeParsedAndDeparsed("listagg( json_object(key 'v0' value \"v0\"), ',' )", true);
174+
175+
TestUtils.assertSqlCanBeParsedAndDeparsed("select (\n" +
176+
" select coalesce(\n" +
177+
" cast(('[' || listagg(\n" +
178+
" json_object(key 'v0' value \"v0\"),\n" +
179+
" ','\n" +
180+
" ) || ']') as varchar(32672)),\n" +
181+
" json_array()\n" +
182+
" )\n" +
183+
" from (\n" +
184+
" select cast(null as timestamp) \"v0\"\n" +
185+
" from SYSIBM.DUAL\n" +
186+
" union all\n" +
187+
" select timestamp '2000-03-15 10:15:00.0' \"a\"\n" +
188+
" from SYSIBM.DUAL\n" +
189+
" ) \"t\"\n" +
190+
")\n" +
191+
"from SYSIBM.DUAL", true);
172192
}
173193
}

0 commit comments

Comments
 (0)