xref: /sqlite-3.40.0/test/fkey4.test (revision 433dccfb)
19ab724f1Sdrh# 2011 Feb 04
29ab724f1Sdrh#
39ab724f1Sdrh# The author disclaims copyright to this source code.  In place of
49ab724f1Sdrh# a legal notice, here is a blessing:
59ab724f1Sdrh#
69ab724f1Sdrh#    May you do good and not evil.
79ab724f1Sdrh#    May you find forgiveness for yourself and forgive others.
89ab724f1Sdrh#    May you share freely, never taking more than you give.
99ab724f1Sdrh#
109ab724f1Sdrh#***********************************************************************
119ab724f1Sdrh# This file implements regression tests for SQLite library.
129ab724f1Sdrh#
139ab724f1Sdrh# This file test deferred foreign key constraint processing to make
149ab724f1Sdrh# sure that when a statement not within BEGIN...END fails a constraint,
159ab724f1Sdrh# that statement doesn't hold the transaction open thus allowing
169ab724f1Sdrh# a subsequent statement to fail a deferred constraint with impunity.
179ab724f1Sdrh#
189ab724f1Sdrh
199ab724f1Sdrhset testdir [file dirname $argv0]
209ab724f1Sdrhsource $testdir/tester.tcl
219ab724f1Sdrh
229ab724f1Sdrhifcapable {!foreignkey||!trigger} {
239ab724f1Sdrh  finish_test
249ab724f1Sdrh  return
259ab724f1Sdrh}
269ab724f1Sdrh
279ab724f1Sdrh# Create a table and some data to work with.
289ab724f1Sdrh#
299ab724f1Sdrhdo_test fkey4-1.1 {
309ab724f1Sdrh  execsql {
319ab724f1Sdrh    PRAGMA foreign_keys = ON;
329ab724f1Sdrh    CREATE TABLE t1(a PRIMARY KEY, b);
339ab724f1Sdrh    CREATE TABLE t2(c REFERENCES t1 DEFERRABLE INITIALLY DEFERRED, d);
349ab724f1Sdrh    INSERT INTO t1 VALUES(1,2);
359ab724f1Sdrh    INSERT INTO t2 VALUES(1,3);
369ab724f1Sdrh  }
379ab724f1Sdrh} {}
389ab724f1Sdrh
399ab724f1Sdrhdo_test fkey4-1.2 {
409ab724f1Sdrh  set ::DB [sqlite3_connection_pointer db]
419ab724f1Sdrh  set ::SQL {INSERT INTO t2 VALUES(2,4)}
429ab724f1Sdrh  set ::STMT1 [sqlite3_prepare_v2 $::DB $::SQL -1 TAIL]
439ab724f1Sdrh  sqlite3_step $::STMT1
449ab724f1Sdrh} {SQLITE_CONSTRAINT}
45*433dccfbSdrhverify_ex_errcode fkey4-1.2b SQLITE_CONSTRAINT_FOREIGNKEY
469ab724f1Sdrhdo_test fkey4-1.3 {
479ab724f1Sdrh  set ::STMT2 [sqlite3_prepare_v2 $::DB $::SQL -1 TAIL]
489ab724f1Sdrh  sqlite3_step $::STMT2
499ab724f1Sdrh} {SQLITE_CONSTRAINT}
50*433dccfbSdrhverify_ex_errcode fkey4-1.3b SQLITE_CONSTRAINT_FOREIGNKEY
519ab724f1Sdrhdo_test fkey4-1.4 {
529ab724f1Sdrh  db eval {SELECT * FROM t2}
539ab724f1Sdrh} {1 3}
549ab724f1Sdrhsqlite3_finalize $::STMT1
559ab724f1Sdrhsqlite3_finalize $::STMT2
569ab724f1Sdrh
579ab724f1Sdrhfinish_test
58