Skip to content

Commit a6624b7

Browse files
committed
perf: create PrimaryExpression's sign and JSON operator lists on first use
`PrimaryExpression()` created two lists on every call: one for chained signs such as `- -1` and one for JSON operators such as `->`. Nearly every primary expression has neither, so both lists usually stayed empty. They are now created at their first element.
1 parent d192157 commit a6624b7

1 file changed

Lines changed: 18 additions & 5 deletions

File tree

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13198,21 +13198,29 @@ Expression PrimaryExpression() #PrimaryExpression:
1319813198
Token token = null;
1319913199
Token sign = null;
1320013200
Token innerSign;
13201-
List<Token> innerSigns = new ArrayList<Token>();
13201+
List<Token> innerSigns = null;
1320213202
ColDataType type = null;
1320313203
boolean not = false;
1320413204
boolean exclamationMarkNot = false;
1320513205
boolean dateExpressionAllowed = true;
1320613206
ExpressionList list;
1320713207

13208-
final List<Map.Entry<Expression, String>> jsonIdents = new ArrayList<Map.Entry<Expression, String>>();
13208+
List<Map.Entry<Expression, String>> jsonIdents = null;
1320913209
}
1321013210
{
1321113211
[ <K_NOT> { not=true; } | "!" { not=true; exclamationMarkNot=true; } ]
1321213212
[
1321313213
( sign="+" | sign="-" | sign="~" )
1321413214
// DuckDB's chained signs, e.g. - -1 or +-+1
13215-
( LOOKAHEAD(1) ( innerSign="+" | innerSign="-" | innerSign="~" ) { innerSigns.add(innerSign); } )*
13215+
(
13216+
LOOKAHEAD(1) ( innerSign="+" | innerSign="-" | innerSign="~" )
13217+
{
13218+
if (innerSigns == null) {
13219+
innerSigns = new ArrayList<Token>();
13220+
}
13221+
innerSigns.add(innerSign);
13222+
}
13223+
)*
1321613224
]
1321713225
(
1321813226
<K_NULL> { retval = new NullValue(); }
@@ -13411,6 +13419,9 @@ Expression PrimaryExpression() #PrimaryExpression:
1341113419
expression=SimpleExpression()
1341213420
)
1341313421
{
13422+
if (jsonIdents == null) {
13423+
jsonIdents = new ArrayList<Map.Entry<Expression, String>>();
13424+
}
1341413425
jsonIdents.add(new AbstractMap.SimpleEntry<Expression, String>(expression, token.image ));
1341513426
}
1341613427
)+
@@ -13430,8 +13441,10 @@ Expression PrimaryExpression() #PrimaryExpression:
1343013441
timezoneExpr.setLeftExpression(retval);
1343113442
retval=timezoneExpr;
1343213443
}
13433-
for (int i = innerSigns.size() - 1; i >= 0; i--) {
13434-
retval = new SignedExpression(innerSigns.get(i).image.charAt(0), retval);
13444+
if (innerSigns != null) {
13445+
for (int i = innerSigns.size() - 1; i >= 0; i--) {
13446+
retval = new SignedExpression(innerSigns.get(i).image.charAt(0), retval);
13447+
}
1343513448
}
1343613449
if (sign != null) {
1343713450
retval = new SignedExpression(sign.image.charAt(0), retval);

0 commit comments

Comments
 (0)