From 776d01199c7ddb4e800473c42315498edf3a06f6 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 9 Sep 2026 12:11:20 +0800 Subject: [PATCH] fix(metadata): scope schemas to current catalog Closes #8461 --- .../com/dbx/agent/ConfiguredJdbcAgent.java | 2 +- .../com/dbx/agent/StandardJdbcMetadata.java | 14 ++++++++- .../dbx/agent/StandardJdbcMetadataTest.java | 31 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/agents/common/src/main/java/com/dbx/agent/ConfiguredJdbcAgent.java b/agents/common/src/main/java/com/dbx/agent/ConfiguredJdbcAgent.java index dfbb04824b..64b09cf831 100644 --- a/agents/common/src/main/java/com/dbx/agent/ConfiguredJdbcAgent.java +++ b/agents/common/src/main/java/com/dbx/agent/ConfiguredJdbcAgent.java @@ -47,7 +47,7 @@ public abstract class ConfiguredJdbcAgent extends AbstractJdbcAgent { @Override public List listSchemas() { - return StandardJdbcMetadata.INSTANCE.listSchemas(requireConnection(), profile); + return StandardJdbcMetadata.INSTANCE.listSchemas(requireConnection(), profile, configuredDatabase); } @Override diff --git a/agents/common/src/main/java/com/dbx/agent/StandardJdbcMetadata.java b/agents/common/src/main/java/com/dbx/agent/StandardJdbcMetadata.java index 8c1c9ab612..0750ea3cc4 100644 --- a/agents/common/src/main/java/com/dbx/agent/StandardJdbcMetadata.java +++ b/agents/common/src/main/java/com/dbx/agent/StandardJdbcMetadata.java @@ -42,11 +42,23 @@ public final class StandardJdbcMetadata { } public List listSchemas(Connection conn, JdbcAgentProfile profile) { + return listSchemas(conn, profile, null); + } + + public List listSchemas(Connection conn, JdbcAgentProfile profile, String configuredCatalog) { return unchecked(() -> { Set names = new LinkedHashSet<>(); DatabaseMetaData meta = conn.getMetaData(); + String catalog = blankToNull(configuredCatalog); try { - appendSchemas(names, meta.getSchemas(null, null)); + String currentCatalog = conn.getCatalog(); + if (currentCatalog != null && !currentCatalog.trim().isEmpty()) { + catalog = currentCatalog.trim(); + } + } catch (Exception | AbstractMethodError ignored) { + } + try { + appendSchemas(names, meta.getSchemas(catalog, null)); } catch (Exception | AbstractMethodError first) { try { appendSchemas(names, meta.getSchemas()); diff --git a/agents/common/src/test/java/com/dbx/agent/StandardJdbcMetadataTest.java b/agents/common/src/test/java/com/dbx/agent/StandardJdbcMetadataTest.java index 722980bc19..7932384d50 100644 --- a/agents/common/src/test/java/com/dbx/agent/StandardJdbcMetadataTest.java +++ b/agents/common/src/test/java/com/dbx/agent/StandardJdbcMetadataTest.java @@ -43,6 +43,37 @@ class StandardJdbcMetadataTest { assertEquals(Arrays.asList("APP", "PUBLIC"), StandardJdbcMetadata.INSTANCE.listSchemas(conn, profile)); } + @Test + void scopesSchemasToTheConnectionCatalog() { + AtomicReference capturedArgs = new AtomicReference<>(); + DatabaseMetaData meta = proxy(DatabaseMetaData.class, new MethodHandler() { + @Override + public Object handle(Method method, Object[] args) { + if ("getSchemas".equals(method.getName())) { + capturedArgs.set(args); + return rows(row("TABLE_SCHEM", "APP")); + } + return defaultValue(method.getReturnType()); + } + }); + Connection conn = proxy(Connection.class, new MethodHandler() { + @Override + public Object handle(Method method, Object[] args) { + if ("getMetaData".equals(method.getName())) { + return meta; + } + if ("getCatalog".equals(method.getName())) { + return "regular_catalog"; + } + return defaultValue(method.getReturnType()); + } + }); + + assertEquals(List.of("APP"), StandardJdbcMetadata.INSTANCE.listSchemas(conn, profile, "initial_catalog")); + assertEquals("regular_catalog", capturedArgs.get()[0]); + assertEquals(null, capturedArgs.get()[1]); + } + @Test void listsSchemasWhenConnectionGetSchemaIsUnsupported() { Connection conn = connection(