diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index e1fc47ba3..98701b4b0 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -7885,22 +7885,22 @@ Expression PrimaryExpression() #PrimaryExpression: list=ParenthesedExpressionList() // Mutli-Variable Lambda Expression, e. g. // SELECT map_filter(my_column, (k,v) -> v.my_inner_column = 'some_value') - [ LOOKAHEAD(2) "->" - retval = Expression() - { - retval = LambdaExpression.from(list, retval); - } - ] - - - { - if (list.size() == 1) { - retval = new ParenthesedExpressionList( (Expression) list.getExpressions().get(0)); - } else { - retval = list; + // First-arg form (issue #2195): array_map((x,y,z) -> x + y, ...) + ( + LOOKAHEAD(2) "->" + retval = Expression() + { + retval = LambdaExpression.from(list, retval); + } + | + { + if (list.size() == 1) { + retval = new ParenthesedExpressionList( (Expression) list.getExpressions().get(0)); + } else { + retval = list; + } } - } - + ) // RowGet Expressions ( LOOKAHEAD(2) "." tmp=RelObjectName() { retval = new RowGetExpression(retval, tmp); } )* diff --git a/src/test/java/net/sf/jsqlparser/expression/LambdaExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/LambdaExpressionTest.java index c9437437c..4c6fa4ee9 100644 --- a/src/test/java/net/sf/jsqlparser/expression/LambdaExpressionTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/LambdaExpressionTest.java @@ -45,4 +45,10 @@ void testLambdaMultiParameterIssue2032() throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); } + @Test + void testLambdaFirstArgumentIssue2195() throws JSQLParserException { + String sqlStr = "select array_map((x,y,z) -> x + y, [1], [2], [4]) FROM table_name"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } + }