mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-19 22:15:12 +08:00
🐛 fix(query-editor): 修复 OceanBase 执行误用登录Schema
- 保持 OceanBase Oracle 默认登录 schema 解析不变 - 未限定表名改写时增加登录 schema 到所选 schema 的回退候选 - 补充 SBDEVREAD/SBDEV 与 ORCLPDB1 场景回归测试 Fixes #615
This commit is contained in:
@@ -132,6 +132,7 @@ import {
|
||||
resolveOracleExactCaseTableReference,
|
||||
resolveOracleLikeDefaultSchemaName,
|
||||
resolveOracleLikeExecutionSchemaName,
|
||||
resolveOracleLikeLookupSchemaCandidates,
|
||||
resolveQueryEditorFormatterLanguage,
|
||||
resolveQueryEditorHoverTarget,
|
||||
resolveQueryEditorNavigationDecorations,
|
||||
@@ -6012,13 +6013,6 @@ const QueryEditor: React.FC<{ tab: TabData; isActive?: boolean }> = ({ tab, isAc
|
||||
const defaultOracleSchema = isOracleLikeDialect(normalizedDbType)
|
||||
? resolveOracleLikeDefaultSchemaName(config)
|
||||
: '';
|
||||
const oracleExecutionSchema = isOracleLikeDialect(normalizedDbType)
|
||||
? resolveOracleLikeExecutionSchemaName(config, currentDb)
|
||||
: '';
|
||||
const shouldQualifyOracleUnqualifiedTables = Boolean(
|
||||
oracleExecutionSchema
|
||||
&& oracleExecutionSchema.toLowerCase() !== String(defaultOracleSchema || '').trim().toLowerCase(),
|
||||
);
|
||||
const oracleTableCache = new Map<string, CompletionTableMeta[]>();
|
||||
const getOracleTablesForDb = async (dbName: string): Promise<CompletionTableMeta[]> => {
|
||||
const normalizedDbName = String(dbName || '').trim();
|
||||
@@ -6073,16 +6067,23 @@ const QueryEditor: React.FC<{ tab: TabData; isActive?: boolean }> = ({ tab, isAc
|
||||
const leadingTable = matchLeadingSelectTableReference(statement);
|
||||
if (leadingTable) {
|
||||
const leadingSegments = splitQueryIdentifierPathSegments(leadingTable.tableText);
|
||||
const oracleLookupDbName = String(
|
||||
(leadingSegments.length >= 2 ? leadingSegments[0]?.value : '')
|
||||
|| oracleExecutionSchema
|
||||
|| currentDb
|
||||
|| '',
|
||||
).trim();
|
||||
const oracleTables = oracleLookupDbName ? await getOracleTablesForDb(oracleLookupDbName) : [];
|
||||
const exactQualifiedTable = resolveOracleExactCaseTableReference(statement, oracleLookupDbName, oracleTables, {
|
||||
qualifyUnqualified: shouldQualifyOracleUnqualifiedTables,
|
||||
});
|
||||
const oracleLookupDbCandidates = leadingSegments.length >= 2
|
||||
? [String(leadingSegments[0]?.value || '').trim()].filter(Boolean)
|
||||
: resolveOracleLikeLookupSchemaCandidates(config, currentDb);
|
||||
let exactQualifiedTable: string | undefined;
|
||||
for (const oracleLookupDbName of oracleLookupDbCandidates) {
|
||||
const oracleTables = oracleLookupDbName ? await getOracleTablesForDb(oracleLookupDbName) : [];
|
||||
exactQualifiedTable = resolveOracleExactCaseTableReference(statement, oracleLookupDbName, oracleTables, {
|
||||
qualifyUnqualified: Boolean(
|
||||
leadingSegments.length === 1
|
||||
&& oracleLookupDbName
|
||||
&& oracleLookupDbName.toLowerCase() !== String(defaultOracleSchema || '').trim().toLowerCase(),
|
||||
),
|
||||
});
|
||||
if (exactQualifiedTable) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (exactQualifiedTable) {
|
||||
executableStatement = rewriteLeadingSelectTableReference(statement, exactQualifiedTable) || statement;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user