From 88d19c963f65676007a390ccfb2ae66a45d6f0e4 Mon Sep 17 00:00:00 2001 From: Victor M Varela Date: Sat, 12 Sep 2026 11:40:09 +0200 Subject: [PATCH] fix: surface mid-stream SQLite step errors (Issue #229) --- src/main.zig | 7 +++++-- src/modes/repl.zig | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main.zig b/src/main.zig index de4435b..6a22812 100644 --- a/src/main.zig +++ b/src/main.zig @@ -109,9 +109,12 @@ fn writeStreaming( ) !void { try out_writer.begin(allocator, stmt, col_count, writer); if (stmt) |s| { - while (c.sqlite3_step(s) == c.SQLITE_ROW) { + var rc = c.sqlite3_step(s); + while (rc == c.SQLITE_ROW) { try out_writer.writeRow(s, writer); + rc = c.sqlite3_step(s); } + if (rc != c.SQLITE_DONE) return error.StepFailed; } try out_writer.end(writer); } @@ -510,7 +513,7 @@ fn run( } execQuery(allocator, db, query, stdout_writer, stderr_writer, parsed.header, parsed.output_format, parsed.xml_root, parsed.xml_row, parsed.sql_table, parsed.html_class, parsed.null_value, use_table, parsed.checksum) catch |err| switch (err) { - error.PrepareQueryFailed => { + error.PrepareQueryFailed, error.StepFailed => { stdout_writer.flush() catch |flush_err| std.log.err("failed to flush output before fatal: {}", .{flush_err}); sqlite_mod.fatalSqlWithContext(allocator, db, main_table, std.mem.span(c.sqlite3_errmsg(db)), stderr_writer); }, diff --git a/src/modes/repl.zig b/src/modes/repl.zig index c6f49f0..07c8515 100644 --- a/src/modes/repl.zig +++ b/src/modes/repl.zig @@ -112,7 +112,7 @@ fn execReplQuery( parsed.sql_table, parsed.html_class, parsed.null_value, use_table, parsed.checksum, ) catch |err| switch (err) { - error.PrepareQueryFailed => { + error.PrepareQueryFailed, error.StepFailed => { stdout_writer.flush() catch |err_flush| std.log.err("failed to flush stdout: {}", .{err_flush}); printSqlError(allocator, db, main_table, std.mem.span(c.sqlite3_errmsg(db)), stderr_writer); },