1*63f0eedfSdrh# 2013-11-02 2*63f0eedfSdrh# 3*63f0eedfSdrh# The author disclaims copyright to this source code. In place of 4*63f0eedfSdrh# a legal notice, here is a blessing: 5*63f0eedfSdrh# 6*63f0eedfSdrh# May you do good and not evil. 7*63f0eedfSdrh# May you find forgiveness for yourself and forgive others. 8*63f0eedfSdrh# May you share freely, never taking more than you give. 9*63f0eedfSdrh# 10*63f0eedfSdrh#*********************************************************************** 11*63f0eedfSdrh# 12*63f0eedfSdrh# This file implements regression tests for SQLite library. The 13*63f0eedfSdrh# focus of this file is testing WITHOUT ROWID tables, and especially 14*63f0eedfSdrh# FOREIGN KEY constraints. 15*63f0eedfSdrh# 16*63f0eedfSdrh 17*63f0eedfSdrhset testdir [file dirname $argv0] 18*63f0eedfSdrhsource $testdir/tester.tcl 19*63f0eedfSdrh 20*63f0eedfSdrhifcapable {!foreignkey} { 21*63f0eedfSdrh finish_test 22*63f0eedfSdrh return 23*63f0eedfSdrh} 24*63f0eedfSdrh 25*63f0eedfSdrh# Create a table and some data to work with. 26*63f0eedfSdrh# 27*63f0eedfSdrhdo_test without_rowid2-1.0 { 28*63f0eedfSdrh execsql { 29*63f0eedfSdrh CREATE TABLE t1( 30*63f0eedfSdrh a INT PRIMARY KEY, 31*63f0eedfSdrh b INT 32*63f0eedfSdrh REFERENCES t1 ON DELETE CASCADE 33*63f0eedfSdrh REFERENCES t2, 34*63f0eedfSdrh c TEXT, 35*63f0eedfSdrh FOREIGN KEY (b,c) REFERENCES t2(x,y) ON UPDATE CASCADE 36*63f0eedfSdrh ) WITHOUT rowid; 37*63f0eedfSdrh } 38*63f0eedfSdrh} {} 39*63f0eedfSdrhdo_test without_rowid2-1.1 { 40*63f0eedfSdrh execsql { 41*63f0eedfSdrh CREATE TABLE t2( 42*63f0eedfSdrh x INT PRIMARY KEY, 43*63f0eedfSdrh y TEXT 44*63f0eedfSdrh ) WITHOUT rowid; 45*63f0eedfSdrh } 46*63f0eedfSdrh} {} 47*63f0eedfSdrhdo_test without_rowid2-1.2 { 48*63f0eedfSdrh execsql { 49*63f0eedfSdrh CREATE TABLE t3( 50*63f0eedfSdrh a INT REFERENCES t2, 51*63f0eedfSdrh b INT REFERENCES t1, 52*63f0eedfSdrh FOREIGN KEY (a,b) REFERENCES t2(x,y) 53*63f0eedfSdrh ); 54*63f0eedfSdrh } 55*63f0eedfSdrh} {} 56*63f0eedfSdrh 57*63f0eedfSdrhdo_test without_rowid2-2.1 { 58*63f0eedfSdrh execsql { 59*63f0eedfSdrh CREATE TABLE t4(a int primary key) WITHOUT rowid; 60*63f0eedfSdrh CREATE TABLE t5(x references t4); 61*63f0eedfSdrh CREATE TABLE t6(x references t4); 62*63f0eedfSdrh CREATE TABLE t7(x references t4); 63*63f0eedfSdrh CREATE TABLE t8(x references t4); 64*63f0eedfSdrh CREATE TABLE t9(x references t4); 65*63f0eedfSdrh CREATE TABLE t10(x references t4); 66*63f0eedfSdrh DROP TABLE t7; 67*63f0eedfSdrh DROP TABLE t9; 68*63f0eedfSdrh DROP TABLE t5; 69*63f0eedfSdrh DROP TABLE t8; 70*63f0eedfSdrh DROP TABLE t6; 71*63f0eedfSdrh DROP TABLE t10; 72*63f0eedfSdrh } 73*63f0eedfSdrh} {} 74*63f0eedfSdrh 75*63f0eedfSdrhdo_test without_rowid2-3.1 { 76*63f0eedfSdrh execsql { 77*63f0eedfSdrh CREATE TABLE t5(a PRIMARY KEY, b, c) WITHOUT rowid; 78*63f0eedfSdrh CREATE TABLE t6( 79*63f0eedfSdrh d REFERENCES t5, 80*63f0eedfSdrh e REFERENCES t5(c) 81*63f0eedfSdrh ); 82*63f0eedfSdrh PRAGMA foreign_key_list(t6); 83*63f0eedfSdrh } 84*63f0eedfSdrh} [concat \ 85*63f0eedfSdrh {0 0 t5 e c {NO ACTION} {NO ACTION} NONE} \ 86*63f0eedfSdrh {1 0 t5 d {} {NO ACTION} {NO ACTION} NONE} \ 87*63f0eedfSdrh] 88*63f0eedfSdrhdo_test without_rowid2-3.2 { 89*63f0eedfSdrh execsql { 90*63f0eedfSdrh CREATE TABLE t7(d, e, f, 91*63f0eedfSdrh FOREIGN KEY (d, e) REFERENCES t5(a, b) 92*63f0eedfSdrh ); 93*63f0eedfSdrh PRAGMA foreign_key_list(t7); 94*63f0eedfSdrh } 95*63f0eedfSdrh} [concat \ 96*63f0eedfSdrh {0 0 t5 d a {NO ACTION} {NO ACTION} NONE} \ 97*63f0eedfSdrh {0 1 t5 e b {NO ACTION} {NO ACTION} NONE} \ 98*63f0eedfSdrh] 99*63f0eedfSdrhdo_test without_rowid2-3.3 { 100*63f0eedfSdrh execsql { 101*63f0eedfSdrh CREATE TABLE t8(d, e, f, 102*63f0eedfSdrh FOREIGN KEY (d, e) REFERENCES t5 ON DELETE CASCADE ON UPDATE SET NULL 103*63f0eedfSdrh ); 104*63f0eedfSdrh PRAGMA foreign_key_list(t8); 105*63f0eedfSdrh } 106*63f0eedfSdrh} [concat \ 107*63f0eedfSdrh {0 0 t5 d {} {SET NULL} CASCADE NONE} \ 108*63f0eedfSdrh {0 1 t5 e {} {SET NULL} CASCADE NONE} \ 109*63f0eedfSdrh] 110*63f0eedfSdrhdo_test without_rowid2-3.4 { 111*63f0eedfSdrh execsql { 112*63f0eedfSdrh CREATE TABLE t9(d, e, f, 113*63f0eedfSdrh FOREIGN KEY (d, e) REFERENCES t5 ON DELETE CASCADE ON UPDATE SET DEFAULT 114*63f0eedfSdrh ); 115*63f0eedfSdrh PRAGMA foreign_key_list(t9); 116*63f0eedfSdrh } 117*63f0eedfSdrh} [concat \ 118*63f0eedfSdrh {0 0 t5 d {} {SET DEFAULT} CASCADE NONE} \ 119*63f0eedfSdrh {0 1 t5 e {} {SET DEFAULT} CASCADE NONE} \ 120*63f0eedfSdrh] 121*63f0eedfSdrhdo_test without_rowid2-3.5 { 122*63f0eedfSdrh sqlite3_db_status db DBSTATUS_DEFERRED_FKS 0 123*63f0eedfSdrh} {0 0 0} 124*63f0eedfSdrh 125*63f0eedfSdrhfinish_test 126