1 # 2001 September 15 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 # This file implements regression tests for SQLite library. 12 # 13 # This file implements tests for foreign keys. 14 # 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 19 ifcapable {!foreignkey} { 20 finish_test 21 return 22 } 23 24 # Create a table and some data to work with. 25 # 26 do_test fkey1-1.0 { 27 execsql { 28 CREATE TABLE t1( 29 a INTEGER PRIMARY KEY, 30 b INTEGER 31 REFERENCES t1 ON DELETE CASCADE 32 REFERENCES t2, 33 c TEXT, 34 FOREIGN KEY (b,c) REFERENCES t2(x,y) ON UPDATE CASCADE 35 ); 36 } 37 } {} 38 do_test fkey1-1.1 { 39 execsql { 40 CREATE TABLE t2( 41 x INTEGER PRIMARY KEY, 42 y TEXT 43 ); 44 } 45 } {} 46 do_test fkey1-1.2 { 47 execsql { 48 CREATE TABLE t3( 49 a INTEGER REFERENCES t2, 50 b INTEGER REFERENCES t1, 51 FOREIGN KEY (a,b) REFERENCES t2(x,y) 52 ); 53 } 54 } {} 55 56 do_test fkey1-2.1 { 57 execsql { 58 CREATE TABLE t4(a integer primary key); 59 CREATE TABLE t5(x references t4); 60 CREATE TABLE t6(x references t4); 61 CREATE TABLE t7(x references t4); 62 CREATE TABLE t8(x references t4); 63 CREATE TABLE t9(x references t4); 64 CREATE TABLE t10(x references t4); 65 DROP TABLE t7; 66 DROP TABLE t9; 67 DROP TABLE t5; 68 DROP TABLE t8; 69 DROP TABLE t6; 70 DROP TABLE t10; 71 } 72 } {} 73 74 do_test fkey1-3.1 { 75 execsql { 76 CREATE TABLE t5(a PRIMARY KEY, b, c); 77 CREATE TABLE t6( 78 d REFERENCES t5, 79 e REFERENCES t5(c) 80 ); 81 PRAGMA foreign_key_list(t6); 82 } 83 } [concat \ 84 {0 0 t5 e c {NO ACTION} {NO ACTION} NONE} \ 85 {1 0 t5 d {} {NO ACTION} {NO ACTION} NONE} \ 86 ] 87 do_test fkey1-3.2 { 88 execsql { 89 CREATE TABLE t7(d, e, f, 90 FOREIGN KEY (d, e) REFERENCES t5(a, b) 91 ); 92 PRAGMA foreign_key_list(t7); 93 } 94 } [concat \ 95 {0 0 t5 d a {NO ACTION} {NO ACTION} NONE} \ 96 {0 1 t5 e b {NO ACTION} {NO ACTION} NONE} \ 97 ] 98 do_test fkey1-3.3 { 99 execsql { 100 CREATE TABLE t8(d, e, f, 101 FOREIGN KEY (d, e) REFERENCES t5 ON DELETE CASCADE ON UPDATE SET NULL 102 ); 103 PRAGMA foreign_key_list(t8); 104 } 105 } [concat \ 106 {0 0 t5 d {} {SET NULL} CASCADE NONE} \ 107 {0 1 t5 e {} {SET NULL} CASCADE NONE} \ 108 ] 109 do_test fkey1-3.4 { 110 execsql { 111 CREATE TABLE t9(d, e, f, 112 FOREIGN KEY (d, e) REFERENCES t5 ON DELETE CASCADE ON UPDATE SET DEFAULT 113 ); 114 PRAGMA foreign_key_list(t9); 115 } 116 } [concat \ 117 {0 0 t5 d {} {SET DEFAULT} CASCADE NONE} \ 118 {0 1 t5 e {} {SET DEFAULT} CASCADE NONE} \ 119 ] 120 121 finish_test 122