18ff2d956Sdan# 2001 September 15 28ff2d956Sdan# 38ff2d956Sdan# The author disclaims copyright to this source code. In place of 48ff2d956Sdan# a legal notice, here is a blessing: 58ff2d956Sdan# 68ff2d956Sdan# May you do good and not evil. 78ff2d956Sdan# May you find forgiveness for yourself and forgive others. 88ff2d956Sdan# May you share freely, never taking more than you give. 98ff2d956Sdan# 108ff2d956Sdan#*********************************************************************** 118ff2d956Sdan# This file implements regression tests for SQLite library. 128ff2d956Sdan# 138ff2d956Sdan# This file implements tests for foreign keys. 148ff2d956Sdan# 158ff2d956Sdan 168ff2d956Sdanset testdir [file dirname $argv0] 178ff2d956Sdansource $testdir/tester.tcl 188ff2d956Sdanset testprefix fkey7 198ff2d956Sdan 208ff2d956Sdanifcapable {!foreignkey} { 218ff2d956Sdan finish_test 228ff2d956Sdan return 238ff2d956Sdan} 248ff2d956Sdan 258ff2d956Sdando_execsql_test 1.1 { 268ff2d956Sdan PRAGMA foreign_keys = 1; 278ff2d956Sdan 288ff2d956Sdan CREATE TABLE s1(a PRIMARY KEY, b); 298ff2d956Sdan CREATE TABLE par(a, b REFERENCES s1, c UNIQUE, PRIMARY KEY(a)); 308ff2d956Sdan 318ff2d956Sdan CREATE TABLE c1(a, b REFERENCES par); 328ff2d956Sdan CREATE TABLE c2(a, b REFERENCES par); 338ff2d956Sdan CREATE TABLE c3(a, b REFERENCES par(c)); 348ff2d956Sdan} 358ff2d956Sdan 368ff2d956Sdanproc auth {op tbl args} { 378ff2d956Sdan if {$op == "SQLITE_READ"} { set ::tbls($tbl) 1 } 388ff2d956Sdan return "SQLITE_OK" 398ff2d956Sdan} 408ff2d956Sdandb auth auth 418ff2d956Sdandb cache size 0 428ff2d956Sdanproc do_tblsread_test {tn sql tbllist} { 438ff2d956Sdan array unset ::tbls 448ff2d956Sdan uplevel [list execsql $sql] 458ff2d956Sdan uplevel [list do_test $tn {lsort [array names ::tbls]} $tbllist] 468ff2d956Sdan} 478ff2d956Sdan 488ff2d956Sdando_tblsread_test 1.2 { UPDATE par SET b=? WHERE a=? } {par s1} 498ff2d956Sdando_tblsread_test 1.3 { UPDATE par SET a=? WHERE b=? } {c1 c2 par} 508ff2d956Sdando_tblsread_test 1.4 { UPDATE par SET c=? WHERE b=? } {c3 par} 518ff2d956Sdando_tblsread_test 1.5 { UPDATE par SET a=?,b=?,c=? WHERE b=? } {c1 c2 c3 par s1} 528ff2d956Sdan 53b391b944Sdanifcapable incrblob { 54b391b944Sdan do_execsql_test 2.0 { 55b391b944Sdan CREATE TABLE pX(x PRIMARY KEY); 56b391b944Sdan CREATE TABLE cX(a INTEGER PRIMARY KEY, b REFERENCES pX); 57b391b944Sdan } 58b391b944Sdan 59b391b944Sdan do_catchsql_test 2.1 { 60b391b944Sdan INSERT INTO cX VALUES(11, zeroblob(40)); 61b391b944Sdan } {1 {FOREIGN KEY constraint failed}} 62b391b944Sdan 63b391b944Sdan do_test 2.2 { 64b391b944Sdan set stmt [sqlite3_prepare_v2 db "INSERT INTO cX VALUES(11, ?)" -1] 65b391b944Sdan sqlite3_bind_zeroblob $stmt 1 45 66b391b944Sdan sqlite3_step $stmt 67b391b944Sdan sqlite3_finalize $stmt 68b391b944Sdan } {SQLITE_CONSTRAINT} 69b391b944Sdan} 708ff2d956Sdan 717ac2d48eSdanifcapable stat4 { 727ac2d48eSdan do_execsql_test 3.0 { 737ac2d48eSdan CREATE TABLE p4 (id INTEGER NOT NULL PRIMARY KEY); 747ac2d48eSdan INSERT INTO p4 VALUES(1), (2), (3); 757ac2d48eSdan 767ac2d48eSdan CREATE TABLE c4(x INTEGER REFERENCES p4(id) DEFERRABLE INITIALLY DEFERRED); 777ac2d48eSdan CREATE INDEX c4_x ON c4(x); 787ac2d48eSdan INSERT INTO c4 VALUES(1), (2), (3); 797ac2d48eSdan 807ac2d48eSdan ANALYZE; 817ac2d48eSdan INSERT INTO p4(id) VALUES(4); 827ac2d48eSdan } 837ac2d48eSdan} 847ac2d48eSdan 85*f116ad85Sdan 86*f116ad85Sdando_execsql_test 4.0 { 87*f116ad85Sdan PRAGMA foreign_keys = true; 88*f116ad85Sdan CREATE TABLE parent( 89*f116ad85Sdan p PRIMARY KEY 90*f116ad85Sdan ); 91*f116ad85Sdan CREATE TABLE child( 92*f116ad85Sdan c UNIQUE REFERENCES parent(p) 93*f116ad85Sdan ); 94*f116ad85Sdan} 95*f116ad85Sdan 96*f116ad85Sdando_catchsql_test 4.1 { 97*f116ad85Sdan INSERT OR FAIL INTO child VALUES(123), (123); 98*f116ad85Sdan} {1 {FOREIGN KEY constraint failed}} 99*f116ad85Sdan 100*f116ad85Sdando_execsql_test 4.2 { 101*f116ad85Sdan SELECT * FROM child; 102*f116ad85Sdan} {} 103*f116ad85Sdan 104*f116ad85Sdando_execsql_test 4.3 { 105*f116ad85Sdan PRAGMA foreign_key_check; 106*f116ad85Sdan} {} 107*f116ad85Sdan 108*f116ad85Sdando_catchsql_test 4.4 { 109*f116ad85Sdan INSERT INTO parent VALUES(123); 110*f116ad85Sdan INSERT OR FAIL INTO child VALUES(123), (123); 111*f116ad85Sdan} {1 {UNIQUE constraint failed: child.c}} 112*f116ad85Sdan 113*f116ad85Sdando_execsql_test 4.5 { 114*f116ad85Sdan SELECT * FROM child; 115*f116ad85Sdan} {123} 116*f116ad85Sdan 117*f116ad85Sdando_execsql_test 4.6 { 118*f116ad85Sdan PRAGMA foreign_key_check; 119*f116ad85Sdan} {} 120*f116ad85Sdan 1218ff2d956Sdanfinish_test 122