diff --git a/agents/drivers/kingbase/src/main/java/com/dbx/agent/kingbase/KingbaseAgent.java b/agents/drivers/kingbase/src/main/java/com/dbx/agent/kingbase/KingbaseAgent.java index 0706254edb..4949460c11 100644 --- a/agents/drivers/kingbase/src/main/java/com/dbx/agent/kingbase/KingbaseAgent.java +++ b/agents/drivers/kingbase/src/main/java/com/dbx/agent/kingbase/KingbaseAgent.java @@ -46,15 +46,17 @@ public final class KingbaseAgent extends PostgresLikeAgent { @Override public List listDatabases() { - if (!isMysqlCompatMode()) { - return super.listDatabases(); - } return unchecked(() -> { - try (PreparedStatement stmt = requireConnected().prepareStatement("SELECT current_database() AS database_name"); + String sql = isMysqlCompatMode() + ? "SELECT current_database() AS database_name" + : "SELECT datname AS database_name FROM sys_database WHERE datistemplate = false ORDER BY datname"; + try (PreparedStatement stmt = requireConnected().prepareStatement(sql); ResultSet rs = stmt.executeQuery()) { - if (rs.next()) { - return Collections.singletonList(new DatabaseInfo(rs.getString("database_name"))); + List result = new ArrayList<>(); + while (rs.next()) { + result.add(new DatabaseInfo(rs.getString("database_name"))); } + if (!result.isEmpty()) return result; } return Collections.singletonList(new DatabaseInfo(getConfiguredDatabase())); }); @@ -62,17 +64,20 @@ public final class KingbaseAgent extends PostgresLikeAgent { @Override public List listSchemas() { - if (!isMysqlCompatMode()) { - return super.listSchemas(); - } return unchecked(() -> { List result = new ArrayList<>(); - String sql = "SELECT schema_name " + - "FROM information_schema.schemata " + - "WHERE UPPER(schema_name) <> 'INFORMATION_SCHEMA' " + - "AND UPPER(schema_name) NOT LIKE 'SYS%' " + - "AND UPPER(schema_name) NOT LIKE 'XLOG%' " + - "ORDER BY schema_name"; + String sql = isMysqlCompatMode() + ? "SELECT schema_name " + + "FROM information_schema.schemata " + + "WHERE UPPER(schema_name) <> 'INFORMATION_SCHEMA' " + + "AND UPPER(schema_name) NOT LIKE 'SYS%' " + + "AND UPPER(schema_name) NOT LIKE 'XLOG%' " + + "ORDER BY schema_name" + : "SELECT nspname AS schema_name " + + "FROM sys_namespace " + + "WHERE nspname NOT LIKE 'sys_temp_%' " + + "AND nspname NOT LIKE 'sys_toast_temp_%' " + + "ORDER BY nspname"; try (PreparedStatement stmt = requireConnected().prepareStatement(sql); ResultSet rs = stmt.executeQuery()) { while (rs.next()) { diff --git a/agents/drivers/kingbase/src/test/java/com/dbx/agent/kingbase/KingbaseAgentTest.java b/agents/drivers/kingbase/src/test/java/com/dbx/agent/kingbase/KingbaseAgentTest.java index f89fbadff7..05ddda31d4 100644 --- a/agents/drivers/kingbase/src/test/java/com/dbx/agent/kingbase/KingbaseAgentTest.java +++ b/agents/drivers/kingbase/src/test/java/com/dbx/agent/kingbase/KingbaseAgentTest.java @@ -54,11 +54,11 @@ class KingbaseAgentTest extends JdbcFakeExecutionBehaviorTest { } @Test - void regularListDatabasesUsesPostgresCatalog() { + void regularListDatabasesUsesKingbaseCatalog() { List sql = new ArrayList<>(); KingbaseAgent agent = new KingbaseAgent(); TestSupport.setPrivateConnection(agent, preparedConnection(sql, resultSet( - new String[]{"datname"}, + new String[]{"database_name"}, new Object[][]{{"app"}, {"analytics"}} ))); @@ -66,7 +66,7 @@ class KingbaseAgentTest extends JdbcFakeExecutionBehaviorTest { Assertions.assertEquals(2, databases.size()); Assertions.assertEquals("app", databases.get(0).getName()); Assertions.assertEquals("analytics", databases.get(1).getName()); - Assertions.assertTrue(sql.get(0).contains("FROM pg_database"), sql.get(0)); + Assertions.assertTrue(sql.get(0).contains("FROM sys_database"), sql.get(0)); } @Test @@ -79,7 +79,7 @@ class KingbaseAgentTest extends JdbcFakeExecutionBehaviorTest { ))); Assertions.assertEquals(Arrays.asList("public", "sys_catalog"), agent.listSchemas()); - Assertions.assertTrue(sql.get(0).contains("pg_catalog.pg_namespace"), sql.get(0)); + Assertions.assertTrue(sql.get(0).contains("FROM sys_namespace"), sql.get(0)); Assertions.assertFalse(sql.get(0).contains("SYS%"), sql.get(0)); }