📄 conflict.test
字号:
# 2002 January 29## 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 implements tests for the conflict resolution extension# to SQLite.## $Id: conflict.test,v 1.19 2003/08/05 13:13:39 drh Exp $set testdir [file dirname $argv0]source $testdir/tester.tcl# Create tables for the first group of tests.#do_test conflict-1.0 { execsql { CREATE TABLE t1(a, b, c, UNIQUE(a,b)); CREATE TABLE t2(x); SELECT c FROM t1 ORDER BY c; }} {}# Six columns of configuration data as follows:## i The reference number of the test# conf The conflict resolution algorithm on the BEGIN statement# cmd An INSERT or REPLACE command to execute against table t1# t0 True if there is an error from $cmd# t1 Content of "c" column of t1 assuming no error in $cmd# t2 Content of "x" column of t2#foreach {i conf cmd t0 t1 t2} { 1 {} INSERT 1 {} 1 2 {} {INSERT OR IGNORE} 0 3 1 3 {} {INSERT OR REPLACE} 0 4 1 4 {} REPLACE 0 4 1 5 {} {INSERT OR FAIL} 1 {} 1 6 {} {INSERT OR ABORT} 1 {} 1 7 {} {INSERT OR ROLLBACK} 1 {} {} 8 IGNORE INSERT 0 3 1 9 IGNORE {INSERT OR IGNORE} 0 3 1 10 IGNORE {INSERT OR REPLACE} 0 4 1 11 IGNORE REPLACE 0 4 1 12 IGNORE {INSERT OR FAIL} 1 {} 1 13 IGNORE {INSERT OR ABORT} 1 {} 1 14 IGNORE {INSERT OR ROLLBACK} 1 {} {} 15 REPLACE INSERT 0 4 1 16 FAIL INSERT 1 {} 1 17 ABORT INSERT 1 {} 1 18 ROLLBACK INSERT 1 {} {}} { do_test conflict-1.$i { if {$conf!=""} {set conf "ON CONFLICT $conf"} set r0 [catch {execsql [subst { DELETE FROM t1; DELETE FROM t2; INSERT INTO t1 VALUES(1,2,3); BEGIN $conf; INSERT INTO t2 VALUES(1); $cmd INTO t1 VALUES(1,2,4); }]} r1] catch {execsql {COMMIT}} if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} set r2 [execsql {SELECT x FROM t2}] list $r0 $r1 $r2 } [list $t0 $t1 $t2]}# Create tables for the first group of tests.#do_test conflict-2.0 { execsql { DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(a,b)); CREATE TABLE t2(x); SELECT c FROM t1 ORDER BY c; }} {}# Six columns of configuration data as follows:## i The reference number of the test# conf The conflict resolution algorithm on the BEGIN statement# cmd An INSERT or REPLACE command to execute against table t1# t0 True if there is an error from $cmd# t1 Content of "c" column of t1 assuming no error in $cmd# t2 Content of "x" column of t2#foreach {i conf cmd t0 t1 t2} { 1 {} INSERT 1 {} 1 2 {} {INSERT OR IGNORE} 0 3 1 3 {} {INSERT OR REPLACE} 0 4 1 4 {} REPLACE 0 4 1 5 {} {INSERT OR FAIL} 1 {} 1 6 {} {INSERT OR ABORT} 1 {} 1 7 {} {INSERT OR ROLLBACK} 1 {} {} 8 IGNORE INSERT 0 3 1 9 IGNORE {INSERT OR IGNORE} 0 3 1 10 IGNORE {INSERT OR REPLACE} 0 4 1 11 IGNORE REPLACE 0 4 1 12 IGNORE {INSERT OR FAIL} 1 {} 1 13 IGNORE {INSERT OR ABORT} 1 {} 1 14 IGNORE {INSERT OR ROLLBACK} 1 {} {} 15 REPLACE INSERT 0 4 1 16 FAIL INSERT 1 {} 1 17 ABORT INSERT 1 {} 1 18 ROLLBACK INSERT 1 {} {}} { do_test conflict-2.$i { if {$conf!=""} {set conf "ON CONFLICT $conf"} set r0 [catch {execsql [subst { DELETE FROM t1; DELETE FROM t2; INSERT INTO t1 VALUES(1,2,3); BEGIN $conf; INSERT INTO t2 VALUES(1); $cmd INTO t1 VALUES(1,2,4); }]} r1] catch {execsql {COMMIT}} if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} set r2 [execsql {SELECT x FROM t2}] list $r0 $r1 $r2 } [list $t0 $t1 $t2]}# Create tables for the first group of tests.#do_test conflict-3.0 { execsql { DROP TABLE t1; DROP TABLE t2; CREATE TABLE t1(a, b, c INTEGER, PRIMARY KEY(c), UNIQUE(a,b)); CREATE TABLE t2(x); SELECT c FROM t1 ORDER BY c; }} {}# Six columns of configuration data as follows:## i The reference number of the test# conf The conflict resolution algorithm on the BEGIN statement# cmd An INSERT or REPLACE command to execute against table t1# t0 True if there is an error from $cmd# t1 Content of "c" column of t1 assuming no error in $cmd# t2 Content of "x" column of t2#foreach {i conf cmd t0 t1 t2} { 1 {} INSERT 1 {} 1 2 {} {INSERT OR IGNORE} 0 3 1 3 {} {INSERT OR REPLACE} 0 4 1 4 {} REPLACE 0 4 1 5 {} {INSERT OR FAIL} 1 {} 1 6 {} {INSERT OR ABORT} 1 {} 1 7 {} {INSERT OR ROLLBACK} 1 {} {} 8 IGNORE INSERT 0 3 1 9 IGNORE {INSERT OR IGNORE} 0 3 1 10 IGNORE {INSERT OR REPLACE} 0 4 1 11 IGNORE REPLACE 0 4 1 12 IGNORE {INSERT OR FAIL} 1 {} 1 13 IGNORE {INSERT OR ABORT} 1 {} 1 14 IGNORE {INSERT OR ROLLBACK} 1 {} {} 15 REPLACE INSERT 0 4 1 16 FAIL INSERT 1 {} 1 17 ABORT INSERT 1 {} 1 18 ROLLBACK INSERT 1 {} {}} { do_test conflict-3.$i { if {$conf!=""} {set conf "ON CONFLICT $conf"} set r0 [catch {execsql [subst { DELETE FROM t1; DELETE FROM t2; INSERT INTO t1 VALUES(1,2,3); BEGIN $conf; INSERT INTO t2 VALUES(1); $cmd INTO t1 VALUES(1,2,4); }]} r1] catch {execsql {COMMIT}} if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} set r2 [execsql {SELECT x FROM t2}] list $r0 $r1 $r2 } [list $t0 $t1 $t2]}do_test conflict-4.0 { execsql { DROP TABLE t2; CREATE TABLE t2(x); SELECT x FROM t2; }} {}# Six columns of configuration data as follows:## i The reference number of the test# conf1 The conflict resolution algorithm on the UNIQUE constraint# conf2 The conflict resolution algorithm on the BEGIN statement# cmd An INSERT or REPLACE command to execute against table t1# t0 True if there is an error from $cmd# t1 Content of "c" column of t1 assuming no error in $cmd# t2 Content of "x" column of t2#foreach {i conf1 conf2 cmd t0 t1 t2} { 1 {} {} INSERT 1 {} 1 2 REPLACE {} INSERT 0 4 1 3 IGNORE {} INSERT 0 3 1 4 FAIL {} INSERT 1 {} 1 5 ABORT {} INSERT 1 {} 1 6 ROLLBACK {} INSERT 1 {} {} 7 REPLACE {} {INSERT OR IGNORE} 0 3 1 8 IGNORE {} {INSERT OR REPLACE} 0 4 1 9 FAIL {} {INSERT OR IGNORE} 0 3 1 10 ABORT {} {INSERT OR REPLACE} 0 4 1 11 ROLLBACK {} {INSERT OR IGNORE } 0 3 1 12 REPLACE IGNORE INSERT 0 3 1 13 IGNORE REPLACE INSERT 0 4 1 14 FAIL IGNORE INSERT 0 3 1 15 ABORT REPLACE INSERT 0 4 1 16 ROLLBACK IGNORE INSERT 0 3 1 12 IGNORE REPLACE INSERT 0 4 1 13 IGNORE FAIL INSERT 1 {} 1 14 IGNORE ABORT INSERT 1 {} 1 15 IGNORE ROLLBACK INSERT 1 {} {}} { do_test conflict-4.$i { if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} if {$conf2!=""} {set conf2 "ON CONFLICT $conf2"} set r0 [catch {execsql [subst { DROP TABLE t1; CREATE TABLE t1(a,b,c,UNIQUE(a,b) $conf1); DELETE FROM t2; INSERT INTO t1 VALUES(1,2,3); BEGIN $conf2; INSERT INTO t2 VALUES(1); $cmd INTO t1 VALUES(1,2,4); }]} r1] catch {execsql {COMMIT}} if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} set r2 [execsql {SELECT x FROM t2}] list $r0 $r1 $r2 } [list $t0 $t1 $t2]}do_test conflict-5.0 { execsql { DROP TABLE t2; CREATE TABLE t2(x); SELECT x FROM t2; }} {}# Six columns of configuration data as follows:## i The reference number of the test# conf1 The conflict resolution algorithm on the NOT NULL constraint# conf2 The conflict resolution algorithm on the BEGIN statement# cmd An INSERT or REPLACE command to execute against table t1# t0 True if there is an error from $cmd# t1 Content of "c" column of t1 assuming no error in $cmd# t2 Content of "x" column of t2#foreach {i conf1 conf2 cmd t0 t1 t2} { 1 {} {} INSERT 1 {} 1 2 REPLACE {} INSERT 0 5 1 3 IGNORE {} INSERT 0 {} 1 4 FAIL {} INSERT 1 {} 1 5 ABORT {} INSERT 1 {} 1 6 ROLLBACK {} INSERT 1 {} {} 7 REPLACE {} {INSERT OR IGNORE} 0 {} 1 8 IGNORE {} {INSERT OR REPLACE} 0 5 1 9 FAIL {} {INSERT OR IGNORE} 0 {} 1 10 ABORT {} {INSERT OR REPLACE} 0 5 1 11 ROLLBACK {} {INSERT OR IGNORE} 0 {} 1 12 {} {} {INSERT OR IGNORE} 0 {} 1 13 {} {} {INSERT OR REPLACE} 0 5 1 14 {} {} {INSERT OR FAIL} 1 {} 1 15 {} {} {INSERT OR ABORT} 1 {} 1 16 {} {} {INSERT OR ROLLBACK} 1 {} {} 17 {} IGNORE INSERT 0 {} 1 18 {} REPLACE INSERT 0 5 1 19 {} FAIL INSERT 1 {} 1 20 {} ABORT INSERT 1 {} 1 21 {} ROLLBACK INSERT 1 {} {} 22 REPLACE FAIL INSERT 1 {} 1 23 IGNORE ROLLBACK INSERT 1 {} {}} { if {$t0} {set t1 {t1.c may not be NULL}} do_test conflict-5.$i { if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} if {$conf2!=""} {set conf2 "ON CONFLICT $conf2"} set r0 [catch {execsql [subst { DROP TABLE t1; CREATE TABLE t1(a,b,c NOT NULL $conf1 DEFAULT 5); DELETE FROM t2; BEGIN $conf2; INSERT INTO t2 VALUES(1); $cmd INTO t1 VALUES(1,2,NULL); }]} r1] catch {execsql {COMMIT}} if {!$r0} {set r1 [execsql {SELECT c FROM t1}]} set r2 [execsql {SELECT x FROM t2}] list $r0 $r1 $r2 } [list $t0 $t1 $t2]}do_test conflict-6.0 { execsql { DROP TABLE t2; CREATE TABLE t2(a,b,c); INSERT INTO t2 VALUES(1,2,1); INSERT INTO t2 VALUES(2,3,2); INSERT INTO t2 VALUES(3,4,1); INSERT INTO t2 VALUES(4,5,4); SELECT c FROM t2 ORDER BY b; CREATE TABLE t3(x); INSERT INTO t3 VALUES(1); }} {1 2 1 4}# Six columns of configuration data as follows:## i The reference number of the test# conf1 The conflict resolution algorithm on the UNIQUE constraint# conf2 The conflict resolution algorithm on the BEGIN statement# cmd An UPDATE command to execute against table t1# t0 True if there is an error from $cmd# t1 Content of "b" column of t1 assuming no error in $cmd# t2 Content of "x" column of t3#foreach {i conf1 conf2 cmd t0 t1 t2} { 1 {} {} UPDATE 1 {6 7 8 9} 1 2 REPLACE {} UPDATE 0 {7 6 9} 1 3 IGNORE {} UPDATE 0 {6 7 3 9} 1 4 FAIL {} UPDATE 1 {6 7 3 4} 1 5 ABORT {} UPDATE 1 {1 2 3 4} 1 6 ROLLBACK {} UPDATE 1 {1 2 3 4} 0 7 REPLACE {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 8 IGNORE {} {UPDATE OR REPLACE} 0 {7 6 9} 1 9 FAIL {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 10 ABORT {} {UPDATE OR REPLACE} 0 {7 6 9} 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -