Files
MyGoNavi/frontend/src/utils/aiSqlLimit.test.ts
Syngnat 51675f9d05 🐛 fix(ai): 修复多方言执行与 DDL 降级
- SQL 执行:移除 AI 工具和代码块预览中硬编码的 LIMIT 50
- 方言适配:按连接类型和自定义驱动别名生成只读 SQL 预览限流语句
- Oracle 兼容:Oracle、自定义 Oracle 和达梦改用 ROWNUM 语法限制行数
- 权限降级:获取表 DDL 失败时自动降级为字段元数据摘要
- 上下文优化:手动添加表结构上下文时复用同一套 DDL 降级逻辑
- 测试覆盖:新增 AI SQL 限流和表结构降级单元测试
Refs #418
2026-04-28 14:03:48 +08:00

49 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { buildAIReadonlyPreviewSQL } from './aiSqlLimit';
describe('buildAIReadonlyPreviewSQL', () => {
it('limits Oracle readonly SQL with ROWNUM instead of MySQL LIMIT', () => {
const sql = buildAIReadonlyPreviewSQL('oracle', 'SELECT 1 FROM DUAL;', 50);
expect(sql).toBe('SELECT * FROM (SELECT 1 FROM DUAL) WHERE ROWNUM <= 50');
expect(sql.toLowerCase()).not.toContain('limit');
});
it('does not add another limit when Oracle SQL already limits rows', () => {
expect(buildAIReadonlyPreviewSQL('oracle', 'SELECT * FROM users WHERE ROWNUM <= 10', 50))
.toBe('SELECT * FROM users WHERE ROWNUM <= 10');
expect(buildAIReadonlyPreviewSQL('oracle', 'SELECT * FROM users FETCH FIRST 10 ROWS ONLY', 50))
.toBe('SELECT * FROM users FETCH FIRST 10 ROWS ONLY');
});
it('resolves custom Oracle drivers from the driver alias', () => {
expect(buildAIReadonlyPreviewSQL('custom', 'SELECT 1 FROM DUAL;', 50, 'oracle'))
.toBe('SELECT * FROM (SELECT 1 FROM DUAL) WHERE ROWNUM <= 50');
});
it('keeps MySQL-family SQL on LIMIT syntax', () => {
expect(buildAIReadonlyPreviewSQL('mysql', 'SELECT * FROM users', 50))
.toBe('SELECT * FROM users LIMIT 50 OFFSET 0');
});
it('keeps PostgreSQL-compatible and ClickHouse SQL on LIMIT syntax', () => {
expect(buildAIReadonlyPreviewSQL('postgres', 'SELECT * FROM users', 50))
.toBe('SELECT * FROM users LIMIT 50 OFFSET 0');
expect(buildAIReadonlyPreviewSQL('kingbase', 'SELECT * FROM users', 50))
.toBe('SELECT * FROM users LIMIT 50 OFFSET 0');
expect(buildAIReadonlyPreviewSQL('clickhouse', 'SELECT * FROM events', 50))
.toBe('SELECT * FROM events LIMIT 50 OFFSET 0');
});
it('limits Dameng readonly SQL with Oracle-compatible ROWNUM syntax', () => {
expect(buildAIReadonlyPreviewSQL('dameng', 'SELECT 1 FROM DUAL;', 50))
.toBe('SELECT * FROM (SELECT 1 FROM DUAL) WHERE ROWNUM <= 50');
});
it('does not limit non-readonly SQL', () => {
expect(buildAIReadonlyPreviewSQL('oracle', 'UPDATE users SET name = \'a\';', 50))
.toBe('UPDATE users SET name = \'a\'');
});
});