Files
dbx/apps/desktop/src/lib/query/queryResultError.ts
T

31 lines
1.7 KiB
TypeScript

import type { DatabaseType, QueryResult } from "@/types/database";
// Lake/external tables (e.g. Paimon in StarRocks) return this error on a data
// read when no snapshot exists yet, while metadata reads (DESC/SHOW CREATE)
// still succeed. executeTabSql surfaces query failures as an "Error" result, so
// callers can detect this case and fall back to a structure-only (LIMIT 0)
// preview instead of showing a cryptic server error.
const NO_SNAPSHOT_ERROR_PATTERN = /there is currently no snapshot/i;
const MYSQL_PROTOCOL_DATABASE_TYPES = new Set<DatabaseType>(["mysql", "doris", "starrocks", "manticoresearch"]);
export function usesMysqlProtocolDatabaseType(databaseType: DatabaseType | undefined): boolean {
return databaseType !== undefined && MYSQL_PROTOCOL_DATABASE_TYPES.has(databaseType);
}
// The batch executor marks synthesized MySQL-protocol errors explicitly so a
// successful result column named Error is never mistaken for a failure.
export function isMysqlExecutionErrorResult(result: QueryResult, databaseType: DatabaseType | undefined): boolean {
return usesMysqlProtocolDatabaseType(databaseType) && result.execution_error === true;
}
export function isQueryExecutionErrorResult(result: QueryResult): boolean {
// Multi-database batch responses use this explicit marker so a successful
// query column named Error is never promoted as the failed statement.
return result.execution_error === true;
}
export function isNoSnapshotErrorResult(result: QueryResult | undefined | null): boolean {
if (!result || !isQueryExecutionErrorResult(result) || result.rows.length === 0) return false;
return NO_SNAPSHOT_ERROR_PATTERN.test(String(result.rows[0]?.[0] ?? ""));
}