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# 16bb37fdc7Sdrh 17bb37fdc7Sdrhset testdir [file dirname $argv0] 18bb37fdc7Sdrhsource $testdir/tester.tcl 19bb37fdc7Sdrh 203bdca9c9Sdanielk1977ifcapable !conflict { 213bdca9c9Sdanielk1977 finish_test 223bdca9c9Sdanielk1977 return 233bdca9c9Sdanielk1977} 243bdca9c9Sdanielk1977 250d65dc0eSdrh# Create tables for the first group of tests. 26bb37fdc7Sdrh# 270d65dc0eSdrhdo_test conflict-1.0 { 28bb37fdc7Sdrh execsql { 29bb37fdc7Sdrh CREATE TABLE t1(a, b, c, UNIQUE(a,b)); 300d65dc0eSdrh CREATE TABLE t2(x); 31bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 32bb37fdc7Sdrh } 330d65dc0eSdrh} {} 34bb37fdc7Sdrh 350d65dc0eSdrh# Six columns of configuration data as follows: 360d65dc0eSdrh# 370d65dc0eSdrh# i The reference number of the test 380d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 390d65dc0eSdrh# t0 True if there is an error from $cmd 400d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 410d65dc0eSdrh# t2 Content of "x" column of t2 42af6df11fSdrh# t3 Number of temporary files created by this test 430d65dc0eSdrh# 44af6df11fSdrhforeach {i cmd t0 t1 t2 t3} { 45af6df11fSdrh 1 INSERT 1 {} 1 0 46af6df11fSdrh 2 {INSERT OR IGNORE} 0 3 1 0 47af6df11fSdrh 3 {INSERT OR REPLACE} 0 4 1 0 48af6df11fSdrh 4 REPLACE 0 4 1 0 49af6df11fSdrh 5 {INSERT OR FAIL} 1 {} 1 0 50af6df11fSdrh 6 {INSERT OR ABORT} 1 {} 1 0 51af6df11fSdrh 7 {INSERT OR ROLLBACK} 1 {} {} 0 520d65dc0eSdrh} { 530d65dc0eSdrh do_test conflict-1.$i { 54af6df11fSdrh set ::sqlite_opentemp_count 0 550d65dc0eSdrh set r0 [catch {execsql [subst { 56bb37fdc7Sdrh DELETE FROM t1; 570d65dc0eSdrh DELETE FROM t2; 58bb37fdc7Sdrh INSERT INTO t1 VALUES(1,2,3); 59af6df11fSdrh BEGIN; 600d65dc0eSdrh INSERT INTO t2 VALUES(1); 610d65dc0eSdrh $cmd INTO t1 VALUES(1,2,4); 620d65dc0eSdrh }]} r1] 636b8b8749Sdrh catch {execsql {COMMIT}} 640d65dc0eSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 650d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 66af6df11fSdrh set r3 $::sqlite_opentemp_count 67af6df11fSdrh list $r0 $r1 $r2 $r3 68af6df11fSdrh } [list $t0 $t1 $t2 $t3] 69bb37fdc7Sdrh} 70bb37fdc7Sdrh 710d65dc0eSdrh# Create tables for the first group of tests. 720d65dc0eSdrh# 730d65dc0eSdrhdo_test conflict-2.0 { 74ef6764a1Sdrh execsql { 75ef6764a1Sdrh DROP TABLE t1; 76ef6764a1Sdrh DROP TABLE t2; 770d65dc0eSdrh CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(a,b)); 780d65dc0eSdrh CREATE TABLE t2(x); 79ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 80ef6764a1Sdrh } 810d65dc0eSdrh} {} 82ef6764a1Sdrh 830d65dc0eSdrh# Six columns of configuration data as follows: 840d65dc0eSdrh# 850d65dc0eSdrh# i The reference number of the test 860d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 870d65dc0eSdrh# t0 True if there is an error from $cmd 880d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 890d65dc0eSdrh# t2 Content of "x" column of t2 900d65dc0eSdrh# 91af6df11fSdrhforeach {i cmd t0 t1 t2} { 92af6df11fSdrh 1 INSERT 1 {} 1 93af6df11fSdrh 2 {INSERT OR IGNORE} 0 3 1 94af6df11fSdrh 3 {INSERT OR REPLACE} 0 4 1 95af6df11fSdrh 4 REPLACE 0 4 1 96af6df11fSdrh 5 {INSERT OR FAIL} 1 {} 1 97af6df11fSdrh 6 {INSERT OR ABORT} 1 {} 1 98af6df11fSdrh 7 {INSERT OR ROLLBACK} 1 {} {} 990d65dc0eSdrh} { 1000d65dc0eSdrh do_test conflict-2.$i { 1010d65dc0eSdrh set r0 [catch {execsql [subst { 102ef6764a1Sdrh DELETE FROM t1; 1030d65dc0eSdrh DELETE FROM t2; 104ef6764a1Sdrh INSERT INTO t1 VALUES(1,2,3); 105af6df11fSdrh BEGIN; 1060d65dc0eSdrh INSERT INTO t2 VALUES(1); 1070d65dc0eSdrh $cmd INTO t1 VALUES(1,2,4); 1080d65dc0eSdrh }]} r1] 1096b8b8749Sdrh catch {execsql {COMMIT}} 1100d65dc0eSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 1110d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 1120d65dc0eSdrh list $r0 $r1 $r2 1130d65dc0eSdrh } [list $t0 $t1 $t2] 114ef6764a1Sdrh} 1150d65dc0eSdrh 1160d65dc0eSdrh# Create tables for the first group of tests. 1170d65dc0eSdrh# 1180d65dc0eSdrhdo_test conflict-3.0 { 1190d65dc0eSdrh execsql { 1200d65dc0eSdrh DROP TABLE t1; 1210d65dc0eSdrh DROP TABLE t2; 122e0194f2bSdrh CREATE TABLE t1(a, b, c INTEGER, PRIMARY KEY(c), UNIQUE(a,b)); 1230d65dc0eSdrh CREATE TABLE t2(x); 124ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 125ef6764a1Sdrh } 1260d65dc0eSdrh} {} 1270d65dc0eSdrh 1280d65dc0eSdrh# Six columns of configuration data as follows: 1290d65dc0eSdrh# 1300d65dc0eSdrh# i The reference number of the test 1310d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 1320d65dc0eSdrh# t0 True if there is an error from $cmd 1330d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 1340d65dc0eSdrh# t2 Content of "x" column of t2 1350d65dc0eSdrh# 136af6df11fSdrhforeach {i cmd t0 t1 t2} { 137af6df11fSdrh 1 INSERT 1 {} 1 138af6df11fSdrh 2 {INSERT OR IGNORE} 0 3 1 139af6df11fSdrh 3 {INSERT OR REPLACE} 0 4 1 140af6df11fSdrh 4 REPLACE 0 4 1 141af6df11fSdrh 5 {INSERT OR FAIL} 1 {} 1 142af6df11fSdrh 6 {INSERT OR ABORT} 1 {} 1 143af6df11fSdrh 7 {INSERT OR ROLLBACK} 1 {} {} 1440d65dc0eSdrh} { 1450d65dc0eSdrh do_test conflict-3.$i { 1460d65dc0eSdrh set r0 [catch {execsql [subst { 1470d65dc0eSdrh DELETE FROM t1; 1480d65dc0eSdrh DELETE FROM t2; 1490d65dc0eSdrh INSERT INTO t1 VALUES(1,2,3); 150af6df11fSdrh BEGIN; 1510d65dc0eSdrh INSERT INTO t2 VALUES(1); 1520d65dc0eSdrh $cmd INTO t1 VALUES(1,2,4); 1530d65dc0eSdrh }]} r1] 1546b8b8749Sdrh catch {execsql {COMMIT}} 1550d65dc0eSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 1560d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 1570d65dc0eSdrh list $r0 $r1 $r2 1580d65dc0eSdrh } [list $t0 $t1 $t2] 159ef6764a1Sdrh} 1600d65dc0eSdrh 1610d65dc0eSdrhdo_test conflict-4.0 { 1620d65dc0eSdrh execsql { 1630d65dc0eSdrh DROP TABLE t2; 1640d65dc0eSdrh CREATE TABLE t2(x); 1650d65dc0eSdrh SELECT x FROM t2; 166ef6764a1Sdrh } 1670d65dc0eSdrh} {} 1680d65dc0eSdrh 1690d65dc0eSdrh# Six columns of configuration data as follows: 1700d65dc0eSdrh# 1710d65dc0eSdrh# i The reference number of the test 1720d65dc0eSdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 1730d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 1740d65dc0eSdrh# t0 True if there is an error from $cmd 1750d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 1760d65dc0eSdrh# t2 Content of "x" column of t2 1770d65dc0eSdrh# 178af6df11fSdrhforeach {i conf1 cmd t0 t1 t2} { 179af6df11fSdrh 1 {} INSERT 1 {} 1 180af6df11fSdrh 2 REPLACE INSERT 0 4 1 181af6df11fSdrh 3 IGNORE INSERT 0 3 1 182af6df11fSdrh 4 FAIL INSERT 1 {} 1 183af6df11fSdrh 5 ABORT INSERT 1 {} 1 184af6df11fSdrh 6 ROLLBACK INSERT 1 {} {} 185af6df11fSdrh 7 REPLACE {INSERT OR IGNORE} 0 3 1 186af6df11fSdrh 8 IGNORE {INSERT OR REPLACE} 0 4 1 187af6df11fSdrh 9 FAIL {INSERT OR IGNORE} 0 3 1 188af6df11fSdrh 10 ABORT {INSERT OR REPLACE} 0 4 1 189af6df11fSdrh 11 ROLLBACK {INSERT OR IGNORE } 0 3 1 1900d65dc0eSdrh} { 1910d65dc0eSdrh do_test conflict-4.$i { 1920d65dc0eSdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 1930d65dc0eSdrh set r0 [catch {execsql [subst { 1940d65dc0eSdrh DROP TABLE t1; 1950d65dc0eSdrh CREATE TABLE t1(a,b,c,UNIQUE(a,b) $conf1); 1960d65dc0eSdrh DELETE FROM t2; 1970d65dc0eSdrh INSERT INTO t1 VALUES(1,2,3); 198af6df11fSdrh BEGIN; 1990d65dc0eSdrh INSERT INTO t2 VALUES(1); 2000d65dc0eSdrh $cmd INTO t1 VALUES(1,2,4); 2010d65dc0eSdrh }]} r1] 2026b8b8749Sdrh catch {execsql {COMMIT}} 2030d65dc0eSdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 2040d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 2050d65dc0eSdrh list $r0 $r1 $r2 2060d65dc0eSdrh } [list $t0 $t1 $t2] 207ef6764a1Sdrh} 2080d65dc0eSdrh 2090d65dc0eSdrhdo_test conflict-5.0 { 2100d65dc0eSdrh execsql { 2110d65dc0eSdrh DROP TABLE t2; 2120d65dc0eSdrh CREATE TABLE t2(x); 2130d65dc0eSdrh SELECT x FROM t2; 2140d65dc0eSdrh } 2150d65dc0eSdrh} {} 2160d65dc0eSdrh 2170d65dc0eSdrh# Six columns of configuration data as follows: 2180d65dc0eSdrh# 2190d65dc0eSdrh# i The reference number of the test 2200d65dc0eSdrh# conf1 The conflict resolution algorithm on the NOT NULL constraint 2210d65dc0eSdrh# cmd An INSERT or REPLACE command to execute against table t1 2220d65dc0eSdrh# t0 True if there is an error from $cmd 2230d65dc0eSdrh# t1 Content of "c" column of t1 assuming no error in $cmd 2240d65dc0eSdrh# t2 Content of "x" column of t2 2250d65dc0eSdrh# 226af6df11fSdrhforeach {i conf1 cmd t0 t1 t2} { 227af6df11fSdrh 1 {} INSERT 1 {} 1 228af6df11fSdrh 2 REPLACE INSERT 0 5 1 229af6df11fSdrh 3 IGNORE INSERT 0 {} 1 230af6df11fSdrh 4 FAIL INSERT 1 {} 1 231af6df11fSdrh 5 ABORT INSERT 1 {} 1 232af6df11fSdrh 6 ROLLBACK INSERT 1 {} {} 233af6df11fSdrh 7 REPLACE {INSERT OR IGNORE} 0 {} 1 234af6df11fSdrh 8 IGNORE {INSERT OR REPLACE} 0 5 1 235af6df11fSdrh 9 FAIL {INSERT OR IGNORE} 0 {} 1 236af6df11fSdrh 10 ABORT {INSERT OR REPLACE} 0 5 1 237af6df11fSdrh 11 ROLLBACK {INSERT OR IGNORE} 0 {} 1 238af6df11fSdrh 12 {} {INSERT OR IGNORE} 0 {} 1 239af6df11fSdrh 13 {} {INSERT OR REPLACE} 0 5 1 240af6df11fSdrh 14 {} {INSERT OR FAIL} 1 {} 1 241af6df11fSdrh 15 {} {INSERT OR ABORT} 1 {} 1 242af6df11fSdrh 16 {} {INSERT OR ROLLBACK} 1 {} {} 2430d65dc0eSdrh} { 244f9c8ce3cSdrh if {$t0} {set t1 {NOT NULL constraint failed: t1.c}} 2450d65dc0eSdrh do_test conflict-5.$i { 2460d65dc0eSdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 2470d65dc0eSdrh set r0 [catch {execsql [subst { 2480d65dc0eSdrh DROP TABLE t1; 2490d65dc0eSdrh CREATE TABLE t1(a,b,c NOT NULL $conf1 DEFAULT 5); 2500d65dc0eSdrh DELETE FROM t2; 251af6df11fSdrh BEGIN; 2520d65dc0eSdrh INSERT INTO t2 VALUES(1); 2530d65dc0eSdrh $cmd INTO t1 VALUES(1,2,NULL); 2540d65dc0eSdrh }]} r1] 2556b8b8749Sdrh catch {execsql {COMMIT}} 2560d65dc0eSdrh if {!$r0} {set r1 [execsql {SELECT c FROM t1}]} 2570d65dc0eSdrh set r2 [execsql {SELECT x FROM t2}] 2580d65dc0eSdrh list $r0 $r1 $r2 2590d65dc0eSdrh } [list $t0 $t1 $t2] 2600d65dc0eSdrh} 2610d65dc0eSdrh 2620d65dc0eSdrhdo_test conflict-6.0 { 2630d65dc0eSdrh execsql { 2640d65dc0eSdrh DROP TABLE t2; 2650d65dc0eSdrh CREATE TABLE t2(a,b,c); 2660d65dc0eSdrh INSERT INTO t2 VALUES(1,2,1); 2670d65dc0eSdrh INSERT INTO t2 VALUES(2,3,2); 2680d65dc0eSdrh INSERT INTO t2 VALUES(3,4,1); 2690d65dc0eSdrh INSERT INTO t2 VALUES(4,5,4); 2700d65dc0eSdrh SELECT c FROM t2 ORDER BY b; 2710d65dc0eSdrh CREATE TABLE t3(x); 2720d65dc0eSdrh INSERT INTO t3 VALUES(1); 2730d65dc0eSdrh } 2740d65dc0eSdrh} {1 2 1 4} 2750d65dc0eSdrh 2760d65dc0eSdrh# Six columns of configuration data as follows: 2770d65dc0eSdrh# 2780d65dc0eSdrh# i The reference number of the test 2790d65dc0eSdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 2800d65dc0eSdrh# cmd An UPDATE command to execute against table t1 2810d65dc0eSdrh# t0 True if there is an error from $cmd 2820d65dc0eSdrh# t1 Content of "b" column of t1 assuming no error in $cmd 2830d65dc0eSdrh# t2 Content of "x" column of t3 2841e9daa6aSdrh# t3 Number of temporary files for tables 2851e9daa6aSdrh# t4 Number of temporary files for statement journals 2860d65dc0eSdrh# 2873ac9a864Sdrh# Update (2007-08-21): Since temporary table files are now opened lazily, 2883ac9a864Sdrh# and none of the following tests use large quantities of data, t3 is always 0. 2893ac9a864Sdrh# 2903ac9a864Sdrh# Update (2016-03-04): Subjournals now also open lazily, so t4 is also always 0. 2917a2b1eebSdanielk1977# 2921e9daa6aSdrhforeach {i conf1 cmd t0 t1 t2 t3 t4} { 2933ac9a864Sdrh 1 {} UPDATE 1 {6 7 8 9} 1 0 0 2947a2b1eebSdanielk1977 2 REPLACE UPDATE 0 {7 6 9} 1 0 0 2957a2b1eebSdanielk1977 3 IGNORE UPDATE 0 {6 7 3 9} 1 0 0 2961e9daa6aSdrh 4 FAIL UPDATE 1 {6 7 3 4} 1 0 0 2973ac9a864Sdrh 5 ABORT UPDATE 1 {1 2 3 4} 1 0 0 2981e9daa6aSdrh 6 ROLLBACK UPDATE 1 {1 2 3 4} 0 0 0 2997a2b1eebSdanielk1977 7 REPLACE {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 3007a2b1eebSdanielk1977 8 IGNORE {UPDATE OR REPLACE} 0 {7 6 9} 1 0 0 3017a2b1eebSdanielk1977 9 FAIL {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 3027a2b1eebSdanielk1977 10 ABORT {UPDATE OR REPLACE} 0 {7 6 9} 1 0 0 3037a2b1eebSdanielk1977 11 ROLLBACK {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 3047a2b1eebSdanielk1977 12 {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 3057a2b1eebSdanielk1977 13 {} {UPDATE OR REPLACE} 0 {7 6 9} 1 0 0 3061e9daa6aSdrh 14 {} {UPDATE OR FAIL} 1 {6 7 3 4} 1 0 0 3073ac9a864Sdrh 15 {} {UPDATE OR ABORT} 1 {1 2 3 4} 1 0 0 3081e9daa6aSdrh 16 {} {UPDATE OR ROLLBACK} 1 {1 2 3 4} 0 0 0 3090d65dc0eSdrh} { 310f9c8ce3cSdrh if {$t0} {set t1 {UNIQUE constraint failed: t1.a}} 311d2db0906Sdan if {[info exists TEMP_STORE] && $TEMP_STORE==3} { 312d829335eSdanielk1977 set t3 0 3131e9daa6aSdrh } else { 3141e9daa6aSdrh set t3 [expr {$t3+$t4}] 3151e9daa6aSdrh } 3160d65dc0eSdrh do_test conflict-6.$i { 317af6df11fSdrh db close 318af6df11fSdrh sqlite3 db test.db 3190d65dc0eSdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 320abec0beeSdrh execsql {pragma temp_store=file} 321af6df11fSdrh set ::sqlite_opentemp_count 0 3220d65dc0eSdrh set r0 [catch {execsql [subst { 3230d65dc0eSdrh DROP TABLE t1; 3240d65dc0eSdrh CREATE TABLE t1(a,b,c, UNIQUE(a) $conf1); 3250d65dc0eSdrh INSERT INTO t1 SELECT * FROM t2; 3260d65dc0eSdrh UPDATE t3 SET x=0; 327af6df11fSdrh BEGIN; 3280d65dc0eSdrh $cmd t3 SET x=1; 3291dd397f0Sdrh $cmd t1 SET b=b*2; 3300d65dc0eSdrh $cmd t1 SET a=c+5; 3310d65dc0eSdrh }]} r1] 3326b8b8749Sdrh catch {execsql {COMMIT}} 3330d65dc0eSdrh if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]} 3340d65dc0eSdrh set r2 [execsql {SELECT x FROM t3}] 335af6df11fSdrh list $r0 $r1 $r2 $::sqlite_opentemp_count 336af6df11fSdrh } [list $t0 $t1 $t2 $t3] 3370d65dc0eSdrh} 338ef6764a1Sdrh 339fe1a1773Sdrh# Test to make sure a lot of IGNOREs don't cause a stack overflow 340fe1a1773Sdrh# 341fe1a1773Sdrhdo_test conflict-7.1 { 342fe1a1773Sdrh execsql { 343fe1a1773Sdrh DROP TABLE t1; 344fe1a1773Sdrh DROP TABLE t2; 345fe1a1773Sdrh DROP TABLE t3; 346fe1a1773Sdrh CREATE TABLE t1(a unique, b); 347fe1a1773Sdrh } 348fe1a1773Sdrh for {set i 1} {$i<=50} {incr i} { 349fe1a1773Sdrh execsql "INSERT into t1 values($i,[expr {$i+1}]);" 350fe1a1773Sdrh } 351fe1a1773Sdrh execsql { 352fe1a1773Sdrh SELECT count(*), min(a), max(b) FROM t1; 353fe1a1773Sdrh } 354fe1a1773Sdrh} {50 1 51} 355fe1a1773Sdrhdo_test conflict-7.2 { 356fe1a1773Sdrh execsql { 357fe1a1773Sdrh PRAGMA count_changes=on; 358fe1a1773Sdrh UPDATE OR IGNORE t1 SET a=1000; 359fe1a1773Sdrh } 360fe1a1773Sdrh} {1} 361c8d30ac1Sdrhdo_test conflict-7.2.1 { 362c8d30ac1Sdrh db changes 363c8d30ac1Sdrh} {1} 364fe1a1773Sdrhdo_test conflict-7.3 { 365fe1a1773Sdrh execsql { 366fe1a1773Sdrh SELECT b FROM t1 WHERE a=1000; 367fe1a1773Sdrh } 368fe1a1773Sdrh} {2} 369fe1a1773Sdrhdo_test conflict-7.4 { 370fe1a1773Sdrh execsql { 371fe1a1773Sdrh SELECT count(*) FROM t1; 372fe1a1773Sdrh } 373fe1a1773Sdrh} {50} 374fe1a1773Sdrhdo_test conflict-7.5 { 375fe1a1773Sdrh execsql { 376fe1a1773Sdrh PRAGMA count_changes=on; 377fe1a1773Sdrh UPDATE OR REPLACE t1 SET a=1001; 378fe1a1773Sdrh } 379fe1a1773Sdrh} {50} 380c8d30ac1Sdrhdo_test conflict-7.5.1 { 381c8d30ac1Sdrh db changes 382c8d30ac1Sdrh} {50} 383fe1a1773Sdrhdo_test conflict-7.6 { 384fe1a1773Sdrh execsql { 385fe1a1773Sdrh SELECT b FROM t1 WHERE a=1001; 386fe1a1773Sdrh } 387fe1a1773Sdrh} {51} 388fe1a1773Sdrhdo_test conflict-7.7 { 389fe1a1773Sdrh execsql { 390fe1a1773Sdrh SELECT count(*) FROM t1; 391fe1a1773Sdrh } 392fe1a1773Sdrh} {1} 393b28af71aSdanielk1977 394b28af71aSdanielk1977# Update for version 3: A SELECT statement no longer resets the change 395b28af71aSdanielk1977# counter (Test result changes from 0 to 50). 396c8d30ac1Sdrhdo_test conflict-7.7.1 { 397c8d30ac1Sdrh db changes 398b28af71aSdanielk1977} {50} 399fe1a1773Sdrh 400feeb1394Sdrh# Make sure the row count is right for rows that are ignored on 401feeb1394Sdrh# an insert. 402feeb1394Sdrh# 403feeb1394Sdrhdo_test conflict-8.1 { 404feeb1394Sdrh execsql { 405feeb1394Sdrh DELETE FROM t1; 406feeb1394Sdrh INSERT INTO t1 VALUES(1,2); 407feeb1394Sdrh } 408feeb1394Sdrh execsql { 409feeb1394Sdrh INSERT OR IGNORE INTO t1 VALUES(2,3); 410feeb1394Sdrh } 411feeb1394Sdrh} {1} 412c8d30ac1Sdrhdo_test conflict-8.1.1 { 413c8d30ac1Sdrh db changes 414c8d30ac1Sdrh} {1} 415feeb1394Sdrhdo_test conflict-8.2 { 416feeb1394Sdrh execsql { 417feeb1394Sdrh INSERT OR IGNORE INTO t1 VALUES(2,4); 418feeb1394Sdrh } 419feeb1394Sdrh} {0} 420c8d30ac1Sdrhdo_test conflict-8.2.1 { 421c8d30ac1Sdrh db changes 422c8d30ac1Sdrh} {0} 423feeb1394Sdrhdo_test conflict-8.3 { 424feeb1394Sdrh execsql { 425feeb1394Sdrh INSERT OR REPLACE INTO t1 VALUES(2,4); 426feeb1394Sdrh } 427feeb1394Sdrh} {1} 428c8d30ac1Sdrhdo_test conflict-8.3.1 { 429c8d30ac1Sdrh db changes 430c8d30ac1Sdrh} {1} 431feeb1394Sdrhdo_test conflict-8.4 { 432feeb1394Sdrh execsql { 433feeb1394Sdrh INSERT OR IGNORE INTO t1 SELECT * FROM t1; 434feeb1394Sdrh } 435feeb1394Sdrh} {0} 436c8d30ac1Sdrhdo_test conflict-8.4.1 { 437c8d30ac1Sdrh db changes 438c8d30ac1Sdrh} {0} 439feeb1394Sdrhdo_test conflict-8.5 { 440feeb1394Sdrh execsql { 441feeb1394Sdrh INSERT OR IGNORE INTO t1 SELECT a+2,b+2 FROM t1; 442feeb1394Sdrh } 443feeb1394Sdrh} {2} 444c8d30ac1Sdrhdo_test conflict-8.5.1 { 445c8d30ac1Sdrh db changes 446c8d30ac1Sdrh} {2} 447feeb1394Sdrhdo_test conflict-8.6 { 448feeb1394Sdrh execsql { 449feeb1394Sdrh INSERT OR IGNORE INTO t1 SELECT a+3,b+3 FROM t1; 450feeb1394Sdrh } 451feeb1394Sdrh} {3} 452c8d30ac1Sdrhdo_test conflict-8.6.1 { 453c8d30ac1Sdrh db changes 454c8d30ac1Sdrh} {3} 455fe1a1773Sdrh 4563b167c75Sdrhintegrity_check conflict-8.99 4573b167c75Sdrh 4583b167c75Sdrhdo_test conflict-9.1 { 4593b167c75Sdrh execsql { 4603b167c75Sdrh PRAGMA count_changes=0; 4613b167c75Sdrh CREATE TABLE t2( 4623b167c75Sdrh a INTEGER UNIQUE ON CONFLICT IGNORE, 4633b167c75Sdrh b INTEGER UNIQUE ON CONFLICT FAIL, 4643b167c75Sdrh c INTEGER UNIQUE ON CONFLICT REPLACE, 4653b167c75Sdrh d INTEGER UNIQUE ON CONFLICT ABORT, 4663b167c75Sdrh e INTEGER UNIQUE ON CONFLICT ROLLBACK 4673b167c75Sdrh ); 4683b167c75Sdrh CREATE TABLE t3(x); 4693b167c75Sdrh INSERT INTO t3 VALUES(1); 4703b167c75Sdrh SELECT * FROM t3; 4713b167c75Sdrh } 4723b167c75Sdrh} {1} 4733b167c75Sdrhdo_test conflict-9.2 { 4743b167c75Sdrh catchsql { 4753b167c75Sdrh INSERT INTO t2 VALUES(1,1,1,1,1); 4763b167c75Sdrh INSERT INTO t2 VALUES(2,2,2,2,2); 4773b167c75Sdrh SELECT * FROM t2; 4783b167c75Sdrh } 4793b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 4803b167c75Sdrhdo_test conflict-9.3 { 4813b167c75Sdrh catchsql { 4823b167c75Sdrh INSERT INTO t2 VALUES(1,3,3,3,3); 4833b167c75Sdrh SELECT * FROM t2; 4843b167c75Sdrh } 4853b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 4863b167c75Sdrhdo_test conflict-9.4 { 4873b167c75Sdrh catchsql { 4883b167c75Sdrh UPDATE t2 SET a=a+1 WHERE a=1; 4893b167c75Sdrh SELECT * FROM t2; 4903b167c75Sdrh } 4913b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 4923b167c75Sdrhdo_test conflict-9.5 { 4933b167c75Sdrh catchsql { 4943b167c75Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 4953b167c75Sdrh SELECT * FROM t2; 4963b167c75Sdrh } 497f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 4983b167c75Sdrhdo_test conflict-9.6 { 4993b167c75Sdrh catchsql { 5003b167c75Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 5013b167c75Sdrh SELECT * FROM t2; 5023b167c75Sdrh } 503f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 5043b167c75Sdrhdo_test conflict-9.7 { 5053b167c75Sdrh catchsql { 5063b167c75Sdrh BEGIN; 5073b167c75Sdrh UPDATE t3 SET x=x+1; 5083b167c75Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 5093b167c75Sdrh SELECT * FROM t2; 5103b167c75Sdrh } 511f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 5123b167c75Sdrhdo_test conflict-9.8 { 5133b167c75Sdrh execsql {COMMIT} 5143b167c75Sdrh execsql {SELECT * FROM t3} 5153b167c75Sdrh} {2} 516483750baSdrhdo_test conflict-9.9 { 5173b167c75Sdrh catchsql { 5183b167c75Sdrh BEGIN; 5193b167c75Sdrh UPDATE t3 SET x=x+1; 5203b167c75Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 5213b167c75Sdrh SELECT * FROM t2; 5223b167c75Sdrh } 523f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 5243b167c75Sdrhdo_test conflict-9.10 { 5253b167c75Sdrh execsql {COMMIT} 5263b167c75Sdrh execsql {SELECT * FROM t3} 5273b167c75Sdrh} {3} 5283b167c75Sdrhdo_test conflict-9.11 { 5293b167c75Sdrh catchsql { 5303b167c75Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 5313b167c75Sdrh SELECT * FROM t2; 5323b167c75Sdrh } 533f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 5343b167c75Sdrhdo_test conflict-9.12 { 5353b167c75Sdrh catchsql { 5363b167c75Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 5373b167c75Sdrh SELECT * FROM t2; 5383b167c75Sdrh } 539f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 5403b167c75Sdrhdo_test conflict-9.13 { 5413b167c75Sdrh catchsql { 5423b167c75Sdrh BEGIN; 5433b167c75Sdrh UPDATE t3 SET x=x+1; 5443b167c75Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 5453b167c75Sdrh SELECT * FROM t2; 5463b167c75Sdrh } 547f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 5483b167c75Sdrhdo_test conflict-9.14 { 5493b167c75Sdrh execsql {COMMIT} 5503b167c75Sdrh execsql {SELECT * FROM t3} 5513b167c75Sdrh} {4} 5523b167c75Sdrhdo_test conflict-9.15 { 5533b167c75Sdrh catchsql { 5543b167c75Sdrh BEGIN; 5553b167c75Sdrh UPDATE t3 SET x=x+1; 5563b167c75Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 5573b167c75Sdrh SELECT * FROM t2; 5583b167c75Sdrh } 559f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 5603b167c75Sdrhdo_test conflict-9.16 { 5613b167c75Sdrh execsql {COMMIT} 5623b167c75Sdrh execsql {SELECT * FROM t3} 5633b167c75Sdrh} {5} 5643b167c75Sdrhdo_test conflict-9.17 { 5653b167c75Sdrh catchsql { 5663b167c75Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 5673b167c75Sdrh SELECT * FROM t2; 5683b167c75Sdrh } 569f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 5703b167c75Sdrhdo_test conflict-9.18 { 5713b167c75Sdrh catchsql { 5723b167c75Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 5733b167c75Sdrh SELECT * FROM t2; 5743b167c75Sdrh } 575f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 5763b167c75Sdrhdo_test conflict-9.19 { 5773b167c75Sdrh catchsql { 5783b167c75Sdrh BEGIN; 5793b167c75Sdrh UPDATE t3 SET x=x+1; 5803b167c75Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 5813b167c75Sdrh SELECT * FROM t2; 5823b167c75Sdrh } 583f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 584433dccfbSdrhverify_ex_errcode conflict-9.21b SQLITE_CONSTRAINT_UNIQUE 5853b167c75Sdrhdo_test conflict-9.20 { 5866b8b8749Sdrh catch {execsql {COMMIT}} 5873b167c75Sdrh execsql {SELECT * FROM t3} 5883b167c75Sdrh} {5} 5893b167c75Sdrhdo_test conflict-9.21 { 5903b167c75Sdrh catchsql { 5913b167c75Sdrh BEGIN; 5923b167c75Sdrh UPDATE t3 SET x=x+1; 5933b167c75Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 5943b167c75Sdrh SELECT * FROM t2; 5953b167c75Sdrh } 596f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 597433dccfbSdrhverify_ex_errcode conflict-9.21b SQLITE_CONSTRAINT_UNIQUE 5983b167c75Sdrhdo_test conflict-9.22 { 5996b8b8749Sdrh catch {execsql {COMMIT}} 6003b167c75Sdrh execsql {SELECT * FROM t3} 6013b167c75Sdrh} {5} 6023b167c75Sdrhdo_test conflict-9.23 { 6033b167c75Sdrh catchsql { 6043b167c75Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 6053b167c75Sdrh SELECT * FROM t2; 6063b167c75Sdrh } 6073b167c75Sdrh} {0 {2 2 2 2 2 3 3 1 3 3}} 6083b167c75Sdrhdo_test conflict-9.24 { 6093b167c75Sdrh catchsql { 6103b167c75Sdrh UPDATE t2 SET c=c-1 WHERE c=2; 6113b167c75Sdrh SELECT * FROM t2; 6123b167c75Sdrh } 6133b167c75Sdrh} {0 {2 2 1 2 2}} 6143b167c75Sdrhdo_test conflict-9.25 { 6153b167c75Sdrh catchsql { 6163b167c75Sdrh BEGIN; 6173b167c75Sdrh UPDATE t3 SET x=x+1; 6183b167c75Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 6193b167c75Sdrh SELECT * FROM t2; 6203b167c75Sdrh } 6213b167c75Sdrh} {0 {3 3 1 3 3}} 6223b167c75Sdrhdo_test conflict-9.26 { 6236b8b8749Sdrh catch {execsql {COMMIT}} 6243b167c75Sdrh execsql {SELECT * FROM t3} 6253b167c75Sdrh} {6} 626bb37fdc7Sdrh 627a996e477Sdrhdo_test conflict-10.1 { 628a996e477Sdrh catchsql { 629a996e477Sdrh DELETE FROM t1; 63033752f8aSdanielk1977 BEGIN; 63133752f8aSdanielk1977 INSERT OR ROLLBACK INTO t1 VALUES(1,2); 63233752f8aSdanielk1977 INSERT OR ROLLBACK INTO t1 VALUES(1,3); 633a996e477Sdrh COMMIT; 634a996e477Sdrh } 635a996e477Sdrh execsql {SELECT * FROM t1} 636a996e477Sdrh} {} 637a996e477Sdrhdo_test conflict-10.2 { 638a996e477Sdrh catchsql { 639a996e477Sdrh CREATE TABLE t4(x); 640a996e477Sdrh CREATE UNIQUE INDEX t4x ON t4(x); 64133752f8aSdanielk1977 BEGIN; 64233752f8aSdanielk1977 INSERT OR ROLLBACK INTO t4 VALUES(1); 64333752f8aSdanielk1977 INSERT OR ROLLBACK INTO t4 VALUES(1); 644a996e477Sdrh COMMIT; 645a996e477Sdrh } 646a996e477Sdrh execsql {SELECT * FROM t4} 647a996e477Sdrh} {} 648a996e477Sdrh 64941712ef1Sdrh# Ticket #1171. Make sure statement rollbacks do not 65041712ef1Sdrh# damage the database. 65141712ef1Sdrh# 65241712ef1Sdrhdo_test conflict-11.1 { 65341712ef1Sdrh execsql { 65441712ef1Sdrh -- Create a database object (pages 2, 3 of the file) 65541712ef1Sdrh BEGIN; 65641712ef1Sdrh CREATE TABLE abc(a UNIQUE, b, c); 65741712ef1Sdrh INSERT INTO abc VALUES(1, 2, 3); 65841712ef1Sdrh INSERT INTO abc VALUES(4, 5, 6); 65941712ef1Sdrh INSERT INTO abc VALUES(7, 8, 9); 66041712ef1Sdrh COMMIT; 66141712ef1Sdrh } 66241712ef1Sdrh 66341712ef1Sdrh 66441712ef1Sdrh # Set a small cache size so that changes will spill into 66541712ef1Sdrh # the database file. 66641712ef1Sdrh execsql { 66741712ef1Sdrh PRAGMA cache_size = 10; 66841712ef1Sdrh } 66941712ef1Sdrh 67041712ef1Sdrh # Make lots of changes. Because of the small cache, some 67141712ef1Sdrh # (most?) of these changes will spill into the disk file. 67241712ef1Sdrh # In other words, some of the changes will not be held in 67341712ef1Sdrh # cache. 67441712ef1Sdrh # 67541712ef1Sdrh execsql { 67641712ef1Sdrh BEGIN; 67741712ef1Sdrh -- Make sure the pager is in EXCLUSIVE state. 67841712ef1Sdrh CREATE TABLE def(d, e, f); 67941712ef1Sdrh INSERT INTO def VALUES 68041712ef1Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 68141712ef1Sdrh INSERT INTO def SELECT * FROM def; 68241712ef1Sdrh INSERT INTO def SELECT * FROM def; 68341712ef1Sdrh INSERT INTO def SELECT * FROM def; 68441712ef1Sdrh INSERT INTO def SELECT * FROM def; 68541712ef1Sdrh INSERT INTO def SELECT * FROM def; 68641712ef1Sdrh INSERT INTO def SELECT * FROM def; 68741712ef1Sdrh INSERT INTO def SELECT * FROM def; 68841712ef1Sdrh DELETE FROM abc WHERE a = 4; 68941712ef1Sdrh } 69041712ef1Sdrh 69141712ef1Sdrh # Execute a statement that does a statement rollback due to 69241712ef1Sdrh # a constraint failure. 69341712ef1Sdrh # 69441712ef1Sdrh catchsql { 69541712ef1Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 69641712ef1Sdrh } 69741712ef1Sdrh 69841712ef1Sdrh # Rollback the database. Verify that the state of the ABC table 69941712ef1Sdrh # is unchanged from the beginning of the transaction. In other words, 70041712ef1Sdrh # make sure the DELETE on table ABC that occurred within the transaction 70141712ef1Sdrh # had no effect. 70241712ef1Sdrh # 70341712ef1Sdrh execsql { 70441712ef1Sdrh ROLLBACK; 70541712ef1Sdrh SELECT * FROM abc; 70641712ef1Sdrh } 70741712ef1Sdrh} {1 2 3 4 5 6 7 8 9} 70841712ef1Sdrhintegrity_check conflict-11.2 70941712ef1Sdrh 71041712ef1Sdrh# Repeat test conflict-11.1 but this time commit. 71141712ef1Sdrh# 71241712ef1Sdrhdo_test conflict-11.3 { 71341712ef1Sdrh execsql { 71441712ef1Sdrh BEGIN; 71541712ef1Sdrh -- Make sure the pager is in EXCLUSIVE state. 71641712ef1Sdrh UPDATE abc SET a=a+1; 71741712ef1Sdrh CREATE TABLE def(d, e, f); 71841712ef1Sdrh INSERT INTO def VALUES 71941712ef1Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 72041712ef1Sdrh INSERT INTO def SELECT * FROM def; 72141712ef1Sdrh INSERT INTO def SELECT * FROM def; 72241712ef1Sdrh INSERT INTO def SELECT * FROM def; 72341712ef1Sdrh INSERT INTO def SELECT * FROM def; 72441712ef1Sdrh INSERT INTO def SELECT * FROM def; 72541712ef1Sdrh INSERT INTO def SELECT * FROM def; 72641712ef1Sdrh INSERT INTO def SELECT * FROM def; 72741712ef1Sdrh DELETE FROM abc WHERE a = 4; 72841712ef1Sdrh } 72941712ef1Sdrh catchsql { 73041712ef1Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 73141712ef1Sdrh } 73241712ef1Sdrh execsql { 73341712ef1Sdrh ROLLBACK; 73441712ef1Sdrh SELECT * FROM abc; 73541712ef1Sdrh } 73641712ef1Sdrh} {1 2 3 4 5 6 7 8 9} 73741712ef1Sdrh# Repeat test conflict-11.1 but this time commit. 73841712ef1Sdrh# 73941712ef1Sdrhdo_test conflict-11.5 { 74041712ef1Sdrh execsql { 74141712ef1Sdrh BEGIN; 74241712ef1Sdrh -- Make sure the pager is in EXCLUSIVE state. 74341712ef1Sdrh CREATE TABLE def(d, e, f); 74441712ef1Sdrh INSERT INTO def VALUES 74541712ef1Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 74641712ef1Sdrh INSERT INTO def SELECT * FROM def; 74741712ef1Sdrh INSERT INTO def SELECT * FROM def; 74841712ef1Sdrh INSERT INTO def SELECT * FROM def; 74941712ef1Sdrh INSERT INTO def SELECT * FROM def; 75041712ef1Sdrh INSERT INTO def SELECT * FROM def; 75141712ef1Sdrh INSERT INTO def SELECT * FROM def; 75241712ef1Sdrh INSERT INTO def SELECT * FROM def; 75341712ef1Sdrh DELETE FROM abc WHERE a = 4; 75441712ef1Sdrh } 75541712ef1Sdrh catchsql { 75641712ef1Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 75741712ef1Sdrh } 75841712ef1Sdrh execsql { 75941712ef1Sdrh COMMIT; 76041712ef1Sdrh SELECT * FROM abc; 76141712ef1Sdrh } 76241712ef1Sdrh} {1 2 3 7 8 9} 76341712ef1Sdrhintegrity_check conflict-11.6 76441712ef1Sdrh 76560a713c6Sdrh# Make sure UPDATE OR REPLACE works on tables that have only 76660a713c6Sdrh# an INTEGER PRIMARY KEY. 76760a713c6Sdrh# 76860a713c6Sdrhdo_test conflict-12.1 { 76960a713c6Sdrh execsql { 77060a713c6Sdrh CREATE TABLE t5(a INTEGER PRIMARY KEY, b text); 77160a713c6Sdrh INSERT INTO t5 VALUES(1,'one'); 77260a713c6Sdrh INSERT INTO t5 VALUES(2,'two'); 77360a713c6Sdrh SELECT * FROM t5 77460a713c6Sdrh } 77560a713c6Sdrh} {1 one 2 two} 77660a713c6Sdrhdo_test conflict-12.2 { 77760a713c6Sdrh execsql { 77860a713c6Sdrh UPDATE OR IGNORE t5 SET a=a+1 WHERE a=1; 77960a713c6Sdrh SELECT * FROM t5; 78060a713c6Sdrh } 78160a713c6Sdrh} {1 one 2 two} 78260a713c6Sdrhdo_test conflict-12.3 { 78360a713c6Sdrh catchsql { 78460a713c6Sdrh UPDATE t5 SET a=a+1 WHERE a=1; 78560a713c6Sdrh } 786f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t5.a}} 787433dccfbSdrhverify_ex_errcode conflict-12.3b SQLITE_CONSTRAINT_PRIMARYKEY 78860a713c6Sdrhdo_test conflict-12.4 { 78960a713c6Sdrh execsql { 79060a713c6Sdrh UPDATE OR REPLACE t5 SET a=a+1 WHERE a=1; 79160a713c6Sdrh SELECT * FROM t5; 79260a713c6Sdrh } 79360a713c6Sdrh} {2 one} 794f9c8ce3cSdrhdo_test conflict-12.5 { 795f9c8ce3cSdrh catchsql { 796f9c8ce3cSdrh CREATE TABLE t5b(x); 797f9c8ce3cSdrh INSERT INTO t5b(rowid, x) VALUES(1,10),(2,11); 798f9c8ce3cSdrh UPDATE t5b SET rowid=rowid+1 WHERE x=10; 799f9c8ce3cSdrh } 800f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t5b.rowid}} 801f9c8ce3cSdrhverify_ex_errcode conflict-12.5b SQLITE_CONSTRAINT_ROWID 80260a713c6Sdrh 803ed717fe3Sdrh 8046dc84902Sdrh# Ticket [c38baa3d969eab7946dc50ba9d9b4f0057a19437] 8056dc84902Sdrh# REPLACE works like ABORT on a CHECK constraint. 8066dc84902Sdrh# 8076dc84902Sdrhdo_test conflict-13.1 { 8086dc84902Sdrh execsql { 8096dc84902Sdrh CREATE TABLE t13(a CHECK(a!=2)); 8106dc84902Sdrh BEGIN; 8116dc84902Sdrh REPLACE INTO t13 VALUES(1); 8126dc84902Sdrh } 8136dc84902Sdrh catchsql { 8146dc84902Sdrh REPLACE INTO t13 VALUES(2); 8156dc84902Sdrh } 816f9c8ce3cSdrh} {1 {CHECK constraint failed: t13}} 817433dccfbSdrhverify_ex_errcode conflict-13.1b SQLITE_CONSTRAINT_CHECK 8186dc84902Sdrhdo_test conflict-13.2 { 8196dc84902Sdrh execsql { 8206dc84902Sdrh REPLACE INTO t13 VALUES(3); 8216dc84902Sdrh COMMIT; 8226dc84902Sdrh SELECT * FROM t13; 8236dc84902Sdrh } 8246dc84902Sdrh} {1 3} 8256dc84902Sdrh 8266dc84902Sdrh 827*9bfb0794Sdrh# Ticket https://www.sqlite.org/src/tktview/e6f1f2e34dceeb1ed61531c7e9 828*9bfb0794Sdrh# Verify that it is not possible to sneak a NULL value into a NOT NULL 829*9bfb0794Sdrh# column using REPLACE. 830*9bfb0794Sdrh# 831*9bfb0794Sdrhdo_catchsql_test conflict-14.1 { 832*9bfb0794Sdrh DROP TABLE IF EXISTS t1; 833*9bfb0794Sdrh CREATE TABLE t1(x NOT NULL DEFAULT NULL); 834*9bfb0794Sdrh REPLACE INTO t1 DEFAULT VALUES; 835*9bfb0794Sdrh} {1 {NOT NULL constraint failed: t1.x}} 836*9bfb0794Sdrh 837*9bfb0794Sdrh 838bb37fdc7Sdrhfinish_test 839