From 7b7b6bcf370839b458e7b5f2263990ea62b5a434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Sun, 15 Nov 2020 10:55:44 +0800 Subject: [PATCH] improved mysql ddl support, fix #4039 --- .../dialect/mysql/parser/MySqlStatementParser.java | 10 ++++++++++ .../bvt/sql/mysql/visitor/MySqlResourceTest.java | 14 +++++++++++--- src/test/resources/bvt/parser/mysql-16.txt | 3 +++ 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/bvt/parser/mysql-16.txt 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 f5fbf86c68..31398febb2 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 @@ -8005,6 +8005,16 @@ public class MySqlStatementParser extends SQLStatementParser { SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement(dbType); + if (lexer.token() == Token.HINT) { + List hints = this.exprParser.parseHints(); + if (hints.size() == 1) { + String text = hints.get(0).getText(); + if (text.endsWith(" IF NOT EXISTS") && text.charAt(0) == '!') { + stmt.setIfNotExists(true); + } + } + } + if (lexer.token() == Token.IF) { lexer.nextToken(); accept(Token.NOT); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlResourceTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlResourceTest.java index f6ef98977a..7b5c794368 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlResourceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlResourceTest.java @@ -50,6 +50,10 @@ public class MySqlResourceTest extends TestCase { exec_test("bvt/parser/mysql-14.txt"); } + public void test_16() throws Exception { + exec_test("bvt/parser/mysql-16.txt"); + } + public void exec_test(String resource) throws Exception { // System.out.println(resource); InputStream is = null; @@ -64,12 +68,12 @@ public class MySqlResourceTest extends TestCase { MySqlStatementParser parser = new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + SQLStatement stmt = statementList.get(0); - Assert.assertEquals(1, statementList.size()); + assertEquals(1, statementList.size()); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + stmt.accept(visitor); // System.out.println(sql); // System.out.println("Tables : " + visitor.getTables()); @@ -77,6 +81,10 @@ public class MySqlResourceTest extends TestCase { // // System.out.println(); // System.out.println(); + + if (expect != null && !expect.isEmpty()) { + assertEquals(expect, stmt.toString()); + } } void mergValidate(String sql, String expect) { diff --git a/src/test/resources/bvt/parser/mysql-16.txt b/src/test/resources/bvt/parser/mysql-16.txt new file mode 100644 index 0000000000..1af9159c21 --- /dev/null +++ b/src/test/resources/bvt/parser/mysql-16.txt @@ -0,0 +1,3 @@ +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `druidtestdb` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */; +--------------------------- +CREATE DATABASE IF NOT EXISTS `druidtestdb`;