fix(sql): avoid repeated full scans in large script execution
Refs: #3335
This commit is contained in:
4 files changed
+109
-22
No files matched your search
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user