Skip to content

Commit f86bc2e

Browse files
Implement Oracle Purge Statement (#1287)
1 parent f85b4b6 commit f86bc2e

File tree

10 files changed

+290
-9
lines changed

10 files changed

+290
-9
lines changed
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,6 @@ public interface StatementVisitor {
111111
void visit(CreateSynonym createSynonym);
112112

113113
void visit(AlterSession alterSession);
114+
115+
void visit(PurgeStatement purgeStatement);
114116
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,4 +210,9 @@ public void visit(RollbackStatement rollbackStatement) {
210210
public void visit(AlterSession alterSession) {
211211
//@todo: do something usefull here
212212
}
213+
214+
@Override
215+
public void visit(PurgeStatement purgeStatement) {
216+
//@todo: do something usefull here
217+
}
213218
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public Index withIndexSpec(List<String> idxSpec) {
133133
@Override
134134
public String toString() {
135135
String idxSpecText = PlainSelect.getStringList(idxSpec, false, false);
136-
return type + (!name.isEmpty() ? " " + getName() : "") + " " + PlainSelect.
136+
return ( type!=null ? type : "") + (!name.isEmpty() ? " " + getName() : "") + " " + PlainSelect.
137137
getStringList(columns, true, true) + (!"".equals(idxSpecText) ? " " + idxSpecText : "");
138138
}
139139

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,4 +1024,11 @@ public void visit(JsonFunction expression) {
10241024
expr.getExpression().accept(this);
10251025
}
10261026
}
1027+
1028+
@Override
1029+
public void visit(PurgeStatement purgeStatement) {
1030+
if (purgeStatement.getPurgeObjectType()== PurgeObjectType.TABLE) {
1031+
((Table) purgeStatement.getObject()).accept(this);
1032+
}
1033+
}
10271034
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import net.sf.jsqlparser.statement.DeclareStatement;
1919
import net.sf.jsqlparser.statement.DescribeStatement;
2020
import net.sf.jsqlparser.statement.ExplainStatement;
21+
import net.sf.jsqlparser.statement.PurgeStatement;
2122
import net.sf.jsqlparser.statement.RollbackStatement;
2223
import net.sf.jsqlparser.statement.SavepointStatement;
2324
import net.sf.jsqlparser.statement.ResetStatement;
@@ -349,4 +350,9 @@ void deParse(Statement statement) {
349350
public void visit(AlterSession alterSession) {
350351
new AlterSessionDeParser(buffer).deParse(alterSession);
351352
}
353+
354+
@Override
355+
public void visit(PurgeStatement purgeStatement) {
356+
purgeStatement.appendTo(buffer);
357+
}
352358
}

src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.sf.jsqlparser.statement.DeclareStatement;
1717
import net.sf.jsqlparser.statement.DescribeStatement;
1818
import net.sf.jsqlparser.statement.ExplainStatement;
19+
import net.sf.jsqlparser.statement.PurgeStatement;
1920
import net.sf.jsqlparser.statement.RollbackStatement;
2021
import net.sf.jsqlparser.statement.SavepointStatement;
2122
import net.sf.jsqlparser.statement.ResetStatement;
@@ -277,4 +278,9 @@ public void visit(AlterSession alterSession) {
277278
//@todo: write something usefull here
278279
}
279280

281+
@Override
282+
public void visit(PurgeStatement purgeStatement) {
283+
//@todo: write something usefull here
284+
}
285+
280286
}

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

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
174174
| <K_DECLARE: "DECLARE">
175175
| <K_DATETIMELITERAL : ("DATE" | "TIME" | "TIMESTAMP") >
176176
| <K_DATE_LITERAL : ( "YEAR" | "MONTH" | "DAY" | "HOUR" | "MINUTE" | "SECOND" ) >
177+
| <K_DBA_RECYCLEBIN: "DBA_RECYCLEBIN">
177178
| <K_DEFAULT : "DEFAULT">
178179
| <K_DEFERRABLE : "DEFERRABLE">
179180
| <K_DELAYED : "DELAYED">
@@ -313,9 +314,11 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
313314
| <K_PRIOR:"PRIOR">
314315
| <K_PROCEDURE:"PROCEDURE">
315316
| <K_PUBLIC:"PUBLIC">
317+
| <K_PURGE:"PURGE">
316318
| <K_QUERY:"QUERY">
317319
| <K_RANGE: "RANGE">
318320
| <K_READ: "READ" >
321+
| <K_RECYCLEBIN: "RECYCLEBIN">
319322
| <K_RECURSIVE:"RECURSIVE">
320323
| <K_REFERENCES:"REFERENCES">
321324
| <K_REGEXP: "REGEXP">
@@ -373,7 +376,8 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
373376
| <K_UNPIVOT:"UNPIVOT">
374377
| <K_UPDATE:"UPDATE">
375378
| <K_UPSERT:"UPSERT">
376-
| <K_USE : "USE">
379+
| <K_USE:"USE">
380+
| <K_USER:"USER">
377381
| <K_SQL_CALC_FOUND_ROWS: "SQL_CALC_FOUND_ROWS">
378382
| <K_SQL_NO_CACHE: "SQL_NO_CACHE">
379383
| <K_USING:"USING">
@@ -578,6 +582,8 @@ Statement SingleStatement() :
578582
stm = Declare()
579583
|
580584
stm = Grant()
585+
|
586+
stm = PurgeStatement()
581587
)
582588
{ return stm; }
583589
} catch (ParseException e) {
@@ -749,6 +755,37 @@ ResetStatement Reset(): {
749755
{ return reset; }
750756
}
751757

758+
PurgeStatement PurgeStatement(): {
759+
PurgeStatement purgeStatement = null;
760+
Table table;
761+
Index index;
762+
Token tableSpaceToken;
763+
Token userToken = null;
764+
}
765+
{
766+
<K_PURGE>
767+
(
768+
<K_TABLE> table=Table() { purgeStatement = new PurgeStatement(table); }
769+
|
770+
<K_INDEX> index=Index() { purgeStatement = new PurgeStatement(index); }
771+
|
772+
<K_RECYCLEBIN> { purgeStatement = new PurgeStatement(PurgeObjectType.RECYCLEBIN); }
773+
|
774+
<K_DBA_RECYCLEBIN> { purgeStatement = new PurgeStatement(PurgeObjectType.DBA_RECYCLEBIN); }
775+
|
776+
<K_TABLESPACE> tableSpaceToken=<S_IDENTIFIER> [ <K_USER> userToken=<S_IDENTIFIER> ] {
777+
purgeStatement = new PurgeStatement(
778+
PurgeObjectType.TABLESPACE
779+
, tableSpaceToken.image
780+
, userToken!=null ? userToken.image : null);
781+
}
782+
)
783+
784+
{
785+
return purgeStatement;
786+
}
787+
}
788+
752789
DescribeStatement Describe(): {
753790
Table table;
754791
} {
@@ -1439,6 +1476,7 @@ String RelObjectNameWithoutValue() :
14391476
/*| tk=<K_PLACING> | tk=<K_BOTH> | tk=<K_LEADING> | tk=<K_TRAILING> */
14401477
| tk=<K_FORMAT> | tk=<K_DIV> | tk=<K_UNSIGNED> | tk=<K_CASE> | tk=<K_LOCAL>
14411478
| tk=<K_ARRAY_LITERAL>
1479+
| tk=<K_USER>
14421480

14431481
/* Keywords for ALTER SESSION */
14441482
/* | tk=<K_NAME> */ | tk=<K_TIMEOUT> | tk=<K_PARALLEL>
@@ -4379,6 +4417,13 @@ List<Index.ColumnParams> ColumnNamesWithParamsList() : {
43794417
{ return colNames; }
43804418
}
43814419

4420+
Index Index(): {
4421+
List<String> name;
4422+
}
4423+
{
4424+
name= RelObjectNameList() { return new Index().withName(name).withType(""); }
4425+
}
4426+
43824427
CreateIndex CreateIndex():
43834428
{
43844429
CreateIndex createIndex = new CreateIndex();
@@ -4396,13 +4441,7 @@ CreateIndex CreateIndex():
43964441
<K_CREATE>
43974442
[ parameter=CreateParameter() ]
43984443

4399-
<K_INDEX> name= RelObjectNameList()
4400-
4401-
{
4402-
index = new Index();
4403-
index.setName(name);
4404-
index.setType(parameter.isEmpty()?null:parameter.get(0));
4405-
}
4444+
<K_INDEX> index = Index() { index.setType(parameter.isEmpty()?null:parameter.get(0)); }
44064445

44074446
<K_ON> table=Table()
44084447

0 commit comments

Comments
 (0)