🐛 fix(frontend): 修复 DuckDB 对象编辑与安全修改回归

- 修复 DuckDB qualified table 在查询结果页丢失 schema 导致无法识别主键的问题

- 打开对象修改前强制刷新最新定义,并避免切换对象失败时沿用旧定义

- 为 DuckDB 元数据链路补充前后端回归测试,并给 app 层真实 runtime 测试增加环境门槛
This commit is contained in:
Syngnat
2026-06-04 22:00:55 +08:00
parent a664f1a869
commit 274c32ebdd
10 changed files with 802 additions and 189 deletions

View File

@@ -48,6 +48,15 @@ describe('extractQueryResultTableRef', () => {
});
});
it('keeps DuckDB schema-qualified table names for metadata lookups', () => {
expect(extractQueryResultTableRef('SELECT * FROM main.events LIMIT 500', 'duckdb', 'main'))
.toEqual({
tableName: 'main.events',
metadataDbName: 'main',
metadataTableName: 'main.events',
});
});
it('does not mark join results as editable table refs', () => {
expect(extractQueryResultTableRef('SELECT * FROM users u JOIN orders o ON u.id = o.user_id', 'oracle', 'APP'))
.toBeUndefined();

View File

@@ -21,6 +21,11 @@ const isOracleLikeDialect = (dialect: string): boolean => {
return normalized === 'oracle' || normalized === 'dameng' || normalized === 'dm' || normalized === 'dm8';
};
const keepsQualifiedTableNameForMetadata = (dialect: string): boolean => {
const normalized = String(dialect || '').trim().toLowerCase();
return normalized === 'duckdb';
};
const isQuotedIdentifier = (part: string): boolean => {
const text = String(part || '').trim();
if (!text) return false;
@@ -73,13 +78,16 @@ export const extractQueryResultTableRef = (
const owner = parts.length >= 2 ? parts[parts.length - 2] : '';
const metadataDbName = owner || normalizeCurrentDbName(currentDb, dialect);
const tableName = isOracleLikeDialect(dialect) && owner
const tableName = (isOracleLikeDialect(dialect) || keepsQualifiedTableNameForMetadata(dialect)) && owner
? `${owner}.${metadataTableName}`
: metadataTableName;
const resolvedMetadataTableName = keepsQualifiedTableNameForMetadata(dialect) && owner
? `${owner}.${metadataTableName}`
: metadataTableName;
return {
tableName,
metadataDbName,
metadataTableName,
metadataTableName: resolvedMetadataTableName,
};
};