xref: /sqlite-3.40.0/test/without_rowid2.test (revision 63f0eedf)
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