Skip to content

Commit 526bd87

Browse files
authored
HIVE-24387: Metastore access through JDBC handler does not use correct database accessor (Jesus Camacho Rodriguez, reviewed by Vineet Garg)
Closes #1673
1 parent ac2a1a4 commit 526bd87

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

jdbc-handler/src/main/java/org/apache/hive/storage/jdbc/dao/DatabaseAccessorFactory.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ private DatabaseAccessorFactory() {
2828
}
2929

3030

31-
public static DatabaseAccessor getAccessor(DatabaseType dbType) {
31+
public static DatabaseAccessor getAccessor(DatabaseType dbType, String driverClass) {
3232

3333
DatabaseAccessor accessor = null;
3434
switch (dbType) {
3535
case MYSQL:
3636
accessor = new MySqlDatabaseAccessor();
3737
break;
38+
3839
case JETHRO_DATA:
3940
accessor = new JethroDatabaseAccessor();
4041
break;
@@ -63,6 +64,26 @@ public static DatabaseAccessor getAccessor(DatabaseType dbType) {
6364
accessor = new DerbyDatabaseAccessor();
6465
break;
6566

67+
case METASTORE:
68+
// For metastore, we infer the accessor from the jdbc driver string.
69+
// TODO: We could also make a call to get the metadata from the connection
70+
// so we could obtain the database product. However, it seems an
71+
// overkill given that the metastore supported RDBMSs is a
72+
// well-defined set.
73+
if (driverClass.contains("MYSQL")) {
74+
accessor = new MySqlDatabaseAccessor();
75+
} else if (driverClass.contains("POSTGRESQL")) {
76+
accessor = new PostgresDatabaseAccessor();
77+
} else if (driverClass.contains("ORACLE")) {
78+
accessor = new OracleDatabaseAccessor();
79+
} else if (driverClass.contains("SQLSERVER")) {
80+
accessor = new MsSqlDatabaseAccessor();
81+
} else {
82+
// default
83+
accessor = new GenericJdbcDatabaseAccessor();
84+
}
85+
break;
86+
6687
default:
6788
accessor = new GenericJdbcDatabaseAccessor();
6889
break;
@@ -75,7 +96,9 @@ public static DatabaseAccessor getAccessor(DatabaseType dbType) {
7596
public static DatabaseAccessor getAccessor(Configuration conf) {
7697
DatabaseType dbType = DatabaseType.valueOf(
7798
conf.get(JdbcStorageConfig.DATABASE_TYPE.getPropertyName()).toUpperCase());
78-
return getAccessor(dbType);
99+
String driverClass =
100+
conf.get(JdbcStorageConfig.JDBC_DRIVER_CLASS.getPropertyName()).toUpperCase();
101+
return getAccessor(dbType, driverClass);
79102
}
80103

81104
}

0 commit comments

Comments
 (0)