Skip to content

Commit f2b91bf

Browse files
Merge branch 'master' into fix/binary-operator-ast-span
2 parents 3e8a503 + f162cfe commit f2b91bf

26 files changed

Lines changed: 488 additions & 69 deletions

‎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

‎src/main/java/net/sf/jsqlparser/statement/create/table/ColDataType.java‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,10 @@ public static ColDataType fromTypeParameters(String dataType, String precision,
103103
private void setNumericTypeParameters(String parameter, Integer scale) {
104104
if (parameter != null) {
105105
maxPrecision = "MAX".equalsIgnoreCase(parameter);
106-
precision = maxPrecision ? null : new BigInteger(parameter);
106+
// Oracle's NUMBER(*, s) has no precision of its own.
107+
precision = maxPrecision || "*".equals(parameter) ? null : new BigInteger(parameter);
107108
this.scale = scale;
108-
dataType += " (" + (maxPrecision ? "MAX" : precision)
109+
dataType += " (" + (maxPrecision ? "MAX" : precision != null ? precision : parameter)
109110
+ (scale != null ? ", " + scale : "") + ")";
110111
}
111112
}
@@ -330,9 +331,10 @@ public ColDataType withXmlTypeModifier(XmlTypeModifier xmlTypeModifier) {
330331
* The first numeric type parameter, e.g. {@code 255} for {@code VARCHAR(255)} or {@code 10} for
331332
* {@code DECIMAL(10, 2)}. {@code MAX} is reported as {@link Integer#MAX_VALUE}. Returns
332333
* {@code null} when the type carries no numeric parameters, e.g. {@code INT} or
333-
* {@code ENUM('a', 'b')}, or when a numeric length exceeds the integer range. Use
334-
* {@link #getNumericPrecision()} for the full range and {@link #isMaxPrecision()} to
335-
* distinguish MAX from the numeric value 2147483647.
334+
* {@code ENUM('a', 'b')}, when the precision is Oracle's {@code *} as in {@code NUMBER(*, 0)},
335+
* or when a numeric length exceeds the integer range. Use {@link #getNumericPrecision()} for
336+
* the full range and {@link #isMaxPrecision()} to distinguish MAX from the numeric value
337+
* 2147483647.
336338
*/
337339
public Integer getPrecision() {
338340
return maxPrecision ? Integer.valueOf(Integer.MAX_VALUE)

0 commit comments

Comments
 (0)