From cd8b7dce11adf6546d6fe2d3c45efbec92f96d12 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 23 Mar 2017 23:10:58 +0800 Subject: [PATCH] improved mysql parser add_index support. for issue #1645 --- .../druid/sql/parser/SQLStatementParser.java | 10 ++++++++++ .../druid/sql/visitor/SQLASTOutputVisitor.java | 15 +++++++++++++-- .../com/alibaba/druid/bvt/bug/Issue1654.java | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/bug/Issue1654.java diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 337b40b729..499464e636 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -2126,6 +2126,16 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); } else { item.setName(this.exprParser.name()); + + if (JdbcConstants.MYSQL.equals(dbType)) { + if (identifierEquals("USING")) { + lexer.nextToken(); + String indexType = lexer.stringVal; + item.setType(indexType); + accept(Token.IDENTIFIER); + } + } + accept(Token.LPAREN); } 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 0d51e537f5..9002e95fd5 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -2799,8 +2799,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLAlterTableAddIndex x) { print0(ucase ? "ADD " : "add "); - if (x.getType() != null) { - print0(x.getType()); + String type = x.getType(); + + boolean mysql = JdbcConstants.MYSQL.equals(dbType); + + if (type != null && !mysql) { + print0(type); print(' '); } @@ -2818,6 +2822,13 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet x.getName().accept(this); print(' '); } + + if (type != null && mysql) { + print0(ucase ? "USING " : "using "); + print0(type); + print(' '); + } + print('('); printAndAccept(x.getItems(), ", "); print(')'); diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Issue1654.java b/src/test/java/com/alibaba/druid/bvt/bug/Issue1654.java new file mode 100644 index 0000000000..b9fd20aac8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/Issue1654.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.bvt.bug; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +/** + * Created by wenshao on 23/03/2017. + */ +public class Issue1654 extends TestCase { + public void test_for_issue() throws Exception { + String sql = "ALTER TABLE db_manage.zcy_gpcatalog_node_t ADD INDEX index_code USING BTREE (code);"; + String formatedSql = SQLUtils.format(sql, JdbcConstants.MYSQL); + assertEquals("ALTER TABLE db_manage.zcy_gpcatalog_node_t\n" + + "\tADD INDEX index_code USING BTREE (code);", formatedSql); + } +}