Make sure constraint checks occur in the correct order, even in the
[sqlite.git] / ext / rbu / rbu11.test
blobfdc701aceb3360026a366c45ccb5f11967f0d16f
1 # 2015 February 16
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
6 #    May you do good and not evil.
7 #    May you find forgiveness for yourself and forgive others.
8 #    May you share freely, never taking more than you give.
10 #***********************************************************************
13 if {![info exists testdir]} {
14   set testdir [file join [file dirname [info script]] .. .. test]
16 source $testdir/tester.tcl
17 set ::testprefix rbu11
20 #--------------------------------------------------------------------
21 # Test that the xAccess() method of an rbu vfs handles queries other
22 # than SQLITE_ACCESS_EXISTS correctly. The test code below causes
23 # SQLite to call xAccess(SQLITE_ACCESS_READWRITE) on the directory
24 # path argument passed to "PRAGMA temp_store_directory".
26 do_test 1.1 {
27   sqlite3rbu_create_vfs -default rbu ""
28   reset_db
29   catchsql { PRAGMA temp_store_directory = '/no/such/directory' }
30 } {1 {not a writable directory}}
32 do_test 1.2 {
33   catchsql " PRAGMA temp_store_directory = '[pwd]' "
34 } {0 {}}
36 do_test 1.3 {
37   catchsql " PRAGMA temp_store_directory = '' "
38 } {0 {}}
40 do_test 1.4 {
41   db close
42   sqlite3rbu_destroy_vfs rbu
43 } {}
45 #--------------------------------------------------------------------
46 # Try to trick rbu into operating on a database opened in wal mode.
48 reset_db
49 do_execsql_test 2.1 {
50   CREATE TABLE t1(a PRIMARY KEY, b, c);
51   INSERT INTO t1 VALUES(1, 2, 3);
52   PRAGMA journal_mode = 'wal';
53   CREATE TABLE t2(d PRIMARY KEY, e, f);
54 } {wal}
56 do_test 2.2 {
57   db_save 
58   db close
60   forcedelete rbu.db
61   sqlite3 dbo rbu.db
62   dbo eval {
63     CREATE TABLE data_t1(a, b, c, rbu_control);
64     INSERT INTO data_t1 VALUES(4, 5, 6, 0);
65     INSERT INTO data_t1 VALUES(7, 8, 9, 0);
66   }
67   dbo close
69   db_restore 
70   hexio_write test.db 18 0101
71   file exists test.db-wal
72 } {1}
74 do_test 2.3 {
75   sqlite3rbu rbu test.db rbu.db
76   rbu step
77 } {SQLITE_ERROR}
79 do_test 2.4 {
80   list [catch {rbu close} msg] $msg
81 } {1 {SQLITE_ERROR - cannot update wal mode database}}
83 #--------------------------------------------------------------------
84 # Test a constraint violation message with an unusual table name. 
85 # Specifically, one for which the first character is a codepoint
86 # smaller than 30 (character '0').
88 reset_db
89 do_execsql_test 3.1 {
90   CREATE TABLE "(t1)"(a PRIMARY KEY, b, c);
91   INSERT INTO "(t1)" VALUES(1, 2, 3);
92   INSERT INTO "(t1)" VALUES(4, 5, 6);
94 db close
96 do_test 3.2 {
97   forcedelete rbu.db
98   sqlite3 dbo rbu.db
99   dbo eval {
100     CREATE TABLE "data_(t1)"(a, b, c, rbu_control);
101     INSERT INTO "data_(t1)" VALUES(4, 8, 9, 0);
102   }
103   dbo close
105   sqlite3rbu rbu test.db rbu.db
106   rbu step
107   rbu step
108 } {SQLITE_CONSTRAINT}
110 do_test 3.3 {
111   list [catch {rbu close} msg] $msg
112 } {1 {SQLITE_CONSTRAINT - UNIQUE constraint failed: (t1).a}}
114 #--------------------------------------------------------------------
115 # Check that once an RBU update has been applied, attempting to apply
116 # it a second time is a no-op (as the state stored in the RBU database is
117 # "all steps completed").
119 reset_db
120 do_execsql_test 4.1 {
121   CREATE TABLE "(t1)"(a, b, c, PRIMARY KEY(c, b, a));
122   INSERT INTO "(t1)" VALUES(1, 2, 3);
123   INSERT INTO "(t1)" VALUES(4, 5, 6);
125 db close
127 do_test 4.2 {
128   forcedelete rbu.db
129   sqlite3 dbo rbu.db
130   dbo eval {
131     CREATE TABLE "data_(t1)"(a, b, c, rbu_control);
132     INSERT INTO "data_(t1)" VALUES(7, 8, 9, 0);
133     INSERT INTO "data_(t1)" VALUES(1, 2, 3, 1);
134   }
135   dbo close
137   sqlite3rbu rbu test.db rbu.db
138   while {[rbu step]=="SQLITE_OK"} { }
139   rbu close
140 } {SQLITE_DONE}
142 do_test 4.3 {
143   sqlite3rbu rbu test.db rbu.db
144   rbu step
145 } {SQLITE_DONE}
147 do_test 4.4 {
148   rbu close
149 } {SQLITE_DONE}
151 do_test 4.5.1 {
152   sqlite3 dbo rbu.db
153   dbo eval { INSERT INTO rbu_state VALUES(100, 100) }
154   dbo close
155   sqlite3rbu rbu test.db rbu.db
156   rbu step
157 } {SQLITE_CORRUPT}
158 do_test 4.5.2 {
159   list [catch {rbu close} msg] $msg
160 } {1 SQLITE_CORRUPT}
161 do_test 4.5.3 {
162   sqlite3 dbo rbu.db
163   dbo eval { DELETE FROM rbu_state WHERE k = 100 }
164   dbo close 
165 } {}
167 # Also, check that an invalid state value in the rbu_state table is
168 # detected and reported as corruption.
169 do_test 4.6.1 {
170   sqlite3 dbo rbu.db
171   dbo eval { UPDATE rbu_state SET v = v*-1 WHERE k = 1 }
172   dbo close
173   sqlite3rbu rbu test.db rbu.db
174   rbu step
175 } {SQLITE_CORRUPT}
176 do_test 4.6.2 {
177   list [catch {rbu close} msg] $msg
178 } {1 SQLITE_CORRUPT}
179 do_test 4.6.3 {
180   sqlite3 dbo rbu.db
181   dbo eval { UPDATE rbu_state SET v = v*-1 WHERE k = 1 }
182   dbo close 
183 } {}
185 do_test 4.7.1 {
186   sqlite3 dbo rbu.db
187   dbo eval { UPDATE rbu_state SET v = 1 WHERE k = 1 }
188   dbo eval { UPDATE rbu_state SET v = 'nosuchtable' WHERE k = 2 }
189   dbo close
190   sqlite3rbu rbu test.db rbu.db
191   rbu step
192 } {SQLITE_ERROR}
193 do_test 4.7.2 {
194   list [catch {rbu close} msg] $msg
195 } {1 {SQLITE_ERROR - rbu_state mismatch error}}
197 finish_test