fix(postgres): preserve overloaded routine signatures

This commit is contained in:
amwps290 authored and GitHub committed 2026-07-21 16:58:12 +08:00
1 parent 4b2a6c971a
commit 727290fa32
6 files changed
+36 -11

No files matched your search

+19 -1
View File
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { appendTableTreeLoadMoreNode, buildSimpleObjectTreeNodes, buildTableTreeNodes, mergeTableTreePageChildren, tablePartitionGroups, withoutTableTreeLoadMoreNodes } from "@/lib/table/tableTree";
import { appendTableTreeLoadMoreNode, buildGroupedObjectTreeNodes, buildSimpleObjectTreeNodes, buildTableTreeNodes, mergeTableTreePageChildren, tablePartitionGroups, withoutTableTreeLoadMoreNodes } from "@/lib/table/tableTree";
import type { ObjectInfo, TableInfo, TreeNode } from "@/types/database";
const context = {
@@ -27,6 +27,24 @@ describe("PostgreSQL overloaded routines", () => {
);
expect(new Set(nodes.map((node) => node.id)).size).toBe(3);
});
it("keeps grouped routine nodes distinct by identity arguments", () => {
const objects: ObjectInfo[] = [
{ name: "calc", object_type: "FUNCTION", schema: "public", signature: "integer" },
{ name: "calc", object_type: "FUNCTION", schema: "public", signature: "integer, integer" },
{ name: "calc", object_type: "FUNCTION", schema: "public", signature: "numeric" },
];
const groups = buildGroupedObjectTreeNodes({ ...context, schema: "public", objects });
const functionGroup = groups.find((node) => node.type === "group-functions");
expect(functionGroup?.children?.map((node) => ({ label: node.label, objectName: node.objectName, signature: node.signature }))).toEqual([
{ label: "calc(integer)", objectName: "calc", signature: "integer" },
{ label: "calc(integer, integer)", objectName: "calc", signature: "integer, integer" },
{ label: "calc(numeric)", objectName: "calc", signature: "numeric" },
]);
expect(new Set(functionGroup?.children?.map((node) => node.id) ?? []).size).toBe(3);
});
});
describe("programmable database objects", () => {
+8 -3
View File
@@ -668,7 +668,8 @@ export function buildGroupedObjectTreeNodes({ nodeId, connectionId, database, sc
if (!name) continue;
const t = normalizeObjectType(obj.object_type);
const objectSchema = obj.schema ? normalizeDatabaseObjectName(obj.schema) : schema || "";
const key = `${t}\0${objectSchema.toLowerCase()}\0${name.toLowerCase()}`;
const signature = (obj.signature ?? "").trim();
const key = `${t}\0${objectSchema.toLowerCase()}\0${name.toLowerCase()}\0${signature.toLowerCase()}`;
if (seen.has(key)) continue;
seen.add(key);
const arr = buckets.get(t) ?? [];
@@ -695,10 +696,14 @@ export function buildGroupedObjectTreeNodes({ nodeId, connectionId, database, sc
const objectType = normalizeObjectType(obj.object_type);
const childType = typeof def.childType === "function" ? def.childType(objectType) : def.childType;
const objectTypeSuffix = objectType === "PACKAGE" || objectType === "PACKAGE_BODY" || objectType === "TYPE" || objectType === "TYPE_BODY" ? `:${objectType}` : "";
const signature = obj.signature?.trim() || "";
const signatureIdPart = signature && (objectType === "FUNCTION" || objectType === "PROCEDURE") ? `:${signature}` : "";
return {
id: `${nodeId}:${def.key}:${childSchema ? `${childSchema}:` : ""}${obj.name}${objectTypeSuffix}`,
label: obj.name,
id: `${nodeId}:${def.key}:${childSchema ? `${childSchema}:` : ""}${obj.name}${signatureIdPart}${objectTypeSuffix}`,
label: signature && (objectType === "FUNCTION" || objectType === "PROCEDURE") ? `${obj.name}(${signature})` : obj.name,
type: childType,
objectName: obj.name,
signature: signature || undefined,
comment: obj.comment,
valid: obj.valid ?? undefined,
connectionId,