Skip to content

Commit

Permalink
Implement Oracle Purge Statement (#1287)
Browse files Browse the repository at this point in the history
  • Loading branch information
manticore-projects authored Jul 26, 2021
1 parent f85b4b6 commit f86bc2e
Show file tree
Hide file tree
Showing 10 changed files with 290 additions and 9 deletions.
18 changes: 18 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/PurgeObjectType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2021 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.statement;

/**
*
* @author <a href="mailto:andreas@manticore-projects.com">Andreas Reichel</a>
*/
public enum PurgeObjectType {
TABLE, INDEX, RECYCLEBIN, DBA_RECYCLEBIN, TABLESPACE;
}
103 changes: 103 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/PurgeStatement.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2021 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/

package net.sf.jsqlparser.statement;

import java.util.Objects;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.create.table.Index;

/**
*
* @author <a href="mailto:andreas@manticore-projects.com">Andreas Reichel</a>
* @see <a href="https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9018.htm">Purge</a>
*/

public class PurgeStatement implements Statement {
private final PurgeObjectType purgeObjectType;
private final Object object;
private String userName;

public PurgeStatement(Table table) {
this.purgeObjectType = PurgeObjectType.TABLE;
this.object = Objects.requireNonNull(table, "The TABLE of the PURGE TABLE statement must not be null.");
}

public PurgeStatement(Index index) {
this.purgeObjectType = PurgeObjectType.INDEX;
this.object = Objects.requireNonNull(index, "The INDEX of the PURGE INDEX statement must not be null.");
}

public PurgeStatement(PurgeObjectType purgeObjectType) {
this.purgeObjectType = purgeObjectType;
this.object = null;
}

public PurgeStatement(PurgeObjectType purgeObjectType, String tableSpaceName, String userName) {
this.purgeObjectType = purgeObjectType;
this.object = Objects.requireNonNull(tableSpaceName, "The TABLESPACE NAME of the PURGE TABLESPACE statement must not be null.");
this.userName = userName;
}

@Override
public void accept(StatementVisitor statementVisitor) {
statementVisitor.visit(this);
}

@SuppressWarnings({"PMD.MissingBreakInSwitch", "PMD.SwitchStmtsShouldHaveDefault", "PMD.CyclomaticComplexity"})
public StringBuilder appendTo(StringBuilder builder) {
builder.append("PURGE ");

switch (purgeObjectType) {
case RECYCLEBIN:
case DBA_RECYCLEBIN:
builder.append(purgeObjectType);
break;
case TABLE:
case INDEX:
builder.append(purgeObjectType);
if (object!=null) {
builder.append(" ").append(object);
}
break;
case TABLESPACE:
builder.append(purgeObjectType);
if (object!=null) {
builder.append(" ").append(object);
}
if (userName!=null && userName.length()>0) {
builder.append(" USER ").append(userName);
}
break;
}
return builder;
}

@Override
public String toString() {
return appendTo(new StringBuilder()).toString();
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public PurgeObjectType getPurgeObjectType() {
return purgeObjectType;
}

public Object getObject() {
return object;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,6 @@ public interface StatementVisitor {
void visit(CreateSynonym createSynonym);

void visit(AlterSession alterSession);

void visit(PurgeStatement purgeStatement);
}
Original file line number Diff line number Diff line change
Expand Up @@ -210,4 +210,9 @@ public void visit(RollbackStatement rollbackStatement) {
public void visit(AlterSession alterSession) {
//@todo: do something usefull here
}

@Override
public void visit(PurgeStatement purgeStatement) {
//@todo: do something usefull here
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public Index withIndexSpec(List<String> idxSpec) {
@Override
public String toString() {
String idxSpecText = PlainSelect.getStringList(idxSpec, false, false);
return type + (!name.isEmpty() ? " " + getName() : "") + " " + PlainSelect.
return ( type!=null ? type : "") + (!name.isEmpty() ? " " + getName() : "") + " " + PlainSelect.
getStringList(columns, true, true) + (!"".equals(idxSpecText) ? " " + idxSpecText : "");
}

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -1024,4 +1024,11 @@ public void visit(JsonFunction expression) {
expr.getExpression().accept(this);
}
}

@Override
public void visit(PurgeStatement purgeStatement) {
if (purgeStatement.getPurgeObjectType()== PurgeObjectType.TABLE) {
((Table) purgeStatement.getObject()).accept(this);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import net.sf.jsqlparser.statement.DeclareStatement;
import net.sf.jsqlparser.statement.DescribeStatement;
import net.sf.jsqlparser.statement.ExplainStatement;
import net.sf.jsqlparser.statement.PurgeStatement;
import net.sf.jsqlparser.statement.RollbackStatement;
import net.sf.jsqlparser.statement.SavepointStatement;
import net.sf.jsqlparser.statement.ResetStatement;
Expand Down Expand Up @@ -349,4 +350,9 @@ void deParse(Statement statement) {
public void visit(AlterSession alterSession) {
new AlterSessionDeParser(buffer).deParse(alterSession);
}

@Override
public void visit(PurgeStatement purgeStatement) {
purgeStatement.appendTo(buffer);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import net.sf.jsqlparser.statement.DeclareStatement;
import net.sf.jsqlparser.statement.DescribeStatement;
import net.sf.jsqlparser.statement.ExplainStatement;
import net.sf.jsqlparser.statement.PurgeStatement;
import net.sf.jsqlparser.statement.RollbackStatement;
import net.sf.jsqlparser.statement.SavepointStatement;
import net.sf.jsqlparser.statement.ResetStatement;
Expand Down Expand Up @@ -277,4 +278,9 @@ public void visit(AlterSession alterSession) {
//@todo: write something usefull here
}

@Override
public void visit(PurgeStatement purgeStatement) {
//@todo: write something usefull here
}

}
55 changes: 47 additions & 8 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_DECLARE: "DECLARE">
| <K_DATETIMELITERAL : ("DATE" | "TIME" | "TIMESTAMP") >
| <K_DATE_LITERAL : ( "YEAR" | "MONTH" | "DAY" | "HOUR" | "MINUTE" | "SECOND" ) >
| <K_DBA_RECYCLEBIN: "DBA_RECYCLEBIN">
| <K_DEFAULT : "DEFAULT">
| <K_DEFERRABLE : "DEFERRABLE">
| <K_DELAYED : "DELAYED">
Expand Down Expand Up @@ -313,9 +314,11 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_PRIOR:"PRIOR">
| <K_PROCEDURE:"PROCEDURE">
| <K_PUBLIC:"PUBLIC">
| <K_PURGE:"PURGE">
| <K_QUERY:"QUERY">
| <K_RANGE: "RANGE">
| <K_READ: "READ" >
| <K_RECYCLEBIN: "RECYCLEBIN">
| <K_RECURSIVE:"RECURSIVE">
| <K_REFERENCES:"REFERENCES">
| <K_REGEXP: "REGEXP">
Expand Down Expand Up @@ -373,7 +376,8 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_UNPIVOT:"UNPIVOT">
| <K_UPDATE:"UPDATE">
| <K_UPSERT:"UPSERT">
| <K_USE : "USE">
| <K_USE:"USE">
| <K_USER:"USER">
| <K_SQL_CALC_FOUND_ROWS: "SQL_CALC_FOUND_ROWS">
| <K_SQL_NO_CACHE: "SQL_NO_CACHE">
| <K_USING:"USING">
Expand Down Expand Up @@ -578,6 +582,8 @@ Statement SingleStatement() :
stm = Declare()
|
stm = Grant()
|
stm = PurgeStatement()
)
{ return stm; }
} catch (ParseException e) {
Expand Down Expand Up @@ -749,6 +755,37 @@ ResetStatement Reset(): {
{ return reset; }
}

PurgeStatement PurgeStatement(): {
PurgeStatement purgeStatement = null;
Table table;
Index index;
Token tableSpaceToken;
Token userToken = null;
}
{
<K_PURGE>
(
<K_TABLE> table=Table() { purgeStatement = new PurgeStatement(table); }
|
<K_INDEX> index=Index() { purgeStatement = new PurgeStatement(index); }
|
<K_RECYCLEBIN> { purgeStatement = new PurgeStatement(PurgeObjectType.RECYCLEBIN); }
|
<K_DBA_RECYCLEBIN> { purgeStatement = new PurgeStatement(PurgeObjectType.DBA_RECYCLEBIN); }
|
<K_TABLESPACE> tableSpaceToken=<S_IDENTIFIER> [ <K_USER> userToken=<S_IDENTIFIER> ] {
purgeStatement = new PurgeStatement(
PurgeObjectType.TABLESPACE
, tableSpaceToken.image
, userToken!=null ? userToken.image : null);
}
)

{
return purgeStatement;
}
}

DescribeStatement Describe(): {
Table table;
} {
Expand Down Expand Up @@ -1439,6 +1476,7 @@ String RelObjectNameWithoutValue() :
/*| tk=<K_PLACING> | tk=<K_BOTH> | tk=<K_LEADING> | tk=<K_TRAILING> */
| tk=<K_FORMAT> | tk=<K_DIV> | tk=<K_UNSIGNED> | tk=<K_CASE> | tk=<K_LOCAL>
| tk=<K_ARRAY_LITERAL>
| tk=<K_USER>

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

Index Index(): {
List<String> name;
}
{
name= RelObjectNameList() { return new Index().withName(name).withType(""); }
}

CreateIndex CreateIndex():
{
CreateIndex createIndex = new CreateIndex();
Expand All @@ -4396,13 +4441,7 @@ CreateIndex CreateIndex():
<K_CREATE>
[ parameter=CreateParameter() ]

<K_INDEX> name= RelObjectNameList()

{
index = new Index();
index.setName(name);
index.setType(parameter.isEmpty()?null:parameter.get(0));
}
<K_INDEX> index = Index() { index.setType(parameter.isEmpty()?null:parameter.get(0)); }

<K_ON> table=Table()

Expand Down
Loading

0 comments on commit f86bc2e

Please sign in to comment.