fix(agents): use kingbase catalogs for metadata

This commit is contained in:
t8y2
2026-06-23 16:26:45 +08:00
parent a9d158f2b5
commit a630d27cc8
2 changed files with 24 additions and 19 deletions
@@ -46,15 +46,17 @@ public final class KingbaseAgent extends PostgresLikeAgent {
@Override
public List<DatabaseInfo> 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<DatabaseInfo> 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<String> listSchemas() {
if (!isMysqlCompatMode()) {
return super.listSchemas();
}
return unchecked(() -> {
List<String> 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()) {
@@ -54,11 +54,11 @@ class KingbaseAgentTest extends JdbcFakeExecutionBehaviorTest {
}
@Test
void regularListDatabasesUsesPostgresCatalog() {
void regularListDatabasesUsesKingbaseCatalog() {
List<String> 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));
}