From 1bb36ff31806a7c6e0e122327f85656d0af9140d Mon Sep 17 00:00:00 2001 From: Xiaoguang Sun Date: Mon, 29 Nov 2021 09:25:01 +0800 Subject: [PATCH 01/14] Add TiDB support Signed-off-by: Xiaoguang Sun --- src/main/java/com/alibaba/druid/DbType.java | 2 +- .../alibaba/druid/pool/DruidAbstractDataSource.java | 2 +- .../java/com/alibaba/druid/pool/DruidDataSource.java | 5 +---- .../com/alibaba/druid/pool/DruidPooledStatement.java | 2 +- src/main/java/com/alibaba/druid/sql/PagerUtils.java | 5 ++++- src/main/java/com/alibaba/druid/sql/SQLUtils.java | 6 ++++-- .../com/alibaba/druid/sql/ast/expr/SQLDateExpr.java | 4 +++- .../alibaba/druid/sql/ast/expr/SQLDateTimeExpr.java | 2 ++ .../com/alibaba/druid/sql/ast/expr/SQLTimeExpr.java | 2 ++ .../druid/sql/builder/impl/SQLDeleteBuilderImpl.java | 2 ++ .../druid/sql/builder/impl/SQLUpdateBuilderImpl.java | 1 + .../druid/sql/repository/SchemaRepository.java | 1 + .../druid/sql/transform/SQLRefactorVisitor.java | 1 + .../sql/visitor/ExportParameterVisitorUtils.java | 1 + .../druid/sql/visitor/SQLEvalVisitorUtils.java | 1 + .../alibaba/druid/sql/visitor/SchemaStatVisitor.java | 2 ++ .../java/com/alibaba/druid/util/JdbcConstants.java | 3 +++ src/main/java/com/alibaba/druid/util/JdbcUtils.java | 10 ++++++++-- src/main/java/com/alibaba/druid/wall/WallFilter.java | 1 + .../java/com/alibaba/druid/util/JdbcUtilsTest.java | 11 +++++++++++ 20 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/alibaba/druid/DbType.java b/src/main/java/com/alibaba/druid/DbType.java index 1b37dc5eb0..31f7c3a373 100644 --- a/src/main/java/com/alibaba/druid/DbType.java +++ b/src/main/java/com/alibaba/druid/DbType.java @@ -60,7 +60,7 @@ public enum DbType { oscar (1 << 40), - + tidb ( 1 << 41), ingres (0), cloudscape (0), diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index ce777a17a4..769c138f4a 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -1856,7 +1856,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } DbType dbType = DbType.of(this.dbTypeName); - if (dbType == DbType.mysql || dbType == DbType.ads) { + if (JdbcUtils.isMysqlDbType(dbType)) { if (variables != null) { ResultSet rs = null; try { diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 3396febb21..5ee986397a 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -843,10 +843,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } DbType dbType = DbType.of(this.dbTypeName); - if (dbType == DbType.mysql - || dbType == DbType.mariadb - || dbType == DbType.oceanbase - || dbType == DbType.ads) { + if (JdbcUtils.isMysqlDbType(dbType)) { boolean cacheServerConfigurationSet = false; if (this.connectProperties.containsKey("cacheServerConfiguration")) { cacheServerConfigurationSet = true; diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java index 58a55ebc44..4864cd546b 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java @@ -138,7 +138,7 @@ public class DruidPooledStatement extends PoolableWrapper implements Statement { return; } - if (DbType.mysql != DbType.of(dataSource.dbTypeName)) { + if (!JdbcUtils.isMysqlDbType(dataSource.dbTypeName)) { return; } diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 041ff6e82e..4547bc6d54 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -29,6 +29,7 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; +import com.alibaba.druid.util.JdbcUtils; import java.util.List; @@ -157,6 +158,7 @@ public class PagerUtils { switch (dbType) { case mysql: case mariadb: + case tidb: case h2: case ads: return limitMySqlQueryBlock(queryBlock, dbType, offset, count, check); @@ -534,6 +536,7 @@ public class PagerUtils { switch (dbType) { case mysql: case mariadb: + case tidb: case ads: return new MySqlSelectQueryBlock(); case oracle: @@ -638,7 +641,7 @@ public class PagerUtils { public static boolean hasUnorderedLimit(String sql, DbType dbType) { List stmtList = SQLUtils.parseStatements(sql, dbType); - if (DbType.mysql == dbType) { + if (JdbcUtils.isMysqlDbType(dbType)) { MySqlUnorderedLimitDetectVisitor visitor = new MySqlUnorderedLimitDetectVisitor(); diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index cf6939c624..8c06ad9de9 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -478,6 +478,7 @@ public class SQLUtils { } case mysql: case mariadb: + case tidb: return new MySqlOutputVisitor(out); case postgresql: return new PGOutputVisitor(out); @@ -532,6 +533,7 @@ public class SQLUtils { return new OracleSchemaStatVisitor(repository); case mysql: case mariadb: + case tidb: case elastic_search: return new MySqlSchemaStatVisitor(repository); case postgresql: @@ -639,7 +641,7 @@ public class SQLUtils { dbType = DbType.mysql; } String formatMethod = ""; - if (DbType.mysql == dbType) { + if (JdbcUtils.isMysqlDbType(dbType)) { formatMethod = "STR_TO_DATE"; if (StringUtils.isEmpty(pattern)) pattern = "%Y-%m-%d %H:%i:%s"; } else if (DbType.oracle == dbType) { @@ -1011,7 +1013,7 @@ public class SQLUtils { if (OracleUtils.isKeyword(normalizeName)) { return name; } - } else if (DbType.mysql == dbType) { + } else if (JdbcUtils.isMysqlDbType(dbType)) { if (MySqlUtils.isKeyword(normalizeName)) { return name; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java index 0d3981d16f..02a080b430 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java @@ -210,7 +210,9 @@ public class SQLDateExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValua , DbType.postgresql , DbType.ads , DbType.hive - , DbType.odps); + , DbType.odps + , DbType.mariadb + , DbType.tidb); public static boolean isSupport(DbType dbType) { return (dbType.mask & supportDbTypes) != 0; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateTimeExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateTimeExpr.java index de3ce41376..c3f77740e8 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateTimeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateTimeExpr.java @@ -149,6 +149,8 @@ public class SQLDateTimeExpr extends SQLExprImpl implements SQLLiteralExpr, SQLV , DbType.presto , DbType.trino , DbType.postgresql + , DbType.mariadb + , DbType.tidb ); public static boolean isSupport(DbType dbType) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimeExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimeExpr.java index 40e74eaf46..b1f87e66e9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimeExpr.java @@ -150,6 +150,8 @@ public class SQLTimeExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValua , DbType.presto , DbType.trino , DbType.postgresql + , DbType.mariadb + , DbType.tidb ); public static boolean isSupport(DbType dbType) { diff --git a/src/main/java/com/alibaba/druid/sql/builder/impl/SQLDeleteBuilderImpl.java b/src/main/java/com/alibaba/druid/sql/builder/impl/SQLDeleteBuilderImpl.java index 0049ca62cf..47fadef138 100644 --- a/src/main/java/com/alibaba/druid/sql/builder/impl/SQLDeleteBuilderImpl.java +++ b/src/main/java/com/alibaba/druid/sql/builder/impl/SQLDeleteBuilderImpl.java @@ -127,6 +127,8 @@ public class SQLDeleteBuilderImpl implements SQLDeleteBuilder { case oracle: return new OracleDeleteStatement(); case mysql: + case mariadb: + case tidb: return new MySqlDeleteStatement(); case postgresql: return new PGDeleteStatement(); diff --git a/src/main/java/com/alibaba/druid/sql/builder/impl/SQLUpdateBuilderImpl.java b/src/main/java/com/alibaba/druid/sql/builder/impl/SQLUpdateBuilderImpl.java index d24c9958a0..39489a82d7 100644 --- a/src/main/java/com/alibaba/druid/sql/builder/impl/SQLUpdateBuilderImpl.java +++ b/src/main/java/com/alibaba/druid/sql/builder/impl/SQLUpdateBuilderImpl.java @@ -161,6 +161,7 @@ public class SQLUpdateBuilderImpl extends SQLBuilderImpl implements SQLUpdateBui switch (dbType) { case mysql: case mariadb: + case tidb: return new MySqlUpdateStatement(); case oracle: return new OracleUpdateStatement(); diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java index f573cc8a44..47b40fb3df 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java @@ -413,6 +413,7 @@ public class SchemaRepository { switch (dbType) { case mysql: case mariadb: + case tidb: case sqlite: resolveVisitor = new SchemaResolveVisitorFactory.MySqlResolveVisitor(this, optionsValue); break; diff --git a/src/main/java/com/alibaba/druid/sql/transform/SQLRefactorVisitor.java b/src/main/java/com/alibaba/druid/sql/transform/SQLRefactorVisitor.java index 51f4445fc3..bc1c2b0fab 100644 --- a/src/main/java/com/alibaba/druid/sql/transform/SQLRefactorVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/transform/SQLRefactorVisitor.java @@ -29,6 +29,7 @@ public class SQLRefactorVisitor extends SQLASTVisitorAdapter { switch (dbType) { case mysql: case mariadb: + case tidb: case ads: quote = '`'; break; diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java index aaace9b621..4939697f70 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java @@ -43,6 +43,7 @@ public final class ExportParameterVisitorUtils { switch (dbType) { case mysql: case mariadb: + case tidb: return new MySqlExportParameterVisitor(out); case oracle: return new OracleExportParameterVisitor(out); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 9508b34a96..f7b6759cef 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -118,6 +118,7 @@ public class SQLEvalVisitorUtils { switch (dbType) { case mysql: case mariadb: + case tidb: case h2: return new MySqlEvalVisitorImpl(); case oracle: diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 4009930b79..0c5f93ebb1 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -602,6 +602,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { final SQLASTVisitor orderByVisitor; switch (dbType) { case mysql: + case mariadb: + case tidb: return new MySqlOrderByStatVisitor(x); case postgresql: return new PGOrderByStatVisitor(x); diff --git a/src/main/java/com/alibaba/druid/util/JdbcConstants.java b/src/main/java/com/alibaba/druid/util/JdbcConstants.java index b6fdd3d937..f65bb05ef6 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcConstants.java +++ b/src/main/java/com/alibaba/druid/util/JdbcConstants.java @@ -56,6 +56,9 @@ public interface JdbcConstants { String MARIADB = "mariadb"; String MARIADB_DRIVER = "org.mariadb.jdbc.Driver"; + DbType TIDB = DbType.tidb; + String TIDB_DRIVER = "io.tidb.bigdata.jdbc.TiDBDriver"; + DbType DERBY = DbType.derby; String HBASE = "hbase"; diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 50f4639f71..df77c74c31 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -418,6 +418,8 @@ public final class JdbcUtils implements JdbcConstants { return LOG4JDBC_DRIVER; } else if (rawUrl.startsWith("jdbc:mariadb:")) { return MARIADB_DRIVER; + } else if (rawUrl.startsWith("jdbc:tidb:")) { + return TIDB_DRIVER; } else if (rawUrl.startsWith("jdbc:oracle:") // || rawUrl.startsWith("JDBC:oracle:")) { return ORACLE_DRIVER; @@ -544,6 +546,8 @@ public final class JdbcUtils implements JdbcConstants { return DbType.mysql; } else if (rawUrl.startsWith("jdbc:mariadb:")) { return DbType.mariadb; + } else if (rawUrl.startsWith("jdbc:tidb:")) { + return DbType.tidb; } else if (rawUrl.startsWith("jdbc:oracle:") || rawUrl.startsWith("jdbc:log4jdbc:oracle:")) { return DbType.oracle; } else if (rawUrl.startsWith("jdbc:alibaba:oracle:")) { @@ -886,7 +890,7 @@ public final class JdbcUtils implements JdbcConstants { } public static List showTables(Connection conn, DbType dbType) throws SQLException { - if (DbType.mysql == dbType || DbType.oceanbase == dbType) { + if (isMysqlDbType(dbType)) { return MySqlUtils.showTables(conn); } @@ -905,7 +909,7 @@ public final class JdbcUtils implements JdbcConstants { } public static String getCreateTableScript(Connection conn, DbType dbType, boolean sorted, boolean simplify) throws SQLException { - if (DbType.mysql == dbType || DbType.oceanbase == dbType) { + if (isMysqlDbType(dbType)) { return MySqlUtils.getCreateTableScript(conn, sorted, simplify); } @@ -947,8 +951,10 @@ public final class JdbcUtils implements JdbcConstants { switch (dbType) { case mysql: case oceanbase: + case ads: case drds: case mariadb: + case tidb: case h2: return true; default: diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index e7ca867f91..62c58b71e9 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -134,6 +134,7 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { case oceanbase: case drds: case mariadb: + case tidb: case h2: case presto: case trino: diff --git a/src/test/java/com/alibaba/druid/util/JdbcUtilsTest.java b/src/test/java/com/alibaba/druid/util/JdbcUtilsTest.java index 9748fa4313..078a3c3042 100644 --- a/src/test/java/com/alibaba/druid/util/JdbcUtilsTest.java +++ b/src/test/java/com/alibaba/druid/util/JdbcUtilsTest.java @@ -40,4 +40,15 @@ public class JdbcUtilsTest extends TestCase { assertEquals("not support log4jdbc mysql, url like jdbc:log4jdbc:mysql:...", DbType.mysql, dbType); } + public void testGetDbTypeTiDB() { + String jdbcUrl = "jdbc:tidb://localhost:4000/test"; + String dbType = JdbcUtils.getDbType(jdbcUrl, null); + assertEquals("Does not support TiDB, for url like jdbc:tidb:...", DbType.tidb, dbType); + } + + public void testTiDBIsMySQLDBType() { + assertTrue("TiDB suppose to be a MySQL compatible DB", JdbcUtils.isMysqlDbType(DbType.tidb)); + assertTrue("TiDB suppose to be a MySQL compatible DB", JdbcUtils.isMysqlDbType("tidb")); + assertTrue("TiDB suppose to be a MySQL compatible DB", JdbcUtils.isMySqlDriver(JdbcUtils.TIDB_DRIVER)); + } } From 43f74fa7471f7eaa9d210d24879e8fd65f1fb139 Mon Sep 17 00:00:00 2001 From: chi-chi weng Date: Sat, 11 Dec 2021 22:38:01 +0800 Subject: [PATCH 02/14] Fix log4j CVE-2021-44228 Fix Apache log4j Vulnerability CVE-2021-4428 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 67b8b11f7c..cf44a89006 100644 --- a/pom.xml +++ b/pom.xml @@ -428,7 +428,7 @@ org.apache.logging.log4j log4j-core - 2.13.2 + 2.15.0 provided From 5cfdb0deb5582d510783a4396572ce8d0eb0c96b Mon Sep 17 00:00:00 2001 From: chi-chi weng Date: Mon, 20 Dec 2021 09:50:51 +0800 Subject: [PATCH 03/14] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf44a89006..b5203f16f3 100644 --- a/pom.xml +++ b/pom.xml @@ -428,7 +428,7 @@ org.apache.logging.log4j log4j-core - 2.15.0 + 2.16.0 provided From fde82b31afa570ef53441547fd980a068698b972 Mon Sep 17 00:00:00 2001 From: chi-chi weng Date: Mon, 20 Dec 2021 19:15:59 +0800 Subject: [PATCH 04/14] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b5203f16f3..b7781e1dd1 100644 --- a/pom.xml +++ b/pom.xml @@ -428,7 +428,7 @@ org.apache.logging.log4j log4j-core - 2.16.0 + 2.17.0 provided From 762b7146d2f96652f19b783bd63e5213c24cdee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=BB=BA=E6=88=90?= Date: Tue, 8 Feb 2022 18:29:28 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E6=B7=BB=E5=8A=A0usePingMethod=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alibaba/druid/pool/DruidAbstractDataSource.java | 10 ++++++++++ .../java/com/alibaba/druid/pool/DruidDataSource.java | 2 +- .../druid/pool/vendor/MySqlValidConnectionChecker.java | 6 +++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 769c138f4a..3dc600d128 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -170,6 +170,8 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected volatile long timeBetweenConnectErrorMillis = DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS; protected volatile ValidConnectionChecker validConnectionChecker = null; + + protected volatile boolean usePingMethod = false; protected final Map activeConnections = new IdentityHashMap(); protected final static Object PRESENT = new Object(); @@ -641,6 +643,14 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements this.validConnectionChecker = validConnectionChecker; } + public boolean isUsePingMethod() { + return usePingMethod; + } + + public void setUsePingMethod(boolean usePingMethod) { + this.usePingMethod = usePingMethod; + } + public String getValidConnectionCheckerClassName() { if (validConnectionChecker == null) { return null; diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 5ee986397a..302cfafd1d 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1318,7 +1318,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat String realDriverClassName = driver.getClass().getName(); if (JdbcUtils.isMySqlDriver(realDriverClassName)) { - this.validConnectionChecker = new MySqlValidConnectionChecker(); + this.validConnectionChecker = new MySqlValidConnectionChecker(usePingMethod); } else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER) || realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER2)) { diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java index 5faa3d9f36..c403c50a4f 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlValidConnectionChecker.java @@ -45,7 +45,7 @@ public class MySqlValidConnectionChecker extends ValidConnectionCheckerAdapter i private Method ping; private boolean usePingMethod = false; - public MySqlValidConnectionChecker(){ + public MySqlValidConnectionChecker(boolean usePingMethod){ try { clazz = Utils.loadClass("com.mysql.jdbc.MySQLConnection"); if (clazz == null) { @@ -56,8 +56,8 @@ public class MySqlValidConnectionChecker extends ValidConnectionCheckerAdapter i ping = clazz.getMethod("pingInternal", boolean.class, int.class); } - if (ping != null) { - usePingMethod = true; + if (ping != null && usePingMethod == true) { + this.usePingMethod = true; } } catch (Exception e) { LOG.warn("Cannot resolve com.mysql.jdbc.Connection.ping method. Will use 'SELECT 1' instead.", e); From 772c7921354e5838c1c2a134a6b0c087b79292d3 Mon Sep 17 00:00:00 2001 From: KANLON Date: Tue, 8 Feb 2022 19:09:12 +0800 Subject: [PATCH 06/14] =?UTF-8?q?fixs:=20=E7=BB=99PagerUtils=20=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=B7=A5=E5=85=B7=E7=B1=BB,=E8=A1=A5=E5=85=85clickhou?= =?UTF-8?q?se=E6=95=B0=E6=8D=AE=E5=BA=93=E5=88=86=E9=A1=B5=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E4=BB=A5=E5=85=8D=E8=B0=83=E7=94=A8PagerUtil?= =?UTF-8?q?s=E8=BF=9B=E8=A1=8Cclickhouse=E6=95=B0=E6=8D=AE=E5=BA=93SQL?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E7=9A=84=E6=97=B6=E5=80=99=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/alibaba/druid/sql/PagerUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 4547bc6d54..cd1608a352 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -161,6 +161,7 @@ public class PagerUtils { case tidb: case h2: case ads: + case clickhouse: return limitMySqlQueryBlock(queryBlock, dbType, offset, count, check); case postgresql: case hive: From 26f0078961a53e7d46443aefe223b9a77e2e4437 Mon Sep 17 00:00:00 2001 From: KANLON Date: Tue, 8 Feb 2022 19:50:45 +0800 Subject: [PATCH 07/14] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E5=A4=9Avi?= =?UTF-8?q?sit=E9=87=8D=E5=86=99=E6=96=B9=E6=B3=95=E7=9A=84=E6=A0=87?= =?UTF-8?q?=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/alibaba/druid/sql/PagerUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 4547bc6d54..214d9ae2f7 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -698,6 +698,7 @@ public class PagerUtils { private static class OracleUnorderedLimitDetectVisitor extends OracleASTVisitorAdapter { public int unorderedLimitCount; + @Override public boolean visit(SQLBinaryOpExpr x) { SQLExpr left = x.getLeft(); SQLExpr right = x.getRight(); From b29a9bcacb57e1e8eb0c80b1ba1b4edd300df14a Mon Sep 17 00:00:00 2001 From: KANLON Date: Tue, 8 Feb 2022 20:27:51 +0800 Subject: [PATCH 08/14] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=A4=9A?= =?UTF-8?q?=E6=94=AF=E6=8C=81presto=E5=88=86=E9=A1=B5=E7=9A=84=E8=AF=AD?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/alibaba/druid/sql/SQLUtils.java | 3 + .../ast/stmt/PrestoSelectStatement.java | 56 +++++ .../presto/parser/PrestoExprParser.java | 10 +- .../presto/parser/PrestoSelectParser.java | 202 ++++++++++++++++++ .../presto/parser/PrestoStatementParser.java | 15 +- .../presto/visitor/PrestoOutputVisitor.java | 47 ++++ .../ParameterizedOutputVisitorUtils.java | 5 +- 7 files changed, 329 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/presto/ast/stmt/PrestoSelectStatement.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoSelectParser.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/presto/visitor/PrestoOutputVisitor.java diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 8c06ad9de9..32a47af2c1 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -43,6 +43,7 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleToMySqlOutputVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.sql.dialect.presto.visitor.PrestoOutputVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; import com.alibaba.druid.sql.parser.*; @@ -499,6 +500,8 @@ public class SQLUtils { return new BlinkOutputVisitor(out); case antspark: return new AntsparkOutputVisitor(out); + case presto: + return new PrestoOutputVisitor(out); case clickhouse: return new ClickhouseOutputVisitor(out); default: diff --git a/src/main/java/com/alibaba/druid/sql/dialect/presto/ast/stmt/PrestoSelectStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/presto/ast/stmt/PrestoSelectStatement.java new file mode 100644 index 0000000000..b1d69c675f --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/presto/ast/stmt/PrestoSelectStatement.java @@ -0,0 +1,56 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.dialect.presto.ast.stmt; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.presto.visitor.PrestoVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +/** + * presto 的 select语句 + * + * @author zhangcanlong + * @date 2022/01/11 + */ +public class PrestoSelectStatement extends SQLSelectStatement implements SQLStatement { + + public PrestoSelectStatement() { + super(DbType.postgresql); + } + + public PrestoSelectStatement(SQLSelect select) { + super(select, DbType.postgresql); + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof PrestoVisitor) { + this.accept0((PrestoVisitor) visitor); + } else { + super.accept0(visitor); + } + } + + public void accept0(PrestoVisitor visitor) { + if (visitor.visit(this)) { + this.acceptChild(visitor, this.select); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoExprParser.java index e9341e44f1..47a6e0d688 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoExprParser.java @@ -16,13 +16,9 @@ package com.alibaba.druid.sql.dialect.presto.parser; import com.alibaba.druid.DbType; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntervalExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntervalUnit; -import com.alibaba.druid.sql.dialect.phoenix.parser.PhoenixLexer; -import com.alibaba.druid.sql.parser.*; +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.SQLExprParser; +import com.alibaba.druid.sql.parser.SQLParserFeature; /** * Created by wenshao on 16/9/13. diff --git a/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoSelectParser.java new file mode 100644 index 0000000000..c4ad027e67 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoSelectParser.java @@ -0,0 +1,202 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.dialect.presto.parser; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLLimit; +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.SQLSetQuantifier; +import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.parser.SQLExprParser; +import com.alibaba.druid.sql.parser.SQLSelectListCache; +import com.alibaba.druid.sql.parser.SQLSelectParser; +import com.alibaba.druid.sql.parser.Token; +import com.alibaba.druid.util.FnvHash; + +/** + * presto的 选择解析器 + * + * @author zhangcanlong + * @date 2022/01/11 + */ +public class PrestoSelectParser extends SQLSelectParser { + + public PrestoSelectParser(SQLExprParser exprParser) { + super(exprParser); + } + + public PrestoSelectParser(SQLExprParser exprParser, SQLSelectListCache selectListCache) { + super(exprParser, selectListCache); + } + + public PrestoSelectParser(String sql) { + this(new PrestoExprParser(sql)); + } + + protected SQLExprParser createExprParser() { + return new PrestoExprParser(this.lexer); + } + + @Override + public SQLSelectQuery query(SQLObject parent, boolean acceptUnion) { + if (this.lexer.token() == Token.LPAREN) { + this.lexer.nextToken(); + + SQLSelectQuery select = this.query(); + this.accept(Token.RPAREN); + + return this.queryRest(select, acceptUnion); + } + + if (this.lexer.token() == Token.VALUES) { + return this.valuesQuery(acceptUnion); + } + + SQLSelectQueryBlock queryBlock = new SQLSelectQueryBlock(this.dbType); + + if (this.lexer.hasComment() && this.lexer.isKeepComments()) { + queryBlock.addBeforeComment(this.lexer.readAndResetComments()); + } + + this.accept(Token.SELECT); + + if (this.lexer.token() == Token.HINT) { + this.exprParser.parseHints(queryBlock.getHints()); + } + + if (this.lexer.token() == Token.COMMENT) { + this.lexer.nextToken(); + } + + if (DbType.informix == this.dbType) { + if (this.lexer.identifierEquals(FnvHash.Constants.SKIP)) { + this.lexer.nextToken(); + SQLExpr offset = this.exprParser.primary(); + queryBlock.setOffset(offset); + } + + if (this.lexer.identifierEquals(FnvHash.Constants.FIRST)) { + this.lexer.nextToken(); + SQLExpr first = this.exprParser.primary(); + queryBlock.setFirst(first); + } + } + + if (this.lexer.token() == Token.DISTINCT) { + queryBlock.setDistionOption(SQLSetQuantifier.DISTINCT); + this.lexer.nextToken(); + } else if (this.lexer.token() == Token.UNIQUE) { + queryBlock.setDistionOption(SQLSetQuantifier.UNIQUE); + this.lexer.nextToken(); + } else if (this.lexer.token() == Token.ALL) { + queryBlock.setDistionOption(SQLSetQuantifier.ALL); + this.lexer.nextToken(); + } + + this.parseSelectList(queryBlock); + + if (this.lexer.token() == Token.INTO) { + this.lexer.nextToken(); + + SQLExpr expr = this.expr(); + if (this.lexer.token() != Token.COMMA) { + queryBlock.setInto(expr); + } + } + + this.parseFrom(queryBlock); + + this.parseWhere(queryBlock); + + this.parseGroupBy(queryBlock); + + if (this.lexer.identifierEquals(FnvHash.Constants.WINDOW)) { + this.parseWindow(queryBlock); + } + + this.parseSortBy(queryBlock); + + this.parseFetchClause(queryBlock); + + if (this.lexer.token() == Token.FOR) { + this.lexer.nextToken(); + this.accept(Token.UPDATE); + + queryBlock.setForUpdate(true); + + if (this.lexer.identifierEquals(FnvHash.Constants.NO_WAIT) || this.lexer.identifierEquals(FnvHash.Constants.NOWAIT)) { + this.lexer.nextToken(); + queryBlock.setNoWait(true); + } else if (this.lexer.identifierEquals(FnvHash.Constants.WAIT)) { + this.lexer.nextToken(); + SQLExpr waitTime = this.exprParser.primary(); + queryBlock.setWaitTime(waitTime); + } + } + + return this.queryRest(queryBlock, acceptUnion); + } + + + @Override + public void parseFetchClause(SQLSelectQueryBlock queryBlock) { + + // 如果是presto,则先解析 offset 再解析limit + if (this.lexer.identifierEquals(FnvHash.Constants.OFFSET) || this.lexer.token() == Token.OFFSET) { + this.lexer.nextToken(); + SQLExpr offset = this.exprParser.expr(); + queryBlock.setOffset(offset); + if (this.lexer.identifierEquals(FnvHash.Constants.ROW) || this.lexer.identifierEquals(FnvHash.Constants.ROWS)) { + this.lexer.nextToken(); + } + } + + if (this.lexer.token() == Token.LIMIT) { + SQLLimit limit = queryBlock.getLimit(); + // 原始的limit + SQLLimit originLimit = this.exprParser.parseLimit(); + if (limit == null) { + limit = originLimit; + } + limit.setRowCount(originLimit.getRowCount()); + queryBlock.setLimit(limit); + return; + } + + + if (this.lexer.token() == Token.FETCH) { + this.lexer.nextToken(); + if (this.lexer.token() == Token.FIRST || this.lexer.token() == Token.NEXT || this.lexer.identifierEquals(FnvHash.Constants.NEXT)) { + this.lexer.nextToken(); + } else { + this.acceptIdentifier("FIRST"); + } + SQLExpr first = this.exprParser.primary(); + queryBlock.setFirst(first); + if (this.lexer.identifierEquals(FnvHash.Constants.ROW) || this.lexer.identifierEquals(FnvHash.Constants.ROWS)) { + this.lexer.nextToken(); + } + + if (this.lexer.token() == Token.ONLY) { + this.lexer.nextToken(); + } else { + this.acceptIdentifier("ONLY"); + } + } + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoStatementParser.java index d9a925d7f1..3bebcd9802 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/presto/parser/PrestoStatementParser.java @@ -18,7 +18,8 @@ package com.alibaba.druid.sql.dialect.presto.parser; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.SQLInsertInto; -import com.alibaba.druid.sql.dialect.phoenix.parser.PhoenixExprParser; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectStatement; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.sql.parser.Token; @@ -35,6 +36,18 @@ public class PrestoStatementParser extends SQLStatementParser { super(new PrestoExprParser(lexer)); } + @Override + public PrestoSelectParser createSQLSelectParser() { + return new PrestoSelectParser(this.exprParser, selectListCache); + } + + @Override + public PGSelectStatement parseSelect() { + PrestoSelectParser selectParser = createSQLSelectParser(); + SQLSelect select = selectParser.select(); + return new PGSelectStatement(select); + } + @Override protected void parseInsertColumns(SQLInsertInto insert) { if (lexer.token() == Token.RPAREN ) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/presto/visitor/PrestoOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/presto/visitor/PrestoOutputVisitor.java new file mode 100644 index 0000000000..aed08e1c35 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/presto/visitor/PrestoOutputVisitor.java @@ -0,0 +1,47 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.dialect.presto.visitor; + +import com.alibaba.druid.sql.ast.SQLLimit; +import com.alibaba.druid.sql.dialect.phoenix.visitor.PhoenixASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; + +/** + * presto 的输出的视图信息 + * + * @author zhangcanlong + * @since 2022-01-07 + */ +public class PrestoOutputVisitor extends SQLASTOutputVisitor implements PhoenixASTVisitor { + public PrestoOutputVisitor(Appendable appender) { + super(appender); + } + + public PrestoOutputVisitor(Appendable appender, boolean parameterized) { + super(appender, parameterized); + } + + @Override + public boolean visit(SQLLimit x) { + if (x.getOffset() != null) { + this.print0(this.ucase ? " OFFSET " : " offset "); + x.getOffset().accept(this); + } + this.print0(this.ucase ? " LIMIT " : " limit "); + x.getRowCount().accept(this); + return false; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java index 22fba795b9..bbc6094750 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -34,6 +34,7 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTParameterizedVisito import com.alibaba.druid.sql.dialect.oracle.visitor.OracleParameterizedOutputVisitor; import com.alibaba.druid.sql.dialect.phoenix.visitor.PhoenixOutputVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor; +import com.alibaba.druid.sql.dialect.presto.visitor.PrestoOutputVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor; import com.alibaba.druid.sql.parser.SQLParserFeature; import com.alibaba.druid.sql.parser.SQLParserUtils; @@ -78,7 +79,7 @@ public class ParameterizedOutputVisitorUtils { return parameterize(sql, dbType, null, null); } - public static String parameterize(String sql, DbType dbType, VisitorFeature ...features) { + public static String parameterize(String sql, DbType dbType, VisitorFeature...features) { return parameterize(sql, dbType, null, features); } @@ -408,6 +409,8 @@ public class ParameterizedOutputVisitorUtils { return new DB2OutputVisitor(out, true); case phoenix: return new PhoenixOutputVisitor(out, true); + case presto: + return new PrestoOutputVisitor(out, true); default: return new SQLASTOutputVisitor(out, true); } From 39635fae4fcec6b9729181bf35e0c45f14a63966 Mon Sep 17 00:00:00 2001 From: KANLON Date: Tue, 8 Feb 2022 20:29:47 +0800 Subject: [PATCH 09/14] =?UTF-8?q?feat:=20PagerUtils=20=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=20=E5=A2=9E=E5=8A=A0=E5=A4=9A=E6=94=AF=E6=8C=81presto?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E7=9A=84=E8=AF=AD=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/alibaba/druid/sql/PagerUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 4547bc6d54..4eaedd21f5 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -165,6 +165,7 @@ public class PagerUtils { case postgresql: case hive: case odps: + case presto: return limitSQLQueryBlock(queryBlock, dbType, offset, count, check); case oracle: case oceanbase_oracle: From b37053642ee53737902a5b7aec7b3f52b20fd967 Mon Sep 17 00:00:00 2001 From: KANLON Date: Tue, 8 Feb 2022 20:39:24 +0800 Subject: [PATCH 10/14] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E5=A4=9A?= =?UTF-8?q?=E6=94=AF=E6=8C=81presto=E5=88=86=E9=A1=B5=E8=AF=AD=E6=B3=95?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/PagerUtilsTest_Limit_presto_0.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_presto_0.java diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_presto_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_presto_0.java new file mode 100644 index 0000000000..c739cb4039 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_presto_0.java @@ -0,0 +1,23 @@ +package com.alibaba.druid.bvt.sql; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.PagerUtils; +import junit.framework.TestCase; +import org.junit.Assert; + +/** + * 分页工具类的单元测试,presto SQL类型的 + * + * @author zhangcanlong + * @date 2022/02/08 + */ +public class PagerUtilsTest_Limit_presto_0 extends TestCase { + + public void test_presto_0() throws Exception { + String result = PagerUtils.limit("SELECT * FROM test", DbType.presto, 0, 10); + System.out.println(result); + String sureResult = "SELECT *\n" + "FROM test\n" + " OFFSET 1 LIMIT 10"; + Assert.assertEquals(sureResult, result); + } + +} From 4f8c0489a85a0fa36dcb5851d587cbf62e3ac728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E5=BB=BA=E6=88=90?= Date: Wed, 9 Feb 2022 15:11:16 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E6=9B=B4=E6=96=B0MySqlValidConnectionChe?= =?UTF-8?q?cker=E6=9E=84=E9=80=A0=E5=99=A8=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java | 4 ++-- .../bvt/pool/vendor/MySQLValidConnectionCheckerTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java index 30a238f5cf..c806da5229 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/DataSourceTest3.java @@ -239,7 +239,7 @@ public class DataSourceTest3 extends PoolTestCase { public void test_ValidConnectionChecker() throws Exception { dataSource.getValidConnectionCheckerClassName(); - dataSource.setValidConnectionChecker(new MySqlValidConnectionChecker()); + dataSource.setValidConnectionChecker(new MySqlValidConnectionChecker(false)); Assert.assertEquals(MySqlValidConnectionChecker.class.getName(), dataSource.getValidConnectionCheckerClassName()); } @@ -326,7 +326,7 @@ public class DataSourceTest3 extends PoolTestCase { public void test_error_validateConnection_3() throws Exception { dataSource.setValidationQuery(null); - dataSource.setValidConnectionChecker(new MySqlValidConnectionChecker()); + dataSource.setValidConnectionChecker(new MySqlValidConnectionChecker(false)); DruidPooledConnection conn = dataSource.getConnection().unwrap(DruidPooledConnection.class); dataSource.validateConnection(conn); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySQLValidConnectionCheckerTest.java b/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySQLValidConnectionCheckerTest.java index ad624495e5..59d7820c48 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySQLValidConnectionCheckerTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySQLValidConnectionCheckerTest.java @@ -21,7 +21,7 @@ public class MySQLValidConnectionCheckerTest extends PoolTestCase { dataSource.setUrl("jdbc:mock:xxx"); dataSource.setDbType("mysql"); dataSource.setValidationQuery("select 1"); - dataSource.setValidConnectionChecker(new MySqlValidConnectionChecker()); + dataSource.setValidConnectionChecker(new MySqlValidConnectionChecker(false)); dataSource.setInitialSize(1); dataSource.setTestOnBorrow(true); } From 4786e105d6bf0f2ffd3b70fc7aa568ed98c5c5f9 Mon Sep 17 00:00:00 2001 From: "xuping.lz" Date: Tue, 8 Feb 2022 09:05:26 +0000 Subject: [PATCH 12/14] Add OceanBaseValidConnectionChecker and fix oceanbase dbtype --- .../alibaba/druid/pool/DruidDataSource.java | 5 ++ .../OceanBaseValidConnectionChecker.java | 63 +++++++++++++++++++ .../com/alibaba/druid/util/JdbcConstants.java | 2 + .../com/alibaba/druid/util/JdbcUtils.java | 4 +- 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/pool/vendor/OceanBaseValidConnectionChecker.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 5ee986397a..0c6fe4de92 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1333,7 +1333,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat || realDriverClassName.equals(JdbcConstants.ENTERPRISEDB_DRIVER) || realDriverClassName.equals(JdbcConstants.POLARDB_DRIVER)) { this.validConnectionChecker = new PGValidConnectionChecker(); + } else if (realDriverClassName.equals(JdbcConstants.OCEANBASE_DRIVER) + || (realDriverClassName.equals(JdbcConstants.OCEANBASE_DRIVER2))) { + DbType dbType = DbType.of(this.dbTypeName); + this.validConnectionChecker = new OceanBaseValidConnectionChecker(dbType); } + } private void initExceptionSorter() { diff --git a/src/main/java/com/alibaba/druid/pool/vendor/OceanBaseValidConnectionChecker.java b/src/main/java/com/alibaba/druid/pool/vendor/OceanBaseValidConnectionChecker.java new file mode 100644 index 0000000000..8ff646b13d --- /dev/null +++ b/src/main/java/com/alibaba/druid/pool/vendor/OceanBaseValidConnectionChecker.java @@ -0,0 +1,63 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.pool.vendor; + +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; +import java.sql.Statement; + +public class OceanBaseValidConnectionChecker extends ValidConnectionCheckerAdapter implements ValidConnectionChecker { + private String oracleModeValidateQuery = "SELECT 'x' FROM DUAL"; + private String mysqlModeValidateQuery = "SELECT 'x'"; + private DbType dbType; + public OceanBaseValidConnectionChecker() { configFromProperties(System.getProperties()); dbType = null; } + public OceanBaseValidConnectionChecker(DbType dbType) {this.dbType = dbType;configFromProperties(System.getProperties()); } + public boolean isValidConnection(final Connection c, String validateQuery, int validationQueryTimeout) throws Exception { + if (c.isClosed()) { + return false; + } + if (validateQuery == null || validateQuery.isEmpty()) { + if(dbType != null) { + if(dbType == DbType.oceanbase) { + validateQuery = mysqlModeValidateQuery; + } else { + validateQuery = oracleModeValidateQuery; + } + } + } + + Statement stmt = null; + + try { + stmt = c.createStatement(); + if (validationQueryTimeout > 0) { + stmt.setQueryTimeout(validationQueryTimeout); + } + stmt.execute(validateQuery); + return true; + } catch (SQLException e) { + throw e; + } finally { + JdbcUtils.close(stmt); + } + } +} diff --git a/src/main/java/com/alibaba/druid/util/JdbcConstants.java b/src/main/java/com/alibaba/druid/util/JdbcConstants.java index f65bb05ef6..02ab898b34 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcConstants.java +++ b/src/main/java/com/alibaba/druid/util/JdbcConstants.java @@ -85,6 +85,7 @@ public interface JdbcConstants { DbType OCEANBASE = DbType.oceanbase; DbType OCEANBASE_ORACLE = DbType.oceanbase_oracle; String OCEANBASE_DRIVER = "com.alipay.oceanbase.jdbc.Driver"; + String OCEANBASE_DRIVER2 = "com.oceanbase.jdbc.Driver"; DbType INFORMIX = DbType.informix; @@ -150,4 +151,5 @@ public interface JdbcConstants { */ DbType OSCAR = DbType.oscar; String OSCAR_DRIVER = "com.oscar.Driver"; + } diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index df77c74c31..8cdc0ed2cb 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -928,13 +928,13 @@ public final class JdbcUtils implements JdbcConstants { public static boolean isOracleDbType(String dbType) { return DbType.oracle.name().equals(dbType) || // - DbType.oceanbase.name().equals(dbType) || // + DbType.oceanbase_oracle.name().equals(dbType) || // DbType.ali_oracle.name().equalsIgnoreCase(dbType); } public static boolean isOracleDbType(DbType dbType) { return DbType.oracle == dbType || // - DbType.oceanbase == dbType || // + DbType.oceanbase_oracle == dbType || // DbType.ali_oracle == dbType; } From f5c1e0de7a1be34cd1cff79aec79e8549de471f9 Mon Sep 17 00:00:00 2001 From: "xuping.lz" Date: Fri, 11 Feb 2022 17:38:04 +0800 Subject: [PATCH 13/14] Add test cases --- .../java/com/alibaba/druid/util/JdbcUtilsTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/com/alibaba/druid/util/JdbcUtilsTest.java b/src/test/java/com/alibaba/druid/util/JdbcUtilsTest.java index 078a3c3042..71992f389e 100644 --- a/src/test/java/com/alibaba/druid/util/JdbcUtilsTest.java +++ b/src/test/java/com/alibaba/druid/util/JdbcUtilsTest.java @@ -51,4 +51,16 @@ public class JdbcUtilsTest extends TestCase { assertTrue("TiDB suppose to be a MySQL compatible DB", JdbcUtils.isMysqlDbType("tidb")); assertTrue("TiDB suppose to be a MySQL compatible DB", JdbcUtils.isMySqlDriver(JdbcUtils.TIDB_DRIVER)); } + + public void testGetTypeOceanBase_mysql() { + String jdbcUrl = "jdbc:oceanbase://localhost:3306/test"; + String dbType = JdbcUtils.getDbType(jdbcUrl, null); + assertEquals("Does not support OceanBase, for url like jdbc:oceanbase:...", DbType.oceanbase, dbType); + } + + public void testGetTypeOceanBase_oracle() { + String jdbcUrl = "jdbc:oceanbase:oracle://localhost:3306/test"; + String dbType = JdbcUtils.getDbType(jdbcUrl, null); + assertEquals("Does not support OceanBase, for url like jdbc:oceanbase:oracle:...", DbType.oceanbase_oracle, dbType); + } } From ffaa38de5ed93fb66356d43a0433601fac7cbc1e Mon Sep 17 00:00:00 2001 From: zouchangfu Date: Wed, 16 Feb 2022 13:14:10 +0800 Subject: [PATCH 14/14] Remove duplicate logic --- src/main/java/com/alibaba/druid/filter/FilterManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/filter/FilterManager.java b/src/main/java/com/alibaba/druid/filter/FilterManager.java index 2741b348e4..0d36f92c7d 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterManager.java +++ b/src/main/java/com/alibaba/druid/filter/FilterManager.java @@ -71,7 +71,6 @@ public class FilterManager { loadFilterConfig(filterProperties, ClassLoader.getSystemClassLoader()); loadFilterConfig(filterProperties, FilterManager.class.getClassLoader()); loadFilterConfig(filterProperties, Thread.currentThread().getContextClassLoader()); - loadFilterConfig(filterProperties, FilterManager.class.getClassLoader()); return filterProperties; }