mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for oracle sql parser
This commit is contained in:
@@ -15,6 +15,6 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.ast.statement;
|
||||
|
||||
public interface SQLPrimaryKey extends SQLUniqueConstraint {
|
||||
public interface SQLPrimaryKey extends SQLUniqueConstraint, SQLTableElement {
|
||||
|
||||
}
|
||||
|
||||
+2
-10
@@ -64,11 +64,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
|
||||
for (SQLName tableName : x.getTableNames()) {
|
||||
String ident = tableName.toString();
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementDeleteCount();
|
||||
}
|
||||
|
||||
@@ -100,11 +96,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
String ident = ((SQLIdentifierExpr) x.getTableName()).getName();
|
||||
setCurrentTable(x, ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
|
||||
+23
@@ -77,4 +77,27 @@ public abstract class FlashbackQueryClause extends OracleSQLObjectImpl {
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
}
|
||||
|
||||
public static class AsOfSnapshotClause extends FlashbackQueryClause {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLExpr expr;
|
||||
|
||||
public SQLExpr getExpr() {
|
||||
return expr;
|
||||
}
|
||||
|
||||
public void setExpr(SQLExpr expr) {
|
||||
this.expr = expr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, expr);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.expr;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleSizeExpr extends OracleSQLObjectImpl implements OracleExpr {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLExpr value;
|
||||
private Unit unit;
|
||||
|
||||
public OracleSizeExpr(){
|
||||
|
||||
}
|
||||
|
||||
public OracleSizeExpr(SQLExpr value, Unit unit){
|
||||
super();
|
||||
this.value = value;
|
||||
this.unit = unit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, value);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLExpr getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(SQLExpr value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public Unit getUnit() {
|
||||
return unit;
|
||||
}
|
||||
|
||||
public void setUnit(Unit unit) {
|
||||
this.unit = unit;
|
||||
}
|
||||
|
||||
public static enum Unit {
|
||||
K, M, G, T, P, E
|
||||
}
|
||||
}
|
||||
+12
@@ -1,5 +1,6 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
|
||||
@@ -19,15 +20,26 @@ public class OracleAlterIndexStatement extends OracleStatementImpl {
|
||||
|
||||
private Rebuild rebuild;
|
||||
|
||||
private SQLExpr parallel;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
acceptChild(visitor, rebuild);
|
||||
acceptChild(visitor, parallel);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLExpr getParallel() {
|
||||
return parallel;
|
||||
}
|
||||
|
||||
public void setParallel(SQLExpr parallel) {
|
||||
this.parallel = parallel;
|
||||
}
|
||||
|
||||
public Boolean getMonitoringUsage() {
|
||||
return monitoringUsage;
|
||||
}
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleAlterSynonymStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName name;
|
||||
|
||||
private Boolean enable;
|
||||
|
||||
private boolean compile;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public Boolean getEnable() {
|
||||
return enable;
|
||||
}
|
||||
|
||||
public void setEnable(Boolean enable) {
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLName name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public boolean isCompile() {
|
||||
return compile;
|
||||
}
|
||||
|
||||
public void setCompile(boolean compile) {
|
||||
this.compile = compile;
|
||||
}
|
||||
|
||||
}
|
||||
+10
-7
@@ -1,28 +1,31 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleAlterTableAddColumn extends OracleAlterTableItem {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLColumnDefinition column;
|
||||
private List<SQLColumnDefinition> columns = new ArrayList<SQLColumnDefinition>();
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, column);
|
||||
acceptChild(visitor, columns);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLColumnDefinition getColumn() {
|
||||
return column;
|
||||
public List<SQLColumnDefinition> getColumns() {
|
||||
return columns;
|
||||
}
|
||||
|
||||
public void setColumn(SQLColumnDefinition column) {
|
||||
this.column = column;
|
||||
public void setColumns(List<SQLColumnDefinition> columns) {
|
||||
this.columns = columns;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleAlterTableMoveTablespace extends OracleAlterTableItem {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName name;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLName name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
}
|
||||
+21
-2
@@ -8,9 +8,12 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleAlterTableStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
private SQLName name;
|
||||
private List<OracleAlterTableItem> items = new ArrayList<OracleAlterTableItem>();
|
||||
private List<OracleAlterTableItem> items = new ArrayList<OracleAlterTableItem>();
|
||||
|
||||
private boolean updateGlobalIndexes = false;
|
||||
private boolean invalidateGlobalIndexes = false;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
@@ -21,6 +24,22 @@ public class OracleAlterTableStatement extends OracleStatementImpl {
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public boolean isUpdateGlobalIndexes() {
|
||||
return updateGlobalIndexes;
|
||||
}
|
||||
|
||||
public void setUpdateGlobalIndexes(boolean updateGlobalIndexes) {
|
||||
this.updateGlobalIndexes = updateGlobalIndexes;
|
||||
}
|
||||
|
||||
public boolean isInvalidateGlobalIndexes() {
|
||||
return invalidateGlobalIndexes;
|
||||
}
|
||||
|
||||
public void setInvalidateGlobalIndexes(boolean invalidateGlobalIndexes) {
|
||||
this.invalidateGlobalIndexes = invalidateGlobalIndexes;
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleAlterTablespaceAddDataFile extends OracleSQLObjectImpl implements OracleAlterTablespaceItem {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private List<OracleFileSpecification> files = new ArrayList<OracleFileSpecification>();
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, files);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public List<OracleFileSpecification> getFiles() {
|
||||
return files;
|
||||
}
|
||||
|
||||
public void setFiles(List<OracleFileSpecification> files) {
|
||||
this.files = files;
|
||||
}
|
||||
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject;
|
||||
|
||||
|
||||
public interface OracleAlterTablespaceItem extends OracleSQLObject {
|
||||
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleAlterTablespaceStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName name;
|
||||
private OracleAlterTablespaceItem item;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
acceptChild(visitor, item);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLName name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public OracleAlterTablespaceItem getItem() {
|
||||
return item;
|
||||
}
|
||||
|
||||
public void setItem(OracleAlterTablespaceItem item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleAlterTriggerStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName name;
|
||||
|
||||
private Boolean enable;
|
||||
|
||||
private boolean compile;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public boolean isCompile() {
|
||||
return compile;
|
||||
}
|
||||
|
||||
public void setCompile(boolean compile) {
|
||||
this.compile = compile;
|
||||
}
|
||||
|
||||
public Boolean getEnable() {
|
||||
return enable;
|
||||
}
|
||||
|
||||
public void setEnable(Boolean enable) {
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLName name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleAlterViewStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName name;
|
||||
|
||||
private Boolean enable;
|
||||
|
||||
private boolean compile;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public Boolean getEnable() {
|
||||
return enable;
|
||||
}
|
||||
|
||||
public void setEnable(Boolean enable) {
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLName name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public boolean isCompile() {
|
||||
return compile;
|
||||
}
|
||||
|
||||
public void setCompile(boolean compile) {
|
||||
this.compile = compile;
|
||||
}
|
||||
|
||||
}
|
||||
+35
-3
@@ -3,25 +3,48 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleCreateIndexStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName name;
|
||||
|
||||
private SQLName table;
|
||||
|
||||
private List<SQLSelectOrderByItem> items = new ArrayList<SQLSelectOrderByItem>();
|
||||
private List<SQLSelectOrderByItem> items = new ArrayList<SQLSelectOrderByItem>();
|
||||
|
||||
private SQLName tablespace;
|
||||
|
||||
private Type type;
|
||||
|
||||
private boolean online = false;
|
||||
private boolean online = false;
|
||||
|
||||
private boolean indexOnlyTopLevel = false;
|
||||
|
||||
private boolean noParallel;
|
||||
|
||||
private SQLExpr parallel;
|
||||
|
||||
public SQLExpr getParallel() {
|
||||
return parallel;
|
||||
}
|
||||
|
||||
public void setParallel(SQLExpr parallel) {
|
||||
this.parallel = parallel;
|
||||
}
|
||||
|
||||
public boolean isNoParallel() {
|
||||
return noParallel;
|
||||
}
|
||||
|
||||
public void setNoParallel(boolean noParallel) {
|
||||
this.noParallel = noParallel;
|
||||
}
|
||||
|
||||
public Type getType() {
|
||||
return type;
|
||||
@@ -31,6 +54,14 @@ public class OracleCreateIndexStatement extends OracleStatementImpl {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public boolean isIndexOnlyTopLevel() {
|
||||
return indexOnlyTopLevel;
|
||||
}
|
||||
|
||||
public void setIndexOnlyTopLevel(boolean indexOnlyTopLevel) {
|
||||
this.indexOnlyTopLevel = indexOnlyTopLevel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
@@ -38,6 +69,7 @@ public class OracleCreateIndexStatement extends OracleStatementImpl {
|
||||
acceptChild(visitor, table);
|
||||
acceptChild(visitor, items);
|
||||
acceptChild(visitor, tablespace);
|
||||
acceptChild(visitor, parallel);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
+12
-2
@@ -12,7 +12,7 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class OracleCreateTableStatement extends SQLCreateTableStatement implements OracleStatement {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName tablespace;
|
||||
|
||||
@@ -25,7 +25,17 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen
|
||||
// NOPARALLEL
|
||||
private Boolean parallel;
|
||||
|
||||
private List<StorageItem> storage = new ArrayList<StorageItem>();
|
||||
private List<StorageItem> storage = new ArrayList<StorageItem>();
|
||||
|
||||
private boolean organizationIndex = false;
|
||||
|
||||
public boolean isOrganizationIndex() {
|
||||
return organizationIndex;
|
||||
}
|
||||
|
||||
public void setOrganizationIndex(boolean organizationIndex) {
|
||||
this.organizationIndex = organizationIndex;
|
||||
}
|
||||
|
||||
public Boolean getParallel() {
|
||||
return parallel;
|
||||
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleFileSpecification extends OracleSQLObjectImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private List<SQLExpr> fileNames = new ArrayList<SQLExpr>();
|
||||
|
||||
private SQLExpr size;
|
||||
|
||||
private boolean autoExtendOff = false;
|
||||
|
||||
private SQLExpr autoExtendOn;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, fileNames);
|
||||
acceptChild(visitor, size);
|
||||
acceptChild(visitor, autoExtendOn);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLExpr getAutoExtendOn() {
|
||||
return autoExtendOn;
|
||||
}
|
||||
|
||||
public void setAutoExtendOn(SQLExpr autoExtendOn) {
|
||||
this.autoExtendOn = autoExtendOn;
|
||||
}
|
||||
|
||||
public SQLExpr getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public void setSize(SQLExpr size) {
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
public boolean isAutoExtendOff() {
|
||||
return autoExtendOff;
|
||||
}
|
||||
|
||||
public void setAutoExtendOff(boolean autoExtendOff) {
|
||||
this.autoExtendOff = autoExtendOff;
|
||||
}
|
||||
|
||||
public List<SQLExpr> getFileNames() {
|
||||
return fileNames;
|
||||
}
|
||||
|
||||
public void setFileNames(List<SQLExpr> fileNames) {
|
||||
this.fileNames = fileNames;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,10 +6,11 @@ import java.util.List;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OraclePrimaryKey extends OracleSQLObjectImpl implements SQLPrimaryKey {
|
||||
public class OraclePrimaryKey extends OracleSQLObjectImpl implements SQLPrimaryKey, SQLTableElement {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
+2
@@ -82,7 +82,9 @@ public class OracleSelectSubqueryTableSource extends SQLSubqueryTableSource impl
|
||||
|
||||
protected void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, this.hints);
|
||||
acceptChild(visitor, this.select);
|
||||
acceptChild(visitor, this.pivot);
|
||||
acceptChild(visitor, this.flashback);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
|
||||
@@ -31,7 +31,6 @@ public class OracleUpdateStatement extends SQLUpdateStatement implements OracleS
|
||||
private final List<OracleHint> hints = new ArrayList<OracleHint>(1);
|
||||
private boolean only = false;
|
||||
private String alias;
|
||||
private OracleUpdateSetClause setClause;
|
||||
private SQLExpr where;
|
||||
|
||||
public OracleUpdateStatement(){
|
||||
@@ -75,14 +74,6 @@ public class OracleUpdateStatement extends SQLUpdateStatement implements OracleS
|
||||
this.where = where;
|
||||
}
|
||||
|
||||
public OracleUpdateSetClause getSetClause() {
|
||||
return this.setClause;
|
||||
}
|
||||
|
||||
public void setSetClause(OracleUpdateSetClause setClause) {
|
||||
this.setClause = setClause;
|
||||
}
|
||||
|
||||
public boolean isOnly() {
|
||||
return this.only;
|
||||
}
|
||||
|
||||
@@ -59,6 +59,11 @@ public class OracleCreateTableParser extends SQLCreateTableParser {
|
||||
}
|
||||
accept(Token.RPAREN);
|
||||
continue;
|
||||
} else if (identifierEquals("organization")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.INDEX);
|
||||
stmt.setOrganizationIndex(true);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -51,9 +51,11 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalType;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.parser.Lexer;
|
||||
import com.alibaba.druid.sql.parser.ParserException;
|
||||
@@ -65,6 +67,11 @@ public class OracleExprParser extends SQLExprParser {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public boolean allowStringAdditive = false;
|
||||
|
||||
/**
|
||||
@@ -266,6 +273,32 @@ public class OracleExprParser extends SQLExprParser {
|
||||
}
|
||||
|
||||
public SQLExpr primaryRest(SQLExpr expr) throws ParserException {
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
String ident = lexer.stringVal();
|
||||
if (ident.length() == 1) {
|
||||
char unit = ident.charAt(0);
|
||||
switch (unit) {
|
||||
case 'K':
|
||||
case 'M':
|
||||
case 'G':
|
||||
case 'T':
|
||||
case 'P':
|
||||
case 'E':
|
||||
case 'k':
|
||||
case 'm':
|
||||
case 'g':
|
||||
case 't':
|
||||
case 'p':
|
||||
case 'e':
|
||||
expr = new OracleSizeExpr(expr, OracleSizeExpr.Unit.valueOf(ident.toUpperCase()));
|
||||
lexer.nextToken();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.DOTDOT) {
|
||||
lexer.nextToken();
|
||||
SQLExpr upBound = expr();
|
||||
@@ -407,7 +440,7 @@ public class OracleExprParser extends SQLExprParser {
|
||||
public SQLExpr parseTimestamp() {
|
||||
accept(Token.TIMESTAMP);
|
||||
|
||||
if (lexer.token() != Token.LITERAL_ALIAS) {
|
||||
if (lexer.token() != Token.LITERAL_ALIAS && lexer.token() != Token.LITERAL_CHARS) {
|
||||
return new SQLIdentifierExpr("TIMESTAMP");
|
||||
}
|
||||
|
||||
@@ -731,4 +764,22 @@ public class OracleExprParser extends SQLExprParser {
|
||||
|
||||
return expr;
|
||||
}
|
||||
|
||||
public OraclePrimaryKey parsePrimaryKey() {
|
||||
lexer.nextToken();
|
||||
accept(Token.KEY);
|
||||
|
||||
OraclePrimaryKey primaryKey = new OraclePrimaryKey();
|
||||
accept(Token.LPAREN);
|
||||
exprList(primaryKey.getColumns());
|
||||
accept(Token.RPAREN);
|
||||
|
||||
|
||||
if (lexer.token() == Token.USING) {
|
||||
lexer.nextToken();
|
||||
accept(Token.INDEX);
|
||||
primaryKey.setUsingIndex(expr());
|
||||
}
|
||||
return primaryKey;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
|
||||
@@ -824,17 +825,31 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
if (lexer.token() == Token.OF) {
|
||||
lexer.nextToken();
|
||||
|
||||
AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause();
|
||||
|
||||
if (identifierEquals("SCN")) {
|
||||
AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause();
|
||||
clause.setType(AsOfFlashbackQueryClause.Type.SCN);
|
||||
lexer.nextToken();
|
||||
clause.setExpr(createExprParser().expr());
|
||||
|
||||
return clause;
|
||||
} else if (identifierEquals("SNAPSHOT")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.LPAREN);
|
||||
AsOfSnapshotClause clause = new AsOfSnapshotClause();
|
||||
clause.setExpr(this.expr());
|
||||
accept(Token.RPAREN);
|
||||
|
||||
return clause;
|
||||
} else {
|
||||
AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause();
|
||||
accept(Token.TIMESTAMP);
|
||||
clause.setType(AsOfFlashbackQueryClause.Type.TIMESTAMP);
|
||||
clause.setExpr(createExprParser().expr());
|
||||
|
||||
return clause;
|
||||
}
|
||||
clause.setExpr(createExprParser().expr());
|
||||
|
||||
return clause;
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
+228
-43
@@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLConstaint;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertInto;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
|
||||
@@ -39,11 +40,13 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec;
|
||||
@@ -51,6 +54,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
@@ -58,6 +65,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
|
||||
@@ -69,7 +77,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.Lo
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleStatement;
|
||||
import com.alibaba.druid.sql.parser.Lexer;
|
||||
@@ -277,7 +284,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
statementList.add(this.parseIf());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (lexer.token() == Token.GOTO) {
|
||||
lexer.nextToken();
|
||||
SQLName label = this.exprParser.name();
|
||||
@@ -285,10 +292,10 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (lexer.token() == Token.COMMIT) {
|
||||
lexer.nextToken();
|
||||
|
||||
|
||||
if (identifierEquals("WORK")) {
|
||||
lexer.nextToken();
|
||||
}
|
||||
@@ -296,7 +303,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (lexer.token() == Token.LTLT) {
|
||||
lexer.nextToken();
|
||||
SQLName label = this.exprParser.name();
|
||||
@@ -305,8 +312,6 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
@@ -468,17 +473,160 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
OracleAlterIndexStatement stmt = new OracleAlterIndexStatement();
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
if (identifierEquals("rebuild")) {
|
||||
lexer.nextToken();
|
||||
for (;;) {
|
||||
if (identifierEquals("rebuild")) {
|
||||
lexer.nextToken();
|
||||
|
||||
OracleAlterIndexStatement.Rebuild rebuild = new OracleAlterIndexStatement.Rebuild();
|
||||
stmt.setRebuild(rebuild);
|
||||
} else if (identifierEquals("MONITORING")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("USAGE");
|
||||
stmt.setMonitoringUsage(Boolean.TRUE);
|
||||
OracleAlterIndexStatement.Rebuild rebuild = new OracleAlterIndexStatement.Rebuild();
|
||||
stmt.setRebuild(rebuild);
|
||||
continue;
|
||||
} else if (identifierEquals("MONITORING")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("USAGE");
|
||||
stmt.setMonitoringUsage(Boolean.TRUE);
|
||||
continue;
|
||||
} else if (identifierEquals("PARALLEL")) {
|
||||
lexer.nextToken();
|
||||
stmt.setParallel(this.exprParser.expr());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return stmt;
|
||||
} else if (identifierEquals("TRIGGER")) {
|
||||
lexer.nextToken();
|
||||
OracleAlterTriggerStatement stmt = new OracleAlterTriggerStatement();
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
for (;;) {
|
||||
if (identifierEquals("ENABLE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setEnable(Boolean.TRUE);
|
||||
continue;
|
||||
} else if (identifierEquals("DISABLE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setEnable(Boolean.FALSE);
|
||||
continue;
|
||||
} else if (identifierEquals("COMPILE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setCompile(true);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return stmt;
|
||||
} else if (identifierEquals("SYNONYM")) {
|
||||
lexer.nextToken();
|
||||
OracleAlterSynonymStatement stmt = new OracleAlterSynonymStatement();
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
for (;;) {
|
||||
if (identifierEquals("ENABLE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setEnable(Boolean.TRUE);
|
||||
continue;
|
||||
} else if (identifierEquals("DISABLE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setEnable(Boolean.FALSE);
|
||||
continue;
|
||||
} else if (identifierEquals("COMPILE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setCompile(true);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return stmt;
|
||||
} else if (lexer.token() == Token.VIEW) {
|
||||
lexer.nextToken();
|
||||
OracleAlterViewStatement stmt = new OracleAlterViewStatement();
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
for (;;) {
|
||||
if (identifierEquals("ENABLE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setEnable(Boolean.TRUE);
|
||||
continue;
|
||||
} else if (identifierEquals("DISABLE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setEnable(Boolean.FALSE);
|
||||
continue;
|
||||
} else if (identifierEquals("COMPILE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setCompile(true);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return stmt;
|
||||
} else if (identifierEquals("TABLESPACE")) {
|
||||
lexer.nextToken();
|
||||
|
||||
OracleAlterTablespaceStatement stmt = new OracleAlterTablespaceStatement();
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
if (identifierEquals("ADD")) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (identifierEquals("DATAFILE")) {
|
||||
lexer.nextToken();
|
||||
|
||||
OracleAlterTablespaceAddDataFile item = new OracleAlterTablespaceAddDataFile();
|
||||
|
||||
for (;;) {
|
||||
OracleFileSpecification file = new OracleFileSpecification();
|
||||
|
||||
for (;;) {
|
||||
SQLExpr fileName = this.exprParser.expr();
|
||||
file.getFileNames().add(fileName);
|
||||
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
lexer.nextToken();
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (identifierEquals("SIZE")) {
|
||||
lexer.nextToken();
|
||||
file.setSize(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (identifierEquals("AUTOEXTEND")) {
|
||||
lexer.nextToken();
|
||||
if (identifierEquals("OFF")) {
|
||||
lexer.nextToken();
|
||||
file.setAutoExtendOff(true);
|
||||
} else if (identifierEquals("ON")) {
|
||||
lexer.nextToken();
|
||||
file.setAutoExtendOn(this.exprParser.expr());
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
}
|
||||
|
||||
item.getFiles().add(file);
|
||||
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
lexer.nextToken();
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
stmt.setItem(item);
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
|
||||
return stmt;
|
||||
}
|
||||
|
||||
@@ -496,11 +644,19 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
if (lexer.token() == Token.LPAREN) {
|
||||
lexer.nextToken();
|
||||
SQLColumnDefinition columnDef = this.exprParser.parseColumn();
|
||||
accept(Token.RPAREN);
|
||||
|
||||
OracleAlterTableAddColumn item = new OracleAlterTableAddColumn();
|
||||
item.setColumn(columnDef);
|
||||
|
||||
for (;;) {
|
||||
SQLColumnDefinition columnDef = this.exprParser.parseColumn();
|
||||
item.getColumns().add(columnDef);
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
lexer.nextToken();
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
accept(Token.RPAREN);
|
||||
|
||||
stmt.getItems().add(item);
|
||||
} else if (lexer.token() == Token.CONSTRAINT) {
|
||||
@@ -511,7 +667,18 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
continue;
|
||||
} else if (identifierEquals("MOVE")) {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
lexer.nextToken();
|
||||
|
||||
if (identifierEquals("TABLESPACE")) {
|
||||
lexer.nextToken();
|
||||
|
||||
OracleAlterTableMoveTablespace item = new OracleAlterTableMoveTablespace();
|
||||
item.setName(this.exprParser.name());
|
||||
|
||||
stmt.getItems().add(item);
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
} else if (identifierEquals("RENAME")) {
|
||||
stmt.getItems().add(parseAlterTableRename());
|
||||
} else if (identifierEquals("MODIFY")) {
|
||||
@@ -559,12 +726,24 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
break;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.UPDATE) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (identifierEquals("GLOBAL")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("INDEXES");
|
||||
stmt.setUpdateGlobalIndexes(true);
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
}
|
||||
|
||||
return stmt;
|
||||
}
|
||||
|
||||
private OracleAlterTableItem parseAlterTableRename() {
|
||||
acceptIdentifier("RENAME");
|
||||
|
||||
|
||||
if (lexer.token() == Token.TO) {
|
||||
lexer.nextToken();
|
||||
OracleAlterTableRenameTo item = new OracleAlterTableRenameTo();
|
||||
@@ -581,30 +760,18 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
SQLName name = this.exprParser.name();
|
||||
|
||||
SQLConstaint constraint;
|
||||
if (lexer.token() == Token.PRIMARY) {
|
||||
lexer.nextToken();
|
||||
accept(Token.KEY);
|
||||
|
||||
OraclePrimaryKey primaryKey = new OraclePrimaryKey();
|
||||
accept(Token.LPAREN);
|
||||
this.exprParser.exprList(primaryKey.getColumns());
|
||||
accept(Token.RPAREN);
|
||||
|
||||
item.setConstraint(primaryKey);
|
||||
if (lexer.token() == Token.USING) {
|
||||
lexer.nextToken();
|
||||
accept(Token.INDEX);
|
||||
primaryKey.setUsingIndex(this.exprParser.expr());
|
||||
}
|
||||
|
||||
primaryKey.setName(name);
|
||||
|
||||
item.setConstraint(primaryKey);
|
||||
|
||||
return item;
|
||||
constraint = exprParser.parsePrimaryKey();
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
constraint.setName(name);
|
||||
|
||||
item.setConstraint(constraint);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
private void parseAlterTableDrop(OracleAlterTableStatement stmt) {
|
||||
@@ -731,7 +898,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
OracleParameter parameter = new OracleParameter();
|
||||
parameter.setName(this.exprParser.name());
|
||||
parameter.setDataType(this.exprParser.parseDataType());
|
||||
|
||||
|
||||
block.getParameters().add(parameter);
|
||||
|
||||
if (lexer.token() == Token.COLONEQ) {
|
||||
@@ -757,6 +924,10 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
return block;
|
||||
}
|
||||
|
||||
public OracleSelectParser createSQLSelectParser() {
|
||||
return new OracleSelectParser(this.lexer);
|
||||
}
|
||||
|
||||
public OracleMergeStatement parseMerge() throws ParserException {
|
||||
accept(Token.MERGE);
|
||||
|
||||
@@ -1106,7 +1277,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
}
|
||||
|
||||
OracleCreateIndexStatement stmt = new OracleCreateIndexStatement();
|
||||
if (lexer.token() == Token.UNION) {
|
||||
if (lexer.token() == Token.UNIQUE) {
|
||||
stmt.setType(OracleCreateIndexStatement.Type.UNIQUE);
|
||||
lexer.nextToken();
|
||||
} else if (identifierEquals("BITMAP")) {
|
||||
@@ -1144,6 +1315,20 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
lexer.nextToken();
|
||||
stmt.setOnline(true);
|
||||
continue;
|
||||
} else if (identifierEquals("NOPARALLEL")) {
|
||||
lexer.nextToken();
|
||||
stmt.setNoParallel(true);
|
||||
continue;
|
||||
} else if (identifierEquals("PARALLEL")) {
|
||||
lexer.nextToken();
|
||||
stmt.setParallel(this.exprParser.expr());
|
||||
continue;
|
||||
} else if (lexer.token() == Token.INDEX) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("ONLY");
|
||||
acceptIdentifier("TOPLEVEL");
|
||||
stmt.setIndexOnlyTopLevel(true);
|
||||
continue;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
+160
-61
@@ -5,6 +5,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
|
||||
@@ -40,19 +41,26 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
@@ -62,6 +70,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
|
||||
@@ -942,15 +951,15 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
public void endVisit(OracleAlterTableDropPartition x) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableTruncatePartition x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableTruncatePartition x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -962,35 +971,35 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
public void endVisit(OracleAlterTableStatement x) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1000,67 +1009,67 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableSplitPartition x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableModify x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableModify x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableAddColumn x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableAddColumn x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateIndexStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateIndexStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterIndexStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterIndexStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleForStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleForStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterIndexStatement.Rebuild x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterIndexStatement.Rebuild x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1070,77 +1079,77 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
@Override
|
||||
public void endVisit(Else x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(ElseIf x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(ElseIf x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleIfStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleIfStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleRangeExpr x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleRangeExpr x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableAddConstaint x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableAddConstaint x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OraclePrimaryKey x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OraclePrimaryKey x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateTableStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateTableStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableRenameTo x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableRenameTo x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1150,7 +1159,7 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
@Override
|
||||
public void endVisit(StorageItem x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1160,17 +1169,17 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleGotoStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleLabelStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleLabelStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1180,16 +1189,106 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleParameter x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCommitStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCommitStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTriggerStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTriggerStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterSynonymStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterSynonymStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(AsOfSnapshotClause x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(AsOfSnapshotClause x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterViewStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterViewStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableMoveTablespace x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableMoveTablespace x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSizeExpr x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSizeExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleFileSpecification x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleFileSpecification x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTablespaceAddDataFile x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTablespaceAddDataFile x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTablespaceStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTablespaceStatement x) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
|
||||
@@ -46,19 +47,26 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
@@ -68,6 +76,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
|
||||
@@ -525,4 +534,40 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(OracleCommitStatement x);
|
||||
|
||||
void endVisit(OracleCommitStatement x);
|
||||
|
||||
boolean visit(OracleAlterTriggerStatement x);
|
||||
|
||||
void endVisit(OracleAlterTriggerStatement x);
|
||||
|
||||
boolean visit(OracleAlterSynonymStatement x);
|
||||
|
||||
void endVisit(OracleAlterSynonymStatement x);
|
||||
|
||||
boolean visit(OracleAlterViewStatement x);
|
||||
|
||||
void endVisit(OracleAlterViewStatement x);
|
||||
|
||||
boolean visit(AsOfSnapshotClause x);
|
||||
|
||||
void endVisit(AsOfSnapshotClause x);
|
||||
|
||||
boolean visit(OracleAlterTableMoveTablespace x);
|
||||
|
||||
void endVisit(OracleAlterTableMoveTablespace x);
|
||||
|
||||
boolean visit(OracleSizeExpr x);
|
||||
|
||||
void endVisit(OracleSizeExpr x);
|
||||
|
||||
boolean visit(OracleFileSpecification x);
|
||||
|
||||
void endVisit(OracleFileSpecification x);
|
||||
|
||||
boolean visit(OracleAlterTablespaceAddDataFile x);
|
||||
|
||||
void endVisit(OracleAlterTablespaceAddDataFile x);
|
||||
|
||||
boolean visit(OracleAlterTablespaceStatement x);
|
||||
|
||||
void endVisit(OracleAlterTablespaceStatement x);
|
||||
}
|
||||
|
||||
+199
-1
@@ -38,6 +38,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
|
||||
@@ -75,17 +76,20 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement.Rebuild;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec;
|
||||
@@ -93,6 +97,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
@@ -102,6 +110,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
|
||||
@@ -1976,6 +1985,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
println();
|
||||
item.accept(this);
|
||||
}
|
||||
if (x.isUpdateGlobalIndexes()) {
|
||||
println();
|
||||
print("UPDATE GLOABL INDEXES");
|
||||
}
|
||||
decrementIndent();
|
||||
return false;
|
||||
}
|
||||
@@ -2105,7 +2118,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableAddColumn x) {
|
||||
print("ADD (");
|
||||
x.getColumn().accept(this);
|
||||
printAndAccept(x.getColumns(), ", ");
|
||||
print(")");
|
||||
return false;
|
||||
}
|
||||
@@ -2129,6 +2142,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
print("(");
|
||||
printAndAccept(x.getItems(), ", ");
|
||||
print(")");
|
||||
|
||||
if (x.isIndexOnlyTopLevel()) {
|
||||
print(" INDEX ONLY TOPLEVEL");
|
||||
}
|
||||
|
||||
if (x.getTablespace() != null) {
|
||||
print(" TABLESPACE ");
|
||||
x.getTablespace().accept(this);
|
||||
@@ -2137,6 +2155,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
if (x.isOnline()) {
|
||||
print(" ONLINE");
|
||||
}
|
||||
|
||||
if (x.isNoParallel()) {
|
||||
print(" NOPARALLEL");
|
||||
} else if (x.getParallel() != null){
|
||||
print(" PARALLEL ");
|
||||
x.getParallel().accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2158,6 +2183,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
print(" ");
|
||||
x.getRebuild().accept(this);
|
||||
}
|
||||
|
||||
if (x.getParallel() != null) {
|
||||
print(" PARALLEL");
|
||||
x.getParallel().accept(this);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -2361,6 +2391,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
this.visit((SQLCreateTableStatement) x);
|
||||
|
||||
incrementIndent();
|
||||
|
||||
if (x.isOrganizationIndex()) {
|
||||
print(" ORGANIZATION INDEX");
|
||||
}
|
||||
|
||||
if (x.getTablespace() != null) {
|
||||
print(" TABLESPACE ");
|
||||
x.getTablespace().accept(this);
|
||||
@@ -2480,4 +2515,167 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(OracleCommitStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTriggerStatement x) {
|
||||
print("ALTER TRIGGER ");
|
||||
x.getName().accept(this);
|
||||
|
||||
if (x.isCompile()) {
|
||||
print(" COMPILE");
|
||||
}
|
||||
|
||||
if (x.getEnable() != null) {
|
||||
if (x.getEnable().booleanValue()) {
|
||||
print("ENABLE");
|
||||
} else {
|
||||
print("DISABLE");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTriggerStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterSynonymStatement x) {
|
||||
print("ALTER SYNONYM ");
|
||||
x.getName().accept(this);
|
||||
|
||||
if (x.isCompile()) {
|
||||
print(" COMPILE");
|
||||
}
|
||||
|
||||
if (x.getEnable() != null) {
|
||||
if (x.getEnable().booleanValue()) {
|
||||
print("ENABLE");
|
||||
} else {
|
||||
print("DISABLE");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterSynonymStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(AsOfSnapshotClause x) {
|
||||
print("AS OF SNAPSHOT(");
|
||||
x.getExpr().accept(this);
|
||||
print(")");
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(AsOfSnapshotClause x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterViewStatement x) {
|
||||
print("ALTER VIEW ");
|
||||
x.getName().accept(this);
|
||||
|
||||
if (x.isCompile()) {
|
||||
print(" COMPILE");
|
||||
}
|
||||
|
||||
if (x.getEnable() != null) {
|
||||
if (x.getEnable().booleanValue()) {
|
||||
print("ENABLE");
|
||||
} else {
|
||||
print("DISABLE");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterViewStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableMoveTablespace x) {
|
||||
print(" MOVE TABLESPACE ");
|
||||
x.getName().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableMoveTablespace x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSizeExpr x) {
|
||||
x.getValue().accept(this);
|
||||
print(x.getUnit().name());
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSizeExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleFileSpecification x) {
|
||||
printAndAccept(x.getFileNames(), ", ");
|
||||
|
||||
if (x.getSize() != null) {
|
||||
print(" SIZE ");
|
||||
x.getSize().accept(this);
|
||||
}
|
||||
|
||||
if (x.isAutoExtendOff()) {
|
||||
print(" AUTOEXTEND OFF");
|
||||
} else if (x.getAutoExtendOn() != null) {
|
||||
print(" AUTOEXTEND ON ");
|
||||
x.getAutoExtendOn().accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleFileSpecification x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTablespaceAddDataFile x) {
|
||||
print("ADD DATAFILE");
|
||||
incrementIndent();
|
||||
for (OracleFileSpecification file : x.getFiles()) {
|
||||
println();
|
||||
file.accept(this);
|
||||
}
|
||||
decrementIndent();
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTablespaceAddDataFile x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTablespaceStatement x) {
|
||||
print("ALTER TABLESPACE ");
|
||||
x.getName().accept(this);
|
||||
println();
|
||||
x.getItem().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTablespaceStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+232
-64
@@ -11,6 +11,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
@@ -22,6 +23,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
|
||||
@@ -57,19 +59,26 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
@@ -79,6 +88,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
|
||||
@@ -125,6 +135,10 @@ import com.alibaba.druid.stat.TableStat.Relationship;
|
||||
|
||||
public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor {
|
||||
|
||||
public OracleSchemaStatVisitor(){
|
||||
this.aliasMap.put("DUAL", null);
|
||||
}
|
||||
|
||||
protected Column getColumn(SQLExpr expr) {
|
||||
if (expr instanceof OracleOuterExpr) {
|
||||
expr = ((OracleOuterExpr) expr).getExpr();
|
||||
@@ -167,12 +181,9 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
return false;
|
||||
}
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
x.putAttribute(ATTR_TABLE, ident);
|
||||
}
|
||||
x.putAttribute(ATTR_TABLE, ident);
|
||||
|
||||
TableStat stat = getTableStat(ident);
|
||||
|
||||
Mode mode = getMode();
|
||||
switch (mode) {
|
||||
@@ -221,9 +232,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
public void endVisit(OracleSelect x) {
|
||||
endVisit((SQLSelect) x);
|
||||
}
|
||||
|
||||
public boolean visit(OracleSelect x) {
|
||||
setCurrentTable(x);
|
||||
|
||||
if (x.getOrderBy() != null) {
|
||||
x.getOrderBy().setParent(x);
|
||||
}
|
||||
@@ -239,6 +253,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
public void endVisit(SQLSelect x) {
|
||||
if (x.getQuery() != null) {
|
||||
String table = (String) x.getQuery().getAttribute(ATTR_TABLE);
|
||||
if (table != null) {
|
||||
x.putAttribute(ATTR_TABLE, table);
|
||||
}
|
||||
}
|
||||
restoreCurrentTable(x);
|
||||
}
|
||||
|
||||
@@ -253,24 +273,21 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
tableExpr = ((SQLExprTableSource) tableSource).getExpr();
|
||||
}
|
||||
|
||||
if (tableExpr instanceof SQLIdentifierExpr) {
|
||||
if (tableExpr instanceof SQLName) {
|
||||
String ident = tableExpr.toString();
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementUpdateCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
aliasMap.put(ident, ident);
|
||||
aliasMap.put(tableSource.getAlias(), ident);
|
||||
} else {
|
||||
tableSource.accept(this);
|
||||
}
|
||||
|
||||
accept(x.getSetClause());
|
||||
accept(x.getItems());
|
||||
accept(x.getWhere());
|
||||
|
||||
return false;
|
||||
@@ -293,7 +310,16 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
x.getWhere().setParent(x);
|
||||
}
|
||||
|
||||
return visit((SQLSelectQueryBlock) x);
|
||||
visit((SQLSelectQueryBlock) x);
|
||||
|
||||
if (x.getInto() instanceof SQLName) {
|
||||
TableStat stat = getTableStat(x.getInto().toString());
|
||||
if (stat != null) {
|
||||
stat.incrementInsertCount();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void endVisit(OracleSelectQueryBlock x) {
|
||||
@@ -565,6 +591,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public boolean visit(OracleSelectJoin x) {
|
||||
x.getLeft().accept(this);
|
||||
x.getRight().accept(this);
|
||||
|
||||
{
|
||||
String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE);
|
||||
String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE);
|
||||
if (leftTable != null && leftTable.equals(rightTable)) {
|
||||
x.putAttribute(ATTR_TABLE, leftTable);
|
||||
}
|
||||
}
|
||||
if (x.getCondition() != null) {
|
||||
x.getCondition().accept(this);
|
||||
}
|
||||
@@ -583,11 +617,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
if (leftTable != null) {
|
||||
columns.add(new Column(leftTable, columnName));
|
||||
addColumn(leftTable, columnName);
|
||||
}
|
||||
|
||||
if (rightTable != null) {
|
||||
columns.add(new Column(rightTable, columnName));
|
||||
addColumn(rightTable, columnName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -627,8 +661,23 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSelectSubqueryTableSource x) {
|
||||
accept(x.getSelect());
|
||||
accept(x.getPivot());
|
||||
accept(x.getFlashback());
|
||||
|
||||
return true;
|
||||
String table = (String) x.getSelect().getAttribute(ATTR_TABLE);
|
||||
if (x.getAlias() != null) {
|
||||
if (table != null) {
|
||||
this.aliasMap.put(x.getAlias(), table);
|
||||
}
|
||||
this.subQueryMap.put(x.getAlias(), x.getSelect());
|
||||
this.setCurrentTable(x.getAlias());
|
||||
}
|
||||
|
||||
if (table != null) {
|
||||
x.putAttribute(ATTR_TABLE, table);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -935,21 +984,18 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public boolean visit(OracleMergeStatement x) {
|
||||
setAliasMap();
|
||||
|
||||
setMode(x, Mode.Merge);
|
||||
|
||||
String originalTable = getCurrentTable();
|
||||
|
||||
setMode(x.getUsing(), Mode.Select);
|
||||
x.getUsing().accept(this);
|
||||
|
||||
setMode(x, Mode.Merge);
|
||||
|
||||
String ident = x.getInto().toString();
|
||||
setCurrentTable(x, ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementMergeCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
@@ -1035,11 +1081,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
String ident = ((SQLName) x.getTableName()).toString();
|
||||
setCurrentTable(x, ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
@@ -1131,7 +1173,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public boolean visit(OracleBlockStatement x) {
|
||||
for (OracleParameter param : x.getParameters()) {
|
||||
param.setParent(x);
|
||||
|
||||
|
||||
SQLExpr name = param.getName();
|
||||
this.variants.put(name.toString(), name);
|
||||
}
|
||||
@@ -1166,8 +1208,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
@Override
|
||||
public boolean visit(OracleLockTableStatement x) {
|
||||
String tableName = x.getTable().toString();
|
||||
TableStat stat = new TableStat();
|
||||
this.tableStats.put(new TableStat.Name(tableName), stat);
|
||||
getTableStat(tableName);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1289,18 +1330,22 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableStatement x) {
|
||||
String tableName = x.getName().toString();
|
||||
TableStat stat = new TableStat();
|
||||
TableStat stat = getTableStat(tableName);
|
||||
stat.incrementAlterCount();
|
||||
this.tableStats.put(new TableStat.Name(tableName), stat);
|
||||
|
||||
accept(x.getItems());
|
||||
setCurrentTable(x, tableName);
|
||||
|
||||
for (SQLObject item : x.getItems()) {
|
||||
item.setParent(x);
|
||||
item.accept(this);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableStatement x) {
|
||||
|
||||
restoreCurrentTable(x);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1345,6 +1390,15 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableModify x) {
|
||||
OracleAlterTableStatement stmt = (OracleAlterTableStatement) x.getParent();
|
||||
String table = stmt.getName().toString();
|
||||
|
||||
for (SQLColumnDefinition column : x.getColumns()) {
|
||||
String columnName = column.getName().toString();
|
||||
addColumn(table, columnName);
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1355,6 +1409,13 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableAddColumn x) {
|
||||
OracleAlterTableStatement stmt = (OracleAlterTableStatement) x.getParent();
|
||||
String table = stmt.getName().toString();
|
||||
|
||||
for (SQLColumnDefinition column : x.getColumns()) {
|
||||
String columnName = column.getName().toString();
|
||||
addColumn(table, columnName);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1365,12 +1426,22 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateIndexStatement x) {
|
||||
this.setCurrentTable(x);
|
||||
if (x.getTable() != null) {
|
||||
String tableName = x.getTable().toString();
|
||||
|
||||
TableStat stat = this.getTableStat(tableName);
|
||||
stat.incrementCreateIndexCount();
|
||||
this.setCurrentTable(tableName);
|
||||
|
||||
accept(x.getItems());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateIndexStatement x) {
|
||||
|
||||
restoreCurrentTable(x);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1382,23 +1453,23 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public void endVisit(OracleAlterIndexStatement x) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleForStatement x) {
|
||||
x.getRange().setParent(x);
|
||||
|
||||
|
||||
SQLName index = x.getIndex();
|
||||
this.getVariants().put(index.toString(), x);
|
||||
|
||||
|
||||
x.getRange().accept(this);
|
||||
accept(x.getStatements());
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleForStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1418,27 +1489,27 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(Else x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(ElseIf x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(ElseIf x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleIfStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleIfStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1448,35 +1519,43 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleRangeExpr x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableAddConstaint x) {
|
||||
x.getConstraint().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableAddConstaint x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OraclePrimaryKey x) {
|
||||
accept(x.getColumns());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OraclePrimaryKey x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateTableStatement x) {
|
||||
this.visit((SQLCreateTableStatement) x);
|
||||
|
||||
if (x.getSelect() != null) {
|
||||
x.getSelect().accept(this);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateTableStatement x) {
|
||||
this.endVisit((SQLCreateTableStatement) x);
|
||||
@@ -1489,7 +1568,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableRenameTo x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1499,7 +1578,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(StorageItem x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1509,17 +1588,17 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleGotoStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleLabelStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleLabelStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1529,7 +1608,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleParameter x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1539,6 +1618,95 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCommitStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTriggerStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTriggerStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterSynonymStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterSynonymStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(AsOfSnapshotClause x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(AsOfSnapshotClause x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterViewStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterViewStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTableMoveTablespace x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTableMoveTablespace x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSizeExpr x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSizeExpr x) {
|
||||
|
||||
}
|
||||
@Override
|
||||
public boolean visit(OracleFileSpecification x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleFileSpecification x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTablespaceAddDataFile x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTablespaceAddDataFile x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTablespaceStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTablespaceStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+5
-28
@@ -97,11 +97,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
public boolean visit(IntoClause x) {
|
||||
String ident = x.getTable().toString();
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementInsertCount();
|
||||
return false;
|
||||
}
|
||||
@@ -133,11 +129,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
for (SQLName name : x.getUsing()) {
|
||||
String ident = name.toString();
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementSelectCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
@@ -152,14 +144,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
String ident = ((SQLIdentifierExpr) x.getTableName()).getName();
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
if (x.getAlias() != null) {
|
||||
tableStats.put(new TableStat.Name(x.getAlias()), stat);
|
||||
}
|
||||
}
|
||||
TableStat stat = getTableStat(ident, x.getAlias());
|
||||
stat.incrementDeleteCount();
|
||||
|
||||
accept(x.getWhere());
|
||||
@@ -200,11 +185,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
@@ -254,11 +235,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
String ident = x.getTableName().toString();
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementUpdateCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
|
||||
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.parser;
|
||||
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
|
||||
|
||||
public class SQLCreateTableParser extends SQLDDLParser {
|
||||
|
||||
@@ -65,17 +66,23 @@ public class SQLCreateTableParser extends SQLDDLParser {
|
||||
if (lexer.token() == Token.LPAREN) {
|
||||
lexer.nextToken();
|
||||
|
||||
while (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) {
|
||||
SQLColumnDefinition column = this.exprParser.parseColumn();
|
||||
createTable.getTableElementList().add(column);
|
||||
|
||||
// parseConstaint(column.getConstaints());
|
||||
|
||||
if (lexer.token() != Token.COMMA) {
|
||||
break;
|
||||
for (;;) {
|
||||
if (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) {
|
||||
SQLColumnDefinition column = this.exprParser.parseColumn();
|
||||
createTable.getTableElementList().add(column);
|
||||
} else if (lexer.token() == Token.PRIMARY) {
|
||||
SQLPrimaryKey primaryKey = exprParser.parsePrimaryKey();
|
||||
createTable.getTableElementList().add(primaryKey);
|
||||
} else {
|
||||
throw new ParserException("TODO " + lexer.token());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
lexer.nextToken();
|
||||
continue;
|
||||
}
|
||||
|
||||
lexer.nextToken();
|
||||
break;
|
||||
}
|
||||
|
||||
// while
|
||||
|
||||
@@ -56,8 +56,10 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.NotNullConstraint;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
|
||||
public class SQLExprParser extends SQLParser {
|
||||
|
||||
@@ -214,6 +216,7 @@ public class SQLExprParser extends SQLParser {
|
||||
case LIMIT:
|
||||
case SCHEMA:
|
||||
case AT:
|
||||
case COLUMN:
|
||||
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
|
||||
lexer.nextToken();
|
||||
break;
|
||||
@@ -1131,4 +1134,8 @@ public class SQLExprParser extends SQLParser {
|
||||
|
||||
return column;
|
||||
}
|
||||
|
||||
public SQLPrimaryKey parsePrimaryKey() {
|
||||
throw new ParserException("TODO");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,7 +286,7 @@ public class SQLStatementParser extends SQLParser {
|
||||
if (token == Token.TABLE || identifierEquals("GLOBAL")) {
|
||||
SQLCreateTableParser createTableParser = getSQLCreateTableParser();
|
||||
return createTableParser.parseCrateTable(false);
|
||||
} else if (token == Token.INDEX) {
|
||||
} else if (token == Token.INDEX || token == Token.UNIQUE) {
|
||||
return parseCreateIndex(false);
|
||||
}
|
||||
|
||||
|
||||
@@ -66,6 +66,45 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
public final static String ATTR_COLUMN = "_column_";
|
||||
|
||||
private Mode mode;
|
||||
|
||||
public TableStat getTableStat(String ident) {
|
||||
return getTableStat(ident, null);
|
||||
}
|
||||
|
||||
public Column addColumn(String tableName, String columnName) {
|
||||
tableName = handleName(tableName);
|
||||
columnName = handleName(columnName);
|
||||
|
||||
Column column = new Column(tableName, columnName);
|
||||
columns.add(column);
|
||||
return column;
|
||||
}
|
||||
|
||||
public TableStat getTableStat(String tableName, String alias) {
|
||||
if (variants.containsKey(tableName)){
|
||||
return null;
|
||||
}
|
||||
|
||||
tableName = handleName(tableName);
|
||||
TableStat stat = tableStats.get(tableName);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(tableName), stat);
|
||||
if (alias != null) {
|
||||
aliasMap.put(alias, tableName);
|
||||
}
|
||||
}
|
||||
return stat;
|
||||
}
|
||||
|
||||
private String handleName(String ident) {
|
||||
ident = ident.replaceAll("\"", "");
|
||||
ident = ident.replaceAll(" ", "");
|
||||
|
||||
ident = aliasWrap(ident);
|
||||
|
||||
return ident;
|
||||
}
|
||||
|
||||
public Map<String, SQLObject> getVariants() {
|
||||
return variants;
|
||||
@@ -91,6 +130,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
this.currentTable = table;
|
||||
}
|
||||
|
||||
public void setCurrentTable(SQLObject x) {
|
||||
x.putAttribute("_old_local_", this.currentTable);
|
||||
}
|
||||
|
||||
public void restoreCurrentTable(SQLObject x) {
|
||||
String table = (String) x.getAttribute("_old_local_");
|
||||
this.currentTable = table;
|
||||
@@ -330,11 +373,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
@@ -359,11 +398,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementDropCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
@@ -388,11 +423,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
setCurrentTable(ident);
|
||||
x.putAttribute("_old_local_", originalTable);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementInsertCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
@@ -437,7 +468,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
if (tableSource.getExpr() instanceof SQLName) {
|
||||
String ident = tableSource.getExpr().toString();
|
||||
|
||||
setCurrentTable(ident);
|
||||
setCurrentTable(x, ident);
|
||||
x.putAttribute(ATTR_TABLE, ident);
|
||||
if (x.getParent() instanceof SQLSelect) {
|
||||
x.getParent().putAttribute(ATTR_TABLE, ident);
|
||||
@@ -448,6 +479,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
|
||||
if (x.getFrom() != null) {
|
||||
x.getFrom().accept(this); // 提前执行,获得aliasMap
|
||||
String table = (String) x.getFrom().getAttribute(ATTR_TABLE);
|
||||
if (table != null) {
|
||||
x.putAttribute(ATTR_TABLE, table);
|
||||
}
|
||||
}
|
||||
|
||||
if (x.getWhere() != null) {
|
||||
@@ -480,8 +515,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
owner = aliasWrap(owner);
|
||||
|
||||
if (owner != null) {
|
||||
Column column = new Column(owner, x.getName());
|
||||
columns.add(column);
|
||||
Column column = addColumn(owner, x.getName());
|
||||
x.putAttribute(ATTR_COLUMN, column);
|
||||
}
|
||||
}
|
||||
@@ -546,8 +580,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
if (currentTable != null) {
|
||||
Column column = new Column(currentTable, ident);
|
||||
columns.add(column);
|
||||
Column column = addColumn(currentTable, ident);
|
||||
x.putAttribute(ATTR_COLUMN, column);
|
||||
} else {
|
||||
Column column = handleUnkownColumn(ident);
|
||||
@@ -559,9 +592,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
protected Column handleUnkownColumn(String columnName) {
|
||||
Column column = new Column("UNKNOWN", columnName);
|
||||
columns.add(column);
|
||||
return column;
|
||||
return addColumn("UNKNOWN", columnName);
|
||||
}
|
||||
|
||||
public boolean visit(SQLAllColumnExpr x) {
|
||||
@@ -572,7 +603,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
if (currentTable != null) {
|
||||
columns.add(new Column(currentTable, "*"));
|
||||
addColumn(currentTable, "*");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -627,12 +658,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
x.putAttribute(ATTR_TABLE, ident);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
|
||||
Mode mode = getMode();
|
||||
switch (mode) {
|
||||
@@ -673,7 +699,13 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void endVisit(SQLSelect x) {
|
||||
restoreCurrentTable(x);
|
||||
}
|
||||
|
||||
public boolean visit(SQLSelect x) {
|
||||
setCurrentTable(x);
|
||||
|
||||
if (x.getOrderBy() != null) {
|
||||
x.getOrderBy().setParent(x);
|
||||
}
|
||||
@@ -708,11 +740,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
String ident = x.getTableName().toString();
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementUpdateCount();
|
||||
|
||||
Map<String, String> aliasMap = getAliasMap();
|
||||
@@ -732,11 +760,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
String ident = x.getTableName().toString();
|
||||
setCurrentTable(ident);
|
||||
|
||||
TableStat stat = tableStats.get(ident);
|
||||
if (stat == null) {
|
||||
stat = new TableStat();
|
||||
tableStats.put(new TableStat.Name(ident), stat);
|
||||
}
|
||||
TableStat stat = getTableStat(ident);
|
||||
stat.incrementDeleteCount();
|
||||
|
||||
accept(x.getWhere());
|
||||
@@ -778,11 +802,14 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
String tableName = x.getName().toString();
|
||||
TableStat stat = new TableStat();
|
||||
|
||||
TableStat stat = getTableStat(tableName);
|
||||
stat.incrementCreateCount();
|
||||
tableStats.put(new TableStat.Name(tableName), stat);
|
||||
setCurrentTable(x, tableName);
|
||||
|
||||
accept(x.getTableElementList());
|
||||
|
||||
restoreCurrentTable(x);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -801,7 +828,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
}
|
||||
|
||||
String columnName = x.getName().toString();
|
||||
columns.add(new Column(tableName, columnName));
|
||||
addColumn(tableName, columnName);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user