Skip to content

Commit b444bc2

Browse files
ivanclarksoftlisbon-craigb-13142
andauthored
fix(parser): keep parenthesized multi-param lambda as first function arg (#2455)
* fix(parser): keep parenthesized multi-param lambda as first function arg Signed-off-by: lisbon-craigb-13142 <lisbon-craigb-13142@users.noreply.github.com> * fix(parser): keep parenthesized multi-param lambda as first function arg Signed-off-by: lisbon-craigb-13142 <lisbon-craigb-13142@users.noreply.github.com> * style: apply spotless wrapping in LambdaExpressionTest Signed-off-by: ivanclarksoft <ivanclarksoft@users.noreply.github.com> --------- Signed-off-by: lisbon-craigb-13142 <lisbon-craigb-13142@users.noreply.github.com> Signed-off-by: ivanclarksoft <ivanclarksoft@users.noreply.github.com> Co-authored-by: lisbon-craigb-13142 <lisbon-craigb-13142@users.noreply.github.com> Co-authored-by: ivanclarksoft <ivanclarksoft@users.noreply.github.com>
1 parent 32a7949 commit b444bc2

2 files changed

Lines changed: 23 additions & 16 deletions

File tree

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

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7885,22 +7885,22 @@ Expression PrimaryExpression() #PrimaryExpression:
78857885
list=ParenthesedExpressionList()
78867886
// Mutli-Variable Lambda Expression, e. g.
78877887
// SELECT map_filter(my_column, (k,v) -> v.my_inner_column = 'some_value')
7888-
[ LOOKAHEAD(2) "->"
7889-
retval = Expression()
7890-
{
7891-
retval = LambdaExpression.from(list, retval);
7892-
}
7893-
]
7894-
7895-
7896-
{
7897-
if (list.size() == 1) {
7898-
retval = new ParenthesedExpressionList( (Expression) list.getExpressions().get(0));
7899-
} else {
7900-
retval = list;
7888+
// First-arg form (issue #2195): array_map((x,y,z) -> x + y, ...)
7889+
(
7890+
LOOKAHEAD(2) "->"
7891+
retval = Expression()
7892+
{
7893+
retval = LambdaExpression.from(list, retval);
7894+
}
7895+
|
7896+
{
7897+
if (list.size() == 1) {
7898+
retval = new ParenthesedExpressionList( (Expression) list.getExpressions().get(0));
7899+
} else {
7900+
retval = list;
7901+
}
79017902
}
7902-
}
7903-
7903+
)
79047904

79057905
// RowGet Expressions
79067906
( LOOKAHEAD(2) "." tmp=RelObjectName() { retval = new RowGetExpression(retval, tmp); } )*

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,14 @@ void testLambdaMultiParameterIssue2030() throws JSQLParserException {
4141

4242
@Test
4343
void testLambdaMultiParameterIssue2032() throws JSQLParserException {
44-
String sqlStr = "SELECT array_sort(array_agg(named_struct('depth', events_union.depth, 'eventtime',events_union.eventtime)), (left, right) -> case when(left.eventtime, left.depth) <(right.eventtime, right.depth) then -1 when(left.eventtime, left.depth) >(right.eventtime, right.depth) then 1 else 0 end) as col1 FROM your_table;";
44+
String sqlStr =
45+
"SELECT array_sort(array_agg(named_struct('depth', events_union.depth, 'eventtime',events_union.eventtime)), (left, right) -> case when(left.eventtime, left.depth) <(right.eventtime, right.depth) then -1 when(left.eventtime, left.depth) >(right.eventtime, right.depth) then 1 else 0 end) as col1 FROM your_table;";
46+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
47+
}
48+
49+
@Test
50+
void testLambdaFirstArgumentIssue2195() throws JSQLParserException {
51+
String sqlStr = "select array_map((x,y,z) -> x + y, [1], [2], [4]) FROM table_name";
4552
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
4653
}
4754

0 commit comments

Comments
 (0)