mirror of
https://github.com/morluto/rea.git
synced 2026-11-11 09:21:16 +00:00
fix(sqlite): attribute generated-column evaluation failures to the selection (#5879)
* fix(sqlite): attribute generated-column evaluation failures to the selection A selected virtual generated column whose expression needs a function the read-only connection lacks (or raises an SQL error for a sampled row) was classified by the worker's catch-all as a malformed database and projected as an invalid_format issue on `path`. Row reads now attribute SQLITE_ERROR from selected cells by probing each selected virtual generated column over the sampled rows, and report a typed capability_unavailable refusal naming the table, each failing column with SQLite's message, and the remaining columns to select. Other causes, including corruption, TOOBIG and NOMEM, keep their classification. Fixes #5719 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(sqlite): recommend only probed-readable columns after evaluation failures Record every per-column probe failure with its own reason, discover stored columns outside an inventory-scope selection without decoding unrelated malformed names, and present recovery as the structured columns selection instead of shell-quoted command text built from database-supplied names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
efab044f30
commit
bcfcd8b6e2
7 files changed
+473
-36
No files matched your search
@@ -39,7 +39,7 @@ const {
|
||||
...inspectionShape
|
||||
} = sqliteDatabaseSchema.shape;
|
||||
const inspectionSchema = z.strictObject(inspectionShape);
|
||||
const replySchema = z.discriminatedUnion("ok", [
|
||||
const replySchema = z.union([
|
||||
z.strictObject({ ok: z.literal(true), inspection: inspectionSchema }),
|
||||
z.strictObject({
|
||||
ok: z.literal(false),
|
||||
@@ -54,6 +54,12 @@ const replySchema = z.discriminatedUnion("ok", [
|
||||
]),
|
||||
message: z.string(),
|
||||
}),
|
||||
z.strictObject({
|
||||
ok: z.literal(false),
|
||||
reason: z.literal("column-evaluation"),
|
||||
message: z.string(),
|
||||
readable_columns: z.array(z.string()),
|
||||
}),
|
||||
]);
|
||||
/** Replaceable launcher retains the shared owned-process supervision boundary. */
|
||||
export type SqliteWorkerLauncher = NonNullable<
|
||||
@@ -80,6 +86,23 @@ const rejectedReply = (
|
||||
reply.message,
|
||||
{ capturedOutput, userMessage: reply.message },
|
||||
);
|
||||
if (reply.reason === "column-evaluation") {
|
||||
const readable = reply.readable_columns;
|
||||
return new AnalysisCapabilityUnavailableError(
|
||||
"sqlite",
|
||||
operation,
|
||||
reply.message,
|
||||
{
|
||||
capturedOutput,
|
||||
userMessage: reply.message,
|
||||
remediationAction: `The database is readable; only the listed column values failed. REA's SQLite connection loads no extensions or application functions and disables schema trust. ${
|
||||
readable.length === 0
|
||||
? "No other readable column was found"
|
||||
: `Select columns whose values were read: columns: ${JSON.stringify(readable)} (CLI: one --column per name)`
|
||||
}; omit table and use schema_scope: database to read the stored declarations without evaluating rows. Obtaining the failed values needs a SQLite connection able to evaluate them. Do not repeat the unchanged request.`,
|
||||
},
|
||||
);
|
||||
}
|
||||
if (reply.reason === "memory")
|
||||
return new AnalysisResourceConstraintError(
|
||||
operation,
|
||||
|
||||
Reference in new issue
Block a user