mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improve sql parser
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+25
-15
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+6
-3
@@ -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);
|
||||
} //
|
||||
} //
|
||||
|
||||
+337
-349
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");
|
||||
|
||||
+8
-19
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
+7
-32
@@ -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);
|
||||
}
|
||||
|
||||
+11
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+12
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user