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 d4d9d6033f..d588612b26 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 @@ -383,11 +383,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV if (x.getCharSetName() != null) { print(" CHARACTER SET "); print(x.getCharSetName()); - - if (x.getCollate() != null) { - print(" COLLATE "); - print(x.getCollate()); - } + } + if (x.getCollate() != null) { + print(" COLLATE "); + print(x.getCollate()); } return false; } 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 c9c5e43e08..602162851c 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1359,17 +1359,17 @@ public class SQLExprParser extends SQLParser { } charType.setCharSetName(lexer.stringVal()); lexer.nextToken(); + } + + if (lexer.token() == Token.IDENTIFIER) { + if (lexer.stringVal().equalsIgnoreCase("COLLATE")) { + lexer.nextToken(); - if (lexer.token() == Token.IDENTIFIER) { - if (lexer.stringVal().equalsIgnoreCase("COLLATE")) { - lexer.nextToken(); - - if (lexer.token() != Token.IDENTIFIER) { - throw new ParserException(); - } - charType.setCollate(lexer.stringVal()); - lexer.nextToken(); + if (lexer.token() != Token.IDENTIFIER) { + throw new ParserException(); } + charType.setCollate(lexer.stringVal()); + lexer.nextToken(); } } return charType; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest.java index b772a773f8..fbcb634cf5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest.java @@ -53,4 +53,37 @@ public class MySqlCreateTableTest extends MysqlTest { // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "last_name"))); } + + + public void test_1() throws Exception { + String sql = "CREATE TABLE `ins_ebay_auth` (" + + " `auth_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id'," + + " `usr_id` int(10) NOT NULL COMMENT '外键,用户表'," + + " `status` char(1) COLLATE utf8_bin NOT NULL COMMENT '状态 0.有效?1.无效'," + + " `ebay_token` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'eBay授权码'," + + " `ebay_name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT 'eBay唯一名'," + + " `create_time` datetime NOT NULL COMMENT '授权时间', " + + " `invalid_time` datetime NOT NULL COMMENT '授权失效时间'," + + " PRIMARY KEY (`auth_id`)" + + " ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='INS_EBAY_AUTH';"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(7, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + } }