diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnPrimaryKey.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnPrimaryKey.java new file mode 100644 index 0000000000..4814740746 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnPrimaryKey.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLColumnPrimaryKey extends SQLConstaintImpl implements SQLColumnConstraint { + + private static final long serialVersionUID = 1L; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueIndex.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueIndex.java new file mode 100644 index 0000000000..beaf3ed5cc --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueIndex.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLColumnUniqueIndex extends SQLConstaintImpl implements SQLColumnConstraint { + + private static final long serialVersionUID = 1L; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + } + 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 a97aa522e3..8b9495b952 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -62,6 +62,7 @@ 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.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; @@ -1232,6 +1233,20 @@ public class SQLExprParser extends SQLParser { column.setDefaultExpr(new SQLNullExpr()); return parseColumnRest(column); } + + if (lexer.token == Token.PRIMARY) { + lexer.nextToken(); + accept(Token.KEY); + column.getConstaints().add(new SQLColumnPrimaryKey()); + return parseColumnRest(column); + } + + if (lexer.token == Token.UNION) { + lexer.nextToken(); + accept(Token.KEY); + column.getConstaints().add(new SQLColumnPrimaryKey()); + 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 48619a6b58..2699ffa30f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -59,12 +59,17 @@ import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; 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.SQLColumnUniqueIndex; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLDropIndexStatement; @@ -75,9 +80,6 @@ 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; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; -import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; import com.alibaba.druid.sql.ast.statement.SQLSavePointStatement; @@ -1179,4 +1181,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { } return false; } + + @Override + public boolean visit(SQLColumnPrimaryKey x) { + print(" PRIMARY KEY"); + return false; + } + + @Override + public boolean visit(SQLColumnUniqueIndex x) { + print(" UNIQUE INDEX"); + return false; + } } 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 fb3881874b..ba59bc9386 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -60,6 +60,8 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueIndex; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; @@ -395,4 +397,12 @@ public interface SQLASTVisitor { void endVisit(SQLOver x); boolean visit(SQLOver x); + + void endVisit(SQLColumnPrimaryKey x); + + boolean visit(SQLColumnPrimaryKey x); + + void endVisit(SQLColumnUniqueIndex x); + + boolean visit(SQLColumnUniqueIndex 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 374e79de58..6f093e7bb7 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -60,6 +60,8 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueIndex; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; @@ -714,4 +716,23 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public boolean visit(SQLOver x) { return true; } + + @Override + public void endVisit(SQLColumnPrimaryKey x) { + + } + + @Override + public boolean visit(SQLColumnPrimaryKey x) { + return true; + } + + @Override + public void endVisit(SQLColumnUniqueIndex x) { + } + + @Override + public boolean visit(SQLColumnUniqueIndex x) { + return true; + } }