Skip to content

Commit 61c37b8

Browse files
Merge commit 'd662484b73594eb7e4a1a1e60dfa0d34fb1f13a4' into SpecialOracleTests
Conflicts: src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
2 parents 7f62187 + d662484 commit 61c37b8

27 files changed

+915
-53
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,16 @@
157157
</configuration>
158158
</plugin>
159159
<plugin>
160+
<groupId>org.javacc.plugin</groupId>
161+
<artifactId>javacc-maven-plugin</artifactId>
162+
<version>3.0.3</version>
163+
164+
<!--
160165
<groupId>org.codehaus.mojo</groupId>
161166
<artifactId>javacc-maven-plugin</artifactId>
162167
<version>2.6</version>
168+
-->
169+
163170
<executions>
164171
<execution>
165172
<id>javacc</id>

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,30 @@ public class CastExpression extends ASTNodeAccessImpl implements Expression {
1616

1717
private Expression leftExpression;
1818
private ColDataType type;
19+
private RowConstructor rowConstructor;
1920
private boolean useCastKeyword = true;
21+
22+
public RowConstructor getRowConstructor() {
23+
return rowConstructor;
24+
}
25+
26+
public void setRowConstructor(RowConstructor rowConstructor) {
27+
this.rowConstructor = rowConstructor;
28+
this.type = null;
29+
}
30+
31+
public CastExpression withRowConstructor(RowConstructor rowConstructor) {
32+
setRowConstructor(rowConstructor);
33+
return this;
34+
}
2035

2136
public ColDataType getType() {
2237
return type;
2338
}
2439

2540
public void setType(ColDataType type) {
2641
this.type = type;
42+
this.rowConstructor = null;
2743
}
2844

2945
public Expression getLeftExpression() {
@@ -50,7 +66,9 @@ public void setUseCastKeyword(boolean useCastKeyword) {
5066
@Override
5167
public String toString() {
5268
if (useCastKeyword) {
53-
return "CAST(" + leftExpression + " AS " + type.toString() + ")";
69+
return rowConstructor!=null
70+
? "CAST(" + leftExpression + " AS " + rowConstructor.toString() + ")"
71+
: "CAST(" + leftExpression + " AS " + type.toString() + ")";
5472
} else {
5573
return leftExpression + "::" + type.toString();
5674
}

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.sf.jsqlparser.expression.operators.conditional.XorExpression;
1616
import net.sf.jsqlparser.expression.operators.relational.*;
1717
import net.sf.jsqlparser.schema.Column;
18+
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
1819
import net.sf.jsqlparser.statement.select.AllColumns;
1920
import net.sf.jsqlparser.statement.select.AllTableColumns;
2021
import net.sf.jsqlparser.statement.select.ExpressionListItem;
@@ -503,8 +504,14 @@ public void visit(SelectExpressionItem selectExpressionItem) {
503504

504505
@Override
505506
public void visit(RowConstructor rowConstructor) {
506-
for (Expression expr : rowConstructor.getExprList().getExpressions()) {
507-
expr.accept(this);
507+
if (rowConstructor.getColumnDefinitions().isEmpty()) {
508+
for (Expression expression: rowConstructor.getExprList().getExpressions()) {
509+
expression.accept(this);
510+
}
511+
} else {
512+
for (ColumnDefinition columnDefinition : rowConstructor.getColumnDefinitions()) {
513+
columnDefinition.accept(this);
514+
}
508515
}
509516
}
510517

@@ -605,4 +612,8 @@ public void visit(JsonFunction expression) {
605612
expr.getExpression().accept(this);
606613
}
607614
}
615+
616+
public void visit(ColumnDefinition columnDefinition) {
617+
columnDefinition.accept(this);
618+
}
608619
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ public void setName(String string) {
5252
nameparts = Arrays.asList(string);
5353
}
5454

55+
public Function withName(String name) {
56+
this.setName(name);
57+
return this;
58+
}
59+
5560
public void setName(List<String> string) {
5661
nameparts = string;
5762
}

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,26 @@
99
*/
1010
package net.sf.jsqlparser.expression;
1111

12+
import java.util.ArrayList;
1213
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
1314
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
15+
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
1416

1517
public class RowConstructor extends ASTNodeAccessImpl implements Expression {
16-
1718
private ExpressionList exprList;
19+
private ArrayList<ColumnDefinition> columnDefinitions = new ArrayList<>();
1820
private String name = null;
1921

2022
public RowConstructor() {
2123
}
24+
25+
public ArrayList<ColumnDefinition> getColumnDefinitions() {
26+
return columnDefinitions;
27+
}
28+
29+
public boolean addColumnDefinition(ColumnDefinition columnDefinition) {
30+
return columnDefinitions.add(columnDefinition);
31+
}
2232

2333
public ExpressionList getExprList() {
2434
return exprList;
@@ -43,6 +53,17 @@ public void accept(ExpressionVisitor expressionVisitor) {
4353

4454
@Override
4555
public String toString() {
56+
if (columnDefinitions.size()>0) {
57+
StringBuilder builder = new StringBuilder(name != null ? name : "");
58+
builder.append("(");
59+
int i = 0;
60+
for (ColumnDefinition columnDefinition:columnDefinitions) {
61+
builder.append(i>0 ? ", " : "").append(columnDefinition.toString());
62+
i++;
63+
}
64+
builder.append(")");
65+
return builder.toString();
66+
}
4667
return (name != null ? name : "") + exprList.toString();
4768
}
4869

src/main/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearch.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717
import java.util.Optional;
1818
import net.sf.jsqlparser.expression.Expression;
1919
import net.sf.jsqlparser.expression.ExpressionVisitor;
20+
import net.sf.jsqlparser.expression.JdbcNamedParameter;
21+
import net.sf.jsqlparser.expression.JdbcParameter;
2022
import net.sf.jsqlparser.expression.StringValue;
2123
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
2224
import net.sf.jsqlparser.schema.Column;
2325

2426
public class FullTextSearch extends ASTNodeAccessImpl implements Expression {
2527

2628
private List<Column> _matchColumns;
27-
private StringValue _againstValue;
29+
private Expression _againstValue;
2830
private String _searchModifier;
2931

3032
public FullTextSearch() {
@@ -42,8 +44,16 @@ public List<Column> getMatchColumns() {
4244
public void setAgainstValue(StringValue val) {
4345
this._againstValue = val;
4446
}
47+
48+
public void setAgainstValue(JdbcNamedParameter val) {
49+
this._againstValue = val;
50+
}
51+
52+
public void setAgainstValue(JdbcParameter val) {
53+
this._againstValue = val;
54+
}
4555

46-
public StringValue getAgainstValue() {
56+
public Expression getAgainstValue() {
4757
return this._againstValue;
4858
}
4959

src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public static Expression parseExpression(String expression, boolean allowPartial
120120
consumer.accept(parser);
121121
}
122122
try {
123-
Expression expr = parser.SimpleExpression();
123+
Expression expr = parser.Expression();
124124
if (!allowPartialParse && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) {
125125
throw new JSQLParserException("could only parse partial expression " + expr.toString());
126126
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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.statement;
11+
12+
/**
13+
*
14+
* @author <a href="mailto:andreas@manticore-projects.com">Andreas Reichel</a>
15+
*/
16+
public enum PurgeObjectType {
17+
TABLE, INDEX, RECYCLEBIN, DBA_RECYCLEBIN, TABLESPACE;
18+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
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+
11+
package net.sf.jsqlparser.statement;
12+
13+
import java.util.Objects;
14+
import net.sf.jsqlparser.schema.Table;
15+
import net.sf.jsqlparser.statement.create.table.Index;
16+
17+
/**
18+
*
19+
* @author <a href="mailto:andreas@manticore-projects.com">Andreas Reichel</a>
20+
* @see <a href="https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9018.htm">Purge</a>
21+
*/
22+
23+
public class PurgeStatement implements Statement {
24+
private final PurgeObjectType purgeObjectType;
25+
private final Object object;
26+
private String userName;
27+
28+
public PurgeStatement(Table table) {
29+
this.purgeObjectType = PurgeObjectType.TABLE;
30+
this.object = Objects.requireNonNull(table, "The TABLE of the PURGE TABLE statement must not be null.");
31+
}
32+
33+
public PurgeStatement(Index index) {
34+
this.purgeObjectType = PurgeObjectType.INDEX;
35+
this.object = Objects.requireNonNull(index, "The INDEX of the PURGE INDEX statement must not be null.");
36+
}
37+
38+
public PurgeStatement(PurgeObjectType purgeObjectType) {
39+
this.purgeObjectType = purgeObjectType;
40+
this.object = null;
41+
}
42+
43+
public PurgeStatement(PurgeObjectType purgeObjectType, String tableSpaceName, String userName) {
44+
this.purgeObjectType = purgeObjectType;
45+
this.object = Objects.requireNonNull(tableSpaceName, "The TABLESPACE NAME of the PURGE TABLESPACE statement must not be null.");
46+
this.userName = userName;
47+
}
48+
49+
@Override
50+
public void accept(StatementVisitor statementVisitor) {
51+
statementVisitor.visit(this);
52+
}
53+
54+
@SuppressWarnings({"PMD.MissingBreakInSwitch", "PMD.SwitchStmtsShouldHaveDefault", "PMD.CyclomaticComplexity"})
55+
public StringBuilder appendTo(StringBuilder builder) {
56+
builder.append("PURGE ");
57+
58+
switch (purgeObjectType) {
59+
case RECYCLEBIN:
60+
case DBA_RECYCLEBIN:
61+
builder.append(purgeObjectType);
62+
break;
63+
case TABLE:
64+
case INDEX:
65+
builder.append(purgeObjectType);
66+
if (object!=null) {
67+
builder.append(" ").append(object);
68+
}
69+
break;
70+
case TABLESPACE:
71+
builder.append(purgeObjectType);
72+
if (object!=null) {
73+
builder.append(" ").append(object);
74+
}
75+
if (userName!=null && userName.length()>0) {
76+
builder.append(" USER ").append(userName);
77+
}
78+
break;
79+
}
80+
return builder;
81+
}
82+
83+
@Override
84+
public String toString() {
85+
return appendTo(new StringBuilder()).toString();
86+
}
87+
88+
public String getUserName() {
89+
return userName;
90+
}
91+
92+
public void setUserName(String userName) {
93+
this.userName = userName;
94+
}
95+
96+
public PurgeObjectType getPurgeObjectType() {
97+
return purgeObjectType;
98+
}
99+
100+
public Object getObject() {
101+
return object;
102+
}
103+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import net.sf.jsqlparser.statement.alter.Alter;
1313
import net.sf.jsqlparser.statement.alter.AlterSession;
14+
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
1415
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
1516
import net.sf.jsqlparser.statement.comment.Comment;
1617
import net.sf.jsqlparser.statement.create.index.CreateIndex;
@@ -111,4 +112,8 @@ public interface StatementVisitor {
111112
void visit(CreateSynonym createSynonym);
112113

113114
void visit(AlterSession alterSession);
115+
116+
void visit(RenameTableStatement renameTableStatement);
117+
118+
void visit(PurgeStatement purgeStatement);
114119
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import net.sf.jsqlparser.statement.alter.Alter;
1313
import net.sf.jsqlparser.statement.alter.AlterSession;
14+
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
1415
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
1516
import net.sf.jsqlparser.statement.comment.Comment;
1617
import net.sf.jsqlparser.statement.create.index.CreateIndex;
@@ -210,4 +211,11 @@ public void visit(RollbackStatement rollbackStatement) {
210211
public void visit(AlterSession alterSession) {
211212
//@todo: do something usefull here
212213
}
214+
215+
@Override
216+
public void visit(RenameTableStatement renameTableStatement) {
217+
}
218+
219+
public void visit(PurgeStatement purgeStatement) {
220+
}
213221
}

0 commit comments

Comments
 (0)