100012df4Sdrh# 2013-11-04 200012df4Sdrh# 300012df4Sdrh# The author disclaims copyright to this source code. In place of 400012df4Sdrh# a legal notice, here is a blessing: 500012df4Sdrh# 600012df4Sdrh# May you do good and not evil. 700012df4Sdrh# May you find forgiveness for yourself and forgive others. 800012df4Sdrh# May you share freely, never taking more than you give. 900012df4Sdrh# 1000012df4Sdrh#*********************************************************************** 1100012df4Sdrh# This file implements regression tests for SQLite library. 1200012df4Sdrh# 1300012df4Sdrh# This file implements tests for the conflict resolution extension 1400012df4Sdrh# in WITHOUT ROWID tables 1500012df4Sdrh# 1600012df4Sdrh 1700012df4Sdrhset testdir [file dirname $argv0] 1800012df4Sdrhsource $testdir/tester.tcl 1900012df4Sdrh 2000012df4Sdrhifcapable !conflict { 2100012df4Sdrh finish_test 2200012df4Sdrh return 2300012df4Sdrh} 2400012df4Sdrh 2500012df4Sdrh# Create tables for the first group of tests. 2600012df4Sdrh# 2700012df4Sdrhdo_test conflict2-1.0 { 2800012df4Sdrh execsql { 2900012df4Sdrh CREATE TABLE t1(a, b, c, PRIMARY KEY(a,b)) WITHOUT rowid; 3000012df4Sdrh CREATE TABLE t2(x); 3100012df4Sdrh SELECT c FROM t1 ORDER BY c; 3200012df4Sdrh } 3300012df4Sdrh} {} 3400012df4Sdrh 3500012df4Sdrh# Six columns of configuration data as follows: 3600012df4Sdrh# 3700012df4Sdrh# i The reference number of the test 3800012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 3900012df4Sdrh# t0 True if there is an error from $cmd 4000012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 4100012df4Sdrh# t2 Content of "x" column of t2 4200012df4Sdrh# t3 Number of temporary files created by this test 4300012df4Sdrh# 4400012df4Sdrhforeach {i cmd t0 t1 t2 t3} { 4500012df4Sdrh 1 INSERT 1 {} 1 0 4600012df4Sdrh 2 {INSERT OR IGNORE} 0 3 1 0 4700012df4Sdrh 3 {INSERT OR REPLACE} 0 4 1 0 4800012df4Sdrh 4 REPLACE 0 4 1 0 4900012df4Sdrh 5 {INSERT OR FAIL} 1 {} 1 0 5000012df4Sdrh 6 {INSERT OR ABORT} 1 {} 1 0 5100012df4Sdrh 7 {INSERT OR ROLLBACK} 1 {} {} 0 5200012df4Sdrh} { 5300012df4Sdrh do_test conflict2-1.$i { 5400012df4Sdrh set ::sqlite_opentemp_count 0 5500012df4Sdrh set r0 [catch {execsql [subst { 5600012df4Sdrh DELETE FROM t1; 5700012df4Sdrh DELETE FROM t2; 5800012df4Sdrh INSERT INTO t1 VALUES(1,2,3); 5900012df4Sdrh BEGIN; 6000012df4Sdrh INSERT INTO t2 VALUES(1); 6100012df4Sdrh $cmd INTO t1 VALUES(1,2,4); 6200012df4Sdrh }]} r1] 6300012df4Sdrh catch {execsql {COMMIT}} 6400012df4Sdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 6500012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 6600012df4Sdrh set r3 $::sqlite_opentemp_count 6700012df4Sdrh list $r0 $r1 $r2 $r3 6800012df4Sdrh } [list $t0 $t1 $t2 $t3] 6900012df4Sdrh} 7000012df4Sdrh 7100012df4Sdrh# Create tables for the first group of tests. 7200012df4Sdrh# 7300012df4Sdrhdo_test conflict2-2.0 { 7400012df4Sdrh execsql { 7500012df4Sdrh DROP TABLE t1; 7600012df4Sdrh DROP TABLE t2; 7700012df4Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(a,b)) WITHOUT rowid; 7800012df4Sdrh CREATE TABLE t2(x); 7900012df4Sdrh SELECT c FROM t1 ORDER BY c; 8000012df4Sdrh } 8100012df4Sdrh} {} 8200012df4Sdrh 8300012df4Sdrh# Six columns of configuration data as follows: 8400012df4Sdrh# 8500012df4Sdrh# i The reference number of the test 8600012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 8700012df4Sdrh# t0 True if there is an error from $cmd 8800012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 8900012df4Sdrh# t2 Content of "x" column of t2 9000012df4Sdrh# 9100012df4Sdrhforeach {i cmd t0 t1 t2} { 9200012df4Sdrh 1 INSERT 1 {} 1 9300012df4Sdrh 2 {INSERT OR IGNORE} 0 3 1 9400012df4Sdrh 3 {INSERT OR REPLACE} 0 4 1 9500012df4Sdrh 4 REPLACE 0 4 1 9600012df4Sdrh 5 {INSERT OR FAIL} 1 {} 1 9700012df4Sdrh 6 {INSERT OR ABORT} 1 {} 1 9800012df4Sdrh 7 {INSERT OR ROLLBACK} 1 {} {} 9900012df4Sdrh} { 10000012df4Sdrh do_test conflict2-2.$i { 10100012df4Sdrh set r0 [catch {execsql [subst { 10200012df4Sdrh DELETE FROM t1; 10300012df4Sdrh DELETE FROM t2; 10400012df4Sdrh INSERT INTO t1 VALUES(1,2,3); 10500012df4Sdrh BEGIN; 10600012df4Sdrh INSERT INTO t2 VALUES(1); 10700012df4Sdrh $cmd INTO t1 VALUES(1,2,4); 10800012df4Sdrh }]} r1] 10900012df4Sdrh catch {execsql {COMMIT}} 11000012df4Sdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 11100012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 11200012df4Sdrh list $r0 $r1 $r2 11300012df4Sdrh } [list $t0 $t1 $t2] 11400012df4Sdrh} 11500012df4Sdrh 11600012df4Sdrh# Create tables for the first group of tests. 11700012df4Sdrh# 11800012df4Sdrhdo_test conflict2-3.0 { 11900012df4Sdrh execsql { 12000012df4Sdrh DROP TABLE t1; 12100012df4Sdrh DROP TABLE t2; 12200012df4Sdrh CREATE TABLE t1(a, b, c INTEGER, PRIMARY KEY(c), UNIQUE(a,b)) WITHOUT rowid; 12300012df4Sdrh CREATE TABLE t2(x); 12400012df4Sdrh SELECT c FROM t1 ORDER BY c; 12500012df4Sdrh } 12600012df4Sdrh} {} 12700012df4Sdrh 12800012df4Sdrh# Six columns of configuration data as follows: 12900012df4Sdrh# 13000012df4Sdrh# i The reference number of the test 13100012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 13200012df4Sdrh# t0 True if there is an error from $cmd 13300012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 13400012df4Sdrh# t2 Content of "x" column of t2 13500012df4Sdrh# 13600012df4Sdrhforeach {i cmd t0 t1 t2} { 13700012df4Sdrh 1 INSERT 1 {} 1 13800012df4Sdrh 2 {INSERT OR IGNORE} 0 3 1 13900012df4Sdrh 3 {INSERT OR REPLACE} 0 4 1 14000012df4Sdrh 4 REPLACE 0 4 1 14100012df4Sdrh 5 {INSERT OR FAIL} 1 {} 1 14200012df4Sdrh 6 {INSERT OR ABORT} 1 {} 1 14300012df4Sdrh 7 {INSERT OR ROLLBACK} 1 {} {} 14400012df4Sdrh} { 14500012df4Sdrh do_test conflict2-3.$i { 14600012df4Sdrh set r0 [catch {execsql [subst { 14700012df4Sdrh DELETE FROM t1; 14800012df4Sdrh DELETE FROM t2; 14900012df4Sdrh INSERT INTO t1 VALUES(1,2,3); 15000012df4Sdrh BEGIN; 15100012df4Sdrh INSERT INTO t2 VALUES(1); 15200012df4Sdrh $cmd INTO t1 VALUES(1,2,4); 15300012df4Sdrh }]} r1] 15400012df4Sdrh catch {execsql {COMMIT}} 15500012df4Sdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 15600012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 15700012df4Sdrh list $r0 $r1 $r2 15800012df4Sdrh } [list $t0 $t1 $t2] 15900012df4Sdrh} 16000012df4Sdrh 16100012df4Sdrhdo_test conflict2-4.0 { 16200012df4Sdrh execsql { 16300012df4Sdrh DROP TABLE t2; 16400012df4Sdrh CREATE TABLE t2(x); 16500012df4Sdrh SELECT x FROM t2; 16600012df4Sdrh } 16700012df4Sdrh} {} 16800012df4Sdrh 16900012df4Sdrh# Six columns of configuration data as follows: 17000012df4Sdrh# 17100012df4Sdrh# i The reference number of the test 17200012df4Sdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 17300012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 17400012df4Sdrh# t0 True if there is an error from $cmd 17500012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 17600012df4Sdrh# t2 Content of "x" column of t2 17700012df4Sdrh# 17800012df4Sdrhforeach {i conf1 cmd t0 t1 t2} { 17900012df4Sdrh 1 {} INSERT 1 {} 1 18000012df4Sdrh 2 REPLACE INSERT 0 4 1 18100012df4Sdrh 3 IGNORE INSERT 0 3 1 18200012df4Sdrh 4 FAIL INSERT 1 {} 1 18300012df4Sdrh 5 ABORT INSERT 1 {} 1 18400012df4Sdrh 6 ROLLBACK INSERT 1 {} {} 18500012df4Sdrh 7 REPLACE {INSERT OR IGNORE} 0 3 1 18600012df4Sdrh 8 IGNORE {INSERT OR REPLACE} 0 4 1 18700012df4Sdrh 9 FAIL {INSERT OR IGNORE} 0 3 1 18800012df4Sdrh 10 ABORT {INSERT OR REPLACE} 0 4 1 18900012df4Sdrh 11 ROLLBACK {INSERT OR IGNORE } 0 3 1 19000012df4Sdrh} { 19100012df4Sdrh do_test conflict2-4.$i { 19200012df4Sdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 19300012df4Sdrh set r0 [catch {execsql [subst { 19400012df4Sdrh DROP TABLE t1; 19500012df4Sdrh CREATE TABLE t1(a,b,c,PRIMARY KEY(a,b) $conf1) WITHOUT rowid; 19600012df4Sdrh DELETE FROM t2; 19700012df4Sdrh INSERT INTO t1 VALUES(1,2,3); 19800012df4Sdrh BEGIN; 19900012df4Sdrh INSERT INTO t2 VALUES(1); 20000012df4Sdrh $cmd INTO t1 VALUES(1,2,4); 20100012df4Sdrh }]} r1] 20200012df4Sdrh catch {execsql {COMMIT}} 20300012df4Sdrh if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]} 20400012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 20500012df4Sdrh list $r0 $r1 $r2 20600012df4Sdrh } [list $t0 $t1 $t2] 20700012df4Sdrh} 20800012df4Sdrh 20900012df4Sdrhdo_test conflict2-5.0 { 21000012df4Sdrh execsql { 21100012df4Sdrh DROP TABLE t2; 21200012df4Sdrh CREATE TABLE t2(x); 21300012df4Sdrh SELECT x FROM t2; 21400012df4Sdrh } 21500012df4Sdrh} {} 21600012df4Sdrh 21700012df4Sdrh# Six columns of configuration data as follows: 21800012df4Sdrh# 21900012df4Sdrh# i The reference number of the test 22000012df4Sdrh# conf1 The conflict resolution algorithm on the NOT NULL constraint 22100012df4Sdrh# cmd An INSERT or REPLACE command to execute against table t1 22200012df4Sdrh# t0 True if there is an error from $cmd 22300012df4Sdrh# t1 Content of "c" column of t1 assuming no error in $cmd 22400012df4Sdrh# t2 Content of "x" column of t2 22500012df4Sdrh# 22600012df4Sdrhforeach {i conf1 cmd t0 t1 t2} { 22700012df4Sdrh 1 {} INSERT 1 {} 1 22800012df4Sdrh 2 REPLACE INSERT 0 5 1 22900012df4Sdrh 3 IGNORE INSERT 0 {} 1 23000012df4Sdrh 4 FAIL INSERT 1 {} 1 23100012df4Sdrh 5 ABORT INSERT 1 {} 1 23200012df4Sdrh 6 ROLLBACK INSERT 1 {} {} 23300012df4Sdrh 7 REPLACE {INSERT OR IGNORE} 0 {} 1 23400012df4Sdrh 8 IGNORE {INSERT OR REPLACE} 0 5 1 23500012df4Sdrh 9 FAIL {INSERT OR IGNORE} 0 {} 1 23600012df4Sdrh 10 ABORT {INSERT OR REPLACE} 0 5 1 23700012df4Sdrh 11 ROLLBACK {INSERT OR IGNORE} 0 {} 1 23800012df4Sdrh 12 {} {INSERT OR IGNORE} 0 {} 1 23900012df4Sdrh 13 {} {INSERT OR REPLACE} 0 5 1 24000012df4Sdrh 14 {} {INSERT OR FAIL} 1 {} 1 24100012df4Sdrh 15 {} {INSERT OR ABORT} 1 {} 1 24200012df4Sdrh 16 {} {INSERT OR ROLLBACK} 1 {} {} 24300012df4Sdrh} { 244f9c8ce3cSdrh if {$t0} {set t1 {NOT NULL constraint failed: t1.c}} 24500012df4Sdrh do_test conflict2-5.$i { 24600012df4Sdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 24700012df4Sdrh set r0 [catch {execsql [subst { 24800012df4Sdrh DROP TABLE t1; 24900012df4Sdrh CREATE TABLE t1(a,b,c NOT NULL $conf1 DEFAULT 5); 25000012df4Sdrh DELETE FROM t2; 25100012df4Sdrh BEGIN; 25200012df4Sdrh INSERT INTO t2 VALUES(1); 25300012df4Sdrh $cmd INTO t1 VALUES(1,2,NULL); 25400012df4Sdrh }]} r1] 25500012df4Sdrh catch {execsql {COMMIT}} 25600012df4Sdrh if {!$r0} {set r1 [execsql {SELECT c FROM t1}]} 25700012df4Sdrh set r2 [execsql {SELECT x FROM t2}] 25800012df4Sdrh list $r0 $r1 $r2 25900012df4Sdrh } [list $t0 $t1 $t2] 26000012df4Sdrh} 26100012df4Sdrh 26200012df4Sdrhdo_test conflict2-6.0 { 26300012df4Sdrh execsql { 26400012df4Sdrh DROP TABLE t2; 26500012df4Sdrh CREATE TABLE t2(a,b,c); 26600012df4Sdrh INSERT INTO t2 VALUES(1,2,1); 26700012df4Sdrh INSERT INTO t2 VALUES(2,3,2); 26800012df4Sdrh INSERT INTO t2 VALUES(3,4,1); 26900012df4Sdrh INSERT INTO t2 VALUES(4,5,4); 27000012df4Sdrh SELECT c FROM t2 ORDER BY b; 27100012df4Sdrh CREATE TABLE t3(x); 27200012df4Sdrh INSERT INTO t3 VALUES(1); 27300012df4Sdrh } 27400012df4Sdrh} {1 2 1 4} 27500012df4Sdrh 27600012df4Sdrh# Six columns of configuration data as follows: 27700012df4Sdrh# 27800012df4Sdrh# i The reference number of the test 27900012df4Sdrh# conf1 The conflict resolution algorithm on the UNIQUE constraint 28000012df4Sdrh# cmd An UPDATE command to execute against table t1 28100012df4Sdrh# t0 True if there is an error from $cmd 28200012df4Sdrh# t1 Content of "b" column of t1 assuming no error in $cmd 28300012df4Sdrh# t2 Content of "x" column of t3 28400012df4Sdrh# t3 Number of temporary files for tables 28500012df4Sdrh# t4 Number of temporary files for statement journals 28600012df4Sdrh# 28700012df4Sdrh# Update: Since temporary table files are now opened lazily, and none 28800012df4Sdrh# of the following tests use large quantities of data, t3 is always 0. 28900012df4Sdrh# 2903ac9a864Sdrh# Update (2016-03-04): Subjournals now only open when their size 2913ac9a864Sdrh# exceeds 64KB. 2923ac9a864Sdrh# 29300012df4Sdrhforeach {i conf1 cmd t0 t1 t2 t3 t4} { 2943ac9a864Sdrh 1 {} UPDATE 1 {6 7 8 9} 1 0 0 2953ac9a864Sdrh 2 REPLACE UPDATE 0 {7 6 9} 1 0 0 2963ac9a864Sdrh 3 IGNORE UPDATE 0 {6 7 3 9} 1 0 0 2973ac9a864Sdrh 4 FAIL UPDATE 1 {6 7 3 4} 1 0 0 2983ac9a864Sdrh 5 ABORT UPDATE 1 {1 2 3 4} 1 0 0 2993ac9a864Sdrh 6 ROLLBACK UPDATE 1 {1 2 3 4} 0 0 0 30000012df4Sdrh 7 REPLACE {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 3013ac9a864Sdrh 8 IGNORE {UPDATE OR REPLACE} 0 {7 6 9} 1 0 0 30200012df4Sdrh 9 FAIL {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 3033ac9a864Sdrh 10 ABORT {UPDATE OR REPLACE} 0 {7 6 9} 1 0 0 30400012df4Sdrh 11 ROLLBACK {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 30500012df4Sdrh 12 {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 3063ac9a864Sdrh 13 {} {UPDATE OR REPLACE} 0 {7 6 9} 1 0 0 30700012df4Sdrh 14 {} {UPDATE OR FAIL} 1 {6 7 3 4} 1 0 0 3083ac9a864Sdrh 15 {} {UPDATE OR ABORT} 1 {1 2 3 4} 1 0 0 30900012df4Sdrh 16 {} {UPDATE OR ROLLBACK} 1 {1 2 3 4} 0 0 0 31000012df4Sdrh} { 311070865daSdan 312070865daSdan # When using in-memory journals, no temporary files are required for 313070865daSdan # statement journals. 314070865daSdan if {[permutation] == "inmemory_journal"} { set t4 0 } 315070865daSdan 316f9c8ce3cSdrh if {$t0} {set t1 {UNIQUE constraint failed: t1.a}} 31700012df4Sdrh if {[info exists TEMP_STORE] && $TEMP_STORE==3} { 31800012df4Sdrh set t3 0 31900012df4Sdrh } else { 32000012df4Sdrh set t3 [expr {$t3+$t4}] 32100012df4Sdrh } 32200012df4Sdrh do_test conflict2-6.$i { 32300012df4Sdrh db close 32400012df4Sdrh sqlite3 db test.db 32500012df4Sdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 32600012df4Sdrh execsql {pragma temp_store=file} 32700012df4Sdrh set ::sqlite_opentemp_count 0 32800012df4Sdrh set r0 [catch {execsql [subst { 32900012df4Sdrh DROP TABLE t1; 33000012df4Sdrh CREATE TABLE t1(a,b,c, PRIMARY KEY(a) $conf1) WITHOUT rowid; 33100012df4Sdrh INSERT INTO t1 SELECT * FROM t2; 33200012df4Sdrh UPDATE t3 SET x=0; 33300012df4Sdrh BEGIN; 33400012df4Sdrh $cmd t3 SET x=1; 33500012df4Sdrh $cmd t1 SET b=b*2; 33600012df4Sdrh $cmd t1 SET a=c+5; 33700012df4Sdrh }]} r1] 33800012df4Sdrh catch {execsql {COMMIT}} 33900012df4Sdrh if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]} 34000012df4Sdrh set r2 [execsql {SELECT x FROM t3}] 34100012df4Sdrh list $r0 $r1 $r2 $::sqlite_opentemp_count 34200012df4Sdrh } [list $t0 $t1 $t2 $t3] 34300012df4Sdrh} 34400012df4Sdrh 34500012df4Sdrh# Test to make sure a lot of IGNOREs don't cause a stack overflow 34600012df4Sdrh# 34700012df4Sdrhdo_test conflict2-7.1 { 34800012df4Sdrh execsql { 34900012df4Sdrh DROP TABLE t1; 35000012df4Sdrh DROP TABLE t2; 35100012df4Sdrh DROP TABLE t3; 35200012df4Sdrh CREATE TABLE t1(a PRIMARY KEY, b) without rowid; 35300012df4Sdrh } 35400012df4Sdrh for {set i 1} {$i<=50} {incr i} { 35500012df4Sdrh execsql "INSERT into t1 values($i,[expr {$i+1}]);" 35600012df4Sdrh } 35700012df4Sdrh execsql { 35800012df4Sdrh SELECT count(*), min(a), max(b) FROM t1; 35900012df4Sdrh } 36000012df4Sdrh} {50 1 51} 36100012df4Sdrhdo_test conflict2-7.2 { 36200012df4Sdrh execsql { 36300012df4Sdrh PRAGMA count_changes=on; 36400012df4Sdrh UPDATE OR IGNORE t1 SET a=1000; 36500012df4Sdrh } 36600012df4Sdrh} {1} 36700012df4Sdrhdo_test conflict2-7.2.1 { 36800012df4Sdrh db changes 36900012df4Sdrh} {1} 37000012df4Sdrhdo_test conflict2-7.3 { 37100012df4Sdrh execsql { 37200012df4Sdrh SELECT b FROM t1 WHERE a=1000; 37300012df4Sdrh } 37400012df4Sdrh} {2} 37500012df4Sdrhdo_test conflict2-7.4 { 37600012df4Sdrh execsql { 37700012df4Sdrh SELECT count(*) FROM t1; 37800012df4Sdrh } 37900012df4Sdrh} {50} 38000012df4Sdrhdo_test conflict2-7.5 { 38100012df4Sdrh execsql { 38200012df4Sdrh PRAGMA count_changes=on; 38300012df4Sdrh UPDATE OR REPLACE t1 SET a=1001; 38400012df4Sdrh } 38500012df4Sdrh} {50} 38600012df4Sdrhdo_test conflict2-7.5.1 { 38700012df4Sdrh db changes 38800012df4Sdrh} {50} 38900012df4Sdrhdo_test conflict2-7.7 { 39000012df4Sdrh execsql { 39100012df4Sdrh SELECT count(*) FROM t1; 39200012df4Sdrh } 39300012df4Sdrh} {1} 39400012df4Sdrh 39500012df4Sdrh# Update for version 3: A SELECT statement no longer resets the change 39600012df4Sdrh# counter (Test result changes from 0 to 50). 39700012df4Sdrhdo_test conflict2-7.7.1 { 39800012df4Sdrh db changes 39900012df4Sdrh} {50} 40000012df4Sdrh 40100012df4Sdrh# Make sure the row count is right for rows that are ignored on 40200012df4Sdrh# an insert. 40300012df4Sdrh# 40400012df4Sdrhdo_test conflict2-8.1 { 40500012df4Sdrh execsql { 40600012df4Sdrh DELETE FROM t1; 40700012df4Sdrh INSERT INTO t1 VALUES(1,2); 40800012df4Sdrh } 40900012df4Sdrh execsql { 41000012df4Sdrh INSERT OR IGNORE INTO t1 VALUES(2,3); 41100012df4Sdrh } 41200012df4Sdrh} {1} 41300012df4Sdrhdo_test conflict2-8.1.1 { 41400012df4Sdrh db changes 41500012df4Sdrh} {1} 41600012df4Sdrhdo_test conflict2-8.2 { 41700012df4Sdrh execsql { 41800012df4Sdrh INSERT OR IGNORE INTO t1 VALUES(2,4); 41900012df4Sdrh } 42000012df4Sdrh} {0} 42100012df4Sdrhdo_test conflict2-8.2.1 { 42200012df4Sdrh db changes 42300012df4Sdrh} {0} 42400012df4Sdrhdo_test conflict2-8.3 { 42500012df4Sdrh execsql { 42600012df4Sdrh INSERT OR REPLACE INTO t1 VALUES(2,4); 42700012df4Sdrh } 42800012df4Sdrh} {1} 42900012df4Sdrhdo_test conflict2-8.3.1 { 43000012df4Sdrh db changes 43100012df4Sdrh} {1} 43200012df4Sdrhdo_test conflict2-8.4 { 43300012df4Sdrh execsql { 43400012df4Sdrh INSERT OR IGNORE INTO t1 SELECT * FROM t1; 43500012df4Sdrh } 43600012df4Sdrh} {0} 43700012df4Sdrhdo_test conflict2-8.4.1 { 43800012df4Sdrh db changes 43900012df4Sdrh} {0} 44000012df4Sdrhdo_test conflict2-8.5 { 44100012df4Sdrh execsql { 44200012df4Sdrh INSERT OR IGNORE INTO t1 SELECT a+2,b+2 FROM t1; 44300012df4Sdrh } 44400012df4Sdrh} {2} 44500012df4Sdrhdo_test conflict2-8.5.1 { 44600012df4Sdrh db changes 44700012df4Sdrh} {2} 44800012df4Sdrhdo_test conflict2-8.6 { 44900012df4Sdrh execsql { 45000012df4Sdrh INSERT OR IGNORE INTO t1 SELECT a+3,b+3 FROM t1; 45100012df4Sdrh } 45200012df4Sdrh} {3} 45300012df4Sdrhdo_test conflict2-8.6.1 { 45400012df4Sdrh db changes 45500012df4Sdrh} {3} 45600012df4Sdrh 45700012df4Sdrhintegrity_check conflict2-8.99 45800012df4Sdrh 45900012df4Sdrhdo_test conflict2-9.1 { 46000012df4Sdrh execsql { 46100012df4Sdrh PRAGMA count_changes=0; 46200012df4Sdrh CREATE TABLE t2( 46300012df4Sdrh a INTEGER PRIMARY KEY ON CONFLICT IGNORE, 46400012df4Sdrh b INTEGER UNIQUE ON CONFLICT FAIL, 46500012df4Sdrh c INTEGER UNIQUE ON CONFLICT REPLACE, 46600012df4Sdrh d INTEGER UNIQUE ON CONFLICT ABORT, 46700012df4Sdrh e INTEGER UNIQUE ON CONFLICT ROLLBACK 46800012df4Sdrh ) WITHOUT rowid; 46900012df4Sdrh CREATE TABLE t3(x); 47000012df4Sdrh INSERT INTO t3 VALUES(1); 47100012df4Sdrh SELECT * FROM t3; 47200012df4Sdrh } 47300012df4Sdrh} {1} 47400012df4Sdrhdo_test conflict2-9.2 { 47500012df4Sdrh catchsql { 47600012df4Sdrh INSERT INTO t2 VALUES(1,1,1,1,1); 47700012df4Sdrh INSERT INTO t2 VALUES(2,2,2,2,2); 47800012df4Sdrh SELECT * FROM t2; 47900012df4Sdrh } 48000012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 48100012df4Sdrhdo_test conflict2-9.3 { 48200012df4Sdrh catchsql { 48300012df4Sdrh INSERT INTO t2 VALUES(1,3,3,3,3); 48400012df4Sdrh SELECT * FROM t2; 48500012df4Sdrh } 48600012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 48700012df4Sdrhdo_test conflict2-9.4 { 48800012df4Sdrh catchsql { 48900012df4Sdrh UPDATE t2 SET a=a+1 WHERE a=1; 49000012df4Sdrh SELECT * FROM t2; 49100012df4Sdrh } 49200012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 49300012df4Sdrhdo_test conflict2-9.5 { 49400012df4Sdrh catchsql { 49500012df4Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 49600012df4Sdrh } 497f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 49800012df4Sdrhdo_test conflict2-9.5b { 49900012df4Sdrh db eval {SELECT * FROM t2;} 50000012df4Sdrh} {1 1 1 1 1 2 2 2 2 2} 50100012df4Sdrhdo_test conflict2-9.6 { 50200012df4Sdrh catchsql { 50300012df4Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 50400012df4Sdrh SELECT * FROM t2; 50500012df4Sdrh } 506f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 50700012df4Sdrhdo_test conflict2-9.6b { 50800012df4Sdrh db eval {SELECT * FROM t2;} 50900012df4Sdrh} {1 1 1 1 1 2 2 2 2 2} 51000012df4Sdrhdo_test conflict2-9.7 { 51100012df4Sdrh catchsql { 51200012df4Sdrh BEGIN; 51300012df4Sdrh UPDATE t3 SET x=x+1; 51400012df4Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 51500012df4Sdrh SELECT * FROM t2; 51600012df4Sdrh } 517f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 51800012df4Sdrhdo_test conflict2-9.8 { 51900012df4Sdrh execsql {COMMIT} 52000012df4Sdrh execsql {SELECT * FROM t3} 52100012df4Sdrh} {2} 52200012df4Sdrhdo_test conflict2-9.9 { 52300012df4Sdrh catchsql { 52400012df4Sdrh BEGIN; 52500012df4Sdrh UPDATE t3 SET x=x+1; 52600012df4Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 52700012df4Sdrh SELECT * FROM t2; 52800012df4Sdrh } 529f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 53000012df4Sdrhdo_test conflict2-9.10 { 53100012df4Sdrh execsql {COMMIT} 53200012df4Sdrh execsql {SELECT * FROM t3} 53300012df4Sdrh} {3} 53400012df4Sdrhdo_test conflict2-9.11 { 53500012df4Sdrh catchsql { 53600012df4Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 53700012df4Sdrh SELECT * FROM t2; 53800012df4Sdrh } 539f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 54000012df4Sdrhdo_test conflict2-9.12 { 54100012df4Sdrh catchsql { 54200012df4Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 54300012df4Sdrh SELECT * FROM t2; 54400012df4Sdrh } 545f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 54600012df4Sdrhdo_test conflict2-9.13 { 54700012df4Sdrh catchsql { 54800012df4Sdrh BEGIN; 54900012df4Sdrh UPDATE t3 SET x=x+1; 55000012df4Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 55100012df4Sdrh SELECT * FROM t2; 55200012df4Sdrh } 553f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 55400012df4Sdrhdo_test conflict2-9.14 { 55500012df4Sdrh execsql {COMMIT} 55600012df4Sdrh execsql {SELECT * FROM t3} 55700012df4Sdrh} {4} 55800012df4Sdrhdo_test conflict2-9.15 { 55900012df4Sdrh catchsql { 56000012df4Sdrh BEGIN; 56100012df4Sdrh UPDATE t3 SET x=x+1; 56200012df4Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 56300012df4Sdrh SELECT * FROM t2; 56400012df4Sdrh } 565f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 56600012df4Sdrhdo_test conflict2-9.16 { 56700012df4Sdrh execsql {COMMIT} 56800012df4Sdrh execsql {SELECT * FROM t3} 56900012df4Sdrh} {5} 57000012df4Sdrhdo_test conflict2-9.17 { 57100012df4Sdrh catchsql { 57200012df4Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 57300012df4Sdrh SELECT * FROM t2; 57400012df4Sdrh } 575f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 57600012df4Sdrhdo_test conflict2-9.18 { 57700012df4Sdrh catchsql { 57800012df4Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 57900012df4Sdrh SELECT * FROM t2; 58000012df4Sdrh } 581f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 58200012df4Sdrhdo_test conflict2-9.19 { 58300012df4Sdrh catchsql { 58400012df4Sdrh BEGIN; 58500012df4Sdrh UPDATE t3 SET x=x+1; 58600012df4Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 58700012df4Sdrh SELECT * FROM t2; 58800012df4Sdrh } 589f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 59000012df4Sdrhverify_ex_errcode conflict2-9.21b SQLITE_CONSTRAINT_UNIQUE 59100012df4Sdrhdo_test conflict2-9.20 { 59200012df4Sdrh catch {execsql {COMMIT}} 59300012df4Sdrh execsql {SELECT * FROM t3} 59400012df4Sdrh} {5} 59500012df4Sdrhdo_test conflict2-9.21 { 59600012df4Sdrh catchsql { 59700012df4Sdrh BEGIN; 59800012df4Sdrh UPDATE t3 SET x=x+1; 59900012df4Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 60000012df4Sdrh SELECT * FROM t2; 60100012df4Sdrh } 602f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 60300012df4Sdrhverify_ex_errcode conflict2-9.21b SQLITE_CONSTRAINT_UNIQUE 60400012df4Sdrhdo_test conflict2-9.22 { 60500012df4Sdrh catch {execsql {COMMIT}} 60600012df4Sdrh execsql {SELECT * FROM t3} 60700012df4Sdrh} {5} 60800012df4Sdrhdo_test conflict2-9.23 { 60900012df4Sdrh catchsql { 61000012df4Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 61100012df4Sdrh SELECT * FROM t2; 61200012df4Sdrh } 61300012df4Sdrh} {0 {2 2 2 2 2 3 3 1 3 3}} 61400012df4Sdrhdo_test conflict2-9.24 { 61500012df4Sdrh catchsql { 61600012df4Sdrh UPDATE t2 SET c=c-1 WHERE c=2; 61700012df4Sdrh SELECT * FROM t2; 61800012df4Sdrh } 61900012df4Sdrh} {0 {2 2 1 2 2}} 62000012df4Sdrhdo_test conflict2-9.25 { 62100012df4Sdrh catchsql { 62200012df4Sdrh BEGIN; 62300012df4Sdrh UPDATE t3 SET x=x+1; 62400012df4Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 62500012df4Sdrh SELECT * FROM t2; 62600012df4Sdrh } 62700012df4Sdrh} {0 {3 3 1 3 3}} 62800012df4Sdrhdo_test conflict2-9.26 { 62900012df4Sdrh catch {execsql {COMMIT}} 63000012df4Sdrh execsql {SELECT * FROM t3} 63100012df4Sdrh} {6} 63200012df4Sdrh 63300012df4Sdrhdo_test conflict2-10.1 { 63400012df4Sdrh catchsql { 63500012df4Sdrh DELETE FROM t1; 63600012df4Sdrh BEGIN; 63700012df4Sdrh INSERT OR ROLLBACK INTO t1 VALUES(1,2); 63800012df4Sdrh INSERT OR ROLLBACK INTO t1 VALUES(1,3); 63900012df4Sdrh COMMIT; 64000012df4Sdrh } 64100012df4Sdrh execsql {SELECT * FROM t1} 64200012df4Sdrh} {} 64300012df4Sdrhdo_test conflict2-10.2 { 64400012df4Sdrh catchsql { 64500012df4Sdrh CREATE TABLE t4(x); 64600012df4Sdrh CREATE UNIQUE INDEX t4x ON t4(x); 64700012df4Sdrh BEGIN; 64800012df4Sdrh INSERT OR ROLLBACK INTO t4 VALUES(1); 64900012df4Sdrh INSERT OR ROLLBACK INTO t4 VALUES(1); 65000012df4Sdrh COMMIT; 65100012df4Sdrh } 65200012df4Sdrh execsql {SELECT * FROM t4} 65300012df4Sdrh} {} 65400012df4Sdrh 65500012df4Sdrh# Ticket #1171. Make sure statement rollbacks do not 65600012df4Sdrh# damage the database. 65700012df4Sdrh# 65800012df4Sdrhdo_test conflict2-11.1 { 65900012df4Sdrh execsql { 66000012df4Sdrh -- Create a database object (pages 2, 3 of the file) 66100012df4Sdrh BEGIN; 66200012df4Sdrh CREATE TABLE abc(a PRIMARY KEY, b, c) WITHOUT rowid; 66300012df4Sdrh INSERT INTO abc VALUES(1, 2, 3); 66400012df4Sdrh INSERT INTO abc VALUES(4, 5, 6); 66500012df4Sdrh INSERT INTO abc VALUES(7, 8, 9); 66600012df4Sdrh COMMIT; 66700012df4Sdrh } 66800012df4Sdrh 66900012df4Sdrh 67000012df4Sdrh # Set a small cache size so that changes will spill into 67100012df4Sdrh # the database file. 67200012df4Sdrh execsql { 67300012df4Sdrh PRAGMA cache_size = 10; 67400012df4Sdrh } 67500012df4Sdrh 67600012df4Sdrh # Make lots of changes. Because of the small cache, some 67700012df4Sdrh # (most?) of these changes will spill into the disk file. 67800012df4Sdrh # In other words, some of the changes will not be held in 67900012df4Sdrh # cache. 68000012df4Sdrh # 68100012df4Sdrh execsql { 68200012df4Sdrh BEGIN; 68300012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 68400012df4Sdrh CREATE TABLE def(d, e, f); 68500012df4Sdrh INSERT INTO def VALUES 68600012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 68700012df4Sdrh INSERT INTO def SELECT * FROM def; 68800012df4Sdrh INSERT INTO def SELECT * FROM def; 68900012df4Sdrh INSERT INTO def SELECT * FROM def; 69000012df4Sdrh INSERT INTO def SELECT * FROM def; 69100012df4Sdrh INSERT INTO def SELECT * FROM def; 69200012df4Sdrh INSERT INTO def SELECT * FROM def; 69300012df4Sdrh INSERT INTO def SELECT * FROM def; 69400012df4Sdrh DELETE FROM abc WHERE a = 4; 69500012df4Sdrh } 69600012df4Sdrh 69700012df4Sdrh # Execute a statement that does a statement rollback due to 69800012df4Sdrh # a constraint failure. 69900012df4Sdrh # 70000012df4Sdrh catchsql { 70100012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 70200012df4Sdrh } 70300012df4Sdrh 70400012df4Sdrh # Rollback the database. Verify that the state of the ABC table 70500012df4Sdrh # is unchanged from the beginning of the transaction. In other words, 70600012df4Sdrh # make sure the DELETE on table ABC that occurred within the transaction 70700012df4Sdrh # had no effect. 70800012df4Sdrh # 70900012df4Sdrh execsql { 71000012df4Sdrh ROLLBACK; 71100012df4Sdrh SELECT * FROM abc; 71200012df4Sdrh } 71300012df4Sdrh} {1 2 3 4 5 6 7 8 9} 71400012df4Sdrhintegrity_check conflict2-11.2 71500012df4Sdrh 71600012df4Sdrh# Repeat test conflict2-11.1 but this time commit. 71700012df4Sdrh# 71800012df4Sdrhdo_test conflict2-11.3 { 71900012df4Sdrh execsql { 72000012df4Sdrh BEGIN; 72100012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 72200012df4Sdrh UPDATE abc SET a=a+1; 72300012df4Sdrh CREATE TABLE def(d, e, f); 72400012df4Sdrh INSERT INTO def VALUES 72500012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 72600012df4Sdrh INSERT INTO def SELECT * FROM def; 72700012df4Sdrh INSERT INTO def SELECT * FROM def; 72800012df4Sdrh INSERT INTO def SELECT * FROM def; 72900012df4Sdrh INSERT INTO def SELECT * FROM def; 73000012df4Sdrh INSERT INTO def SELECT * FROM def; 73100012df4Sdrh INSERT INTO def SELECT * FROM def; 73200012df4Sdrh INSERT INTO def SELECT * FROM def; 73300012df4Sdrh DELETE FROM abc WHERE a = 4; 73400012df4Sdrh } 73500012df4Sdrh catchsql { 73600012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 73700012df4Sdrh } 73800012df4Sdrh execsql { 73900012df4Sdrh ROLLBACK; 74000012df4Sdrh SELECT * FROM abc; 74100012df4Sdrh } 74200012df4Sdrh} {1 2 3 4 5 6 7 8 9} 74300012df4Sdrh# Repeat test conflict2-11.1 but this time commit. 74400012df4Sdrh# 74500012df4Sdrhdo_test conflict2-11.5 { 74600012df4Sdrh execsql { 74700012df4Sdrh BEGIN; 74800012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 74900012df4Sdrh CREATE TABLE def(d, e, f); 75000012df4Sdrh INSERT INTO def VALUES 75100012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 75200012df4Sdrh INSERT INTO def SELECT * FROM def; 75300012df4Sdrh INSERT INTO def SELECT * FROM def; 75400012df4Sdrh INSERT INTO def SELECT * FROM def; 75500012df4Sdrh INSERT INTO def SELECT * FROM def; 75600012df4Sdrh INSERT INTO def SELECT * FROM def; 75700012df4Sdrh INSERT INTO def SELECT * FROM def; 75800012df4Sdrh INSERT INTO def SELECT * FROM def; 75900012df4Sdrh DELETE FROM abc WHERE a = 4; 76000012df4Sdrh } 76100012df4Sdrh catchsql { 76200012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 76300012df4Sdrh } 76400012df4Sdrh execsql { 76500012df4Sdrh COMMIT; 76600012df4Sdrh SELECT * FROM abc; 76700012df4Sdrh } 76800012df4Sdrh} {1 2 3 7 8 9} 76900012df4Sdrhintegrity_check conflict2-11.6 77000012df4Sdrh 77100012df4Sdrh# Make sure UPDATE OR REPLACE works on tables that have only 77200012df4Sdrh# an INTEGER PRIMARY KEY. 77300012df4Sdrh# 77400012df4Sdrhdo_test conflict2-12.1 { 77500012df4Sdrh execsql { 77600012df4Sdrh CREATE TABLE t5(a INTEGER PRIMARY KEY, b text) WITHOUT rowid; 77700012df4Sdrh INSERT INTO t5 VALUES(1,'one'); 77800012df4Sdrh INSERT INTO t5 VALUES(2,'two'); 77900012df4Sdrh SELECT * FROM t5 78000012df4Sdrh } 78100012df4Sdrh} {1 one 2 two} 78200012df4Sdrhdo_test conflict2-12.2 { 78300012df4Sdrh execsql { 78400012df4Sdrh UPDATE OR IGNORE t5 SET a=a+1 WHERE a=1; 78500012df4Sdrh SELECT * FROM t5; 78600012df4Sdrh } 78700012df4Sdrh} {1 one 2 two} 78800012df4Sdrhdo_test conflict2-12.3 { 78900012df4Sdrh catchsql { 79000012df4Sdrh UPDATE t5 SET a=a+1 WHERE a=1; 79100012df4Sdrh } 792f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t5.a}} 79300012df4Sdrhverify_ex_errcode conflict2-12.3b SQLITE_CONSTRAINT_PRIMARYKEY 79400012df4Sdrhdo_test conflict2-12.4 { 79500012df4Sdrh execsql { 79600012df4Sdrh UPDATE OR REPLACE t5 SET a=a+1 WHERE a=1; 79700012df4Sdrh SELECT * FROM t5; 79800012df4Sdrh } 79900012df4Sdrh} {2 one} 80000012df4Sdrh 80100012df4Sdrh 80200012df4Sdrh# Ticket [c38baa3d969eab7946dc50ba9d9b4f0057a19437] 80300012df4Sdrh# REPLACE works like ABORT on a CHECK constraint. 80400012df4Sdrh# 80500012df4Sdrhdo_test conflict2-13.1 { 80600012df4Sdrh execsql { 80700012df4Sdrh CREATE TABLE t13(a PRIMARY KEY CHECK(a!=2)) WITHOUT rowid; 80800012df4Sdrh BEGIN; 80900012df4Sdrh REPLACE INTO t13 VALUES(1); 81000012df4Sdrh } 81100012df4Sdrh catchsql { 81200012df4Sdrh REPLACE INTO t13 VALUES(2); 81300012df4Sdrh } 814*92e21ef0Sdrh} {1 {CHECK constraint failed: a!=2}} 81500012df4Sdrhverify_ex_errcode conflict2-13.1b SQLITE_CONSTRAINT_CHECK 81600012df4Sdrhdo_test conflict2-13.2 { 81700012df4Sdrh execsql { 81800012df4Sdrh REPLACE INTO t13 VALUES(3); 81900012df4Sdrh COMMIT; 82000012df4Sdrh SELECT * FROM t13; 82100012df4Sdrh } 82200012df4Sdrh} {1 3} 82300012df4Sdrh 824af1c01c1Sdrh# Test for an unreleased bug in the REPLACE conflict resolution 825af1c01c1Sdrh# discovered on 2013-11-09. 826af1c01c1Sdrh# 827af1c01c1Sdrhdo_execsql_test conflict2-14.1 { 828af1c01c1Sdrh DROP TABLE IF EXISTS t1; 829af1c01c1Sdrh CREATE TABLE t1( 830af1c01c1Sdrh x TEXT PRIMARY KEY NOT NULL, 831af1c01c1Sdrh y TEXT NOT NULL, 832af1c01c1Sdrh z INTEGER 833af1c01c1Sdrh ); 834af1c01c1Sdrh INSERT INTO t1 VALUES('alpha','beta',1); 835af1c01c1Sdrh CREATE UNIQUE INDEX t1xy ON t1(x,y); 836af1c01c1Sdrh REPLACE INTO t1(x,y,z) VALUES('alpha','gamma',1); 837af1c01c1Sdrh PRAGMA integrity_check; 838af1c01c1Sdrh SELECT x,y FROM t1 INDEXED BY t1xy; 839af1c01c1Sdrh SELECT x,y,z FROM t1 NOT INDEXED; 840af1c01c1Sdrh} {ok alpha gamma alpha gamma 1} 841af1c01c1Sdrhdo_execsql_test conflict2-14.2 { 842af1c01c1Sdrh DROP TABLE IF EXISTS t1; 843af1c01c1Sdrh CREATE TABLE t1( 844af1c01c1Sdrh x TEXT PRIMARY KEY NOT NULL, 845af1c01c1Sdrh y TEXT NOT NULL, 846af1c01c1Sdrh z INTEGER 847af1c01c1Sdrh ) WITHOUT ROWID; 848af1c01c1Sdrh INSERT INTO t1 VALUES('alpha','beta',1); 849af1c01c1Sdrh CREATE UNIQUE INDEX t1xy ON t1(x,y); 850af1c01c1Sdrh REPLACE INTO t1(x,y,z) VALUES('alpha','gamma',1); 851af1c01c1Sdrh PRAGMA integrity_check; 852af1c01c1Sdrh SELECT x,y FROM t1 INDEXED BY t1xy; 853af1c01c1Sdrh SELECT x,y,z FROM t1 NOT INDEXED; 854af1c01c1Sdrh} {ok alpha gamma alpha gamma 1} 855af1c01c1Sdrh 856af1c01c1Sdrh 85700012df4Sdrh 85800012df4Sdrhfinish_test 859