diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java index 7279975dfa..9bbc8af9c9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java @@ -44,6 +44,8 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement private List hints = new ArrayList(); + private List optionHints = new ArrayList(); + private SQLExprTableSource like; public MySqlCreateTableStatement(){ @@ -156,4 +158,12 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement } } + + public List getOptionHints() { + return optionHints; + } + + public void setOptionHints(List optionHints) { + this.optionHints = optionHints; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index 0680ae6d1a..43f293e5c1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -559,7 +559,10 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { SQLSelect query = new MySqlSelectParser(this.exprParser).select(); stmt.setQuery(query); } - + + while (lexer.token() == (Token.HINT)) { + this.exprParser.parseHints(stmt.getOptionHints()); + } return stmt; } 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 0fc377d48e..4897da7bfb 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 @@ -497,6 +497,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV decrementIndent(); } + for (SQLCommentHint hint : x.getOptionHints()) { + print(' '); + hint.accept(this); + } return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest_hint.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest_hint.java index 96e067daf8..48eb654b1a 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest_hint.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest_hint.java @@ -95,4 +95,19 @@ public class MySqlWallTest_hint extends TestCase { Assert.assertTrue(WallUtils.isValidateMySql(sql)); // } + public void test_true_9() throws Exception { + WallConfig config = new WallConfig(); + config.setHintAllow(true); + config.setMultiStatementAllow(true); + String sql = "CREATE TABLE `session` ("// + + " `sess_id` varchar(128) NOT NULL,"// + + " `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',"// + + " `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',"// + + " `ip` varchar(40) NOT NULL,"// + + " `vars` mediumtext NOT NULL,"// + + " PRIMARY KEY(`sess_id`),"// + + " INDEX `changed_index` (`changed`)"// + + ") /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */ "; + Assert.assertTrue(WallUtils.isValidateMySql(sql, config)); // + } }