diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index c2116ad0a7..91256957cc 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1316,7 +1316,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat this.validConnectionChecker = new MSSQLValidConnectionChecker(); } else if (realDriverClassName.equals(JdbcConstants.POSTGRESQL_DRIVER) - || realDriverClassName.equals(JdbcConstants.ENTERPRISEDB_DRIVER)) { + || realDriverClassName.equals(JdbcConstants.ENTERPRISEDB_DRIVER) + || realDriverClassName.equals(JdbcConstants.POLARDB_DRIVER)) { this.validConnectionChecker = new PGValidConnectionChecker(); } } @@ -1347,7 +1348,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat this.exceptionSorter = new SybaseExceptionSorter(); } else if (realDriverClassName.equals(JdbcConstants.POSTGRESQL_DRIVER) - || realDriverClassName.equals(JdbcConstants.ENTERPRISEDB_DRIVER)) { + || realDriverClassName.equals(JdbcConstants.ENTERPRISEDB_DRIVER) + || realDriverClassName.equals(JdbcConstants.POLARDB_DRIVER)) { this.exceptionSorter = new PGExceptionSorter(); } else if (realDriverClassName.equals("com.alibaba.druid.mock.MockDriver")) { diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 1fb6bbd08a..6637569d0c 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -899,7 +899,8 @@ public class SQLUtils { return name; } } else if (JdbcConstants.POSTGRESQL.equals(dbType) - || JdbcConstants.ENTERPRISEDB.equals(dbType)) { + || JdbcConstants.ENTERPRISEDB.equals(dbType) + || JdbcConstants.POLARDB.equals(dbType)) { if (PGUtils.isKeyword(normalizeName)) { return name; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java index 3d94c6e040..73ec0beef0 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java @@ -82,7 +82,8 @@ public class SQLParserUtils { } if (JdbcUtils.POSTGRESQL.equals(dbType) - || JdbcUtils.ENTERPRISEDB.equals(dbType)) { + || JdbcUtils.ENTERPRISEDB.equals(dbType) + || JdbcUtils.POLARDB.equals(dbType)) { return new PGSQLStatementParser(sql); } @@ -129,7 +130,8 @@ public class SQLParserUtils { } if (JdbcUtils.POSTGRESQL.equals(dbType) - || JdbcUtils.ENTERPRISEDB.equals(dbType)) { + || JdbcUtils.ENTERPRISEDB.equals(dbType) + || JdbcUtils.POLARDB.equals(dbType)) { return new PGExprParser(sql); } @@ -164,7 +166,8 @@ public class SQLParserUtils { } if (JdbcUtils.POSTGRESQL.equals(dbType) - || JdbcUtils.ENTERPRISEDB.equals(dbType)) { + || JdbcUtils.ENTERPRISEDB.equals(dbType) + || JdbcUtils.POLARDB.equals(dbType)) { return new PGLexer(sql); } 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 d2812cfce4..48e44ac003 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java @@ -66,7 +66,8 @@ public final class ExportParameterVisitorUtils { } if (JdbcUtils.POSTGRESQL.equals(dbType) - || JdbcUtils.ENTERPRISEDB.equals(dbType)) { + || JdbcUtils.ENTERPRISEDB.equals(dbType) + || JdbcUtils.POLARDB.equals(dbType)) { return new PGExportParameterVisitor(out); } 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 13f5ff3878..3712bb0984 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -276,7 +276,8 @@ public class ParameterizedOutputVisitorUtils { } if (JdbcUtils.POSTGRESQL.equals(dbType) - || JdbcUtils.ENTERPRISEDB.equals(dbType)) { + || JdbcUtils.ENTERPRISEDB.equals(dbType) + || JdbcUtils.POLARDB.equals(dbType)) { return new PGOutputVisitor(out, true); } 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 3e5c5421c8..5d574c511e 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -177,7 +177,8 @@ public class SQLEvalVisitorUtils { } if (JdbcConstants.POSTGRESQL.equals(dbType) - || JdbcConstants.ENTERPRISEDB.equals(dbType)) { + || JdbcConstants.ENTERPRISEDB.equals(dbType) + || JdbcConstants.POLARDB.equals(dbType)) { return new PGEvalVisitor(); } diff --git a/src/main/java/com/alibaba/druid/util/JdbcConstants.java b/src/main/java/com/alibaba/druid/util/JdbcConstants.java index 8b7757b334..85b6630b67 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcConstants.java +++ b/src/main/java/com/alibaba/druid/util/JdbcConstants.java @@ -117,4 +117,10 @@ public interface JdbcConstants { String CLICKHOUSE = "clickhouse"; String CLICKHOUSE_DRIVER = "ru.yandex.clickhouse.ClickHouseDriver"; + + /** + * Aliyun PolarDB + */ + String POLARDB = "polardb"; + String POLARDB_DRIVER = "com.aliyun.polardb.Driver"; } diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index bc8b70666b..a647819023 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -493,7 +493,9 @@ public final class JdbcUtils implements JdbcConstants { return JdbcConstants.CLICKHOUSE_DRIVER; } else if(rawUrl.startsWith("jdbc:presto:")) { return JdbcConstants.PRESTO_DRIVER; - }else { + } else if (rawUrl.startsWith("jdbc:polardb")) { + return JdbcConstants.POLARDB_DRIVER; + } else { throw new SQLException("unknown jdbc driver : " + rawUrl); } } @@ -586,8 +588,10 @@ public final class JdbcUtils implements JdbcConstants { return ELASTIC_SEARCH; } else if (rawUrl.startsWith("jdbc:clickhouse:")) { return CLICKHOUSE; - }else if (rawUrl.startsWith("jdbc:presto:")) { + } else if (rawUrl.startsWith("jdbc:presto:")) { return PRESTO; + } else if (rawUrl.startsWith("jdbc:polardb")) { + return POLARDB; } else { return null; } diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index 0d0b91d532..37e92c1cfd 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -151,7 +151,8 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { provider = new SQLServerWallProvider(config); } else if (JdbcUtils.POSTGRESQL.equals(dbType) - || JdbcUtils.ENTERPRISEDB.equals(dbType)) { + || JdbcUtils.ENTERPRISEDB.equals(dbType) + || JdbcUtils.POLARDB.equals(dbType)) { if (config == null) { config = new WallConfig(PGWallProvider.DEFAULT_CONFIG_DIR); } diff --git a/src/test/java/com/alibaba/druid/polardb/PolarDBDataSourceTest.java b/src/test/java/com/alibaba/druid/polardb/PolarDBDataSourceTest.java new file mode 100644 index 0000000000..a8c7977383 --- /dev/null +++ b/src/test/java/com/alibaba/druid/polardb/PolarDBDataSourceTest.java @@ -0,0 +1,51 @@ +package com.alibaba.druid.polardb; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.druid.util.JdbcUtils; + +public class PolarDBDataSourceTest extends TestCase { + + private String jdbcUrl; + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + jdbcUrl = "jdbc:polardb://a.b.c.d:5432/polardb"; + dataSource = new DruidDataSource(); + dataSource.setUrl(jdbcUrl); + dataSource.setUsername("polardb"); + dataSource.setPassword("polardb"); + dataSource.setValidationQuery("select 1"); + dataSource.setFilters("stat"); + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void testDataSource() throws SQLException { + dataSource.init(); + + Assert.assertTrue(JdbcConstants.POLARDB.equals(dataSource.getDbType())); + Assert.assertTrue(JdbcConstants.POLARDB_DRIVER.equals(dataSource.getDriverClassName())); + + Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement("SELECT 1"); + ResultSet rs = stmt.executeQuery(); + while(rs.next()) { + + } + JdbcUtils.close(rs); + JdbcUtils.close(stmt); + JdbcUtils.close(conn); + } +}