improve sql parser

This commit is contained in:
wenshao
2013-08-03 20:52:07 +08:00
parent 29d3f93e6b
commit 32a43cc549
29 changed files with 811 additions and 57 deletions
@@ -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;
}
}
@@ -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);
}
@@ -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) {
}
}
@@ -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) {
}
}
@@ -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