1*d7b06909Sdan# 2014-11-12 2*d7b06909Sdan# 3*d7b06909Sdan# The author disclaims copyright to this source code. In place of 4*d7b06909Sdan# a legal notice, here is a blessing: 5*d7b06909Sdan# 6*d7b06909Sdan# May you do good and not evil. 7*d7b06909Sdan# May you find forgiveness for yourself and forgive others. 8*d7b06909Sdan# May you share freely, never taking more than you give. 9*d7b06909Sdan# 10*d7b06909Sdan#*********************************************************************** 11*d7b06909Sdan# 12*d7b06909Sdan# Test that errors encountered during a ROLLBACK operation correctly 13*d7b06909Sdan# affect ongoing SQL statements. 14*d7b06909Sdan# 15*d7b06909Sdan 16*d7b06909Sdanset testdir [file dirname $argv0] 17*d7b06909Sdansource $testdir/tester.tcl 18*d7b06909Sdansource $testdir/malloc_common.tcl 19*d7b06909Sdanset testprefix rollbackfault 20*d7b06909Sdan 21*d7b06909Sdan 22*d7b06909Sdanproc int2hex {i} { format %.2X $i } 23*d7b06909Sdandb func int2hex int2hex 24*d7b06909Sdando_execsql_test 1.0 { 25*d7b06909Sdan SELECT int2hex(0), int2hex(100), int2hex(255) 26*d7b06909Sdan} {00 64 FF} 27*d7b06909Sdando_execsql_test 1.1 { 28*d7b06909Sdan CREATE TABLE t1(i, h); 29*d7b06909Sdan CREATE INDEX i1 ON t1(h); 30*d7b06909Sdan WITH data(a, b) AS ( 31*d7b06909Sdan SELECT 1, int2hex(1) 32*d7b06909Sdan UNION ALL 33*d7b06909Sdan SELECT a+1, int2hex(a+1) FROM data WHERE a<40 34*d7b06909Sdan ) 35*d7b06909Sdan INSERT INTO t1 SELECT * FROM data; 36*d7b06909Sdan} {} 37*d7b06909Sdan 38*d7b06909Sdanforeach f {oom ioerr} { 39*d7b06909Sdan do_faultsim_test 1.2 -faults $f* -prep { 40*d7b06909Sdan set sql1 { SELECT i FROM t1 WHERE (i%2)==0 } 41*d7b06909Sdan set sql2 { SELECT i FROM t1 WHERE (i%2)==0 ORDER BY h } 42*d7b06909Sdan set ::s1 [sqlite3_prepare db $sql1 -1 dummy] 43*d7b06909Sdan set ::s2 [sqlite3_prepare db $sql2 -1 dummy] 44*d7b06909Sdan 45*d7b06909Sdan for {set i 0} {$i < 10} {incr i} { sqlite3_step $::s1 } 46*d7b06909Sdan for {set i 0} {$i < 3} {incr i} { sqlite3_step $::s2 } 47*d7b06909Sdan 48*d7b06909Sdan execsql { 49*d7b06909Sdan BEGIN; DELETE FROM t1 WHERE (i%2) 50*d7b06909Sdan } 51*d7b06909Sdan } -body { 52*d7b06909Sdan execsql { ROLLBACK } 53*d7b06909Sdan } -test { 54*d7b06909Sdan 55*d7b06909Sdan set res1 [list] 56*d7b06909Sdan set res2 [list] 57*d7b06909Sdan while {"SQLITE_ROW" == [sqlite3_step $::s1]} { 58*d7b06909Sdan lappend res1 [sqlite3_column_text $::s1 0] 59*d7b06909Sdan } 60*d7b06909Sdan while {"SQLITE_ROW" == [sqlite3_step $::s2]} { 61*d7b06909Sdan lappend res2 [sqlite3_column_text $::s2 0] 62*d7b06909Sdan } 63*d7b06909Sdan set rc1 [sqlite3_finalize $::s1] 64*d7b06909Sdan set rc2 [sqlite3_finalize $::s2] 65*d7b06909Sdan 66*d7b06909Sdan catchsql { ROLLBACK } 67*d7b06909Sdan 68*d7b06909Sdan if {$rc1=="SQLITE_OK" && $rc2=="SQLITE_OK" 69*d7b06909Sdan && $res1=="22 24 26 28 30 32 34 36 38 40" 70*d7b06909Sdan && $res2=="8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40" 71*d7b06909Sdan } { 72*d7b06909Sdan # This is Ok. 73*d7b06909Sdan } elseif {$rc1!="SQLITE_OK" && $rc2!="SQLITE_OK" && $res1=="" &&$res2==""} { 74*d7b06909Sdan # Also Ok. 75*d7b06909Sdan } else { 76*d7b06909Sdan error "statements don't look right" 77*d7b06909Sdan } 78*d7b06909Sdan } 79*d7b06909Sdan} 80*d7b06909Sdan 81*d7b06909Sdan 82*d7b06909Sdanfinish_test 83