1*be7721d1Sdan# 2008 December 15 2*be7721d1Sdan# 3*be7721d1Sdan# The author disclaims copyright to this source code. In place of 4*be7721d1Sdan# a legal notice, here is a blessing: 5*be7721d1Sdan# 6*be7721d1Sdan# May you do good and not evil. 7*be7721d1Sdan# May you find forgiveness for yourself and forgive others. 8*be7721d1Sdan# May you share freely, never taking more than you give. 9*be7721d1Sdan# 10*be7721d1Sdan#*********************************************************************** 11*be7721d1Sdan# 12*be7721d1Sdan 13*be7721d1Sdanset testdir [file dirname $argv0] 14*be7721d1Sdansource $testdir/tester.tcl 15*be7721d1Sdan 16*be7721d1Sdansource $testdir/malloc_common.tcl 17*be7721d1Sdan 18*be7721d1Sdanset testprefix savepointfault 19*be7721d1Sdan 20*be7721d1Sdando_malloc_test 1 -sqlprep { 21*be7721d1Sdan CREATE TABLE t1(a, b, c); 22*be7721d1Sdan INSERT INTO t1 VALUES(1, 2, 3); 23*be7721d1Sdan} -sqlbody { 24*be7721d1Sdan SAVEPOINT one; 25*be7721d1Sdan INSERT INTO t1 VALUES(4, 5, 6); 26*be7721d1Sdan SAVEPOINT two; 27*be7721d1Sdan DELETE FROM t1; 28*be7721d1Sdan ROLLBACK TO two; 29*be7721d1Sdan RELEASE one; 30*be7721d1Sdan} 31*be7721d1Sdan 32*be7721d1Sdando_malloc_test 2 -sqlprep { 33*be7721d1Sdan PRAGMA cache_size = 10; 34*be7721d1Sdan CREATE TABLE t1(a, b, c); 35*be7721d1Sdan INSERT INTO t1 VALUES(randstr(400,400), randstr(400,400), randstr(400,400)); 36*be7721d1Sdan INSERT INTO t1 SELECT 37*be7721d1Sdan randstr(400,400), randstr(400,400), randstr(400,400) FROM t1; 38*be7721d1Sdan INSERT INTO t1 39*be7721d1Sdan SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1; 40*be7721d1Sdan INSERT INTO t1 41*be7721d1Sdan SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1; 42*be7721d1Sdan INSERT INTO t1 43*be7721d1Sdan SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1; 44*be7721d1Sdan INSERT INTO t1 45*be7721d1Sdan SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1; 46*be7721d1Sdan INSERT INTO t1 47*be7721d1Sdan SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1; 48*be7721d1Sdan INSERT INTO t1 49*be7721d1Sdan SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1; 50*be7721d1Sdan INSERT INTO t1 51*be7721d1Sdan SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1; 52*be7721d1Sdan} -sqlbody { 53*be7721d1Sdan PRAGMA cache_size = 10; 54*be7721d1Sdan SAVEPOINT one; 55*be7721d1Sdan DELETE FROM t1 WHERE rowid < 5; 56*be7721d1Sdan SAVEPOINT two; 57*be7721d1Sdan DELETE FROM t1 WHERE rowid > 10; 58*be7721d1Sdan ROLLBACK TO two; 59*be7721d1Sdan ROLLBACK TO one; 60*be7721d1Sdan RELEASE one; 61*be7721d1Sdan} 62*be7721d1Sdan 63*be7721d1Sdando_ioerr_test 3 -sqlprep { 64*be7721d1Sdan CREATE TABLE t1(a, b, c); 65*be7721d1Sdan INSERT INTO t1 VALUES(1, randstr(1000,1000), randstr(1000,1000)); 66*be7721d1Sdan INSERT INTO t1 VALUES(2, randstr(1000,1000), randstr(1000,1000)); 67*be7721d1Sdan} -sqlbody { 68*be7721d1Sdan BEGIN; 69*be7721d1Sdan UPDATE t1 SET a = 3 WHERE a = 1; 70*be7721d1Sdan SAVEPOINT one; 71*be7721d1Sdan UPDATE t1 SET a = 4 WHERE a = 2; 72*be7721d1Sdan COMMIT; 73*be7721d1Sdan} -cleanup { 74*be7721d1Sdan db eval { 75*be7721d1Sdan SAVEPOINT one; 76*be7721d1Sdan RELEASE one; 77*be7721d1Sdan } 78*be7721d1Sdan} 79*be7721d1Sdan 80*be7721d1Sdan# The following test does a really big savepoint rollback. One involving 81*be7721d1Sdan# more than 4000 pages. The idea is to get a specific sqlite3BitvecSet() 82*be7721d1Sdan# operation in pagerPlaybackSavepoint() to fail. 83*be7721d1Sdan#do_malloc_test 4 -sqlprep { 84*be7721d1Sdan# BEGIN; 85*be7721d1Sdan# CREATE TABLE t1(a, b); 86*be7721d1Sdan# CREATE INDEX i1 ON t1(a); 87*be7721d1Sdan# CREATE INDEX i2 ON t1(b); 88*be7721d1Sdan# INSERT INTO t1 VALUES(randstr(500,500), randstr(500,500)); -- 1 89*be7721d1Sdan# INSERT INTO t1 VALUES(randstr(500,500), randstr(500,500)); -- 2 90*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 4 91*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 8 92*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 16 93*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 32 94*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 64 95*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 128 96*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 256 97*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 512 98*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 1024 99*be7721d1Sdan# INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; -- 2048 100*be7721d1Sdan# COMMIT; 101*be7721d1Sdan# BEGIN; 102*be7721d1Sdan# SAVEPOINT abc; 103*be7721d1Sdan# UPDATE t1 SET a = randstr(500,500); 104*be7721d1Sdan#} -sqlbody { 105*be7721d1Sdan# ROLLBACK TO abc; 106*be7721d1Sdan#} 107*be7721d1Sdan 108*be7721d1Sdan 109*be7721d1Sdan# Cause a specific malloc in savepoint rollback code to fail. 110*be7721d1Sdan# 111*be7721d1Sdando_malloc_test 4 -start 7 -sqlprep { 112*be7721d1Sdan PRAGMA auto_vacuum = incremental; 113*be7721d1Sdan PRAGMA cache_size = 1000; 114*be7721d1Sdan 115*be7721d1Sdan CREATE TABLE t1(a, b); 116*be7721d1Sdan CREATE TABLE t2(a, b); 117*be7721d1Sdan CREATE TABLE t3(a, b); 118*be7721d1Sdan INSERT INTO t1 VALUES(1, randstr(500,500)); 119*be7721d1Sdan INSERT INTO t1 VALUES(2, randstr(500,500)); 120*be7721d1Sdan INSERT INTO t1 VALUES(3, randstr(500,500)); 121*be7721d1Sdan DELETE FROM t1; 122*be7721d1Sdan 123*be7721d1Sdan BEGIN; 124*be7721d1Sdan INSERT INTO t1 VALUES(1, randstr(500,500)); 125*be7721d1Sdan INSERT INTO t1 VALUES(2, randstr(500,500)); 126*be7721d1Sdan INSERT INTO t1 VALUES(3, randstr(500,500)); 127*be7721d1Sdan DROP TABLE t3; -- Page 5 of the database file is now free. 128*be7721d1Sdan DROP TABLE t2; -- Page 4 of the database file is now free. 129*be7721d1Sdan 130*be7721d1Sdan SAVEPOINT abc; 131*be7721d1Sdan PRAGMA incremental_vacuum; 132*be7721d1Sdan} -sqlbody { 133*be7721d1Sdan ROLLBACK TO abc; 134*be7721d1Sdan} 135*be7721d1Sdan 136*be7721d1Sdan 137*be7721d1Sdanfinish_test 138