From 605e266eab2cc43d35440cf3dff5504664ddf724 Mon Sep 17 00:00:00 2001 From: jonclex Date: Mon, 13 Apr 2026 10:16:37 +0800 Subject: [PATCH] fix(sidebar): normalize mysql view names (#365) --- frontend/src/components/Sidebar.tsx | 3 ++- frontend/src/utils/sidebarMetadata.ts | 37 +++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 frontend/src/utils/sidebarMetadata.ts diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx index f1ac23f..fa7ed30 100644 --- a/frontend/src/components/Sidebar.tsx +++ b/frontend/src/components/Sidebar.tsx @@ -45,6 +45,7 @@ import { getTableDataDangerActionMeta, supportsTableTruncateAction, type TableDa import { useAutoFetchVisibility } from '../utils/autoFetchVisibility'; import FindInDatabaseModal from './FindInDatabaseModal'; import { buildRpcConnectionConfig } from '../utils/connectionRpcConfig'; +import { normalizeSidebarViewName } from '../utils/sidebarMetadata'; const { Search } = Input; @@ -794,7 +795,7 @@ const Sidebar: React.FC<{ onEditConnection?: (conn: SavedConnection) => void }> getCaseInsensitiveValue(row, ['view_name', 'viewname', 'table_name', 'name']) || getMySQLShowTablesName(row) || getFirstRowValue(row); - const fullName = buildQualifiedName(schemaName, viewName); + const fullName = normalizeSidebarViewName(dialect, dbName, schemaName, viewName); if (!fullName || seen.has(fullName)) return; seen.add(fullName); views.push(fullName); diff --git a/frontend/src/utils/sidebarMetadata.ts b/frontend/src/utils/sidebarMetadata.ts new file mode 100644 index 0000000..81837a6 --- /dev/null +++ b/frontend/src/utils/sidebarMetadata.ts @@ -0,0 +1,37 @@ +const splitQualifiedName = (qualifiedName: string): { schemaName: string; objectName: string } => { + const raw = String(qualifiedName || '').trim(); + if (!raw) return { schemaName: '', objectName: '' }; + const idx = raw.lastIndexOf('.'); + if (idx <= 0 || idx >= raw.length - 1) { + return { schemaName: '', objectName: raw }; + } + return { + schemaName: raw.substring(0, idx), + objectName: raw.substring(idx + 1), + }; +}; + +export const normalizeSidebarViewName = (dialect: string, dbName: string, schemaName: string, viewName: string): string => { + const normalizedDialect = String(dialect || '').trim().toLowerCase(); + const normalizedDbName = String(dbName || '').trim(); + const normalizedSchemaName = String(schemaName || '').trim(); + const normalizedViewName = String(viewName || '').trim(); + + if (!normalizedViewName) { + return ''; + } + + if (normalizedDialect === 'mysql') { + const parsed = splitQualifiedName(normalizedViewName); + if (parsed.objectName) { + return parsed.objectName; + } + return normalizedViewName; + } + + if (!normalizedSchemaName || normalizedViewName.includes('.')) { + return normalizedViewName; + } + + return `${normalizedSchemaName}.${normalizedViewName}`; +};