Skip to content

Commit e14d7eb

Browse files
feat: sync with Master
Signed-off-by: Andreas Reichel <[email protected]>
1 parent cfe2d8c commit e14d7eb

File tree

23 files changed

+145
-54
lines changed

23 files changed

+145
-54
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# [JSqlParser 5.1 Website](https://jsqlparser.github.io/JSqlParser) <img src="src/site/sphinx/_images/logo-no-background.svg" alt="drawing" width="200" align="right"/>
1+
# [JSqlParser 5.2 Website](https://jsqlparser.github.io/JSqlParser) <img src="src/site/sphinx/_images/logo-no-background.svg" alt="drawing" width="200" align="right"/>
22

33
[![CI](https://github.com/JSQLParser/JSqlParser/actions/workflows/ci.yml/badge.svg)](https://github.com/JSQLParser/JSqlParser/actions/workflows/ci.yml)
44
[![Coverage Status](https://coveralls.io/repos/JSQLParser/JSqlParser/badge.svg?branch=master)](https://coveralls.io/r/JSQLParser/JSqlParser?branch=master)
@@ -69,6 +69,18 @@ JSQLParser-4.9 was the last JDK8 compatible version. JSQLParser-5.0 and later de
6969

7070
Building JSQLParser-5.1 and newer with Gradle will depend on a JDK17 toolchain due to the used plugins.
7171

72+
## Performance
73+
74+
Unfortunately the released JSQLParser-5.2 shows a performance deterioration caused by commit [30cf5d7](https://github.com/JSQLParser/JSqlParser/commit/30cf5d7b930ae0a076f49deb5cc841d39e62b3dc) related to `FunctionAllColumns()`.
75+
This has been resolved in JSQLParser 5.3-SNAPSHOT and JMH benchmarks have been added to avoid such regressions in the future. Further all `LOOKAHEADS` have been revised one by one, and we have gained back a very good performance of the Parser.
76+
77+
```text
78+
Benchmark (version) Mode Cnt Score Error Units
79+
JSQLParserBenchmark.parseSQLStatements latest avgt 30 78.287 ± 4.730 ms/op <-- `FunctionAllColumns()` disabled
80+
JSQLParserBenchmark.parseSQLStatements 5.2 avgt 30 400.876 ± 8.291 ms/op
81+
JSQLParserBenchmark.parseSQLStatements 5.1 avgt 30 85.731 ± 1.288 ms/op
82+
```
83+
7284
## [Supported Grammar and Syntax](https://jsqlparser.github.io/JSqlParser/syntax.html)
7385

7486
**JSqlParser** aims to support the SQL standard as well as all major RDBMS. Any missing syntax or features can be added on demand.

build.gradle

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ dependencies {
104104
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.4'
105105

106106
// https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter
107-
testImplementation 'org.mockito:mockito-junit-jupiter:+'
107+
testImplementation 'org.mockito:mockito-junit-jupiter:5.18.0'
108108

109109
// Performance Benchmark
110110
testImplementation 'org.openjdk.jmh:jmh-core:+'
@@ -116,6 +116,7 @@ dependencies {
116116
// enforce latest version of JavaCC
117117
testImplementation('org.javacc:core:8.1.0-SNAPSHOT') { changing = true }
118118
testImplementation('org.javacc.generator:java:8.1.0-SNAPSHOT') { changing = true }
119+
119120
javacc('org.javacc:core:8.1.0-SNAPSHOT') { changing = true }
120121
javacc('org.javacc.generator:java:8.1.0-SNAPSHOT') { changing = true }
121122
}
@@ -644,8 +645,8 @@ check {
644645

645646
jmh {
646647
includes = ['.*JSQLParserBenchmark.*']
647-
warmupIterations = 3
648+
warmupIterations = 2
648649
fork = 3
649-
iterations = 10
650+
iterations = 5
650651
timeOnIteration = '1s'
651652
}

pom.xml

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<modelVersion>4.0.0</modelVersion>
33
<groupId>com.github.jsqlparser</groupId>
44
<artifactId>jsqlparser</artifactId>
5-
<version>5.2-SNAPSHOT</version>
5+
<version>5.4-SNAPSHOT</version>
66
<name>JSQLParser library</name>
77
<inceptionYear>2004</inceptionYear>
88
<organization>
@@ -71,7 +71,7 @@
7171
<dependency>
7272
<groupId>org.apache.commons</groupId>
7373
<artifactId>commons-lang3</artifactId>
74-
<version>[3.14.0,)</version>
74+
<version>3.17.0</version>
7575
<scope>test</scope>
7676
</dependency>
7777
<dependency>
@@ -88,6 +88,22 @@
8888
<version>1.3</version>
8989
<scope>test</scope>
9090
</dependency>
91+
92+
<!-- JMH core API -->
93+
<dependency>
94+
<groupId>org.openjdk.jmh</groupId>
95+
<artifactId>jmh-core</artifactId>
96+
<version>1.37</version>
97+
</dependency>
98+
99+
<!-- JMH annotation processor -->
100+
<dependency>
101+
<groupId>org.openjdk.jmh</groupId>
102+
<artifactId>jmh-generator-annprocess</artifactId>
103+
<version>1.37</version>
104+
<scope>provided</scope>
105+
</dependency>
106+
91107
</dependencies>
92108

93109
<developers>
@@ -179,7 +195,7 @@
179195
<plugin>
180196
<groupId>org.codehaus.mojo</groupId>
181197
<artifactId>build-helper-maven-plugin</artifactId>
182-
<version>3.2.0</version>
198+
<version>3.6.0</version>
183199
<executions>
184200
<execution>
185201
<id>add-source</id>
@@ -198,16 +214,25 @@
198214
</plugin>
199215
<plugin>
200216
<artifactId>maven-compiler-plugin</artifactId>
201-
<version>3.10.1</version>
217+
<version>3.14.0</version>
202218
<configuration>
203219
<source>11</source>
204220
<target>11</target>
205221
<showWarnings>true</showWarnings>
206222
<encoding>${project.build.sourceEncoding}</encoding>
207223
<showDeprecation>true</showDeprecation>
208-
<fork>true</fork>
209-
<meminitial>128m</meminitial>
210224
<maxmem>2000m</maxmem>
225+
<compilerArgs>
226+
<arg>-J-Xss4M</arg>
227+
</compilerArgs>
228+
<fork>true</fork>
229+
<annotationProcessorPaths>
230+
<path>
231+
<groupId>org.openjdk.jmh</groupId>
232+
<artifactId>jmh-generator-annprocess</artifactId>
233+
<version>1.37</version>
234+
</path>
235+
</annotationProcessorPaths>
211236
</configuration>
212237
</plugin>
213238
<plugin>
@@ -313,7 +338,7 @@
313338
<plugin>
314339
<groupId>org.apache.maven.plugins</groupId>
315340
<artifactId>maven-javadoc-plugin</artifactId>
316-
<version>3.4.1</version>
341+
<version>3.11.2</version>
317342
<executions>
318343
<execution>
319344
<id>attach-javadocs</id>
@@ -335,7 +360,7 @@
335360
<plugin>
336361
<groupId>org.apache.maven.plugins</groupId>
337362
<artifactId>maven-jar-plugin</artifactId>
338-
<version>3.3.0</version>
363+
<version>3.4.2</version>
339364
<configuration>
340365
<archive>
341366
<manifestEntries>
@@ -358,7 +383,7 @@
358383
<plugin>
359384
<groupId>org.apache.maven.plugins</groupId>
360385
<artifactId>maven-surefire-plugin</artifactId>
361-
<version>3.2.5</version>
386+
<version>3.5.2</version>
362387
<configuration>
363388
<trimStackTrace>false</trimStackTrace>
364389
<!-- AlterViewTest does deep reflection -->
@@ -373,7 +398,7 @@
373398
<plugin>
374399
<groupId>org.jacoco</groupId>
375400
<artifactId>jacoco-maven-plugin</artifactId>
376-
<version>0.8.10</version>
401+
<version>0.8.11</version>
377402
<executions>
378403
<execution>
379404
<goals>
@@ -392,7 +417,7 @@
392417
<plugin>
393418
<groupId>com.diffplug.spotless</groupId>
394419
<artifactId>spotless-maven-plugin</artifactId>
395-
<version>2.28.0</version>
420+
<version>2.43.0</version>
396421
<configuration>
397422
<!-- optional: limit format enforcement to just the files changed by this feature branch -->
398423
<ratchetFrom>origin/master</ratchetFrom>

src/main/java/net/sf/jsqlparser/expression/DateTimeLiteralExpression.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
3939

4040
@Override
4141
public String toString() {
42-
return type!=null ? type.name() + " " + value : value;
42+
return type != null ? type.name() + " " + value : value;
4343
}
4444

4545
public DateTimeLiteralExpression withValue(String value) {

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

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4369,13 +4369,9 @@ WithIsolation WithIsolation():
43694369
JdbcParameter jdbc;
43704370
}
43714371
{
4372-
(
4373-
//with (ur | cs | rs | rr)
4374-
<K_WITH>
4375-
token=<K_ISOLATION> { withIsolation.setIsolation(token.image); }
4376-
4377-
)
4378-
{
4372+
<K_WITH>
4373+
token=<K_ISOLATION>
4374+
{ withIsolation.setIsolation(token.image);
43794375
return withIsolation;
43804376
}
43814377
}
@@ -4437,10 +4433,11 @@ Skip Skip():
44374433
{
44384434
<K_SKIP>
44394435
(
4440-
token=<S_LONG> { skip.setRowCount(Long.parseLong(token.image)); }
4441-
| token=<S_IDENTIFIER> { skip.setVariable(token.image); }
4442-
| jdbc = JdbcParameter() { skip.setJdbcParameter(jdbc); }
4443-
/* "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = <S_LONG> { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */
4436+
token=<S_LONG> { skip.setRowCount(Long.parseLong(token.image)); }
4437+
|
4438+
token=<S_IDENTIFIER> { skip.setVariable(token.image); }
4439+
|
4440+
jdbc = JdbcParameter() { skip.setJdbcParameter(jdbc); }
44444441
)
44454442
{
44464443
return skip;
@@ -4736,7 +4733,7 @@ Expression InExpression(Expression leftExpression) #InExpression :
47364733
(
47374734
LOOKAHEAD(2) token=<S_CHAR_LITERAL> { rightExpression = new StringValue(token.image); }
47384735
|
4739-
rightExpression = Expression()
4736+
rightExpression = PrimaryExpression()
47404737
)
47414738
{
47424739
InExpression inExpression = new InExpression(leftExpression, rightExpression)
@@ -5460,9 +5457,9 @@ Expression PrimaryExpression() #PrimaryExpression:
54605457

54615458
| "{ts" token=<S_CHAR_LITERAL> "}" { retval = new TimestampValue(token.image); }
54625459

5463-
| LOOKAHEAD( 17 , { getAsBoolean(Feature.allowUnparenthesizedSubSelects) && !interrupted } ) retval=Select()
5460+
| LOOKAHEAD( Select() , { getAsBoolean(Feature.allowUnparenthesizedSubSelects) && !interrupted } ) retval=Select()
54645461

5465-
| LOOKAHEAD( 17 , { !getAsBoolean(Feature.allowUnparenthesizedSubSelects) && !interrupted } ) retval=ParenthesedSelect()
5462+
| LOOKAHEAD( ParenthesedSelect() , { !getAsBoolean(Feature.allowUnparenthesizedSubSelects) && !interrupted } ) retval=ParenthesedSelect()
54665463

54675464
|
54685465
(

src/site/sphinx/_static/jmh_results.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ JSQLParserBenchmark.parseSQLStatements 5.2 avgt 15 388.453 ± 13.149
1717
Benchmark (version) Mode Cnt Score Error Units
1818
JSQLParserBenchmark.parseSQLStatements latest avgt 30 83.504 ± 1.557 ms/op
1919
JSQLParserBenchmark.parseSQLStatements 5.2 avgt 30 400.876 ± 8.291 ms/op
20-
JSQLParserBenchmark.parseSQLStatements 5.1 avgt 30 85.731 ± 1.288 ms/op
20+
JSQLParserBenchmark.parseSQLStatements 5.1 avgt 30 85.731 ± 1.288 ms/op
21+
22+
-- Token Manipulation
23+
JSQLParserBenchmark.parseSQLStatements latest avgt 30 78.287 ± 4.730 ms/op
24+
JSQLParserBenchmark.parseSQLStatements 5.2 avgt 30 356.553 ± 24.823 ms/op
25+
JSQLParserBenchmark.parseSQLStatements 5.1 avgt 30 86.815 ± 1.771 ms/op

src/site/sphinx/contribution.rst

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,22 @@ The JSQLParser is generated by ``JavaCC`` based on the provided Grammar. The Gra
7777
7878
mvn verify
7979
80-
7) Create your `GitHub Pull Request <https://www.youtube.com/watch?v=nCKdihvneS0>`_
80+
7) Verify the performance and avoid any deterioration
81+
82+
.. code-block:: shell
83+
:caption: Gradle `check` Task
84+
85+
gradle jmh
86+
87+
.. code-block:: text
88+
:caption: JMH performance results
89+
90+
Benchmark (version) Mode Cnt Score Error Units
91+
JSQLParserBenchmark.parseSQLStatements latest avgt 30 83.504 ± 1.557 ms/op
92+
JSQLParserBenchmark.parseSQLStatements 5.2 avgt 30 400.876 ± 8.291 ms/op
93+
JSQLParserBenchmark.parseSQLStatements 5.1 avgt 30 85.731 ± 1.288 ms/op
94+
95+
8) Create your `GitHub Pull Request <https://www.youtube.com/watch?v=nCKdihvneS0>`_
8196

8297
Manage Reserved Keywords
8398
------------------------------

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<?> consumer) throws Exception {
38-
return (Statements) parseStatementsMethod.invoke(null, sql, executorService, consumer);
37+
Consumer<CCJSqlParser> consumer) throws Exception {
38+
return (Statements) parseStatementsMethod.invoke(null, sql, executorService, null);
3939
}
4040
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
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;
1513
import net.sf.jsqlparser.statement.Statements;
1614
import org.openjdk.jmh.annotations.*;
1715
import org.openjdk.jmh.infra.Blackhole;
@@ -36,7 +34,7 @@ public class JSQLParserBenchmark {
3634
SqlParserRunner runner;
3735

3836
// @Param({ "latest", "5.2", "5.1", "5.0", "4.9", "4.8", "4.7", "4.6", "4.5" })
39-
@Param({"latest"})
37+
@Param({"latest", "5.3", "5.1"})
4038
public String version;
4139

4240
@Setup(Level.Trial)
@@ -79,15 +77,17 @@ public void parseSQLStatements(Blackhole blackhole) throws Exception {
7977
final Statements statements = runner.parseStatements(
8078
sqlContent,
8179
executorService,
82-
null);
80+
(Consumer<CCJSqlParser>) parser -> {
81+
// No-op consumer (or you can log/validate each parser if desired)
82+
});
8383
blackhole.consume(statements);
8484
}
8585

86-
@Benchmark
86+
// @Benchmark
8787
public void parseQuotedText(Blackhole blackhole) throws Exception {
8888
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";
89+
+ "INSERT INTO recycle_record (a,f) VALUES ('\\'anything', 'abc');\n"
90+
+ "INSERT INTO recycle_record (a,f) VALUES ('\\'','83653692186728700711687663398101');\n";
9191

9292
final Statements statements = runner.parseStatements(
9393
sqlStr,

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

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

0 commit comments

Comments
 (0)