Index: third_party/sqlite/src/test/fkey_malloc.test |
diff --git a/third_party/sqlite/src/test/fkey_malloc.test b/third_party/sqlite/src/test/fkey_malloc.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..05a2a4f474479602ad4d0224fad45eee4b78b4b0 |
--- /dev/null |
+++ b/third_party/sqlite/src/test/fkey_malloc.test |
@@ -0,0 +1,132 @@ |
+# 2009 September 22 |
+# |
+# The author disclaims copyright to this source code. In place of |
+# a legal notice, here is a blessing: |
+# |
+# May you do good and not evil. |
+# May you find forgiveness for yourself and forgive others. |
+# May you share freely, never taking more than you give. |
+# |
+#*********************************************************************** |
+# |
+# |
+ |
+set testdir [file dirname $argv0] |
+source $testdir/tester.tcl |
+ |
+ifcapable !foreignkey||!trigger { |
+ finish_test |
+ return |
+} |
+source $testdir/malloc_common.tcl |
+ |
+do_malloc_test fkey_malloc-1 -sqlprep { |
+ PRAGMA foreign_keys = 1; |
+ CREATE TABLE t1(a PRIMARY KEY, b UNIQUE); |
+ CREATE TABLE t2(x REFERENCES t1 ON UPDATE CASCADE ON DELETE CASCADE); |
+} -sqlbody { |
+ INSERT INTO t1 VALUES('aaa', 1); |
+ INSERT INTO t2 VALUES('aaa'); |
+ UPDATE t1 SET a = 'bbb'; |
+ DELETE FROM t1; |
+} |
+ |
+do_malloc_test fkey_malloc-2 -sqlprep { |
+ PRAGMA foreign_keys = 1; |
+ CREATE TABLE t1(a, b, UNIQUE(a, b)); |
+} -sqlbody { |
+ CREATE TABLE t2(x, y, |
+ FOREIGN KEY(x, y) REFERENCES t1(a, b) DEFERRABLE INITIALLY DEFERRED |
+ ); |
+ BEGIN; |
+ INSERT INTO t2 VALUES('a', 'b'); |
+ INSERT INTO t1 VALUES('a', 'b'); |
+ UPDATE t1 SET a = 'c'; |
+ DELETE FROM t2; |
+ INSERT INTO t2 VALUES('d', 'b'); |
+ UPDATE t2 SET x = 'c'; |
+ COMMIT; |
+} |
+ |
+do_malloc_test fkey_malloc-3 -sqlprep { |
+ PRAGMA foreign_keys = 1; |
+ CREATE TABLE t1(x INTEGER PRIMARY KEY); |
+ CREATE TABLE t2(y DEFAULT 14 REFERENCES t1(x) ON UPDATE SET DEFAULT); |
+ CREATE TABLE t3(y REFERENCES t1 ON UPDATE SET NULL); |
+ INSERT INTO t1 VALUES(13); |
+ INSERT INTO t2 VALUES(13); |
+ INSERT INTO t3 VALUES(13); |
+} -sqlbody { |
+ UPDATE t1 SET x = 14; |
+} |
+ |
+proc catch_fk_error {zSql} { |
+ set rc [catch {db eval $zSql} msg] |
+ if {$rc==0} { |
+ return $msg |
+ } |
+ if {[string match {*foreign key*} $msg]} { |
+ return "" |
+ } |
+ if {$msg eq "out of memory"} { |
+ error 1 |
+ } |
+ error $msg |
+} |
+ |
+do_malloc_test fkey_malloc-4 -sqlprep { |
+ PRAGMA foreign_keys = 1; |
+ CREATE TABLE t1(x INTEGER PRIMARY KEY, y UNIQUE); |
+ CREATE TABLE t2(z REFERENCES t1(x), a REFERENCES t1(y)); |
+ CREATE TABLE t3(x); |
+ CREATE TABLE t4(z REFERENCES t3); |
+ CREATE TABLE t5(x, y); |
+ CREATE TABLE t6(z REFERENCES t5(x)); |
+ CREATE INDEX i51 ON t5(x); |
+ CREATE INDEX i52 ON t5(y, x); |
+ INSERT INTO t1 VALUES(1, 2); |
+} -tclbody { |
+ catch_fk_error {INSERT INTO t2 VALUES(1, 3)} |
+ catch_fk_error {INSERT INTO t4 VALUES(2)} |
+ catch_fk_error {INSERT INTO t6 VALUES(2)} |
+} |
+ |
+do_malloc_test fkey_malloc-5 -sqlprep { |
+ PRAGMA foreign_keys = 1; |
+ CREATE TABLE t1(x, y, PRIMARY KEY(x, y)); |
+ CREATE TABLE t2(a, b, FOREIGN KEY(a, b) REFERENCES t1 ON UPDATE CASCADE); |
+ INSERT INTO t1 VALUES(1, 2); |
+ INSERT INTO t2 VALUES(1, 2); |
+} -sqlbody { |
+ UPDATE t1 SET x = 5; |
+} |
+ |
+do_malloc_test fkey_malloc-6 -sqlprep { |
+ PRAGMA foreign_keys = 1; |
+ CREATE TABLE t1( |
+ x PRIMARY KEY, |
+ y REFERENCES t1 ON DELETE RESTRICT ON UPDATE SET DEFAULT |
+ ); |
+ INSERT INTO t1 VALUES('abc', 'abc'); |
+ INSERT INTO t1 VALUES('def', 'def'); |
+} -sqlbody { |
+ INSERT INTO t1 VALUES('ghi', 'ghi'); |
+ DELETE FROM t1 WHERE rowid>1; |
+ UPDATE t1 SET x='jkl', y='jkl'; |
+} |
+ |
+do_malloc_test fkey_malloc-7 -sqlprep { |
+ PRAGMA foreign_keys = 1; |
+ CREATE TABLE x(a, b, PRIMARY KEY(a, b)); |
+ CREATE TABLE y(c, d, |
+ FOREIGN KEY(d, c) REFERENCES x DEFERRABLE INITIALLY DEFERRED |
+ ); |
+ CREATE TABLE z(e, f, FOREIGN KEY(e, f) REFERENCES x); |
+} -sqlbody { |
+ DROP TABLE y; |
+ DROP TABLE x; |
+} |
+ |
+finish_test |
+ |
+ |