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 14set testdir [file dirname $argv0] 15source $testdir/tester.tcl 16 17ifcapable !foreignkey||!trigger { 18 finish_test 19 return 20} 21source $testdir/malloc_common.tcl 22 23do_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 34do_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 51do_malloc_test fkey_malloc-3 -sqlprep { 52 PRAGMA foreign_keys = 1; 53 CREATE TABLE t1(x INTEGER PRIMARY KEY); 54 CREATE TABLE t2(y REFERENCES t1(rowid) ON UPDATE CASCADE); 55 CREATE TABLE t3(y DEFAULT 14 REFERENCES t1(x) ON UPDATE SET DEFAULT); 56 CREATE TABLE t4(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 INSERT INTO t4 VALUES(13); 61} -sqlbody { 62 UPDATE t1 SET x = 14; 63} 64 65proc catch_fk_error {zSql} { 66 set rc [catch {db eval $zSql} msg] 67 if {$rc==0} { 68 return $msg 69 } 70 if {[string match {*foreign key*} $msg]} { 71 return "" 72 } 73 if {$msg eq "out of memory"} { 74 error 1 75 } 76 error $msg 77} 78 79do_malloc_test fkey_malloc-4 -sqlprep { 80 PRAGMA foreign_keys = 1; 81 CREATE TABLE t1(x INTEGER PRIMARY KEY, y UNIQUE); 82 CREATE TABLE t2(z REFERENCES t1(x), a REFERENCES t1(y)); 83 CREATE TABLE t3(x); 84 CREATE TABLE t4(z REFERENCES t3); 85 CREATE TABLE t5(x, y); 86 CREATE TABLE t6(z REFERENCES t5(x)); 87 CREATE INDEX i51 ON t5(x); 88 CREATE INDEX i52 ON t5(y, x); 89 INSERT INTO t1 VALUES(1, 2); 90} -tclbody { 91 catch_fk_error {INSERT INTO t2 VALUES(1, 3)} 92 catch_fk_error {INSERT INTO t4 VALUES(2)} 93 catch_fk_error {INSERT INTO t6 VALUES(2)} 94} 95 96do_malloc_test fkey_malloc-5 -sqlprep { 97 PRAGMA foreign_keys = 1; 98 CREATE TABLE t1(x, y, PRIMARY KEY(x, y)); 99 CREATE TABLE t2(a, b, FOREIGN KEY(a, b) REFERENCES t1 ON UPDATE CASCADE); 100 INSERT INTO t1 VALUES(1, 2); 101 INSERT INTO t2 VALUES(1, 2); 102} -sqlbody { 103 UPDATE t1 SET x = 5; 104} 105 106finish_test 107 108 109