improve sql parser

This commit is contained in:
wenshao
2013-08-03 19:18:41 +08:00
parent 5d770978a3
commit 29d3f93e6b
40 changed files with 1498 additions and 528 deletions
@@ -27,7 +27,7 @@ public class SQLAlterTableAddForeignKey extends SQLObjectImpl implements SQLAlte
}
public SQLAlterTableAddForeignKey(SQLForeignKeyConstraint foreignKey){
this.foreignKey = foreignKey;
this.setForeignKey(foreignKey);
}
public SQLForeignKeyConstraint getForeignKey() {
@@ -35,6 +35,9 @@ public class SQLAlterTableAddForeignKey extends SQLObjectImpl implements SQLAlte
}
public void setForeignKey(SQLForeignKeyConstraint foreignKey) {
if (foreignKey != null) {
foreignKey.setParent(this);
}
this.foreignKey = foreignKey;
}
@@ -13,31 +13,41 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.mysql.ast;
package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class MySqlForeignKey extends SQLForeignKeyImpl implements SQLForeignKeyConstraint, SQLTableElement {
public class SQLColumnReference extends SQLConstaintImpl implements SQLColumnConstraint {
private SQLName table;
private List<SQLName> columns = new ArrayList<SQLName>();
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor instanceof MySqlASTVisitor) {
accept0((MySqlASTVisitor) visitor);
}
}
protected void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.getName());
acceptChild(visitor, this.getReferencedTableName());
acceptChild(visitor, this.getReferencingColumns());
acceptChild(visitor, this.getReferencedColumns());
}
visitor.endVisit(this);
}
public SQLName getTable() {
return table;
}
public void setTable(SQLName table) {
this.table = table;
}
public List<SQLName> getColumns() {
return columns;
}
public void setColumns(List<SQLName> columns) {
this.columns = columns;
}
}
@@ -0,0 +1,30 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLColumnUniqueKey extends SQLConstaintImpl implements SQLColumnConstraint {
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.getName());
}
visitor.endVisit(this);
}
}
@@ -19,13 +19,18 @@ import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public abstract class SQLForeignKeyImpl extends SQLConstaintImpl implements SQLForeignKeyConstraint {
public class SQLForeignKeyImpl extends SQLConstaintImpl implements SQLForeignKeyConstraint {
private SQLName referencedTableName;
private List<SQLName> referencingColumns = new ArrayList<SQLName>();
private List<SQLName> referencedColumns = new ArrayList<SQLName>();
public SQLForeignKeyImpl(){
}
@Override
public List<SQLName> getReferencingColumns() {
return referencingColumns;
@@ -46,4 +51,15 @@ public abstract class SQLForeignKeyImpl extends SQLConstaintImpl implements SQLF
return referencedColumns;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.getName());
acceptChild(visitor, this.getReferencedTableName());
acceptChild(visitor, this.getReferencingColumns());
acceptChild(visitor, this.getReferencedColumns());
}
visitor.endVisit(this);
}
}
@@ -19,9 +19,9 @@ import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLTableConstaint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption;
@@ -132,9 +132,12 @@ public class MySqlCreateTableParser extends SQLCreateTableParser {
} else if (lexer.token() == (Token.KEY)) {
stmt.getTableElementList().add(parseConstraint());
} else if (lexer.token() == (Token.PRIMARY)) {
stmt.getTableElementList().add(parseConstraint());
SQLTableConstaint pk = parseConstraint();
pk.setParent(stmt);
stmt.getTableElementList().add(pk);
} else if (lexer.token() == (Token.FOREIGN)) {
MySqlForeignKey fk = this.getExprParser().parseForeignKey();
SQLForeignKeyConstraint fk = this.getExprParser().parseForeignKey();
fk.setParent(stmt);
stmt.getTableElementList().add(fk);
} else if (lexer.token() == Token.CHECK) {
lexer.nextToken();
@@ -33,7 +33,6 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr;
@@ -756,26 +755,6 @@ public class MySqlExprParser extends SQLExprParser {
return unique;
}
public MySqlForeignKey parseForeignKey() {
accept(Token.FOREIGN);
accept(Token.KEY);
MySqlForeignKey fk = new MySqlForeignKey();
accept(Token.LPAREN);
this.names(fk.getReferencingColumns());
accept(Token.RPAREN);
accept(Token.REFERENCES);
fk.setReferencedTableName(this.name());
accept(Token.LPAREN);
this.names(fk.getReferencedColumns());
accept(Token.RPAREN);
return fk;
}
protected SQLAggregateExpr parseAggregateExprRest(SQLAggregateExpr aggregateExpr) {
if (lexer.token() == Token.ORDER) {
SQLOrderBy orderBy = this.parseOrderBy();
@@ -47,6 +47,7 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
@@ -57,7 +58,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex;
@@ -2274,12 +2274,18 @@ public class MySqlStatementParser extends SQLStatementParser {
SQLAlterTableAddPrimaryKey item = new SQLAlterTableAddPrimaryKey();
item.setPrimaryKey(primaryKey);
item.setParent(stmt);
stmt.getItems().add(item);
} else if (lexer.token() == Token.FOREIGN) {
MySqlForeignKey fk = this.getExprParser().parseForeignKey();
SQLForeignKeyConstraint fk = this.getExprParser().parseForeignKey();
fk.setName(constraintName);
SQLAlterTableAddForeignKey item = new SQLAlterTableAddForeignKey(fk);
item.setParent(stmt);
stmt.getItems().add(item);
} else {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
@@ -2516,7 +2522,7 @@ public class MySqlStatementParser extends SQLStatementParser {
lexer.reset();
break;
}
if (lexer.token() == Token.IDENTIFIER) {
name = exprParser.name();
name.setParent(item);
@@ -16,7 +16,6 @@
package com.alibaba.druid.sql.dialect.mysql.visitor;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
@@ -529,10 +528,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
void endVisit(MySqlAlterTableAddUnique x);
boolean visit(MySqlForeignKey x);
void endVisit(MySqlForeignKey x);
boolean visit(MySqlAlterTableModifyColumn x);
void endVisit(MySqlAlterTableModifyColumn x);
@@ -548,28 +543,28 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlCreateTableStatement.TableSpaceOption x);
void endVisit(MySqlCreateTableStatement.TableSpaceOption x);
boolean visit(MySqlPartitionByHash x);
void endVisit(MySqlPartitionByHash x);
boolean visit(MySqlPartitionByRange x);
void endVisit(MySqlPartitionByRange x);
boolean visit(MySqlPartitionByList x);
void endVisit(MySqlPartitionByList x);
boolean visit(MySqlPartitioningDef x);
void endVisit(MySqlPartitioningDef x);
boolean visit(MySqlPartitioningDef.LessThanValues x);
void endVisit(MySqlPartitioningDef.LessThanValues x);
boolean visit(MySqlPartitioningDef.InValues x);
void endVisit(MySqlPartitioningDef.InValues x);
} //
} //
File diff suppressed because it is too large Load Diff
@@ -38,7 +38,6 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
@@ -2934,32 +2933,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
@Override
public boolean visit(MySqlForeignKey x) {
if (x.getName() != null) {
print("CONSTRAINT ");
x.getName().accept(this);
print(' ');
}
print("FOREIGN KEY (");
printAndAccept(x.getReferencedColumns(), ", ");
print(")");
print(" REFERENCES ");
x.getReferencedTableName().accept(this);
print(" (");
printAndAccept(x.getReferencedColumns(), ", ");
print(")");
return false;
}
@Override
public void endVisit(MySqlForeignKey x) {
}
@Override
public boolean visit(MySqlAlterTableDiscardTablespace x) {
print("DISCARD TABLESPACE");
@@ -30,7 +30,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
@@ -1255,16 +1254,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
}
@Override
public boolean visit(MySqlForeignKey x) {
return false;
}
@Override
public void endVisit(MySqlForeignKey x) {
}
@Override
public boolean visit(MySqlAlterTableDiscardTablespace x) {
return false;
@@ -1279,7 +1268,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
public boolean visit(MySqlAlterTableImportTablespace x) {
return false;
}
@Override
public void endVisit(MySqlAlterTableImportTablespace x) {
@@ -1292,7 +1281,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public void endVisit(TableSpaceOption x) {
}
@Override
@@ -1302,7 +1291,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public void endVisit(MySqlPartitionByHash x) {
}
@Override
@@ -1312,7 +1301,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public void endVisit(MySqlPartitionByRange x) {
}
@Override
@@ -1322,7 +1311,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public void endVisit(MySqlPartitioningDef x) {
}
@Override
@@ -1332,7 +1321,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public void endVisit(LessThanValues x) {
}
@Override
@@ -1342,7 +1331,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public void endVisit(InValues x) {
}
@Override
@@ -1352,7 +1341,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
@Override
public void endVisit(MySqlPartitionByList x) {
}
}
@@ -17,11 +17,16 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLConstaint;
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject;
public interface OracleConstraint extends OracleSQLObject, SQLConstaint {
public interface OracleConstraint extends OracleSQLObject, SQLConstaint, SQLTableElement {
SQLName getExceptionsInto();
void setExceptionsInto(SQLName exceptionsInto);
Boolean getEnable();
void setEnable(Boolean enable);
}
@@ -0,0 +1,80 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleForeignKey extends SQLForeignKeyImpl implements OracleConstraint, OracleSQLObject {
private OracleUsingIndexClause using;
private SQLName exceptionsInto;
private Boolean enable;
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor instanceof OracleASTVisitor) {
accept0((OracleASTVisitor) visitor);
return;
}
super.accept(visitor);
}
public void accept0(OracleASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.getName());
acceptChild(visitor, this.getReferencedTableName());
acceptChild(visitor, this.getReferencingColumns());
acceptChild(visitor, this.getReferencedColumns());
acceptChild(visitor, using);
acceptChild(visitor, exceptionsInto);
}
visitor.endVisit(this);
}
public SQLName getExceptionsInto() {
return exceptionsInto;
}
public void setExceptionsInto(SQLName exceptionsInto) {
this.exceptionsInto = exceptionsInto;
}
public OracleUsingIndexClause getUsing() {
return using;
}
public void setUsing(OracleUsingIndexClause using) {
if (using != null) {
using.setParent(this);
}
this.using = using;
}
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
}
@@ -32,6 +32,7 @@ public class OraclePrimaryKey extends OracleSQLObjectImpl implements OracleConst
private OracleUsingIndexClause using;
private SQLName exceptionsInto;
private Boolean enable;
@Override
public void accept0(OracleASTVisitor visitor) {
@@ -76,4 +77,12 @@ public class OraclePrimaryKey extends OracleSQLObjectImpl implements OracleConst
this.exceptionsInto = exceptionsInto;
}
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
}
@@ -1,3 +1,18 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
import com.alibaba.druid.sql.ast.SQLName;
@@ -10,6 +25,7 @@ public class OracleUnique extends SQLUnique implements OracleConstraint, OracleS
private OracleUsingIndexClause using;
private SQLName exceptionsInto;
private Boolean enable;
@Override
protected void accept0(SQLASTVisitor visitor) {
@@ -50,4 +66,12 @@ public class OracleUnique extends SQLUnique implements OracleConstraint, OracleS
this.using = using;
}
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
}
@@ -37,6 +37,8 @@ import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLUnique;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
@@ -65,6 +67,8 @@ 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.OracleConstraint;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey;
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;
@@ -78,13 +82,6 @@ import com.alibaba.druid.sql.parser.Token;
public class OracleExprParser extends SQLExprParser {
public boolean allowStringAdditive = false;
/**
@@ -155,6 +152,10 @@ public class OracleExprParser extends SQLExprParser {
public SQLDataType parseDataType() {
if (lexer.token() == Token.CONSTRAINT || lexer.token() == Token.COMMA) {
return null;
}
if (lexer.token() == Token.DEFAULT || lexer.token() == Token.NOT || lexer.token() == Token.NULL) {
return null;
}
@@ -1247,4 +1248,38 @@ public class OracleExprParser extends SQLExprParser {
return unique;
}
public OracleConstraint parseConstaint() {
OracleConstraint constraint = (OracleConstraint) super.parseConstaint();
for (;;) {
if (lexer.token() == Token.EXCEPTIONS) {
lexer.nextToken();
accept(Token.INTO);
SQLName exceptionsInto = this.name();
constraint.setExceptionsInto(exceptionsInto);
continue;
}
if (lexer.token() == Token.DISABLE) {
lexer.nextToken();
constraint.setEnable(false);
continue;
}
if (lexer.token() == Token.ENABLE) {
lexer.nextToken();
constraint.setEnable(true);
continue;
}
break;
}
return constraint;
}
protected SQLForeignKeyConstraint createForeignKey() {
return new OracleForeignKey();
}
}
@@ -54,7 +54,6 @@ 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.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;
@@ -63,6 +62,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint;
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;
@@ -863,7 +863,12 @@ public class OracleStatementParser extends SQLStatementParser {
accept(Token.RPAREN);
} else if (lexer.token() == Token.CONSTRAINT) {
stmt.getItems().add(parseConstaint());
OracleConstraint constraint = ((OracleExprParser) this.exprParser).parseConstaint();
OracleAlterTableAddConstaint item = new OracleAlterTableAddConstaint();
constraint.setParent(item);
item.setParent(stmt);
item.setConstraint(constraint);
stmt.getItems().add(item);
} else if (lexer.token() == Token.IDENTIFIER) {
SQLAlterTableAddColumn item = parseAlterTableAddColumn();
stmt.getItems().add(item);
@@ -990,36 +995,6 @@ public class OracleStatementParser extends SQLStatementParser {
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
private OracleAlterTableAddConstaint parseConstaint() {
accept(Token.CONSTRAINT);
OracleAlterTableAddConstaint item = new OracleAlterTableAddConstaint();
SQLName name = this.exprParser.name();
OracleConstraint constraint;
if (lexer.token() == Token.PRIMARY) {
constraint = (OracleConstraint) exprParser.parsePrimaryKey();
} else if (lexer.token() == Token.UNIQUE) {
constraint = (OracleConstraint) exprParser.parseUnique();
} else {
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
if (lexer.token() == Token.EXCEPTIONS) {
lexer.nextToken();
accept(Token.INTO);
SQLName exceptionsInto = this.exprParser.name();
constraint.setExceptionsInto(exceptionsInto);
}
constraint.setName(name);
item.setConstraint(constraint);
return item;
}
public void parseAlterDrop(SQLAlterTableStatement stmt) {
lexer.nextToken();
if (lexer.token() == Token.CONSTRAINT) {
@@ -87,6 +87,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
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.OracleForeignKey;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
@@ -611,4 +612,8 @@ public interface OracleASTVisitor extends SQLASTVisitor {
boolean visit(OracleUnique x);
void endVisit(OracleUnique x);
boolean visit(OracleForeignKey x);
void endVisit(OracleForeignKey x);
}
@@ -95,6 +95,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
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.OracleForeignKey;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
@@ -1385,5 +1386,15 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
public void endVisit(OracleUnique x) {
}
@Override
public boolean visit(OracleForeignKey x) {
return true;
}
@Override
public void endVisit(OracleForeignKey x) {
}
}
@@ -31,6 +31,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
@@ -124,6 +125,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
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.OracleForeignKey;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
@@ -2336,15 +2338,26 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print("PRIMARY KEY (");
printAndAccept(x.getColumns(), ", ");
print(")");
if (x.getUsing() != null) {
println();
x.getUsing().accept(this);
}
if (x.getExceptionsInto() != null) {
println();
print("EXCEPTIONS INTO ");
x.getExceptionsInto().accept(this);
}
if (x.getEnable() != null) {
if(x.getEnable().booleanValue()) {
print(" ENABLE");
} else {
print(" DIABLE");
}
}
return false;
}
@@ -3223,6 +3236,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print(" DISABLE");
}
}
if (x.getStorage() != null) {
println();
x.getStorage().accept(this);
}
}
return false;
@@ -3347,4 +3365,25 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
public void endVisit(OracleUnique x) {
}
@Override
public boolean visit(OracleForeignKey x) {
visit((SQLForeignKeyImpl) x);
if (x.getUsing() != null) {
println();
x.getUsing().accept(this);
}
if (x.getExceptionsInto() != null) {
println();
print("EXCEPTIONS INTO ");
x.getExceptionsInto().accept(this);
}
return false;
}
@Override
public void endVisit(OracleForeignKey x) {
}
}
@@ -32,6 +32,7 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
@@ -118,6 +119,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
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.OracleForeignKey;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement;
@@ -1806,4 +1808,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
public void endVisit(OracleUnique x) {
}
@Override
public boolean visit(OracleForeignKey x) {
return visit((SQLForeignKeyImpl) x);
}
@Override
public void endVisit(OracleForeignKey x) {
}
}
@@ -19,6 +19,8 @@ import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLUnique;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser;
public class SQLCreateTableParser extends SQLDDLParser {
@@ -71,18 +73,18 @@ public class SQLCreateTableParser extends SQLDDLParser {
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 if (lexer.token == Token.UNIQUE) {
SQLUnique unique = exprParser.parseUnique();
createTable.getTableElementList().add(unique);
} else if (lexer.token == Token.PRIMARY //
|| lexer.token == Token.UNIQUE //
|| lexer.token == Token.CONSTRAINT) {
OracleConstraint constraint = ((OracleExprParser) this.exprParser).parseConstaint();
constraint.setParent(createTable);
createTable.getTableElementList().add(constraint);
} else if (lexer.token() == Token.TABLESPACE) {
throw new ParserException("TODO " + lexer.token());
} else {
throw new ParserException("TODO " + lexer.token());
}
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
@@ -65,6 +65,11 @@ import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
import com.alibaba.druid.sql.ast.statement.SQLColumnCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLColumnReference;
import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey;
import com.alibaba.druid.sql.ast.statement.SQLConstaint;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
@@ -620,6 +625,10 @@ public class SQLExprParser extends SQLParser {
}
public final void names(Collection<SQLName> exprCol) {
names(exprCol, null);
}
public final void names(Collection<SQLName> exprCol, SQLObject parent) {
if (lexer.token() == Token.RBRACE) {
return;
}
@@ -628,11 +637,16 @@ public class SQLExprParser extends SQLParser {
return;
}
exprCol.add(name());
SQLName name = name();
name.setParent(parent);
exprCol.add(name);
while (lexer.token() == Token.COMMA) {
lexer.nextToken();
exprCol.add(name());
name = name();
name.setParent(parent);
exprCol.add(name);
}
}
@@ -1293,13 +1307,48 @@ public class SQLExprParser extends SQLParser {
return parseColumnRest(column);
}
if (lexer.token == Token.UNION) {
if (lexer.token == Token.UNIQUE) {
lexer.nextToken();
accept(Token.KEY);
column.getConstaints().add(new SQLColumnPrimaryKey());
return parseColumnRest(column);
}
if (lexer.token == Token.CONSTRAINT) {
lexer.nextToken();
SQLName name = this.name();
if (lexer.token() == Token.PRIMARY) {
lexer.nextToken();
accept(Token.KEY);
SQLColumnPrimaryKey pk = new SQLColumnPrimaryKey();
pk.setName(name);
column.getConstaints().add(pk);
return parseColumnRest(column);
}
if (lexer.token() == Token.UNIQUE) {
lexer.nextToken();
SQLColumnUniqueKey uk = new SQLColumnUniqueKey();
uk.setName(name);
column.getConstaints().add(uk);
return parseColumnRest(column);
}
if (lexer.token() == Token.REFERENCES) {
lexer.nextToken();
SQLColumnReference ref = new SQLColumnReference();
ref.setName(name);
ref.setTable(this.name());
accept(Token.LPAREN);
this.names(ref.getColumns(), ref);
accept(Token.RPAREN);
column.getConstaints().add(ref);
return parseColumnRest(column);
}
}
if (lexer.token == Token.CHECK) {
lexer.nextToken();
SQLExpr expr = this.expr();
@@ -1365,4 +1414,52 @@ public class SQLExprParser extends SQLParser {
lexer.nextToken();
}
}
public SQLConstaint parseConstaint() {
SQLName name = null;
if (lexer.token() == Token.CONSTRAINT) {
lexer.nextToken();
name = this.name();
}
SQLConstaint constraint;
if (lexer.token() == Token.PRIMARY) {
constraint = parsePrimaryKey();
} else if (lexer.token() == Token.UNIQUE) {
constraint = parseUnique();
} else if (lexer.token() == Token.FOREIGN) {
constraint = parseForeignKey();
} else {
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
constraint.setName(name);
return constraint;
}
public SQLForeignKeyConstraint parseForeignKey() {
accept(Token.FOREIGN);
accept(Token.KEY);
SQLForeignKeyConstraint fk = createForeignKey();
accept(Token.LPAREN);
this.names(fk.getReferencingColumns());
accept(Token.RPAREN);
accept(Token.REFERENCES);
fk.setReferencedTableName(this.name());
accept(Token.LPAREN);
this.names(fk.getReferencedColumns());
accept(Token.RPAREN);
return fk;
}
protected SQLForeignKeyConstraint createForeignKey() {
return new SQLForeignKeyImpl();
}
}
@@ -88,6 +88,8 @@ import com.alibaba.druid.sql.ast.statement.SQLColumnCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLColumnReference;
import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey;
import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
@@ -98,12 +100,14 @@ import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprHint;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLUnique;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement;
import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
import com.alibaba.druid.sql.ast.statement.SQLSavePointStatement;
@@ -118,6 +122,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUnique;
import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
@@ -813,8 +818,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
}
for (SQLColumnConstraint item : x.getConstaints()) {
print(' ');
boolean newLine = item instanceof SQLForeignKeyConstraint || item instanceof SQLPrimaryKey || item instanceof SQLColumnReference;
if (newLine) {
incrementIndent();
println();
} else {
print(' ');
}
item.accept(this);
if (newLine) {
decrementIndent();
}
}
if (x.getEnable() != null) {
@@ -1348,10 +1364,24 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
@Override
public boolean visit(SQLColumnPrimaryKey x) {
if (x.getName() != null) {
print(" CONSTRAINT ");
x.getName().accept(this);
}
print(" PRIMARY KEY");
return false;
}
@Override
public boolean visit(SQLColumnUniqueKey x) {
if (x.getName() != null) {
print(" CONSTRAINT ");
x.getName().accept(this);
}
print(" UNIQUE");
return false;
}
@Override
public boolean visit(SQLColumnCheck x) {
print("CHECK ");
@@ -1534,7 +1564,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
print(")");
return false;
}
@Override
public boolean visit(SQLAlterTableRenameColumn x) {
print("RENAME COLUMN ");
@@ -1543,4 +1573,40 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
x.getTo().accept(this);
return false;
}
@Override
public boolean visit(SQLColumnReference x) {
if (x.getName() != null) {
print("CONSTRAINT ");
x.getName().accept(this);
print(" ");
}
print("REFERENCES ");
x.getTable().accept(this);
print(" (");
printAndAccept(x.getColumns(), ", ");
print(")");
return false;
}
@Override
public boolean visit(SQLForeignKeyImpl x) {
if (x.getName() != null) {
print("CONSTRAINT ");
x.getName().accept(this);
print(' ');
}
print("FOREIGN KEY (");
printAndAccept(x.getReferencedColumns(), ", ");
print(")");
print(" REFERENCES ");
x.getReferencedTableName().accept(this);
print(" (");
printAndAccept(x.getReferencedColumns(), ", ");
print(")");
return false;
}
}
@@ -71,6 +71,8 @@ import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLColumnReference;
import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey;
import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
@@ -82,6 +84,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprHint;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl;
@@ -393,6 +396,10 @@ public interface SQLASTVisitor {
void endVisit(SQLColumnPrimaryKey x);
boolean visit(SQLColumnPrimaryKey x);
boolean visit(SQLColumnUniqueKey x);
void endVisit(SQLColumnUniqueKey x);
void endVisit(SQLWithSubqueryClause x);
@@ -469,5 +476,12 @@ public interface SQLASTVisitor {
boolean visit(SQLAlterTableRenameColumn x);
void endVisit(SQLAlterTableRenameColumn x);
boolean visit(SQLColumnReference x);
void endVisit(SQLColumnReference x);
boolean visit(SQLForeignKeyImpl x);
void endVisit(SQLForeignKeyImpl x);
}
@@ -71,6 +71,8 @@ import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLColumnReference;
import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey;
import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
@@ -82,6 +84,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprHint;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
@@ -696,6 +699,16 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
public boolean visit(SQLColumnPrimaryKey x) {
return true;
}
@Override
public void endVisit(SQLColumnUniqueKey x) {
}
@Override
public boolean visit(SQLColumnUniqueKey x) {
return true;
}
@Override
public void endVisit(SQLWithSubqueryClause x) {
@@ -894,4 +907,24 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
public void endVisit(SQLAlterTableRenameColumn x) {
}
@Override
public boolean visit(SQLColumnReference x) {
return true;
}
@Override
public void endVisit(SQLColumnReference x) {
}
@Override
public boolean visit(SQLForeignKeyImpl x) {
return true;
}
@Override
public void endVisit(SQLForeignKeyImpl x) {
}
}
@@ -55,6 +55,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropIndexStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
@@ -1212,4 +1213,24 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
return false;
}
@Override
public boolean visit(SQLForeignKeyImpl x) {
for (SQLName column : x.getReferencedColumns()) {
column.accept(this);
}
String table = x.getReferencedTableName().getSimleName();
setCurrentTable(table);
TableStat stat = getTableStat(table);
stat.incrementReferencedCount();
for (SQLName column : x.getReferencedColumns()) {
String columnName = column.getSimleName();
addColumn(table, columnName);
}
return false;
}
}
@@ -34,6 +34,15 @@ public class TableStat {
int alterCount = 0;
int createIndexCount = 0;
int dropIndexCount = 0;
int referencedCount = 0;
public int getReferencedCount() {
return referencedCount;
}
public void incrementReferencedCount() {
referencedCount++;
}
public int getDropIndexCount() {
return dropIndexCount;