OLD | NEW |
| (Empty) |
1 # 2009 September 22 | |
2 # | |
3 # The author disclaims copyright to this source code. In place of | |
4 # a legal notice, here is a blessing: | |
5 # | |
6 # May you do good and not evil. | |
7 # May you find forgiveness for yourself and forgive others. | |
8 # May you share freely, never taking more than you give. | |
9 # | |
10 #*********************************************************************** | |
11 # | |
12 # | |
13 | |
14 set testdir [file dirname $argv0] | |
15 source $testdir/tester.tcl | |
16 | |
17 ifcapable !foreignkey||!trigger { | |
18 finish_test | |
19 return | |
20 } | |
21 source $testdir/malloc_common.tcl | |
22 | |
23 do_malloc_test fkey_malloc-1 -sqlprep { | |
24 PRAGMA foreign_keys = 1; | |
25 CREATE TABLE t1(a PRIMARY KEY, b UNIQUE); | |
26 CREATE TABLE t2(x REFERENCES t1 ON UPDATE CASCADE ON DELETE CASCADE); | |
27 } -sqlbody { | |
28 INSERT INTO t1 VALUES('aaa', 1); | |
29 INSERT INTO t2 VALUES('aaa'); | |
30 UPDATE t1 SET a = 'bbb'; | |
31 DELETE FROM t1; | |
32 PRAGMA foreign_key_check; | |
33 } | |
34 | |
35 do_malloc_test fkey_malloc-2 -sqlprep { | |
36 PRAGMA foreign_keys = 1; | |
37 CREATE TABLE t1(a, b, UNIQUE(a, b)); | |
38 } -sqlbody { | |
39 CREATE TABLE t2(x, y, | |
40 FOREIGN KEY(x, y) REFERENCES t1(a, b) DEFERRABLE INITIALLY DEFERRED | |
41 ); | |
42 BEGIN; | |
43 INSERT INTO t2 VALUES('a', 'b'); | |
44 INSERT INTO t1 VALUES('a', 'b'); | |
45 UPDATE t1 SET a = 'c'; | |
46 DELETE FROM t2; | |
47 INSERT INTO t2 VALUES('d', 'b'); | |
48 UPDATE t2 SET x = 'c'; | |
49 COMMIT; | |
50 } | |
51 | |
52 do_malloc_test fkey_malloc-3 -sqlprep { | |
53 PRAGMA foreign_keys = 1; | |
54 CREATE TABLE t1(x INTEGER PRIMARY KEY); | |
55 CREATE TABLE t2(y DEFAULT 14 REFERENCES t1(x) ON UPDATE SET DEFAULT); | |
56 CREATE TABLE t3(y REFERENCES t1 ON UPDATE SET NULL); | |
57 INSERT INTO t1 VALUES(13); | |
58 INSERT INTO t2 VALUES(13); | |
59 INSERT INTO t3 VALUES(13); | |
60 } -sqlbody { | |
61 UPDATE t1 SET x = 14; | |
62 } | |
63 | |
64 proc catch_fk_error {zSql} { | |
65 set rc [catch {db eval $zSql} msg] | |
66 if {$rc==0} { | |
67 return $msg | |
68 } | |
69 if {[string match {*foreign key*} $msg]} { | |
70 return "" | |
71 } | |
72 if {$msg eq "out of memory" | |
73 || $msg eq "FOREIGN KEY constraint failed" | |
74 || $msg eq "constraint failed" | |
75 } { | |
76 error 1 | |
77 } | |
78 error $msg | |
79 } | |
80 | |
81 do_malloc_test fkey_malloc-4 -sqlprep { | |
82 PRAGMA foreign_keys = 1; | |
83 CREATE TABLE t1(x INTEGER PRIMARY KEY, y UNIQUE); | |
84 CREATE TABLE t2(z REFERENCES t1(x), a REFERENCES t1(y)); | |
85 CREATE TABLE t3(x); | |
86 CREATE TABLE t4(z REFERENCES t3); | |
87 CREATE TABLE t5(x, y); | |
88 CREATE TABLE t6(z REFERENCES t5(x)); | |
89 CREATE INDEX i51 ON t5(x); | |
90 CREATE INDEX i52 ON t5(y, x); | |
91 INSERT INTO t1 VALUES(1, 2); | |
92 } -tclbody { | |
93 catch_fk_error {INSERT INTO t2 VALUES(1, 3)} | |
94 catch_fk_error {INSERT INTO t4 VALUES(2)} | |
95 catch_fk_error {INSERT INTO t6 VALUES(2)} | |
96 } | |
97 | |
98 do_malloc_test fkey_malloc-5 -sqlprep { | |
99 PRAGMA foreign_keys = 1; | |
100 CREATE TABLE t1(x, y, PRIMARY KEY(x, y)); | |
101 CREATE TABLE t2(a, b, FOREIGN KEY(a, b) REFERENCES t1 ON UPDATE CASCADE); | |
102 INSERT INTO t1 VALUES(1, 2); | |
103 INSERT INTO t2 VALUES(1, 2); | |
104 } -sqlbody { | |
105 UPDATE t1 SET x = 5; | |
106 } | |
107 | |
108 do_malloc_test fkey_malloc-6 -sqlprep { | |
109 PRAGMA foreign_keys = 1; | |
110 CREATE TABLE t1( | |
111 x PRIMARY KEY, | |
112 y REFERENCES t1 ON DELETE RESTRICT ON UPDATE SET DEFAULT | |
113 ); | |
114 INSERT INTO t1 VALUES('abc', 'abc'); | |
115 INSERT INTO t1 VALUES('def', 'def'); | |
116 } -sqlbody { | |
117 INSERT INTO t1 VALUES('ghi', 'ghi'); | |
118 DELETE FROM t1 WHERE rowid>1; | |
119 UPDATE t1 SET x='jkl', y='jkl'; | |
120 } | |
121 | |
122 do_malloc_test fkey_malloc-7 -sqlprep { | |
123 PRAGMA foreign_keys = 1; | |
124 CREATE TABLE x(a, b, PRIMARY KEY(a, b)); | |
125 CREATE TABLE y(c, d, | |
126 FOREIGN KEY(d, c) REFERENCES x DEFERRABLE INITIALLY DEFERRED | |
127 ); | |
128 CREATE TABLE z(e, f, FOREIGN KEY(e, f) REFERENCES x); | |
129 } -sqlbody { | |
130 DROP TABLE y; | |
131 DROP TABLE x; | |
132 } | |
133 | |
134 finish_test | |
OLD | NEW |