Skip to content

Commit e8243dc

Browse files
committed
perf: cut the lookahead scans in ComplexExpressionList
`ComplexExpressionList()` parses every function argument list, and its lookaheads took 11% of parse CPU on `performance.sql`. The loop's `LOOKAHEAD(2) ","` scanned through the choice behind the comma, so every nested lookahead ran once in the scan and again when the choice was entered. And JavaCC scanned a token of `Expression()` before entering the default alternative of both choices, which a semantic lookahead on that alternative avoids. The loop now checks for a comma by token kind and the default alternatives enter `Expression()` directly. `SimpleExpressionList()` gets the same two changes. Parser CPU per parse drops from 33.5 ms to 29.8 ms (-11.5%, three interleaved pairs), and `./gradlew jmh` from 39.31 to 32.06 ms/op.
1 parent a075737 commit e8243dc

1 file changed

Lines changed: 6 additions & 5 deletions

File tree

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12783,11 +12783,11 @@ ExpressionList SimpleExpressionList():
1278312783
{
1278412784
expr=SimpleExpression() { expressions.add(expr); }
1278512785
(
12786-
LOOKAHEAD(2, {!interrupted} ) ","
12786+
LOOKAHEAD({ !interrupted && getToken(1).kind == K_COMMA }) ","
1278712787
(
1278812788
LOOKAHEAD( RelObjectName() "->", { !isJsonArrowDialect() } ) expr=LambdaExpression()
1278912789
|
12790-
expr=SimpleExpression()
12790+
LOOKAHEAD({ !interrupted }) expr=SimpleExpression()
1279112791
)
1279212792
{
1279312793
expressions.add(expr);
@@ -12835,22 +12835,23 @@ ExpressionList ComplexExpressionList():
1283512835
|
1283612836
LOOKAHEAD(2, { isNamedParameterAssignmentAhead() }) expr=PostgresNamedFunctionParameter()
1283712837
|
12838-
expr=Expression()
12838+
// JavaCC scans an unguarded alternative's first token; a semantic-only lookahead enters directly
12839+
LOOKAHEAD({ !interrupted }) expr=Expression()
1283912840
)
1284012841
{
1284112842
expressions.add(expr);
1284212843
}
1284312844

1284412845
(
12845-
LOOKAHEAD(2, {!interrupted}) ","
12846+
LOOKAHEAD({ !interrupted && getToken(1).kind == K_COMMA }) ","
1284612847
(
1284712848
LOOKAHEAD(2, { isNamedParameterAssignmentAhead() }) expr=OracleNamedFunctionParameter()
1284812849
|
1284912850
LOOKAHEAD(2, { isNamedParameterAssignmentAhead() }) expr=PostgresNamedFunctionParameter()
1285012851
|
1285112852
LOOKAHEAD( RelObjectName() "->", { !isJsonArrowDialect() } ) expr=LambdaExpression()
1285212853
|
12853-
expr=Expression()
12854+
LOOKAHEAD({ !interrupted }) expr=Expression()
1285412855
) { expressions.add(expr); }
1285512856
)*
1285612857

0 commit comments

Comments
 (0)