from test/more import *;
requires_capability( "db" );
from std/db import DB;
let dbh := DB.temp( { auto_commit: true } );
dbh.prepare( "create table thrown (value integer)" ).execute();
let insert := dbh.prepare( "insert into thrown (value) values (?)" );
let message := "";
dbh.begin();
try {
for ( let v in [ 1, 2, 3, 4 ] ) {
if ( v == 3 ) {
throw new Exception( message: "explode" );
}
insert.execute(v);
}
dbh.commit();
}
catch ( Exception e ) {
message := e{message};
dbh.rollback();
}
let q := dbh.prepare( "select count(*) from thrown" );
q.execute();
like( message, /explode/, "loop throw captured in catch" );
is( q.next_array()[0], 0, "rollback clears writes from failed loop transaction" );
done_testing();