Files
MyGoNavi/frontend/src/utils/queryResultTable.test.ts
Syngnat b1ef52f62e feat(data-grid): 支持无主键表安全编辑
- 定位策略:新增主键、唯一索引和 Oracle ROWID 三类安全行定位能力
- 查询编辑器:简单单表 SELECT 自动补充隐藏定位列,复杂结果保持只读
- 表预览:无主键表可通过唯一索引或 Oracle ROWID 安全编辑
- 提交流程:移除无主键整行 WHERE fallback,隐藏定位列不参与展示和写入
- 后端保护:Oracle、MySQL、PostgreSQL 更新删除必须恰好影响 1 行
- 测试覆盖:补充 QueryEditor、DataViewer、DataGrid 和 ApplyChanges 相关用例
Refs #419
2026-04-29 12:33:35 +08:00

45 lines
1.6 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { extractQueryResultTableRef } from './queryResultTable';
describe('extractQueryResultTableRef', () => {
it('preserves Oracle schema-qualified table names for editing', () => {
expect(extractQueryResultTableRef('SELECT * FROM MYCIMLED.EDC_LOG FETCH FIRST 500 ROWS ONLY', 'oracle', 'ANONYMOUS'))
.toEqual({
tableName: 'MYCIMLED.EDC_LOG',
metadataDbName: 'MYCIMLED',
metadataTableName: 'EDC_LOG',
});
});
it('uses current schema for unqualified Oracle tables', () => {
expect(extractQueryResultTableRef('SELECT * FROM EDC_LOG', 'oracle', 'MYCIMLED'))
.toEqual({
tableName: 'EDC_LOG',
metadataDbName: 'MYCIMLED',
metadataTableName: 'EDC_LOG',
});
});
it('keeps existing simple table behavior for MySQL-style qualified names', () => {
expect(extractQueryResultTableRef('SELECT * FROM app.users LIMIT 500', 'mysql', 'app'))
.toEqual({
tableName: 'users',
metadataDbName: 'app',
metadataTableName: 'users',
});
});
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();
});
it('does not mark grouped or distinct results as editable table refs', () => {
expect(extractQueryResultTableRef('SELECT ID FROM users GROUP BY ID', 'mysql', 'app'))
.toBeUndefined();
expect(extractQueryResultTableRef('SELECT DISTINCT ID FROM users', 'mysql', 'app'))
.toBeUndefined();
});
});