Files
MyGoNavi/frontend/src/utils/ddlFormat.ts
Syngnat e942f7dc5a 🐛 fix(ddl): 保留 Oracle 视图 DDL 原始排版
- Oracle 视图与物化视图跳过展示格式化
- 补充预览及对象编辑原始排版回归测试
2026-07-31 20:06:25 +08:00

62 lines
1.5 KiB
TypeScript

import { format, type SqlLanguage } from 'sql-formatter';
const normalizeDbType = (dbType: string): string => String(dbType || '').trim().toLowerCase();
const resolveDdlFormatterLanguage = (dbType: string): SqlLanguage => {
const normalized = normalizeDbType(dbType);
switch (normalized) {
case 'duckdb':
return 'duckdb';
case 'sqlite':
return 'sqlite';
case 'postgres':
case 'postgresql':
case 'kingbase':
case 'highgo':
case 'opengauss':
case 'gaussdb':
case 'vastbase':
return 'postgresql';
case 'mariadb':
return 'mariadb';
case 'mysql':
case 'goldendb':
case 'sphinx':
return 'mysql';
case 'sqlserver':
return 'transactsql';
case 'oracle':
case 'dameng':
case 'oceanbase':
return 'plsql';
case 'clickhouse':
return 'clickhouse';
default:
return 'sql';
}
};
const isOracleViewDdl = (sql: string): boolean => (
/^\s*CREATE\s+(?:OR\s+REPLACE\s+)?(?:(?:NO\s*)?FORCE\s+)?(?:NONEDITIONABLE\s+|EDITIONABLE\s+)?(?:MATERIALIZED\s+)?VIEW\b/i.test(sql)
);
export const formatDdlForDisplay = (ddlText: unknown, dbType: string): string => {
const raw = String(ddlText ?? '').trim();
if (!raw) {
return '';
}
if (normalizeDbType(dbType) === 'oracle' && isOracleViewDdl(raw)) {
return raw;
}
const language = resolveDdlFormatterLanguage(dbType);
try {
return format(raw, {
language,
keywordCase: 'upper',
linesBetweenQueries: 1,
});
} catch {
return raw;
}
};