Skip to content

Commit b18fbca

Browse files
feat: avoid looping through the tokens every single time
Signed-off-by: Andreas Reichel <[email protected]>
1 parent 7ac6cd0 commit b18fbca

File tree

5 files changed

+37
-15
lines changed

5 files changed

+37
-15
lines changed

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,7 @@ TOKEN : /* Statement Separators */
632632
TOKEN : /* Operators */
633633
{
634634
<OP_GREATERTHANEQUALS: ">" (<WHITESPACE>)* "=">
635+
| <OP_COSINESIMILARITY: "<=>">
635636
| <OP_MINORTHANEQUALS: "<" (<WHITESPACE>)* "=">
636637
| <OP_NOTEQUALSSTANDARD: "<" (<WHITESPACE>)* ">">
637638
| <OP_NOTEQUALSBANG: "!" (<WHITESPACE>)* "=">
@@ -758,11 +759,15 @@ TOKEN:
758759
// 2) continue tokenizing after that <SPECIAL_ESC> with a new <S_CHAR_LITERAL> or any other Token
759760
if ( !configuration.getAsBoolean(Feature.allowBackslashEscapeCharacter)
760761
&& matchedToken.image.contains("\\'") ) {
762+
761763
matchedToken.image = "'" + image.substring( 0, image.indexOf("\\'") + 1 ) + "'";
762764
// `charLiteralIndex` defined in TokenManagerDeclaration above
763765
matchedToken.kind = charLiteralIndex;
764766
input_stream.backup(image.length() + 1 - matchedToken.image.length());
765-
} else if ( configuration.getAsBoolean(Feature.allowBackslashEscapeCharacter) && matchedToken.image.contains("\\''") ) {
767+
768+
} else if ( configuration.getAsBoolean(Feature.allowBackslashEscapeCharacter)
769+
&& matchedToken.image.contains("\\''") ) {
770+
766771
matchedToken.image = "'" + image.substring( 0, image.lastIndexOf("\\'") + 3);
767772
// `charLiteralIndex` defined in TokenManagerDeclaration above
768773
matchedToken.kind = charLiteralIndex;
@@ -771,7 +776,9 @@ TOKEN:
771776
}
772777
| < S_QUOTED_IDENTIFIER: "\"" ( "\"\"" | ~["\n","\r","\""])* "\"" | "$$" (~["$"])* "$$" | ("`" (~["\n","\r","`"])+ "`") | ( "[" (~["\n","\r","]"])* "]" ) >
773778
{
774-
if ( !configuration.getAsBoolean(Feature.allowSquareBracketQuotation) && matchedToken.image.charAt(0) == '[' ) {
779+
if ( !configuration.getAsBoolean(Feature.allowSquareBracketQuotation)
780+
&& matchedToken.image.charAt(0) == '[' ) {
781+
775782
matchedToken.image = "[";
776783
// `squaredBracketOpenIndex` defined in TokenManagerDeclaration above
777784
matchedToken.kind = squaredBracketOpenIndex;
@@ -4624,7 +4631,7 @@ Expression RegularCondition() #RegularCondition:
46244631
| "-#" { result = new JsonOperator("-#"); }
46254632
| "<->" { result = new GeometryDistance("<->"); }
46264633
| "<#>" { result = new GeometryDistance("<#>"); }
4627-
| "<=>" { result = new CosineSimilarity(); }
4634+
| <OP_COSINESIMILARITY> { result = new CosineSimilarity(); }
46284635
)
46294636

46304637
( LOOKAHEAD(2) <K_PRIOR> rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; }

src/test/java/net/sf/jsqlparser/benchmark/DynamicParserRunner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public DynamicParserRunner(URLClassLoader loader) throws Exception {
3434
@Override
3535
public Statements parseStatements(String sql,
3636
ExecutorService executorService,
37-
Consumer<CCJSqlParser> consumer) throws Exception {
38-
return (Statements) parseStatementsMethod.invoke(null, sql, executorService, null);
37+
Consumer<?> consumer) throws Exception {
38+
return (Statements) parseStatementsMethod.invoke(null, sql, executorService, consumer);
3939
}
4040
}

src/test/java/net/sf/jsqlparser/benchmark/JSQLParserBenchmark.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@
1010
package net.sf.jsqlparser.benchmark;
1111

1212
import net.sf.jsqlparser.parser.CCJSqlParser;
13+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
14+
import net.sf.jsqlparser.statement.Statement;
1315
import net.sf.jsqlparser.statement.Statements;
1416
import org.openjdk.jmh.annotations.*;
17+
import org.openjdk.jmh.infra.Blackhole;
1518

1619
import java.io.IOException;
1720
import java.io.InputStream;
@@ -33,7 +36,7 @@ public class JSQLParserBenchmark {
3336
SqlParserRunner runner;
3437

3538
// @Param({ "latest", "5.2", "5.1", "5.0", "4.9", "4.8", "4.7", "4.6", "4.5" })
36-
@Param({"latest", "5.2", "5.1"})
39+
@Param({"latest"})
3740
public String version;
3841

3942
@Setup(Level.Trial)
@@ -71,15 +74,26 @@ private Path downloadJsqlparserJar(String version) throws IOException {
7174
return jarFile;
7275
}
7376

74-
@Benchmark
75-
public void parseSQLStatements() throws Exception {
77+
//@Benchmark
78+
public void parseSQLStatements(Blackhole blackhole) throws Exception {
7679
final Statements statements = runner.parseStatements(
7780
sqlContent,
7881
executorService,
79-
(Consumer<CCJSqlParser>) parser -> {
80-
// No-op consumer (or you can log/validate each parser if desired)
81-
});
82-
assert statements.size() == 4;
82+
null);
83+
blackhole.consume(statements);
84+
}
85+
86+
@Benchmark
87+
public void parseQuotedText(Blackhole blackhole) throws Exception {
88+
String sqlStr = "SELECT ('\\'', 'a');\n"
89+
+ "INSERT INTO recycle_record (a,f) VALUES ('\\'anything', 'abc');\n"
90+
+ "INSERT INTO recycle_record (a,f) VALUES ('\\'','83653692186728700711687663398101');\n";
91+
92+
final Statements statements = runner.parseStatements(
93+
sqlStr,
94+
executorService,
95+
(Consumer<CCJSqlParser>) parser -> parser.withBackslashEscapeCharacter(true));
96+
blackhole.consume(statements);
8397
}
8498

8599
@TearDown(Level.Trial)

src/test/java/net/sf/jsqlparser/benchmark/LatestClasspathRunner.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ public class LatestClasspathRunner implements SqlParserRunner {
2020
@Override
2121
public Statements parseStatements(String sql,
2222
ExecutorService executorService,
23-
Consumer<CCJSqlParser> consumer) throws Exception {
23+
Consumer<?> consumer) throws Exception {
2424
return net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(sql, executorService,
25-
consumer);
25+
(Consumer<CCJSqlParser>) consumer
26+
);
2627
}
2728
}
2829

src/test/java/net/sf/jsqlparser/benchmark/SqlParserRunner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@
1717

1818
public interface SqlParserRunner {
1919
Statements parseStatements(String sql, ExecutorService executorService,
20-
Consumer<CCJSqlParser> consumer) throws Exception;
20+
Consumer<?> consumer) throws Exception;
2121
}

0 commit comments

Comments
 (0)