1*00012df4Sdrh# 2013-11-04 2*00012df4Sdrh# 3*00012df4Sdrh# The author disclaims copyright to this source code. In place of 4*00012df4Sdrh# a legal notice, here is a blessing: 5*00012df4Sdrh# 6*00012df4Sdrh# May you do good and not evil. 7*00012df4Sdrh# May you find forgiveness for yourself and forgive others. 8*00012df4Sdrh# May you share freely, never taking more than you give. 9*00012df4Sdrh# 10*00012df4Sdrh#*********************************************************************** 11*00012df4Sdrh# This file implements regression tests for SQLite library. 12*00012df4Sdrh# 13*00012df4Sdrh# This file implements tests for the conflict resolution extension 14*00012df4Sdrh# in WITHOUT ROWID tables 15*00012df4Sdrh# 16*00012df4Sdrh 17*00012df4Sdrhset testdir [file dirname $argv0] 18*00012df4Sdrhsource $testdir/tester.tcl 19*00012df4Sdrh 20*00012df4Sdrhifcapable !conflict { 21*00012df4Sdrh finish_test 22*00012df4Sdrh return 23*00012df4Sdrh} 24*00012df4Sdrh 25*00012df4Sdrh# Create tables for the first group of tests. 26*00012df4Sdrh# 27*00012df4Sdrhdo_test conflict2-1.0 { 28*00012df4Sdrh execsql { 29*00012df4Sdrh CREATE TABLE t1(a, b, c, PRIMARY KEY(a,b)) WITHOUT rowid; 30*00012df4Sdrh CREATE TABLE t2(x); 31*00012df4Sdrh SELECT c FROM t1 ORDER BY c; 32*00012df4Sdrh } 33*00012df4Sdrh} {} 34*00012df4Sdrh 35*00012df4Sdrh# Six columns of configuration data as follows: 36*00012df4Sdrh# 37*00012df4Sdrh# i The reference number of the test 38*00012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 39*00012df4Sdrh# t0 True if there is an error from $cmd 40*00012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 41*00012df4Sdrh# t2 Content of "x" column of t2 42*00012df4Sdrh# t3 Number of temporary files created by this test 43*00012df4Sdrh# 44*00012df4Sdrhforeach {i cmd t0 t1 t2 t3} { 45*00012df4Sdrh 1 INSERT 1 {} 1 0 46*00012df4Sdrh 2 {INSERT OR IGNORE} 0 3 1 0 47*00012df4Sdrh 3 {INSERT OR REPLACE} 0 4 1 0 48*00012df4Sdrh 4 REPLACE 0 4 1 0 49*00012df4Sdrh 5 {INSERT OR FAIL} 1 {} 1 0 50*00012df4Sdrh 6 {INSERT OR ABORT} 1 {} 1 0 51*00012df4Sdrh 7 {INSERT OR ROLLBACK} 1 {} {} 0 52*00012df4Sdrh} { 53*00012df4Sdrh do_test conflict2-1.$i { 54*00012df4Sdrh set ::sqlite_opentemp_count 0 55*00012df4Sdrh set r0 [catch {execsql [subst { 56*00012df4Sdrh DELETE FROM t1; 57*00012df4Sdrh DELETE FROM t2; 58*00012df4Sdrh INSERT INTO t1 VALUES(1,2,3); 59*00012df4Sdrh BEGIN; 60*00012df4Sdrh INSERT INTO t2 VALUES(1); 61*00012df4Sdrh $cmd INTO t1 VALUES(1,2,4); 62*00012df4Sdrh }]} r1] 63*00012df4Sdrh catch {execsql {COMMIT}} 64*00012df4Sdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 65*00012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 66*00012df4Sdrh set r3 $::sqlite_opentemp_count 67*00012df4Sdrh list $r0 $r1 $r2 $r3 68*00012df4Sdrh } [list $t0 $t1 $t2 $t3] 69*00012df4Sdrh} 70*00012df4Sdrh 71*00012df4Sdrh# Create tables for the first group of tests. 72*00012df4Sdrh# 73*00012df4Sdrhdo_test conflict2-2.0 { 74*00012df4Sdrh execsql { 75*00012df4Sdrh DROP TABLE t1; 76*00012df4Sdrh DROP TABLE t2; 77*00012df4Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(a,b)) WITHOUT rowid; 78*00012df4Sdrh CREATE TABLE t2(x); 79*00012df4Sdrh SELECT c FROM t1 ORDER BY c; 80*00012df4Sdrh } 81*00012df4Sdrh} {} 82*00012df4Sdrh 83*00012df4Sdrh# Six columns of configuration data as follows: 84*00012df4Sdrh# 85*00012df4Sdrh# i The reference number of the test 86*00012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 87*00012df4Sdrh# t0 True if there is an error from $cmd 88*00012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 89*00012df4Sdrh# t2 Content of "x" column of t2 90*00012df4Sdrh# 91*00012df4Sdrhforeach {i cmd t0 t1 t2} { 92*00012df4Sdrh 1 INSERT 1 {} 1 93*00012df4Sdrh 2 {INSERT OR IGNORE} 0 3 1 94*00012df4Sdrh 3 {INSERT OR REPLACE} 0 4 1 95*00012df4Sdrh 4 REPLACE 0 4 1 96*00012df4Sdrh 5 {INSERT OR FAIL} 1 {} 1 97*00012df4Sdrh 6 {INSERT OR ABORT} 1 {} 1 98*00012df4Sdrh 7 {INSERT OR ROLLBACK} 1 {} {} 99*00012df4Sdrh} { 100*00012df4Sdrh do_test conflict2-2.$i { 101*00012df4Sdrh set r0 [catch {execsql [subst { 102*00012df4Sdrh DELETE FROM t1; 103*00012df4Sdrh DELETE FROM t2; 104*00012df4Sdrh INSERT INTO t1 VALUES(1,2,3); 105*00012df4Sdrh BEGIN; 106*00012df4Sdrh INSERT INTO t2 VALUES(1); 107*00012df4Sdrh $cmd INTO t1 VALUES(1,2,4); 108*00012df4Sdrh }]} r1] 109*00012df4Sdrh catch {execsql {COMMIT}} 110*00012df4Sdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 111*00012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 112*00012df4Sdrh list $r0 $r1 $r2 113*00012df4Sdrh } [list $t0 $t1 $t2] 114*00012df4Sdrh} 115*00012df4Sdrh 116*00012df4Sdrh# Create tables for the first group of tests. 117*00012df4Sdrh# 118*00012df4Sdrhdo_test conflict2-3.0 { 119*00012df4Sdrh execsql { 120*00012df4Sdrh DROP TABLE t1; 121*00012df4Sdrh DROP TABLE t2; 122*00012df4Sdrh CREATE TABLE t1(a, b, c INTEGER, PRIMARY KEY(c), UNIQUE(a,b)) WITHOUT rowid; 123*00012df4Sdrh CREATE TABLE t2(x); 124*00012df4Sdrh SELECT c FROM t1 ORDER BY c; 125*00012df4Sdrh } 126*00012df4Sdrh} {} 127*00012df4Sdrh 128*00012df4Sdrh# Six columns of configuration data as follows: 129*00012df4Sdrh# 130*00012df4Sdrh# i The reference number of the test 131*00012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 132*00012df4Sdrh# t0 True if there is an error from $cmd 133*00012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 134*00012df4Sdrh# t2 Content of "x" column of t2 135*00012df4Sdrh# 136*00012df4Sdrhforeach {i cmd t0 t1 t2} { 137*00012df4Sdrh 1 INSERT 1 {} 1 138*00012df4Sdrh 2 {INSERT OR IGNORE} 0 3 1 139*00012df4Sdrh 3 {INSERT OR REPLACE} 0 4 1 140*00012df4Sdrh 4 REPLACE 0 4 1 141*00012df4Sdrh 5 {INSERT OR FAIL} 1 {} 1 142*00012df4Sdrh 6 {INSERT OR ABORT} 1 {} 1 143*00012df4Sdrh 7 {INSERT OR ROLLBACK} 1 {} {} 144*00012df4Sdrh} { 145*00012df4Sdrh do_test conflict2-3.$i { 146*00012df4Sdrh set r0 [catch {execsql [subst { 147*00012df4Sdrh DELETE FROM t1; 148*00012df4Sdrh DELETE FROM t2; 149*00012df4Sdrh INSERT INTO t1 VALUES(1,2,3); 150*00012df4Sdrh BEGIN; 151*00012df4Sdrh INSERT INTO t2 VALUES(1); 152*00012df4Sdrh $cmd INTO t1 VALUES(1,2,4); 153*00012df4Sdrh }]} r1] 154*00012df4Sdrh catch {execsql {COMMIT}} 155*00012df4Sdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 156*00012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 157*00012df4Sdrh list $r0 $r1 $r2 158*00012df4Sdrh } [list $t0 $t1 $t2] 159*00012df4Sdrh} 160*00012df4Sdrh 161*00012df4Sdrhdo_test conflict2-4.0 { 162*00012df4Sdrh execsql { 163*00012df4Sdrh DROP TABLE t2; 164*00012df4Sdrh CREATE TABLE t2(x); 165*00012df4Sdrh SELECT x FROM t2; 166*00012df4Sdrh } 167*00012df4Sdrh} {} 168*00012df4Sdrh 169*00012df4Sdrh# Six columns of configuration data as follows: 170*00012df4Sdrh# 171*00012df4Sdrh# i The reference number of the test 172*00012df4Sdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 173*00012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 174*00012df4Sdrh# t0 True if there is an error from $cmd 175*00012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 176*00012df4Sdrh# t2 Content of "x" column of t2 177*00012df4Sdrh# 178*00012df4Sdrhforeach {i conf1 cmd t0 t1 t2} { 179*00012df4Sdrh 1 {} INSERT 1 {} 1 180*00012df4Sdrh 2 REPLACE INSERT 0 4 1 181*00012df4Sdrh 3 IGNORE INSERT 0 3 1 182*00012df4Sdrh 4 FAIL INSERT 1 {} 1 183*00012df4Sdrh 5 ABORT INSERT 1 {} 1 184*00012df4Sdrh 6 ROLLBACK INSERT 1 {} {} 185*00012df4Sdrh 7 REPLACE {INSERT OR IGNORE} 0 3 1 186*00012df4Sdrh 8 IGNORE {INSERT OR REPLACE} 0 4 1 187*00012df4Sdrh 9 FAIL {INSERT OR IGNORE} 0 3 1 188*00012df4Sdrh 10 ABORT {INSERT OR REPLACE} 0 4 1 189*00012df4Sdrh 11 ROLLBACK {INSERT OR IGNORE } 0 3 1 190*00012df4Sdrh} { 191*00012df4Sdrh do_test conflict2-4.$i { 192*00012df4Sdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 193*00012df4Sdrh set r0 [catch {execsql [subst { 194*00012df4Sdrh DROP TABLE t1; 195*00012df4Sdrh CREATE TABLE t1(a,b,c,PRIMARY KEY(a,b) $conf1) WITHOUT rowid; 196*00012df4Sdrh DELETE FROM t2; 197*00012df4Sdrh INSERT INTO t1 VALUES(1,2,3); 198*00012df4Sdrh BEGIN; 199*00012df4Sdrh INSERT INTO t2 VALUES(1); 200*00012df4Sdrh $cmd INTO t1 VALUES(1,2,4); 201*00012df4Sdrh }]} r1] 202*00012df4Sdrh catch {execsql {COMMIT}} 203*00012df4Sdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 204*00012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 205*00012df4Sdrh list $r0 $r1 $r2 206*00012df4Sdrh } [list $t0 $t1 $t2] 207*00012df4Sdrh} 208*00012df4Sdrh 209*00012df4Sdrhdo_test conflict2-5.0 { 210*00012df4Sdrh execsql { 211*00012df4Sdrh DROP TABLE t2; 212*00012df4Sdrh CREATE TABLE t2(x); 213*00012df4Sdrh SELECT x FROM t2; 214*00012df4Sdrh } 215*00012df4Sdrh} {} 216*00012df4Sdrh 217*00012df4Sdrh# Six columns of configuration data as follows: 218*00012df4Sdrh# 219*00012df4Sdrh# i The reference number of the test 220*00012df4Sdrh# conf1 The conflict resolution algorithm on the NOT NULL constraint 221*00012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 222*00012df4Sdrh# t0 True if there is an error from $cmd 223*00012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 224*00012df4Sdrh# t2 Content of "x" column of t2 225*00012df4Sdrh# 226*00012df4Sdrhforeach {i conf1 cmd t0 t1 t2} { 227*00012df4Sdrh 1 {} INSERT 1 {} 1 228*00012df4Sdrh 2 REPLACE INSERT 0 5 1 229*00012df4Sdrh 3 IGNORE INSERT 0 {} 1 230*00012df4Sdrh 4 FAIL INSERT 1 {} 1 231*00012df4Sdrh 5 ABORT INSERT 1 {} 1 232*00012df4Sdrh 6 ROLLBACK INSERT 1 {} {} 233*00012df4Sdrh 7 REPLACE {INSERT OR IGNORE} 0 {} 1 234*00012df4Sdrh 8 IGNORE {INSERT OR REPLACE} 0 5 1 235*00012df4Sdrh 9 FAIL {INSERT OR IGNORE} 0 {} 1 236*00012df4Sdrh 10 ABORT {INSERT OR REPLACE} 0 5 1 237*00012df4Sdrh 11 ROLLBACK {INSERT OR IGNORE} 0 {} 1 238*00012df4Sdrh 12 {} {INSERT OR IGNORE} 0 {} 1 239*00012df4Sdrh 13 {} {INSERT OR REPLACE} 0 5 1 240*00012df4Sdrh 14 {} {INSERT OR FAIL} 1 {} 1 241*00012df4Sdrh 15 {} {INSERT OR ABORT} 1 {} 1 242*00012df4Sdrh 16 {} {INSERT OR ROLLBACK} 1 {} {} 243*00012df4Sdrh} { 244*00012df4Sdrh if {$t0} {set t1 {t1.c may not be NULL}} 245*00012df4Sdrh do_test conflict2-5.$i { 246*00012df4Sdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 247*00012df4Sdrh set r0 [catch {execsql [subst { 248*00012df4Sdrh DROP TABLE t1; 249*00012df4Sdrh CREATE TABLE t1(a,b,c NOT NULL $conf1 DEFAULT 5); 250*00012df4Sdrh DELETE FROM t2; 251*00012df4Sdrh BEGIN; 252*00012df4Sdrh INSERT INTO t2 VALUES(1); 253*00012df4Sdrh $cmd INTO t1 VALUES(1,2,NULL); 254*00012df4Sdrh }]} r1] 255*00012df4Sdrh catch {execsql {COMMIT}} 256*00012df4Sdrh if {!$r0} {set r1 [execsql {SELECT c FROM t1}]} 257*00012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 258*00012df4Sdrh list $r0 $r1 $r2 259*00012df4Sdrh } [list $t0 $t1 $t2] 260*00012df4Sdrh} 261*00012df4Sdrh 262*00012df4Sdrhdo_test conflict2-6.0 { 263*00012df4Sdrh execsql { 264*00012df4Sdrh DROP TABLE t2; 265*00012df4Sdrh CREATE TABLE t2(a,b,c); 266*00012df4Sdrh INSERT INTO t2 VALUES(1,2,1); 267*00012df4Sdrh INSERT INTO t2 VALUES(2,3,2); 268*00012df4Sdrh INSERT INTO t2 VALUES(3,4,1); 269*00012df4Sdrh INSERT INTO t2 VALUES(4,5,4); 270*00012df4Sdrh SELECT c FROM t2 ORDER BY b; 271*00012df4Sdrh CREATE TABLE t3(x); 272*00012df4Sdrh INSERT INTO t3 VALUES(1); 273*00012df4Sdrh } 274*00012df4Sdrh} {1 2 1 4} 275*00012df4Sdrh 276*00012df4Sdrh# Six columns of configuration data as follows: 277*00012df4Sdrh# 278*00012df4Sdrh# i The reference number of the test 279*00012df4Sdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 280*00012df4Sdrh# cmd An UPDATE command to execute against table t1 281*00012df4Sdrh# t0 True if there is an error from $cmd 282*00012df4Sdrh# t1 Content of "b" column of t1 assuming no error in $cmd 283*00012df4Sdrh# t2 Content of "x" column of t3 284*00012df4Sdrh# t3 Number of temporary files for tables 285*00012df4Sdrh# t4 Number of temporary files for statement journals 286*00012df4Sdrh# 287*00012df4Sdrh# Update: Since temporary table files are now opened lazily, and none 288*00012df4Sdrh# of the following tests use large quantities of data, t3 is always 0. 289*00012df4Sdrh# 290*00012df4Sdrhforeach {i conf1 cmd t0 t1 t2 t3 t4} { 291*00012df4Sdrh 1 {} UPDATE 1 {6 7 8 9} 1 0 1 292*00012df4Sdrh 2 REPLACE UPDATE 0 {7 6 9} 1 0 0 293*00012df4Sdrh 3 IGNORE UPDATE 0 {6 7 3 9} 1 0 0 294*00012df4Sdrh 4 FAIL UPDATE 1 {6 7 3 4} 1 0 0 295*00012df4Sdrh 5 ABORT UPDATE 1 {1 2 3 4} 1 0 1 296*00012df4Sdrh 6 ROLLBACK UPDATE 1 {1 2 3 4} 0 0 0 297*00012df4Sdrh 7 REPLACE {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 298*00012df4Sdrh 8 IGNORE {UPDATE OR REPLACE} 0 {7 6 9} 1 0 1 299*00012df4Sdrh 9 FAIL {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 300*00012df4Sdrh 10 ABORT {UPDATE OR REPLACE} 0 {7 6 9} 1 0 1 301*00012df4Sdrh 11 ROLLBACK {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 302*00012df4Sdrh 12 {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 303*00012df4Sdrh 13 {} {UPDATE OR REPLACE} 0 {7 6 9} 1 0 1 304*00012df4Sdrh 14 {} {UPDATE OR FAIL} 1 {6 7 3 4} 1 0 0 305*00012df4Sdrh 15 {} {UPDATE OR ABORT} 1 {1 2 3 4} 1 0 1 306*00012df4Sdrh 16 {} {UPDATE OR ROLLBACK} 1 {1 2 3 4} 0 0 0 307*00012df4Sdrh} { 308*00012df4Sdrh if {$t0} {set t1 {PRIMARY KEY must be unique}} 309*00012df4Sdrh if {[info exists TEMP_STORE] && $TEMP_STORE==3} { 310*00012df4Sdrh set t3 0 311*00012df4Sdrh } else { 312*00012df4Sdrh set t3 [expr {$t3+$t4}] 313*00012df4Sdrh } 314*00012df4Sdrh do_test conflict2-6.$i { 315*00012df4Sdrh db close 316*00012df4Sdrh sqlite3 db test.db 317*00012df4Sdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 318*00012df4Sdrh execsql {pragma temp_store=file} 319*00012df4Sdrh set ::sqlite_opentemp_count 0 320*00012df4Sdrh set r0 [catch {execsql [subst { 321*00012df4Sdrh DROP TABLE t1; 322*00012df4Sdrh CREATE TABLE t1(a,b,c, PRIMARY KEY(a) $conf1) WITHOUT rowid; 323*00012df4Sdrh INSERT INTO t1 SELECT * FROM t2; 324*00012df4Sdrh UPDATE t3 SET x=0; 325*00012df4Sdrh BEGIN; 326*00012df4Sdrh $cmd t3 SET x=1; 327*00012df4Sdrh $cmd t1 SET b=b*2; 328*00012df4Sdrh $cmd t1 SET a=c+5; 329*00012df4Sdrh }]} r1] 330*00012df4Sdrh catch {execsql {COMMIT}} 331*00012df4Sdrh if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]} 332*00012df4Sdrh set r2 [execsql {SELECT x FROM t3}] 333*00012df4Sdrh list $r0 $r1 $r2 $::sqlite_opentemp_count 334*00012df4Sdrh } [list $t0 $t1 $t2 $t3] 335*00012df4Sdrh} 336*00012df4Sdrh 337*00012df4Sdrh# Test to make sure a lot of IGNOREs don't cause a stack overflow 338*00012df4Sdrh# 339*00012df4Sdrhdo_test conflict2-7.1 { 340*00012df4Sdrh execsql { 341*00012df4Sdrh DROP TABLE t1; 342*00012df4Sdrh DROP TABLE t2; 343*00012df4Sdrh DROP TABLE t3; 344*00012df4Sdrh CREATE TABLE t1(a PRIMARY KEY, b) without rowid; 345*00012df4Sdrh } 346*00012df4Sdrh for {set i 1} {$i<=50} {incr i} { 347*00012df4Sdrh execsql "INSERT into t1 values($i,[expr {$i+1}]);" 348*00012df4Sdrh } 349*00012df4Sdrh execsql { 350*00012df4Sdrh SELECT count(*), min(a), max(b) FROM t1; 351*00012df4Sdrh } 352*00012df4Sdrh} {50 1 51} 353*00012df4Sdrhdo_test conflict2-7.2 { 354*00012df4Sdrh execsql { 355*00012df4Sdrh PRAGMA count_changes=on; 356*00012df4Sdrh UPDATE OR IGNORE t1 SET a=1000; 357*00012df4Sdrh } 358*00012df4Sdrh} {1} 359*00012df4Sdrhdo_test conflict2-7.2.1 { 360*00012df4Sdrh db changes 361*00012df4Sdrh} {1} 362*00012df4Sdrhdo_test conflict2-7.3 { 363*00012df4Sdrh execsql { 364*00012df4Sdrh SELECT b FROM t1 WHERE a=1000; 365*00012df4Sdrh } 366*00012df4Sdrh} {2} 367*00012df4Sdrhdo_test conflict2-7.4 { 368*00012df4Sdrh execsql { 369*00012df4Sdrh SELECT count(*) FROM t1; 370*00012df4Sdrh } 371*00012df4Sdrh} {50} 372*00012df4Sdrhdo_test conflict2-7.5 { 373*00012df4Sdrh execsql { 374*00012df4Sdrh PRAGMA count_changes=on; 375*00012df4Sdrh UPDATE OR REPLACE t1 SET a=1001; 376*00012df4Sdrh } 377*00012df4Sdrh} {50} 378*00012df4Sdrhdo_test conflict2-7.5.1 { 379*00012df4Sdrh db changes 380*00012df4Sdrh} {50} 381*00012df4Sdrhdo_test conflict2-7.6 { 382*00012df4Sdrh execsql { 383*00012df4Sdrh SELECT b FROM t1 WHERE a=1001; 384*00012df4Sdrh } 385*00012df4Sdrh} {51} 386*00012df4Sdrhdo_test conflict2-7.7 { 387*00012df4Sdrh execsql { 388*00012df4Sdrh SELECT count(*) FROM t1; 389*00012df4Sdrh } 390*00012df4Sdrh} {1} 391*00012df4Sdrh 392*00012df4Sdrh# Update for version 3: A SELECT statement no longer resets the change 393*00012df4Sdrh# counter (Test result changes from 0 to 50). 394*00012df4Sdrhdo_test conflict2-7.7.1 { 395*00012df4Sdrh db changes 396*00012df4Sdrh} {50} 397*00012df4Sdrh 398*00012df4Sdrh# Make sure the row count is right for rows that are ignored on 399*00012df4Sdrh# an insert. 400*00012df4Sdrh# 401*00012df4Sdrhdo_test conflict2-8.1 { 402*00012df4Sdrh execsql { 403*00012df4Sdrh DELETE FROM t1; 404*00012df4Sdrh INSERT INTO t1 VALUES(1,2); 405*00012df4Sdrh } 406*00012df4Sdrh execsql { 407*00012df4Sdrh INSERT OR IGNORE INTO t1 VALUES(2,3); 408*00012df4Sdrh } 409*00012df4Sdrh} {1} 410*00012df4Sdrhdo_test conflict2-8.1.1 { 411*00012df4Sdrh db changes 412*00012df4Sdrh} {1} 413*00012df4Sdrhdo_test conflict2-8.2 { 414*00012df4Sdrh execsql { 415*00012df4Sdrh INSERT OR IGNORE INTO t1 VALUES(2,4); 416*00012df4Sdrh } 417*00012df4Sdrh} {0} 418*00012df4Sdrhdo_test conflict2-8.2.1 { 419*00012df4Sdrh db changes 420*00012df4Sdrh} {0} 421*00012df4Sdrhdo_test conflict2-8.3 { 422*00012df4Sdrh execsql { 423*00012df4Sdrh INSERT OR REPLACE INTO t1 VALUES(2,4); 424*00012df4Sdrh } 425*00012df4Sdrh} {1} 426*00012df4Sdrhdo_test conflict2-8.3.1 { 427*00012df4Sdrh db changes 428*00012df4Sdrh} {1} 429*00012df4Sdrhdo_test conflict2-8.4 { 430*00012df4Sdrh execsql { 431*00012df4Sdrh INSERT OR IGNORE INTO t1 SELECT * FROM t1; 432*00012df4Sdrh } 433*00012df4Sdrh} {0} 434*00012df4Sdrhdo_test conflict2-8.4.1 { 435*00012df4Sdrh db changes 436*00012df4Sdrh} {0} 437*00012df4Sdrhdo_test conflict2-8.5 { 438*00012df4Sdrh execsql { 439*00012df4Sdrh INSERT OR IGNORE INTO t1 SELECT a+2,b+2 FROM t1; 440*00012df4Sdrh } 441*00012df4Sdrh} {2} 442*00012df4Sdrhdo_test conflict2-8.5.1 { 443*00012df4Sdrh db changes 444*00012df4Sdrh} {2} 445*00012df4Sdrhdo_test conflict2-8.6 { 446*00012df4Sdrh execsql { 447*00012df4Sdrh INSERT OR IGNORE INTO t1 SELECT a+3,b+3 FROM t1; 448*00012df4Sdrh } 449*00012df4Sdrh} {3} 450*00012df4Sdrhdo_test conflict2-8.6.1 { 451*00012df4Sdrh db changes 452*00012df4Sdrh} {3} 453*00012df4Sdrh 454*00012df4Sdrhintegrity_check conflict2-8.99 455*00012df4Sdrh 456*00012df4Sdrhdo_test conflict2-9.1 { 457*00012df4Sdrh execsql { 458*00012df4Sdrh PRAGMA count_changes=0; 459*00012df4Sdrh CREATE TABLE t2( 460*00012df4Sdrh a INTEGER PRIMARY KEY ON CONFLICT IGNORE, 461*00012df4Sdrh b INTEGER UNIQUE ON CONFLICT FAIL, 462*00012df4Sdrh c INTEGER UNIQUE ON CONFLICT REPLACE, 463*00012df4Sdrh d INTEGER UNIQUE ON CONFLICT ABORT, 464*00012df4Sdrh e INTEGER UNIQUE ON CONFLICT ROLLBACK 465*00012df4Sdrh ) WITHOUT rowid; 466*00012df4Sdrh CREATE TABLE t3(x); 467*00012df4Sdrh INSERT INTO t3 VALUES(1); 468*00012df4Sdrh SELECT * FROM t3; 469*00012df4Sdrh } 470*00012df4Sdrh} {1} 471*00012df4Sdrhdo_test conflict2-9.2 { 472*00012df4Sdrh catchsql { 473*00012df4Sdrh INSERT INTO t2 VALUES(1,1,1,1,1); 474*00012df4Sdrh INSERT INTO t2 VALUES(2,2,2,2,2); 475*00012df4Sdrh SELECT * FROM t2; 476*00012df4Sdrh } 477*00012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 478*00012df4Sdrhdo_test conflict2-9.3 { 479*00012df4Sdrh catchsql { 480*00012df4Sdrh INSERT INTO t2 VALUES(1,3,3,3,3); 481*00012df4Sdrh SELECT * FROM t2; 482*00012df4Sdrh } 483*00012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 484*00012df4Sdrhdo_test conflict2-9.4 { 485*00012df4Sdrh catchsql { 486*00012df4Sdrh UPDATE t2 SET a=a+1 WHERE a=1; 487*00012df4Sdrh SELECT * FROM t2; 488*00012df4Sdrh } 489*00012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 490*00012df4Sdrhdo_test conflict2-9.5 { 491*00012df4Sdrh catchsql { 492*00012df4Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 493*00012df4Sdrh } 494*00012df4Sdrh} {1 {column b is not unique}} 495*00012df4Sdrhdo_test conflict2-9.5b { 496*00012df4Sdrh db eval {SELECT * FROM t2;} 497*00012df4Sdrh} {1 1 1 1 1 2 2 2 2 2} 498*00012df4Sdrhdo_test conflict2-9.6 { 499*00012df4Sdrh catchsql { 500*00012df4Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 501*00012df4Sdrh SELECT * FROM t2; 502*00012df4Sdrh } 503*00012df4Sdrh} {1 {column b is not unique}} 504*00012df4Sdrhdo_test conflict2-9.6b { 505*00012df4Sdrh db eval {SELECT * FROM t2;} 506*00012df4Sdrh} {1 1 1 1 1 2 2 2 2 2} 507*00012df4Sdrhdo_test conflict2-9.7 { 508*00012df4Sdrh catchsql { 509*00012df4Sdrh BEGIN; 510*00012df4Sdrh UPDATE t3 SET x=x+1; 511*00012df4Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 512*00012df4Sdrh SELECT * FROM t2; 513*00012df4Sdrh } 514*00012df4Sdrh} {1 {column b is not unique}} 515*00012df4Sdrhdo_test conflict2-9.8 { 516*00012df4Sdrh execsql {COMMIT} 517*00012df4Sdrh execsql {SELECT * FROM t3} 518*00012df4Sdrh} {2} 519*00012df4Sdrhdo_test conflict2-9.9 { 520*00012df4Sdrh catchsql { 521*00012df4Sdrh BEGIN; 522*00012df4Sdrh UPDATE t3 SET x=x+1; 523*00012df4Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 524*00012df4Sdrh SELECT * FROM t2; 525*00012df4Sdrh } 526*00012df4Sdrh} {1 {column b is not unique}} 527*00012df4Sdrhdo_test conflict2-9.10 { 528*00012df4Sdrh execsql {COMMIT} 529*00012df4Sdrh execsql {SELECT * FROM t3} 530*00012df4Sdrh} {3} 531*00012df4Sdrhdo_test conflict2-9.11 { 532*00012df4Sdrh catchsql { 533*00012df4Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 534*00012df4Sdrh SELECT * FROM t2; 535*00012df4Sdrh } 536*00012df4Sdrh} {1 {column d is not unique}} 537*00012df4Sdrhdo_test conflict2-9.12 { 538*00012df4Sdrh catchsql { 539*00012df4Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 540*00012df4Sdrh SELECT * FROM t2; 541*00012df4Sdrh } 542*00012df4Sdrh} {1 {column d is not unique}} 543*00012df4Sdrhdo_test conflict2-9.13 { 544*00012df4Sdrh catchsql { 545*00012df4Sdrh BEGIN; 546*00012df4Sdrh UPDATE t3 SET x=x+1; 547*00012df4Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 548*00012df4Sdrh SELECT * FROM t2; 549*00012df4Sdrh } 550*00012df4Sdrh} {1 {column d is not unique}} 551*00012df4Sdrhdo_test conflict2-9.14 { 552*00012df4Sdrh execsql {COMMIT} 553*00012df4Sdrh execsql {SELECT * FROM t3} 554*00012df4Sdrh} {4} 555*00012df4Sdrhdo_test conflict2-9.15 { 556*00012df4Sdrh catchsql { 557*00012df4Sdrh BEGIN; 558*00012df4Sdrh UPDATE t3 SET x=x+1; 559*00012df4Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 560*00012df4Sdrh SELECT * FROM t2; 561*00012df4Sdrh } 562*00012df4Sdrh} {1 {column d is not unique}} 563*00012df4Sdrhdo_test conflict2-9.16 { 564*00012df4Sdrh execsql {COMMIT} 565*00012df4Sdrh execsql {SELECT * FROM t3} 566*00012df4Sdrh} {5} 567*00012df4Sdrhdo_test conflict2-9.17 { 568*00012df4Sdrh catchsql { 569*00012df4Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 570*00012df4Sdrh SELECT * FROM t2; 571*00012df4Sdrh } 572*00012df4Sdrh} {1 {column e is not unique}} 573*00012df4Sdrhdo_test conflict2-9.18 { 574*00012df4Sdrh catchsql { 575*00012df4Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 576*00012df4Sdrh SELECT * FROM t2; 577*00012df4Sdrh } 578*00012df4Sdrh} {1 {column e is not unique}} 579*00012df4Sdrhdo_test conflict2-9.19 { 580*00012df4Sdrh catchsql { 581*00012df4Sdrh BEGIN; 582*00012df4Sdrh UPDATE t3 SET x=x+1; 583*00012df4Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 584*00012df4Sdrh SELECT * FROM t2; 585*00012df4Sdrh } 586*00012df4Sdrh} {1 {column e is not unique}} 587*00012df4Sdrhverify_ex_errcode conflict2-9.21b SQLITE_CONSTRAINT_UNIQUE 588*00012df4Sdrhdo_test conflict2-9.20 { 589*00012df4Sdrh catch {execsql {COMMIT}} 590*00012df4Sdrh execsql {SELECT * FROM t3} 591*00012df4Sdrh} {5} 592*00012df4Sdrhdo_test conflict2-9.21 { 593*00012df4Sdrh catchsql { 594*00012df4Sdrh BEGIN; 595*00012df4Sdrh UPDATE t3 SET x=x+1; 596*00012df4Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 597*00012df4Sdrh SELECT * FROM t2; 598*00012df4Sdrh } 599*00012df4Sdrh} {1 {column e is not unique}} 600*00012df4Sdrhverify_ex_errcode conflict2-9.21b SQLITE_CONSTRAINT_UNIQUE 601*00012df4Sdrhdo_test conflict2-9.22 { 602*00012df4Sdrh catch {execsql {COMMIT}} 603*00012df4Sdrh execsql {SELECT * FROM t3} 604*00012df4Sdrh} {5} 605*00012df4Sdrhdo_test conflict2-9.23 { 606*00012df4Sdrh catchsql { 607*00012df4Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 608*00012df4Sdrh SELECT * FROM t2; 609*00012df4Sdrh } 610*00012df4Sdrh} {0 {2 2 2 2 2 3 3 1 3 3}} 611*00012df4Sdrhdo_test conflict2-9.24 { 612*00012df4Sdrh catchsql { 613*00012df4Sdrh UPDATE t2 SET c=c-1 WHERE c=2; 614*00012df4Sdrh SELECT * FROM t2; 615*00012df4Sdrh } 616*00012df4Sdrh} {0 {2 2 1 2 2}} 617*00012df4Sdrhdo_test conflict2-9.25 { 618*00012df4Sdrh catchsql { 619*00012df4Sdrh BEGIN; 620*00012df4Sdrh UPDATE t3 SET x=x+1; 621*00012df4Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 622*00012df4Sdrh SELECT * FROM t2; 623*00012df4Sdrh } 624*00012df4Sdrh} {0 {3 3 1 3 3}} 625*00012df4Sdrhdo_test conflict2-9.26 { 626*00012df4Sdrh catch {execsql {COMMIT}} 627*00012df4Sdrh execsql {SELECT * FROM t3} 628*00012df4Sdrh} {6} 629*00012df4Sdrh 630*00012df4Sdrhdo_test conflict2-10.1 { 631*00012df4Sdrh catchsql { 632*00012df4Sdrh DELETE FROM t1; 633*00012df4Sdrh BEGIN; 634*00012df4Sdrh INSERT OR ROLLBACK INTO t1 VALUES(1,2); 635*00012df4Sdrh INSERT OR ROLLBACK INTO t1 VALUES(1,3); 636*00012df4Sdrh COMMIT; 637*00012df4Sdrh } 638*00012df4Sdrh execsql {SELECT * FROM t1} 639*00012df4Sdrh} {} 640*00012df4Sdrhdo_test conflict2-10.2 { 641*00012df4Sdrh catchsql { 642*00012df4Sdrh CREATE TABLE t4(x); 643*00012df4Sdrh CREATE UNIQUE INDEX t4x ON t4(x); 644*00012df4Sdrh BEGIN; 645*00012df4Sdrh INSERT OR ROLLBACK INTO t4 VALUES(1); 646*00012df4Sdrh INSERT OR ROLLBACK INTO t4 VALUES(1); 647*00012df4Sdrh COMMIT; 648*00012df4Sdrh } 649*00012df4Sdrh execsql {SELECT * FROM t4} 650*00012df4Sdrh} {} 651*00012df4Sdrh 652*00012df4Sdrh# Ticket #1171. Make sure statement rollbacks do not 653*00012df4Sdrh# damage the database. 654*00012df4Sdrh# 655*00012df4Sdrhdo_test conflict2-11.1 { 656*00012df4Sdrh execsql { 657*00012df4Sdrh -- Create a database object (pages 2, 3 of the file) 658*00012df4Sdrh BEGIN; 659*00012df4Sdrh CREATE TABLE abc(a PRIMARY KEY, b, c) WITHOUT rowid; 660*00012df4Sdrh INSERT INTO abc VALUES(1, 2, 3); 661*00012df4Sdrh INSERT INTO abc VALUES(4, 5, 6); 662*00012df4Sdrh INSERT INTO abc VALUES(7, 8, 9); 663*00012df4Sdrh COMMIT; 664*00012df4Sdrh } 665*00012df4Sdrh 666*00012df4Sdrh 667*00012df4Sdrh # Set a small cache size so that changes will spill into 668*00012df4Sdrh # the database file. 669*00012df4Sdrh execsql { 670*00012df4Sdrh PRAGMA cache_size = 10; 671*00012df4Sdrh } 672*00012df4Sdrh 673*00012df4Sdrh # Make lots of changes. Because of the small cache, some 674*00012df4Sdrh # (most?) of these changes will spill into the disk file. 675*00012df4Sdrh # In other words, some of the changes will not be held in 676*00012df4Sdrh # cache. 677*00012df4Sdrh # 678*00012df4Sdrh execsql { 679*00012df4Sdrh BEGIN; 680*00012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 681*00012df4Sdrh CREATE TABLE def(d, e, f); 682*00012df4Sdrh INSERT INTO def VALUES 683*00012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 684*00012df4Sdrh INSERT INTO def SELECT * FROM def; 685*00012df4Sdrh INSERT INTO def SELECT * FROM def; 686*00012df4Sdrh INSERT INTO def SELECT * FROM def; 687*00012df4Sdrh INSERT INTO def SELECT * FROM def; 688*00012df4Sdrh INSERT INTO def SELECT * FROM def; 689*00012df4Sdrh INSERT INTO def SELECT * FROM def; 690*00012df4Sdrh INSERT INTO def SELECT * FROM def; 691*00012df4Sdrh DELETE FROM abc WHERE a = 4; 692*00012df4Sdrh } 693*00012df4Sdrh 694*00012df4Sdrh # Execute a statement that does a statement rollback due to 695*00012df4Sdrh # a constraint failure. 696*00012df4Sdrh # 697*00012df4Sdrh catchsql { 698*00012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 699*00012df4Sdrh } 700*00012df4Sdrh 701*00012df4Sdrh # Rollback the database. Verify that the state of the ABC table 702*00012df4Sdrh # is unchanged from the beginning of the transaction. In other words, 703*00012df4Sdrh # make sure the DELETE on table ABC that occurred within the transaction 704*00012df4Sdrh # had no effect. 705*00012df4Sdrh # 706*00012df4Sdrh execsql { 707*00012df4Sdrh ROLLBACK; 708*00012df4Sdrh SELECT * FROM abc; 709*00012df4Sdrh } 710*00012df4Sdrh} {1 2 3 4 5 6 7 8 9} 711*00012df4Sdrhintegrity_check conflict2-11.2 712*00012df4Sdrh 713*00012df4Sdrh# Repeat test conflict2-11.1 but this time commit. 714*00012df4Sdrh# 715*00012df4Sdrhdo_test conflict2-11.3 { 716*00012df4Sdrh execsql { 717*00012df4Sdrh BEGIN; 718*00012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 719*00012df4Sdrh UPDATE abc SET a=a+1; 720*00012df4Sdrh CREATE TABLE def(d, e, f); 721*00012df4Sdrh INSERT INTO def VALUES 722*00012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 723*00012df4Sdrh INSERT INTO def SELECT * FROM def; 724*00012df4Sdrh INSERT INTO def SELECT * FROM def; 725*00012df4Sdrh INSERT INTO def SELECT * FROM def; 726*00012df4Sdrh INSERT INTO def SELECT * FROM def; 727*00012df4Sdrh INSERT INTO def SELECT * FROM def; 728*00012df4Sdrh INSERT INTO def SELECT * FROM def; 729*00012df4Sdrh INSERT INTO def SELECT * FROM def; 730*00012df4Sdrh DELETE FROM abc WHERE a = 4; 731*00012df4Sdrh } 732*00012df4Sdrh catchsql { 733*00012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 734*00012df4Sdrh } 735*00012df4Sdrh execsql { 736*00012df4Sdrh ROLLBACK; 737*00012df4Sdrh SELECT * FROM abc; 738*00012df4Sdrh } 739*00012df4Sdrh} {1 2 3 4 5 6 7 8 9} 740*00012df4Sdrh# Repeat test conflict2-11.1 but this time commit. 741*00012df4Sdrh# 742*00012df4Sdrhdo_test conflict2-11.5 { 743*00012df4Sdrh execsql { 744*00012df4Sdrh BEGIN; 745*00012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 746*00012df4Sdrh CREATE TABLE def(d, e, f); 747*00012df4Sdrh INSERT INTO def VALUES 748*00012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 749*00012df4Sdrh INSERT INTO def SELECT * FROM def; 750*00012df4Sdrh INSERT INTO def SELECT * FROM def; 751*00012df4Sdrh INSERT INTO def SELECT * FROM def; 752*00012df4Sdrh INSERT INTO def SELECT * FROM def; 753*00012df4Sdrh INSERT INTO def SELECT * FROM def; 754*00012df4Sdrh INSERT INTO def SELECT * FROM def; 755*00012df4Sdrh INSERT INTO def SELECT * FROM def; 756*00012df4Sdrh DELETE FROM abc WHERE a = 4; 757*00012df4Sdrh } 758*00012df4Sdrh catchsql { 759*00012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 760*00012df4Sdrh } 761*00012df4Sdrh execsql { 762*00012df4Sdrh COMMIT; 763*00012df4Sdrh SELECT * FROM abc; 764*00012df4Sdrh } 765*00012df4Sdrh} {1 2 3 7 8 9} 766*00012df4Sdrhintegrity_check conflict2-11.6 767*00012df4Sdrh 768*00012df4Sdrh# Make sure UPDATE OR REPLACE works on tables that have only 769*00012df4Sdrh# an INTEGER PRIMARY KEY. 770*00012df4Sdrh# 771*00012df4Sdrhdo_test conflict2-12.1 { 772*00012df4Sdrh execsql { 773*00012df4Sdrh CREATE TABLE t5(a INTEGER PRIMARY KEY, b text) WITHOUT rowid; 774*00012df4Sdrh INSERT INTO t5 VALUES(1,'one'); 775*00012df4Sdrh INSERT INTO t5 VALUES(2,'two'); 776*00012df4Sdrh SELECT * FROM t5 777*00012df4Sdrh } 778*00012df4Sdrh} {1 one 2 two} 779*00012df4Sdrhdo_test conflict2-12.2 { 780*00012df4Sdrh execsql { 781*00012df4Sdrh UPDATE OR IGNORE t5 SET a=a+1 WHERE a=1; 782*00012df4Sdrh SELECT * FROM t5; 783*00012df4Sdrh } 784*00012df4Sdrh} {1 one 2 two} 785*00012df4Sdrhdo_test conflict2-12.3 { 786*00012df4Sdrh catchsql { 787*00012df4Sdrh UPDATE t5 SET a=a+1 WHERE a=1; 788*00012df4Sdrh } 789*00012df4Sdrh} {1 {PRIMARY KEY must be unique}} 790*00012df4Sdrhverify_ex_errcode conflict2-12.3b SQLITE_CONSTRAINT_PRIMARYKEY 791*00012df4Sdrhdo_test conflict2-12.4 { 792*00012df4Sdrh execsql { 793*00012df4Sdrh UPDATE OR REPLACE t5 SET a=a+1 WHERE a=1; 794*00012df4Sdrh SELECT * FROM t5; 795*00012df4Sdrh } 796*00012df4Sdrh} {2 one} 797*00012df4Sdrh 798*00012df4Sdrh 799*00012df4Sdrh# Ticket [c38baa3d969eab7946dc50ba9d9b4f0057a19437] 800*00012df4Sdrh# REPLACE works like ABORT on a CHECK constraint. 801*00012df4Sdrh# 802*00012df4Sdrhdo_test conflict2-13.1 { 803*00012df4Sdrh execsql { 804*00012df4Sdrh CREATE TABLE t13(a PRIMARY KEY CHECK(a!=2)) WITHOUT rowid; 805*00012df4Sdrh BEGIN; 806*00012df4Sdrh REPLACE INTO t13 VALUES(1); 807*00012df4Sdrh } 808*00012df4Sdrh catchsql { 809*00012df4Sdrh REPLACE INTO t13 VALUES(2); 810*00012df4Sdrh } 811*00012df4Sdrh} {1 {constraint failed}} 812*00012df4Sdrhverify_ex_errcode conflict2-13.1b SQLITE_CONSTRAINT_CHECK 813*00012df4Sdrhdo_test conflict2-13.2 { 814*00012df4Sdrh execsql { 815*00012df4Sdrh REPLACE INTO t13 VALUES(3); 816*00012df4Sdrh COMMIT; 817*00012df4Sdrh SELECT * FROM t13; 818*00012df4Sdrh } 819*00012df4Sdrh} {1 3} 820*00012df4Sdrh 821*00012df4Sdrh 822*00012df4Sdrhfinish_test 823