From 5c79c26954f130a5aac78ad9dedd2394ef848927 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Fri, 3 Jul 2026 17:33:57 +0800 Subject: [PATCH] fix(iotdb): load databases without duplicate schema --- .../java/com/dbx/agent/iotdb/IoTDBAgent.java | 24 +++++++++++++++++++ .../desktop/src/lib/databaseCapabilitySets.ts | 1 - .../app-tests/databaseCapabilities.test.ts | 5 ++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/agents/drivers/iotdb/src/main/java/com/dbx/agent/iotdb/IoTDBAgent.java b/agents/drivers/iotdb/src/main/java/com/dbx/agent/iotdb/IoTDBAgent.java index 93dff6b599..37bd326232 100644 --- a/agents/drivers/iotdb/src/main/java/com/dbx/agent/iotdb/IoTDBAgent.java +++ b/agents/drivers/iotdb/src/main/java/com/dbx/agent/iotdb/IoTDBAgent.java @@ -1,8 +1,13 @@ package com.dbx.agent.iotdb; import com.dbx.agent.ConfiguredJdbcAgent; +import com.dbx.agent.DatabaseInfo; import com.dbx.agent.JdbcAgentProfile; import com.dbx.agent.JsonRpcServer; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; public final class IoTDBAgent extends ConfiguredJdbcAgent { public static final JdbcAgentProfile IOTDB_PROFILE = new JdbcAgentProfile( @@ -16,6 +21,25 @@ public final class IoTDBAgent extends ConfiguredJdbcAgent { super(IOTDB_PROFILE); } + // IoTDB 的 database 是 `root.xxx` 路径前缀;JDBC metadata 会把同一路径同时投影成 catalog/schema。 + // 这里使用 IoTDB 原生语句作为 database 列表来源,避免依赖驱动的关系型兼容层。 + @Override + public List listDatabases() { + return unchecked(() -> { + List result = new ArrayList<>(); + try (Statement stmt = requireConnection().createStatement(); + ResultSet rs = stmt.executeQuery("SHOW DATABASES")) { + while (rs.next()) { + String name = rs.getString(1); + if (name != null && !name.trim().isEmpty()) { + result.add(new DatabaseInfo(name.trim())); + } + } + } + return result; + }); + } + public static void main(String[] args) { new JsonRpcServer(new IoTDBAgent()).run(); } diff --git a/apps/desktop/src/lib/databaseCapabilitySets.ts b/apps/desktop/src/lib/databaseCapabilitySets.ts index c763708c0a..5ef1ffc871 100644 --- a/apps/desktop/src/lib/databaseCapabilitySets.ts +++ b/apps/desktop/src/lib/databaseCapabilitySets.ts @@ -66,7 +66,6 @@ export const TREE_SCHEMA_TYPES = new Set([ "informix", "xugu", "oscar", - "iotdb", "iris", "duckdb", ]); diff --git a/packages/app-tests/databaseCapabilities.test.ts b/packages/app-tests/databaseCapabilities.test.ts index f6198e0b73..8c27e2413e 100644 --- a/packages/app-tests/databaseCapabilities.test.ts +++ b/packages/app-tests/databaseCapabilities.test.ts @@ -7,6 +7,11 @@ test("TDengine uses database/catalog tree nodes without a schema layer", () => { assert.equal(usesTreeSchemaMode("tdengine"), false); }); +test("IoTDB keeps schema-qualified paths without showing a duplicate schema node", () => { + assert.equal(isSchemaAware("iotdb"), true); + assert.equal(usesTreeSchemaMode("iotdb"), false); +}); + test("GoldenDB and Vastbase expose database creation", () => { assert.equal(supportsDatabaseCreation("goldendb"), true); assert.equal(supportsDatabaseCreation("vastbase"), true);