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 } |
| 33 |
| 34 do_malloc_test fkey_malloc-2 -sqlprep { |
| 35 PRAGMA foreign_keys = 1; |
| 36 CREATE TABLE t1(a, b, UNIQUE(a, b)); |
| 37 } -sqlbody { |
| 38 CREATE TABLE t2(x, y, |
| 39 FOREIGN KEY(x, y) REFERENCES t1(a, b) DEFERRABLE INITIALLY DEFERRED |
| 40 ); |
| 41 BEGIN; |
| 42 INSERT INTO t2 VALUES('a', 'b'); |
| 43 INSERT INTO t1 VALUES('a', 'b'); |
| 44 UPDATE t1 SET a = 'c'; |
| 45 DELETE FROM t2; |
| 46 INSERT INTO t2 VALUES('d', 'b'); |
| 47 UPDATE t2 SET x = 'c'; |
| 48 COMMIT; |
| 49 } |
| 50 |
| 51 do_malloc_test fkey_malloc-3 -sqlprep { |
| 52 PRAGMA foreign_keys = 1; |
| 53 CREATE TABLE t1(x INTEGER PRIMARY KEY); |
| 54 CREATE TABLE t2(y DEFAULT 14 REFERENCES t1(x) ON UPDATE SET DEFAULT); |
| 55 CREATE TABLE t3(y REFERENCES t1 ON UPDATE SET NULL); |
| 56 INSERT INTO t1 VALUES(13); |
| 57 INSERT INTO t2 VALUES(13); |
| 58 INSERT INTO t3 VALUES(13); |
| 59 } -sqlbody { |
| 60 UPDATE t1 SET x = 14; |
| 61 } |
| 62 |
| 63 proc catch_fk_error {zSql} { |
| 64 set rc [catch {db eval $zSql} msg] |
| 65 if {$rc==0} { |
| 66 return $msg |
| 67 } |
| 68 if {[string match {*foreign key*} $msg]} { |
| 69 return "" |
| 70 } |
| 71 if {$msg eq "out of memory"} { |
| 72 error 1 |
| 73 } |
| 74 error $msg |
| 75 } |
| 76 |
| 77 do_malloc_test fkey_malloc-4 -sqlprep { |
| 78 PRAGMA foreign_keys = 1; |
| 79 CREATE TABLE t1(x INTEGER PRIMARY KEY, y UNIQUE); |
| 80 CREATE TABLE t2(z REFERENCES t1(x), a REFERENCES t1(y)); |
| 81 CREATE TABLE t3(x); |
| 82 CREATE TABLE t4(z REFERENCES t3); |
| 83 CREATE TABLE t5(x, y); |
| 84 CREATE TABLE t6(z REFERENCES t5(x)); |
| 85 CREATE INDEX i51 ON t5(x); |
| 86 CREATE INDEX i52 ON t5(y, x); |
| 87 INSERT INTO t1 VALUES(1, 2); |
| 88 } -tclbody { |
| 89 catch_fk_error {INSERT INTO t2 VALUES(1, 3)} |
| 90 catch_fk_error {INSERT INTO t4 VALUES(2)} |
| 91 catch_fk_error {INSERT INTO t6 VALUES(2)} |
| 92 } |
| 93 |
| 94 do_malloc_test fkey_malloc-5 -sqlprep { |
| 95 PRAGMA foreign_keys = 1; |
| 96 CREATE TABLE t1(x, y, PRIMARY KEY(x, y)); |
| 97 CREATE TABLE t2(a, b, FOREIGN KEY(a, b) REFERENCES t1 ON UPDATE CASCADE); |
| 98 INSERT INTO t1 VALUES(1, 2); |
| 99 INSERT INTO t2 VALUES(1, 2); |
| 100 } -sqlbody { |
| 101 UPDATE t1 SET x = 5; |
| 102 } |
| 103 |
| 104 do_malloc_test fkey_malloc-6 -sqlprep { |
| 105 PRAGMA foreign_keys = 1; |
| 106 CREATE TABLE t1( |
| 107 x PRIMARY KEY, |
| 108 y REFERENCES t1 ON DELETE RESTRICT ON UPDATE SET DEFAULT |
| 109 ); |
| 110 INSERT INTO t1 VALUES('abc', 'abc'); |
| 111 INSERT INTO t1 VALUES('def', 'def'); |
| 112 } -sqlbody { |
| 113 INSERT INTO t1 VALUES('ghi', 'ghi'); |
| 114 DELETE FROM t1 WHERE rowid>1; |
| 115 UPDATE t1 SET x='jkl', y='jkl'; |
| 116 } |
| 117 |
| 118 do_malloc_test fkey_malloc-7 -sqlprep { |
| 119 PRAGMA foreign_keys = 1; |
| 120 CREATE TABLE x(a, b, PRIMARY KEY(a, b)); |
| 121 CREATE TABLE y(c, d, |
| 122 FOREIGN KEY(d, c) REFERENCES x DEFERRABLE INITIALLY DEFERRED |
| 123 ); |
| 124 CREATE TABLE z(e, f, FOREIGN KEY(e, f) REFERENCES x); |
| 125 } -sqlbody { |
| 126 DROP TABLE y; |
| 127 DROP TABLE x; |
| 128 } |
| 129 |
| 130 finish_test |
| 131 |
| 132 |
OLD | NEW |