sqlite/test/fkey4.test
drh 9ab724f196 If a deferred foreign key constraint fails on a statement that is not part
of a larger transation, make sure that the statement fully ends so that
subsequent invocations of the same statement will not pass the constraint
because they think the transaction is not closed.  This is a merge of
the deferred-fk-quirk branch together with a test case.

FossilOrigin-Name: 2f94d4623f9aae1b5bc7041bd85f4e3a7462c60e
2011-02-04 05:47:51 +00:00

56 lines
1.5 KiB
Plaintext

# 2011 Feb 04
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
# This file implements regression tests for SQLite library.
#
# This file test deferred foreign key constraint processing to make
# sure that when a statement not within BEGIN...END fails a constraint,
# that statement doesn't hold the transaction open thus allowing
# a subsequent statement to fail a deferred constraint with impunity.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
ifcapable {!foreignkey||!trigger} {
finish_test
return
}
# Create a table and some data to work with.
#
do_test fkey4-1.1 {
execsql {
PRAGMA foreign_keys = ON;
CREATE TABLE t1(a PRIMARY KEY, b);
CREATE TABLE t2(c REFERENCES t1 DEFERRABLE INITIALLY DEFERRED, d);
INSERT INTO t1 VALUES(1,2);
INSERT INTO t2 VALUES(1,3);
}
} {}
do_test fkey4-1.2 {
set ::DB [sqlite3_connection_pointer db]
set ::SQL {INSERT INTO t2 VALUES(2,4)}
set ::STMT1 [sqlite3_prepare_v2 $::DB $::SQL -1 TAIL]
sqlite3_step $::STMT1
} {SQLITE_CONSTRAINT}
do_test fkey4-1.3 {
set ::STMT2 [sqlite3_prepare_v2 $::DB $::SQL -1 TAIL]
sqlite3_step $::STMT2
} {SQLITE_CONSTRAINT}
do_test fkey4-1.4 {
db eval {SELECT * FROM t2}
} {1 3}
sqlite3_finalize $::STMT1
sqlite3_finalize $::STMT2
finish_test