From 47be341133026402056b0947bc1fa6f2aeffdd12 Mon Sep 17 00:00:00 2001 From: Alpha Hinex Date: Fri, 6 May 2022 23:13:26 +0800 Subject: [PATCH 1/2] Clean code --- .../druid/pool/vendor/OceanBaseValidConnectionChecker.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/pool/vendor/OceanBaseValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/OceanBaseValidConnectionChecker.java index 8ff646b13d..e699482638 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/OceanBaseValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/OceanBaseValidConnectionChecker.java @@ -19,7 +19,6 @@ import com.alibaba.druid.DbType; import com.alibaba.druid.pool.ValidConnectionChecker; import com.alibaba.druid.pool.ValidConnectionCheckerAdapter; import com.alibaba.druid.util.JdbcUtils; -import sun.security.pkcs11.Secmod; import java.sql.Connection; import java.sql.SQLException; From ed91296beb6f9a8d8021b99efd5b96c4b373a98f Mon Sep 17 00:00:00 2001 From: Alpha Hinex Date: Fri, 6 May 2022 23:18:45 +0800 Subject: [PATCH 2/2] H2OutputVisitor could handle h2 create database and index statements --- .../dialect/h2/visitor/H2OutputVisitor.java | 61 ++++++++++++++++++- .../h2/visitor/H2OutputVisitorTest.java | 56 +++++++++++++++++ 2 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/sql/dialect/h2/visitor/H2OutputVisitorTest.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/h2/visitor/H2OutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/h2/visitor/H2OutputVisitor.java index 2dac1691d2..9bcb621d40 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/h2/visitor/H2OutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/h2/visitor/H2OutputVisitor.java @@ -16,13 +16,15 @@ package com.alibaba.druid.sql.dialect.h2.visitor; import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; -import com.alibaba.druid.sql.ast.statement.SQLReplaceStatement; +import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; import java.util.List; +import java.util.Map; public class H2OutputVisitor extends SQLASTOutputVisitor implements H2ASTVisitor { public H2OutputVisitor(Appendable appender) { @@ -81,4 +83,59 @@ public class H2OutputVisitor extends SQLASTOutputVisitor implements H2ASTVisitor return false; } + + @Override + public boolean visit(SQLCreateDatabaseStatement x) { + + /* + https://h2database.com/html/commands.html#create_schema + CREATE SCHEMA [ IF NOT EXISTS ] + { name [ AUTHORIZATION ownerName ] | [ AUTHORIZATION ownerName ] } + [ WITH tableEngineParamName [,...] ] + */ + + printUcase("CREATE SCHEMA "); + + if (x.isIfNotExists()) { + printUcase("IF NOT EXISTS "); + } + x.getName().accept(this); + + return false; + } + + @Override + public boolean visit(SQLCreateIndexStatement x) { + + /* h2 CREATE INDEX BNF: https://h2database.com/html/commands.html#create_index + CREATE [ UNIQUE | SPATIAL ] INDEX + [ [ IF NOT EXISTS ] [schemaName.]indexName ] + ON [schemaName.]tableName ( indexColumn [,...] ) + [ INCLUDE ( indexColumn [,...] ) ] + */ + + printUcase("CREATE "); + + String type = x.getType(); + if ( "UNIQUE".equalsIgnoreCase(type) || "SPATIAL".equalsIgnoreCase(type) ) { + printUcase(type + ' '); + } + + printUcase("INDEX "); + + if (x.isIfNotExists()) { + printUcase("IF NOT EXISTS "); + } + + x.getName().accept(this); + + printUcase(" ON "); + x.getTable().accept(this); + print0(" ("); + printAndAccept(x.getItems(), ", "); + print(')'); + + return false; + } + } diff --git a/src/test/java/com/alibaba/druid/sql/dialect/h2/visitor/H2OutputVisitorTest.java b/src/test/java/com/alibaba/druid/sql/dialect/h2/visitor/H2OutputVisitorTest.java new file mode 100644 index 0000000000..38c2c921cf --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/dialect/h2/visitor/H2OutputVisitorTest.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.sql.dialect.h2.visitor; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import org.junit.*; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; + +public class H2OutputVisitorTest { + + @BeforeClass + public static void loadDriver() { + org.h2.Driver.load(); + } + + @AfterClass + public static void unloadDriver() { + org.h2.Driver.unload(); + } + + private Connection connection; + + @Before + public void initConnection() throws SQLException { + connection = DriverManager.getConnection("jdbc:h2:mem:test;MODE=MySQL"); + } + + @After + public void closeConnection() throws SQLException { + connection.close(); + } + + private void executeUpdate(String sql) throws SQLException { + try (Statement sqlStat = connection.createStatement()) { + sqlStat.executeUpdate(sql); + } + } + + @Test + public void testConvertCreateIndex() throws SQLException { + String mysqlSql = "CREATE SCHEMA hinex;CREATE TABLE hinex.employees (jobTitle VARCHAR2(50));CREATE FULLTEXT INDEX hinex.jobTitle USING BTREE ON hinex.employees(jobTitle);"; + + List sqlStatements = SQLUtils.parseStatements(mysqlSql, DbType.mysql); + + String h2Sql = SQLUtils.toSQLString(sqlStatements, DbType.h2); + + System.out.println(h2Sql); + executeUpdate(h2Sql); + } + +}