fix(dameng): expose sequences and packages

This commit is contained in:
t8y2
2026-08-02 00:42:48 +08:00
parent e33d8acb96
commit 21100ec22b
5 changed files with 76 additions and 4 deletions
@@ -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);
@@ -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();
@@ -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(
@@ -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", () => {
@@ -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<DatabaseType, SidebarObjectKind[]>([
@@ -32,7 +33,7 @@ const DATABASE_TYPE_OBJECTS = new Map<DatabaseType, SidebarObjectKind[]>([
["redshift", POSTGRES_LIKE_OBJECTS],
// oracle
["oracle", ORACLE_OBJECTS],
["dameng", ORACLE_OBJECTS],
["dameng", DAMENG_OBJECTS],
["oceanbase-oracle", ORACLE_OBJECTS],
["xugu", XUGU_OBJECTS],
// table and view