Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Side by Side Diff: third_party/sqlite/sqlite-src-3080704/test/without_rowid3.test

Issue 883353008: [sql] Import reference version of SQLite 3.8.7.4. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Hold back encoding change which is messing up patch. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # 2009 September 15 1 # 2013-11-02
2 # 2 #
3 # The author disclaims copyright to this source code. In place of 3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing: 4 # a legal notice, here is a blessing:
5 # 5 #
6 # May you do good and not evil. 6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others. 7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give. 8 # May you share freely, never taking more than you give.
9 # 9 #
10 #*********************************************************************** 10 #***********************************************************************
11 # This file implements regression tests for SQLite library. 11 # This file implements regression tests for SQLite library.
12 # 12 #
13 # This file implements tests for foreign keys. 13 # This file implements tests for foreign keys on WITHOUT ROWID
14 # tables.
14 # 15 #
15 16
16 set testdir [file dirname $argv0] 17 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl 18 source $testdir/tester.tcl
18 19
19 ifcapable {!foreignkey||!trigger} { 20 ifcapable {!foreignkey||!trigger} {
20 finish_test 21 finish_test
21 return 22 return
22 } 23 }
23 24
24 #------------------------------------------------------------------------- 25 #-------------------------------------------------------------------------
25 # Test structure: 26 # Test structure:
26 # 27 #
27 # fkey2-1.*: Simple tests to check that immediate and deferred foreign key 28 # without_rowid3-1.*: Simple tests to check that immediate and deferred foreign key
28 # constraints work when not inside a transaction. 29 # constraints work when not inside a transaction.
29 # 30 #
30 # fkey2-2.*: Tests to verify that deferred foreign keys work inside 31 # without_rowid3-2.*: Tests to verify that deferred foreign keys work inside
31 # explicit transactions (i.e that processing really is deferred). 32 # explicit transactions (i.e that processing really is deferred).
32 # 33 #
33 # fkey2-3.*: Tests that a statement transaction is rolled back if an 34 # without_rowid3-3.*: Tests that a statement transaction is rolled back if an
34 # immediate foreign key constraint is violated. 35 # immediate foreign key constraint is violated.
35 # 36 #
36 # fkey2-4.*: Test that FK actions may recurse even when recursive triggers 37 # without_rowid3-4.*: Test that FK actions may recurse even when recursive trigg ers
37 # are disabled. 38 # are disabled.
38 # 39 #
39 # fkey2-5.*: Check that if foreign-keys are enabled, it is not possible 40 # without_rowid3-5.*: Check that if foreign-keys are enabled, it is not possible
40 # to write to an FK column using the incremental blob API. 41 # to write to an FK column using the incremental blob API.
41 # 42 #
42 # fkey2-6.*: Test that FK processing is automatically disabled when 43 # without_rowid3-6.*: Test that FK processing is automatically disabled when
43 # running VACUUM. 44 # running VACUUM.
44 # 45 #
45 # fkey2-7.*: Test using an IPK as the key in the child (referencing) table. 46 # without_rowid3-7.*: Test using an IPK as the key in the child (referencing) ta ble.
46 # 47 #
47 # fkey2-8.*: Test that enabling/disabling foreign key support while a 48 # without_rowid3-8.*: Test that enabling/disabling foreign key support while a
48 # transaction is active is not possible. 49 # transaction is active is not possible.
49 # 50 #
50 # fkey2-9.*: Test SET DEFAULT actions. 51 # without_rowid3-9.*: Test SET DEFAULT actions.
51 # 52 #
52 # fkey2-10.*: Test errors. 53 # without_rowid3-10.*: Test errors.
53 # 54 #
54 # fkey2-11.*: Test CASCADE actions. 55 # without_rowid3-11.*: Test CASCADE actions.
55 # 56 #
56 # fkey2-12.*: Test RESTRICT actions. 57 # without_rowid3-12.*: Test RESTRICT actions.
57 # 58 #
58 # fkey2-13.*: Test that FK processing is performed when a row is REPLACED by 59 # without_rowid3-13.*: Test that FK processing is performed when a row is REPLAC ED by
59 # an UPDATE or INSERT statement. 60 # an UPDATE or INSERT statement.
60 # 61 #
61 # fkey2-14.*: Test the ALTER TABLE and DROP TABLE commands. 62 # without_rowid3-14.*: Test the ALTER TABLE and DROP TABLE commands.
62 # 63 #
63 # fkey2-15.*: Test that if there are no (known) outstanding foreign key 64 # without_rowid3-15.*: Test that if there are no (known) outstanding foreign key
64 # constraint violations in the database, inserting into a parent 65 # constraint violations in the database, inserting into a parent
65 # table or deleting from a child table does not cause SQLite 66 # table or deleting from a child table does not cause SQLite
66 # to check if this has repaired an outstanding violation. 67 # to check if this has repaired an outstanding violation.
67 # 68 #
68 # fkey2-16.*: Test that rows that refer to themselves may be inserted, 69 # without_rowid3-16.*: Test that rows that refer to themselves may be inserted,
69 # updated and deleted. 70 # updated and deleted.
70 # 71 #
71 # fkey2-17.*: Test that the "count_changes" pragma does not interfere with 72 # without_rowid3-17.*: Test that the "count_changes" pragma does not interfere w ith
72 # FK constraint processing. 73 # FK constraint processing.
73 # 74 #
74 # fkey2-18.*: Test that the authorization callback is invoked when processing 75 # without_rowid3-18.*: Test that the authorization callback is invoked when proc essing
75 # FK constraints. 76 # FK constraints.
76 # 77 #
77 # fkey2-20.*: Test that ON CONFLICT clauses specified as part of statements 78 # without_rowid3-20.*: Test that ON CONFLICT clauses specified as part of statem ents
78 # do not affect the operation of FK constraints. 79 # do not affect the operation of FK constraints.
79 # 80 #
80 # fkey2-genfkey.*: Tests that were used with the shell tool .genfkey 81 # without_rowid3-genfkey.*: Tests that were used with the shell tool .genfkey
81 # command. Recycled to test the built-in implementation. 82 # command. Recycled to test the built-in implementation.
82 # 83 #
83 # fkey2-dd08e5.*: Tests to verify that ticket dd08e5a988d00decc4a543daa8d 84 # without_rowid3-dd08e5.*: Tests to verify that ticket dd08e5a988d00decc4a543da a8d
84 # has been fixed. 85 # has been fixed.
85 # 86 #
86 87
87 88
88 execsql { PRAGMA foreign_keys = on } 89 execsql { PRAGMA foreign_keys = on }
89 90
90 set FkeySimpleSchema { 91 set FkeySimpleSchema {
91 PRAGMA foreign_keys = on; 92 PRAGMA foreign_keys = on;
92 CREATE TABLE t1(a PRIMARY KEY, b); 93 CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT rowid;
93 CREATE TABLE t2(c REFERENCES t1(a) /D/ , d); 94 CREATE TABLE t2(c REFERENCES t1(a) /D/ , d);
94 95
95 CREATE TABLE t3(a PRIMARY KEY, b); 96 CREATE TABLE t3(a PRIMARY KEY, b) WITHOUT rowid;
96 CREATE TABLE t4(c REFERENCES t3 /D/, d); 97 CREATE TABLE t4(c REFERENCES t3 /D/, d);
97 98
98 CREATE TABLE t7(a, b INTEGER PRIMARY KEY); 99 CREATE TABLE t7(a, b INT PRIMARY KEY) WITHOUT rowid;
99 CREATE TABLE t8(c REFERENCES t7 /D/, d); 100 CREATE TABLE t8(c REFERENCES t7 /D/, d);
100 101
101 CREATE TABLE t9(a REFERENCES nosuchtable, b); 102 CREATE TABLE t9(a REFERENCES nosuchtable, b);
102 CREATE TABLE t10(a REFERENCES t9(c) /D/, b); 103 CREATE TABLE t10(a REFERENCES t9(c) /D/, b);
103 } 104 }
104 105
105 106
106 set FkeySimpleTests { 107 set FkeySimpleTests {
107 1.1 "INSERT INTO t2 VALUES(1, 3)" {1 {foreign key constraint failed}} 108 1.1 "INSERT INTO t2 VALUES(1, 3)" {1 {FOREIGN KEY constraint failed}}
108 1.2 "INSERT INTO t1 VALUES(1, 2)" {0 {}} 109 1.2 "INSERT INTO t1 VALUES(1, 2)" {0 {}}
109 1.3 "INSERT INTO t2 VALUES(1, 3)" {0 {}} 110 1.3 "INSERT INTO t2 VALUES(1, 3)" {0 {}}
110 1.4 "INSERT INTO t2 VALUES(2, 4)" {1 {foreign key constraint failed}} 111 1.4 "INSERT INTO t2 VALUES(2, 4)" {1 {FOREIGN KEY constraint failed}}
111 1.5 "INSERT INTO t2 VALUES(NULL, 4)" {0 {}} 112 1.5 "INSERT INTO t2 VALUES(NULL, 4)" {0 {}}
112 1.6 "UPDATE t2 SET c=2 WHERE d=4" {1 {foreign key constraint failed}} 113 1.6 "UPDATE t2 SET c=2 WHERE d=4" {1 {FOREIGN KEY constraint failed}}
113 1.7 "UPDATE t2 SET c=1 WHERE d=4" {0 {}} 114 1.7 "UPDATE t2 SET c=1 WHERE d=4" {0 {}}
114 1.9 "UPDATE t2 SET c=1 WHERE d=4" {0 {}} 115 1.9 "UPDATE t2 SET c=1 WHERE d=4" {0 {}}
115 1.10 "UPDATE t2 SET c=NULL WHERE d=4" {0 {}} 116 1.10 "UPDATE t2 SET c=NULL WHERE d=4" {0 {}}
116 1.11 "DELETE FROM t1 WHERE a=1" {1 {foreign key constraint failed}} 117 1.11 "DELETE FROM t1 WHERE a=1" {1 {FOREIGN KEY constraint failed}}
117 1.12 "UPDATE t1 SET a = 2" {1 {foreign key constraint failed}} 118 1.12 "UPDATE t1 SET a = 2" {1 {FOREIGN KEY constraint failed}}
118 1.13 "UPDATE t1 SET a = 1" {0 {}} 119 1.13 "UPDATE t1 SET a = 1" {0 {}}
119 120
120 2.1 "INSERT INTO t4 VALUES(1, 3)" {1 {foreign key constraint failed}} 121 2.1 "INSERT INTO t4 VALUES(1, 3)" {1 {FOREIGN KEY constraint failed}}
121 2.2 "INSERT INTO t3 VALUES(1, 2)" {0 {}} 122 2.2 "INSERT INTO t3 VALUES(1, 2)" {0 {}}
122 2.3 "INSERT INTO t4 VALUES(1, 3)" {0 {}} 123 2.3 "INSERT INTO t4 VALUES(1, 3)" {0 {}}
123 124
124 4.1 "INSERT INTO t8 VALUES(1, 3)" {1 {foreign key constraint failed}} 125 4.1 "INSERT INTO t8 VALUES(1, 3)" {1 {FOREIGN KEY constraint failed}}
125 4.2 "INSERT INTO t7 VALUES(2, 1)" {0 {}} 126 4.2 "INSERT INTO t7 VALUES(2, 1)" {0 {}}
126 4.3 "INSERT INTO t8 VALUES(1, 3)" {0 {}} 127 4.3 "INSERT INTO t8 VALUES(1, 3)" {0 {}}
127 4.4 "INSERT INTO t8 VALUES(2, 4)" {1 {foreign key constraint failed}} 128 4.4 "INSERT INTO t8 VALUES(2, 4)" {1 {FOREIGN KEY constraint failed}}
128 4.5 "INSERT INTO t8 VALUES(NULL, 4)" {0 {}} 129 4.5 "INSERT INTO t8 VALUES(NULL, 4)" {0 {}}
129 4.6 "UPDATE t8 SET c=2 WHERE d=4" {1 {foreign key constraint failed}} 130 4.6 "UPDATE t8 SET c=2 WHERE d=4" {1 {FOREIGN KEY constraint failed}}
130 4.7 "UPDATE t8 SET c=1 WHERE d=4" {0 {}} 131 4.7 "UPDATE t8 SET c=1 WHERE d=4" {0 {}}
131 4.9 "UPDATE t8 SET c=1 WHERE d=4" {0 {}} 132 4.9 "UPDATE t8 SET c=1 WHERE d=4" {0 {}}
132 4.10 "UPDATE t8 SET c=NULL WHERE d=4" {0 {}} 133 4.10 "UPDATE t8 SET c=NULL WHERE d=4" {0 {}}
133 4.11 "DELETE FROM t7 WHERE b=1" {1 {foreign key constraint failed}} 134 4.11 "DELETE FROM t7 WHERE b=1" {1 {FOREIGN KEY constraint failed}}
134 4.12 "UPDATE t7 SET b = 2" {1 {foreign key constraint failed}} 135 4.12 "UPDATE t7 SET b = 2" {1 {FOREIGN KEY constraint failed}}
135 4.13 "UPDATE t7 SET b = 1" {0 {}} 136 4.13 "UPDATE t7 SET b = 1" {0 {}}
136 4.14 "INSERT INTO t8 VALUES('a', 'b')" {1 {foreign key constraint failed}} 137 4.14 "INSERT INTO t8 VALUES('a', 'b')" {1 {FOREIGN KEY constraint failed}}
137 4.15 "UPDATE t7 SET b = 5" {1 {foreign key constraint failed}} 138 4.15 "UPDATE t7 SET b = 5" {1 {FOREIGN KEY constraint failed}}
138 4.16 "UPDATE t7 SET rowid = 5" {1 {foreign key constraint failed}}
139 4.17 "UPDATE t7 SET a = 10" {0 {}} 139 4.17 "UPDATE t7 SET a = 10" {0 {}}
140 140
141 5.1 "INSERT INTO t9 VALUES(1, 3)" {1 {no such table: main.nosuchtable}} 141 5.1 "INSERT INTO t9 VALUES(1, 3)" {1 {no such table: main.nosuchtable}}
142 5.2 "INSERT INTO t10 VALUES(1, 3)" {1 {foreign key mismatch}} 142 5.2 "INSERT INTO t10 VALUES(1, 3)"
143 {1 {foreign key mismatch - "t10" referencing "t9"}}
143 } 144 }
144 145
145 do_test fkey2-1.1.0 { 146 do_test without_rowid3-1.1.0 {
146 execsql [string map {/D/ {}} $FkeySimpleSchema] 147 execsql [string map {/D/ {}} $FkeySimpleSchema]
147 } {} 148 } {}
148 foreach {tn zSql res} $FkeySimpleTests { 149 foreach {tn zSql res} $FkeySimpleTests {
149 do_test fkey2-1.1.$tn { catchsql $zSql } $res 150 do_test without_rowid3-1.1.$tn.1 { catchsql $zSql } $res
151 do_test without_rowid3-1.1.$tn.2 { execsql {PRAGMA foreign_key_check(t1)} } {}
152 do_test without_rowid3-1.1.$tn.3 { execsql {PRAGMA foreign_key_check(t2)} } {}
153 do_test without_rowid3-1.1.$tn.4 { execsql {PRAGMA foreign_key_check(t3)} } {}
154 do_test without_rowid3-1.1.$tn.5 { execsql {PRAGMA foreign_key_check(t4)} } {}
155 do_test without_rowid3-1.1.$tn.6 { execsql {PRAGMA foreign_key_check(t7)} } {}
156 do_test without_rowid3-1.1.$tn.7 { execsql {PRAGMA foreign_key_check(t8)} } {}
150 } 157 }
151 drop_all_tables 158 drop_all_tables
152 159
153 do_test fkey2-1.2.0 { 160 do_test without_rowid3-1.2.0 {
154 execsql [string map {/D/ {DEFERRABLE INITIALLY DEFERRED}} $FkeySimpleSchema] 161 execsql [string map {/D/ {DEFERRABLE INITIALLY DEFERRED}} $FkeySimpleSchema]
155 } {} 162 } {}
156 foreach {tn zSql res} $FkeySimpleTests { 163 foreach {tn zSql res} $FkeySimpleTests {
157 do_test fkey2-1.2.$tn { catchsql $zSql } $res 164 do_test without_rowid3-1.2.$tn { catchsql $zSql } $res
165 do_test without_rowid3-1.2.$tn.2 { execsql {PRAGMA foreign_key_check(t1)} } {}
166 do_test without_rowid3-1.2.$tn.3 { execsql {PRAGMA foreign_key_check(t2)} } {}
167 do_test without_rowid3-1.2.$tn.4 { execsql {PRAGMA foreign_key_check(t3)} } {}
168 do_test without_rowid3-1.2.$tn.5 { execsql {PRAGMA foreign_key_check(t4)} } {}
169 do_test without_rowid3-1.2.$tn.6 { execsql {PRAGMA foreign_key_check(t7)} } {}
170 do_test without_rowid3-1.2.$tn.7 { execsql {PRAGMA foreign_key_check(t8)} } {}
158 } 171 }
159 drop_all_tables 172 drop_all_tables
160 173
161 do_test fkey2-1.3.0 { 174 do_test without_rowid3-1.3.0 {
162 execsql [string map {/D/ {}} $FkeySimpleSchema] 175 execsql [string map {/D/ {}} $FkeySimpleSchema]
163 execsql { PRAGMA count_changes = 1 } 176 execsql { PRAGMA count_changes = 1 }
164 } {} 177 } {}
165 foreach {tn zSql res} $FkeySimpleTests { 178 foreach {tn zSql res} $FkeySimpleTests {
166 if {$res == "0 {}"} { set res {0 1} } 179 if {$res == "0 {}"} { set res {0 1} }
167 do_test fkey2-1.3.$tn { catchsql $zSql } $res 180 do_test without_rowid3-1.3.$tn { catchsql $zSql } $res
181 do_test without_rowid3-1.3.$tn.2 { execsql {PRAGMA foreign_key_check(t1)} } {}
182 do_test without_rowid3-1.3.$tn.3 { execsql {PRAGMA foreign_key_check(t2)} } {}
183 do_test without_rowid3-1.3.$tn.4 { execsql {PRAGMA foreign_key_check(t3)} } {}
184 do_test without_rowid3-1.3.$tn.5 { execsql {PRAGMA foreign_key_check(t4)} } {}
185 do_test without_rowid3-1.3.$tn.6 { execsql {PRAGMA foreign_key_check(t7)} } {}
186 do_test without_rowid3-1.3.$tn.7 { execsql {PRAGMA foreign_key_check(t8)} } {}
168 } 187 }
169 execsql { PRAGMA count_changes = 0 } 188 execsql { PRAGMA count_changes = 0 }
170 drop_all_tables 189 drop_all_tables
171 190
172 do_test fkey2-1.4.0 { 191 do_test without_rowid3-1.4.0 {
173 execsql [string map {/D/ {}} $FkeySimpleSchema] 192 execsql [string map {/D/ {}} $FkeySimpleSchema]
174 execsql { PRAGMA count_changes = 1 } 193 execsql { PRAGMA count_changes = 1 }
175 } {} 194 } {}
176 foreach {tn zSql res} $FkeySimpleTests { 195 foreach {tn zSql res} $FkeySimpleTests {
177 if {$res == "0 {}"} { set res {0 1} } 196 if {$res == "0 {}"} { set res {0 1} }
178 execsql BEGIN 197 execsql BEGIN
179 do_test fkey2-1.4.$tn { catchsql $zSql } $res 198 do_test without_rowid3-1.4.$tn { catchsql $zSql } $res
180 execsql COMMIT 199 execsql COMMIT
181 } 200 }
182 execsql { PRAGMA count_changes = 0 } 201 execsql { PRAGMA count_changes = 0 }
183 drop_all_tables 202 drop_all_tables
184 203
185 # Special test: When the parent key is an IPK, make sure the affinity of 204 # Special test: When the parent key is an IPK, make sure the affinity of
186 # the IPK is not applied to the child key value before it is inserted 205 # the IPK is not applied to the child key value before it is inserted
187 # into the child table. 206 # into the child table.
188 do_test fkey2-1.5.1 { 207 do_test without_rowid3-1.5.1 {
189 execsql { 208 execsql {
190 CREATE TABLE i(i INTEGER PRIMARY KEY); 209 CREATE TABLE i(i INT PRIMARY KEY) WITHOUT rowid;
191 CREATE TABLE j(j REFERENCES i); 210 CREATE TABLE j(j REFERENCES i);
192 INSERT INTO i VALUES(35); 211 INSERT INTO i VALUES(35);
193 INSERT INTO j VALUES('35.0'); 212 INSERT INTO j VALUES('35.0');
194 SELECT j, typeof(j) FROM j; 213 SELECT j, typeof(j) FROM j;
195 } 214 }
196 } {35.0 text} 215 } {35.0 text}
197 do_test fkey2-1.5.2 { 216 do_test without_rowid3-1.5.2 {
198 catchsql { DELETE FROM i } 217 catchsql { DELETE FROM i }
199 } {1 {foreign key constraint failed}} 218 } {1 {FOREIGN KEY constraint failed}}
200 219
201 # Same test using a regular primary key with integer affinity. 220 # Same test using a regular primary key with integer affinity.
202 drop_all_tables 221 drop_all_tables
203 do_test fkey2-1.6.1 { 222 do_test without_rowid3-1.6.1 {
204 execsql { 223 execsql {
205 CREATE TABLE i(i INT UNIQUE); 224 CREATE TABLE i(i INT UNIQUE);
206 CREATE TABLE j(j REFERENCES i(i)); 225 CREATE TABLE j(j REFERENCES i(i));
207 INSERT INTO i VALUES('35.0'); 226 INSERT INTO i VALUES('35.0');
208 INSERT INTO j VALUES('35.0'); 227 INSERT INTO j VALUES('35.0');
209 SELECT j, typeof(j) FROM j; 228 SELECT j, typeof(j) FROM j;
210 SELECT i, typeof(i) FROM i; 229 SELECT i, typeof(i) FROM i;
211 } 230 }
212 } {35.0 text 35 integer} 231 } {35.0 text 35 integer}
213 do_test fkey2-1.6.2 { 232 do_test without_rowid3-1.6.2 {
214 catchsql { DELETE FROM i } 233 catchsql { DELETE FROM i }
215 } {1 {foreign key constraint failed}} 234 } {1 {FOREIGN KEY constraint failed}}
216 235
217 # Use a collation sequence on the parent key. 236 # Use a collation sequence on the parent key.
218 drop_all_tables 237 drop_all_tables
219 do_test fkey2-1.7.1 { 238 do_test without_rowid3-1.7.1 {
220 execsql { 239 execsql {
221 CREATE TABLE i(i TEXT COLLATE nocase PRIMARY KEY); 240 CREATE TABLE i(i TEXT COLLATE nocase PRIMARY KEY) WITHOUT rowid;
222 CREATE TABLE j(j TEXT COLLATE binary REFERENCES i(i)); 241 CREATE TABLE j(j TEXT COLLATE binary REFERENCES i(i));
223 INSERT INTO i VALUES('SQLite'); 242 INSERT INTO i VALUES('SQLite');
224 INSERT INTO j VALUES('sqlite'); 243 INSERT INTO j VALUES('sqlite');
225 } 244 }
226 catchsql { DELETE FROM i } 245 catchsql { DELETE FROM i }
227 } {1 {foreign key constraint failed}} 246 } {1 {FOREIGN KEY constraint failed}}
228 247
229 # Use the parent key collation even if it is default and the child key 248 # Use the parent key collation even if it is default and the child key
230 # has an explicit value. 249 # has an explicit value.
231 drop_all_tables 250 drop_all_tables
232 do_test fkey2-1.7.2 { 251 do_test without_rowid3-1.7.2 {
233 execsql { 252 execsql {
234 CREATE TABLE i(i TEXT PRIMARY KEY); -- Colseq is "BINARY" 253 CREATE TABLE i(i TEXT PRIMARY KEY) WITHOUT rowid; -- Colseq is "BINARY"
235 CREATE TABLE j(j TEXT COLLATE nocase REFERENCES i(i)); 254 CREATE TABLE j(j TEXT COLLATE nocase REFERENCES i(i));
236 INSERT INTO i VALUES('SQLite'); 255 INSERT INTO i VALUES('SQLite');
237 } 256 }
238 catchsql { INSERT INTO j VALUES('sqlite') } 257 catchsql { INSERT INTO j VALUES('sqlite') }
239 } {1 {foreign key constraint failed}} 258 } {1 {FOREIGN KEY constraint failed}}
240 do_test fkey2-1.7.3 { 259 do_test without_rowid3-1.7.3 {
241 execsql { 260 execsql {
242 INSERT INTO i VALUES('sqlite'); 261 INSERT INTO i VALUES('sqlite');
243 INSERT INTO j VALUES('sqlite'); 262 INSERT INTO j VALUES('sqlite');
244 DELETE FROM i WHERE i = 'SQLite'; 263 DELETE FROM i WHERE i = 'SQLite';
245 } 264 }
246 catchsql { DELETE FROM i WHERE i = 'sqlite' } 265 catchsql { DELETE FROM i WHERE i = 'sqlite' }
247 } {1 {foreign key constraint failed}} 266 } {1 {FOREIGN KEY constraint failed}}
248 267
249 #------------------------------------------------------------------------- 268 #-------------------------------------------------------------------------
250 # This section (test cases fkey2-2.*) contains tests to check that the 269 # This section (test cases without_rowid3-2.*) contains tests to check that the
251 # deferred foreign key constraint logic works. 270 # deferred foreign key constraint logic works.
252 # 271 #
253 proc fkey2-2-test {tn nocommit sql {res {}}} { 272 proc without_rowid3-2-test {tn nocommit sql {res {}}} {
254 if {$res eq "FKV"} { 273 if {$res eq "FKV"} {
255 set expected {1 {foreign key constraint failed}} 274 set expected {1 {FOREIGN KEY constraint failed}}
256 } else { 275 } else {
257 set expected [list 0 $res] 276 set expected [list 0 $res]
258 } 277 }
259 do_test fkey2-2.$tn [list catchsql $sql] $expected 278 do_test without_rowid3-2.$tn [list catchsql $sql] $expected
260 if {$nocommit} { 279 if {$nocommit} {
261 do_test fkey2-2.${tn}c { 280 do_test without_rowid3-2.${tn}c {
262 catchsql COMMIT 281 catchsql COMMIT
263 } {1 {foreign key constraint failed}} 282 } {1 {FOREIGN KEY constraint failed}}
264 } 283 }
265 } 284 }
266 285
267 fkey2-2-test 1 0 { 286 without_rowid3-2-test 1 0 {
268 CREATE TABLE node( 287 CREATE TABLE node(
269 nodeid PRIMARY KEY, 288 nodeid PRIMARY KEY,
270 parent REFERENCES node DEFERRABLE INITIALLY DEFERRED 289 parent REFERENCES node DEFERRABLE INITIALLY DEFERRED
271 ); 290 ) WITHOUT rowid;
272 CREATE TABLE leaf( 291 CREATE TABLE leaf(
273 cellid PRIMARY KEY, 292 cellid PRIMARY KEY,
274 parent REFERENCES node DEFERRABLE INITIALLY DEFERRED 293 parent REFERENCES node DEFERRABLE INITIALLY DEFERRED
275 ); 294 ) WITHOUT rowid;
276 } 295 }
277 296
278 fkey2-2-test 1 0 "INSERT INTO node VALUES(1, 0)" FKV 297 without_rowid3-2-test 1 0 "INSERT INTO node VALUES(1, 0)" FKV
279 fkey2-2-test 2 0 "BEGIN" 298 without_rowid3-2-test 2 0 "BEGIN"
280 fkey2-2-test 3 1 "INSERT INTO node VALUES(1, 0)" 299 without_rowid3-2-test 3 1 "INSERT INTO node VALUES(1, 0)"
281 fkey2-2-test 4 0 "UPDATE node SET parent = NULL" 300 without_rowid3-2-test 4 0 "UPDATE node SET parent = NULL"
282 fkey2-2-test 5 0 "COMMIT" 301 without_rowid3-2-test 5 0 "COMMIT"
283 fkey2-2-test 6 0 "SELECT * FROM node" {1 {}} 302 without_rowid3-2-test 6 0 "SELECT * FROM node" {1 {}}
284 303
285 fkey2-2-test 7 0 "BEGIN" 304 without_rowid3-2-test 7 0 "BEGIN"
286 fkey2-2-test 8 1 "INSERT INTO leaf VALUES('a', 2)" 305 without_rowid3-2-test 8 1 "INSERT INTO leaf VALUES('a', 2)"
287 fkey2-2-test 9 1 "INSERT INTO node VALUES(2, 0)" 306 without_rowid3-2-test 9 1 "INSERT INTO node VALUES(2, 0)"
288 fkey2-2-test 10 0 "UPDATE node SET parent = 1 WHERE nodeid = 2" 307 without_rowid3-2-test 10 0 "UPDATE node SET parent = 1 WHERE nodeid = 2"
289 fkey2-2-test 11 0 "COMMIT" 308 without_rowid3-2-test 11 0 "COMMIT"
290 fkey2-2-test 12 0 "SELECT * FROM node" {1 {} 2 1} 309 without_rowid3-2-test 12 0 "SELECT * FROM node" {1 {} 2 1}
291 fkey2-2-test 13 0 "SELECT * FROM leaf" {a 2} 310 without_rowid3-2-test 13 0 "SELECT * FROM leaf" {a 2}
292 311
293 fkey2-2-test 14 0 "BEGIN" 312 without_rowid3-2-test 14 0 "BEGIN"
294 fkey2-2-test 15 1 "DELETE FROM node WHERE nodeid = 2" 313 without_rowid3-2-test 15 1 "DELETE FROM node WHERE nodeid = 2"
295 fkey2-2-test 16 0 "INSERT INTO node VALUES(2, NULL)" 314 without_rowid3-2-test 16 0 "INSERT INTO node VALUES(2, NULL)"
296 fkey2-2-test 17 0 "COMMIT" 315 without_rowid3-2-test 17 0 "COMMIT"
297 fkey2-2-test 18 0 "SELECT * FROM node" {1 {} 2 {}} 316 without_rowid3-2-test 18 0 "SELECT * FROM node" {1 {} 2 {}}
298 fkey2-2-test 19 0 "SELECT * FROM leaf" {a 2} 317 without_rowid3-2-test 19 0 "SELECT * FROM leaf" {a 2}
299 318
300 fkey2-2-test 20 0 "BEGIN" 319 without_rowid3-2-test 20 0 "BEGIN"
301 fkey2-2-test 21 0 "INSERT INTO leaf VALUES('b', 1)" 320 without_rowid3-2-test 21 0 "INSERT INTO leaf VALUES('b', 1)"
302 fkey2-2-test 22 0 "SAVEPOINT save" 321 without_rowid3-2-test 22 0 "SAVEPOINT save"
303 fkey2-2-test 23 0 "DELETE FROM node WHERE nodeid = 1" 322 without_rowid3-2-test 23 0 "DELETE FROM node WHERE nodeid = 1"
304 fkey2-2-test 24 0 "ROLLBACK TO save" 323 without_rowid3-2-test 24 0 "ROLLBACK TO save"
305 fkey2-2-test 25 0 "COMMIT" 324 without_rowid3-2-test 25 0 "COMMIT"
306 fkey2-2-test 26 0 "SELECT * FROM node" {1 {} 2 {}} 325 without_rowid3-2-test 26 0 "SELECT * FROM node" {1 {} 2 {}}
307 fkey2-2-test 27 0 "SELECT * FROM leaf" {a 2 b 1} 326 without_rowid3-2-test 27 0 "SELECT * FROM leaf" {a 2 b 1}
308 327
309 fkey2-2-test 28 0 "BEGIN" 328 without_rowid3-2-test 28 0 "BEGIN"
310 fkey2-2-test 29 0 "INSERT INTO leaf VALUES('c', 1)" 329 without_rowid3-2-test 29 0 "INSERT INTO leaf VALUES('c', 1)"
311 fkey2-2-test 30 0 "SAVEPOINT save" 330 without_rowid3-2-test 30 0 "SAVEPOINT save"
312 fkey2-2-test 31 0 "DELETE FROM node WHERE nodeid = 1" 331 without_rowid3-2-test 31 0 "DELETE FROM node WHERE nodeid = 1"
313 fkey2-2-test 32 1 "RELEASE save" 332 without_rowid3-2-test 32 1 "RELEASE save"
314 fkey2-2-test 33 1 "DELETE FROM leaf WHERE cellid = 'b'" 333 without_rowid3-2-test 33 1 "DELETE FROM leaf WHERE cellid = 'b'"
315 fkey2-2-test 34 0 "DELETE FROM leaf WHERE cellid = 'c'" 334 without_rowid3-2-test 34 0 "DELETE FROM leaf WHERE cellid = 'c'"
316 fkey2-2-test 35 0 "COMMIT" 335 without_rowid3-2-test 35 0 "COMMIT"
317 fkey2-2-test 36 0 "SELECT * FROM node" {2 {}} 336 without_rowid3-2-test 36 0 "SELECT * FROM node" {2 {}}
318 fkey2-2-test 37 0 "SELECT * FROM leaf" {a 2} 337 without_rowid3-2-test 37 0 "SELECT * FROM leaf" {a 2}
319 338
320 fkey2-2-test 38 0 "SAVEPOINT outer" 339 without_rowid3-2-test 38 0 "SAVEPOINT outer"
321 fkey2-2-test 39 1 "INSERT INTO leaf VALUES('d', 3)" 340 without_rowid3-2-test 39 1 "INSERT INTO leaf VALUES('d', 3)"
322 fkey2-2-test 40 1 "RELEASE outer" FKV 341 without_rowid3-2-test 40 1 "RELEASE outer" FKV
323 fkey2-2-test 41 1 "INSERT INTO leaf VALUES('e', 3)" 342 without_rowid3-2-test 41 1 "INSERT INTO leaf VALUES('e', 3)"
324 fkey2-2-test 42 0 "INSERT INTO node VALUES(3, 2)" 343 without_rowid3-2-test 42 0 "INSERT INTO node VALUES(3, 2)"
325 fkey2-2-test 43 0 "RELEASE outer" 344 without_rowid3-2-test 43 0 "RELEASE outer"
326 345
327 fkey2-2-test 44 0 "SAVEPOINT outer" 346 without_rowid3-2-test 44 0 "SAVEPOINT outer"
328 fkey2-2-test 45 1 "DELETE FROM node WHERE nodeid=3" 347 without_rowid3-2-test 45 1 "DELETE FROM node WHERE nodeid=3"
329 fkey2-2-test 47 0 "INSERT INTO node VALUES(3, 2)" 348 without_rowid3-2-test 47 0 "INSERT INTO node VALUES(3, 2)"
330 fkey2-2-test 48 0 "ROLLBACK TO outer" 349 without_rowid3-2-test 48 0 "ROLLBACK TO outer"
331 fkey2-2-test 49 0 "RELEASE outer" 350 without_rowid3-2-test 49 0 "RELEASE outer"
332 351
333 fkey2-2-test 50 0 "SAVEPOINT outer" 352 without_rowid3-2-test 50 0 "SAVEPOINT outer"
334 fkey2-2-test 51 1 "INSERT INTO leaf VALUES('f', 4)" 353 without_rowid3-2-test 51 1 "INSERT INTO leaf VALUES('f', 4)"
335 fkey2-2-test 52 1 "SAVEPOINT inner" 354 without_rowid3-2-test 52 1 "SAVEPOINT inner"
336 fkey2-2-test 53 1 "INSERT INTO leaf VALUES('g', 4)" 355 without_rowid3-2-test 53 1 "INSERT INTO leaf VALUES('g', 4)"
337 fkey2-2-test 54 1 "RELEASE outer" FKV 356 without_rowid3-2-test 54 1 "RELEASE outer" FKV
338 fkey2-2-test 55 1 "ROLLBACK TO inner" 357 without_rowid3-2-test 55 1 "ROLLBACK TO inner"
339 fkey2-2-test 56 0 "COMMIT" FKV 358 without_rowid3-2-test 56 0 "COMMIT" FKV
340 fkey2-2-test 57 0 "INSERT INTO node VALUES(4, NULL)" 359 without_rowid3-2-test 57 0 "INSERT INTO node VALUES(4, NULL)"
341 fkey2-2-test 58 0 "RELEASE outer" 360 without_rowid3-2-test 58 0 "RELEASE outer"
342 fkey2-2-test 59 0 "SELECT * FROM node" {2 {} 3 2 4 {}} 361 without_rowid3-2-test 59 0 "SELECT * FROM node" {2 {} 3 2 4 {}}
343 fkey2-2-test 60 0 "SELECT * FROM leaf" {a 2 d 3 e 3 f 4} 362 without_rowid3-2-test 60 0 "SELECT * FROM leaf" {a 2 d 3 e 3 f 4}
344 363
345 # The following set of tests check that if a statement that affects 364 # The following set of tests check that if a statement that affects
346 # multiple rows violates some foreign key constraints, then strikes a 365 # multiple rows violates some foreign key constraints, then strikes a
347 # constraint that causes the statement-transaction to be rolled back, 366 # constraint that causes the statement-transaction to be rolled back,
348 # the deferred constraint counter is correctly reset to the value it 367 # the deferred constraint counter is correctly reset to the value it
349 # had before the statement-transaction was opened. 368 # had before the statement-transaction was opened.
350 # 369 #
351 fkey2-2-test 61 0 "BEGIN" 370 without_rowid3-2-test 61 0 "BEGIN"
352 fkey2-2-test 62 0 "DELETE FROM leaf" 371 without_rowid3-2-test 62 0 "DELETE FROM leaf"
353 fkey2-2-test 63 0 "DELETE FROM node" 372 without_rowid3-2-test 63 0 "DELETE FROM node"
354 fkey2-2-test 64 1 "INSERT INTO leaf VALUES('a', 1)" 373 without_rowid3-2-test 64 1 "INSERT INTO leaf VALUES('a', 1)"
355 fkey2-2-test 65 1 "INSERT INTO leaf VALUES('b', 2)" 374 without_rowid3-2-test 65 1 "INSERT INTO leaf VALUES('b', 2)"
356 fkey2-2-test 66 1 "INSERT INTO leaf VALUES('c', 1)" 375 without_rowid3-2-test 66 1 "INSERT INTO leaf VALUES('c', 1)"
357 do_test fkey2-2-test-67 { 376 do_test without_rowid3-2-test-67 {
358 catchsql "INSERT INTO node SELECT parent, 3 FROM leaf" 377 catchsql "INSERT INTO node SELECT parent, 3 FROM leaf"
359 } {1 {column nodeid is not unique}} 378 } {1 {UNIQUE constraint failed: node.nodeid}}
360 fkey2-2-test 68 0 "COMMIT" FKV 379 without_rowid3-2-test 68 0 "COMMIT" FKV
361 fkey2-2-test 69 1 "INSERT INTO node VALUES(1, NULL)" 380 without_rowid3-2-test 69 1 "INSERT INTO node VALUES(1, NULL)"
362 fkey2-2-test 70 0 "INSERT INTO node VALUES(2, NULL)" 381 without_rowid3-2-test 70 0 "INSERT INTO node VALUES(2, NULL)"
363 fkey2-2-test 71 0 "COMMIT" 382 without_rowid3-2-test 71 0 "COMMIT"
364 383
365 fkey2-2-test 72 0 "BEGIN" 384 without_rowid3-2-test 72 0 "BEGIN"
366 fkey2-2-test 73 1 "DELETE FROM node" 385 without_rowid3-2-test 73 1 "DELETE FROM node"
367 fkey2-2-test 74 0 "INSERT INTO node(nodeid) SELECT DISTINCT parent FROM leaf" 386 without_rowid3-2-test 74 0 "INSERT INTO node(nodeid) SELECT DISTINCT parent FR OM leaf"
368 fkey2-2-test 75 0 "COMMIT" 387 without_rowid3-2-test 75 0 "COMMIT"
369 388
370 #------------------------------------------------------------------------- 389 #-------------------------------------------------------------------------
371 # Test cases fkey2-3.* test that a program that executes foreign key 390 # Test cases without_rowid3-3.* test that a program that executes foreign key
372 # actions (CASCADE, SET DEFAULT, SET NULL etc.) or tests FK constraints 391 # actions (CASCADE, SET DEFAULT, SET NULL etc.) or tests FK constraints
373 # opens a statement transaction if required. 392 # opens a statement transaction if required.
374 # 393 #
375 # fkey2-3.1.*: Test UPDATE statements. 394 # without_rowid3-3.1.*: Test UPDATE statements.
376 # fkey2-3.2.*: Test DELETE statements. 395 # without_rowid3-3.2.*: Test DELETE statements.
377 # 396 #
378 drop_all_tables 397 drop_all_tables
379 do_test fkey2-3.1.1 { 398 do_test without_rowid3-3.1.1 {
380 execsql { 399 execsql {
381 CREATE TABLE ab(a PRIMARY KEY, b); 400 CREATE TABLE ab(a PRIMARY KEY, b) WITHOUT rowid;
382 CREATE TABLE cd( 401 CREATE TABLE cd(
383 c PRIMARY KEY REFERENCES ab ON UPDATE CASCADE ON DELETE CASCADE, 402 c PRIMARY KEY REFERENCES ab ON UPDATE CASCADE ON DELETE CASCADE,
384 d 403 d
385 ); 404 ) WITHOUT rowid;
386 CREATE TABLE ef( 405 CREATE TABLE ef(
387 e REFERENCES cd ON UPDATE CASCADE, 406 e REFERENCES cd ON UPDATE CASCADE,
388 f, CHECK (e!=5) 407 f, CHECK (e!=5)
389 ); 408 );
390 } 409 }
391 } {} 410 } {}
392 do_test fkey2-3.1.2 { 411 do_test without_rowid3-3.1.2 {
393 execsql { 412 execsql {
394 INSERT INTO ab VALUES(1, 'b'); 413 INSERT INTO ab VALUES(1, 'b');
395 INSERT INTO cd VALUES(1, 'd'); 414 INSERT INTO cd VALUES(1, 'd');
396 INSERT INTO ef VALUES(1, 'e'); 415 INSERT INTO ef VALUES(1, 'e');
397 } 416 }
398 } {} 417 } {}
399 do_test fkey2-3.1.3 { 418 do_test without_rowid3-3.1.3 {
400 catchsql { UPDATE ab SET a = 5 } 419 catchsql { UPDATE ab SET a = 5 }
401 } {1 {constraint failed}} 420 } {1 {CHECK constraint failed: ef}}
402 do_test fkey2-3.1.4 { 421 do_test without_rowid3-3.1.4 {
403 execsql { SELECT * FROM ab } 422 execsql { SELECT * FROM ab }
404 } {1 b} 423 } {1 b}
405 do_test fkey2-3.1.4 { 424 do_test without_rowid3-3.1.4 {
406 execsql BEGIN; 425 execsql BEGIN;
407 catchsql { UPDATE ab SET a = 5 } 426 catchsql { UPDATE ab SET a = 5 }
408 } {1 {constraint failed}} 427 } {1 {CHECK constraint failed: ef}}
409 do_test fkey2-3.1.5 { 428 do_test without_rowid3-3.1.5 {
410 execsql COMMIT; 429 execsql COMMIT;
411 execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef } 430 execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef }
412 } {1 b 1 d 1 e} 431 } {1 b 1 d 1 e}
413 432
414 do_test fkey2-3.2.1 { 433 do_test without_rowid3-3.2.1 {
415 execsql BEGIN; 434 execsql BEGIN;
416 catchsql { DELETE FROM ab } 435 catchsql { DELETE FROM ab }
417 } {1 {foreign key constraint failed}} 436 } {1 {FOREIGN KEY constraint failed}}
418 do_test fkey2-3.2.2 { 437 do_test without_rowid3-3.2.2 {
419 execsql COMMIT 438 execsql COMMIT
420 execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef } 439 execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef }
421 } {1 b 1 d 1 e} 440 } {1 b 1 d 1 e}
422 441
423 #------------------------------------------------------------------------- 442 #-------------------------------------------------------------------------
424 # Test cases fkey2-4.* test that recursive foreign key actions 443 # Test cases without_rowid3-4.* test that recursive foreign key actions
425 # (i.e. CASCADE) are allowed even if recursive triggers are disabled. 444 # (i.e. CASCADE) are allowed even if recursive triggers are disabled.
426 # 445 #
427 drop_all_tables 446 drop_all_tables
428 do_test fkey2-4.1 { 447 do_test without_rowid3-4.1 {
429 execsql { 448 execsql {
430 CREATE TABLE t1( 449 CREATE TABLE t1(
431 node PRIMARY KEY, 450 node PRIMARY KEY,
432 parent REFERENCES t1 ON DELETE CASCADE 451 parent REFERENCES t1 ON DELETE CASCADE
433 ); 452 ) WITHOUT rowid;
434 CREATE TABLE t2(node PRIMARY KEY, parent); 453 CREATE TABLE t2(node PRIMARY KEY, parent) WITHOUT rowid;
435 CREATE TRIGGER t2t AFTER DELETE ON t2 BEGIN 454 CREATE TRIGGER t2t AFTER DELETE ON t2 BEGIN
436 DELETE FROM t2 WHERE parent = old.node; 455 DELETE FROM t2 WHERE parent = old.node;
437 END; 456 END;
438 INSERT INTO t1 VALUES(1, NULL); 457 INSERT INTO t1 VALUES(1, NULL);
439 INSERT INTO t1 VALUES(2, 1); 458 INSERT INTO t1 VALUES(2, 1);
440 INSERT INTO t1 VALUES(3, 1); 459 INSERT INTO t1 VALUES(3, 1);
441 INSERT INTO t1 VALUES(4, 2); 460 INSERT INTO t1 VALUES(4, 2);
442 INSERT INTO t1 VALUES(5, 2); 461 INSERT INTO t1 VALUES(5, 2);
443 INSERT INTO t1 VALUES(6, 3); 462 INSERT INTO t1 VALUES(6, 3);
444 INSERT INTO t1 VALUES(7, 3); 463 INSERT INTO t1 VALUES(7, 3);
445 INSERT INTO t2 SELECT * FROM t1; 464 INSERT INTO t2 SELECT * FROM t1;
446 } 465 }
447 } {} 466 } {}
448 do_test fkey2-4.2 { 467 do_test without_rowid3-4.2 {
449 execsql { PRAGMA recursive_triggers = off } 468 execsql { PRAGMA recursive_triggers = off }
450 execsql { 469 execsql {
451 BEGIN; 470 BEGIN;
452 DELETE FROM t1 WHERE node = 1; 471 DELETE FROM t1 WHERE node = 1;
453 SELECT node FROM t1; 472 SELECT node FROM t1;
454 } 473 }
455 } {} 474 } {}
456 do_test fkey2-4.3 { 475 do_test without_rowid3-4.3 {
457 execsql { 476 execsql {
458 DELETE FROM t2 WHERE node = 1; 477 DELETE FROM t2 WHERE node = 1;
459 SELECT node FROM t2; 478 SELECT node FROM t2;
460 ROLLBACK; 479 ROLLBACK;
461 } 480 }
462 } {4 5 6 7} 481 } {4 5 6 7}
463 do_test fkey2-4.4 { 482 do_test without_rowid3-4.4 {
464 execsql { PRAGMA recursive_triggers = on } 483 execsql { PRAGMA recursive_triggers = on }
465 execsql { 484 execsql {
466 BEGIN; 485 BEGIN;
467 DELETE FROM t1 WHERE node = 1; 486 DELETE FROM t1 WHERE node = 1;
468 SELECT node FROM t1; 487 SELECT node FROM t1;
469 } 488 }
470 } {} 489 } {}
471 do_test fkey2-4.3 { 490 do_test without_rowid3-4.3 {
472 execsql { 491 execsql {
473 DELETE FROM t2 WHERE node = 1; 492 DELETE FROM t2 WHERE node = 1;
474 SELECT node FROM t2; 493 SELECT node FROM t2;
475 ROLLBACK; 494 ROLLBACK;
476 } 495 }
477 } {} 496 } {}
478 497
479 #------------------------------------------------------------------------- 498 #-------------------------------------------------------------------------
480 # Test cases fkey2-5.* verify that the incremental blob API may not 499 # Test cases without_rowid3-5.* verify that the incremental blob API may not
481 # write to a foreign key column while foreign-keys are enabled. 500 # write to a foreign key column while foreign-keys are enabled.
482 # 501 #
483 drop_all_tables 502 drop_all_tables
484 ifcapable incrblob { 503 ifcapable incrblob {
485 do_test fkey2-5.1 { 504 do_test without_rowid3-5.1 {
486 execsql { 505 execsql {
487 CREATE TABLE t1(a PRIMARY KEY, b); 506 CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT rowid;
488 CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1(a)); 507 CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1(a)) WITHOUT rowid;
489 INSERT INTO t1 VALUES('hello', 'world'); 508 INSERT INTO t1 VALUES('hello', 'world');
490 INSERT INTO t2 VALUES('key', 'hello'); 509 INSERT INTO t2 VALUES('key', 'hello');
491 } 510 }
492 } {} 511 } {}
493 do_test fkey2-5.2 { 512 do_test without_rowid3-5.2 {
494 set rc [catch { set fd [db incrblob t2 b 1] } msg] 513 set rc [catch { set fd [db incrblob t2 b 1] } msg]
495 list $rc $msg 514 list $rc $msg
496 } {1 {cannot open foreign key column for writing}} 515 } {1 {cannot open table without rowid: t2}}
497 do_test fkey2-5.3 { 516 do_test without_rowid3-5.5 {
498 set rc [catch { set fd [db incrblob -readonly t2 b 1] } msg]
499 close $fd
500 set rc
501 } {0}
502 do_test fkey2-5.4 {
503 execsql { PRAGMA foreign_keys = off }
504 set rc [catch { set fd [db incrblob t2 b 1] } msg]
505 close $fd
506 set rc
507 } {0}
508 do_test fkey2-5.5 {
509 execsql { PRAGMA foreign_keys = on } 517 execsql { PRAGMA foreign_keys = on }
510 } {} 518 } {}
511 } 519 }
512 520
513 drop_all_tables 521 drop_all_tables
514 ifcapable vacuum { 522 ifcapable vacuum {
515 do_test fkey2-6.1 { 523 do_test without_rowid3-6.1 {
516 execsql { 524 execsql {
517 CREATE TABLE t1(a REFERENCES t2(c), b); 525 CREATE TABLE t1(a REFERENCES t2(c), b);
518 CREATE TABLE t2(c UNIQUE, b); 526 CREATE TABLE t2(c UNIQUE, b);
519 INSERT INTO t2 VALUES(1, 2); 527 INSERT INTO t2 VALUES(1, 2);
520 INSERT INTO t1 VALUES(1, 2); 528 INSERT INTO t1 VALUES(1, 2);
521 VACUUM; 529 VACUUM;
522 } 530 }
523 } {} 531 } {}
524 } 532 }
525 533
526 #------------------------------------------------------------------------- 534 #-------------------------------------------------------------------------
527 # Test that it is possible to use an INTEGER PRIMARY KEY as the child key 535 # Test that it is possible to use an INT PRIMARY KEY as the child key
528 # of a foreign constraint. 536 # of a foreign constraint.
529 # 537 #
530 drop_all_tables 538 drop_all_tables
531 do_test fkey2-7.1 { 539 do_test without_rowid3-7.1 {
532 execsql { 540 execsql {
533 CREATE TABLE t1(a PRIMARY KEY, b); 541 CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT rowid;
534 CREATE TABLE t2(c INTEGER PRIMARY KEY REFERENCES t1, b); 542 CREATE TABLE t2(c INT PRIMARY KEY REFERENCES t1, b) WITHOUT rowid;
535 } 543 }
536 } {} 544 } {}
537 do_test fkey2-7.2 { 545 do_test without_rowid3-7.2 {
538 catchsql { INSERT INTO t2 VALUES(1, 'A'); } 546 catchsql { INSERT INTO t2 VALUES(1, 'A'); }
539 } {1 {foreign key constraint failed}} 547 } {1 {FOREIGN KEY constraint failed}}
540 do_test fkey2-7.3 { 548 do_test without_rowid3-7.3 {
541 execsql { 549 execsql {
542 INSERT INTO t1 VALUES(1, 2); 550 INSERT INTO t1 VALUES(1, 2);
543 INSERT INTO t1 VALUES(2, 3); 551 INSERT INTO t1 VALUES(2, 3);
544 INSERT INTO t2 VALUES(1, 'A'); 552 INSERT INTO t2 VALUES(1, 'A');
545 } 553 }
546 } {} 554 } {}
547 do_test fkey2-7.4 { 555 do_test without_rowid3-7.4 {
548 execsql { UPDATE t2 SET c = 2 } 556 execsql { UPDATE t2 SET c = 2 }
549 } {} 557 } {}
550 do_test fkey2-7.5 { 558 do_test without_rowid3-7.5 {
551 catchsql { UPDATE t2 SET c = 3 } 559 catchsql { UPDATE t2 SET c = 3 }
552 } {1 {foreign key constraint failed}} 560 } {1 {FOREIGN KEY constraint failed}}
553 do_test fkey2-7.6 { 561 do_test without_rowid3-7.6 {
554 catchsql { DELETE FROM t1 WHERE a = 2 } 562 catchsql { DELETE FROM t1 WHERE a = 2 }
555 } {1 {foreign key constraint failed}} 563 } {1 {FOREIGN KEY constraint failed}}
556 do_test fkey2-7.7 { 564 do_test without_rowid3-7.7 {
557 execsql { DELETE FROM t1 WHERE a = 1 } 565 execsql { DELETE FROM t1 WHERE a = 1 }
558 } {} 566 } {}
559 do_test fkey2-7.8 { 567 do_test without_rowid3-7.8 {
560 catchsql { UPDATE t1 SET a = 3 } 568 catchsql { UPDATE t1 SET a = 3 }
561 } {1 {foreign key constraint failed}} 569 } {1 {FOREIGN KEY constraint failed}}
562 do_test fkey2-7.9 {
563 catchsql { UPDATE t2 SET rowid = 3 }
564 } {1 {foreign key constraint failed}}
565 570
566 #------------------------------------------------------------------------- 571 #-------------------------------------------------------------------------
567 # Test that it is not possible to enable/disable FK support while a 572 # Test that it is not possible to enable/disable FK support while a
568 # transaction is open. 573 # transaction is open.
569 # 574 #
570 drop_all_tables 575 drop_all_tables
571 proc fkey2-8-test {tn zSql value} { 576 proc without_rowid3-8-test {tn zSql value} {
572 do_test fkey-2.8.$tn.1 [list execsql $zSql] {} 577 do_test without_rowid3-2.8.$tn.1 [list execsql $zSql] {}
573 do_test fkey-2.8.$tn.2 { execsql "PRAGMA foreign_keys" } $value 578 do_test without_rowid3-2.8.$tn.2 { execsql "PRAGMA foreign_keys" } $value
574 } 579 }
575 fkey2-8-test 1 { PRAGMA foreign_keys = 0 } 0 580 without_rowid3-8-test 1 { PRAGMA foreign_keys = 0 } 0
576 fkey2-8-test 2 { PRAGMA foreign_keys = 1 } 1 581 without_rowid3-8-test 2 { PRAGMA foreign_keys = 1 } 1
577 fkey2-8-test 3 { BEGIN } 1 582 without_rowid3-8-test 3 { BEGIN } 1
578 fkey2-8-test 4 { PRAGMA foreign_keys = 0 } 1 583 without_rowid3-8-test 4 { PRAGMA foreign_keys = 0 } 1
579 fkey2-8-test 5 { COMMIT } 1 584 without_rowid3-8-test 5 { COMMIT } 1
580 fkey2-8-test 6 { PRAGMA foreign_keys = 0 } 0 585 without_rowid3-8-test 6 { PRAGMA foreign_keys = 0 } 0
581 fkey2-8-test 7 { BEGIN } 0 586 without_rowid3-8-test 7 { BEGIN } 0
582 fkey2-8-test 8 { PRAGMA foreign_keys = 1 } 0 587 without_rowid3-8-test 8 { PRAGMA foreign_keys = 1 } 0
583 fkey2-8-test 9 { COMMIT } 0 588 without_rowid3-8-test 9 { COMMIT } 0
584 fkey2-8-test 10 { PRAGMA foreign_keys = 1 } 1 589 without_rowid3-8-test 10 { PRAGMA foreign_keys = 1 } 1
585 fkey2-8-test 11 { PRAGMA foreign_keys = off } 0 590 without_rowid3-8-test 11 { PRAGMA foreign_keys = off } 0
586 fkey2-8-test 12 { PRAGMA foreign_keys = on } 1 591 without_rowid3-8-test 12 { PRAGMA foreign_keys = on } 1
587 fkey2-8-test 13 { PRAGMA foreign_keys = no } 0 592 without_rowid3-8-test 13 { PRAGMA foreign_keys = no } 0
588 fkey2-8-test 14 { PRAGMA foreign_keys = yes } 1 593 without_rowid3-8-test 14 { PRAGMA foreign_keys = yes } 1
589 fkey2-8-test 15 { PRAGMA foreign_keys = false } 0 594 without_rowid3-8-test 15 { PRAGMA foreign_keys = false } 0
590 fkey2-8-test 16 { PRAGMA foreign_keys = true } 1 595 without_rowid3-8-test 16 { PRAGMA foreign_keys = true } 1
591 596
592 #------------------------------------------------------------------------- 597 #-------------------------------------------------------------------------
593 # The following tests, fkey2-9.*, test SET DEFAULT actions. 598 # The following tests, without_rowid3-9.*, test SET DEFAULT actions.
594 # 599 #
595 drop_all_tables 600 drop_all_tables
596 do_test fkey2-9.1.1 { 601 do_test without_rowid3-9.1.1 {
597 execsql { 602 execsql {
598 CREATE TABLE t1(a INTEGER PRIMARY KEY, b); 603 CREATE TABLE t1(a INT PRIMARY KEY, b) WITHOUT rowid;
599 CREATE TABLE t2( 604 CREATE TABLE t2(
600 c INTEGER PRIMARY KEY, 605 c INT PRIMARY KEY,
601 d INTEGER DEFAULT 1 REFERENCES t1 ON DELETE SET DEFAULT 606 d INTEGER DEFAULT 1 REFERENCES t1 ON DELETE SET DEFAULT
602 ); 607 ) WITHOUT rowid;
603 DELETE FROM t1; 608 DELETE FROM t1;
604 } 609 }
605 } {} 610 } {}
606 do_test fkey2-9.1.2 { 611 do_test without_rowid3-9.1.2 {
607 execsql { 612 execsql {
608 INSERT INTO t1 VALUES(1, 'one'); 613 INSERT INTO t1 VALUES(1, 'one');
609 INSERT INTO t1 VALUES(2, 'two'); 614 INSERT INTO t1 VALUES(2, 'two');
610 INSERT INTO t2 VALUES(1, 2); 615 INSERT INTO t2 VALUES(1, 2);
611 SELECT * FROM t2; 616 SELECT * FROM t2;
612 DELETE FROM t1 WHERE a = 2; 617 DELETE FROM t1 WHERE a = 2;
613 SELECT * FROM t2; 618 SELECT * FROM t2;
614 } 619 }
615 } {1 2 1 1} 620 } {1 2 1 1}
616 do_test fkey2-9.1.3 { 621 do_test without_rowid3-9.1.3 {
617 execsql { 622 execsql {
618 INSERT INTO t1 VALUES(2, 'two'); 623 INSERT INTO t1 VALUES(2, 'two');
619 UPDATE t2 SET d = 2; 624 UPDATE t2 SET d = 2;
620 DELETE FROM t1 WHERE a = 1; 625 DELETE FROM t1 WHERE a = 1;
621 SELECT * FROM t2; 626 SELECT * FROM t2;
622 } 627 }
623 } {1 2} 628 } {1 2}
624 do_test fkey2-9.1.4 { 629 do_test without_rowid3-9.1.4 {
625 execsql { SELECT * FROM t1 } 630 execsql { SELECT * FROM t1 }
626 } {2 two} 631 } {2 two}
627 do_test fkey2-9.1.5 { 632 do_test without_rowid3-9.1.5 {
628 catchsql { DELETE FROM t1 } 633 catchsql { DELETE FROM t1 }
629 } {1 {foreign key constraint failed}} 634 } {1 {FOREIGN KEY constraint failed}}
630 635
631 do_test fkey2-9.2.1 { 636 do_test without_rowid3-9.2.1 {
632 execsql { 637 execsql {
633 CREATE TABLE pp(a, b, c, PRIMARY KEY(b, c)); 638 CREATE TABLE pp(a, b, c, PRIMARY KEY(b, c)) WITHOUT rowid;
634 CREATE TABLE cc(d DEFAULT 3, e DEFAULT 1, f DEFAULT 2, 639 CREATE TABLE cc(d DEFAULT 3, e DEFAULT 1, f DEFAULT 2,
635 FOREIGN KEY(f, d) REFERENCES pp 640 FOREIGN KEY(f, d) REFERENCES pp
636 ON UPDATE SET DEFAULT 641 ON UPDATE SET DEFAULT
637 ON DELETE SET NULL 642 ON DELETE SET NULL
638 ); 643 );
639 INSERT INTO pp VALUES(1, 2, 3); 644 INSERT INTO pp VALUES(1, 2, 3);
640 INSERT INTO pp VALUES(4, 5, 6); 645 INSERT INTO pp VALUES(4, 5, 6);
641 INSERT INTO pp VALUES(7, 8, 9); 646 INSERT INTO pp VALUES(7, 8, 9);
642 } 647 }
643 } {} 648 } {}
644 do_test fkey2-9.2.2 { 649 do_test without_rowid3-9.2.2 {
645 execsql { 650 execsql {
646 INSERT INTO cc VALUES(6, 'A', 5); 651 INSERT INTO cc VALUES(6, 'A', 5);
647 INSERT INTO cc VALUES(6, 'B', 5); 652 INSERT INTO cc VALUES(6, 'B', 5);
648 INSERT INTO cc VALUES(9, 'A', 8); 653 INSERT INTO cc VALUES(9, 'A', 8);
649 INSERT INTO cc VALUES(9, 'B', 8); 654 INSERT INTO cc VALUES(9, 'B', 8);
650 UPDATE pp SET b = 1 WHERE a = 7; 655 UPDATE pp SET b = 1 WHERE a = 7;
651 SELECT * FROM cc; 656 SELECT * FROM cc;
652 } 657 }
653 } {6 A 5 6 B 5 3 A 2 3 B 2} 658 } {6 A 5 6 B 5 3 A 2 3 B 2}
654 do_test fkey2-9.2.3 { 659 do_test without_rowid3-9.2.3 {
655 execsql { 660 execsql {
656 DELETE FROM pp WHERE a = 4; 661 DELETE FROM pp WHERE a = 4;
657 SELECT * FROM cc; 662 SELECT * FROM cc;
658 } 663 }
659 } {{} A {} {} B {} 3 A 2 3 B 2} 664 } {{} A {} {} B {} 3 A 2 3 B 2}
660 665
661 #------------------------------------------------------------------------- 666 #-------------------------------------------------------------------------
662 # The following tests, fkey2-10.*, test "foreign key mismatch" and 667 # The following tests, without_rowid3-10.*, test "foreign key mismatch" and
663 # other errors. 668 # other errors.
664 # 669 #
665 set tn 0 670 set tn 0
666 foreach zSql [list { 671 foreach zSql [list {
667 CREATE TABLE p(a PRIMARY KEY, b); 672 CREATE TABLE p(a PRIMARY KEY, b) WITHOUT rowid;
668 CREATE TABLE c(x REFERENCES p(c)); 673 CREATE TABLE c(x REFERENCES p(c));
669 } { 674 } {
670 CREATE TABLE c(x REFERENCES v(y)); 675 CREATE TABLE c(x REFERENCES v(y));
671 CREATE VIEW v AS SELECT x AS y FROM c; 676 CREATE VIEW v AS SELECT x AS y FROM c;
672 } { 677 } {
673 CREATE TABLE p(a, b, PRIMARY KEY(a, b)); 678 CREATE TABLE p(a, b, PRIMARY KEY(a, b)) WITHOUT rowid;
674 CREATE TABLE c(x REFERENCES p); 679 CREATE TABLE c(x REFERENCES p);
675 } { 680 } {
676 CREATE TABLE p(a COLLATE binary, b); 681 CREATE TABLE p(a COLLATE binary, b);
677 CREATE UNIQUE INDEX i ON p(a COLLATE nocase); 682 CREATE UNIQUE INDEX i ON p(a COLLATE nocase);
678 CREATE TABLE c(x REFERENCES p(a)); 683 CREATE TABLE c(x REFERENCES p(a));
679 }] { 684 }] {
680 drop_all_tables 685 drop_all_tables
681 do_test fkey2-10.1.[incr tn] { 686 do_test without_rowid3-10.1.[incr tn] {
682 execsql $zSql 687 execsql $zSql
683 catchsql { INSERT INTO c DEFAULT VALUES } 688 catchsql { INSERT INTO c DEFAULT VALUES }
684 } {1 {foreign key mismatch}} 689 } {/1 {foreign key mismatch - "c" referencing "."}/}
685 } 690 }
686 691
687 # "rowid" cannot be used as part of a child or parent key definition 692 # "rowid" cannot be used as part of a child or parent key definition
688 # unless it happens to be the name of an explicitly declared column. 693 # unless it happens to be the name of an explicitly declared column.
689 # 694 #
690 do_test fkey2-10.2.1 { 695 do_test without_rowid3-10.2.1 {
691 drop_all_tables 696 drop_all_tables
692 catchsql { 697 catchsql {
693 CREATE TABLE t1(a PRIMARY KEY, b); 698 CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT rowid;
694 CREATE TABLE t2(c, d, FOREIGN KEY(rowid) REFERENCES t1(a)); 699 CREATE TABLE t2(c, d, FOREIGN KEY(rowid) REFERENCES t1(a));
695 } 700 }
696 } {1 {unknown column "rowid" in foreign key definition}} 701 } {1 {unknown column "rowid" in foreign key definition}}
697 do_test fkey2-10.2.2 { 702 do_test without_rowid3-10.2.2 {
698 drop_all_tables 703 drop_all_tables
699 catchsql { 704 catchsql {
700 CREATE TABLE t1(a PRIMARY KEY, b); 705 CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT rowid;
701 CREATE TABLE t2(rowid, d, FOREIGN KEY(rowid) REFERENCES t1(a)); 706 CREATE TABLE t2(rowid, d, FOREIGN KEY(rowid) REFERENCES t1(a));
702 } 707 }
703 } {0 {}} 708 } {0 {}}
704 do_test fkey2-10.2.1 { 709 do_test without_rowid3-10.2.1 {
705 drop_all_tables 710 drop_all_tables
706 catchsql { 711 catchsql {
707 CREATE TABLE t1(a, b); 712 CREATE TABLE t1(a, b);
708 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(rowid)); 713 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(rowid));
709 INSERT INTO t1(rowid, a, b) VALUES(1, 1, 1); 714 INSERT INTO t1(rowid, a, b) VALUES(1, 1, 1);
710 INSERT INTO t2 VALUES(1, 1); 715 INSERT INTO t2 VALUES(1, 1);
711 } 716 }
712 } {1 {foreign key mismatch}} 717 } {1 {foreign key mismatch - "t2" referencing "t1"}}
713 do_test fkey2-10.2.2 { 718 do_test without_rowid3-10.2.2 {
714 drop_all_tables 719 drop_all_tables
715 catchsql { 720 catchsql {
716 CREATE TABLE t1(rowid PRIMARY KEY, b); 721 CREATE TABLE t1(rowid PRIMARY KEY, b) WITHOUT rowid;
717 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(rowid)); 722 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(rowid));
718 INSERT INTO t1(rowid, b) VALUES(1, 1); 723 INSERT INTO t1(rowid, b) VALUES(1, 1);
719 INSERT INTO t2 VALUES(1, 1); 724 INSERT INTO t2 VALUES(1, 1);
720 } 725 }
721 } {0 {}} 726 } {0 {}}
722 727
723 728
724 #------------------------------------------------------------------------- 729 #-------------------------------------------------------------------------
725 # The following tests, fkey2-11.*, test CASCADE actions. 730 # The following tests, without_rowid3-11.*, test CASCADE actions.
726 # 731 #
727 drop_all_tables 732 drop_all_tables
728 do_test fkey2-11.1.1 { 733 do_test without_rowid3-11.1.1 {
729 execsql { 734 execsql {
730 CREATE TABLE t1(a INTEGER PRIMARY KEY, b); 735 CREATE TABLE t1(a INT PRIMARY KEY, b) WITHOUT rowid;
731 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(a) ON UPDATE CASCADE); 736 CREATE TABLE t2(c, d, FOREIGN KEY(c) REFERENCES t1(a) ON UPDATE CASCADE);
732 737
733 INSERT INTO t1 VALUES(10, 100); 738 INSERT INTO t1 VALUES(10, 100);
734 INSERT INTO t2 VALUES(10, 100); 739 INSERT INTO t2 VALUES(10, 100);
735 UPDATE t1 SET a = 15; 740 UPDATE t1 SET a = 15;
736 SELECT * FROM t2; 741 SELECT * FROM t2;
737 } 742 }
738 } {15 100} 743 } {15 100}
739 744
740 #------------------------------------------------------------------------- 745 #-------------------------------------------------------------------------
741 # The following tests, fkey2-12.*, test RESTRICT actions. 746 # The following tests, without_rowid3-12.*, test RESTRICT actions.
742 # 747 #
743 drop_all_tables 748 drop_all_tables
744 do_test fkey2-12.1.1 { 749 do_test without_rowid3-12.1.1 {
745 execsql { 750 execsql {
746 CREATE TABLE t1(a, b PRIMARY KEY); 751 CREATE TABLE t1(a, b PRIMARY KEY) WITHOUT rowid;
747 CREATE TABLE t2( 752 CREATE TABLE t2(
748 x REFERENCES t1 ON UPDATE RESTRICT DEFERRABLE INITIALLY DEFERRED 753 x REFERENCES t1 ON UPDATE RESTRICT DEFERRABLE INITIALLY DEFERRED
749 ); 754 );
750 INSERT INTO t1 VALUES(1, 'one'); 755 INSERT INTO t1 VALUES(1, 'one');
751 INSERT INTO t1 VALUES(2, 'two'); 756 INSERT INTO t1 VALUES(2, 'two');
752 INSERT INTO t1 VALUES(3, 'three'); 757 INSERT INTO t1 VALUES(3, 'three');
753 } 758 }
754 } {} 759 } {}
755 do_test fkey2-12.1.2 { 760 do_test without_rowid3-12.1.2 {
756 execsql "BEGIN" 761 execsql "BEGIN"
757 execsql "INSERT INTO t2 VALUES('two')" 762 execsql "INSERT INTO t2 VALUES('two')"
758 } {} 763 } {}
759 do_test fkey2-12.1.3 { 764 do_test without_rowid3-12.1.3 {
760 execsql "UPDATE t1 SET b = 'four' WHERE b = 'one'" 765 execsql "UPDATE t1 SET b = 'four' WHERE b = 'one'"
761 } {} 766 } {}
762 do_test fkey2-12.1.4 { 767 do_test without_rowid3-12.1.4 {
763 catchsql "UPDATE t1 SET b = 'five' WHERE b = 'two'" 768 catchsql "UPDATE t1 SET b = 'five' WHERE b = 'two'"
764 } {1 {foreign key constraint failed}} 769 } {1 {FOREIGN KEY constraint failed}}
765 do_test fkey2-12.1.5 { 770 do_test without_rowid3-12.1.5 {
766 execsql "DELETE FROM t1 WHERE b = 'two'" 771 execsql "DELETE FROM t1 WHERE b = 'two'"
767 } {} 772 } {}
768 do_test fkey2-12.1.6 { 773 do_test without_rowid3-12.1.6 {
769 catchsql "COMMIT" 774 catchsql "COMMIT"
770 } {1 {foreign key constraint failed}} 775 } {1 {FOREIGN KEY constraint failed}}
771 do_test fkey2-12.1.7 { 776 do_test without_rowid3-12.1.7 {
772 execsql { 777 execsql {
773 INSERT INTO t1 VALUES(2, 'two'); 778 INSERT INTO t1 VALUES(2, 'two');
774 COMMIT; 779 COMMIT;
775 } 780 }
776 } {} 781 } {}
777 782
778 drop_all_tables 783 drop_all_tables
779 do_test fkey2-12.2.1 { 784 do_test without_rowid3-12.2.1 {
780 execsql { 785 execsql {
781 CREATE TABLE t1(x COLLATE NOCASE PRIMARY KEY); 786 CREATE TABLE t1(x COLLATE NOCASE PRIMARY KEY) WITHOUT rowid;
782 CREATE TRIGGER tt1 AFTER DELETE ON t1 787 CREATE TRIGGER tt1 AFTER DELETE ON t1
783 WHEN EXISTS ( SELECT 1 FROM t2 WHERE old.x = y ) 788 WHEN EXISTS ( SELECT 1 FROM t2 WHERE old.x = y )
784 BEGIN 789 BEGIN
785 INSERT INTO t1 VALUES(old.x); 790 INSERT INTO t1 VALUES(old.x);
786 END; 791 END;
787 CREATE TABLE t2(y REFERENCES t1); 792 CREATE TABLE t2(y REFERENCES t1);
788 INSERT INTO t1 VALUES('A'); 793 INSERT INTO t1 VALUES('A');
789 INSERT INTO t1 VALUES('B'); 794 INSERT INTO t1 VALUES('B');
790 INSERT INTO t2 VALUES('a'); 795 INSERT INTO t2 VALUES('a');
791 INSERT INTO t2 VALUES('b'); 796 INSERT INTO t2 VALUES('b');
792 797
793 SELECT * FROM t1; 798 SELECT * FROM t1;
794 SELECT * FROM t2; 799 SELECT * FROM t2;
795 } 800 }
796 } {A B a b} 801 } {A B a b}
797 do_test fkey2-12.2.2 { 802 do_test without_rowid3-12.2.2 {
798 execsql { DELETE FROM t1 } 803 execsql { DELETE FROM t1 }
799 execsql { 804 execsql {
800 SELECT * FROM t1; 805 SELECT * FROM t1;
801 SELECT * FROM t2; 806 SELECT * FROM t2;
802 } 807 }
803 } {A B a b} 808 } {A B a b}
804 do_test fkey2-12.2.3 { 809 do_test without_rowid3-12.2.3 {
805 execsql { 810 execsql {
806 DROP TABLE t2; 811 DROP TABLE t2;
807 CREATE TABLE t2(y REFERENCES t1 ON DELETE RESTRICT); 812 CREATE TABLE t2(y REFERENCES t1 ON DELETE RESTRICT);
808 INSERT INTO t2 VALUES('a'); 813 INSERT INTO t2 VALUES('a');
809 INSERT INTO t2 VALUES('b'); 814 INSERT INTO t2 VALUES('b');
810 } 815 }
811 catchsql { DELETE FROM t1 } 816 catchsql { DELETE FROM t1 }
812 } {1 {foreign key constraint failed}} 817 } {1 {FOREIGN KEY constraint failed}}
813 do_test fkey2-12.2.4 { 818 do_test without_rowid3-12.2.4 {
814 execsql { 819 execsql {
815 SELECT * FROM t1; 820 SELECT * FROM t1;
816 SELECT * FROM t2; 821 SELECT * FROM t2;
817 } 822 }
818 } {A B a b} 823 } {A B a b}
819 824
820 drop_all_tables 825 drop_all_tables
821 do_test fkey2-12.3.1 { 826 do_test without_rowid3-12.3.1 {
822 execsql { 827 execsql {
823 CREATE TABLE up( 828 CREATE TABLE up(
824 c00, c01, c02, c03, c04, c05, c06, c07, c08, c09, 829 c00, c01, c02, c03, c04, c05, c06, c07, c08, c09,
825 c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, 830 c10, c11, c12, c13, c14, c15, c16, c17, c18, c19,
826 c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, 831 c20, c21, c22, c23, c24, c25, c26, c27, c28, c29,
827 c30, c31, c32, c33, c34, c35, c36, c37, c38, c39, 832 c30, c31, c32, c33, c34, c35, c36, c37, c38, c39,
828 PRIMARY KEY(c34, c35) 833 PRIMARY KEY(c34, c35)
829 ); 834 ) WITHOUT rowid;
830 CREATE TABLE down( 835 CREATE TABLE down(
831 c00, c01, c02, c03, c04, c05, c06, c07, c08, c09, 836 c00, c01, c02, c03, c04, c05, c06, c07, c08, c09,
832 c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, 837 c10, c11, c12, c13, c14, c15, c16, c17, c18, c19,
833 c20, c21, c22, c23, c24, c25, c26, c27, c28, c29, 838 c20, c21, c22, c23, c24, c25, c26, c27, c28, c29,
834 c30, c31, c32, c33, c34, c35, c36, c37, c38, c39, 839 c30, c31, c32, c33, c34, c35, c36, c37, c38, c39,
835 FOREIGN KEY(c39, c38) REFERENCES up ON UPDATE CASCADE 840 FOREIGN KEY(c39, c38) REFERENCES up ON UPDATE CASCADE
836 ); 841 );
837 } 842 }
838 } {} 843 } {}
839 do_test fkey2-12.3.2 { 844 do_test without_rowid3-12.3.2 {
840 execsql { 845 execsql {
841 INSERT INTO up(c34, c35) VALUES('yes', 'no'); 846 INSERT INTO up(c34, c35) VALUES('yes', 'no');
842 INSERT INTO down(c39, c38) VALUES('yes', 'no'); 847 INSERT INTO down(c39, c38) VALUES('yes', 'no');
843 UPDATE up SET c34 = 'possibly'; 848 UPDATE up SET c34 = 'possibly';
844 SELECT c38, c39 FROM down; 849 SELECT c38, c39 FROM down;
845 DELETE FROM down; 850 DELETE FROM down;
846 } 851 }
847 } {no possibly} 852 } {no possibly}
848 do_test fkey2-12.3.3 { 853 do_test without_rowid3-12.3.3 {
849 catchsql { INSERT INTO down(c39, c38) VALUES('yes', 'no') } 854 catchsql { INSERT INTO down(c39, c38) VALUES('yes', 'no') }
850 } {1 {foreign key constraint failed}} 855 } {1 {FOREIGN KEY constraint failed}}
851 do_test fkey2-12.3.4 { 856 do_test without_rowid3-12.3.4 {
852 execsql { 857 execsql {
853 INSERT INTO up(c34, c35) VALUES('yes', 'no'); 858 INSERT INTO up(c34, c35) VALUES('yes', 'no');
854 INSERT INTO down(c39, c38) VALUES('yes', 'no'); 859 INSERT INTO down(c39, c38) VALUES('yes', 'no');
855 } 860 }
856 catchsql { DELETE FROM up WHERE c34 = 'yes' } 861 catchsql { DELETE FROM up WHERE c34 = 'yes' }
857 } {1 {foreign key constraint failed}} 862 } {1 {FOREIGN KEY constraint failed}}
858 do_test fkey2-12.3.5 { 863 do_test without_rowid3-12.3.5 {
859 execsql { 864 execsql {
860 DELETE FROM up WHERE c34 = 'possibly'; 865 DELETE FROM up WHERE c34 = 'possibly';
861 SELECT c34, c35 FROM up; 866 SELECT c34, c35 FROM up;
862 SELECT c39, c38 FROM down; 867 SELECT c39, c38 FROM down;
863 } 868 }
864 } {yes no yes no} 869 } {yes no yes no}
865 870
866 #------------------------------------------------------------------------- 871 #-------------------------------------------------------------------------
867 # The following tests, fkey2-13.*, test that FK processing is performed 872 # The following tests, without_rowid3-13.*, test that FK processing is performed
868 # when rows are REPLACEd. 873 # when rows are REPLACEd.
869 # 874 #
870 drop_all_tables 875 drop_all_tables
871 do_test fkey2-13.1.1 { 876 do_test without_rowid3-13.1.1 {
872 execsql { 877 execsql {
873 CREATE TABLE pp(a UNIQUE, b, c, PRIMARY KEY(b, c)); 878 CREATE TABLE pp(a UNIQUE, b, c, PRIMARY KEY(b, c)) WITHOUT rowid;
874 CREATE TABLE cc(d, e, f UNIQUE, FOREIGN KEY(d, e) REFERENCES pp); 879 CREATE TABLE cc(d, e, f UNIQUE, FOREIGN KEY(d, e) REFERENCES pp);
875 INSERT INTO pp VALUES(1, 2, 3); 880 INSERT INTO pp VALUES(1, 2, 3);
876 INSERT INTO cc VALUES(2, 3, 1); 881 INSERT INTO cc VALUES(2, 3, 1);
877 } 882 }
878 } {} 883 } {}
879 foreach {tn stmt} { 884 foreach {tn stmt} {
880 1 "REPLACE INTO pp VALUES(1, 4, 5)" 885 1 "REPLACE INTO pp VALUES(1, 4, 5)"
881 2 "REPLACE INTO pp(rowid, a, b, c) VALUES(1, 2, 3, 4)"
882 } { 886 } {
883 do_test fkey2-13.1.$tn.1 { 887 do_test without_rowid3-13.1.$tn.1 {
884 catchsql $stmt 888 catchsql $stmt
885 } {1 {foreign key constraint failed}} 889 } {1 {FOREIGN KEY constraint failed}}
886 do_test fkey2-13.1.$tn.2 { 890 do_test without_rowid3-13.1.$tn.2 {
887 execsql { 891 execsql {
888 SELECT * FROM pp; 892 SELECT * FROM pp;
889 SELECT * FROM cc; 893 SELECT * FROM cc;
890 } 894 }
891 } {1 2 3 2 3 1} 895 } {1 2 3 2 3 1}
892 do_test fkey2-13.1.$tn.3 { 896 do_test without_rowid3-13.1.$tn.3 {
893 execsql BEGIN; 897 execsql BEGIN;
894 catchsql $stmt 898 catchsql $stmt
895 } {1 {foreign key constraint failed}} 899 } {1 {FOREIGN KEY constraint failed}}
896 do_test fkey2-13.1.$tn.4 { 900 do_test without_rowid3-13.1.$tn.4 {
897 execsql { 901 execsql {
898 COMMIT; 902 COMMIT;
899 SELECT * FROM pp; 903 SELECT * FROM pp;
900 SELECT * FROM cc; 904 SELECT * FROM cc;
901 } 905 }
902 } {1 2 3 2 3 1} 906 } {1 2 3 2 3 1}
903 } 907 }
904 do_test fkey2-13.1.3 {
905 execsql {
906 REPLACE INTO pp(rowid, a, b, c) VALUES(1, 2, 2, 3);
907 SELECT rowid, * FROM pp;
908 SELECT * FROM cc;
909 }
910 } {1 2 2 3 2 3 1}
911 do_test fkey2-13.1.4 {
912 execsql {
913 REPLACE INTO pp(rowid, a, b, c) VALUES(2, 2, 2, 3);
914 SELECT rowid, * FROM pp;
915 SELECT * FROM cc;
916 }
917 } {2 2 2 3 2 3 1}
918 908
919 #------------------------------------------------------------------------- 909 #-------------------------------------------------------------------------
920 # The following tests, fkey2-14.*, test that the "DROP TABLE" and "ALTER 910 # The following tests, without_rowid3-14.*, test that the "DROP TABLE" and "ALTE R
921 # TABLE" commands work as expected wrt foreign key constraints. 911 # TABLE" commands work as expected wrt foreign key constraints.
922 # 912 #
923 # fkey2-14.1*: ALTER TABLE ADD COLUMN 913 # without_rowid3-14.1*: ALTER TABLE ADD COLUMN
924 # fkey2-14.2*: ALTER TABLE RENAME TABLE 914 # without_rowid3-14.2*: ALTER TABLE RENAME TABLE
925 # fkey2-14.3*: DROP TABLE 915 # without_rowid3-14.3*: DROP TABLE
926 # 916 #
927 drop_all_tables 917 drop_all_tables
928 ifcapable altertable { 918 ifcapable altertable {
929 do_test fkey2-14.1.1 { 919 do_test without_rowid3-14.1.1 {
930 # Adding a column with a REFERENCES clause is not supported. 920 # Adding a column with a REFERENCES clause is not supported.
931 execsql { 921 execsql {
932 CREATE TABLE t1(a PRIMARY KEY); 922 CREATE TABLE t1(a PRIMARY KEY) WITHOUT rowid;
933 CREATE TABLE t2(a, b); 923 CREATE TABLE t2(a, b);
934 } 924 }
935 catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } 925 catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
936 } {0 {}} 926 } {0 {}}
937 do_test fkey2-14.1.2 { 927 do_test without_rowid3-14.1.2 {
938 catchsql { ALTER TABLE t2 ADD COLUMN d DEFAULT NULL REFERENCES t1 } 928 catchsql { ALTER TABLE t2 ADD COLUMN d DEFAULT NULL REFERENCES t1 }
939 } {0 {}} 929 } {0 {}}
940 do_test fkey2-14.1.3 { 930 do_test without_rowid3-14.1.3 {
941 catchsql { ALTER TABLE t2 ADD COLUMN e REFERENCES t1 DEFAULT NULL} 931 catchsql { ALTER TABLE t2 ADD COLUMN e REFERENCES t1 DEFAULT NULL}
942 } {0 {}} 932 } {0 {}}
943 do_test fkey2-14.1.4 { 933 do_test without_rowid3-14.1.4 {
944 catchsql { ALTER TABLE t2 ADD COLUMN f REFERENCES t1 DEFAULT 'text'} 934 catchsql { ALTER TABLE t2 ADD COLUMN f REFERENCES t1 DEFAULT 'text'}
945 } {1 {Cannot add a REFERENCES column with non-NULL default value}} 935 } {1 {Cannot add a REFERENCES column with non-NULL default value}}
946 do_test fkey2-14.1.5 { 936 do_test without_rowid3-14.1.5 {
947 catchsql { ALTER TABLE t2 ADD COLUMN g DEFAULT CURRENT_TIME REFERENCES t1 } 937 catchsql { ALTER TABLE t2 ADD COLUMN g DEFAULT CURRENT_TIME REFERENCES t1 }
948 } {1 {Cannot add a REFERENCES column with non-NULL default value}} 938 } {1 {Cannot add a REFERENCES column with non-NULL default value}}
949 do_test fkey2-14.1.6 { 939 do_test without_rowid3-14.1.6 {
950 execsql { 940 execsql {
951 PRAGMA foreign_keys = off; 941 PRAGMA foreign_keys = off;
952 ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; 942 ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1;
953 PRAGMA foreign_keys = on; 943 PRAGMA foreign_keys = on;
954 SELECT sql FROM sqlite_master WHERE name='t2'; 944 SELECT sql FROM sqlite_master WHERE name='t2';
955 } 945 }
956 } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REF ERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} 946 } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REF ERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}}
957 947
958 948
959 # Test the sqlite_rename_parent() function directly. 949 # Test the sqlite_rename_parent() function directly.
960 # 950 #
961 proc test_rename_parent {zCreate zOld zNew} { 951 proc test_rename_parent {zCreate zOld zNew} {
962 db eval {SELECT sqlite_rename_parent($zCreate, $zOld, $zNew)} 952 db eval {SELECT sqlite_rename_parent($zCreate, $zOld, $zNew)}
963 } 953 }
964 do_test fkey2-14.2.1.1 { 954 do_test without_rowid3-14.2.1.1 {
965 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 955 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3
966 } {{CREATE TABLE t1(a REFERENCES "t3")}} 956 } {{CREATE TABLE t1(a REFERENCES "t3")}}
967 do_test fkey2-14.2.1.2 { 957 do_test without_rowid3-14.2.1.2 {
968 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t4 t3 958 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t4 t3
969 } {{CREATE TABLE t1(a REFERENCES t2)}} 959 } {{CREATE TABLE t1(a REFERENCES t2)}}
970 do_test fkey2-14.2.1.3 { 960 do_test without_rowid3-14.2.1.3 {
971 test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 961 test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3
972 } {{CREATE TABLE t1(a REFERENCES "t3")}} 962 } {{CREATE TABLE t1(a REFERENCES "t3")}}
973 963
974 # Test ALTER TABLE RENAME TABLE a bit. 964 # Test ALTER TABLE RENAME TABLE a bit.
975 # 965 #
976 do_test fkey2-14.2.2.1 { 966 do_test without_rowid3-14.2.2.1 {
977 drop_all_tables 967 drop_all_tables
978 execsql { 968 execsql {
979 CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1); 969 CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid;
980 CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2); 970 CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
971 WITHOUT rowid;
981 CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); 972 CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1);
982 } 973 }
983 execsql { SELECT sql FROM sqlite_master WHERE type = 'table'} 974 execsql { SELECT sql FROM sqlite_master WHERE type = 'table'}
984 } [list \ 975 } [list \
985 {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1)} \ 976 {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \
986 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)} \ 977 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
978 WITHOUT rowid} \
987 {CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1)} \ 979 {CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1)} \
988 ] 980 ]
989 do_test fkey2-14.2.2.2 { 981 do_test without_rowid3-14.2.2.2 {
990 execsql { ALTER TABLE t1 RENAME TO t4 } 982 execsql { ALTER TABLE t1 RENAME TO t4 }
991 execsql { SELECT sql FROM sqlite_master WHERE type = 'table'} 983 execsql { SELECT sql FROM sqlite_master WHERE type = 'table'}
992 } [list \ 984 } [list \
993 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \ 985 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \
994 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \ 986 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)
987 WITHOUT rowid} \
995 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \ 988 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \
996 ] 989 ]
997 do_test fkey2-14.2.2.3 { 990 do_test without_rowid3-14.2.2.3 {
998 catchsql { INSERT INTO t3 VALUES(1, 2, 3) } 991 catchsql { INSERT INTO t3 VALUES(1, 2, 3) }
999 } {1 {foreign key constraint failed}} 992 } {1 {FOREIGN KEY constraint failed}}
1000 do_test fkey2-14.2.2.4 { 993 do_test without_rowid3-14.2.2.4 {
1001 execsql { INSERT INTO t4 VALUES(1, NULL) } 994 execsql { INSERT INTO t4 VALUES(1, NULL) }
1002 } {} 995 } {}
1003 do_test fkey2-14.2.2.5 { 996 do_test without_rowid3-14.2.2.5 {
1004 catchsql { UPDATE t4 SET b = 5 } 997 catchsql { UPDATE t4 SET b = 5 }
1005 } {1 {foreign key constraint failed}} 998 } {1 {FOREIGN KEY constraint failed}}
1006 do_test fkey2-14.2.2.6 { 999 do_test without_rowid3-14.2.2.6 {
1007 catchsql { UPDATE t4 SET b = 1 } 1000 catchsql { UPDATE t4 SET b = 1 }
1008 } {0 {}} 1001 } {0 {}}
1009 do_test fkey2-14.2.2.7 { 1002 do_test without_rowid3-14.2.2.7 {
1010 execsql { INSERT INTO t3 VALUES(1, NULL, 1) } 1003 execsql { INSERT INTO t3 VALUES(1, NULL, 1) }
1011 } {} 1004 } {}
1012 1005
1013 # Repeat for TEMP tables 1006 # Repeat for TEMP tables
1014 # 1007 #
1015 drop_all_tables 1008 drop_all_tables
1016 do_test fkey2-14.1tmp.1 { 1009 do_test without_rowid3-14.1tmp.1 {
1017 # Adding a column with a REFERENCES clause is not supported. 1010 # Adding a column with a REFERENCES clause is not supported.
1018 execsql { 1011 execsql {
1019 CREATE TEMP TABLE t1(a PRIMARY KEY); 1012 CREATE TEMP TABLE t1(a PRIMARY KEY) WITHOUT rowid;
1020 CREATE TEMP TABLE t2(a, b); 1013 CREATE TEMP TABLE t2(a, b);
1021 } 1014 }
1022 catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } 1015 catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
1023 } {0 {}} 1016 } {0 {}}
1024 do_test fkey2-14.1tmp.2 { 1017 do_test without_rowid3-14.1tmp.2 {
1025 catchsql { ALTER TABLE t2 ADD COLUMN d DEFAULT NULL REFERENCES t1 } 1018 catchsql { ALTER TABLE t2 ADD COLUMN d DEFAULT NULL REFERENCES t1 }
1026 } {0 {}} 1019 } {0 {}}
1027 do_test fkey2-14.1tmp.3 { 1020 do_test without_rowid3-14.1tmp.3 {
1028 catchsql { ALTER TABLE t2 ADD COLUMN e REFERENCES t1 DEFAULT NULL} 1021 catchsql { ALTER TABLE t2 ADD COLUMN e REFERENCES t1 DEFAULT NULL}
1029 } {0 {}} 1022 } {0 {}}
1030 do_test fkey2-14.1tmp.4 { 1023 do_test without_rowid3-14.1tmp.4 {
1031 catchsql { ALTER TABLE t2 ADD COLUMN f REFERENCES t1 DEFAULT 'text'} 1024 catchsql { ALTER TABLE t2 ADD COLUMN f REFERENCES t1 DEFAULT 'text'}
1032 } {1 {Cannot add a REFERENCES column with non-NULL default value}} 1025 } {1 {Cannot add a REFERENCES column with non-NULL default value}}
1033 do_test fkey2-14.1tmp.5 { 1026 do_test without_rowid3-14.1tmp.5 {
1034 catchsql { ALTER TABLE t2 ADD COLUMN g DEFAULT CURRENT_TIME REFERENCES t1 } 1027 catchsql { ALTER TABLE t2 ADD COLUMN g DEFAULT CURRENT_TIME REFERENCES t1 }
1035 } {1 {Cannot add a REFERENCES column with non-NULL default value}} 1028 } {1 {Cannot add a REFERENCES column with non-NULL default value}}
1036 do_test fkey2-14.1tmp.6 { 1029 do_test without_rowid3-14.1tmp.6 {
1037 execsql { 1030 execsql {
1038 PRAGMA foreign_keys = off; 1031 PRAGMA foreign_keys = off;
1039 ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; 1032 ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1;
1040 PRAGMA foreign_keys = on; 1033 PRAGMA foreign_keys = on;
1041 SELECT sql FROM sqlite_temp_master WHERE name='t2'; 1034 SELECT sql FROM sqlite_temp_master WHERE name='t2';
1042 } 1035 }
1043 } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REF ERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} 1036 } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REF ERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}}
1044 1037
1045 do_test fkey2-14.2tmp.1.1 { 1038 do_test without_rowid3-14.2tmp.1.1 {
1046 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 1039 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3
1047 } {{CREATE TABLE t1(a REFERENCES "t3")}} 1040 } {{CREATE TABLE t1(a REFERENCES "t3")}}
1048 do_test fkey2-14.2tmp.1.2 { 1041 do_test without_rowid3-14.2tmp.1.2 {
1049 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t4 t3 1042 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t4 t3
1050 } {{CREATE TABLE t1(a REFERENCES t2)}} 1043 } {{CREATE TABLE t1(a REFERENCES t2)}}
1051 do_test fkey2-14.2tmp.1.3 { 1044 do_test without_rowid3-14.2tmp.1.3 {
1052 test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 1045 test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3
1053 } {{CREATE TABLE t1(a REFERENCES "t3")}} 1046 } {{CREATE TABLE t1(a REFERENCES "t3")}}
1054 1047
1055 # Test ALTER TABLE RENAME TABLE a bit. 1048 # Test ALTER TABLE RENAME TABLE a bit.
1056 # 1049 #
1057 do_test fkey2-14.2tmp.2.1 { 1050 do_test without_rowid3-14.2tmp.2.1 {
1058 drop_all_tables 1051 drop_all_tables
1059 execsql { 1052 execsql {
1060 CREATE TEMP TABLE t1(a PRIMARY KEY, b REFERENCES t1); 1053 CREATE TEMP TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid;
1061 CREATE TEMP TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2); 1054 CREATE TEMP TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
1055 WITHOUT rowid;
1062 CREATE TEMP TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); 1056 CREATE TEMP TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1);
1063 } 1057 }
1064 execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'} 1058 execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'}
1065 } [list \ 1059 } [list \
1066 {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1)} \ 1060 {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \
1067 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)} \ 1061 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
1062 WITHOUT rowid} \
1068 {CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1)} \ 1063 {CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1)} \
1069 ] 1064 ]
1070 do_test fkey2-14.2tmp.2.2 { 1065 do_test without_rowid3-14.2tmp.2.2 {
1071 execsql { ALTER TABLE t1 RENAME TO t4 } 1066 execsql { ALTER TABLE t1 RENAME TO t4 }
1072 execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'} 1067 execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'}
1073 } [list \ 1068 } [list \
1074 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \ 1069 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \
1075 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \ 1070 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)
1071 WITHOUT rowid} \
1076 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \ 1072 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \
1077 ] 1073 ]
1078 do_test fkey2-14.2tmp.2.3 { 1074 do_test without_rowid3-14.2tmp.2.3 {
1079 catchsql { INSERT INTO t3 VALUES(1, 2, 3) } 1075 catchsql { INSERT INTO t3 VALUES(1, 2, 3) }
1080 } {1 {foreign key constraint failed}} 1076 } {1 {FOREIGN KEY constraint failed}}
1081 do_test fkey2-14.2tmp.2.4 { 1077 do_test without_rowid3-14.2tmp.2.4 {
1082 execsql { INSERT INTO t4 VALUES(1, NULL) } 1078 execsql { INSERT INTO t4 VALUES(1, NULL) }
1083 } {} 1079 } {}
1084 do_test fkey2-14.2tmp.2.5 { 1080 do_test without_rowid3-14.2tmp.2.5 {
1085 catchsql { UPDATE t4 SET b = 5 } 1081 catchsql { UPDATE t4 SET b = 5 }
1086 } {1 {foreign key constraint failed}} 1082 } {1 {FOREIGN KEY constraint failed}}
1087 do_test fkey2-14.2tmp.2.6 { 1083 do_test without_rowid3-14.2tmp.2.6 {
1088 catchsql { UPDATE t4 SET b = 1 } 1084 catchsql { UPDATE t4 SET b = 1 }
1089 } {0 {}} 1085 } {0 {}}
1090 do_test fkey2-14.2tmp.2.7 { 1086 do_test without_rowid3-14.2tmp.2.7 {
1091 execsql { INSERT INTO t3 VALUES(1, NULL, 1) } 1087 execsql { INSERT INTO t3 VALUES(1, NULL, 1) }
1092 } {} 1088 } {}
1093 1089
1094 # Repeat for ATTACH-ed tables 1090 # Repeat for ATTACH-ed tables
1095 # 1091 #
1096 drop_all_tables 1092 drop_all_tables
1097 do_test fkey2-14.1aux.1 { 1093 do_test without_rowid3-14.1aux.1 {
1098 # Adding a column with a REFERENCES clause is not supported. 1094 # Adding a column with a REFERENCES clause is not supported.
1099 execsql { 1095 execsql {
1100 ATTACH ':memory:' AS aux; 1096 ATTACH ':memory:' AS aux;
1101 CREATE TABLE aux.t1(a PRIMARY KEY); 1097 CREATE TABLE aux.t1(a PRIMARY KEY) WITHOUT rowid;
1102 CREATE TABLE aux.t2(a, b); 1098 CREATE TABLE aux.t2(a, b);
1103 } 1099 }
1104 catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 } 1100 catchsql { ALTER TABLE t2 ADD COLUMN c REFERENCES t1 }
1105 } {0 {}} 1101 } {0 {}}
1106 do_test fkey2-14.1aux.2 { 1102 do_test without_rowid3-14.1aux.2 {
1107 catchsql { ALTER TABLE t2 ADD COLUMN d DEFAULT NULL REFERENCES t1 } 1103 catchsql { ALTER TABLE t2 ADD COLUMN d DEFAULT NULL REFERENCES t1 }
1108 } {0 {}} 1104 } {0 {}}
1109 do_test fkey2-14.1aux.3 { 1105 do_test without_rowid3-14.1aux.3 {
1110 catchsql { ALTER TABLE t2 ADD COLUMN e REFERENCES t1 DEFAULT NULL} 1106 catchsql { ALTER TABLE t2 ADD COLUMN e REFERENCES t1 DEFAULT NULL}
1111 } {0 {}} 1107 } {0 {}}
1112 do_test fkey2-14.1aux.4 { 1108 do_test without_rowid3-14.1aux.4 {
1113 catchsql { ALTER TABLE t2 ADD COLUMN f REFERENCES t1 DEFAULT 'text'} 1109 catchsql { ALTER TABLE t2 ADD COLUMN f REFERENCES t1 DEFAULT 'text'}
1114 } {1 {Cannot add a REFERENCES column with non-NULL default value}} 1110 } {1 {Cannot add a REFERENCES column with non-NULL default value}}
1115 do_test fkey2-14.1aux.5 { 1111 do_test without_rowid3-14.1aux.5 {
1116 catchsql { ALTER TABLE t2 ADD COLUMN g DEFAULT CURRENT_TIME REFERENCES t1 } 1112 catchsql { ALTER TABLE t2 ADD COLUMN g DEFAULT CURRENT_TIME REFERENCES t1 }
1117 } {1 {Cannot add a REFERENCES column with non-NULL default value}} 1113 } {1 {Cannot add a REFERENCES column with non-NULL default value}}
1118 do_test fkey2-14.1aux.6 { 1114 do_test without_rowid3-14.1aux.6 {
1119 execsql { 1115 execsql {
1120 PRAGMA foreign_keys = off; 1116 PRAGMA foreign_keys = off;
1121 ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; 1117 ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1;
1122 PRAGMA foreign_keys = on; 1118 PRAGMA foreign_keys = on;
1123 SELECT sql FROM aux.sqlite_master WHERE name='t2'; 1119 SELECT sql FROM aux.sqlite_master WHERE name='t2';
1124 } 1120 }
1125 } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REF ERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} 1121 } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REF ERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}}
1126 1122
1127 do_test fkey2-14.2aux.1.1 { 1123 do_test without_rowid3-14.2aux.1.1 {
1128 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 1124 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3
1129 } {{CREATE TABLE t1(a REFERENCES "t3")}} 1125 } {{CREATE TABLE t1(a REFERENCES "t3")}}
1130 do_test fkey2-14.2aux.1.2 { 1126 do_test without_rowid3-14.2aux.1.2 {
1131 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t4 t3 1127 test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t4 t3
1132 } {{CREATE TABLE t1(a REFERENCES t2)}} 1128 } {{CREATE TABLE t1(a REFERENCES t2)}}
1133 do_test fkey2-14.2aux.1.3 { 1129 do_test without_rowid3-14.2aux.1.3 {
1134 test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 1130 test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3
1135 } {{CREATE TABLE t1(a REFERENCES "t3")}} 1131 } {{CREATE TABLE t1(a REFERENCES "t3")}}
1136 1132
1137 # Test ALTER TABLE RENAME TABLE a bit. 1133 # Test ALTER TABLE RENAME TABLE a bit.
1138 # 1134 #
1139 do_test fkey2-14.2aux.2.1 { 1135 do_test without_rowid3-14.2aux.2.1 {
1140 drop_all_tables 1136 drop_all_tables
1141 execsql { 1137 execsql {
1142 CREATE TABLE aux.t1(a PRIMARY KEY, b REFERENCES t1); 1138 CREATE TABLE aux.t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid;
1143 CREATE TABLE aux.t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2); 1139 CREATE TABLE aux.t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
1140 WITHOUT rowid;
1144 CREATE TABLE aux.t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); 1141 CREATE TABLE aux.t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1);
1145 } 1142 }
1146 execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'} 1143 execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'}
1147 } [list \ 1144 } [list \
1148 {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1)} \ 1145 {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \
1149 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)} \ 1146 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2)
1147 WITHOUT rowid} \
1150 {CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1)} \ 1148 {CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1)} \
1151 ] 1149 ]
1152 do_test fkey2-14.2aux.2.2 { 1150 do_test without_rowid3-14.2aux.2.2 {
1153 execsql { ALTER TABLE t1 RENAME TO t4 } 1151 execsql { ALTER TABLE t1 RENAME TO t4 }
1154 execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'} 1152 execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'}
1155 } [list \ 1153 } [list \
1156 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \ 1154 {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \
1157 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \ 1155 {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)
1156 WITHOUT rowid} \
1158 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \ 1157 {CREATE TABLE t3(a REFERENCES "t4", b REFERENCES t2, c REFERENCES "t4")} \
1159 ] 1158 ]
1160 do_test fkey2-14.2aux.2.3 { 1159 do_test without_rowid3-14.2aux.2.3 {
1161 catchsql { INSERT INTO t3 VALUES(1, 2, 3) } 1160 catchsql { INSERT INTO t3 VALUES(1, 2, 3) }
1162 } {1 {foreign key constraint failed}} 1161 } {1 {FOREIGN KEY constraint failed}}
1163 do_test fkey2-14.2aux.2.4 { 1162 do_test without_rowid3-14.2aux.2.4 {
1164 execsql { INSERT INTO t4 VALUES(1, NULL) } 1163 execsql { INSERT INTO t4 VALUES(1, NULL) }
1165 } {} 1164 } {}
1166 do_test fkey2-14.2aux.2.5 { 1165 do_test without_rowid3-14.2aux.2.5 {
1167 catchsql { UPDATE t4 SET b = 5 } 1166 catchsql { UPDATE t4 SET b = 5 }
1168 } {1 {foreign key constraint failed}} 1167 } {1 {FOREIGN KEY constraint failed}}
1169 do_test fkey2-14.2aux.2.6 { 1168 do_test without_rowid3-14.2aux.2.6 {
1170 catchsql { UPDATE t4 SET b = 1 } 1169 catchsql { UPDATE t4 SET b = 1 }
1171 } {0 {}} 1170 } {0 {}}
1172 do_test fkey2-14.2aux.2.7 { 1171 do_test without_rowid3-14.2aux.2.7 {
1173 execsql { INSERT INTO t3 VALUES(1, NULL, 1) } 1172 execsql { INSERT INTO t3 VALUES(1, NULL, 1) }
1174 } {} 1173 } {}
1175 } 1174 }
1176 1175
1177 do_test fkey-2.14.3.1 { 1176 do_test without_rowid3-2.14.3.1 {
1178 drop_all_tables 1177 drop_all_tables
1179 execsql { 1178 execsql {
1180 CREATE TABLE t1(a, b REFERENCES nosuchtable); 1179 CREATE TABLE t1(a, b REFERENCES nosuchtable);
1181 DROP TABLE t1; 1180 DROP TABLE t1;
1182 } 1181 }
1183 } {} 1182 } {}
1184 do_test fkey-2.14.3.2 { 1183 do_test without_rowid3-2.14.3.2 {
1185 execsql { 1184 execsql {
1186 CREATE TABLE t1(a PRIMARY KEY, b); 1185 CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT rowid;
1187 INSERT INTO t1 VALUES('a', 1); 1186 INSERT INTO t1 VALUES('a', 1);
1188 CREATE TABLE t2(x REFERENCES t1); 1187 CREATE TABLE t2(x REFERENCES t1);
1189 INSERT INTO t2 VALUES('a'); 1188 INSERT INTO t2 VALUES('a');
1190 } 1189 }
1191 } {} 1190 } {}
1192 do_test fkey-2.14.3.3 { 1191 do_test without_rowid3-2.14.3.3 {
1193 catchsql { DROP TABLE t1 } 1192 catchsql { DROP TABLE t1 }
1194 } {1 {foreign key constraint failed}} 1193 } {1 {FOREIGN KEY constraint failed}}
1195 do_test fkey-2.14.3.4 { 1194 do_test without_rowid3-2.14.3.4 {
1196 execsql { 1195 execsql {
1197 DELETE FROM t2; 1196 DELETE FROM t2;
1198 DROP TABLE t1; 1197 DROP TABLE t1;
1199 } 1198 }
1200 } {} 1199 } {}
1201 do_test fkey-2.14.3.4 { 1200 do_test without_rowid3-2.14.3.4 {
1202 catchsql { INSERT INTO t2 VALUES('x') } 1201 catchsql { INSERT INTO t2 VALUES('x') }
1203 } {1 {no such table: main.t1}} 1202 } {1 {no such table: main.t1}}
1204 do_test fkey-2.14.3.5 { 1203 do_test without_rowid3-2.14.3.5 {
1205 execsql { 1204 execsql {
1206 CREATE TABLE t1(x PRIMARY KEY); 1205 CREATE TABLE t1(x PRIMARY KEY) WITHOUT rowid;
1207 INSERT INTO t1 VALUES('x'); 1206 INSERT INTO t1 VALUES('x');
1208 } 1207 }
1209 execsql { INSERT INTO t2 VALUES('x') } 1208 execsql { INSERT INTO t2 VALUES('x') }
1210 } {} 1209 } {}
1211 do_test fkey-2.14.3.6 { 1210 do_test without_rowid3-2.14.3.6 {
1212 catchsql { DROP TABLE t1 } 1211 catchsql { DROP TABLE t1 }
1213 } {1 {foreign key constraint failed}} 1212 } {1 {FOREIGN KEY constraint failed}}
1214 do_test fkey-2.14.3.7 { 1213 do_test without_rowid3-2.14.3.7 {
1215 execsql { 1214 execsql {
1216 DROP TABLE t2; 1215 DROP TABLE t2;
1217 DROP TABLE t1; 1216 DROP TABLE t1;
1218 } 1217 }
1219 } {} 1218 } {}
1220 do_test fkey-2.14.3.8 { 1219 do_test without_rowid3-2.14.3.8 {
1221 execsql { 1220 execsql {
1222 CREATE TABLE pp(x, y, PRIMARY KEY(x, y)); 1221 CREATE TABLE pp(x, y, PRIMARY KEY(x, y)) WITHOUT ROWID;
1223 CREATE TABLE cc(a, b, FOREIGN KEY(a, b) REFERENCES pp(x, z)); 1222 CREATE TABLE cc(a, b, FOREIGN KEY(a, b) REFERENCES pp(x, z));
1224 } 1223 }
1225 catchsql { INSERT INTO cc VALUES(1, 2) } 1224 catchsql { INSERT INTO cc VALUES(1, 2) }
1226 } {1 {foreign key mismatch}} 1225 } {1 {foreign key mismatch - "cc" referencing "pp"}}
1227 do_test fkey-2.14.3.9 { 1226 do_test without_rowid3-2.14.3.9 {
1228 execsql { DROP TABLE cc } 1227 execsql { DROP TABLE cc }
1229 } {} 1228 } {}
1230 do_test fkey-2.14.3.10 { 1229 do_test without_rowid3-2.14.3.10 {
1231 execsql { 1230 execsql {
1232 CREATE TABLE cc(a, b, 1231 CREATE TABLE cc(a, b,
1233 FOREIGN KEY(a, b) REFERENCES pp DEFERRABLE INITIALLY DEFERRED 1232 FOREIGN KEY(a, b) REFERENCES pp DEFERRABLE INITIALLY DEFERRED
1234 ); 1233 );
1235 } 1234 }
1236 execsql { 1235 execsql {
1237 INSERT INTO pp VALUES('a', 'b'); 1236 INSERT INTO pp VALUES('a', 'b');
1238 INSERT INTO cc VALUES('a', 'b'); 1237 INSERT INTO cc VALUES('a', 'b');
1239 BEGIN; 1238 BEGIN;
1240 DROP TABLE pp; 1239 DROP TABLE pp;
1241 CREATE TABLE pp(a, b, c, PRIMARY KEY(b, c)); 1240 CREATE TABLE pp(a, b, c, PRIMARY KEY(b, c)) WITHOUT rowid;
1242 INSERT INTO pp VALUES(1, 'a', 'b'); 1241 INSERT INTO pp VALUES(1, 'a', 'b');
1243 COMMIT; 1242 COMMIT;
1244 } 1243 }
1245 } {} 1244 } {}
1246 do_test fkey-2.14.3.11 { 1245 do_test without_rowid3-2.14.3.11 {
1247 execsql { 1246 execsql {
1248 BEGIN; 1247 BEGIN;
1249 DROP TABLE cc; 1248 DROP TABLE cc;
1250 DROP TABLE pp; 1249 DROP TABLE pp;
1251 COMMIT; 1250 COMMIT;
1252 } 1251 }
1253 } {} 1252 } {}
1254 do_test fkey-2.14.3.12 { 1253 do_test without_rowid3-2.14.3.12 {
1255 execsql { 1254 execsql {
1256 CREATE TABLE b1(a, b); 1255 CREATE TABLE b1(a, b);
1257 CREATE TABLE b2(a, b REFERENCES b1); 1256 CREATE TABLE b2(a, b REFERENCES b1);
1258 DROP TABLE b1; 1257 DROP TABLE b1;
1259 } 1258 }
1260 } {} 1259 } {}
1261 do_test fkey-2.14.3.13 { 1260 do_test without_rowid3-2.14.3.13 {
1262 execsql { 1261 execsql {
1263 CREATE TABLE b3(a, b REFERENCES b2 DEFERRABLE INITIALLY DEFERRED); 1262 CREATE TABLE b3(a, b REFERENCES b2 DEFERRABLE INITIALLY DEFERRED);
1264 DROP TABLE b2; 1263 DROP TABLE b2;
1265 } 1264 }
1266 } {} 1265 } {}
1267 1266
1268 # Test that nothing goes wrong when dropping a table that refers to a view. 1267 # Test that nothing goes wrong when dropping a table that refers to a view.
1269 # Or dropping a view that an existing FK (incorrectly) refers to. Or either 1268 # Or dropping a view that an existing FK (incorrectly) refers to. Or either
1270 # of the above scenarios with a virtual table. 1269 # of the above scenarios with a virtual table.
1271 drop_all_tables 1270 drop_all_tables
1272 do_test fkey-2.14.4.1 { 1271 do_test without_rowid3-2.14.4.1 {
1273 execsql { 1272 execsql {
1274 CREATE TABLE t1(x REFERENCES v); 1273 CREATE TABLE t1(x REFERENCES v);
1275 CREATE VIEW v AS SELECT * FROM t1; 1274 CREATE VIEW v AS SELECT * FROM t1;
1276 } 1275 }
1277 } {} 1276 } {}
1278 do_test fkey-2.14.4.2 { 1277 do_test without_rowid3-2.14.4.2 {
1279 execsql { 1278 execsql {
1280 DROP VIEW v; 1279 DROP VIEW v;
1281 } 1280 }
1282 } {} 1281 } {}
1283 ifcapable vtab { 1282 ifcapable vtab {
1284 register_echo_module db 1283 register_echo_module db
1285 do_test fkey-2.14.4.3 { 1284 do_test without_rowid3-2.14.4.3 {
1286 execsql { CREATE VIRTUAL TABLE v USING echo(t1) } 1285 execsql { CREATE VIRTUAL TABLE v USING echo(t1) }
1287 } {} 1286 } {}
1288 do_test fkey-2.14.4.2 { 1287 do_test without_rowid3-2.14.4.2 {
1289 execsql { 1288 execsql {
1290 DROP TABLE v; 1289 DROP TABLE v;
1291 } 1290 }
1292 } {} 1291 } {}
1293 } 1292 }
1294 1293
1295 #------------------------------------------------------------------------- 1294 #-------------------------------------------------------------------------
1296 # The following tests, fkey2-15.*, test that unnecessary FK related scans 1295 # The following tests, without_rowid3-15.*, test that unnecessary FK related sca ns
1297 # and lookups are avoided when the constraint counters are zero. 1296 # and lookups are avoided when the constraint counters are zero.
1298 # 1297 #
1299 drop_all_tables 1298 drop_all_tables
1300 proc execsqlS {zSql} { 1299 proc execsqlS {zSql} {
1301 set ::sqlite_search_count 0 1300 set ::sqlite_search_count 0
1302 set ::sqlite_found_count 0 1301 set ::sqlite_found_count 0
1303 set res [uplevel [list execsql $zSql]] 1302 set res [uplevel [list execsql $zSql]]
1304 concat [expr $::sqlite_found_count + $::sqlite_search_count] $res 1303 concat [expr $::sqlite_found_count + $::sqlite_search_count] $res
1305 } 1304 }
1306 do_test fkey2-15.1.1 { 1305 do_test without_rowid3-15.1.1 {
1307 execsql { 1306 execsql {
1308 CREATE TABLE pp(a PRIMARY KEY, b); 1307 CREATE TABLE pp(a PRIMARY KEY, b) WITHOUT rowid;
1309 CREATE TABLE cc(x, y REFERENCES pp DEFERRABLE INITIALLY DEFERRED); 1308 CREATE TABLE cc(x, y REFERENCES pp DEFERRABLE INITIALLY DEFERRED);
1310 INSERT INTO pp VALUES(1, 'one'); 1309 INSERT INTO pp VALUES(1, 'one');
1311 INSERT INTO pp VALUES(2, 'two'); 1310 INSERT INTO pp VALUES(2, 'two');
1312 INSERT INTO cc VALUES('neung', 1); 1311 INSERT INTO cc VALUES('neung', 1);
1313 INSERT INTO cc VALUES('song', 2); 1312 INSERT INTO cc VALUES('song', 2);
1314 } 1313 }
1315 } {} 1314 } {}
1316 do_test fkey2-15.1.2 { 1315 do_test without_rowid3-15.1.2 {
1317 execsqlS { INSERT INTO pp VALUES(3, 'three') } 1316 execsqlS { INSERT INTO pp VALUES(3, 'three') }
1318 } {0} 1317 } {0}
1319 do_test fkey2-15.1.3 { 1318 do_test without_rowid3-15.1.3 {
1320 execsql { 1319 execsql {
1321 BEGIN; 1320 BEGIN;
1322 INSERT INTO cc VALUES('see', 4); -- Violates deferred constraint 1321 INSERT INTO cc VALUES('see', 4); -- Violates deferred constraint
1323 } 1322 }
1324 execsqlS { INSERT INTO pp VALUES(5, 'five') } 1323 execsqlS { INSERT INTO pp VALUES(5, 'five') }
1325 } {2} 1324 } {2}
1326 do_test fkey2-15.1.4 { 1325 do_test without_rowid3-15.1.4 {
1327 execsql { DELETE FROM cc WHERE x = 'see' } 1326 execsql { DELETE FROM cc WHERE x = 'see' }
1328 execsqlS { INSERT INTO pp VALUES(6, 'six') } 1327 execsqlS { INSERT INTO pp VALUES(6, 'six') }
1329 } {0} 1328 } {0}
1330 do_test fkey2-15.1.5 { 1329 do_test without_rowid3-15.1.5 {
1331 execsql COMMIT 1330 execsql COMMIT
1332 } {} 1331 } {}
1333 do_test fkey2-15.1.6 { 1332 do_test without_rowid3-15.1.6 {
1334 execsql BEGIN 1333 execsql BEGIN
1335 execsqlS { 1334 execsqlS {
1336 DELETE FROM cc WHERE x = 'neung'; 1335 DELETE FROM cc WHERE x = 'neung';
1337 ROLLBACK; 1336 ROLLBACK;
1338 } 1337 }
1339 } {1} 1338 } {1}
1340 do_test fkey2-15.1.7 { 1339 do_test without_rowid3-15.1.7 {
1341 execsql { 1340 execsql {
1342 BEGIN; 1341 BEGIN;
1343 DELETE FROM pp WHERE a = 2; 1342 DELETE FROM pp WHERE a = 2;
1344 } 1343 }
1345 execsqlS { 1344 execsqlS {
1346 DELETE FROM cc WHERE x = 'neung'; 1345 DELETE FROM cc WHERE x = 'neung';
1347 ROLLBACK; 1346 ROLLBACK;
1348 } 1347 }
1349 } {2} 1348 } {2}
1350 1349
1351 #------------------------------------------------------------------------- 1350 #-------------------------------------------------------------------------
1352 # This next block of tests, fkey2-16.*, test that rows that refer to 1351 # This next block of tests, without_rowid3-16.*, test that rows that refer to
1353 # themselves may be inserted and deleted. 1352 # themselves may be inserted and deleted.
1354 # 1353 #
1355 foreach {tn zSchema} { 1354 foreach {tn zSchema} {
1356 1 { CREATE TABLE self(a INTEGER PRIMARY KEY, b REFERENCES self(a)) } 1355 1 { CREATE TABLE self(a INTEGER PRIMARY KEY, b REFERENCES self(a))
1357 2 { CREATE TABLE self(a PRIMARY KEY, b REFERENCES self(a)) } 1356 WITHOUT rowid }
1358 3 { CREATE TABLE self(a UNIQUE, b INTEGER PRIMARY KEY REFERENCES self(a)) } 1357 2 { CREATE TABLE self(a PRIMARY KEY, b REFERENCES self(a)) WITHOUT rowid }
1358 3 { CREATE TABLE self(a UNIQUE, b INT PRIMARY KEY REFERENCES self(a))
1359 WITHOUT rowid }
1359 } { 1360 } {
1360 drop_all_tables 1361 drop_all_tables
1361 do_test fkey2-16.1.$tn.1 { 1362 do_test without_rowid3-16.1.$tn.1 {
1362 execsql $zSchema 1363 execsql $zSchema
1363 execsql { INSERT INTO self VALUES(13, 13) } 1364 execsql { INSERT INTO self VALUES(13, 13) }
1364 } {} 1365 } {}
1365 do_test fkey2-16.1.$tn.2 { 1366 do_test without_rowid3-16.1.$tn.2 {
1366 execsql { UPDATE self SET a = 14, b = 14 } 1367 execsql { UPDATE self SET a = 14, b = 14 }
1367 } {} 1368 } {}
1368 1369
1369 do_test fkey2-16.1.$tn.3 { 1370 do_test without_rowid3-16.1.$tn.3 {
1370 catchsql { UPDATE self SET b = 15 } 1371 catchsql { UPDATE self SET b = 15 }
1371 } {1 {foreign key constraint failed}} 1372 } {1 {FOREIGN KEY constraint failed}}
1372 1373
1373 do_test fkey2-16.1.$tn.4 { 1374 do_test without_rowid3-16.1.$tn.4 {
1374 catchsql { UPDATE self SET a = 15 } 1375 catchsql { UPDATE self SET a = 15 }
1375 } {1 {foreign key constraint failed}} 1376 } {1 {FOREIGN KEY constraint failed}}
1376 1377
1377 do_test fkey2-16.1.$tn.5 { 1378 do_test without_rowid3-16.1.$tn.5 {
1378 catchsql { UPDATE self SET a = 15, b = 16 } 1379 catchsql { UPDATE self SET a = 15, b = 16 }
1379 } {1 {foreign key constraint failed}} 1380 } {1 {FOREIGN KEY constraint failed}}
1380 1381
1381 do_test fkey2-16.1.$tn.6 { 1382 do_test without_rowid3-16.1.$tn.6 {
1382 catchsql { UPDATE self SET a = 17, b = 17 } 1383 catchsql { UPDATE self SET a = 17, b = 17 }
1383 } {0 {}} 1384 } {0 {}}
1384 1385
1385 do_test fkey2-16.1.$tn.7 { 1386 do_test without_rowid3-16.1.$tn.7 {
1386 execsql { DELETE FROM self } 1387 execsql { DELETE FROM self }
1387 } {} 1388 } {}
1388 do_test fkey2-16.1.$tn.8 { 1389 do_test without_rowid3-16.1.$tn.8 {
1389 catchsql { INSERT INTO self VALUES(20, 21) } 1390 catchsql { INSERT INTO self VALUES(20, 21) }
1390 } {1 {foreign key constraint failed}} 1391 } {1 {FOREIGN KEY constraint failed}}
1391 } 1392 }
1392 1393
1394 # Additional tests cases using multi-column self-referential
1395 # FOREIGN KEY constraints.
1396 #
1397 drop_all_tables
1398 do_execsql_test without_rowid3-16.4.1.1 {
1399 PRAGMA foreign_keys=ON;
1400 CREATE TABLE t1(a,b,c,d,e,f,
1401 UNIQUE (a,b),
1402 PRIMARY KEY (e,c),
1403 FOREIGN KEY (d,f) REFERENCES t1(e,c)
1404 ) WITHOUT rowid;
1405 INSERT INTO t1 VALUES(1,2,3,5,5,3);
1406 INSERT INTO t1 VALUES(2,3,4,6,6,4);
1407 INSERT INTO t1 VALUES('x','y',1.5,'fizzle','fizzle',1.5);
1408 SELECT *, '|' FROM t1 ORDER BY a, b;
1409 } {1 2 3 5 5 3 | 2 3 4 6 6 4 | x y 1.5 fizzle fizzle 1.5 |}
1410
1411 do_execsql_test without_rowid3-16.4.1.2 {
1412 UPDATE t1 SET c=99, f=99 WHERE a=1;
1413 SELECT *, '|' FROM t1 ORDER BY a, b;
1414 } {1 2 99 5 5 99 | 2 3 4 6 6 4 | x y 1.5 fizzle fizzle 1.5 |}
1415
1416 do_execsql_test without_rowid3-16.4.1.3 {
1417 UPDATE t1 SET e=876, d=876 WHERE a=2;
1418 SELECT *, '|' FROM t1 ORDER BY a, b;
1419 } {1 2 99 5 5 99 | 2 3 4 876 876 4 | x y 1.5 fizzle fizzle 1.5 |}
1420
1421 do_test without_rowid3-16.4.1.4 {
1422 catchsql {
1423 UPDATE t1 SET c=11, e=22 WHERE a=1;
1424 }
1425 } {1 {FOREIGN KEY constraint failed}}
1426
1427 do_test without_rowid3-16.4.1.5 {
1428 catchsql {
1429 UPDATE t1 SET d=11, f=22 WHERE a=1;
1430 }
1431 } {1 {FOREIGN KEY constraint failed}}
1432
1433 do_execsql_test without_rowid3-16.4.1.6 {
1434 DELETE FROM t1 WHERE a=1;
1435 SELECT *, '|' FROM t1 ORDER BY a, b;
1436 } {2 3 4 876 876 4 | x y 1.5 fizzle fizzle 1.5 |}
1437
1438 do_execsql_test without_rowid3-16.4.2.1 {
1439 DROP TABLE t1;
1440 CREATE TABLE t1(a,b,c,d,e,f,
1441 PRIMARY KEY (a,b),
1442 UNIQUE (e,c),
1443 FOREIGN KEY (d,f) REFERENCES t1(e,c)
1444 ) WITHOUT rowid;
1445 INSERT INTO t1 VALUES(1,2,3,5,5,3);
1446 INSERT INTO t1 VALUES(2,3,4,6,6,4);
1447 INSERT INTO t1 VALUES('x','y',1.5,'fizzle','fizzle',1.5);
1448 SELECT *, '|' FROM t1 ORDER BY a, b;
1449 } {1 2 3 5 5 3 | 2 3 4 6 6 4 | x y 1.5 fizzle fizzle 1.5 |}
1450
1451 do_execsql_test without_rowid3-16.4.2.2 {
1452 UPDATE t1 SET c=99, f=99 WHERE a=1;
1453 SELECT *, '|' FROM t1 ORDER BY a, b;
1454 } {1 2 99 5 5 99 | 2 3 4 6 6 4 | x y 1.5 fizzle fizzle 1.5 |}
1455
1456 do_execsql_test without_rowid3-16.4.2.3 {
1457 UPDATE t1 SET e=876, d=876 WHERE a=2;
1458 SELECT *, '|' FROM t1 ORDER BY a, b;
1459 } {1 2 99 5 5 99 | 2 3 4 876 876 4 | x y 1.5 fizzle fizzle 1.5 |}
1460
1461 do_test without_rowid3-16.4.2.4 {
1462 catchsql {
1463 UPDATE t1 SET c=11, e=22 WHERE a=1;
1464 }
1465 } {1 {FOREIGN KEY constraint failed}}
1466
1467 do_test without_rowid3-16.4.2.5 {
1468 catchsql {
1469 UPDATE t1 SET d=11, f=22 WHERE a=1;
1470 }
1471 } {1 {FOREIGN KEY constraint failed}}
1472
1473 do_execsql_test without_rowid3-16.4.2.6 {
1474 DELETE FROM t1 WHERE a=1;
1475 SELECT *, '|' FROM t1 ORDER BY a, b;
1476 } {2 3 4 876 876 4 | x y 1.5 fizzle fizzle 1.5 |}
1477
1478
1393 #------------------------------------------------------------------------- 1479 #-------------------------------------------------------------------------
1394 # This next block of tests, fkey2-17.*, tests that if "PRAGMA count_changes" 1480 # This next block of tests, without_rowid3-17.*, tests that if "PRAGMA count_cha nges"
1395 # is turned on statements that violate immediate FK constraints return 1481 # is turned on statements that violate immediate FK constraints return
1396 # SQLITE_CONSTRAINT immediately, not after returning a number of rows. 1482 # SQLITE_CONSTRAINT immediately, not after returning a number of rows.
1397 # Whereas statements that violate deferred FK constraints return the number 1483 # Whereas statements that violate deferred FK constraints return the number
1398 # of rows before failing. 1484 # of rows before failing.
1399 # 1485 #
1400 # Also test that rows modified by FK actions are not counted in either the 1486 # Also test that rows modified by FK actions are not counted in either the
1401 # returned row count or the values returned by sqlite3_changes(). Like 1487 # returned row count or the values returned by sqlite3_changes(). Like
1402 # trigger related changes, they are included in sqlite3_total_changes() though. 1488 # trigger related changes, they are included in sqlite3_total_changes() though.
1403 # 1489 #
1404 drop_all_tables 1490 drop_all_tables
1405 do_test fkey2-17.1.1 { 1491 do_test without_rowid3-17.1.1 {
1406 execsql { PRAGMA count_changes = 1 } 1492 execsql { PRAGMA count_changes = 1 }
1407 execsql { 1493 execsql {
1408 CREATE TABLE one(a, b, c, UNIQUE(b, c)); 1494 CREATE TABLE one(a, b, c, UNIQUE(b, c));
1409 CREATE TABLE two(d, e, f, FOREIGN KEY(e, f) REFERENCES one(b, c)); 1495 CREATE TABLE two(d, e, f, FOREIGN KEY(e, f) REFERENCES one(b, c));
1410 INSERT INTO one VALUES(1, 2, 3); 1496 INSERT INTO one VALUES(1, 2, 3);
1411 } 1497 }
1412 } {1} 1498 } {1}
1413 do_test fkey2-17.1.2 { 1499 do_test without_rowid3-17.1.2 {
1414 set STMT [sqlite3_prepare_v2 db "INSERT INTO two VALUES(4, 5, 6)" -1 dummy] 1500 set STMT [sqlite3_prepare_v2 db "INSERT INTO two VALUES(4, 5, 6)" -1 dummy]
1415 sqlite3_step $STMT 1501 sqlite3_step $STMT
1416 } {SQLITE_CONSTRAINT} 1502 } {SQLITE_CONSTRAINT}
1503 verify_ex_errcode without_rowid3-17.1.2b SQLITE_CONSTRAINT_FOREIGNKEY
1417 ifcapable autoreset { 1504 ifcapable autoreset {
1418 do_test fkey2-17.1.3 { 1505 do_test without_rowid3-17.1.3 {
1419 sqlite3_step $STMT 1506 sqlite3_step $STMT
1420 } {SQLITE_CONSTRAINT} 1507 } {SQLITE_CONSTRAINT}
1508 verify_ex_errcode without_rowid3-17.1.3b SQLITE_CONSTRAINT_FOREIGNKEY
1421 } else { 1509 } else {
1422 do_test fkey2-17.1.3 { 1510 do_test without_rowid3-17.1.3 {
1423 sqlite3_step $STMT 1511 sqlite3_step $STMT
1424 } {SQLITE_MISUSE} 1512 } {SQLITE_MISUSE}
1425 } 1513 }
1426 do_test fkey2-17.1.4 { 1514 do_test without_rowid3-17.1.4 {
1427 sqlite3_finalize $STMT 1515 sqlite3_finalize $STMT
1428 } {SQLITE_CONSTRAINT} 1516 } {SQLITE_CONSTRAINT}
1429 do_test fkey2-17.1.5 { 1517 verify_ex_errcode without_rowid3-17.1.4b SQLITE_CONSTRAINT_FOREIGNKEY
1518 do_test without_rowid3-17.1.5 {
1430 execsql { 1519 execsql {
1431 INSERT INTO one VALUES(2, 3, 4); 1520 INSERT INTO one VALUES(2, 3, 4);
1432 INSERT INTO one VALUES(3, 4, 5); 1521 INSERT INTO one VALUES(3, 4, 5);
1433 INSERT INTO two VALUES(1, 2, 3); 1522 INSERT INTO two VALUES(1, 2, 3);
1434 INSERT INTO two VALUES(2, 3, 4); 1523 INSERT INTO two VALUES(2, 3, 4);
1435 INSERT INTO two VALUES(3, 4, 5); 1524 INSERT INTO two VALUES(3, 4, 5);
1436 } 1525 }
1437 } {1 1 1 1 1} 1526 } {1 1 1 1 1}
1438 do_test fkey2-17.1.6 { 1527 do_test without_rowid3-17.1.6 {
1439 catchsql { 1528 catchsql {
1440 BEGIN; 1529 BEGIN;
1441 INSERT INTO one VALUES(0, 0, 0); 1530 INSERT INTO one VALUES(0, 0, 0);
1442 UPDATE two SET e=e+1, f=f+1; 1531 UPDATE two SET e=e+1, f=f+1;
1443 } 1532 }
1444 } {1 {foreign key constraint failed}} 1533 } {1 {FOREIGN KEY constraint failed}}
1445 do_test fkey2-17.1.7 { 1534 do_test without_rowid3-17.1.7 {
1446 execsql { SELECT * FROM one } 1535 execsql { SELECT * FROM one }
1447 } {1 2 3 2 3 4 3 4 5 0 0 0} 1536 } {1 2 3 2 3 4 3 4 5 0 0 0}
1448 do_test fkey2-17.1.8 { 1537 do_test without_rowid3-17.1.8 {
1449 execsql { SELECT * FROM two } 1538 execsql { SELECT * FROM two }
1450 } {1 2 3 2 3 4 3 4 5} 1539 } {1 2 3 2 3 4 3 4 5}
1451 do_test fkey2-17.1.9 { 1540 do_test without_rowid3-17.1.9 {
1452 execsql COMMIT 1541 execsql COMMIT
1453 } {} 1542 } {}
1454 do_test fkey2-17.1.10 { 1543 do_test without_rowid3-17.1.10 {
1455 execsql { 1544 execsql {
1456 CREATE TABLE three( 1545 CREATE TABLE three(
1457 g, h, i, 1546 g, h, i,
1458 FOREIGN KEY(h, i) REFERENCES one(b, c) DEFERRABLE INITIALLY DEFERRED 1547 FOREIGN KEY(h, i) REFERENCES one(b, c) DEFERRABLE INITIALLY DEFERRED
1459 ); 1548 );
1460 } 1549 }
1461 } {} 1550 } {}
1462 do_test fkey2-17.1.11 { 1551 do_test without_rowid3-17.1.11 {
1463 set STMT [sqlite3_prepare_v2 db "INSERT INTO three VALUES(7, 8, 9)" -1 dummy] 1552 set STMT [sqlite3_prepare_v2 db "INSERT INTO three VALUES(7, 8, 9)" -1 dummy]
1464 sqlite3_step $STMT 1553 sqlite3_step $STMT
1465 } {SQLITE_ROW} 1554 } {SQLITE_ROW}
1466 do_test fkey2-17.1.12 { 1555 do_test without_rowid3-17.1.12 {
1467 sqlite3_column_text $STMT 0 1556 sqlite3_column_text $STMT 0
1468 } {1} 1557 } {1}
1469 do_test fkey2-17.1.13 { 1558 do_test without_rowid3-17.1.13 {
1470 sqlite3_step $STMT 1559 sqlite3_step $STMT
1471 } {SQLITE_CONSTRAINT} 1560 } {SQLITE_CONSTRAINT}
1472 do_test fkey2-17.1.14 { 1561 verify_ex_errcode without_rowid3-17.1.13b SQLITE_CONSTRAINT_FOREIGNKEY
1562 do_test without_rowid3-17.1.14 {
1473 sqlite3_finalize $STMT 1563 sqlite3_finalize $STMT
1474 } {SQLITE_CONSTRAINT} 1564 } {SQLITE_CONSTRAINT}
1565 verify_ex_errcode without_rowid3-17.1.14b SQLITE_CONSTRAINT_FOREIGNKEY
1475 1566
1476 drop_all_tables 1567 drop_all_tables
1477 do_test fkey2-17.2.1 { 1568 do_test without_rowid3-17.2.1 {
1478 execsql { 1569 execsql {
1479 CREATE TABLE high("a'b!" PRIMARY KEY, b); 1570 CREATE TABLE high("a'b!" PRIMARY KEY, b) WITHOUT rowid;
1480 CREATE TABLE low( 1571 CREATE TABLE low(
1481 c, 1572 c,
1482 "d&6" REFERENCES high ON UPDATE CASCADE ON DELETE CASCADE 1573 "d&6" REFERENCES high ON UPDATE CASCADE ON DELETE CASCADE
1483 ); 1574 );
1484 } 1575 }
1485 } {} 1576 } {}
1486 do_test fkey2-17.2.2 { 1577 do_test without_rowid3-17.2.2 {
1487 execsql { 1578 execsql {
1488 INSERT INTO high VALUES('a', 'b'); 1579 INSERT INTO high VALUES('a', 'b');
1489 INSERT INTO low VALUES('b', 'a'); 1580 INSERT INTO low VALUES('b', 'a');
1490 } 1581 }
1491 db changes 1582 db changes
1492 } {1} 1583 } {1}
1493 set nTotal [db total_changes] 1584 set nTotal [db total_changes]
1494 do_test fkey2-17.2.3 { 1585 do_test without_rowid3-17.2.3 {
1495 execsql { UPDATE high SET "a'b!" = 'c' } 1586 execsql { UPDATE high SET "a'b!" = 'c' }
1496 } {1} 1587 } {1}
1497 do_test fkey2-17.2.4 { 1588 do_test without_rowid3-17.2.4 {
1498 db changes 1589 db changes
1499 } {1} 1590 } {1}
1500 do_test fkey2-17.2.5 { 1591 do_test without_rowid3-17.2.5 {
1501 expr [db total_changes] - $nTotal 1592 expr [db total_changes] - $nTotal
1502 } {2} 1593 } {2}
1503 do_test fkey2-17.2.6 { 1594 do_test without_rowid3-17.2.6 {
1504 execsql { SELECT * FROM high ; SELECT * FROM low } 1595 execsql { SELECT * FROM high ; SELECT * FROM low }
1505 } {c b b c} 1596 } {c b b c}
1506 do_test fkey2-17.2.7 { 1597 do_test without_rowid3-17.2.7 {
1507 execsql { DELETE FROM high } 1598 execsql { DELETE FROM high }
1508 } {1} 1599 } {1}
1509 do_test fkey2-17.2.8 { 1600 do_test without_rowid3-17.2.8 {
1510 db changes 1601 db changes
1511 } {1} 1602 } {1}
1512 do_test fkey2-17.2.9 { 1603 do_test without_rowid3-17.2.9 {
1513 expr [db total_changes] - $nTotal 1604 expr [db total_changes] - $nTotal
1514 } {4} 1605 } {4}
1515 do_test fkey2-17.2.10 { 1606 do_test without_rowid3-17.2.10 {
1516 execsql { SELECT * FROM high ; SELECT * FROM low } 1607 execsql { SELECT * FROM high ; SELECT * FROM low }
1517 } {} 1608 } {}
1518 execsql { PRAGMA count_changes = 0 } 1609 execsql { PRAGMA count_changes = 0 }
1519 1610
1520 #------------------------------------------------------------------------- 1611 #-------------------------------------------------------------------------
1521 # Test that the authorization callback works. 1612 # Test that the authorization callback works.
1522 # 1613 #
1523 1614
1524 ifcapable auth { 1615 ifcapable auth {
1525 do_test fkey2-18.1 { 1616 do_test without_rowid3-18.1 {
1526 execsql { 1617 execsql {
1527 CREATE TABLE long(a, b PRIMARY KEY, c); 1618 CREATE TABLE long(a, b PRIMARY KEY, c) WITHOUT rowid;
1528 CREATE TABLE short(d, e, f REFERENCES long); 1619 CREATE TABLE short(d, e, f REFERENCES long);
1529 CREATE TABLE mid(g, h, i REFERENCES long DEFERRABLE INITIALLY DEFERRED); 1620 CREATE TABLE mid(g, h, i REFERENCES long DEFERRABLE INITIALLY DEFERRED);
1530 } 1621 }
1531 } {} 1622 } {}
1532 1623
1533 proc auth {args} {eval lappend ::authargs $args ; return SQLITE_OK} 1624 proc auth {args} {eval lappend ::authargs [lrange $args 0 4]; return SQLITE_OK }
1534 db auth auth 1625 db auth auth
1535 1626
1536 # An insert on the parent table must read the child key of any deferred 1627 # An insert on the parent table must read the child key of any deferred
1537 # foreign key constraints. But not the child key of immediate constraints. 1628 # foreign key constraints. But not the child key of immediate constraints.
1538 set authargs {} 1629 set authargs {}
1539 do_test fkey2-18.2 { 1630 do_test without_rowid3-18.2 {
1540 execsql { INSERT INTO long VALUES(1, 2, 3) } 1631 execsql { INSERT INTO long VALUES(1, 2, 3) }
1541 set authargs 1632 set authargs
1542 } {SQLITE_INSERT long {} main {} SQLITE_READ mid i main {}} 1633 } {SQLITE_INSERT long {} main {} SQLITE_READ mid i main {}}
1543 1634
1544 # An insert on the child table of an immediate constraint must read the 1635 # An insert on the child table of an immediate constraint must read the
1545 # parent key columns (to see if it is a violation or not). 1636 # parent key columns (to see if it is a violation or not).
1546 set authargs {} 1637 set authargs {}
1547 do_test fkey2-18.3 { 1638 do_test without_rowid3-18.3 {
1548 execsql { INSERT INTO short VALUES(1, 3, 2) } 1639 execsql { INSERT INTO short VALUES(1, 3, 2) }
1549 set authargs 1640 set authargs
1550 } {SQLITE_INSERT short {} main {} SQLITE_READ long b main {}} 1641 } {SQLITE_INSERT short {} main {} SQLITE_READ long b main {}}
1551 1642
1552 # As must an insert on the child table of a deferred constraint. 1643 # As must an insert on the child table of a deferred constraint.
1553 set authargs {} 1644 set authargs {}
1554 do_test fkey2-18.4 { 1645 do_test without_rowid3-18.4 {
1555 execsql { INSERT INTO mid VALUES(1, 3, 2) } 1646 execsql { INSERT INTO mid VALUES(1, 3, 2) }
1556 set authargs 1647 set authargs
1557 } {SQLITE_INSERT mid {} main {} SQLITE_READ long b main {}} 1648 } {SQLITE_INSERT mid {} main {} SQLITE_READ long b main {}}
1558 1649
1559 do_test fkey2-18.5 { 1650 do_test without_rowid3-18.5 {
1560 execsql { 1651 execsql {
1561 CREATE TABLE nought(a, b PRIMARY KEY, c); 1652 CREATE TABLE nought(a, b PRIMARY KEY, c) WITHOUT rowid;
1562 CREATE TABLE cross(d, e, f, 1653 CREATE TABLE cross(d, e, f,
1563 FOREIGN KEY(e) REFERENCES nought(b) ON UPDATE CASCADE 1654 FOREIGN KEY(e) REFERENCES nought(b) ON UPDATE CASCADE
1564 ); 1655 );
1565 } 1656 }
1566 execsql { INSERT INTO nought VALUES(2, 1, 2) } 1657 execsql { INSERT INTO nought VALUES(2, 1, 2) }
1567 execsql { INSERT INTO cross VALUES(0, 1, 0) } 1658 execsql { INSERT INTO cross VALUES(0, 1, 0) }
1568 set authargs [list] 1659 set authargs [list]
1569 execsql { UPDATE nought SET b = 5 } 1660 execsql { UPDATE nought SET b = 5 }
1570 set authargs 1661 set authargs
1571 } {SQLITE_UPDATE nought b main {} SQLITE_READ cross e main {} SQLITE_READ cros s e main {} SQLITE_READ nought b main {} SQLITE_READ nought b main {} SQLITE_REA D nought b main {} SQLITE_UPDATE cross e main {} SQLITE_READ nought b main {} SQ LITE_READ cross e main {} SQLITE_READ nought b main {} SQLITE_READ nought b main {}} 1662 } {SQLITE_UPDATE nought b main {} SQLITE_READ cross e main {} SQLITE_READ cros s e main {} SQLITE_READ nought b main {} SQLITE_READ nought b main {} SQLITE_REA D nought b main {} SQLITE_UPDATE cross e main {} SQLITE_READ nought b main {} SQ LITE_READ cross e main {} SQLITE_READ nought b main {} SQLITE_READ nought b main {}}
1572 1663
1573 do_test fkey2-18.6 { 1664 do_test without_rowid3-18.6 {
1574 execsql {SELECT * FROM cross} 1665 execsql {SELECT * FROM cross}
1575 } {0 5 0} 1666 } {0 5 0}
1576 1667
1577 do_test fkey2-18.7 { 1668 do_test without_rowid3-18.7 {
1578 execsql { 1669 execsql {
1579 CREATE TABLE one(a INTEGER PRIMARY KEY, b); 1670 CREATE TABLE one(a INT PRIMARY KEY, b) WITHOUT rowid;
1580 CREATE TABLE two(b, c REFERENCES one); 1671 CREATE TABLE two(b, c REFERENCES one);
1581 INSERT INTO one VALUES(101, 102); 1672 INSERT INTO one VALUES(101, 102);
1582 } 1673 }
1583 set authargs [list] 1674 set authargs [list]
1584 execsql { INSERT INTO two VALUES(100, 101); } 1675 execsql { INSERT INTO two VALUES(100, 101); }
1585 set authargs 1676 set authargs
1586 } {SQLITE_INSERT two {} main {} SQLITE_READ one a main {}} 1677 } {SQLITE_INSERT two {} main {} SQLITE_READ one a main {}}
1587 1678
1588 # Return SQLITE_IGNORE to requests to read from the parent table. This 1679 # Return SQLITE_IGNORE to requests to read from the parent table. This
1589 # causes inserts of non-NULL keys into the child table to fail. 1680 # causes inserts of non-NULL keys into the child table to fail.
1590 # 1681 #
1591 rename auth {} 1682 rename auth {}
1592 proc auth {args} { 1683 proc auth {args} {
1593 if {[lindex $args 1] == "long"} {return SQLITE_IGNORE} 1684 if {[lindex $args 1] == "long"} {return SQLITE_IGNORE}
1594 return SQLITE_OK 1685 return SQLITE_OK
1595 } 1686 }
1596 do_test fkey2-18.8 { 1687 do_test without_rowid3-18.8 {
1597 catchsql { INSERT INTO short VALUES(1, 3, 2) } 1688 catchsql { INSERT INTO short VALUES(1, 3, 2) }
1598 } {1 {foreign key constraint failed}} 1689 } {1 {FOREIGN KEY constraint failed}}
1599 do_test fkey2-18.9 { 1690 do_test without_rowid3-18.9 {
1600 execsql { INSERT INTO short VALUES(1, 3, NULL) } 1691 execsql { INSERT INTO short VALUES(1, 3, NULL) }
1601 } {} 1692 } {}
1602 do_test fkey2-18.10 { 1693 do_test without_rowid3-18.10 {
1603 execsql { SELECT * FROM short } 1694 execsql { SELECT * FROM short }
1604 } {1 3 2 1 3 {}} 1695 } {1 3 2 1 3 {}}
1605 do_test fkey2-18.11 { 1696 do_test without_rowid3-18.11 {
1606 catchsql { UPDATE short SET f = 2 WHERE f IS NULL } 1697 catchsql { UPDATE short SET f = 2 WHERE f IS NULL }
1607 } {1 {foreign key constraint failed}} 1698 } {1 {FOREIGN KEY constraint failed}}
1608 1699
1609 db auth {} 1700 db auth {}
1610 unset authargs 1701 unset authargs
1611 } 1702 }
1612 1703
1613 1704
1614 do_test fkey2-19.1 { 1705 do_test without_rowid3-19.1 {
1615 execsql { 1706 execsql {
1616 CREATE TABLE main(id INTEGER PRIMARY KEY); 1707 CREATE TABLE main(id INT PRIMARY KEY) WITHOUT rowid;
1617 CREATE TABLE sub(id INT REFERENCES main(id)); 1708 CREATE TABLE sub(id INT REFERENCES main(id));
1618 INSERT INTO main VALUES(1); 1709 INSERT INTO main VALUES(1);
1619 INSERT INTO main VALUES(2); 1710 INSERT INTO main VALUES(2);
1620 INSERT INTO sub VALUES(2); 1711 INSERT INTO sub VALUES(2);
1621 } 1712 }
1622 } {} 1713 } {}
1623 do_test fkey2-19.2 { 1714 do_test without_rowid3-19.2 {
1624 set S [sqlite3_prepare_v2 db "DELETE FROM main WHERE id = ?" -1 dummy] 1715 set S [sqlite3_prepare_v2 db "DELETE FROM main WHERE id = ?" -1 dummy]
1625 sqlite3_bind_int $S 1 2 1716 sqlite3_bind_int $S 1 2
1626 sqlite3_step $S 1717 sqlite3_step $S
1627 } {SQLITE_CONSTRAINT} 1718 } {SQLITE_CONSTRAINT}
1628 do_test fkey2-19.3 { 1719 verify_ex_errcode without_rowid3-19.2b SQLITE_CONSTRAINT_FOREIGNKEY
1720 do_test without_rowid3-19.3 {
1629 sqlite3_reset $S 1721 sqlite3_reset $S
1630 } {SQLITE_CONSTRAINT} 1722 } {SQLITE_CONSTRAINT}
1631 do_test fkey2-19.4 { 1723 verify_ex_errcode without_rowid3-19.3b SQLITE_CONSTRAINT_FOREIGNKEY
1724 do_test without_rowid3-19.4 {
1632 sqlite3_bind_int $S 1 1 1725 sqlite3_bind_int $S 1 1
1633 sqlite3_step $S 1726 sqlite3_step $S
1634 } {SQLITE_DONE} 1727 } {SQLITE_DONE}
1635 do_test fkey2-19.4 { 1728 do_test without_rowid3-19.4 {
1636 sqlite3_finalize $S 1729 sqlite3_finalize $S
1637 } {SQLITE_OK} 1730 } {SQLITE_OK}
1638 1731
1639 drop_all_tables 1732 drop_all_tables
1640 do_test fkey2-20.1 { 1733 do_test without_rowid3-20.1 {
1641 execsql { 1734 execsql {
1642 CREATE TABLE pp(a PRIMARY KEY, b); 1735 CREATE TABLE pp(a PRIMARY KEY, b) WITHOUT rowid;
1643 CREATE TABLE cc(c PRIMARY KEY, d REFERENCES pp); 1736 CREATE TABLE cc(c PRIMARY KEY, d REFERENCES pp) WITHOUT rowid;
1644 } 1737 }
1645 } {} 1738 } {}
1646 1739
1647 foreach {tn insert} { 1740 foreach {tn insert} {
1648 1 "INSERT" 1741 1 "INSERT"
1649 2 "INSERT OR IGNORE" 1742 2 "INSERT OR IGNORE"
1650 3 "INSERT OR ABORT" 1743 3 "INSERT OR ABORT"
1651 4 "INSERT OR ROLLBACK" 1744 4 "INSERT OR ROLLBACK"
1652 5 "INSERT OR REPLACE" 1745 5 "INSERT OR REPLACE"
1653 6 "INSERT OR FAIL" 1746 6 "INSERT OR FAIL"
1654 } { 1747 } {
1655 do_test fkey2-20.2.$tn.1 { 1748 do_test without_rowid3-20.2.$tn.1 {
1656 catchsql "$insert INTO cc VALUES(1, 2)" 1749 catchsql "$insert INTO cc VALUES(1, 2)"
1657 } {1 {foreign key constraint failed}} 1750 } {1 {FOREIGN KEY constraint failed}}
1658 do_test fkey2-20.2.$tn.2 { 1751 do_test without_rowid3-20.2.$tn.2 {
1659 execsql { SELECT * FROM cc } 1752 execsql { SELECT * FROM cc }
1660 } {} 1753 } {}
1661 do_test fkey2-20.2.$tn.3 { 1754 do_test without_rowid3-20.2.$tn.3 {
1662 execsql { 1755 execsql {
1663 BEGIN; 1756 BEGIN;
1664 INSERT INTO pp VALUES(2, 'two'); 1757 INSERT INTO pp VALUES(2, 'two');
1665 INSERT INTO cc VALUES(1, 2); 1758 INSERT INTO cc VALUES(1, 2);
1666 } 1759 }
1667 catchsql "$insert INTO cc VALUES(3, 4)" 1760 catchsql "$insert INTO cc VALUES(3, 4)"
1668 } {1 {foreign key constraint failed}} 1761 } {1 {FOREIGN KEY constraint failed}}
1669 do_test fkey2-20.2.$tn.4 { 1762 do_test without_rowid3-20.2.$tn.4 {
1670 execsql { COMMIT ; SELECT * FROM cc } 1763 execsql { COMMIT ; SELECT * FROM cc }
1671 } {1 2} 1764 } {1 2}
1672 do_test fkey2-20.2.$tn.5 { 1765 do_test without_rowid3-20.2.$tn.5 {
1673 execsql { DELETE FROM cc ; DELETE FROM pp } 1766 execsql { DELETE FROM cc ; DELETE FROM pp }
1674 } {} 1767 } {}
1675 } 1768 }
1676 1769
1677 foreach {tn update} { 1770 foreach {tn update} {
1678 1 "UPDATE" 1771 1 "UPDATE"
1679 2 "UPDATE OR IGNORE" 1772 2 "UPDATE OR IGNORE"
1680 3 "UPDATE OR ABORT" 1773 3 "UPDATE OR ABORT"
1681 4 "UPDATE OR ROLLBACK" 1774 4 "UPDATE OR ROLLBACK"
1682 5 "UPDATE OR REPLACE" 1775 5 "UPDATE OR REPLACE"
1683 6 "UPDATE OR FAIL" 1776 6 "UPDATE OR FAIL"
1684 } { 1777 } {
1685 do_test fkey2-20.3.$tn.1 { 1778 do_test without_rowid3-20.3.$tn.1 {
1686 execsql { 1779 execsql {
1687 INSERT INTO pp VALUES(2, 'two'); 1780 INSERT INTO pp VALUES(2, 'two');
1688 INSERT INTO cc VALUES(1, 2); 1781 INSERT INTO cc VALUES(1, 2);
1689 } 1782 }
1690 } {} 1783 } {}
1691 do_test fkey2-20.3.$tn.2 { 1784 do_test without_rowid3-20.3.$tn.2 {
1692 catchsql "$update pp SET a = 1" 1785 catchsql "$update pp SET a = 1"
1693 } {1 {foreign key constraint failed}} 1786 } {1 {FOREIGN KEY constraint failed}}
1694 do_test fkey2-20.3.$tn.3 { 1787 do_test without_rowid3-20.3.$tn.3 {
1695 execsql { SELECT * FROM pp } 1788 execsql { SELECT * FROM pp }
1696 } {2 two} 1789 } {2 two}
1697 do_test fkey2-20.3.$tn.4 { 1790 do_test without_rowid3-20.3.$tn.4 {
1698 catchsql "$update cc SET d = 1" 1791 catchsql "$update cc SET d = 1"
1699 } {1 {foreign key constraint failed}} 1792 } {1 {FOREIGN KEY constraint failed}}
1700 do_test fkey2-20.3.$tn.5 { 1793 do_test without_rowid3-20.3.$tn.5 {
1701 execsql { SELECT * FROM cc } 1794 execsql { SELECT * FROM cc }
1702 } {1 2} 1795 } {1 2}
1703 do_test fkey2-20.3.$tn.6 { 1796 do_test without_rowid3-20.3.$tn.6 {
1704 execsql { 1797 execsql {
1705 BEGIN; 1798 BEGIN;
1706 INSERT INTO pp VALUES(3, 'three'); 1799 INSERT INTO pp VALUES(3, 'three');
1707 } 1800 }
1708 catchsql "$update pp SET a = 1 WHERE a = 2" 1801 catchsql "$update pp SET a = 1 WHERE a = 2"
1709 } {1 {foreign key constraint failed}} 1802 } {1 {FOREIGN KEY constraint failed}}
1710 do_test fkey2-20.3.$tn.7 { 1803 do_test without_rowid3-20.3.$tn.7 {
1711 execsql { COMMIT ; SELECT * FROM pp } 1804 execsql { COMMIT ; SELECT * FROM pp }
1712 } {2 two 3 three} 1805 } {2 two 3 three}
1713 do_test fkey2-20.3.$tn.8 { 1806 do_test without_rowid3-20.3.$tn.8 {
1714 execsql { 1807 execsql {
1715 BEGIN; 1808 BEGIN;
1716 INSERT INTO cc VALUES(2, 2); 1809 INSERT INTO cc VALUES(2, 2);
1717 } 1810 }
1718 catchsql "$update cc SET d = 1 WHERE c = 1" 1811 catchsql "$update cc SET d = 1 WHERE c = 1"
1719 } {1 {foreign key constraint failed}} 1812 } {1 {FOREIGN KEY constraint failed}}
1720 do_test fkey2-20.3.$tn.9 { 1813 do_test without_rowid3-20.3.$tn.9 {
1721 execsql { COMMIT ; SELECT * FROM cc } 1814 execsql { COMMIT ; SELECT * FROM cc }
1722 } {1 2 2 2} 1815 } {1 2 2 2}
1723 do_test fkey2-20.3.$tn.10 { 1816 do_test without_rowid3-20.3.$tn.10 {
1724 execsql { DELETE FROM cc ; DELETE FROM pp } 1817 execsql { DELETE FROM cc ; DELETE FROM pp }
1725 } {} 1818 } {}
1726 } 1819 }
1727 1820
1728 #------------------------------------------------------------------------- 1821 #-------------------------------------------------------------------------
1729 # The following block of tests, those prefixed with "fkey2-genfkey.", are 1822 # The following block of tests, those prefixed with "without_rowid3-genfkey.",
1730 # the same tests that were used to test the ".genfkey" command provided 1823 # are the same tests that were used to test the ".genfkey" command provided
1731 # by the shell tool. So these tests show that the built-in foreign key 1824 # by the shell tool. So these tests show that the built-in foreign key
1732 # implementation is more or less compatible with the triggers generated 1825 # implementation is more or less compatible with the triggers generated
1733 # by genfkey. 1826 # by genfkey.
1734 # 1827 #
1735 drop_all_tables 1828 drop_all_tables
1736 do_test fkey2-genfkey.1.1 { 1829 do_test without_rowid3-genfkey.1.1 {
1737 execsql { 1830 execsql {
1738 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c)); 1831 CREATE TABLE t1(a INT PRIMARY KEY, b, c, UNIQUE(b, c)) WITHOUT rowid;
1739 CREATE TABLE t2(e REFERENCES t1, f); 1832 CREATE TABLE t2(e REFERENCES t1, f);
1740 CREATE TABLE t3(g, h, i, FOREIGN KEY (h, i) REFERENCES t1(b, c)); 1833 CREATE TABLE t3(g, h, i, FOREIGN KEY (h, i) REFERENCES t1(b, c));
1741 } 1834 }
1742 } {} 1835 } {}
1743 do_test fkey2-genfkey.1.2 { 1836 do_test without_rowid3-genfkey.1.2 {
1744 catchsql { INSERT INTO t2 VALUES(1, 2) } 1837 catchsql { INSERT INTO t2 VALUES(1, 2) }
1745 } {1 {foreign key constraint failed}} 1838 } {1 {FOREIGN KEY constraint failed}}
1746 do_test fkey2-genfkey.1.3 { 1839 do_test without_rowid3-genfkey.1.3 {
1747 execsql { 1840 execsql {
1748 INSERT INTO t1 VALUES(1, 2, 3); 1841 INSERT INTO t1 VALUES(1, 2, 3);
1749 INSERT INTO t2 VALUES(1, 2); 1842 INSERT INTO t2 VALUES(1, 2);
1750 } 1843 }
1751 } {} 1844 } {}
1752 do_test fkey2-genfkey.1.4 { 1845 do_test without_rowid3-genfkey.1.4 {
1753 execsql { INSERT INTO t2 VALUES(NULL, 3) } 1846 execsql { INSERT INTO t2 VALUES(NULL, 3) }
1754 } {} 1847 } {}
1755 do_test fkey2-genfkey.1.5 { 1848 do_test without_rowid3-genfkey.1.5 {
1756 catchsql { UPDATE t2 SET e = 5 WHERE e IS NULL } 1849 catchsql { UPDATE t2 SET e = 5 WHERE e IS NULL }
1757 } {1 {foreign key constraint failed}} 1850 } {1 {FOREIGN KEY constraint failed}}
1758 do_test fkey2-genfkey.1.6 { 1851 do_test without_rowid3-genfkey.1.6 {
1759 execsql { UPDATE t2 SET e = 1 WHERE e IS NULL } 1852 execsql { UPDATE t2 SET e = 1 WHERE e IS NULL }
1760 } {} 1853 } {}
1761 do_test fkey2-genfkey.1.7 { 1854 do_test without_rowid3-genfkey.1.7 {
1762 execsql { UPDATE t2 SET e = NULL WHERE f = 3 } 1855 execsql { UPDATE t2 SET e = NULL WHERE f = 3 }
1763 } {} 1856 } {}
1764 do_test fkey2-genfkey.1.8 { 1857 do_test without_rowid3-genfkey.1.8 {
1765 catchsql { UPDATE t1 SET a = 10 } 1858 catchsql { UPDATE t1 SET a = 10 }
1766 } {1 {foreign key constraint failed}} 1859 } {1 {FOREIGN KEY constraint failed}}
1767 do_test fkey2-genfkey.1.9 { 1860 do_test without_rowid3-genfkey.1.9 {
1768 catchsql { UPDATE t1 SET a = NULL } 1861 catchsql { UPDATE t1 SET a = NULL }
1769 } {1 {datatype mismatch}} 1862 } {1 {NOT NULL constraint failed: t1.a}}
1770 do_test fkey2-genfkey.1.10 { 1863 do_test without_rowid3-genfkey.1.10 {
1771 catchsql { DELETE FROM t1 } 1864 catchsql { DELETE FROM t1 }
1772 } {1 {foreign key constraint failed}} 1865 } {1 {FOREIGN KEY constraint failed}}
1773 do_test fkey2-genfkey.1.11 { 1866 do_test without_rowid3-genfkey.1.11 {
1774 execsql { UPDATE t2 SET e = NULL } 1867 execsql { UPDATE t2 SET e = NULL }
1775 } {} 1868 } {}
1776 do_test fkey2-genfkey.1.12 { 1869 do_test without_rowid3-genfkey.1.12 {
1777 execsql { 1870 execsql {
1778 UPDATE t1 SET a = 10; 1871 UPDATE t1 SET a = 10;
1779 DELETE FROM t1; 1872 DELETE FROM t1;
1780 DELETE FROM t2; 1873 DELETE FROM t2;
1781 } 1874 }
1782 } {} 1875 } {}
1783 do_test fkey2-genfkey.1.13 { 1876 do_test without_rowid3-genfkey.1.13 {
1784 execsql { 1877 execsql {
1785 INSERT INTO t3 VALUES(1, NULL, NULL); 1878 INSERT INTO t3 VALUES(1, NULL, NULL);
1786 INSERT INTO t3 VALUES(1, 2, NULL); 1879 INSERT INTO t3 VALUES(1, 2, NULL);
1787 INSERT INTO t3 VALUES(1, NULL, 3); 1880 INSERT INTO t3 VALUES(1, NULL, 3);
1788 } 1881 }
1789 } {} 1882 } {}
1790 do_test fkey2-genfkey.1.14 { 1883 do_test without_rowid3-genfkey.1.14 {
1791 catchsql { INSERT INTO t3 VALUES(3, 1, 4) } 1884 catchsql { INSERT INTO t3 VALUES(3, 1, 4) }
1792 } {1 {foreign key constraint failed}} 1885 } {1 {FOREIGN KEY constraint failed}}
1793 do_test fkey2-genfkey.1.15 { 1886 do_test without_rowid3-genfkey.1.15 {
1794 execsql { 1887 execsql {
1795 INSERT INTO t1 VALUES(1, 1, 4); 1888 INSERT INTO t1 VALUES(1, 1, 4);
1796 INSERT INTO t3 VALUES(3, 1, 4); 1889 INSERT INTO t3 VALUES(3, 1, 4);
1797 } 1890 }
1798 } {} 1891 } {}
1799 do_test fkey2-genfkey.1.16 { 1892 do_test without_rowid3-genfkey.1.16 {
1800 catchsql { DELETE FROM t1 } 1893 catchsql { DELETE FROM t1 }
1801 } {1 {foreign key constraint failed}} 1894 } {1 {FOREIGN KEY constraint failed}}
1802 do_test fkey2-genfkey.1.17 { 1895 do_test without_rowid3-genfkey.1.17 {
1803 catchsql { UPDATE t1 SET b = 10} 1896 catchsql { UPDATE t1 SET b = 10}
1804 } {1 {foreign key constraint failed}} 1897 } {1 {FOREIGN KEY constraint failed}}
1805 do_test fkey2-genfkey.1.18 { 1898 do_test without_rowid3-genfkey.1.18 {
1806 execsql { UPDATE t1 SET a = 10} 1899 execsql { UPDATE t1 SET a = 10}
1807 } {} 1900 } {}
1808 do_test fkey2-genfkey.1.19 { 1901 do_test without_rowid3-genfkey.1.19 {
1809 catchsql { UPDATE t3 SET h = 'hello' WHERE i = 3} 1902 catchsql { UPDATE t3 SET h = 'hello' WHERE i = 3}
1810 } {1 {foreign key constraint failed}} 1903 } {1 {FOREIGN KEY constraint failed}}
1811 1904
1812 drop_all_tables 1905 drop_all_tables
1813 do_test fkey2-genfkey.2.1 { 1906 do_test without_rowid3-genfkey.2.1 {
1814 execsql { 1907 execsql {
1815 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c)); 1908 CREATE TABLE t1(a INT PRIMARY KEY, b, c, UNIQUE(b, c)) WITHOUT rowid;
1816 CREATE TABLE t2(e REFERENCES t1 ON UPDATE CASCADE ON DELETE CASCADE, f); 1909 CREATE TABLE t2(e REFERENCES t1 ON UPDATE CASCADE ON DELETE CASCADE, f);
1817 CREATE TABLE t3(g, h, i, 1910 CREATE TABLE t3(g, h, i,
1818 FOREIGN KEY (h, i) 1911 FOREIGN KEY (h, i)
1819 REFERENCES t1(b, c) ON UPDATE CASCADE ON DELETE CASCADE 1912 REFERENCES t1(b, c) ON UPDATE CASCADE ON DELETE CASCADE
1820 ); 1913 );
1821 } 1914 }
1822 } {} 1915 } {}
1823 do_test fkey2-genfkey.2.2 { 1916 do_test without_rowid3-genfkey.2.2 {
1824 execsql { 1917 execsql {
1825 INSERT INTO t1 VALUES(1, 2, 3); 1918 INSERT INTO t1 VALUES(1, 2, 3);
1826 INSERT INTO t1 VALUES(4, 5, 6); 1919 INSERT INTO t1 VALUES(4, 5, 6);
1827 INSERT INTO t2 VALUES(1, 'one'); 1920 INSERT INTO t2 VALUES(1, 'one');
1828 INSERT INTO t2 VALUES(4, 'four'); 1921 INSERT INTO t2 VALUES(4, 'four');
1829 } 1922 }
1830 } {} 1923 } {}
1831 do_test fkey2-genfkey.2.3 { 1924 do_test without_rowid3-genfkey.2.3 {
1832 execsql { 1925 execsql {
1833 UPDATE t1 SET a = 2 WHERE a = 1; 1926 UPDATE t1 SET a = 2 WHERE a = 1;
1834 SELECT * FROM t2; 1927 SELECT * FROM t2;
1835 } 1928 }
1836 } {2 one 4 four} 1929 } {2 one 4 four}
1837 do_test fkey2-genfkey.2.4 { 1930 do_test without_rowid3-genfkey.2.4 {
1838 execsql { 1931 execsql {
1839 DELETE FROM t1 WHERE a = 4; 1932 DELETE FROM t1 WHERE a = 4;
1840 SELECT * FROM t2; 1933 SELECT * FROM t2;
1841 } 1934 }
1842 } {2 one} 1935 } {2 one}
1843 1936
1844 do_test fkey2-genfkey.2.5 { 1937 do_test without_rowid3-genfkey.2.5 {
1845 execsql { 1938 execsql {
1846 INSERT INTO t3 VALUES('hello', 2, 3); 1939 INSERT INTO t3 VALUES('hello', 2, 3);
1847 UPDATE t1 SET c = 2; 1940 UPDATE t1 SET c = 2;
1848 SELECT * FROM t3; 1941 SELECT * FROM t3;
1849 } 1942 }
1850 } {hello 2 2} 1943 } {hello 2 2}
1851 do_test fkey2-genfkey.2.6 { 1944 do_test without_rowid3-genfkey.2.6 {
1852 execsql { 1945 execsql {
1853 DELETE FROM t1; 1946 DELETE FROM t1;
1854 SELECT * FROM t3; 1947 SELECT * FROM t3;
1855 } 1948 }
1856 } {} 1949 } {}
1857 1950
1858 drop_all_tables 1951 drop_all_tables
1859 do_test fkey2-genfkey.3.1 { 1952 do_test without_rowid3-genfkey.3.1 {
1860 execsql { 1953 execsql {
1861 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(c, b)); 1954 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(c, b)) WITHOUT rowid;
1862 CREATE TABLE t2(e REFERENCES t1 ON UPDATE SET NULL ON DELETE SET NULL, f); 1955 CREATE TABLE t2(e REFERENCES t1 ON UPDATE SET NULL ON DELETE SET NULL, f);
1863 CREATE TABLE t3(g, h, i, 1956 CREATE TABLE t3(g, h, i,
1864 FOREIGN KEY (h, i) 1957 FOREIGN KEY (h, i)
1865 REFERENCES t1(b, c) ON UPDATE SET NULL ON DELETE SET NULL 1958 REFERENCES t1(b, c) ON UPDATE SET NULL ON DELETE SET NULL
1866 ); 1959 );
1867 } 1960 }
1868 } {} 1961 } {}
1869 do_test fkey2-genfkey.3.2 { 1962 do_test without_rowid3-genfkey.3.2 {
1870 execsql { 1963 execsql {
1871 INSERT INTO t1 VALUES(1, 2, 3); 1964 INSERT INTO t1 VALUES(1, 2, 3);
1872 INSERT INTO t1 VALUES(4, 5, 6); 1965 INSERT INTO t1 VALUES(4, 5, 6);
1873 INSERT INTO t2 VALUES(1, 'one'); 1966 INSERT INTO t2 VALUES(1, 'one');
1874 INSERT INTO t2 VALUES(4, 'four'); 1967 INSERT INTO t2 VALUES(4, 'four');
1875 } 1968 }
1876 } {} 1969 } {}
1877 do_test fkey2-genfkey.3.3 { 1970 do_test without_rowid3-genfkey.3.3 {
1878 execsql { 1971 execsql {
1879 UPDATE t1 SET a = 2 WHERE a = 1; 1972 UPDATE t1 SET a = 2 WHERE a = 1;
1880 SELECT * FROM t2; 1973 SELECT * FROM t2;
1881 } 1974 }
1882 } {{} one 4 four} 1975 } {{} one 4 four}
1883 do_test fkey2-genfkey.3.4 { 1976 do_test without_rowid3-genfkey.3.4 {
1884 execsql { 1977 execsql {
1885 DELETE FROM t1 WHERE a = 4; 1978 DELETE FROM t1 WHERE a = 4;
1886 SELECT * FROM t2; 1979 SELECT * FROM t2;
1887 } 1980 }
1888 } {{} one {} four} 1981 } {{} one {} four}
1889 do_test fkey2-genfkey.3.5 { 1982 do_test without_rowid3-genfkey.3.5 {
1890 execsql { 1983 execsql {
1891 INSERT INTO t3 VALUES('hello', 2, 3); 1984 INSERT INTO t3 VALUES('hello', 2, 3);
1892 UPDATE t1 SET c = 2; 1985 UPDATE t1 SET c = 2;
1893 SELECT * FROM t3; 1986 SELECT * FROM t3;
1894 } 1987 }
1895 } {hello {} {}} 1988 } {hello {} {}}
1896 do_test fkey2-genfkey.3.6 { 1989 do_test without_rowid3-genfkey.3.6 {
1897 execsql { 1990 execsql {
1898 UPDATE t3 SET h = 2, i = 2; 1991 UPDATE t3 SET h = 2, i = 2;
1899 DELETE FROM t1; 1992 DELETE FROM t1;
1900 SELECT * FROM t3; 1993 SELECT * FROM t3;
1901 } 1994 }
1902 } {hello {} {}} 1995 } {hello {} {}}
1903 1996
1904 #------------------------------------------------------------------------- 1997 #-------------------------------------------------------------------------
1905 # Verify that ticket dd08e5a988d00decc4a543daa8dbbfab9c577ad8 has been 1998 # Verify that ticket dd08e5a988d00decc4a543daa8dbbfab9c577ad8 has been
1906 # fixed. 1999 # fixed.
1907 # 2000 #
1908 do_test fkey2-dd08e5.1.1 { 2001 do_test without_rowid3-dd08e5.1.1 {
1909 execsql { 2002 execsql {
1910 PRAGMA foreign_keys=ON; 2003 PRAGMA foreign_keys=ON;
1911 CREATE TABLE tdd08(a INTEGER PRIMARY KEY, b); 2004 CREATE TABLE tdd08(a INTEGER PRIMARY KEY, b) WITHOUT rowid;
1912 CREATE UNIQUE INDEX idd08 ON tdd08(a,b); 2005 CREATE UNIQUE INDEX idd08 ON tdd08(a,b);
1913 INSERT INTO tdd08 VALUES(200,300); 2006 INSERT INTO tdd08 VALUES(200,300);
1914 2007
1915 CREATE TABLE tdd08_b(w,x,y, FOREIGN KEY(x,y) REFERENCES tdd08(a,b)); 2008 CREATE TABLE tdd08_b(w,x,y, FOREIGN KEY(x,y) REFERENCES tdd08(a,b));
1916 INSERT INTO tdd08_b VALUES(100,200,300); 2009 INSERT INTO tdd08_b VALUES(100,200,300);
1917 } 2010 }
1918 } {} 2011 } {}
1919 do_test fkey2-dd08e5.1.2 { 2012 do_test without_rowid3-dd08e5.1.2 {
1920 catchsql { 2013 catchsql {
1921 DELETE FROM tdd08; 2014 DELETE FROM tdd08;
1922 } 2015 }
1923 } {1 {foreign key constraint failed}} 2016 } {1 {FOREIGN KEY constraint failed}}
1924 do_test fkey2-dd08e5.1.3 { 2017 do_test without_rowid3-dd08e5.1.3 {
1925 execsql { 2018 execsql {
1926 SELECT * FROM tdd08; 2019 SELECT * FROM tdd08;
1927 } 2020 }
1928 } {200 300} 2021 } {200 300}
1929 do_test fkey2-dd08e5.1.4 { 2022 do_test without_rowid3-dd08e5.1.4 {
1930 catchsql { 2023 catchsql {
1931 INSERT INTO tdd08_b VALUES(400,500,300); 2024 INSERT INTO tdd08_b VALUES(400,500,300);
1932 } 2025 }
1933 } {1 {foreign key constraint failed}} 2026 } {1 {FOREIGN KEY constraint failed}}
1934 do_test fkey2-dd08e5.1.5 { 2027 do_test without_rowid3-dd08e5.1.5 {
1935 catchsql { 2028 catchsql {
1936 UPDATE tdd08_b SET x=x+1; 2029 UPDATE tdd08_b SET x=x+1;
1937 } 2030 }
1938 } {1 {foreign key constraint failed}} 2031 } {1 {FOREIGN KEY constraint failed}}
1939 do_test fkey2-dd08e5.1.6 { 2032 do_test without_rowid3-dd08e5.1.6 {
1940 catchsql { 2033 catchsql {
1941 UPDATE tdd08 SET a=a+1; 2034 UPDATE tdd08 SET a=a+1;
1942 } 2035 }
1943 } {1 {foreign key constraint failed}} 2036 } {1 {FOREIGN KEY constraint failed}}
1944 2037
1945 #------------------------------------------------------------------------- 2038 #-------------------------------------------------------------------------
1946 # Verify that ticket ce7c133ea6cc9ccdc1a60d80441f80b6180f5eba 2039 # Verify that ticket ce7c133ea6cc9ccdc1a60d80441f80b6180f5eba
1947 # fixed. 2040 # fixed.
1948 # 2041 #
1949 do_test fkey2-ce7c13.1.1 { 2042 do_test without_rowid3-ce7c13.1.1 {
1950 execsql { 2043 execsql {
1951 CREATE TABLE tce71(a INTEGER PRIMARY KEY, b); 2044 CREATE TABLE tce71(a INTEGER PRIMARY KEY, b) WITHOUT rowid;
1952 CREATE UNIQUE INDEX ice71 ON tce71(a,b); 2045 CREATE UNIQUE INDEX ice71 ON tce71(a,b);
1953 INSERT INTO tce71 VALUES(100,200); 2046 INSERT INTO tce71 VALUES(100,200);
1954 CREATE TABLE tce72(w, x, y, FOREIGN KEY(x,y) REFERENCES tce71(a,b)); 2047 CREATE TABLE tce72(w, x, y, FOREIGN KEY(x,y) REFERENCES tce71(a,b));
1955 INSERT INTO tce72 VALUES(300,100,200); 2048 INSERT INTO tce72 VALUES(300,100,200);
1956 UPDATE tce71 set b = 200 where a = 100; 2049 UPDATE tce71 set b = 200 where a = 100;
1957 SELECT * FROM tce71, tce72; 2050 SELECT * FROM tce71, tce72;
1958 } 2051 }
1959 } {100 200 300 100 200} 2052 } {100 200 300 100 200}
1960 do_test fkey2-ce7c13.1.2 { 2053 do_test without_rowid3-ce7c13.1.2 {
1961 catchsql { 2054 catchsql {
1962 UPDATE tce71 set b = 201 where a = 100; 2055 UPDATE tce71 set b = 201 where a = 100;
1963 } 2056 }
1964 } {1 {foreign key constraint failed}} 2057 } {1 {FOREIGN KEY constraint failed}}
1965 do_test fkey2-ce7c13.1.3 { 2058 do_test without_rowid3-ce7c13.1.3 {
1966 catchsql { 2059 catchsql {
1967 UPDATE tce71 set a = 101 where a = 100; 2060 UPDATE tce71 set a = 101 where a = 100;
1968 } 2061 }
1969 } {1 {foreign key constraint failed}} 2062 } {1 {FOREIGN KEY constraint failed}}
1970 do_test fkey2-ce7c13.1.4 { 2063 do_test without_rowid3-ce7c13.1.4 {
1971 execsql { 2064 execsql {
1972 CREATE TABLE tce73(a INTEGER PRIMARY KEY, b, UNIQUE(a,b)); 2065 CREATE TABLE tce73(a INTEGER PRIMARY KEY, b, UNIQUE(a,b)) WITHOUT rowid;
1973 INSERT INTO tce73 VALUES(100,200); 2066 INSERT INTO tce73 VALUES(100,200);
1974 CREATE TABLE tce74(w, x, y, FOREIGN KEY(x,y) REFERENCES tce73(a,b)); 2067 CREATE TABLE tce74(w, x, y, FOREIGN KEY(x,y) REFERENCES tce73(a,b));
1975 INSERT INTO tce74 VALUES(300,100,200); 2068 INSERT INTO tce74 VALUES(300,100,200);
1976 UPDATE tce73 set b = 200 where a = 100; 2069 UPDATE tce73 set b = 200 where a = 100;
1977 SELECT * FROM tce73, tce74; 2070 SELECT * FROM tce73, tce74;
1978 } 2071 }
1979 } {100 200 300 100 200} 2072 } {100 200 300 100 200}
1980 do_test fkey2-ce7c13.1.5 { 2073 do_test without_rowid3-ce7c13.1.5 {
1981 catchsql { 2074 catchsql {
1982 UPDATE tce73 set b = 201 where a = 100; 2075 UPDATE tce73 set b = 201 where a = 100;
1983 } 2076 }
1984 } {1 {foreign key constraint failed}} 2077 } {1 {FOREIGN KEY constraint failed}}
1985 do_test fkey2-ce7c13.1.6 { 2078 do_test without_rowid3-ce7c13.1.6 {
1986 catchsql { 2079 catchsql {
1987 UPDATE tce73 set a = 101 where a = 100; 2080 UPDATE tce73 set a = 101 where a = 100;
1988 } 2081 }
1989 } {1 {foreign key constraint failed}} 2082 } {1 {FOREIGN KEY constraint failed}}
1990 2083
1991 finish_test 2084 finish_test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698