Skip to content

Commit 12489af

Browse files
davyboyhayesDavid Hayes
andauthored
Fix[2290] - Fix overeager lambda function parsing (#2293)
`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. 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) ``` Co-authored-by: David Hayes <[email protected]>
1 parent 5ab6527 commit 12489af

File tree

2 files changed

+5
-3
lines changed

2 files changed

+5
-3
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5979,7 +5979,7 @@ ExpressionList SimpleExpressionList():
59795979
(
59805980
LOOKAHEAD(2, {!interrupted} ) ","
59815981
(
5982-
LOOKAHEAD( 6 ) expr=LambdaExpression()
5982+
LOOKAHEAD( 7 ) expr=LambdaExpression()
59835983
|
59845984
expr=SimpleExpression()
59855985
)
@@ -6038,7 +6038,7 @@ ExpressionList ComplexExpressionList():
60386038
(
60396039
LOOKAHEAD(2) expr=OracleNamedFunctionParameter()
60406040
|
6041-
LOOKAHEAD(6) expr=LambdaExpression()
6041+
LOOKAHEAD(7) expr=LambdaExpression()
60426042
|
60436043
expr=Expression()
60446044
) { expressions.add(expr); }

src/test/resources/simple_parsing.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,4 +216,6 @@ SELECT * FROM tbl WHERE
216216
day BETWEEN
217217
CAST(CAST((NOW() + INTERVAL '-30 day') AS date) AS timestamptz)
218218
AND
219-
CAST(CAST((NOW() + INTERVAL '-1 day') AS date) AS timestamptz);
219+
CAST(CAST((NOW() + INTERVAL '-1 day') AS date) AS timestamptz);
220+
221+
SELECT DATE_TRUNC('week',("schema"."tbl"."column" + INTERVAL '1 day')) FROM "schema"."tbl";

0 commit comments

Comments
 (0)