From 21100ec22b19266619f56c57d9d46dccaa50b103 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sun, 2 Aug 2026 00:42:48 +0800 Subject: [PATCH] fix(dameng): expose sequences and packages --- .../com/dbx/agent/dameng/DamengAgent.java | 26 +++++++++++++++++- .../agent/dameng/DamengAgentMetadataTest.java | 20 ++++++++++++++ .../com/dbx/agent/dameng/DamengAgentTest.java | 27 +++++++++++++++++++ .../databaseObjectCapabilities.spec.ts | 4 +-- .../database/databaseObjectCapabilities.ts | 3 ++- 5 files changed, 76 insertions(+), 4 deletions(-) diff --git a/agents/drivers/dameng/src/main/java/com/dbx/agent/dameng/DamengAgent.java b/agents/drivers/dameng/src/main/java/com/dbx/agent/dameng/DamengAgent.java index 79f9aa0397..3928e3c654 100644 --- a/agents/drivers/dameng/src/main/java/com/dbx/agent/dameng/DamengAgent.java +++ b/agents/drivers/dameng/src/main/java/com/dbx/agent/dameng/DamengAgent.java @@ -406,7 +406,10 @@ public final class DamengAgent extends AbstractJdbcAgent { private static boolean includesSupportedObjectTypes(MetadataListConstraints constraints) { return constraints.includesTableLikeTypes() || constraints.objectTypeAllowed("PROCEDURE") - || constraints.objectTypeAllowed("FUNCTION"); + || constraints.objectTypeAllowed("FUNCTION") + || constraints.objectTypeAllowed("SEQUENCE") + || constraints.objectTypeAllowed("PACKAGE") + || constraints.objectTypeAllowed("PACKAGE_BODY"); } private static void appendDamengObjectTypePredicate( @@ -448,6 +451,15 @@ public final class DamengAgent extends AbstractJdbcAgent { if (constraints.objectTypeAllowed("FUNCTION")) { result.add("FUNCTION"); } + if (constraints.objectTypeAllowed("SEQUENCE")) { + result.add("SEQUENCE"); + } + if (constraints.objectTypeAllowed("PACKAGE")) { + result.add("PACKAGE"); + } + if (constraints.objectTypeAllowed("PACKAGE_BODY")) { + result.add("PACKAGE BODY"); + } return result; } @@ -473,6 +485,15 @@ public final class DamengAgent extends AbstractJdbcAgent { if (constraints.objectTypeAllowed("FUNCTION")) { result.add("FUNCTION"); } + if (constraints.objectTypeAllowed("SEQUENCE")) { + result.add("SEQUENCE"); + } + if (constraints.objectTypeAllowed("PACKAGE")) { + result.add("PACKAGE"); + } + if (constraints.objectTypeAllowed("PACKAGE_BODY")) { + result.add("PACKAGE BODY"); + } return result; } @@ -763,6 +784,9 @@ public final class DamengAgent extends AbstractJdbcAgent { case "MATERIALIZED_VIEW", "MATERIALIZED VIEW" -> "MATERIALIZED_VIEW"; case "PROCEDURE" -> "PROCEDURE"; case "FUNCTION" -> "FUNCTION"; + case "SEQUENCE" -> "SEQUENCE"; + case "PACKAGE" -> "PKG_SPEC"; + case "PACKAGE_BODY", "PACKAGE BODY" -> "PKG_BODY"; // DM DBMS_METADATA accepts TRIGGER directly and returns executable CREATE OR REPLACE DDL. case "TRIGGER" -> "TRIGGER"; default -> throw new IllegalArgumentException("Unsupported object type: " + objectType); diff --git a/agents/drivers/dameng/src/test/java/com/dbx/agent/dameng/DamengAgentMetadataTest.java b/agents/drivers/dameng/src/test/java/com/dbx/agent/dameng/DamengAgentMetadataTest.java index 585481e33d..406a1dabab 100644 --- a/agents/drivers/dameng/src/test/java/com/dbx/agent/dameng/DamengAgentMetadataTest.java +++ b/agents/drivers/dameng/src/test/java/com/dbx/agent/dameng/DamengAgentMetadataTest.java @@ -196,6 +196,26 @@ class DamengAgentMetadataTest { Assertions.assertEquals("用户示例表", objects.get(0).getComment()); } + @Test + void queriesSequencesAndPackagesWhenRequested() { + DamengAgent agent = new DamengAgent(); + TestSupport.setPrivateConnection(agent, JdbcMetadataSqlFake.connection()); + + agent.listObjects( + "APP", + new MetadataListConstraints(null, 20, null, List.of("SEQUENCE", "PACKAGE", "PACKAGE_BODY")) + ); + + String objectsSql = JdbcMetadataSqlFake.statements.stream() + .filter(sql -> sql.contains("FROM ALL_OBJECTS o")) + .findFirst() + .orElseThrow(); + Assertions.assertTrue(objectsSql.contains("o.OBJECT_TYPE IN (?, ?, ?)"), objectsSql); + Assertions.assertTrue(JdbcMetadataSqlFake.statements.contains("param:2=SEQUENCE")); + Assertions.assertTrue(JdbcMetadataSqlFake.statements.contains("param:3=PACKAGE")); + Assertions.assertTrue(JdbcMetadataSqlFake.statements.contains("param:4=PACKAGE BODY")); + } + @Test void fallsBackToJdbcMetadataForRestrictedSchemaObjects() { DamengAgent agent = new DamengAgent(); diff --git a/agents/drivers/dameng/src/test/java/com/dbx/agent/dameng/DamengAgentTest.java b/agents/drivers/dameng/src/test/java/com/dbx/agent/dameng/DamengAgentTest.java index 128a647479..fb80de5f40 100644 --- a/agents/drivers/dameng/src/test/java/com/dbx/agent/dameng/DamengAgentTest.java +++ b/agents/drivers/dameng/src/test/java/com/dbx/agent/dameng/DamengAgentTest.java @@ -79,6 +79,10 @@ class DamengAgentTest extends JdbcFakeExecutionBehaviorTest { assertEquals("MATERIALIZED_VIEW", DamengAgent.damengDdlObjectType("MATERIALIZED_VIEW")); assertEquals("PROCEDURE", DamengAgent.damengDdlObjectType("PROCEDURE")); assertEquals("FUNCTION", DamengAgent.damengDdlObjectType("function")); + assertEquals("SEQUENCE", DamengAgent.damengDdlObjectType("sequence")); + assertEquals("PKG_SPEC", DamengAgent.damengDdlObjectType("package")); + assertEquals("PKG_BODY", DamengAgent.damengDdlObjectType("package body")); + assertEquals("PKG_BODY", DamengAgent.damengDdlObjectType("PACKAGE_BODY")); assertEquals("TRIGGER", DamengAgent.damengDdlObjectType("trigger")); assertThrows(IllegalArgumentException.class, () -> DamengAgent.damengDdlObjectType("TABLE")); } @@ -220,6 +224,29 @@ class DamengAgentTest extends JdbcFakeExecutionBehaviorTest { assertEquals(List.of("APP", "PROCEDURE", "FUNCTION", "%S%Y%N%C%", 20), query.args()); } + @Test + void constrainedObjectQueryIncludesSequencesAndPackages() { + DamengAgent.MetadataQuery query = DamengAgent.buildConstrainedObjectsQuery( + "APP", + new MetadataListConstraints(null, 20, null, List.of("SEQUENCE", "PACKAGE", "PACKAGE_BODY")) + ); + + assertFalse(query.sql().contains("SYS.SYSOBJECTS materialized_view")); + assertTrue(query.sql().contains("o.OBJECT_TYPE IN (?, ?, ?)")); + assertEquals(List.of("APP", "SEQUENCE", "PACKAGE", "PACKAGE BODY", 20), query.args()); + } + + @Test + void rawObjectQueryIncludesDamengPackageBodyCatalogType() { + DamengAgent.MetadataQuery query = DamengAgent.buildRawConstrainedObjectsQuery( + "APP", + new MetadataListConstraints(null, null, null, List.of("SEQUENCE", "PACKAGE", "PACKAGE_BODY")) + ); + + assertTrue(query.sql().contains("o.OBJECT_TYPE IN (?, ?, ?)")); + assertEquals(List.of("APP", "SEQUENCE", "PACKAGE", "PACKAGE BODY"), query.args()); + } + @Test void constrainedTableQueryEscapesDamengLikeWildcardsWithSingleCharacter() { DamengAgent.MetadataQuery query = DamengAgent.buildConstrainedTablesQuery( diff --git a/apps/desktop/src/lib/__tests__/database/databaseObjectCapabilities.spec.ts b/apps/desktop/src/lib/__tests__/database/databaseObjectCapabilities.spec.ts index d2755bb817..586f44cff9 100644 --- a/apps/desktop/src/lib/__tests__/database/databaseObjectCapabilities.spec.ts +++ b/apps/desktop/src/lib/__tests__/database/databaseObjectCapabilities.spec.ts @@ -2,8 +2,8 @@ import { describe, expect, it } from "vitest"; import { normalizeSidebarObjectKind, sidebarObjectKindsForDatabase } from "@/lib/database/databaseObjectCapabilities"; describe("databaseObjectCapabilities", () => { - it("exposes materialized views for Dameng", () => { - expect(sidebarObjectKindsForDatabase("dameng")).toContain("MATERIALIZED_VIEW"); + it("exposes supported programmable objects for Dameng", () => { + expect(sidebarObjectKindsForDatabase("dameng")).toEqual(expect.arrayContaining(["MATERIALIZED_VIEW", "SEQUENCE", "PACKAGE", "PACKAGE_BODY"])); }); it("exposes synonyms for Xugu only", () => { diff --git a/apps/desktop/src/lib/database/databaseObjectCapabilities.ts b/apps/desktop/src/lib/database/databaseObjectCapabilities.ts index 5e08c1fec1..3db64f9dfc 100644 --- a/apps/desktop/src/lib/database/databaseObjectCapabilities.ts +++ b/apps/desktop/src/lib/database/databaseObjectCapabilities.ts @@ -16,6 +16,7 @@ const ROUTINE_OBJECTS: SidebarObjectKind[] = ["TABLE", "VIEW", "PROCEDURE", "FUN const POSTGRES_OBJECTS: SidebarObjectKind[] = ["TABLE", "VIEW", "MATERIALIZED_VIEW", "PROCEDURE", "FUNCTION", "SEQUENCE"]; const POSTGRES_LIKE_OBJECTS: SidebarObjectKind[] = ["TABLE", "VIEW", "MATERIALIZED_VIEW", "PROCEDURE", "FUNCTION"]; const ORACLE_OBJECTS: SidebarObjectKind[] = ["TABLE", "VIEW", "MATERIALIZED_VIEW", "PROCEDURE", "FUNCTION", "PACKAGE", "PACKAGE_BODY"]; +const DAMENG_OBJECTS: SidebarObjectKind[] = ["TABLE", "VIEW", "MATERIALIZED_VIEW", "PROCEDURE", "FUNCTION", "SEQUENCE", "PACKAGE", "PACKAGE_BODY"]; const XUGU_OBJECTS: SidebarObjectKind[] = ["TABLE", "VIEW", "PROCEDURE", "FUNCTION", "TRIGGER", "SEQUENCE", "SYNONYM", "PACKAGE", "PACKAGE_BODY", "TYPE", "TYPE_BODY"]; const DATABASE_TYPE_OBJECTS = new Map([ @@ -32,7 +33,7 @@ const DATABASE_TYPE_OBJECTS = new Map([ ["redshift", POSTGRES_LIKE_OBJECTS], // oracle ["oracle", ORACLE_OBJECTS], - ["dameng", ORACLE_OBJECTS], + ["dameng", DAMENG_OBJECTS], ["oceanbase-oracle", ORACLE_OBJECTS], ["xugu", XUGU_OBJECTS], // table and view