Skip to content

Commit 8d9db70

Browse files
manticore-projectsZhang Zhongliang
andauthored
Assorted Fixes #4 (#1676)
* support clickhouse global keyword in join * fix: add missing public Getter Add public Getter for `updateSets` Fixes #1630 * feat: Clickhouse GLOBAL JOIN All credits to @julianzlzhang fixes #1615 fixes #1535 * feat: IF/ELSE statements supports Block Make `If... Else...` statements work with Blocks Make `Statement()` production work with `Block()` Rewrite the `Block()` related Unit Tests fixes #1682 * fix: Revert unintended changes to the Special Oracle Tests * fix: `SET` statement supports `UserVariable` Make `SetStatement` parse Objects instead of Names only Add Grammar to accept `UserVariable` (e.g. "set @Flag = 1") Add Test Case for `UserVariable` fixes #1682 * feat: Google Spanner Support Replaces PR #1415, all credit goes to @s13o Re-arranged some recently added Tokens in alphabetical order Update Keywords * fix: fix JSonExpression, accept Expressions Make JSonExpression accept Expressions Add Testcase Expose Idents() and Operators() Fixes #1696 * test: add Test for Issue #1237 Co-authored-by: Zhang Zhongliang <zhangzhongliang@xiaomi.com>
1 parent 08a92fc commit 8d9db70

File tree

20 files changed

+434
-78
lines changed

20 files changed

+434
-78
lines changed

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

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1616

1717
public class JsonExpression extends ASTNodeAccessImpl implements Expression {
18-
1918
private Expression expr;
2019

2120
private List<String> idents = new ArrayList<String>();
@@ -34,26 +33,19 @@ public void setExpression(Expression expr) {
3433
this.expr = expr;
3534
}
3635

37-
// public List<String> getIdents() {
38-
// return idents;
39-
// }
40-
//
41-
// public void setIdents(List<String> idents) {
42-
// this.idents = idents;
43-
// operators = new ArrayList<String>();
44-
// for (String ident : idents) {
45-
// operators.add("->");
46-
// }
47-
// }
48-
//
49-
// public void addIdent(String ident) {
50-
// addIdent(ident, "->");
51-
// }
5236
public void addIdent(String ident, String operator) {
5337
idents.add(ident);
5438
operators.add(operator);
5539
}
5640

41+
public List<String> getIdents() {
42+
return idents;
43+
}
44+
45+
public List<String> getOperators() {
46+
return operators;
47+
}
48+
5749
@Override
5850
public String toString() {
5951
StringBuilder b = new StringBuilder();
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2021 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.schema.Table;
13+
14+
import java.util.Collections;
15+
import java.util.List;
16+
17+
public class SpannerInterleaveIn {
18+
19+
public enum OnDelete {
20+
CASCADE,
21+
NO_ACTION
22+
}
23+
24+
private Table table;
25+
private OnDelete onDelete;
26+
27+
public SpannerInterleaveIn() {
28+
29+
}
30+
31+
public SpannerInterleaveIn(Table table, OnDelete action) {
32+
setTable(table);
33+
setOnDelete(action);
34+
}
35+
36+
public SpannerInterleaveIn(List<String> nameParts) {
37+
this(new Table(nameParts), null);
38+
}
39+
40+
public SpannerInterleaveIn(String tableName) {
41+
this(Collections.singletonList(tableName));
42+
}
43+
44+
public Table getTable() {
45+
return table;
46+
}
47+
48+
public void setTable(Table table) {
49+
this.table = table;
50+
}
51+
52+
public OnDelete getOnDelete() {
53+
return onDelete;
54+
}
55+
56+
public void setOnDelete(OnDelete action) {
57+
this.onDelete = action;
58+
}
59+
60+
@Override
61+
public String toString() {
62+
return "INTERLEAVE IN PARENT " + getTable().getName() +
63+
(getOnDelete() == null ? "" : " ON DELETE " + (getOnDelete() == OnDelete.CASCADE ? "CASCADE" : "NO ACTION"));
64+
}
65+
66+
public SpannerInterleaveIn withTable(Table table) {
67+
this.setTable(table);
68+
return this;
69+
}
70+
71+
public SpannerInterleaveIn withOnDelete(OnDelete action) {
72+
this.setOnDelete(action);
73+
return this;
74+
}
75+
}

src/main/java/net/sf/jsqlparser/statement/Block.java

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

1212
public class Block implements Statement {
13+
private boolean hasSemicolonAfterEnd = false;
1314

1415
private Statements statements;
1516

@@ -21,14 +22,34 @@ public void setStatements(Statements statements) {
2122
this.statements = statements;
2223
}
2324

25+
public boolean hasSemicolonAfterEnd() {
26+
return hasSemicolonAfterEnd;
27+
}
28+
29+
public void setSemicolonAfterEnd(boolean hasSemicolonAfterEnd) {
30+
this.hasSemicolonAfterEnd = hasSemicolonAfterEnd;
31+
}
32+
2433
@Override
2534
public void accept(StatementVisitor statementVisitor) {
2635
statementVisitor.visit(this);
2736
}
2837

38+
public StringBuilder appendTo(StringBuilder builder) {
39+
builder.append("BEGIN\n");
40+
if (statements != null) {
41+
builder.append(statements);
42+
}
43+
builder.append("END");
44+
if (hasSemicolonAfterEnd) {
45+
builder.append(";");
46+
}
47+
return builder;
48+
}
49+
2950
@Override
3051
public String toString() {
31-
return "BEGIN\n" + (statements != null ? statements.toString() : "") + "END";
52+
return appendTo(new StringBuilder()).toString();
3253
}
3354

3455
public Block withStatements(Statements statements) {

src/main/java/net/sf/jsqlparser/statement/SetStatement.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ public SetStatement() {
2323
// empty constructor
2424
}
2525

26-
public SetStatement(String name, List<Expression> value) {
26+
public SetStatement(Object name, List<Expression> value) {
2727
add(name, value, true);
2828
}
2929

30-
public void add(String name, List<Expression> value, boolean useEqual) {
30+
public void add(Object name, List<Expression> value, boolean useEqual) {
3131
values.add(new NameExpr(name, value, useEqual));
3232
}
3333

@@ -66,11 +66,11 @@ public SetStatement setUseEqual(boolean useEqual) {
6666
return setUseEqual(0, useEqual);
6767
}
6868

69-
public String getName() {
69+
public Object getName() {
7070
return getName(0);
7171
}
7272

73-
public String getName(int idx) {
73+
public Object getName(int idx) {
7474
return values.get(idx).name;
7575
}
7676

@@ -129,11 +129,11 @@ public void accept(StatementVisitor statementVisitor) {
129129

130130
static class NameExpr {
131131

132-
private String name;
132+
private Object name;
133133
private List<Expression> expressions;
134134
private boolean useEqual;
135135

136-
public NameExpr(String name, List<Expression> expressions, boolean useEqual) {
136+
public NameExpr(Object name, List<Expression> expressions, boolean useEqual) {
137137
this.name = name;
138138
this.expressions = expressions;
139139
this.useEqual = useEqual;

src/main/java/net/sf/jsqlparser/statement/Statements.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public void accept(StatementVisitor statementVisitor) {
3535
public String toString() {
3636
StringBuilder b = new StringBuilder();
3737
for (Statement stmt : statements) {
38-
if (stmt instanceof IfElseStatement) {
39-
// IfElseStatements print the Semicolons by themselves
38+
// IfElseStatements and Blocks control the Semicolons by themselves
39+
if (stmt instanceof IfElseStatement || stmt instanceof Block) {
4040
b.append(stmt).append("\n");
4141
} else {
4242
b.append(stmt).append(";\n");

src/main/java/net/sf/jsqlparser/statement/create/table/CreateTable.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.List;
1616
import java.util.Optional;
1717

18+
import net.sf.jsqlparser.expression.SpannerInterleaveIn;
1819
import net.sf.jsqlparser.schema.Table;
1920
import net.sf.jsqlparser.statement.Statement;
2021
import net.sf.jsqlparser.statement.StatementVisitor;
@@ -38,6 +39,8 @@ public class CreateTable implements Statement {
3839

3940
private RowMovement rowMovement;
4041

42+
private SpannerInterleaveIn interleaveIn = null;
43+
4144
@Override
4245
public void accept(StatementVisitor statementVisitor) {
4346
statementVisitor.visit(this);
@@ -199,6 +202,9 @@ public String toString() {
199202
if (likeTable != null) {
200203
sql += " LIKE " + (selectParenthesis ? "(" : "") + likeTable.toString() + (selectParenthesis ? ")" : "");
201204
}
205+
if (interleaveIn != null) {
206+
sql += ", " + interleaveIn;
207+
}
202208
return sql;
203209
}
204210

@@ -299,4 +305,17 @@ public CreateTable addIndexes(Collection<? extends Index> indexes) {
299305
collection.addAll(indexes);
300306
return this.withIndexes(collection);
301307
}
308+
309+
public SpannerInterleaveIn getSpannerInterleaveIn() {
310+
return interleaveIn;
311+
}
312+
313+
public void setSpannerInterleaveIn(SpannerInterleaveIn spannerInterleaveIn) {
314+
this.interleaveIn = spannerInterleaveIn;
315+
}
316+
317+
public CreateTable withSpannerInterleaveIn(SpannerInterleaveIn spannerInterleaveIn) {
318+
this.interleaveIn = spannerInterleaveIn;
319+
return this;
320+
}
302321
}

src/main/java/net/sf/jsqlparser/statement/select/Join.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class Join extends ASTNodeAccessImpl {
2121
private boolean right = false;
2222
private boolean left = false;
2323
private boolean natural = false;
24+
private boolean global = false;
2425
private boolean full = false;
2526
private boolean inner = false;
2627
private boolean simple = false;
@@ -166,6 +167,10 @@ public boolean isNatural() {
166167
return natural;
167168
}
168169

170+
public boolean isGlobal() {
171+
return global;
172+
}
173+
169174
public Join withNatural(boolean b) {
170175
this.setNatural(b);
171176
return this;
@@ -175,6 +180,10 @@ public void setNatural(boolean b) {
175180
natural = b;
176181
}
177182

183+
public void setGlobal(boolean b) {
184+
global = b;
185+
}
186+
178187
/**
179188
* Whether is a "FULL" join
180189
*
@@ -299,6 +308,10 @@ public void setJoinWindow(KSQLJoinWindow joinWindow) {
299308
public String toString() {
300309
StringBuilder builder = new StringBuilder();
301310

311+
if ( isGlobal() ) {
312+
builder.append("GLOBAL ");
313+
}
314+
302315
if (isSimple() && isOuter()) {
303316
builder.append("OUTER ").append(rightItem);
304317
} else if (isSimple()) {

src/main/java/net/sf/jsqlparser/util/deparser/CreateTableDeParser.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ public void deParse(CreateTable createTable) {
120120
buffer.append(")");
121121
}
122122
}
123+
if (createTable.getSpannerInterleaveIn() != null) {
124+
buffer.append(", ").append(createTable.getSpannerInterleaveIn());
125+
}
123126
}
124127

125128
}

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,10 @@ public void visit(SubJoin subjoin) {
401401

402402
@SuppressWarnings({"PMD.CyclomaticComplexity"})
403403
public void deparseJoin(Join join) {
404+
if ( join.isGlobal() ) {
405+
buffer.append(" GLOBAL ");
406+
}
407+
404408
if (join.isSimple() && join.isOuter()) {
405409
buffer.append(", OUTER ");
406410
} else if (join.isSimple()) {

src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,9 @@ public void visit(Block block) {
294294
}
295295
}
296296
buffer.append("END");
297+
if (block.hasSemicolonAfterEnd()) {
298+
buffer.append(";");
299+
}
297300
}
298301

299302
@Override

0 commit comments

Comments
 (0)