fix(sql): avoid repeated full scans in large script execution

Refs: #3335
This commit is contained in:
t8y2 committed 2026-09-22 19:04:58 +08:00
1 parent 8ffdbb2950
commit c1f2bbda44
4 files changed
+109 -22

No files matched your search

+13 -7
View File
@@ -369,6 +369,18 @@ function preservedResultIndex(results: QueryResult[], currentIndex: number | und
return currentIndex;
}
function findSourceDocumentStatement(statements: ReturnType<typeof splitSqlStatementRanges>, sourceFrom: number) {
let lower = 0;
let upper = statements.length;
while (lower < upper) {
const middle = Math.floor((lower + upper) / 2);
if (statements[middle].to < sourceFrom) lower = middle + 1;
else upper = middle;
}
const statement = statements[lower];
return statement && statement.from <= sourceFrom ? statement : undefined;
}
function annotateQueryResultSources(results: QueryResult[], sql: string, database: string | undefined, databaseType?: DatabaseType, sourceOffset?: number, parameterOptions?: SqlParameterOptions, executedSql?: string, sourceDocumentSql?: string): { results: QueryResult[]; useDatabase?: string } {
const statements = splitSqlStatementRanges(sql, databaseType, parameterOptions);
// The backend positions errors against the SQL it actually received. When the
@@ -401,13 +413,7 @@ function annotateQueryResultSources(results: QueryResult[], sql: string, databas
});
}
}
const documentStatement =
sourceOffset === undefined
? undefined
: documentStatements.find((candidate) => {
const sourceFrom = sourceOffset + statement.from;
return candidate.from === sourceFrom || (sourceFrom >= candidate.from && sourceFrom <= candidate.to);
});
const documentStatement = sourceOffset === undefined ? undefined : findSourceDocumentStatement(documentStatements, sourceOffset + statement.from);
const preamble = documentStatement ? sourceDocumentSql!.slice(documentStatement.hitFrom, documentStatement.from) : sql.slice(statement.hitFrom, statement.from);
const customName = queryResultNameFromPreamble(preamble, { databaseType });
if (customName) result.sourceLabel = customName;