#9139·turso

simulator: checkpoint after an open savepoint fails the run with TableLocked

Author: LeMikaelFCreated Sep 17, 2026Updated Sep 17, 2026

The simulator (Faultless) job failed on #9136.

What the log shows

  1. Connection 5 runs SAVEPOINT sim_sp_419;. This opens a transaction.
  2. The next statement, DELETE FROM funny_crudo_231 WHERE TRUE;, fails with Busy.
  3. is_recoverable_tx_error (testing/simulator/runner/execution.rs:27) accepts Busy, so the run continues. The savepoint stays open.
  4. Later, connection 5 runs PRAGMA aux0.wal_checkpoint(FULL);.
  5. op_checkpoint (core/vdbe/execute.rs:692) returns TableLocked, because the connection is still in a transaction. SQLite does the same.
  6. TableLocked is not in the recoverable list, so the run fails.

The engine behavior is correct. The simulator must close the savepoint after a Busy, or accept TableLocked as a legal result.

The PR changes only hash join selection. The failure is in other code.