Add new testcase() macros and fix a bug that was revealed when trying to
[sqlite.git] / test / fkey4.test
blob79cf663478f0cbf722a5a976e09c2a2f540603f3
1 # 2011 Feb 04
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
13 # This file test deferred foreign key constraint processing to make
14 # sure that when a statement not within BEGIN...END fails a constraint,
15 # that statement doesn't hold the transaction open thus allowing
16 # a subsequent statement to fail a deferred constraint with impunity.
19 set testdir [file dirname $argv0]
20 source $testdir/tester.tcl
22 ifcapable {!foreignkey||!trigger} {
23   finish_test
24   return
27 # Create a table and some data to work with.
29 do_test fkey4-1.1 {
30   execsql {
31     PRAGMA foreign_keys = ON;
32     CREATE TABLE t1(a PRIMARY KEY, b);
33     CREATE TABLE t2(c REFERENCES t1 DEFERRABLE INITIALLY DEFERRED, d);
34     INSERT INTO t1 VALUES(1,2);
35     INSERT INTO t2 VALUES(1,3);
36   }
37 } {}
39 do_test fkey4-1.2 {
40   set ::DB [sqlite3_connection_pointer db]
41   set ::SQL {INSERT INTO t2 VALUES(2,4)}
42   set ::STMT1 [sqlite3_prepare_v2 $::DB $::SQL -1 TAIL]
43   sqlite3_step $::STMT1
44 } {SQLITE_CONSTRAINT}
45 verify_ex_errcode fkey4-1.2b SQLITE_CONSTRAINT_FOREIGNKEY
46 do_test fkey4-1.3 {
47   set ::STMT2 [sqlite3_prepare_v2 $::DB $::SQL -1 TAIL]
48   sqlite3_step $::STMT2
49 } {SQLITE_CONSTRAINT}
50 verify_ex_errcode fkey4-1.3b SQLITE_CONSTRAINT_FOREIGNKEY
51 do_test fkey4-1.4 {
52   db eval {SELECT * FROM t2}
53 } {1 3}
54 sqlite3_finalize $::STMT1
55 sqlite3_finalize $::STMT2
57 finish_test