xref: /sqlite-3.40.0/test/savepointfault.test (revision be7721d1)
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