From 9c8a037675f02f368ff29d011c85a4b3b8a2a2a3 Mon Sep 17 00:00:00 2001 From: David Hayes Date: Mon, 11 Aug 2025 16:13:21 +0100 Subject: [PATCH] Fix[2290] - Fix overeager lambda function parsing `SELECT DATE_TRUNC('week',("schema"."tbl"."column" + INTERVAL '1 day')) FROM "schema"."tbl";` is parsing the `("schema"."tbl"."column" + INTERVAL '1 day')` as a LambdaFunction incorrectly, and crashes out. Increasing the lookahead depth by 1 ensures it fails to match on the `->` keyword (I believe), and falls into a simple expression instead. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JMH ``` jmh { includes = ['.*JSQLParserBenchmark.*'] warmupIterations = 2 fork = 5 iterations = 5 timeOnIteration = '5s' } ``` After: ``` 33.970 ±(99.9%) 1.773 ms/op [Average] (min, avg, max) = (31.405, 33.970, 37.302), stdev = 2.367 CI (99.9%): [32.197, 35.743] (assumes normal distribution) ``` Before: ``` 34.882 ±(99.9%) 1.923 ms/op [Average] (min, avg, max) = (31.191, 34.882, 37.406), stdev = 2.567 CI (99.9%): [32.959, 36.805] (assumes normal distribution) ``` --- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 4 ++-- src/test/resources/simple_parsing.txt | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index cf9098a4e..6e2d06197 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -5979,7 +5979,7 @@ ExpressionList SimpleExpressionList(): ( LOOKAHEAD(2, {!interrupted} ) "," ( - LOOKAHEAD( 6 ) expr=LambdaExpression() + LOOKAHEAD( 7 ) expr=LambdaExpression() | expr=SimpleExpression() ) @@ -6038,7 +6038,7 @@ ExpressionList ComplexExpressionList(): ( LOOKAHEAD(2) expr=OracleNamedFunctionParameter() | - LOOKAHEAD(6) expr=LambdaExpression() + LOOKAHEAD(7) expr=LambdaExpression() | expr=Expression() ) { expressions.add(expr); } diff --git a/src/test/resources/simple_parsing.txt b/src/test/resources/simple_parsing.txt index 7ae242dfc..94259f416 100644 --- a/src/test/resources/simple_parsing.txt +++ b/src/test/resources/simple_parsing.txt @@ -216,4 +216,6 @@ SELECT * FROM tbl WHERE day BETWEEN CAST(CAST((NOW() + INTERVAL '-30 day') AS date) AS timestamptz) AND - CAST(CAST((NOW() + INTERVAL '-1 day') AS date) AS timestamptz); \ No newline at end of file + CAST(CAST((NOW() + INTERVAL '-1 day') AS date) AS timestamptz); + +SELECT DATE_TRUNC('week',("schema"."tbl"."column" + INTERVAL '1 day')) FROM "schema"."tbl"; \ No newline at end of file