Home | History | Annotate | Download | only in test
      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 
    133