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:
@@ -21,6 +21,7 @@ import com.alibaba.druid.sql.ast.SQLObjectImpl;
|
||||
public abstract class SQLConstaintImpl extends SQLObjectImpl implements SQLConstaint {
|
||||
|
||||
private SQLName name;
|
||||
private Boolean enable;
|
||||
|
||||
public SQLConstaintImpl(){
|
||||
|
||||
@@ -34,4 +35,12 @@ public abstract class SQLConstaintImpl extends SQLObjectImpl implements SQLConst
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Boolean getEnable() {
|
||||
return enable;
|
||||
}
|
||||
|
||||
public void setEnable(Boolean enable) {
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-5
@@ -140,11 +140,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser {
|
||||
fk.setParent(stmt);
|
||||
stmt.getTableElementList().add(fk);
|
||||
} else if (lexer.token() == Token.CHECK) {
|
||||
lexer.nextToken();
|
||||
SQLCheck check = new SQLCheck();
|
||||
accept(Token.LPAREN);
|
||||
check.setExpr(this.exprParser.expr());
|
||||
accept(Token.RPAREN);
|
||||
SQLCheck check = this.exprParser.parseCheck();
|
||||
stmt.getTableElementList().add(check);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* 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.SQLCheck;
|
||||
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 OracleCheck extends SQLCheck implements OracleConstraint, OracleSQLObject {
|
||||
|
||||
private OracleUsingIndexClause using;
|
||||
private SQLName exceptionsInto;
|
||||
private Initially initially;
|
||||
private Boolean deferrable;
|
||||
|
||||
@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.getExpr());
|
||||
|
||||
acceptChild(visitor, using);
|
||||
acceptChild(visitor, exceptionsInto);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public Boolean getDeferrable() {
|
||||
return deferrable;
|
||||
}
|
||||
|
||||
public void setDeferrable(Boolean deferrable) {
|
||||
this.deferrable = deferrable;
|
||||
}
|
||||
|
||||
public Initially getInitially() {
|
||||
return initially;
|
||||
}
|
||||
|
||||
public void setInitially(Initially initially) {
|
||||
this.initially = initially;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -26,7 +26,23 @@ public interface OracleConstraint extends OracleSQLObject, SQLConstaint, SQLTabl
|
||||
|
||||
void setExceptionsInto(SQLName exceptionsInto);
|
||||
|
||||
Boolean getDeferrable();
|
||||
|
||||
void setDeferrable(Boolean enable);
|
||||
|
||||
Boolean getEnable();
|
||||
|
||||
void setEnable(Boolean enable);
|
||||
|
||||
Initially getInitially();
|
||||
|
||||
void setInitially(Initially value);
|
||||
|
||||
OracleUsingIndexClause getUsing();
|
||||
|
||||
void setUsing(OracleUsingIndexClause using);
|
||||
|
||||
public static enum Initially {
|
||||
DEFERRED, IMMEDIATE
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,8 @@ public class OracleForeignKey extends SQLForeignKeyImpl implements OracleConstra
|
||||
|
||||
private OracleUsingIndexClause using;
|
||||
private SQLName exceptionsInto;
|
||||
private Boolean enable;
|
||||
private Initially initially;
|
||||
private Boolean deferrable;
|
||||
|
||||
@Override
|
||||
protected void accept0(SQLASTVisitor visitor) {
|
||||
@@ -43,13 +44,29 @@ public class OracleForeignKey extends SQLForeignKeyImpl implements OracleConstra
|
||||
acceptChild(visitor, this.getReferencedTableName());
|
||||
acceptChild(visitor, this.getReferencingColumns());
|
||||
acceptChild(visitor, this.getReferencedColumns());
|
||||
|
||||
|
||||
acceptChild(visitor, using);
|
||||
acceptChild(visitor, exceptionsInto);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public Boolean getDeferrable() {
|
||||
return deferrable;
|
||||
}
|
||||
|
||||
public void setDeferrable(Boolean deferrable) {
|
||||
this.deferrable = deferrable;
|
||||
}
|
||||
|
||||
public Initially getInitially() {
|
||||
return initially;
|
||||
}
|
||||
|
||||
public void setInitially(Initially initially) {
|
||||
this.initially = initially;
|
||||
}
|
||||
|
||||
public SQLName getExceptionsInto() {
|
||||
return exceptionsInto;
|
||||
}
|
||||
@@ -69,12 +86,4 @@ public class OracleForeignKey extends SQLForeignKeyImpl implements OracleConstra
|
||||
this.using = using;
|
||||
}
|
||||
|
||||
public Boolean getEnable() {
|
||||
return enable;
|
||||
}
|
||||
|
||||
public void setEnable(Boolean enable) {
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -33,6 +33,8 @@ public class OraclePrimaryKey extends OracleSQLObjectImpl implements OracleConst
|
||||
private OracleUsingIndexClause using;
|
||||
private SQLName exceptionsInto;
|
||||
private Boolean enable;
|
||||
private Initially initially;
|
||||
private Boolean deferrable;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
@@ -45,6 +47,14 @@ public class OraclePrimaryKey extends OracleSQLObjectImpl implements OracleConst
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public Boolean getDeferrable() {
|
||||
return deferrable;
|
||||
}
|
||||
|
||||
public void setDeferrable(Boolean deferrable) {
|
||||
this.deferrable = deferrable;
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
@@ -85,4 +95,12 @@ public class OraclePrimaryKey extends OracleSQLObjectImpl implements OracleConst
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
public Initially getInitially() {
|
||||
return initially;
|
||||
}
|
||||
|
||||
public void setInitially(Initially initially) {
|
||||
this.initially = initially;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,7 +25,8 @@ public class OracleUnique extends SQLUnique implements OracleConstraint, OracleS
|
||||
|
||||
private OracleUsingIndexClause using;
|
||||
private SQLName exceptionsInto;
|
||||
private Boolean enable;
|
||||
private Initially initially;
|
||||
private Boolean deferrable;
|
||||
|
||||
@Override
|
||||
protected void accept0(SQLASTVisitor visitor) {
|
||||
@@ -47,6 +48,14 @@ public class OracleUnique extends SQLUnique implements OracleConstraint, OracleS
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public Boolean getDeferrable() {
|
||||
return deferrable;
|
||||
}
|
||||
|
||||
public void setDeferrable(Boolean deferrable) {
|
||||
this.deferrable = deferrable;
|
||||
}
|
||||
|
||||
public SQLName getExceptionsInto() {
|
||||
return exceptionsInto;
|
||||
}
|
||||
@@ -66,12 +75,12 @@ public class OracleUnique extends SQLUnique implements OracleConstraint, OracleS
|
||||
this.using = using;
|
||||
}
|
||||
|
||||
public Boolean getEnable() {
|
||||
return enable;
|
||||
public Initially getInitially() {
|
||||
return initially;
|
||||
}
|
||||
|
||||
public void setEnable(Boolean enable) {
|
||||
this.enable = enable;
|
||||
public void setInitially(Initially initially) {
|
||||
this.initially = initially;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -36,9 +36,9 @@ import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr;
|
||||
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.SQLCheck;
|
||||
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;
|
||||
@@ -67,7 +67,9 @@ 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.OracleCheck;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint.Initially;
|
||||
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;
|
||||
@@ -1273,6 +1275,36 @@ public class OracleExprParser extends SQLExprParser {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.INITIALLY) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.IMMEDIATE) {
|
||||
lexer.nextToken();
|
||||
constraint.setInitially(Initially.IMMEDIATE);
|
||||
} else {
|
||||
accept(Token.DEFERRED);
|
||||
constraint.setInitially(Initially.DEFERRED);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.NOT) {
|
||||
lexer.nextToken();
|
||||
if (identifierEquals("DEFERRABLE")) {
|
||||
lexer.nextToken();
|
||||
constraint.setDeferrable(false);
|
||||
continue;
|
||||
}
|
||||
throw new ParserException("TODO " + lexer.token());
|
||||
}
|
||||
|
||||
if (identifierEquals("DEFERRABLE")) {
|
||||
lexer.nextToken();
|
||||
constraint.setDeferrable(true);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1282,4 +1314,8 @@ public class OracleExprParser extends SQLExprParser {
|
||||
protected SQLForeignKeyConstraint createForeignKey() {
|
||||
return new OracleForeignKey();
|
||||
}
|
||||
|
||||
protected SQLCheck createCheck() {
|
||||
return new OracleCheck();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,6 +108,7 @@ public class OracleLexer extends Lexer {
|
||||
map.put("NOCOMPRESS", Token.NOCOMPRESS);
|
||||
map.put("KEEP_DUPLICATES", Token.KEEP_DUPLICATES);
|
||||
map.put("EXCEPTIONS", Token.EXCEPTIONS);
|
||||
map.put("INITIALLY", Token.INITIALLY);
|
||||
|
||||
DEFAULT_ORACLE_KEYWORDS = new Keywords(map);
|
||||
}
|
||||
|
||||
@@ -71,6 +71,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatem
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
@@ -616,4 +617,8 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(OracleForeignKey x);
|
||||
|
||||
void endVisit(OracleForeignKey x);
|
||||
|
||||
boolean visit(OracleCheck x);
|
||||
|
||||
void endVisit(OracleCheck x);
|
||||
}
|
||||
|
||||
+11
@@ -79,6 +79,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatem
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
@@ -1396,5 +1397,15 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
public void endVisit(OracleForeignKey x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCheck x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCheck x) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+37
-20
@@ -29,6 +29,7 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
|
||||
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.SQLForeignKeyImpl;
|
||||
@@ -109,7 +110,9 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatem
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement;
|
||||
@@ -2339,6 +2342,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
printAndAccept(x.getColumns(), ", ");
|
||||
print(")");
|
||||
|
||||
printConstraintState(x);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void printConstraintState(OracleConstraint x) {
|
||||
if (x.getUsing() != null) {
|
||||
println();
|
||||
x.getUsing().accept(this);
|
||||
@@ -2357,8 +2366,19 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
print(" DIABLE");
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
if (x.getInitially() != null) {
|
||||
print(" INITIALLY ");
|
||||
print(x.getInitially().name());
|
||||
}
|
||||
|
||||
if (x.getDeferrable() != null) {
|
||||
if(x.getDeferrable().booleanValue()) {
|
||||
print(" DEFERRABLE");
|
||||
} else {
|
||||
print(" NOT DEFERRABLE");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -3349,15 +3369,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public boolean visit(OracleUnique x) {
|
||||
visit((SQLUnique) x);
|
||||
|
||||
if (x.getUsing() != null) {
|
||||
println();
|
||||
x.getUsing().accept(this);
|
||||
}
|
||||
if (x.getExceptionsInto() != null) {
|
||||
println();
|
||||
print("EXCEPTIONS INTO ");
|
||||
x.getExceptionsInto().accept(this);
|
||||
}
|
||||
printConstraintState(x);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3370,15 +3382,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
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);
|
||||
}
|
||||
printConstraintState(x);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3386,4 +3390,17 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(OracleForeignKey x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCheck x) {
|
||||
visit((SQLCheck) x);
|
||||
|
||||
printConstraintState(x);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCheck x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+12
@@ -27,6 +27,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCheck;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||
@@ -103,6 +104,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatem
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateDatabaseDbLinkStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
@@ -1818,4 +1820,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public void endVisit(OracleForeignKey x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCheck x) {
|
||||
return visit((SQLCheck) x);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCheck x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@ public class SQLCreateTableParser extends SQLDDLParser {
|
||||
createTable.getTableElementList().add(column);
|
||||
} else if (lexer.token == Token.PRIMARY //
|
||||
|| lexer.token == Token.UNIQUE //
|
||||
|| lexer.token == Token.CHECK //
|
||||
|| lexer.token == Token.CONSTRAINT) {
|
||||
OracleConstraint constraint = ((OracleExprParser) this.exprParser).parseConstaint();
|
||||
constraint.setParent(createTable);
|
||||
|
||||
@@ -62,6 +62,7 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.NotNullConstraint;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType;
|
||||
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;
|
||||
@@ -241,6 +242,7 @@ public class SQLExprParser extends SQLParser {
|
||||
case COMPUTE:
|
||||
case ENABLE:
|
||||
case DISABLE:
|
||||
case INITIALLY:
|
||||
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
|
||||
lexer.nextToken();
|
||||
break;
|
||||
@@ -1347,18 +1349,51 @@ public class SQLExprParser extends SQLParser {
|
||||
column.getConstaints().add(ref);
|
||||
return parseColumnRest(column);
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.NOT) {
|
||||
lexer.nextToken();
|
||||
accept(Token.NULL);
|
||||
NotNullConstraint notNull = new NotNullConstraint();
|
||||
notNull.setName(name);
|
||||
column.getConstaints().add(notNull);
|
||||
return parseColumnRest(column);
|
||||
}
|
||||
|
||||
if (lexer.token == Token.CHECK) {
|
||||
SQLColumnCheck check = parseColumnCheck();
|
||||
check.setName(name);
|
||||
check.setParent(column);
|
||||
column.getConstaints().add(check);
|
||||
return parseColumnRest(column);
|
||||
}
|
||||
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
|
||||
if (lexer.token == Token.CHECK) {
|
||||
lexer.nextToken();
|
||||
SQLExpr expr = this.expr();
|
||||
column.getConstaints().add(new SQLColumnCheck(expr));
|
||||
SQLColumnCheck check = parseColumnCheck();
|
||||
column.getConstaints().add(check);
|
||||
return parseColumnRest(column);
|
||||
}
|
||||
|
||||
return column;
|
||||
}
|
||||
|
||||
protected SQLColumnCheck parseColumnCheck() {
|
||||
lexer.nextToken();
|
||||
SQLExpr expr = this.expr();
|
||||
SQLColumnCheck check = new SQLColumnCheck(expr);
|
||||
|
||||
if (lexer.token() == Token.DISABLE) {
|
||||
lexer.nextToken();
|
||||
check.setEnable(false);
|
||||
} else if (lexer.token() == Token.ENABLE) {
|
||||
lexer.nextToken();
|
||||
check.setEnable(true);
|
||||
}
|
||||
return check;
|
||||
}
|
||||
|
||||
public SQLPrimaryKey parsePrimaryKey() {
|
||||
accept(Token.PRIMARY);
|
||||
accept(Token.KEY);
|
||||
@@ -1430,6 +1465,8 @@ public class SQLExprParser extends SQLParser {
|
||||
constraint = parseUnique();
|
||||
} else if (lexer.token() == Token.FOREIGN) {
|
||||
constraint = parseForeignKey();
|
||||
} else if (lexer.token() == Token.CHECK) {
|
||||
constraint = parseCheck();
|
||||
} else {
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
@@ -1438,6 +1475,19 @@ public class SQLExprParser extends SQLParser {
|
||||
|
||||
return constraint;
|
||||
}
|
||||
|
||||
public SQLCheck parseCheck() {
|
||||
accept(Token.CHECK);
|
||||
SQLCheck check = createCheck();
|
||||
accept(Token.LPAREN);
|
||||
check.setExpr(this.expr());
|
||||
accept(Token.RPAREN);
|
||||
return check;
|
||||
}
|
||||
|
||||
protected SQLCheck createCheck() {
|
||||
return new SQLCheck();
|
||||
}
|
||||
|
||||
public SQLForeignKeyConstraint parseForeignKey() {
|
||||
accept(Token.FOREIGN);
|
||||
|
||||
@@ -93,6 +93,11 @@ public class SQLParser {
|
||||
case NOCOMPRESS:
|
||||
case KEEP_DUPLICATES:
|
||||
case EXCEPTIONS:
|
||||
case INITIALLY:
|
||||
case END:
|
||||
case COMMENT:
|
||||
case ENABLE:
|
||||
case DISABLE:
|
||||
alias = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
return alias;
|
||||
|
||||
@@ -171,6 +171,7 @@ public enum Token {
|
||||
PCTFREE("PCTFREE"),
|
||||
INITRANS("INITRANS"),
|
||||
MAXTRANS("MAXTRANS"),
|
||||
INITIALLY("INITIALLY"),
|
||||
ENABLE("ENABLE"),
|
||||
DISABLE("DISABLE"),
|
||||
SEGMENT("SEGMENT"),
|
||||
|
||||
@@ -818,16 +818,20 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
|
||||
}
|
||||
|
||||
for (SQLColumnConstraint item : x.getConstaints()) {
|
||||
boolean newLine = item instanceof SQLForeignKeyConstraint || item instanceof SQLPrimaryKey || item instanceof SQLColumnReference;
|
||||
boolean newLine = item instanceof SQLForeignKeyConstraint //
|
||||
|| item instanceof SQLPrimaryKey //
|
||||
|| item instanceof SQLColumnCheck //
|
||||
|| item instanceof SQLColumnCheck //
|
||||
|| item.getName() != null;
|
||||
if (newLine) {
|
||||
incrementIndent();
|
||||
println();
|
||||
} else {
|
||||
print(' ');
|
||||
}
|
||||
|
||||
|
||||
item.accept(this);
|
||||
|
||||
|
||||
if (newLine) {
|
||||
decrementIndent();
|
||||
}
|
||||
@@ -986,6 +990,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
|
||||
}
|
||||
|
||||
public boolean visit(NotNullConstraint x) {
|
||||
if (x.getName() != null) {
|
||||
print("CONSTRAINT ");
|
||||
x.getName().accept(this);
|
||||
print(' ');
|
||||
}
|
||||
print("NOT NULL");
|
||||
return false;
|
||||
}
|
||||
@@ -1365,27 +1374,43 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
|
||||
@Override
|
||||
public boolean visit(SQLColumnPrimaryKey x) {
|
||||
if (x.getName() != null) {
|
||||
print(" CONSTRAINT ");
|
||||
print("CONSTRAINT ");
|
||||
x.getName().accept(this);
|
||||
print(' ');
|
||||
}
|
||||
print(" PRIMARY KEY");
|
||||
print("PRIMARY KEY");
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLColumnUniqueKey x) {
|
||||
if (x.getName() != null) {
|
||||
print(" CONSTRAINT ");
|
||||
print("CONSTRAINT ");
|
||||
x.getName().accept(this);
|
||||
print(' ');
|
||||
}
|
||||
print(" UNIQUE");
|
||||
print("UNIQUE");
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLColumnCheck x) {
|
||||
print("CHECK ");
|
||||
if (x.getName() != null) {
|
||||
print("CONSTRAINT ");
|
||||
x.getName().accept(this);
|
||||
print(' ');
|
||||
}
|
||||
print("CHECK (");
|
||||
x.getExpr().accept(this);
|
||||
print(')');
|
||||
|
||||
if (x.getEnable() != null) {
|
||||
if (x.getEnable().booleanValue()) {
|
||||
print(" ENABLE");
|
||||
} else {
|
||||
print(" DISABLE");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1440,7 +1465,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
|
||||
print(' ');
|
||||
}
|
||||
print("CHECK (");
|
||||
incrementIndent();
|
||||
x.getExpr().accept(this);
|
||||
decrementIndent();
|
||||
print(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLCommentHint;
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
import com.alibaba.druid.sql.ast.SQLOver;
|
||||
@@ -870,7 +871,10 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLUnique x) {
|
||||
return true;
|
||||
for (SQLExpr column : x.getColumns()) {
|
||||
column.accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user