diff --git a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/JdbcDatabaseOperations.java b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/JdbcDatabaseOperations.java index fd3b72835f6..a1e47e032cf 100644 --- a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/JdbcDatabaseOperations.java +++ b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/JdbcDatabaseOperations.java @@ -19,21 +19,27 @@ package org.apache.gravitino.catalog.jdbc.operation; +import com.google.common.collect.ImmutableMap; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.Set; import javax.sql.DataSource; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.gravitino.StringIdentifier; +import org.apache.gravitino.catalog.jdbc.JdbcSchema; import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter; import org.apache.gravitino.catalog.jdbc.utils.JdbcConnectorUtils; import org.apache.gravitino.exceptions.NoSuchSchemaException; import org.apache.gravitino.exceptions.SchemaAlreadyExistsException; +import org.apache.gravitino.meta.AuditInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -110,6 +116,9 @@ protected void dropDatabase(String databaseName, boolean cascade) { } /** + * The default implementation of this method is based on MySQL syntax, and if the catalog does not + * support MySQL syntax, this method needs to be rewritten. + * * @param databaseName The name of the database. * @param comment The comment of the database. * @param properties The properties of the database. @@ -126,11 +135,61 @@ protected String generateCreateDatabaseSql( } /** + * The default implementation of this method is based on MySQL syntax, and if the catalog does not + * support MySQL syntax, this method needs to be rewritten. + * * @param databaseName The name of the database. * @param cascade cascade If set to true, drops all the tables in the schema as well. * @return the SQL statement to drop a database with the given name. */ - protected abstract String generateDropDatabaseSql(String databaseName, boolean cascade); + protected String generateDropDatabaseSql(String databaseName, boolean cascade) { + final String dropDatabaseSql = String.format("DROP DATABASE `%s`", databaseName); + if (cascade) { + return dropDatabaseSql; + } + + try (final Connection connection = this.dataSource.getConnection()) { + String query = String.format("SHOW TABLES IN `%s`", databaseName); + try (Statement statement = connection.createStatement()) { + // Execute the query and check if there exists any tables in the database + try (ResultSet resultSet = statement.executeQuery(query)) { + if (resultSet.next()) { + throw new IllegalStateException( + String.format( + "Database %s is not empty, the value of cascade should be true.", + databaseName)); + } + } + } + } catch (SQLException sqlException) { + throw this.exceptionMapper.toGravitinoException(sqlException); + } + return dropDatabaseSql; + } + + /** + * The default implementation of this method is based on MySQL syntax, and if the catalog does not + * support MySQL syntax, this method needs to be rewritten. + * + * @param databaseName The name of the database to check. + * @return information object of the JDBC database. + */ + @Override + public JdbcSchema load(String databaseName) throws NoSuchSchemaException { + List allDatabases = listDatabases(); + String dbName = + allDatabases.stream() + .filter(db -> db.equals(databaseName)) + .findFirst() + .orElseThrow( + () -> new NoSuchSchemaException("Database %s could not be found", databaseName)); + + return JdbcSchema.builder() + .withName(dbName) + .withProperties(ImmutableMap.of()) + .withAuditInfo(AuditInfo.EMPTY) + .build(); + } protected Connection getConnection() throws SQLException { return dataSource.getConnection(); @@ -140,12 +199,15 @@ protected Connection getConnection() throws SQLException { * Check whether it is a system database. * * @param dbName The name of the database. - * @return false for all cases. + * @return whether it is a system database. */ protected boolean isSystemDatabase(String dbName) { - return false; + return createSysDatabaseNameSet().contains(dbName.toLowerCase(Locale.ROOT)); } /** Check whether support setting schema comment. */ protected abstract boolean supportSchemaComment(); + + /** Create a set of system database names. */ + protected abstract Set createSysDatabaseNameSet(); } diff --git a/catalogs/catalog-jdbc-common/src/test/java/org/apache/gravitino/catalog/jdbc/operation/SqliteDatabaseOperations.java b/catalogs/catalog-jdbc-common/src/test/java/org/apache/gravitino/catalog/jdbc/operation/SqliteDatabaseOperations.java index 282f1f48b8b..48c2a561153 100644 --- a/catalogs/catalog-jdbc-common/src/test/java/org/apache/gravitino/catalog/jdbc/operation/SqliteDatabaseOperations.java +++ b/catalogs/catalog-jdbc-common/src/test/java/org/apache/gravitino/catalog/jdbc/operation/SqliteDatabaseOperations.java @@ -24,9 +24,11 @@ import java.sql.DriverManager; import java.sql.SQLException; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.io.FileUtils; import org.apache.gravitino.catalog.jdbc.JdbcSchema; @@ -91,6 +93,16 @@ public JdbcSchema load(String databaseName) throws NoSuchSchemaException { return null; } + @Override + protected boolean supportSchemaComment() { + return false; + } + + @Override + protected Set createSysDatabaseNameSet() { + return Collections.emptySet(); + } + @Override public boolean delete(String databaseName, boolean cascade) throws NoSuchSchemaException { return delete(databaseName); diff --git a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisDatabaseOperations.java b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisDatabaseOperations.java index 19435576cd6..1f0a37c1538 100644 --- a/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisDatabaseOperations.java +++ b/catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisDatabaseOperations.java @@ -40,9 +40,6 @@ public class DorisDatabaseOperations extends JdbcDatabaseOperations { public static final String COMMENT_KEY = "comment"; - private static final Set DORIS_SYSTEM_DATABASE_NAMES = - ImmutableSet.of("information_schema"); - @Override public String generateCreateDatabaseSql( String databaseName, String comment, Map properties) { @@ -137,12 +134,12 @@ protected Map getDatabaseProperties(String databaseName) { } @Override - protected boolean isSystemDatabase(String dbName) { - return DORIS_SYSTEM_DATABASE_NAMES.contains(dbName); + protected boolean supportSchemaComment() { + return true; } @Override - protected boolean supportSchemaComment() { - return true; + protected Set createSysDatabaseNameSet() { + return ImmutableSet.of("information_schema"); } } diff --git a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlDatabaseOperations.java b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlDatabaseOperations.java index 9c65f3655c9..cb6206b7276 100644 --- a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlDatabaseOperations.java +++ b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/operation/MysqlDatabaseOperations.java @@ -18,85 +18,20 @@ */ package org.apache.gravitino.catalog.mysql.operation; -import com.google.common.collect.ImmutableMap; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; +import com.google.common.collect.ImmutableSet; import java.util.Set; -import org.apache.gravitino.catalog.jdbc.JdbcSchema; import org.apache.gravitino.catalog.jdbc.operation.JdbcDatabaseOperations; -import org.apache.gravitino.exceptions.NoSuchSchemaException; -import org.apache.gravitino.meta.AuditInfo; /** Database operations for MySQL. */ public class MysqlDatabaseOperations extends JdbcDatabaseOperations { - public static final Set SYS_MYSQL_DATABASE_NAMES = createSysMysqlDatabaseNames(); - - private static Set createSysMysqlDatabaseNames() { - Set set = new HashSet<>(); - set.add("information_schema"); - set.add("mysql"); - set.add("performance_schema"); - set.add("sys"); - return Collections.unmodifiableSet(set); - } - - @Override - public String generateDropDatabaseSql(String databaseName, boolean cascade) { - final String dropDatabaseSql = "DROP DATABASE `" + databaseName + "`"; - if (cascade) { - return dropDatabaseSql; - } - - try (final Connection connection = this.dataSource.getConnection()) { - String query = "SHOW TABLES IN `" + databaseName + "`"; - try (Statement statement = connection.createStatement()) { - // Execute the query and check if there exists any tables in the database - try (ResultSet resultSet = statement.executeQuery(query)) { - if (resultSet.next()) { - throw new IllegalStateException( - String.format( - "Database %s is not empty, the value of cascade should be true.", - databaseName)); - } - } - } - } catch (SQLException sqlException) { - throw this.exceptionMapper.toGravitinoException(sqlException); - } - return dropDatabaseSql; - } - @Override - public JdbcSchema load(String databaseName) throws NoSuchSchemaException { - List allDatabases = listDatabases(); - String dbName = - allDatabases.stream() - .filter(db -> db.equals(databaseName)) - .findFirst() - .orElseThrow( - () -> new NoSuchSchemaException("Database %s could not be found", databaseName)); - - return JdbcSchema.builder() - .withName(dbName) - .withProperties(ImmutableMap.of()) - .withAuditInfo(AuditInfo.EMPTY) - .build(); - } - - @Override - protected boolean isSystemDatabase(String dbName) { - return SYS_MYSQL_DATABASE_NAMES.contains(dbName.toLowerCase(Locale.ROOT)); + protected boolean supportSchemaComment() { + return false; } @Override - protected boolean supportSchemaComment() { - return false; + protected Set createSysDatabaseNameSet() { + return ImmutableSet.of("information_schema", "mysql", "sys", "performance_schema"); } } diff --git a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysqlDatabaseOperations.java b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysqlDatabaseOperations.java index 6c14dfc0c8d..1ad704016da 100644 --- a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysqlDatabaseOperations.java +++ b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysqlDatabaseOperations.java @@ -18,8 +18,6 @@ */ package org.apache.gravitino.catalog.mysql.operation; -import static org.apache.gravitino.catalog.mysql.operation.MysqlDatabaseOperations.SYS_MYSQL_DATABASE_NAMES; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -45,8 +43,11 @@ public void testBaseOperationDatabase() { // Mysql database creation does not support incoming comments. String comment = null; List databases = DATABASE_OPERATIONS.listDatabases(); - SYS_MYSQL_DATABASE_NAMES.forEach( - sysMysqlDatabaseName -> Assertions.assertFalse(databases.contains(sysMysqlDatabaseName))); + ((MysqlDatabaseOperations) DATABASE_OPERATIONS) + .createSysDatabaseNameSet() + .forEach( + sysMysqlDatabaseName -> + Assertions.assertFalse(databases.contains(sysMysqlDatabaseName))); testBaseOperation(databaseName, properties, comment); testDropDatabase(databaseName); } diff --git a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/operation/OceanBaseDatabaseOperations.java b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/operation/OceanBaseDatabaseOperations.java index 9e452a81aae..8b455b37460 100644 --- a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/operation/OceanBaseDatabaseOperations.java +++ b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/operation/OceanBaseDatabaseOperations.java @@ -18,85 +18,20 @@ */ package org.apache.gravitino.catalog.oceanbase.operation; -import com.google.common.collect.ImmutableMap; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; +import com.google.common.collect.ImmutableSet; import java.util.Set; -import org.apache.gravitino.catalog.jdbc.JdbcSchema; import org.apache.gravitino.catalog.jdbc.operation.JdbcDatabaseOperations; -import org.apache.gravitino.exceptions.NoSuchSchemaException; -import org.apache.gravitino.meta.AuditInfo; /** Database operations for OceanBase. */ public class OceanBaseDatabaseOperations extends JdbcDatabaseOperations { - public static final Set SYS_OCEANBASE_DATABASE_NAMES = createSysOceanBaseDatabaseNames(); - - private static Set createSysOceanBaseDatabaseNames() { - Set set = new HashSet<>(); - set.add("information_schema"); - set.add("mysql"); - set.add("sys"); - set.add("oceanbase"); - return Collections.unmodifiableSet(set); - } - - @Override - public String generateDropDatabaseSql(String databaseName, boolean cascade) { - final String dropDatabaseSql = String.format("DROP DATABASE `%s`", databaseName); - if (cascade) { - return dropDatabaseSql; - } - - try (final Connection connection = this.dataSource.getConnection()) { - String query = String.format("SHOW TABLES IN `%s`", databaseName); - try (Statement statement = connection.createStatement()) { - // Execute the query and check if there exists any tables in the database - try (ResultSet resultSet = statement.executeQuery(query)) { - if (resultSet.next()) { - throw new IllegalStateException( - String.format( - "Database %s is not empty, the value of cascade should be true.", - databaseName)); - } - } - } - } catch (SQLException sqlException) { - throw this.exceptionMapper.toGravitinoException(sqlException); - } - return dropDatabaseSql; - } - @Override - public JdbcSchema load(String databaseName) throws NoSuchSchemaException { - List allDatabases = listDatabases(); - String dbName = - allDatabases.stream() - .filter(db -> db.equals(databaseName)) - .findFirst() - .orElseThrow( - () -> new NoSuchSchemaException("Database %s could not be found", databaseName)); - - return JdbcSchema.builder() - .withName(dbName) - .withProperties(ImmutableMap.of()) - .withAuditInfo(AuditInfo.EMPTY) - .build(); - } - - @Override - protected boolean isSystemDatabase(String dbName) { - return SYS_OCEANBASE_DATABASE_NAMES.contains(dbName.toLowerCase(Locale.ROOT)); + protected boolean supportSchemaComment() { + return false; } @Override - protected boolean supportSchemaComment() { - return false; + protected Set createSysDatabaseNameSet() { + return ImmutableSet.of("information_schema", "mysql", "sys", "oceanbase"); } } diff --git a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBaseDatabaseOperations.java b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBaseDatabaseOperations.java index 8bfc44f5b34..df27c6b70ba 100644 --- a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBaseDatabaseOperations.java +++ b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBaseDatabaseOperations.java @@ -18,8 +18,6 @@ */ package org.apache.gravitino.catalog.oceanbase.operation; -import static org.apache.gravitino.catalog.oceanbase.operation.OceanBaseDatabaseOperations.SYS_OCEANBASE_DATABASE_NAMES; - import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,9 +36,11 @@ public void testBaseOperationDatabase() { // OceanBase database creation does not support incoming comments. String comment = null; List databases = DATABASE_OPERATIONS.listDatabases(); - SYS_OCEANBASE_DATABASE_NAMES.forEach( - sysOceanBaseDatabaseName -> - Assertions.assertFalse(databases.contains(sysOceanBaseDatabaseName))); + ((OceanBaseDatabaseOperations) DATABASE_OPERATIONS) + .createSysDatabaseNameSet() + .forEach( + sysOceanBaseDatabaseName -> + Assertions.assertFalse(databases.contains(sysOceanBaseDatabaseName))); testBaseOperation(databaseName, properties, comment); } diff --git a/catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlSchemaOperations.java b/catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlSchemaOperations.java index 4da5d419dc7..be3c5d627d4 100644 --- a/catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlSchemaOperations.java +++ b/catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlSchemaOperations.java @@ -20,6 +20,7 @@ import static org.apache.gravitino.catalog.postgresql.operation.PostgreSqlTableOperations.PG_QUOTE; +import com.google.common.collect.ImmutableSet; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; @@ -27,9 +28,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -46,16 +45,6 @@ /** Database operations for PostgreSQL. */ public class PostgreSqlSchemaOperations extends JdbcDatabaseOperations { - public static final Set SYS_PG_DATABASE_NAMES = - Collections.unmodifiableSet( - new HashSet() { - { - add("pg_toast"); - add("pg_catalog"); - add("information_schema"); - } - }); - private String database; @Override @@ -167,13 +156,13 @@ protected Connection getConnection() throws SQLException { } @Override - protected boolean isSystemDatabase(String dbName) { - return SYS_PG_DATABASE_NAMES.contains(dbName.toLowerCase(Locale.ROOT)); + protected boolean supportSchemaComment() { + return true; } @Override - protected boolean supportSchemaComment() { - return true; + protected Set createSysDatabaseNameSet() { + return ImmutableSet.of("pg_toast", "pg_catalog", "information_schema"); } private String getShowSchemaCommentSql(String schema) { diff --git a/catalogs/catalog-jdbc-postgresql/src/test/java/org/apache/gravitino/catalog/postgresql/operation/TestPostgreSqlSchemaOperations.java b/catalogs/catalog-jdbc-postgresql/src/test/java/org/apache/gravitino/catalog/postgresql/operation/TestPostgreSqlSchemaOperations.java index 198394b73c1..8ccf5902f09 100644 --- a/catalogs/catalog-jdbc-postgresql/src/test/java/org/apache/gravitino/catalog/postgresql/operation/TestPostgreSqlSchemaOperations.java +++ b/catalogs/catalog-jdbc-postgresql/src/test/java/org/apache/gravitino/catalog/postgresql/operation/TestPostgreSqlSchemaOperations.java @@ -18,8 +18,6 @@ */ package org.apache.gravitino.catalog.postgresql.operation; -import static org.apache.gravitino.catalog.postgresql.operation.PostgreSqlSchemaOperations.SYS_PG_DATABASE_NAMES; - import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; @@ -49,8 +47,10 @@ public void testBaseOperationSchema() { String comment = null; List initDatabases = DATABASE_OPERATIONS.listDatabases(); - SYS_PG_DATABASE_NAMES.forEach( - sysPgDatabaseName -> Assertions.assertFalse(initDatabases.contains(sysPgDatabaseName))); + ((PostgreSqlSchemaOperations) DATABASE_OPERATIONS) + .createSysDatabaseNameSet() + .forEach( + sysPgDatabaseName -> Assertions.assertFalse(initDatabases.contains(sysPgDatabaseName))); testBaseOperation(databaseName, properties, comment); // delete database.