From 74e19ec6a3e2f754d8b22c93dc9e5a3da95647ae Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sun, 7 Jun 2026 16:39:22 +0800 Subject: [PATCH] feat(databend): support agent driver --- .../public/icons/database/databend.svg | 16 +++++++++ .../connection/ConnectionDialog.vue | 4 +++ .../src/components/icons/DatabaseIcon.vue | 1 + .../src/components/sidebar/TreeItem.vue | 3 +- .../desktop/src/lib/databaseCapabilitySets.ts | 2 ++ apps/desktop/src/lib/jdbcDialect.ts | 9 +++++ apps/desktop/src/lib/tableSelectSql.ts | 8 ++++- apps/desktop/src/stores/queryStore.ts | 13 +++++-- apps/desktop/src/types/database.ts | 1 + .../assets/database-drivers.manifest.json | 11 ++++++ crates/dbx-core/src/agent_catalog.rs | 7 ++++ crates/dbx-core/src/connection.rs | 2 +- crates/dbx-core/src/models/connection.rs | 9 +++-- crates/dbx-core/src/sql_dialect.rs | 14 ++++++++ .../dbx-core/tests/database_capabilities.rs | 3 ++ packages/app-tests/jdbcDialect.test.ts | 35 ++++++++++++++++--- packages/mcp-server/src/index.ts | 2 +- packages/node-core/src/diagnostics.ts | 1 + 18 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 apps/desktop/public/icons/database/databend.svg diff --git a/apps/desktop/public/icons/database/databend.svg b/apps/desktop/public/icons/database/databend.svg new file mode 100644 index 000000000..ab3b97498 --- /dev/null +++ b/apps/desktop/public/icons/database/databend.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/apps/desktop/src/components/connection/ConnectionDialog.vue b/apps/desktop/src/components/connection/ConnectionDialog.vue index c0d76386e..e3a84dfd4 100644 --- a/apps/desktop/src/components/connection/ConnectionDialog.vue +++ b/apps/desktop/src/components/connection/ConnectionDialog.vue @@ -332,6 +332,7 @@ const driverProfiles: Record< icon: "oceanbase", }, goldendb: { type: "goldendb", port: 3306, user: "root", label: "GoldenDB", icon: "goldendb" }, + databend: { type: "databend", port: 8000, user: "databend", label: "Databend", icon: "databend" }, tdsql: { type: "mysql", port: 3306, user: "root", label: "TDSQL", icon: "tdsql" }, polardb: { type: "mysql", port: 3306, user: "root", label: "PolarDB", icon: "polardb" }, greatsql: { type: "mysql", port: 3306, user: "root", label: "GreatSQL", icon: "greatsql" }, @@ -600,6 +601,7 @@ function defaultDatabaseForProfile() { if (form.value.db_type === "redshift") return "dev"; if (form.value.db_type === "gaussdb") return "postgres"; if (form.value.db_type === "kwdb") return "defaultdb"; + if (form.value.db_type === "databend") return "default"; if (selectedType.value === "cockroachdb") return "defaultdb"; if (form.value.db_type === "highgo") return "highgo"; if (form.value.db_type === "yashandb") return "yasdb"; @@ -636,6 +638,7 @@ const iconTypeMap: Record = { oceanbase: "oceanbase", "oceanbase-oracle": "oceanbase", goldendb: "goldendb", + databend: "databend", tdsql: "tdsql", polardb: "polardb", greatsql: "greatsql", @@ -699,6 +702,7 @@ const dbOptions = [ { value: "tidb", label: "TiDB" }, { value: "oceanbase", label: "OceanBase" }, { value: "goldendb", label: "GoldenDB" }, + { value: "databend", label: "Databend" }, { value: "tdsql", label: "TDSQL" }, { value: "polardb", label: "PolarDB" }, { value: "greatsql", label: "GreatSQL" }, diff --git a/apps/desktop/src/components/icons/DatabaseIcon.vue b/apps/desktop/src/components/icons/DatabaseIcon.vue index fbc90aaf9..2a15e8d1a 100644 --- a/apps/desktop/src/components/icons/DatabaseIcon.vue +++ b/apps/desktop/src/components/icons/DatabaseIcon.vue @@ -33,6 +33,7 @@ const assetIcons: Record = { kingbase: "kingbase", highgo: "highgo.png", goldendb: "goldendb.png", + databend: "databend", vastbase: "vastbase.png", yashandb: "yashandb.png", snowflake: "snowflake", diff --git a/apps/desktop/src/components/sidebar/TreeItem.vue b/apps/desktop/src/components/sidebar/TreeItem.vue index 4903f148f..fd18588a2 100644 --- a/apps/desktop/src/components/sidebar/TreeItem.vue +++ b/apps/desktop/src/components/sidebar/TreeItem.vue @@ -117,6 +117,7 @@ import { buildRoutineRenameObjectSourceStatements, supportsSourceBackedRoutineRe import { buildViewDdl } from "@/lib/viewDdl"; import { getTableStructureCapabilities } from "@/lib/tableStructureCapabilities"; import { + connectionObjectTreeNodeSchema, connectionObjectTreeQuerySchema, connectionUsesDatabaseObjectTreeMode, effectiveDatabaseTypeForConnection, @@ -753,7 +754,7 @@ async function openData() { table: node.label, dbType: config?.db_type, }); - const tableSchema = connectionUsesDatabaseObjectTreeMode(config) ? undefined : node.schema; + const tableSchema = connectionObjectTreeNodeSchema(config, node.database, node.schema); const tabId = (() => { if (settingsStore.editorSettings.reuseDataTab) { const existing = queryStore.tabs.find( diff --git a/apps/desktop/src/lib/databaseCapabilitySets.ts b/apps/desktop/src/lib/databaseCapabilitySets.ts index 27f7de8c6..c0c7dcac1 100644 --- a/apps/desktop/src/lib/databaseCapabilitySets.ts +++ b/apps/desktop/src/lib/databaseCapabilitySets.ts @@ -25,6 +25,7 @@ export const SCHEMA_AWARE_TYPES = new Set([ "snowflake", "trino", "hive", + "databend", "db2", "tdengine", "xugu", @@ -242,6 +243,7 @@ export const AGENT_DRIVER_TYPES = new Set([ "vastbase", "yashandb", "goldendb", + "databend", "databricks", "saphana", "teradata", diff --git a/apps/desktop/src/lib/jdbcDialect.ts b/apps/desktop/src/lib/jdbcDialect.ts index 05469848c..4df3d4d3a 100644 --- a/apps/desktop/src/lib/jdbcDialect.ts +++ b/apps/desktop/src/lib/jdbcDialect.ts @@ -2,6 +2,7 @@ import type { ConnectionConfig, DatabaseType } from "@/types/database"; import { isSchemaAware, usesDatabaseObjectTreeMode } from "@/lib/databaseFeatureSupport"; const JDBC_DIALECT_MATCHERS: Array<{ type: DatabaseType; patterns: RegExp[] }> = [ + { type: "databend", patterns: [/jdbc:databend:/i, /com\.databend\.jdbc\.DatabendDriver/i, /databend-jdbc/i] }, { type: "starrocks", patterns: [/starrocks/i] }, { type: "doris", patterns: [/doris/i] }, { type: "hive", patterns: [/org\.apache\.hive\.jdbc\.HiveDriver/i, /hive-jdbc/i] }, @@ -45,6 +46,12 @@ export function connectionUsesDatabaseObjectTreeMode( return true; } +export function connectionUsesSchemaExecutionContext( + connection?: Pick, +): boolean { + return connection?.db_type === "jdbc" && inferJdbcDialect(connection) === "databend"; +} + export function connectionObjectTreeQuerySchema( connection: | Pick @@ -52,6 +59,7 @@ export function connectionObjectTreeQuerySchema( database: string, schema?: string, ): string { + if (connection?.db_type === "jdbc" && inferJdbcDialect(connection) === "databend") return schema || database; if (connectionUsesDatabaseObjectTreeMode(connection)) return ""; return schema || database; } @@ -63,6 +71,7 @@ export function connectionObjectTreeNodeSchema( database: string, schema?: string, ): string | undefined { + if (connection?.db_type === "jdbc" && inferJdbcDialect(connection) === "databend") return schema || database; if (connectionUsesDatabaseObjectTreeMode(connection)) return undefined; if (schema) return schema; const type = connection?.db_type === "jdbc" ? effectiveDatabaseTypeForConnection(connection) : connection?.db_type; diff --git a/apps/desktop/src/lib/tableSelectSql.ts b/apps/desktop/src/lib/tableSelectSql.ts index bed3ae062..0e6500b38 100644 --- a/apps/desktop/src/lib/tableSelectSql.ts +++ b/apps/desktop/src/lib/tableSelectSql.ts @@ -19,7 +19,13 @@ export interface BuildTableSelectSqlOptions { export function quoteTableIdentifier(databaseType: DatabaseType | undefined, name: string): string { if (databaseType === "iotdb") return name; if (databaseType === "jdbc") return quoteJdbcIdentifier(name); - if (databaseType === "mysql" || databaseType === "hive" || databaseType === "tdengine" || databaseType === "access") + if ( + databaseType === "mysql" || + databaseType === "hive" || + databaseType === "databend" || + databaseType === "tdengine" || + databaseType === "access" + ) return `\`${name.replace(/`/g, "``")}\``; if (databaseType === "informix" && /^[A-Za-z_][A-Za-z0-9_$]*$/.test(name)) return name; if (databaseType === "neo4j") return quoteCypherIdentifier(name); diff --git a/apps/desktop/src/stores/queryStore.ts b/apps/desktop/src/stores/queryStore.ts index 411433b4c..dd0349d36 100644 --- a/apps/desktop/src/stores/queryStore.ts +++ b/apps/desktop/src/stores/queryStore.ts @@ -30,7 +30,11 @@ import { editablePrimaryKeys } from "@/lib/tableEditing"; import { TABLE_DATA_EXPORT_PAGE_SIZE } from "@/lib/tableDataExport"; import { tableMetaForDataTab } from "@/lib/tableDataTabMeta"; import { quoteTableIdentifier } from "@/lib/tableSelectSql"; -import { connectionUsesDatabaseObjectTreeMode, effectiveDatabaseTypeForConnection } from "@/lib/jdbcDialect"; +import { + connectionUsesDatabaseObjectTreeMode, + connectionUsesSchemaExecutionContext, + effectiveDatabaseTypeForConnection, +} from "@/lib/jdbcDialect"; import { queryTimeoutSecsForConnection } from "@/lib/queryTimeout"; import { clearDataGridPendingSnapshotsForTab } from "@/composables/useDataGridEditor"; import { @@ -1161,8 +1165,11 @@ export const useQueryStore = defineStore("query", () => { ...(clientSessionId ? { clientSessionId } : {}), timeoutSecs: queryTimeoutSecs, }; - const executionSchema = - tab.mode === "data" || connectionUsesDatabaseObjectTreeMode(conn) ? undefined : tab.schema; + const executionSchema = connectionUsesSchemaExecutionContext(conn) + ? tab.schema || tab.database + : tab.mode === "data" || connectionUsesDatabaseObjectTreeMode(conn) + ? undefined + : tab.schema; const executionPromise = api.executeMulti( tab.connectionId, tab.database, diff --git a/apps/desktop/src/types/database.ts b/apps/desktop/src/types/database.ts index 962138f0c..4ce933cee 100644 --- a/apps/desktop/src/types/database.ts +++ b/apps/desktop/src/types/database.ts @@ -12,6 +12,7 @@ export type DatabaseType = | "elasticsearch" | "doris" | "starrocks" + | "databend" | "redshift" | "dameng" | "gaussdb" diff --git a/crates/dbx-core/assets/database-drivers.manifest.json b/crates/dbx-core/assets/database-drivers.manifest.json index ca14731c8..3724014c6 100644 --- a/crates/dbx-core/assets/database-drivers.manifest.json +++ b/crates/dbx-core/assets/database-drivers.manifest.json @@ -200,6 +200,17 @@ "skipTcpProbe": true, "defaultPort": 3306 }, + { + "dbType": "databend", + "label": "Databend", + "runtimeMode": "agent", + "mcpMode": "bridge", + "agentKey": "databend", + "singleConnectionPool": false, + "metadataConnectionScoped": false, + "skipTcpProbe": true, + "defaultPort": 8000 + }, { "dbType": "gaussdb", "label": "GaussDB", diff --git a/crates/dbx-core/src/agent_catalog.rs b/crates/dbx-core/src/agent_catalog.rs index 8cc6b6b8a..5764ac189 100644 --- a/crates/dbx-core/src/agent_catalog.rs +++ b/crates/dbx-core/src/agent_catalog.rs @@ -61,6 +61,13 @@ const AGENT_CATALOG: &[AgentCatalogEntry] = &[ store_visible: true, profiles: &[], }, + AgentCatalogEntry { + db_type: DatabaseType::Databend, + key: "databend", + label: "Databend", + store_visible: true, + profiles: &[], + }, AgentCatalogEntry { db_type: DatabaseType::Databricks, key: "databricks", diff --git a/crates/dbx-core/src/connection.rs b/crates/dbx-core/src/connection.rs index cf07a4de9..b34d7e06c 100644 --- a/crates/dbx-core/src/connection.rs +++ b/crates/dbx-core/src/connection.rs @@ -321,7 +321,7 @@ impl AppState { connect_mysql_metadata_pool(&config, &db_config, &host, port, connect_timeout).await?; PoolKind::Mysql(pool, mode) } - DatabaseType::Doris | DatabaseType::StarRocks => { + DatabaseType::Doris | DatabaseType::StarRocks | DatabaseType::Databend => { let pool = if database.is_none() { connect_bare_metadata_pool(&db_config, &host, port, connect_timeout).await? } else { diff --git a/crates/dbx-core/src/models/connection.rs b/crates/dbx-core/src/models/connection.rs index 20588c360..6e6972534 100644 --- a/crates/dbx-core/src/models/connection.rs +++ b/crates/dbx-core/src/models/connection.rs @@ -214,6 +214,7 @@ pub enum DatabaseType { Doris, #[serde(rename = "starrocks")] StarRocks, + Databend, Redshift, Dameng, Kingbase, @@ -606,7 +607,7 @@ impl ConnectionConfig { let fragment = self.redis_tls_insecure_fragment(); format!("{scheme}://{host}:{port}/{fragment}") } - DatabaseType::Mysql | DatabaseType::Doris | DatabaseType::StarRocks => { + DatabaseType::Mysql | DatabaseType::Doris | DatabaseType::StarRocks | DatabaseType::Databend => { let suffix = if params.is_empty() { String::new() } else { format!("?{params}") }; format!("mysql://{host}:{port}{db_part}{suffix}") } @@ -719,7 +720,7 @@ impl ConnectionConfig { format!("{scheme}://{username}:{password}@{host}:{port}/{fragment}") } } - DatabaseType::Mysql | DatabaseType::Doris | DatabaseType::StarRocks => { + DatabaseType::Mysql | DatabaseType::Doris | DatabaseType::StarRocks | DatabaseType::Databend => { let suffix = if params.is_empty() { String::new() } else { format!("?{params}") }; format!("mysql://{}:{}@{host}:{port}{db_part}{suffix}", username, password) } @@ -886,7 +887,9 @@ impl ConnectionConfig { } match self.db_type { DatabaseType::Mysql => normalize_mysql_url_params(value, self.ssl, self.ca_cert_path.trim().is_empty()), - DatabaseType::Doris | DatabaseType::StarRocks => normalize_bare_mysql_url_params(value), + DatabaseType::Doris | DatabaseType::StarRocks | DatabaseType::Databend => { + normalize_bare_mysql_url_params(value) + } DatabaseType::Postgres | DatabaseType::Redshift => normalize_postgres_url_params(value, self.ssl), DatabaseType::MongoDb => value.trim_start_matches('?').to_string(), _ => value.trim_start_matches('?').to_string(), diff --git a/crates/dbx-core/src/sql_dialect.rs b/crates/dbx-core/src/sql_dialect.rs index 747a0582a..ca78360d5 100644 --- a/crates/dbx-core/src/sql_dialect.rs +++ b/crates/dbx-core/src/sql_dialect.rs @@ -213,6 +213,7 @@ pub fn quote_table_identifier(database_type: Option, name: &str) - Some( DatabaseType::Mysql | DatabaseType::Hive + | DatabaseType::Databend | DatabaseType::Tdengine | DatabaseType::Access | DatabaseType::Bigquery, @@ -418,6 +419,7 @@ pub fn is_schema_aware(database_type: DatabaseType) -> bool { | DatabaseType::OpenGauss | DatabaseType::OceanbaseOracle | DatabaseType::Gbase + | DatabaseType::Databend | DatabaseType::Jdbc | DatabaseType::H2 | DatabaseType::Snowflake @@ -472,6 +474,7 @@ mod tests { assert_eq!(qualified_table_name(Some(DatabaseType::Postgres), Some("public"), "users"), "\"public\".\"users\""); assert_eq!(qualified_table_name(Some(DatabaseType::Kwdb), Some("public"), "users"), "\"public\".\"users\""); assert_eq!(qualified_table_name(Some(DatabaseType::Mysql), Some("public"), "users"), "`users`"); + assert_eq!(qualified_table_name(Some(DatabaseType::Databend), Some("dbx_test"), "users"), "`dbx_test`.`users`"); assert_eq!(qualified_table_name(Some(DatabaseType::Jdbc), Some("cbsdw_dwd"), "dwd_test_df"), "dwd_test_df"); assert_eq!(qualified_table_name(Some(DatabaseType::Iotdb), Some("root.test"), "device2"), "root.test.device2"); assert_eq!( @@ -529,6 +532,17 @@ mod tests { }), "SELECT * FROM dwd_test_df LIMIT 100;" ); + assert_eq!( + build_table_select_sql(TableSelectSqlOptions { + database_type: Some(DatabaseType::Databend), + schema: Some("dbx_test"), + table_name: "jdbc_probe", + columns: &[], + order_columns: &[], + limit: 500, + }), + "SELECT * FROM `dbx_test`.`jdbc_probe` LIMIT 500;" + ); assert_eq!( build_table_select_sql(TableSelectSqlOptions { database_type: Some(DatabaseType::Hive), diff --git a/crates/dbx-core/tests/database_capabilities.rs b/crates/dbx-core/tests/database_capabilities.rs index 2d63f6509..ecec3b9e4 100644 --- a/crates/dbx-core/tests/database_capabilities.rs +++ b/crates/dbx-core/tests/database_capabilities.rs @@ -62,6 +62,7 @@ fn maps_agent_database_types_to_driver_keys() { assert_eq!(agent_key(&DatabaseType::Gbase, None), Some("gbase")); assert_eq!(agent_key(&DatabaseType::Access, None), Some("access")); assert_eq!(agent_key(&DatabaseType::Oracle, None), Some("oracle")); + assert_eq!(agent_key(&DatabaseType::Databend, None), Some("databend")); assert_eq!(agent_key(&DatabaseType::Oracle, Some("oracle-legacy")), Some("oracle-legacy")); assert_eq!(agent_key(&DatabaseType::Oracle, Some("oracle-10g")), Some("oracle-10g")); assert_eq!(agent_key(&DatabaseType::Postgres, None), None); @@ -84,6 +85,7 @@ fn classifies_agent_database_types() { assert!(is_agent_type(&DatabaseType::OceanbaseOracle)); assert!(is_agent_type(&DatabaseType::Gbase)); assert!(is_agent_type(&DatabaseType::Access)); + assert!(is_agent_type(&DatabaseType::Databend)); assert!(!is_agent_type(&DatabaseType::Mysql)); assert!(!is_agent_type(&DatabaseType::Jdbc)); assert!(!is_agent_type(&DatabaseType::Gaussdb)); @@ -132,6 +134,7 @@ fn skips_tcp_probe_for_local_file_plugin_and_agent_types() { assert!(skips_tcp_probe(&DatabaseType::Databricks)); assert!(skips_tcp_probe(&DatabaseType::OceanbaseOracle)); assert!(skips_tcp_probe(&DatabaseType::Gbase)); + assert!(skips_tcp_probe(&DatabaseType::Databend)); assert!(!skips_tcp_probe(&DatabaseType::Postgres)); assert!(!skips_tcp_probe(&DatabaseType::Mysql)); assert!(!skips_tcp_probe(&DatabaseType::Gaussdb)); diff --git a/packages/app-tests/jdbcDialect.test.ts b/packages/app-tests/jdbcDialect.test.ts index 30ac25ba8..b4c3e7d5e 100644 --- a/packages/app-tests/jdbcDialect.test.ts +++ b/packages/app-tests/jdbcDialect.test.ts @@ -1,7 +1,9 @@ import assert from "node:assert/strict"; import test from "node:test"; import { + connectionObjectTreeNodeSchema, connectionObjectTreeQuerySchema, + connectionUsesSchemaExecutionContext, connectionUsesDatabaseObjectTreeMode, effectiveDatabaseTypeForConnection, inferJdbcDialect, @@ -19,9 +21,10 @@ test("infers JDBC dialect from URL, driver class, and driver jar path", () => { "mysql", ); assert.equal(inferJdbcDialect({ db_type: "jdbc", jdbc_driver_class: "org.apache.hive.jdbc.HiveDriver" }), "hive"); + assert.equal(inferJdbcDialect({ db_type: "jdbc", jdbc_driver_paths: ["/drivers/starrocks-jdbc.jar"] }), "starrocks"); assert.equal( - inferJdbcDialect({ db_type: "jdbc", jdbc_driver_paths: ["/drivers/starrocks-jdbc.jar"] }), - "starrocks", + inferJdbcDialect({ db_type: "jdbc", connection_string: "jdbc:databend://db.example.com:8000/default" }), + "databend", ); }); @@ -29,12 +32,18 @@ test("effective database type keeps non-JDBC types and enables compatible JDBC s assert.equal(effectiveDatabaseTypeForConnection({ db_type: "postgres" }), "postgres"); assert.equal(effectiveDatabaseTypeForConnection({ db_type: "jdbc" }), "jdbc"); assert.equal( - effectiveDatabaseTypeForConnection({ db_type: "jdbc", jdbc_driver_class: "org.apache.kyuubi.jdbc.KyuubiHiveDriver" }), + effectiveDatabaseTypeForConnection({ + db_type: "jdbc", + jdbc_driver_class: "org.apache.kyuubi.jdbc.KyuubiHiveDriver", + }), "mysql", ); assert.equal( supportsTableStructureEditing( - effectiveDatabaseTypeForConnection({ db_type: "jdbc", jdbc_driver_class: "org.apache.kyuubi.jdbc.KyuubiHiveDriver" }), + effectiveDatabaseTypeForConnection({ + db_type: "jdbc", + jdbc_driver_class: "org.apache.kyuubi.jdbc.KyuubiHiveDriver", + }), ), true, ); @@ -58,3 +67,21 @@ test("JDBC tree shape follows the inferred driver dialect", () => { "`test`.`dws_event_analyse`", ); }); + +test("Databend JDBC keeps database as schema context for table data", () => { + const databend = { db_type: "jdbc" as const, connection_string: "jdbc:databend://db.example.com:8000/dbx_test" }; + + assert.equal(effectiveDatabaseTypeForConnection(databend), "databend"); + assert.equal(connectionUsesDatabaseObjectTreeMode(databend), true); + assert.equal(connectionUsesSchemaExecutionContext(databend), true); + assert.equal(connectionObjectTreeQuerySchema(databend, "dbx_test", undefined), "dbx_test"); + assert.equal(connectionObjectTreeNodeSchema(databend, "dbx_test", undefined), "dbx_test"); + assert.equal( + qualifiedTableName({ + databaseType: effectiveDatabaseTypeForConnection(databend), + schema: connectionObjectTreeNodeSchema(databend, "dbx_test", undefined), + tableName: "jdbc_probe", + }), + "`dbx_test`.`jdbc_probe`", + ); +}); diff --git a/packages/mcp-server/src/index.ts b/packages/mcp-server/src/index.ts index 91d17ec2d..51559b19d 100644 --- a/packages/mcp-server/src/index.ts +++ b/packages/mcp-server/src/index.ts @@ -46,7 +46,7 @@ function formatQueryToolResult(result: QueryResult, title?: string) { } export const DBX_CONNECTION_TYPE_DESCRIPTION = - "Database type: postgres, mysql, sqlite, rqlite, redis, duckdb, clickhouse, sqlserver, mongodb, oracle, elasticsearch, doris, starrocks, redshift, dameng, kingbase, highgo, vastbase, goldendb, gaussdb, kwdb, yashandb, databricks, saphana, teradata, vertica, firebird, exasol, opengauss, oceanbase-oracle, gbase, h2, snowflake, trino, hive, db2, informix, iris, neo4j, cassandra, bigquery, kylin, sundb, tdengine, iotdb, xugu, jdbc, access"; + "Database type: postgres, mysql, sqlite, rqlite, redis, duckdb, clickhouse, sqlserver, mongodb, oracle, elasticsearch, doris, starrocks, redshift, dameng, kingbase, highgo, vastbase, goldendb, databend, gaussdb, kwdb, yashandb, databricks, saphana, teradata, vertica, firebird, exasol, opengauss, oceanbase-oracle, gbase, h2, snowflake, trino, hive, db2, informix, iris, neo4j, cassandra, bigquery, kylin, sundb, tdengine, iotdb, xugu, jdbc, access"; export function createDbxMcpServer(backend: Backend, options: { isWebMode?: boolean } = {}): McpServer { const isWebMode = options.isWebMode ?? !!process.env.DBX_WEB_URL; diff --git a/packages/node-core/src/diagnostics.ts b/packages/node-core/src/diagnostics.ts index dfbbe33af..6bd4707a1 100644 --- a/packages/node-core/src/diagnostics.ts +++ b/packages/node-core/src/diagnostics.ts @@ -36,6 +36,7 @@ export const BRIDGE_REQUIRED_TYPES = [ "highgo", "vastbase", "goldendb", + "databend", "yashandb", "databricks", "saphana",