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)); + } }