diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 1b8030f34f..709540a3aa 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -244,19 +244,7 @@ public class MySqlStatementParser extends SQLStatementParser { stmt.setName(this.exprParser.name()); - if (identifierEquals("USING")) { - lexer.nextToken(); - - if (identifierEquals("BTREE")) { - stmt.setType("BTREE"); - lexer.nextToken(); - } else if (identifierEquals("HASH")) { - stmt.setType("HASH"); - lexer.nextToken(); - } else { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } - } + parseCreateIndexUsing(stmt); accept(Token.ON); @@ -275,9 +263,27 @@ public class MySqlStatementParser extends SQLStatementParser { } accept(Token.RPAREN); + parseCreateIndexUsing(stmt); + return stmt; } + private void parseCreateIndexUsing(MySqlCreateIndexStatement stmt) { + if (identifierEquals("USING")) { + lexer.nextToken(); + + if (identifierEquals("BTREE")) { + stmt.setUsing("BTREE"); + lexer.nextToken(); + } else if (identifierEquals("HASH")) { + stmt.setUsing("HASH"); + lexer.nextToken(); + } else { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } + } + } + public SQLStatement parseCreateUser() throws ParserException { if (lexer.token() == Token.CREATE) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 9fd0ffea6f..0e78f5e718 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -2221,18 +2221,17 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print("INDEX "); - if (x.getUsing() != null) { - print("USING "); - print(x.getUsing()); - print(' '); - } - x.getName().accept(this); print(" ON "); x.getTable().accept(this); print(" ("); printAndAccept(x.getItems(), ", "); print(")"); + + if (x.getUsing() != null) { + print(" USING "); + print(x.getUsing()); + } return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DDLParserTest.java b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DDLParserTest.java index 58937f7100..1e00b9022a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DDLParserTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DDLParserTest.java @@ -108,33 +108,17 @@ public class DDLParserTest extends TestCase { String output = SQLUtils.toMySqlString(stmt); Assert.assertEquals("CREATE UNIQUE INDEX `idx1` ON tb1 (`fname` DESC)", output); } + + public void test_createIndex_2() throws Exception { + String sql = "CREATE INDEX id_index ON lookup (id) USING BTREE;"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("CREATE INDEX id_index ON lookup (id) USING BTREE", output); + } // public void testDDLStmt() throws Exception { - // String sql = "alTer ignore table tb_name"; - // SQLLexer lexer = new SQLLexer(sql); - // DDLParser parser = new DDLParser(lexer, new SQLExprParser(lexer)); - // DDLStatement dst = parser.ddlStmt(); - // - // sql = "alTeR table tb_name"; - // lexer = new SQLLexer(sql); - // parser = new DDLParser(lexer, new SQLExprParser(lexer)); - // dst = parser.ddlStmt(); - // - // sql = "crEate temporary tabLe if not exists tb_name"; - // lexer = new SQLLexer(sql); - // parser = new DDLParser(lexer, new SQLExprParser(lexer)); - // dst = parser.ddlStmt(); - // - // sql = "crEate tabLe if not exists tb_name"; - // lexer = new SQLLexer(sql); - // parser = new DDLParser(lexer, new SQLExprParser(lexer)); - // dst = parser.ddlStmt(); - // - // sql = "crEate temporary tabLe tb_name"; - // lexer = new SQLLexer(sql); - // parser = new DDLParser(lexer, new SQLExprParser(lexer)); - // dst = parser.ddlStmt(); - // // sql = "crEate unique index index_name on tb(col(id)) desc"; // lexer = new SQLLexer(sql); // parser = new DDLParser(lexer, new SQLExprParser(lexer));