Skip to content

Commit 0c8073f

Browse files
committed
perf: create the deque of NOT tokens only for a NOT condition
`Condition()` created a deque for the tokens of a leading `NOT` on every call, though few conditions have one. Each empty `ArrayDeque` allocates its 16-slot array up front, so parsing `performance.sql` allocated 585 KB more per parse. The deque is now created at the first `NOT`.
1 parent e8de6e9 commit 0c8073f

1 file changed

Lines changed: 7 additions & 2 deletions

File tree

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12394,7 +12394,7 @@ Expression Condition():
1239412394
Expression left;
1239512395
// Leading NOT / ! prefixes, leftmost token wraps outermost (issue #1170).
1239612396
final Deque<Boolean> exclamationMarks = new ArrayDeque<Boolean>();
12397-
final Deque<Token> notTokens = new ArrayDeque<Token>();
12397+
Deque<Token> notTokens = null;
1239812398
int oraclePrior = EqualsTo.NO_ORACLE_PRIOR;
1239912399
int oracleJoin = EqualsTo.NO_ORACLE_JOIN;
1240012400
Token prior = null;
@@ -12403,7 +12403,12 @@ Expression Condition():
1240312403
(
1240412404
LOOKAHEAD({ getToken(1).kind == K_NOT || "!".equals(getToken(1).image) })
1240512405
( <K_NOT> { exclamationMarks.addFirst(Boolean.FALSE); } | "!" { exclamationMarks.addFirst(Boolean.TRUE); } )
12406-
{ notTokens.addFirst(getToken(0)); }
12406+
{
12407+
if (notTokens == null) {
12408+
notTokens = new ArrayDeque<Token>();
12409+
}
12410+
notTokens.addFirst(getToken(0));
12411+
}
1240712412
)*
1240812413
(
1240912414
LOOKAHEAD(<K_EXISTS> JdbcNamedParameter() ":", {

0 commit comments

Comments
 (0)