Annotation of embedaddon/sqlite3/test/fkey_malloc.test, revision 1.1
1.1 ! misho 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" || $msg eq "constraint failed"} {
! 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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>