From f5b968ba5984549ada6452c8283ac4fd3d422dea Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 17 Apr 2013 22:00:45 +0800 Subject: [PATCH] improve sql parser --- .../druid/sql/ast/statement/SQLCheck.java | 11 ++++ .../sql/ast/statement/SQLColumnCheck.java | 56 +++++++++++++++++++ .../druid/sql/parser/SQLExprParser.java | 8 +++ .../sql/visitor/SQLASTOutputVisitor.java | 8 +++ .../druid/sql/visitor/SQLASTVisitor.java | 5 ++ .../sql/visitor/SQLASTVisitorAdapter.java | 10 ++++ 6 files changed, 98 insertions(+) create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnCheck.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCheck.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCheck.java index 72af8193eb..6d16a5b991 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCheck.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCheck.java @@ -23,12 +23,23 @@ public class SQLCheck extends SQLConstaintImpl implements SQLTableElement { private static final long serialVersionUID = 1L; private SQLExpr expr; + + public SQLCheck() { + + } + + public SQLCheck(SQLExpr expr) { + this.setExpr(expr); + } public SQLExpr getExpr() { return expr; } public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } this.expr = expr; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnCheck.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnCheck.java new file mode 100644 index 0000000000..ab5ece0c4f --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnCheck.java @@ -0,0 +1,56 @@ +/* + * 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.ast.SQLExpr; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLColumnCheck extends SQLConstaintImpl implements SQLColumnConstraint { + + private static final long serialVersionUID = 1L; + + private SQLExpr expr; + + public SQLColumnCheck() { + + } + + public SQLColumnCheck(SQLExpr expr) { + this.setExpr(expr); + } + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + acceptChild(visitor, this.getExpr()); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 565e9ddd21..899e26102b 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -61,6 +61,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.SQLColumnCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; @@ -1255,6 +1256,13 @@ public class SQLExprParser extends SQLParser { column.getConstaints().add(new SQLColumnPrimaryKey()); return parseColumnRest(column); } + + if (lexer.token == Token.CHECK) { + lexer.nextToken(); + SQLExpr expr = this.expr(); + column.getConstaints().add(new SQLColumnCheck(expr)); + return parseColumnRest(column); + } return column; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 150b62f998..73299d2b6b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -83,6 +83,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; 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.SQLColumnConstraint; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; @@ -1333,6 +1334,13 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { print(" PRIMARY KEY"); return false; } + + @Override + public boolean visit(SQLColumnCheck x) { + print("CHECK "); + x.getExpr().accept(this); + return false; + } @Override public boolean visit(SQLColumnUniqueIndex x) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index 75410fbf83..2f42646f21 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -70,6 +70,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; 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; import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueIndex; @@ -469,4 +470,8 @@ public interface SQLASTVisitor { boolean visit(SQLAlterTableEnableConstraint x); void endVisit(SQLAlterTableEnableConstraint x); + + boolean visit(SQLColumnCheck x); + + void endVisit(SQLColumnCheck x); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 00322eb3ac..3777916535 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -70,6 +70,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; 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; import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueIndex; @@ -874,5 +875,14 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLAlterTableEnableConstraint x) { + } + @Override + public boolean visit(SQLColumnCheck x) { + return true; + } + + @Override + public void endVisit(SQLColumnCheck x) { + } }