1bb37fdc7Sdrh# 2002 January 29 2bb37fdc7Sdrh# 3bb37fdc7Sdrh# The author disclaims copyright to this source code. In place of 4bb37fdc7Sdrh# a legal notice, here is a blessing: 5bb37fdc7Sdrh# 6bb37fdc7Sdrh# May you do good and not evil. 7bb37fdc7Sdrh# May you find forgiveness for yourself and forgive others. 8bb37fdc7Sdrh# May you share freely, never taking more than you give. 9bb37fdc7Sdrh# 10bb37fdc7Sdrh#*********************************************************************** 11bb37fdc7Sdrh# This file implements regression tests for SQLite library. 12bb37fdc7Sdrh# 13bb37fdc7Sdrh# This file implements tests for the conflict resolution extension 14bb37fdc7Sdrh# to SQLite. 15bb37fdc7Sdrh# 16*1e9daa6aSdrh# $Id: conflict.test,v 1.29 2007/04/06 21:42:22 drh Exp $ 17bb37fdc7Sdrh 18bb37fdc7Sdrhset testdir [file dirname $argv0] 19bb37fdc7Sdrhsource $testdir/tester.tcl 20bb37fdc7Sdrh 213bdca9c9Sdanielk1977ifcapable !conflict { 223bdca9c9Sdanielk1977 finish_test 233bdca9c9Sdanielk1977 return 243bdca9c9Sdanielk1977} 253bdca9c9Sdanielk1977 260d65dc0eSdrh# Create tables for the first group of tests. 27bb37fdc7Sdrh# 280d65dc0eSdrhdo_test conflict-1.0 { 29bb37fdc7Sdrh execsql { 30bb37fdc7Sdrh CREATE TABLE t1(a, b, c, UNIQUE(a,b)); 310d65dc0eSdrh CREATE TABLE t2(x); 32bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 33bb37fdc7Sdrh } 340d65dc0eSdrh} {} 35bb37fdc7Sdrh 360d65dc0eSdrh# Six columns of configuration data as follows: 370d65dc0eSdrh# 380d65dc0eSdrh# i The reference number of the test 390d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 400d65dc0eSdrh# t0 True if there is an error from $cmd 410d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 420d65dc0eSdrh# t2 Content of "x" column of t2 43af6df11fSdrh# t3 Number of temporary files created by this test 440d65dc0eSdrh# 45af6df11fSdrhforeach {i cmd t0 t1 t2 t3} { 46af6df11fSdrh 1 INSERT 1 {} 1 0 47af6df11fSdrh 2 {INSERT OR IGNORE} 0 3 1 0 48af6df11fSdrh 3 {INSERT OR REPLACE} 0 4 1 0 49af6df11fSdrh 4 REPLACE 0 4 1 0 50af6df11fSdrh 5 {INSERT OR FAIL} 1 {} 1 0 51af6df11fSdrh 6 {INSERT OR ABORT} 1 {} 1 0 52af6df11fSdrh 7 {INSERT OR ROLLBACK} 1 {} {} 0 530d65dc0eSdrh} { 540d65dc0eSdrh do_test conflict-1.$i { 55af6df11fSdrh set ::sqlite_opentemp_count 0 560d65dc0eSdrh set r0 [catch {execsql [subst { 57bb37fdc7Sdrh DELETE FROM t1; 580d65dc0eSdrh DELETE FROM t2; 59bb37fdc7Sdrh INSERT INTO t1 VALUES(1,2,3); 60af6df11fSdrh BEGIN; 610d65dc0eSdrh INSERT INTO t2 VALUES(1); 620d65dc0eSdrh $cmd INTO t1 VALUES(1,2,4); 630d65dc0eSdrh }]} r1] 646b8b8749Sdrh catch {execsql {COMMIT}} 650d65dc0eSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 660d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 67af6df11fSdrh set r3 $::sqlite_opentemp_count 68af6df11fSdrh list $r0 $r1 $r2 $r3 69af6df11fSdrh } [list $t0 $t1 $t2 $t3] 70bb37fdc7Sdrh} 71bb37fdc7Sdrh 720d65dc0eSdrh# Create tables for the first group of tests. 730d65dc0eSdrh# 740d65dc0eSdrhdo_test conflict-2.0 { 75ef6764a1Sdrh execsql { 76ef6764a1Sdrh DROP TABLE t1; 77ef6764a1Sdrh DROP TABLE t2; 780d65dc0eSdrh CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(a,b)); 790d65dc0eSdrh CREATE TABLE t2(x); 80ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 81ef6764a1Sdrh } 820d65dc0eSdrh} {} 83ef6764a1Sdrh 840d65dc0eSdrh# Six columns of configuration data as follows: 850d65dc0eSdrh# 860d65dc0eSdrh# i The reference number of the test 870d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 880d65dc0eSdrh# t0 True if there is an error from $cmd 890d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 900d65dc0eSdrh# t2 Content of "x" column of t2 910d65dc0eSdrh# 92af6df11fSdrhforeach {i cmd t0 t1 t2} { 93af6df11fSdrh 1 INSERT 1 {} 1 94af6df11fSdrh 2 {INSERT OR IGNORE} 0 3 1 95af6df11fSdrh 3 {INSERT OR REPLACE} 0 4 1 96af6df11fSdrh 4 REPLACE 0 4 1 97af6df11fSdrh 5 {INSERT OR FAIL} 1 {} 1 98af6df11fSdrh 6 {INSERT OR ABORT} 1 {} 1 99af6df11fSdrh 7 {INSERT OR ROLLBACK} 1 {} {} 1000d65dc0eSdrh} { 1010d65dc0eSdrh do_test conflict-2.$i { 1020d65dc0eSdrh set r0 [catch {execsql [subst { 103ef6764a1Sdrh DELETE FROM t1; 1040d65dc0eSdrh DELETE FROM t2; 105ef6764a1Sdrh INSERT INTO t1 VALUES(1,2,3); 106af6df11fSdrh BEGIN; 1070d65dc0eSdrh INSERT INTO t2 VALUES(1); 1080d65dc0eSdrh $cmd INTO t1 VALUES(1,2,4); 1090d65dc0eSdrh }]} r1] 1106b8b8749Sdrh catch {execsql {COMMIT}} 1110d65dc0eSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 1120d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 1130d65dc0eSdrh list $r0 $r1 $r2 1140d65dc0eSdrh } [list $t0 $t1 $t2] 115ef6764a1Sdrh} 1160d65dc0eSdrh 1170d65dc0eSdrh# Create tables for the first group of tests. 1180d65dc0eSdrh# 1190d65dc0eSdrhdo_test conflict-3.0 { 1200d65dc0eSdrh execsql { 1210d65dc0eSdrh DROP TABLE t1; 1220d65dc0eSdrh DROP TABLE t2; 123e0194f2bSdrh CREATE TABLE t1(a, b, c INTEGER, PRIMARY KEY(c), UNIQUE(a,b)); 1240d65dc0eSdrh CREATE TABLE t2(x); 125ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 126ef6764a1Sdrh } 1270d65dc0eSdrh} {} 1280d65dc0eSdrh 1290d65dc0eSdrh# Six columns of configuration data as follows: 1300d65dc0eSdrh# 1310d65dc0eSdrh# i The reference number of the test 1320d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 1330d65dc0eSdrh# t0 True if there is an error from $cmd 1340d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 1350d65dc0eSdrh# t2 Content of "x" column of t2 1360d65dc0eSdrh# 137af6df11fSdrhforeach {i cmd t0 t1 t2} { 138af6df11fSdrh 1 INSERT 1 {} 1 139af6df11fSdrh 2 {INSERT OR IGNORE} 0 3 1 140af6df11fSdrh 3 {INSERT OR REPLACE} 0 4 1 141af6df11fSdrh 4 REPLACE 0 4 1 142af6df11fSdrh 5 {INSERT OR FAIL} 1 {} 1 143af6df11fSdrh 6 {INSERT OR ABORT} 1 {} 1 144af6df11fSdrh 7 {INSERT OR ROLLBACK} 1 {} {} 1450d65dc0eSdrh} { 1460d65dc0eSdrh do_test conflict-3.$i { 1470d65dc0eSdrh set r0 [catch {execsql [subst { 1480d65dc0eSdrh DELETE FROM t1; 1490d65dc0eSdrh DELETE FROM t2; 1500d65dc0eSdrh INSERT INTO t1 VALUES(1,2,3); 151af6df11fSdrh BEGIN; 1520d65dc0eSdrh INSERT INTO t2 VALUES(1); 1530d65dc0eSdrh $cmd INTO t1 VALUES(1,2,4); 1540d65dc0eSdrh }]} r1] 1556b8b8749Sdrh catch {execsql {COMMIT}} 1560d65dc0eSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 1570d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 1580d65dc0eSdrh list $r0 $r1 $r2 1590d65dc0eSdrh } [list $t0 $t1 $t2] 160ef6764a1Sdrh} 1610d65dc0eSdrh 1620d65dc0eSdrhdo_test conflict-4.0 { 1630d65dc0eSdrh execsql { 1640d65dc0eSdrh DROP TABLE t2; 1650d65dc0eSdrh CREATE TABLE t2(x); 1660d65dc0eSdrh SELECT x FROM t2; 167ef6764a1Sdrh } 1680d65dc0eSdrh} {} 1690d65dc0eSdrh 1700d65dc0eSdrh# Six columns of configuration data as follows: 1710d65dc0eSdrh# 1720d65dc0eSdrh# i The reference number of the test 1730d65dc0eSdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 1740d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 1750d65dc0eSdrh# t0 True if there is an error from $cmd 1760d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 1770d65dc0eSdrh# t2 Content of "x" column of t2 1780d65dc0eSdrh# 179af6df11fSdrhforeach {i conf1 cmd t0 t1 t2} { 180af6df11fSdrh 1 {} INSERT 1 {} 1 181af6df11fSdrh 2 REPLACE INSERT 0 4 1 182af6df11fSdrh 3 IGNORE INSERT 0 3 1 183af6df11fSdrh 4 FAIL INSERT 1 {} 1 184af6df11fSdrh 5 ABORT INSERT 1 {} 1 185af6df11fSdrh 6 ROLLBACK INSERT 1 {} {} 186af6df11fSdrh 7 REPLACE {INSERT OR IGNORE} 0 3 1 187af6df11fSdrh 8 IGNORE {INSERT OR REPLACE} 0 4 1 188af6df11fSdrh 9 FAIL {INSERT OR IGNORE} 0 3 1 189af6df11fSdrh 10 ABORT {INSERT OR REPLACE} 0 4 1 190af6df11fSdrh 11 ROLLBACK {INSERT OR IGNORE } 0 3 1 1910d65dc0eSdrh} { 1920d65dc0eSdrh do_test conflict-4.$i { 1930d65dc0eSdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 1940d65dc0eSdrh set r0 [catch {execsql [subst { 1950d65dc0eSdrh DROP TABLE t1; 1960d65dc0eSdrh CREATE TABLE t1(a,b,c,UNIQUE(a,b) $conf1); 1970d65dc0eSdrh DELETE FROM t2; 1980d65dc0eSdrh INSERT INTO t1 VALUES(1,2,3); 199af6df11fSdrh BEGIN; 2000d65dc0eSdrh INSERT INTO t2 VALUES(1); 2010d65dc0eSdrh $cmd INTO t1 VALUES(1,2,4); 2020d65dc0eSdrh }]} r1] 2036b8b8749Sdrh catch {execsql {COMMIT}} 2040d65dc0eSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 2050d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 2060d65dc0eSdrh list $r0 $r1 $r2 2070d65dc0eSdrh } [list $t0 $t1 $t2] 208ef6764a1Sdrh} 2090d65dc0eSdrh 2100d65dc0eSdrhdo_test conflict-5.0 { 2110d65dc0eSdrh execsql { 2120d65dc0eSdrh DROP TABLE t2; 2130d65dc0eSdrh CREATE TABLE t2(x); 2140d65dc0eSdrh SELECT x FROM t2; 2150d65dc0eSdrh } 2160d65dc0eSdrh} {} 2170d65dc0eSdrh 2180d65dc0eSdrh# Six columns of configuration data as follows: 2190d65dc0eSdrh# 2200d65dc0eSdrh# i The reference number of the test 2210d65dc0eSdrh# conf1 The conflict resolution algorithm on the NOT NULL constraint 2220d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 2230d65dc0eSdrh# t0 True if there is an error from $cmd 2240d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 2250d65dc0eSdrh# t2 Content of "x" column of t2 2260d65dc0eSdrh# 227af6df11fSdrhforeach {i conf1 cmd t0 t1 t2} { 228af6df11fSdrh 1 {} INSERT 1 {} 1 229af6df11fSdrh 2 REPLACE INSERT 0 5 1 230af6df11fSdrh 3 IGNORE INSERT 0 {} 1 231af6df11fSdrh 4 FAIL INSERT 1 {} 1 232af6df11fSdrh 5 ABORT INSERT 1 {} 1 233af6df11fSdrh 6 ROLLBACK INSERT 1 {} {} 234af6df11fSdrh 7 REPLACE {INSERT OR IGNORE} 0 {} 1 235af6df11fSdrh 8 IGNORE {INSERT OR REPLACE} 0 5 1 236af6df11fSdrh 9 FAIL {INSERT OR IGNORE} 0 {} 1 237af6df11fSdrh 10 ABORT {INSERT OR REPLACE} 0 5 1 238af6df11fSdrh 11 ROLLBACK {INSERT OR IGNORE} 0 {} 1 239af6df11fSdrh 12 {} {INSERT OR IGNORE} 0 {} 1 240af6df11fSdrh 13 {} {INSERT OR REPLACE} 0 5 1 241af6df11fSdrh 14 {} {INSERT OR FAIL} 1 {} 1 242af6df11fSdrh 15 {} {INSERT OR ABORT} 1 {} 1 243af6df11fSdrh 16 {} {INSERT OR ROLLBACK} 1 {} {} 2440d65dc0eSdrh} { 245483750baSdrh if {$t0} {set t1 {t1.c may not be NULL}} 2460d65dc0eSdrh do_test conflict-5.$i { 2470d65dc0eSdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 2480d65dc0eSdrh set r0 [catch {execsql [subst { 2490d65dc0eSdrh DROP TABLE t1; 2500d65dc0eSdrh CREATE TABLE t1(a,b,c NOT NULL $conf1 DEFAULT 5); 2510d65dc0eSdrh DELETE FROM t2; 252af6df11fSdrh BEGIN; 2530d65dc0eSdrh INSERT INTO t2 VALUES(1); 2540d65dc0eSdrh $cmd INTO t1 VALUES(1,2,NULL); 2550d65dc0eSdrh }]} r1] 2566b8b8749Sdrh catch {execsql {COMMIT}} 2570d65dc0eSdrh if {!$r0} {set r1 [execsql {SELECT c FROM t1}]} 2580d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 2590d65dc0eSdrh list $r0 $r1 $r2 2600d65dc0eSdrh } [list $t0 $t1 $t2] 2610d65dc0eSdrh} 2620d65dc0eSdrh 2630d65dc0eSdrhdo_test conflict-6.0 { 2640d65dc0eSdrh execsql { 2650d65dc0eSdrh DROP TABLE t2; 2660d65dc0eSdrh CREATE TABLE t2(a,b,c); 2670d65dc0eSdrh INSERT INTO t2 VALUES(1,2,1); 2680d65dc0eSdrh INSERT INTO t2 VALUES(2,3,2); 2690d65dc0eSdrh INSERT INTO t2 VALUES(3,4,1); 2700d65dc0eSdrh INSERT INTO t2 VALUES(4,5,4); 2710d65dc0eSdrh SELECT c FROM t2 ORDER BY b; 2720d65dc0eSdrh CREATE TABLE t3(x); 2730d65dc0eSdrh INSERT INTO t3 VALUES(1); 2740d65dc0eSdrh } 2750d65dc0eSdrh} {1 2 1 4} 2760d65dc0eSdrh 2770d65dc0eSdrh# Six columns of configuration data as follows: 2780d65dc0eSdrh# 2790d65dc0eSdrh# i The reference number of the test 2800d65dc0eSdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 2810d65dc0eSdrh# cmd An UPDATE command to execute against table t1 2820d65dc0eSdrh# t0 True if there is an error from $cmd 2830d65dc0eSdrh# t1 Content of "b" column of t1 assuming no error in $cmd 2840d65dc0eSdrh# t2 Content of "x" column of t3 285*1e9daa6aSdrh# t3 Number of temporary files for tables 286*1e9daa6aSdrh# t4 Number of temporary files for statement journals 2870d65dc0eSdrh# 288*1e9daa6aSdrhforeach {i conf1 cmd t0 t1 t2 t3 t4} { 289*1e9daa6aSdrh 1 {} UPDATE 1 {6 7 8 9} 1 0 1 290*1e9daa6aSdrh 2 REPLACE UPDATE 0 {7 6 9} 1 1 0 291*1e9daa6aSdrh 3 IGNORE UPDATE 0 {6 7 3 9} 1 1 0 292*1e9daa6aSdrh 4 FAIL UPDATE 1 {6 7 3 4} 1 0 0 293*1e9daa6aSdrh 5 ABORT UPDATE 1 {1 2 3 4} 1 0 1 294*1e9daa6aSdrh 6 ROLLBACK UPDATE 1 {1 2 3 4} 0 0 0 295*1e9daa6aSdrh 7 REPLACE {UPDATE OR IGNORE} 0 {6 7 3 9} 1 1 0 296*1e9daa6aSdrh 8 IGNORE {UPDATE OR REPLACE} 0 {7 6 9} 1 1 0 297*1e9daa6aSdrh 9 FAIL {UPDATE OR IGNORE} 0 {6 7 3 9} 1 1 0 298*1e9daa6aSdrh 10 ABORT {UPDATE OR REPLACE} 0 {7 6 9} 1 1 0 299*1e9daa6aSdrh 11 ROLLBACK {UPDATE OR IGNORE} 0 {6 7 3 9} 1 1 0 300*1e9daa6aSdrh 12 {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 1 0 301*1e9daa6aSdrh 13 {} {UPDATE OR REPLACE} 0 {7 6 9} 1 1 0 302*1e9daa6aSdrh 14 {} {UPDATE OR FAIL} 1 {6 7 3 4} 1 0 0 303*1e9daa6aSdrh 15 {} {UPDATE OR ABORT} 1 {1 2 3 4} 1 0 1 304*1e9daa6aSdrh 16 {} {UPDATE OR ROLLBACK} 1 {1 2 3 4} 0 0 0 3050d65dc0eSdrh} { 30637ed48edSdrh if {$t0} {set t1 {column a is not unique}} 307*1e9daa6aSdrh if {[info exists TEMP_STORE] && $TEMP_STORE>=2} { 308*1e9daa6aSdrh set t3 $t4 309*1e9daa6aSdrh } else { 310*1e9daa6aSdrh set t3 [expr {$t3+$t4}] 311*1e9daa6aSdrh } 3120d65dc0eSdrh do_test conflict-6.$i { 313af6df11fSdrh db close 314af6df11fSdrh sqlite3 db test.db 3150d65dc0eSdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 316abec0beeSdrh execsql {pragma temp_store=file} 317af6df11fSdrh set ::sqlite_opentemp_count 0 3180d65dc0eSdrh set r0 [catch {execsql [subst { 3190d65dc0eSdrh DROP TABLE t1; 3200d65dc0eSdrh CREATE TABLE t1(a,b,c, UNIQUE(a) $conf1); 3210d65dc0eSdrh INSERT INTO t1 SELECT * FROM t2; 3220d65dc0eSdrh UPDATE t3 SET x=0; 323af6df11fSdrh BEGIN; 3240d65dc0eSdrh $cmd t3 SET x=1; 3251dd397f0Sdrh $cmd t1 SET b=b*2; 3260d65dc0eSdrh $cmd t1 SET a=c+5; 3270d65dc0eSdrh }]} r1] 3286b8b8749Sdrh catch {execsql {COMMIT}} 3290d65dc0eSdrh if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]} 3300d65dc0eSdrh set r2 [execsql {SELECT x FROM t3}] 331af6df11fSdrh list $r0 $r1 $r2 $::sqlite_opentemp_count 332af6df11fSdrh } [list $t0 $t1 $t2 $t3] 3330d65dc0eSdrh} 334ef6764a1Sdrh 335fe1a1773Sdrh# Test to make sure a lot of IGNOREs don't cause a stack overflow 336fe1a1773Sdrh# 337fe1a1773Sdrhdo_test conflict-7.1 { 338fe1a1773Sdrh execsql { 339fe1a1773Sdrh DROP TABLE t1; 340fe1a1773Sdrh DROP TABLE t2; 341fe1a1773Sdrh DROP TABLE t3; 342fe1a1773Sdrh CREATE TABLE t1(a unique, b); 343fe1a1773Sdrh } 344fe1a1773Sdrh for {set i 1} {$i<=50} {incr i} { 345fe1a1773Sdrh execsql "INSERT into t1 values($i,[expr {$i+1}]);" 346fe1a1773Sdrh } 347fe1a1773Sdrh execsql { 348fe1a1773Sdrh SELECT count(*), min(a), max(b) FROM t1; 349fe1a1773Sdrh } 350fe1a1773Sdrh} {50 1 51} 351fe1a1773Sdrhdo_test conflict-7.2 { 352fe1a1773Sdrh execsql { 353fe1a1773Sdrh PRAGMA count_changes=on; 354fe1a1773Sdrh UPDATE OR IGNORE t1 SET a=1000; 355fe1a1773Sdrh } 356fe1a1773Sdrh} {1} 357c8d30ac1Sdrhdo_test conflict-7.2.1 { 358c8d30ac1Sdrh db changes 359c8d30ac1Sdrh} {1} 360fe1a1773Sdrhdo_test conflict-7.3 { 361fe1a1773Sdrh execsql { 362fe1a1773Sdrh SELECT b FROM t1 WHERE a=1000; 363fe1a1773Sdrh } 364fe1a1773Sdrh} {2} 365fe1a1773Sdrhdo_test conflict-7.4 { 366fe1a1773Sdrh execsql { 367fe1a1773Sdrh SELECT count(*) FROM t1; 368fe1a1773Sdrh } 369fe1a1773Sdrh} {50} 370fe1a1773Sdrhdo_test conflict-7.5 { 371fe1a1773Sdrh execsql { 372fe1a1773Sdrh PRAGMA count_changes=on; 373fe1a1773Sdrh UPDATE OR REPLACE t1 SET a=1001; 374fe1a1773Sdrh } 375fe1a1773Sdrh} {50} 376c8d30ac1Sdrhdo_test conflict-7.5.1 { 377c8d30ac1Sdrh db changes 378c8d30ac1Sdrh} {50} 379fe1a1773Sdrhdo_test conflict-7.6 { 380fe1a1773Sdrh execsql { 381fe1a1773Sdrh SELECT b FROM t1 WHERE a=1001; 382fe1a1773Sdrh } 383fe1a1773Sdrh} {51} 384fe1a1773Sdrhdo_test conflict-7.7 { 385fe1a1773Sdrh execsql { 386fe1a1773Sdrh SELECT count(*) FROM t1; 387fe1a1773Sdrh } 388fe1a1773Sdrh} {1} 389b28af71aSdanielk1977 390b28af71aSdanielk1977# Update for version 3: A SELECT statement no longer resets the change 391b28af71aSdanielk1977# counter (Test result changes from 0 to 50). 392c8d30ac1Sdrhdo_test conflict-7.7.1 { 393c8d30ac1Sdrh db changes 394b28af71aSdanielk1977} {50} 395fe1a1773Sdrh 396feeb1394Sdrh# Make sure the row count is right for rows that are ignored on 397feeb1394Sdrh# an insert. 398feeb1394Sdrh# 399feeb1394Sdrhdo_test conflict-8.1 { 400feeb1394Sdrh execsql { 401feeb1394Sdrh DELETE FROM t1; 402feeb1394Sdrh INSERT INTO t1 VALUES(1,2); 403feeb1394Sdrh } 404feeb1394Sdrh execsql { 405feeb1394Sdrh INSERT OR IGNORE INTO t1 VALUES(2,3); 406feeb1394Sdrh } 407feeb1394Sdrh} {1} 408c8d30ac1Sdrhdo_test conflict-8.1.1 { 409c8d30ac1Sdrh db changes 410c8d30ac1Sdrh} {1} 411feeb1394Sdrhdo_test conflict-8.2 { 412feeb1394Sdrh execsql { 413feeb1394Sdrh INSERT OR IGNORE INTO t1 VALUES(2,4); 414feeb1394Sdrh } 415feeb1394Sdrh} {0} 416c8d30ac1Sdrhdo_test conflict-8.2.1 { 417c8d30ac1Sdrh db changes 418c8d30ac1Sdrh} {0} 419feeb1394Sdrhdo_test conflict-8.3 { 420feeb1394Sdrh execsql { 421feeb1394Sdrh INSERT OR REPLACE INTO t1 VALUES(2,4); 422feeb1394Sdrh } 423feeb1394Sdrh} {1} 424c8d30ac1Sdrhdo_test conflict-8.3.1 { 425c8d30ac1Sdrh db changes 426c8d30ac1Sdrh} {1} 427feeb1394Sdrhdo_test conflict-8.4 { 428feeb1394Sdrh execsql { 429feeb1394Sdrh INSERT OR IGNORE INTO t1 SELECT * FROM t1; 430feeb1394Sdrh } 431feeb1394Sdrh} {0} 432c8d30ac1Sdrhdo_test conflict-8.4.1 { 433c8d30ac1Sdrh db changes 434c8d30ac1Sdrh} {0} 435feeb1394Sdrhdo_test conflict-8.5 { 436feeb1394Sdrh execsql { 437feeb1394Sdrh INSERT OR IGNORE INTO t1 SELECT a+2,b+2 FROM t1; 438feeb1394Sdrh } 439feeb1394Sdrh} {2} 440c8d30ac1Sdrhdo_test conflict-8.5.1 { 441c8d30ac1Sdrh db changes 442c8d30ac1Sdrh} {2} 443feeb1394Sdrhdo_test conflict-8.6 { 444feeb1394Sdrh execsql { 445feeb1394Sdrh INSERT OR IGNORE INTO t1 SELECT a+3,b+3 FROM t1; 446feeb1394Sdrh } 447feeb1394Sdrh} {3} 448c8d30ac1Sdrhdo_test conflict-8.6.1 { 449c8d30ac1Sdrh db changes 450c8d30ac1Sdrh} {3} 451fe1a1773Sdrh 4523b167c75Sdrhintegrity_check conflict-8.99 4533b167c75Sdrh 4543b167c75Sdrhdo_test conflict-9.1 { 4553b167c75Sdrh execsql { 4563b167c75Sdrh PRAGMA count_changes=0; 4573b167c75Sdrh CREATE TABLE t2( 4583b167c75Sdrh a INTEGER UNIQUE ON CONFLICT IGNORE, 4593b167c75Sdrh b INTEGER UNIQUE ON CONFLICT FAIL, 4603b167c75Sdrh c INTEGER UNIQUE ON CONFLICT REPLACE, 4613b167c75Sdrh d INTEGER UNIQUE ON CONFLICT ABORT, 4623b167c75Sdrh e INTEGER UNIQUE ON CONFLICT ROLLBACK 4633b167c75Sdrh ); 4643b167c75Sdrh CREATE TABLE t3(x); 4653b167c75Sdrh INSERT INTO t3 VALUES(1); 4663b167c75Sdrh SELECT * FROM t3; 4673b167c75Sdrh } 4683b167c75Sdrh} {1} 4693b167c75Sdrhdo_test conflict-9.2 { 4703b167c75Sdrh catchsql { 4713b167c75Sdrh INSERT INTO t2 VALUES(1,1,1,1,1); 4723b167c75Sdrh INSERT INTO t2 VALUES(2,2,2,2,2); 4733b167c75Sdrh SELECT * FROM t2; 4743b167c75Sdrh } 4753b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 4763b167c75Sdrhdo_test conflict-9.3 { 4773b167c75Sdrh catchsql { 4783b167c75Sdrh INSERT INTO t2 VALUES(1,3,3,3,3); 4793b167c75Sdrh SELECT * FROM t2; 4803b167c75Sdrh } 4813b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 4823b167c75Sdrhdo_test conflict-9.4 { 4833b167c75Sdrh catchsql { 4843b167c75Sdrh UPDATE t2 SET a=a+1 WHERE a=1; 4853b167c75Sdrh SELECT * FROM t2; 4863b167c75Sdrh } 4873b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 4883b167c75Sdrhdo_test conflict-9.5 { 4893b167c75Sdrh catchsql { 4903b167c75Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 4913b167c75Sdrh SELECT * FROM t2; 4923b167c75Sdrh } 49337ed48edSdrh} {1 {column b is not unique}} 4943b167c75Sdrhdo_test conflict-9.6 { 4953b167c75Sdrh catchsql { 4963b167c75Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 4973b167c75Sdrh SELECT * FROM t2; 4983b167c75Sdrh } 49937ed48edSdrh} {1 {column b is not unique}} 5003b167c75Sdrhdo_test conflict-9.7 { 5013b167c75Sdrh catchsql { 5023b167c75Sdrh BEGIN; 5033b167c75Sdrh UPDATE t3 SET x=x+1; 5043b167c75Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 5053b167c75Sdrh SELECT * FROM t2; 5063b167c75Sdrh } 50737ed48edSdrh} {1 {column b is not unique}} 5083b167c75Sdrhdo_test conflict-9.8 { 5093b167c75Sdrh execsql {COMMIT} 5103b167c75Sdrh execsql {SELECT * FROM t3} 5113b167c75Sdrh} {2} 512483750baSdrhdo_test conflict-9.9 { 5133b167c75Sdrh catchsql { 5143b167c75Sdrh BEGIN; 5153b167c75Sdrh UPDATE t3 SET x=x+1; 5163b167c75Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 5173b167c75Sdrh SELECT * FROM t2; 5183b167c75Sdrh } 51937ed48edSdrh} {1 {column b is not unique}} 5203b167c75Sdrhdo_test conflict-9.10 { 5213b167c75Sdrh execsql {COMMIT} 5223b167c75Sdrh execsql {SELECT * FROM t3} 5233b167c75Sdrh} {3} 5243b167c75Sdrhdo_test conflict-9.11 { 5253b167c75Sdrh catchsql { 5263b167c75Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 5273b167c75Sdrh SELECT * FROM t2; 5283b167c75Sdrh } 52937ed48edSdrh} {1 {column d is not unique}} 5303b167c75Sdrhdo_test conflict-9.12 { 5313b167c75Sdrh catchsql { 5323b167c75Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 5333b167c75Sdrh SELECT * FROM t2; 5343b167c75Sdrh } 53537ed48edSdrh} {1 {column d is not unique}} 5363b167c75Sdrhdo_test conflict-9.13 { 5373b167c75Sdrh catchsql { 5383b167c75Sdrh BEGIN; 5393b167c75Sdrh UPDATE t3 SET x=x+1; 5403b167c75Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 5413b167c75Sdrh SELECT * FROM t2; 5423b167c75Sdrh } 54337ed48edSdrh} {1 {column d is not unique}} 5443b167c75Sdrhdo_test conflict-9.14 { 5453b167c75Sdrh execsql {COMMIT} 5463b167c75Sdrh execsql {SELECT * FROM t3} 5473b167c75Sdrh} {4} 5483b167c75Sdrhdo_test conflict-9.15 { 5493b167c75Sdrh catchsql { 5503b167c75Sdrh BEGIN; 5513b167c75Sdrh UPDATE t3 SET x=x+1; 5523b167c75Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 5533b167c75Sdrh SELECT * FROM t2; 5543b167c75Sdrh } 55537ed48edSdrh} {1 {column d is not unique}} 5563b167c75Sdrhdo_test conflict-9.16 { 5573b167c75Sdrh execsql {COMMIT} 5583b167c75Sdrh execsql {SELECT * FROM t3} 5593b167c75Sdrh} {5} 5603b167c75Sdrhdo_test conflict-9.17 { 5613b167c75Sdrh catchsql { 5623b167c75Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 5633b167c75Sdrh SELECT * FROM t2; 5643b167c75Sdrh } 56537ed48edSdrh} {1 {column e is not unique}} 5663b167c75Sdrhdo_test conflict-9.18 { 5673b167c75Sdrh catchsql { 5683b167c75Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 5693b167c75Sdrh SELECT * FROM t2; 5703b167c75Sdrh } 57137ed48edSdrh} {1 {column e is not unique}} 5723b167c75Sdrhdo_test conflict-9.19 { 5733b167c75Sdrh catchsql { 5743b167c75Sdrh BEGIN; 5753b167c75Sdrh UPDATE t3 SET x=x+1; 5763b167c75Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 5773b167c75Sdrh SELECT * FROM t2; 5783b167c75Sdrh } 57937ed48edSdrh} {1 {column e is not unique}} 5803b167c75Sdrhdo_test conflict-9.20 { 5816b8b8749Sdrh catch {execsql {COMMIT}} 5823b167c75Sdrh execsql {SELECT * FROM t3} 5833b167c75Sdrh} {5} 5843b167c75Sdrhdo_test conflict-9.21 { 5853b167c75Sdrh catchsql { 5863b167c75Sdrh BEGIN; 5873b167c75Sdrh UPDATE t3 SET x=x+1; 5883b167c75Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 5893b167c75Sdrh SELECT * FROM t2; 5903b167c75Sdrh } 59137ed48edSdrh} {1 {column e is not unique}} 5923b167c75Sdrhdo_test conflict-9.22 { 5936b8b8749Sdrh catch {execsql {COMMIT}} 5943b167c75Sdrh execsql {SELECT * FROM t3} 5953b167c75Sdrh} {5} 5963b167c75Sdrhdo_test conflict-9.23 { 5973b167c75Sdrh catchsql { 5983b167c75Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 5993b167c75Sdrh SELECT * FROM t2; 6003b167c75Sdrh } 6013b167c75Sdrh} {0 {2 2 2 2 2 3 3 1 3 3}} 6023b167c75Sdrhdo_test conflict-9.24 { 6033b167c75Sdrh catchsql { 6043b167c75Sdrh UPDATE t2 SET c=c-1 WHERE c=2; 6053b167c75Sdrh SELECT * FROM t2; 6063b167c75Sdrh } 6073b167c75Sdrh} {0 {2 2 1 2 2}} 6083b167c75Sdrhdo_test conflict-9.25 { 6093b167c75Sdrh catchsql { 6103b167c75Sdrh BEGIN; 6113b167c75Sdrh UPDATE t3 SET x=x+1; 6123b167c75Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 6133b167c75Sdrh SELECT * FROM t2; 6143b167c75Sdrh } 6153b167c75Sdrh} {0 {3 3 1 3 3}} 6163b167c75Sdrhdo_test conflict-9.26 { 6176b8b8749Sdrh catch {execsql {COMMIT}} 6183b167c75Sdrh execsql {SELECT * FROM t3} 6193b167c75Sdrh} {6} 620bb37fdc7Sdrh 621a996e477Sdrhdo_test conflict-10.1 { 622a996e477Sdrh catchsql { 623a996e477Sdrh DELETE FROM t1; 62433752f8aSdanielk1977 BEGIN; 62533752f8aSdanielk1977 INSERT OR ROLLBACK INTO t1 VALUES(1,2); 62633752f8aSdanielk1977 INSERT OR ROLLBACK INTO t1 VALUES(1,3); 627a996e477Sdrh COMMIT; 628a996e477Sdrh } 629a996e477Sdrh execsql {SELECT * FROM t1} 630a996e477Sdrh} {} 631a996e477Sdrhdo_test conflict-10.2 { 632a996e477Sdrh catchsql { 633a996e477Sdrh CREATE TABLE t4(x); 634a996e477Sdrh CREATE UNIQUE INDEX t4x ON t4(x); 63533752f8aSdanielk1977 BEGIN; 63633752f8aSdanielk1977 INSERT OR ROLLBACK INTO t4 VALUES(1); 63733752f8aSdanielk1977 INSERT OR ROLLBACK INTO t4 VALUES(1); 638a996e477Sdrh COMMIT; 639a996e477Sdrh } 640a996e477Sdrh execsql {SELECT * FROM t4} 641a996e477Sdrh} {} 642a996e477Sdrh 64341712ef1Sdrh# Ticket #1171. Make sure statement rollbacks do not 64441712ef1Sdrh# damage the database. 64541712ef1Sdrh# 64641712ef1Sdrhdo_test conflict-11.1 { 64741712ef1Sdrh execsql { 64841712ef1Sdrh -- Create a database object (pages 2, 3 of the file) 64941712ef1Sdrh BEGIN; 65041712ef1Sdrh CREATE TABLE abc(a UNIQUE, b, c); 65141712ef1Sdrh INSERT INTO abc VALUES(1, 2, 3); 65241712ef1Sdrh INSERT INTO abc VALUES(4, 5, 6); 65341712ef1Sdrh INSERT INTO abc VALUES(7, 8, 9); 65441712ef1Sdrh COMMIT; 65541712ef1Sdrh } 65641712ef1Sdrh 65741712ef1Sdrh 65841712ef1Sdrh # Set a small cache size so that changes will spill into 65941712ef1Sdrh # the database file. 66041712ef1Sdrh execsql { 66141712ef1Sdrh PRAGMA cache_size = 10; 66241712ef1Sdrh } 66341712ef1Sdrh 66441712ef1Sdrh # Make lots of changes. Because of the small cache, some 66541712ef1Sdrh # (most?) of these changes will spill into the disk file. 66641712ef1Sdrh # In other words, some of the changes will not be held in 66741712ef1Sdrh # cache. 66841712ef1Sdrh # 66941712ef1Sdrh execsql { 67041712ef1Sdrh BEGIN; 67141712ef1Sdrh -- Make sure the pager is in EXCLUSIVE state. 67241712ef1Sdrh CREATE TABLE def(d, e, f); 67341712ef1Sdrh INSERT INTO def VALUES 67441712ef1Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 67541712ef1Sdrh INSERT INTO def SELECT * FROM def; 67641712ef1Sdrh INSERT INTO def SELECT * FROM def; 67741712ef1Sdrh INSERT INTO def SELECT * FROM def; 67841712ef1Sdrh INSERT INTO def SELECT * FROM def; 67941712ef1Sdrh INSERT INTO def SELECT * FROM def; 68041712ef1Sdrh INSERT INTO def SELECT * FROM def; 68141712ef1Sdrh INSERT INTO def SELECT * FROM def; 68241712ef1Sdrh DELETE FROM abc WHERE a = 4; 68341712ef1Sdrh } 68441712ef1Sdrh 68541712ef1Sdrh # Execute a statement that does a statement rollback due to 68641712ef1Sdrh # a constraint failure. 68741712ef1Sdrh # 68841712ef1Sdrh catchsql { 68941712ef1Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 69041712ef1Sdrh } 69141712ef1Sdrh 69241712ef1Sdrh # Rollback the database. Verify that the state of the ABC table 69341712ef1Sdrh # is unchanged from the beginning of the transaction. In other words, 69441712ef1Sdrh # make sure the DELETE on table ABC that occurred within the transaction 69541712ef1Sdrh # had no effect. 69641712ef1Sdrh # 69741712ef1Sdrh execsql { 69841712ef1Sdrh ROLLBACK; 69941712ef1Sdrh SELECT * FROM abc; 70041712ef1Sdrh } 70141712ef1Sdrh} {1 2 3 4 5 6 7 8 9} 70241712ef1Sdrhintegrity_check conflict-11.2 70341712ef1Sdrh 70441712ef1Sdrh# Repeat test conflict-11.1 but this time commit. 70541712ef1Sdrh# 70641712ef1Sdrhdo_test conflict-11.3 { 70741712ef1Sdrh execsql { 70841712ef1Sdrh BEGIN; 70941712ef1Sdrh -- Make sure the pager is in EXCLUSIVE state. 71041712ef1Sdrh UPDATE abc SET a=a+1; 71141712ef1Sdrh CREATE TABLE def(d, e, f); 71241712ef1Sdrh INSERT INTO def VALUES 71341712ef1Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 71441712ef1Sdrh INSERT INTO def SELECT * FROM def; 71541712ef1Sdrh INSERT INTO def SELECT * FROM def; 71641712ef1Sdrh INSERT INTO def SELECT * FROM def; 71741712ef1Sdrh INSERT INTO def SELECT * FROM def; 71841712ef1Sdrh INSERT INTO def SELECT * FROM def; 71941712ef1Sdrh INSERT INTO def SELECT * FROM def; 72041712ef1Sdrh INSERT INTO def SELECT * FROM def; 72141712ef1Sdrh DELETE FROM abc WHERE a = 4; 72241712ef1Sdrh } 72341712ef1Sdrh catchsql { 72441712ef1Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 72541712ef1Sdrh } 72641712ef1Sdrh execsql { 72741712ef1Sdrh ROLLBACK; 72841712ef1Sdrh SELECT * FROM abc; 72941712ef1Sdrh } 73041712ef1Sdrh} {1 2 3 4 5 6 7 8 9} 73141712ef1Sdrh# Repeat test conflict-11.1 but this time commit. 73241712ef1Sdrh# 73341712ef1Sdrhdo_test conflict-11.5 { 73441712ef1Sdrh execsql { 73541712ef1Sdrh BEGIN; 73641712ef1Sdrh -- Make sure the pager is in EXCLUSIVE state. 73741712ef1Sdrh CREATE TABLE def(d, e, f); 73841712ef1Sdrh INSERT INTO def VALUES 73941712ef1Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 74041712ef1Sdrh INSERT INTO def SELECT * FROM def; 74141712ef1Sdrh INSERT INTO def SELECT * FROM def; 74241712ef1Sdrh INSERT INTO def SELECT * FROM def; 74341712ef1Sdrh INSERT INTO def SELECT * FROM def; 74441712ef1Sdrh INSERT INTO def SELECT * FROM def; 74541712ef1Sdrh INSERT INTO def SELECT * FROM def; 74641712ef1Sdrh INSERT INTO def SELECT * FROM def; 74741712ef1Sdrh DELETE FROM abc WHERE a = 4; 74841712ef1Sdrh } 74941712ef1Sdrh catchsql { 75041712ef1Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 75141712ef1Sdrh } 75241712ef1Sdrh execsql { 75341712ef1Sdrh COMMIT; 75441712ef1Sdrh SELECT * FROM abc; 75541712ef1Sdrh } 75641712ef1Sdrh} {1 2 3 7 8 9} 75741712ef1Sdrhintegrity_check conflict-11.6 75841712ef1Sdrh 759ed717fe3Sdrh 760bb37fdc7Sdrhfinish_test 761