Skip to content

Commit 9f12b5f

Browse files
committed
Merge branch 'master' into fix/binary-operator-ast-span
Conflicts in JSqlParserCC.jjt, resolved by keeping master's logic and re-adding the node links on top: - PARTITION BY (#2878): the four sites call ComplexExpressionList() directly and still link the PARTITION BY node. - PrimaryExpression (#2874): innerSigns is null without an inner sign, so the loop that wraps and links signed values is guarded. - Condition (#2874): one lazily created deque of NOT tokens carries both the token for the node and whether it was spelled "!".
2 parents 3e8a503 + df97e40 commit 9f12b5f

31 files changed

Lines changed: 586 additions & 104 deletions

‎README.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ Snapshot coordinates and repository setup are on the
106106
## Performance
107107

108108
**11× faster than 5.3**, and the fastest parser on real-world SQL of any of the parsers
109-
tested, in any language — 19× ahead of `sqlglot[c]` on JSqlParser's own `SELECT` test suite.
109+
tested, in any language — 19× ahead of `sqlglot[c]` on JSqlParser's own `SELECT` test suite. And the community kept sending performance improvements since. Thank you everyone!
110110

111111
<div align="right">
112112
<a href="https://github.com/manticore-projects/jsqlparser-bench">
@@ -116,7 +116,8 @@ tested, in any language — 19× ahead of `sqlglot[c]` on JSqlParser's own `SELE
116116

117117
```text
118118
Benchmark (version) Mode Cnt Score Error Units
119-
JSQLParserBenchmark.parseSQLStatements latest avgt 15 32.525 ± 0.413 ms/op
119+
JSQLParserBenchmark.parseSQLStatements latest avgt 15 21.138 ± 0.557 ms/op <-- Community sponsored improvements!
120+
JSQLParserBenchmark.parseSQLStatements 5.4 avgt 15 32.528 ± 0.666 ms/op
120121
JSQLParserBenchmark.parseSQLStatements 5.3 avgt 15 983.459 ± 8.197 ms/op
121122
JSQLParserBenchmark.parseSQLStatements 5.1 avgt 15 319.601 ± 4.081 ms/op
122123
```

‎build.gradle‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,9 @@ test {
276276
jvmArgs = ['-Xss4m', '--add-opens=java.base/java.lang=ALL-UNNAMED']
277277

278278
jacoco {
279-
excludes = ['net/sf/jsqlparser/parser/CCJSqlParserTokenManager']
279+
// the generated parser exceeds the constant-pool limit once instrumented (#2866)
280+
excludes = ['net/sf/jsqlparser/parser/CCJSqlParserTokenManager',
281+
'net/sf/jsqlparser/parser/CCJSqlParser']
280282
}
281283
}
282284

@@ -291,13 +293,23 @@ jacocoTestReport {
291293
csv.required = false
292294
html.outputLocation = layout.buildDirectory.dir('reports/jacoco')
293295
}
296+
// the classes that are not instrumented, see test.jacoco
297+
afterEvaluate {
298+
classDirectories.setFrom(files(classDirectories.files.collect {
299+
fileTree(dir: it, exclude: [
300+
"**/parser/CCJSqlParserTokenManager.class",
301+
"**/parser/CCJSqlParser.class"
302+
])
303+
}))
304+
}
294305
}
295306
jacocoTestCoverageVerification {
296-
// Jacoco can't handle the TokenManager class
307+
// Jacoco can't handle the TokenManager and the generated parser classes
297308
afterEvaluate {
298309
classDirectories.setFrom(files(classDirectories.files.collect {
299310
fileTree(dir: it, exclude: [
300-
"**CCJSqlParserTokenManager**"
311+
"**/parser/CCJSqlParserTokenManager.class",
312+
"**/parser/CCJSqlParser.class"
301313
])
302314
}))
303315
}

‎src/main/java/net/sf/jsqlparser/expression/operators/relational/LikeExpression.java‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package net.sf.jsqlparser.expression.operators.relational;
1111

1212
import java.util.Locale;
13+
import java.util.regex.Pattern;
1314
import net.sf.jsqlparser.expression.BinaryExpression;
1415
import net.sf.jsqlparser.expression.Expression;
1516
import net.sf.jsqlparser.expression.ExpressionVisitor;
@@ -174,9 +175,11 @@ public LikeExpression withRightExpression(Expression arg0) {
174175
public enum KeyWord {
175176
LIKE, ILIKE, RLIKE, REGEXP_LIKE, REGEXP, GLOB, SIMILAR_TO, MATCH_ANY, MATCH_ALL, MATCH_PHRASE, MATCH_PHRASE_PREFIX, MATCH_REGEXP;
176177

178+
private static final Pattern WHITESPACE = Pattern.compile("\\s+");
179+
177180
public static KeyWord from(String keyword) {
178181
return Enum.valueOf(KeyWord.class,
179-
keyword.toUpperCase(Locale.ROOT).replaceAll("\\s+", "_"));
182+
WHITESPACE.matcher(keyword.toUpperCase(Locale.ROOT)).replaceAll("_"));
180183
}
181184
}
182185

‎src/main/java/net/sf/jsqlparser/statement/StatementFeatureVisitor.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
import net.sf.jsqlparser.statement.delete.Delete;
8686
import net.sf.jsqlparser.statement.drop.Drop;
8787
import net.sf.jsqlparser.statement.drop.DropPolicy;
88+
import net.sf.jsqlparser.statement.drop.DropUserMapping;
8889
import net.sf.jsqlparser.statement.execute.Execute;
8990
import net.sf.jsqlparser.statement.export.Export;
9091
import net.sf.jsqlparser.statement.export.ExportDataStatement;
@@ -1365,6 +1366,11 @@ public <S> Void visit(AlterUserMapping statement, S context) {
13651366
return schemaOnly();
13661367
}
13671368

1369+
@Override
1370+
public <S> Void visit(DropUserMapping statement, S context) {
1371+
return schemaOnly();
1372+
}
1373+
13681374
@Override
13691375
public <S> Void visit(CreateRule statement, S context) {
13701376
return schemaOnly();

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import net.sf.jsqlparser.statement.alter.AlterTrigger;
2828
import net.sf.jsqlparser.statement.alter.AlterPolicy;
2929
import net.sf.jsqlparser.statement.drop.DropPolicy;
30+
import net.sf.jsqlparser.statement.drop.DropUserMapping;
3031
import net.sf.jsqlparser.statement.create.statistics.CreateStatistics;
3132
import net.sf.jsqlparser.statement.alter.AlterStatistics;
3233
import net.sf.jsqlparser.statement.alter.AlterRelation;
@@ -945,6 +946,14 @@ default void visit(AlterUserMapping statement) {
945946
visit(statement, null);
946947
}
947948

949+
default <S> T visit(DropUserMapping statement, S context) {
950+
return null;
951+
}
952+
953+
default void visit(DropUserMapping statement) {
954+
visit(statement, null);
955+
}
956+
948957
default <S> T visit(CreateAccessMethod statement, S context) {
949958
return null;
950959
}

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.sf.jsqlparser.statement.alter.AlterRoutine;
1616
import net.sf.jsqlparser.statement.alter.AlterTrigger;
1717
import net.sf.jsqlparser.statement.drop.DropPolicy;
18+
import net.sf.jsqlparser.statement.drop.DropUserMapping;
1819
import net.sf.jsqlparser.statement.create.statistics.CreateStatistics;
1920
import net.sf.jsqlparser.statement.create.fdw.CreateForeignDataWrapper;
2021
import net.sf.jsqlparser.statement.alter.AlterForeignDataWrapper;
@@ -1087,6 +1088,11 @@ public <S> T visit(AlterUserMapping statement, S context) {
10871088
return visitForeignDataStatement(statement, context);
10881089
}
10891090

1091+
@Override
1092+
public <S> T visit(DropUserMapping statement, S context) {
1093+
return null;
1094+
}
1095+
10901096
@Override
10911097
public <S> T visit(CreateRule statement, S context) {
10921098
statement.visitTables(table -> table.accept(fromItemVisitor, context));

‎src/main/java/net/sf/jsqlparser/statement/create/event/AlterEvent.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
3232

3333
@Override
3434
public String toString() {
35-
StringBuilder builder = new StringBuilder("ALTER EVENT ").append(getEvent());
35+
StringBuilder builder = new StringBuilder("ALTER ");
36+
appendDefinerAndEvent(builder);
37+
builder.append(getEvent());
3638
appendScheduleAndCompletion(builder);
3739
if (renameTo != null) {
3840
builder.append(" RENAME TO ").append(renameTo);

‎src/main/java/net/sf/jsqlparser/statement/create/event/CreateEvent.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
3131

3232
@Override
3333
public String toString() {
34-
StringBuilder builder = new StringBuilder("CREATE EVENT ");
34+
StringBuilder builder = new StringBuilder("CREATE ");
35+
appendDefinerAndEvent(builder);
3536
if (ifNotExists) {
3637
builder.append("IF NOT EXISTS ");
3738
}

‎src/main/java/net/sf/jsqlparser/statement/create/event/EventStatement.java‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,28 @@
1212
import net.sf.jsqlparser.expression.StringValue;
1313
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1414
import net.sf.jsqlparser.schema.Table;
15+
import net.sf.jsqlparser.statement.MySqlDefiner;
1516
import net.sf.jsqlparser.statement.Statement;
1617

1718
/** Common structured properties of MySQL {@code CREATE EVENT} and {@code ALTER EVENT}. */
1819
public abstract class EventStatement extends ASTNodeAccessImpl implements Statement {
1920

21+
private MySqlDefiner definer;
2022
private Table event;
2123
private EventSchedule schedule;
2224
private Boolean onCompletionPreserve;
2325
private EventStatus status;
2426
private StringValue comment;
2527
private Statement body;
2628

29+
public MySqlDefiner getDefiner() {
30+
return definer;
31+
}
32+
33+
public void setDefiner(MySqlDefiner definer) {
34+
this.definer = definer;
35+
}
36+
2737
public Table getEvent() {
2838
return event;
2939
}
@@ -76,6 +86,14 @@ public void setBody(Statement body) {
7686
this.body = body;
7787
}
7888

89+
/** Appends the optional DEFINER clause, followed by EVENT, after CREATE or ALTER. */
90+
protected void appendDefinerAndEvent(StringBuilder builder) {
91+
if (definer != null) {
92+
builder.append("DEFINER = ").append(definer).append(' ');
93+
}
94+
builder.append("EVENT ");
95+
}
96+
7997
protected void appendScheduleAndCompletion(StringBuilder builder) {
8098
if (schedule != null) {
8199
builder.append(" ON SCHEDULE ").append(schedule);

‎src/main/java/net/sf/jsqlparser/statement/create/event/EventStatus.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
package net.sf.jsqlparser.statement.create.event;
1111

1212
public enum EventStatus {
13-
ENABLE("ENABLE"), DISABLE("DISABLE"), DISABLE_ON_SLAVE("DISABLE ON SLAVE");
13+
ENABLE("ENABLE"), DISABLE("DISABLE"), DISABLE_ON_SLAVE("DISABLE ON SLAVE"), DISABLE_ON_REPLICA(
14+
"DISABLE ON REPLICA");
1415

1516
private final String sql;
1617

0 commit comments

Comments
 (0)