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# 29000012df4Sdrhforeach {i conf1 cmd t0 t1 t2 t3 t4} { 29100012df4Sdrh 1 {} UPDATE 1 {6 7 8 9} 1 0 1 29200012df4Sdrh 2 REPLACE UPDATE 0 {7 6 9} 1 0 0 29300012df4Sdrh 3 IGNORE UPDATE 0 {6 7 3 9} 1 0 0 29400012df4Sdrh 4 FAIL UPDATE 1 {6 7 3 4} 1 0 0 29500012df4Sdrh 5 ABORT UPDATE 1 {1 2 3 4} 1 0 1 29600012df4Sdrh 6 ROLLBACK UPDATE 1 {1 2 3 4} 0 0 0 29700012df4Sdrh 7 REPLACE {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 29800012df4Sdrh 8 IGNORE {UPDATE OR REPLACE} 0 {7 6 9} 1 0 1 29900012df4Sdrh 9 FAIL {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 30000012df4Sdrh 10 ABORT {UPDATE OR REPLACE} 0 {7 6 9} 1 0 1 30100012df4Sdrh 11 ROLLBACK {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 30200012df4Sdrh 12 {} {UPDATE OR IGNORE} 0 {6 7 3 9} 1 0 0 30300012df4Sdrh 13 {} {UPDATE OR REPLACE} 0 {7 6 9} 1 0 1 30400012df4Sdrh 14 {} {UPDATE OR FAIL} 1 {6 7 3 4} 1 0 0 30500012df4Sdrh 15 {} {UPDATE OR ABORT} 1 {1 2 3 4} 1 0 1 30600012df4Sdrh 16 {} {UPDATE OR ROLLBACK} 1 {1 2 3 4} 0 0 0 30700012df4Sdrh} { 308*070865daSdan 309*070865daSdan # When using in-memory journals, no temporary files are required for 310*070865daSdan # statement journals. 311*070865daSdan if {[permutation] == "inmemory_journal"} { set t4 0 } 312*070865daSdan 313f9c8ce3cSdrh if {$t0} {set t1 {UNIQUE constraint failed: t1.a}} 31400012df4Sdrh if {[info exists TEMP_STORE] && $TEMP_STORE==3} { 31500012df4Sdrh set t3 0 31600012df4Sdrh } else { 31700012df4Sdrh set t3 [expr {$t3+$t4}] 31800012df4Sdrh } 31900012df4Sdrh do_test conflict2-6.$i { 32000012df4Sdrh db close 32100012df4Sdrh sqlite3 db test.db 32200012df4Sdrh if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"} 32300012df4Sdrh execsql {pragma temp_store=file} 32400012df4Sdrh set ::sqlite_opentemp_count 0 32500012df4Sdrh set r0 [catch {execsql [subst { 32600012df4Sdrh DROP TABLE t1; 32700012df4Sdrh CREATE TABLE t1(a,b,c, PRIMARY KEY(a) $conf1) WITHOUT rowid; 32800012df4Sdrh INSERT INTO t1 SELECT * FROM t2; 32900012df4Sdrh UPDATE t3 SET x=0; 33000012df4Sdrh BEGIN; 33100012df4Sdrh $cmd t3 SET x=1; 33200012df4Sdrh $cmd t1 SET b=b*2; 33300012df4Sdrh $cmd t1 SET a=c+5; 33400012df4Sdrh }]} r1] 33500012df4Sdrh catch {execsql {COMMIT}} 33600012df4Sdrh if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]} 33700012df4Sdrh set r2 [execsql {SELECT x FROM t3}] 33800012df4Sdrh list $r0 $r1 $r2 $::sqlite_opentemp_count 33900012df4Sdrh } [list $t0 $t1 $t2 $t3] 34000012df4Sdrh} 34100012df4Sdrh 34200012df4Sdrh# Test to make sure a lot of IGNOREs don't cause a stack overflow 34300012df4Sdrh# 34400012df4Sdrhdo_test conflict2-7.1 { 34500012df4Sdrh execsql { 34600012df4Sdrh DROP TABLE t1; 34700012df4Sdrh DROP TABLE t2; 34800012df4Sdrh DROP TABLE t3; 34900012df4Sdrh CREATE TABLE t1(a PRIMARY KEY, b) without rowid; 35000012df4Sdrh } 35100012df4Sdrh for {set i 1} {$i<=50} {incr i} { 35200012df4Sdrh execsql "INSERT into t1 values($i,[expr {$i+1}]);" 35300012df4Sdrh } 35400012df4Sdrh execsql { 35500012df4Sdrh SELECT count(*), min(a), max(b) FROM t1; 35600012df4Sdrh } 35700012df4Sdrh} {50 1 51} 35800012df4Sdrhdo_test conflict2-7.2 { 35900012df4Sdrh execsql { 36000012df4Sdrh PRAGMA count_changes=on; 36100012df4Sdrh UPDATE OR IGNORE t1 SET a=1000; 36200012df4Sdrh } 36300012df4Sdrh} {1} 36400012df4Sdrhdo_test conflict2-7.2.1 { 36500012df4Sdrh db changes 36600012df4Sdrh} {1} 36700012df4Sdrhdo_test conflict2-7.3 { 36800012df4Sdrh execsql { 36900012df4Sdrh SELECT b FROM t1 WHERE a=1000; 37000012df4Sdrh } 37100012df4Sdrh} {2} 37200012df4Sdrhdo_test conflict2-7.4 { 37300012df4Sdrh execsql { 37400012df4Sdrh SELECT count(*) FROM t1; 37500012df4Sdrh } 37600012df4Sdrh} {50} 37700012df4Sdrhdo_test conflict2-7.5 { 37800012df4Sdrh execsql { 37900012df4Sdrh PRAGMA count_changes=on; 38000012df4Sdrh UPDATE OR REPLACE t1 SET a=1001; 38100012df4Sdrh } 38200012df4Sdrh} {50} 38300012df4Sdrhdo_test conflict2-7.5.1 { 38400012df4Sdrh db changes 38500012df4Sdrh} {50} 38600012df4Sdrhdo_test conflict2-7.7 { 38700012df4Sdrh execsql { 38800012df4Sdrh SELECT count(*) FROM t1; 38900012df4Sdrh } 39000012df4Sdrh} {1} 39100012df4Sdrh 39200012df4Sdrh# Update for version 3: A SELECT statement no longer resets the change 39300012df4Sdrh# counter (Test result changes from 0 to 50). 39400012df4Sdrhdo_test conflict2-7.7.1 { 39500012df4Sdrh db changes 39600012df4Sdrh} {50} 39700012df4Sdrh 39800012df4Sdrh# Make sure the row count is right for rows that are ignored on 39900012df4Sdrh# an insert. 40000012df4Sdrh# 40100012df4Sdrhdo_test conflict2-8.1 { 40200012df4Sdrh execsql { 40300012df4Sdrh DELETE FROM t1; 40400012df4Sdrh INSERT INTO t1 VALUES(1,2); 40500012df4Sdrh } 40600012df4Sdrh execsql { 40700012df4Sdrh INSERT OR IGNORE INTO t1 VALUES(2,3); 40800012df4Sdrh } 40900012df4Sdrh} {1} 41000012df4Sdrhdo_test conflict2-8.1.1 { 41100012df4Sdrh db changes 41200012df4Sdrh} {1} 41300012df4Sdrhdo_test conflict2-8.2 { 41400012df4Sdrh execsql { 41500012df4Sdrh INSERT OR IGNORE INTO t1 VALUES(2,4); 41600012df4Sdrh } 41700012df4Sdrh} {0} 41800012df4Sdrhdo_test conflict2-8.2.1 { 41900012df4Sdrh db changes 42000012df4Sdrh} {0} 42100012df4Sdrhdo_test conflict2-8.3 { 42200012df4Sdrh execsql { 42300012df4Sdrh INSERT OR REPLACE INTO t1 VALUES(2,4); 42400012df4Sdrh } 42500012df4Sdrh} {1} 42600012df4Sdrhdo_test conflict2-8.3.1 { 42700012df4Sdrh db changes 42800012df4Sdrh} {1} 42900012df4Sdrhdo_test conflict2-8.4 { 43000012df4Sdrh execsql { 43100012df4Sdrh INSERT OR IGNORE INTO t1 SELECT * FROM t1; 43200012df4Sdrh } 43300012df4Sdrh} {0} 43400012df4Sdrhdo_test conflict2-8.4.1 { 43500012df4Sdrh db changes 43600012df4Sdrh} {0} 43700012df4Sdrhdo_test conflict2-8.5 { 43800012df4Sdrh execsql { 43900012df4Sdrh INSERT OR IGNORE INTO t1 SELECT a+2,b+2 FROM t1; 44000012df4Sdrh } 44100012df4Sdrh} {2} 44200012df4Sdrhdo_test conflict2-8.5.1 { 44300012df4Sdrh db changes 44400012df4Sdrh} {2} 44500012df4Sdrhdo_test conflict2-8.6 { 44600012df4Sdrh execsql { 44700012df4Sdrh INSERT OR IGNORE INTO t1 SELECT a+3,b+3 FROM t1; 44800012df4Sdrh } 44900012df4Sdrh} {3} 45000012df4Sdrhdo_test conflict2-8.6.1 { 45100012df4Sdrh db changes 45200012df4Sdrh} {3} 45300012df4Sdrh 45400012df4Sdrhintegrity_check conflict2-8.99 45500012df4Sdrh 45600012df4Sdrhdo_test conflict2-9.1 { 45700012df4Sdrh execsql { 45800012df4Sdrh PRAGMA count_changes=0; 45900012df4Sdrh CREATE TABLE t2( 46000012df4Sdrh a INTEGER PRIMARY KEY ON CONFLICT IGNORE, 46100012df4Sdrh b INTEGER UNIQUE ON CONFLICT FAIL, 46200012df4Sdrh c INTEGER UNIQUE ON CONFLICT REPLACE, 46300012df4Sdrh d INTEGER UNIQUE ON CONFLICT ABORT, 46400012df4Sdrh e INTEGER UNIQUE ON CONFLICT ROLLBACK 46500012df4Sdrh ) WITHOUT rowid; 46600012df4Sdrh CREATE TABLE t3(x); 46700012df4Sdrh INSERT INTO t3 VALUES(1); 46800012df4Sdrh SELECT * FROM t3; 46900012df4Sdrh } 47000012df4Sdrh} {1} 47100012df4Sdrhdo_test conflict2-9.2 { 47200012df4Sdrh catchsql { 47300012df4Sdrh INSERT INTO t2 VALUES(1,1,1,1,1); 47400012df4Sdrh INSERT INTO t2 VALUES(2,2,2,2,2); 47500012df4Sdrh SELECT * FROM t2; 47600012df4Sdrh } 47700012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 47800012df4Sdrhdo_test conflict2-9.3 { 47900012df4Sdrh catchsql { 48000012df4Sdrh INSERT INTO t2 VALUES(1,3,3,3,3); 48100012df4Sdrh SELECT * FROM t2; 48200012df4Sdrh } 48300012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 48400012df4Sdrhdo_test conflict2-9.4 { 48500012df4Sdrh catchsql { 48600012df4Sdrh UPDATE t2 SET a=a+1 WHERE a=1; 48700012df4Sdrh SELECT * FROM t2; 48800012df4Sdrh } 48900012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}} 49000012df4Sdrhdo_test conflict2-9.5 { 49100012df4Sdrh catchsql { 49200012df4Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 49300012df4Sdrh } 494f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 49500012df4Sdrhdo_test conflict2-9.5b { 49600012df4Sdrh db eval {SELECT * FROM t2;} 49700012df4Sdrh} {1 1 1 1 1 2 2 2 2 2} 49800012df4Sdrhdo_test conflict2-9.6 { 49900012df4Sdrh catchsql { 50000012df4Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 50100012df4Sdrh SELECT * FROM t2; 50200012df4Sdrh } 503f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 50400012df4Sdrhdo_test conflict2-9.6b { 50500012df4Sdrh db eval {SELECT * FROM t2;} 50600012df4Sdrh} {1 1 1 1 1 2 2 2 2 2} 50700012df4Sdrhdo_test conflict2-9.7 { 50800012df4Sdrh catchsql { 50900012df4Sdrh BEGIN; 51000012df4Sdrh UPDATE t3 SET x=x+1; 51100012df4Sdrh INSERT INTO t2 VALUES(3,1,3,3,3); 51200012df4Sdrh SELECT * FROM t2; 51300012df4Sdrh } 514f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 51500012df4Sdrhdo_test conflict2-9.8 { 51600012df4Sdrh execsql {COMMIT} 51700012df4Sdrh execsql {SELECT * FROM t3} 51800012df4Sdrh} {2} 51900012df4Sdrhdo_test conflict2-9.9 { 52000012df4Sdrh catchsql { 52100012df4Sdrh BEGIN; 52200012df4Sdrh UPDATE t3 SET x=x+1; 52300012df4Sdrh UPDATE t2 SET b=b+1 WHERE b=1; 52400012df4Sdrh SELECT * FROM t2; 52500012df4Sdrh } 526f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}} 52700012df4Sdrhdo_test conflict2-9.10 { 52800012df4Sdrh execsql {COMMIT} 52900012df4Sdrh execsql {SELECT * FROM t3} 53000012df4Sdrh} {3} 53100012df4Sdrhdo_test conflict2-9.11 { 53200012df4Sdrh catchsql { 53300012df4Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 53400012df4Sdrh SELECT * FROM t2; 53500012df4Sdrh } 536f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 53700012df4Sdrhdo_test conflict2-9.12 { 53800012df4Sdrh catchsql { 53900012df4Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 54000012df4Sdrh SELECT * FROM t2; 54100012df4Sdrh } 542f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 54300012df4Sdrhdo_test conflict2-9.13 { 54400012df4Sdrh catchsql { 54500012df4Sdrh BEGIN; 54600012df4Sdrh UPDATE t3 SET x=x+1; 54700012df4Sdrh INSERT INTO t2 VALUES(3,3,3,1,3); 54800012df4Sdrh SELECT * FROM t2; 54900012df4Sdrh } 550f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 55100012df4Sdrhdo_test conflict2-9.14 { 55200012df4Sdrh execsql {COMMIT} 55300012df4Sdrh execsql {SELECT * FROM t3} 55400012df4Sdrh} {4} 55500012df4Sdrhdo_test conflict2-9.15 { 55600012df4Sdrh catchsql { 55700012df4Sdrh BEGIN; 55800012df4Sdrh UPDATE t3 SET x=x+1; 55900012df4Sdrh UPDATE t2 SET d=d+1 WHERE d=1; 56000012df4Sdrh SELECT * FROM t2; 56100012df4Sdrh } 562f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}} 56300012df4Sdrhdo_test conflict2-9.16 { 56400012df4Sdrh execsql {COMMIT} 56500012df4Sdrh execsql {SELECT * FROM t3} 56600012df4Sdrh} {5} 56700012df4Sdrhdo_test conflict2-9.17 { 56800012df4Sdrh catchsql { 56900012df4Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 57000012df4Sdrh SELECT * FROM t2; 57100012df4Sdrh } 572f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 57300012df4Sdrhdo_test conflict2-9.18 { 57400012df4Sdrh catchsql { 57500012df4Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 57600012df4Sdrh SELECT * FROM t2; 57700012df4Sdrh } 578f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 57900012df4Sdrhdo_test conflict2-9.19 { 58000012df4Sdrh catchsql { 58100012df4Sdrh BEGIN; 58200012df4Sdrh UPDATE t3 SET x=x+1; 58300012df4Sdrh INSERT INTO t2 VALUES(3,3,3,3,1); 58400012df4Sdrh SELECT * FROM t2; 58500012df4Sdrh } 586f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 58700012df4Sdrhverify_ex_errcode conflict2-9.21b SQLITE_CONSTRAINT_UNIQUE 58800012df4Sdrhdo_test conflict2-9.20 { 58900012df4Sdrh catch {execsql {COMMIT}} 59000012df4Sdrh execsql {SELECT * FROM t3} 59100012df4Sdrh} {5} 59200012df4Sdrhdo_test conflict2-9.21 { 59300012df4Sdrh catchsql { 59400012df4Sdrh BEGIN; 59500012df4Sdrh UPDATE t3 SET x=x+1; 59600012df4Sdrh UPDATE t2 SET e=e+1 WHERE e=1; 59700012df4Sdrh SELECT * FROM t2; 59800012df4Sdrh } 599f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}} 60000012df4Sdrhverify_ex_errcode conflict2-9.21b SQLITE_CONSTRAINT_UNIQUE 60100012df4Sdrhdo_test conflict2-9.22 { 60200012df4Sdrh catch {execsql {COMMIT}} 60300012df4Sdrh execsql {SELECT * FROM t3} 60400012df4Sdrh} {5} 60500012df4Sdrhdo_test conflict2-9.23 { 60600012df4Sdrh catchsql { 60700012df4Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 60800012df4Sdrh SELECT * FROM t2; 60900012df4Sdrh } 61000012df4Sdrh} {0 {2 2 2 2 2 3 3 1 3 3}} 61100012df4Sdrhdo_test conflict2-9.24 { 61200012df4Sdrh catchsql { 61300012df4Sdrh UPDATE t2 SET c=c-1 WHERE c=2; 61400012df4Sdrh SELECT * FROM t2; 61500012df4Sdrh } 61600012df4Sdrh} {0 {2 2 1 2 2}} 61700012df4Sdrhdo_test conflict2-9.25 { 61800012df4Sdrh catchsql { 61900012df4Sdrh BEGIN; 62000012df4Sdrh UPDATE t3 SET x=x+1; 62100012df4Sdrh INSERT INTO t2 VALUES(3,3,1,3,3); 62200012df4Sdrh SELECT * FROM t2; 62300012df4Sdrh } 62400012df4Sdrh} {0 {3 3 1 3 3}} 62500012df4Sdrhdo_test conflict2-9.26 { 62600012df4Sdrh catch {execsql {COMMIT}} 62700012df4Sdrh execsql {SELECT * FROM t3} 62800012df4Sdrh} {6} 62900012df4Sdrh 63000012df4Sdrhdo_test conflict2-10.1 { 63100012df4Sdrh catchsql { 63200012df4Sdrh DELETE FROM t1; 63300012df4Sdrh BEGIN; 63400012df4Sdrh INSERT OR ROLLBACK INTO t1 VALUES(1,2); 63500012df4Sdrh INSERT OR ROLLBACK INTO t1 VALUES(1,3); 63600012df4Sdrh COMMIT; 63700012df4Sdrh } 63800012df4Sdrh execsql {SELECT * FROM t1} 63900012df4Sdrh} {} 64000012df4Sdrhdo_test conflict2-10.2 { 64100012df4Sdrh catchsql { 64200012df4Sdrh CREATE TABLE t4(x); 64300012df4Sdrh CREATE UNIQUE INDEX t4x ON t4(x); 64400012df4Sdrh BEGIN; 64500012df4Sdrh INSERT OR ROLLBACK INTO t4 VALUES(1); 64600012df4Sdrh INSERT OR ROLLBACK INTO t4 VALUES(1); 64700012df4Sdrh COMMIT; 64800012df4Sdrh } 64900012df4Sdrh execsql {SELECT * FROM t4} 65000012df4Sdrh} {} 65100012df4Sdrh 65200012df4Sdrh# Ticket #1171. Make sure statement rollbacks do not 65300012df4Sdrh# damage the database. 65400012df4Sdrh# 65500012df4Sdrhdo_test conflict2-11.1 { 65600012df4Sdrh execsql { 65700012df4Sdrh -- Create a database object (pages 2, 3 of the file) 65800012df4Sdrh BEGIN; 65900012df4Sdrh CREATE TABLE abc(a PRIMARY KEY, b, c) WITHOUT rowid; 66000012df4Sdrh INSERT INTO abc VALUES(1, 2, 3); 66100012df4Sdrh INSERT INTO abc VALUES(4, 5, 6); 66200012df4Sdrh INSERT INTO abc VALUES(7, 8, 9); 66300012df4Sdrh COMMIT; 66400012df4Sdrh } 66500012df4Sdrh 66600012df4Sdrh 66700012df4Sdrh # Set a small cache size so that changes will spill into 66800012df4Sdrh # the database file. 66900012df4Sdrh execsql { 67000012df4Sdrh PRAGMA cache_size = 10; 67100012df4Sdrh } 67200012df4Sdrh 67300012df4Sdrh # Make lots of changes. Because of the small cache, some 67400012df4Sdrh # (most?) of these changes will spill into the disk file. 67500012df4Sdrh # In other words, some of the changes will not be held in 67600012df4Sdrh # cache. 67700012df4Sdrh # 67800012df4Sdrh execsql { 67900012df4Sdrh BEGIN; 68000012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 68100012df4Sdrh CREATE TABLE def(d, e, f); 68200012df4Sdrh INSERT INTO def VALUES 68300012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 68400012df4Sdrh INSERT INTO def SELECT * FROM def; 68500012df4Sdrh INSERT INTO def SELECT * FROM def; 68600012df4Sdrh INSERT INTO def SELECT * FROM def; 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 DELETE FROM abc WHERE a = 4; 69200012df4Sdrh } 69300012df4Sdrh 69400012df4Sdrh # Execute a statement that does a statement rollback due to 69500012df4Sdrh # a constraint failure. 69600012df4Sdrh # 69700012df4Sdrh catchsql { 69800012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 69900012df4Sdrh } 70000012df4Sdrh 70100012df4Sdrh # Rollback the database. Verify that the state of the ABC table 70200012df4Sdrh # is unchanged from the beginning of the transaction. In other words, 70300012df4Sdrh # make sure the DELETE on table ABC that occurred within the transaction 70400012df4Sdrh # had no effect. 70500012df4Sdrh # 70600012df4Sdrh execsql { 70700012df4Sdrh ROLLBACK; 70800012df4Sdrh SELECT * FROM abc; 70900012df4Sdrh } 71000012df4Sdrh} {1 2 3 4 5 6 7 8 9} 71100012df4Sdrhintegrity_check conflict2-11.2 71200012df4Sdrh 71300012df4Sdrh# Repeat test conflict2-11.1 but this time commit. 71400012df4Sdrh# 71500012df4Sdrhdo_test conflict2-11.3 { 71600012df4Sdrh execsql { 71700012df4Sdrh BEGIN; 71800012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 71900012df4Sdrh UPDATE abc SET a=a+1; 72000012df4Sdrh CREATE TABLE def(d, e, f); 72100012df4Sdrh INSERT INTO def VALUES 72200012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 72300012df4Sdrh INSERT INTO def SELECT * FROM def; 72400012df4Sdrh INSERT INTO def SELECT * FROM def; 72500012df4Sdrh INSERT INTO def SELECT * FROM def; 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 DELETE FROM abc WHERE a = 4; 73100012df4Sdrh } 73200012df4Sdrh catchsql { 73300012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 73400012df4Sdrh } 73500012df4Sdrh execsql { 73600012df4Sdrh ROLLBACK; 73700012df4Sdrh SELECT * FROM abc; 73800012df4Sdrh } 73900012df4Sdrh} {1 2 3 4 5 6 7 8 9} 74000012df4Sdrh# Repeat test conflict2-11.1 but this time commit. 74100012df4Sdrh# 74200012df4Sdrhdo_test conflict2-11.5 { 74300012df4Sdrh execsql { 74400012df4Sdrh BEGIN; 74500012df4Sdrh -- Make sure the pager is in EXCLUSIVE state. 74600012df4Sdrh CREATE TABLE def(d, e, f); 74700012df4Sdrh INSERT INTO def VALUES 74800012df4Sdrh ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz'); 74900012df4Sdrh INSERT INTO def SELECT * FROM def; 75000012df4Sdrh INSERT INTO def SELECT * FROM def; 75100012df4Sdrh INSERT INTO def SELECT * FROM def; 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 DELETE FROM abc WHERE a = 4; 75700012df4Sdrh } 75800012df4Sdrh catchsql { 75900012df4Sdrh INSERT INTO abc SELECT 10, 20, 30 FROM def; 76000012df4Sdrh } 76100012df4Sdrh execsql { 76200012df4Sdrh COMMIT; 76300012df4Sdrh SELECT * FROM abc; 76400012df4Sdrh } 76500012df4Sdrh} {1 2 3 7 8 9} 76600012df4Sdrhintegrity_check conflict2-11.6 76700012df4Sdrh 76800012df4Sdrh# Make sure UPDATE OR REPLACE works on tables that have only 76900012df4Sdrh# an INTEGER PRIMARY KEY. 77000012df4Sdrh# 77100012df4Sdrhdo_test conflict2-12.1 { 77200012df4Sdrh execsql { 77300012df4Sdrh CREATE TABLE t5(a INTEGER PRIMARY KEY, b text) WITHOUT rowid; 77400012df4Sdrh INSERT INTO t5 VALUES(1,'one'); 77500012df4Sdrh INSERT INTO t5 VALUES(2,'two'); 77600012df4Sdrh SELECT * FROM t5 77700012df4Sdrh } 77800012df4Sdrh} {1 one 2 two} 77900012df4Sdrhdo_test conflict2-12.2 { 78000012df4Sdrh execsql { 78100012df4Sdrh UPDATE OR IGNORE t5 SET a=a+1 WHERE a=1; 78200012df4Sdrh SELECT * FROM t5; 78300012df4Sdrh } 78400012df4Sdrh} {1 one 2 two} 78500012df4Sdrhdo_test conflict2-12.3 { 78600012df4Sdrh catchsql { 78700012df4Sdrh UPDATE t5 SET a=a+1 WHERE a=1; 78800012df4Sdrh } 789f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t5.a}} 79000012df4Sdrhverify_ex_errcode conflict2-12.3b SQLITE_CONSTRAINT_PRIMARYKEY 79100012df4Sdrhdo_test conflict2-12.4 { 79200012df4Sdrh execsql { 79300012df4Sdrh UPDATE OR REPLACE t5 SET a=a+1 WHERE a=1; 79400012df4Sdrh SELECT * FROM t5; 79500012df4Sdrh } 79600012df4Sdrh} {2 one} 79700012df4Sdrh 79800012df4Sdrh 79900012df4Sdrh# Ticket [c38baa3d969eab7946dc50ba9d9b4f0057a19437] 80000012df4Sdrh# REPLACE works like ABORT on a CHECK constraint. 80100012df4Sdrh# 80200012df4Sdrhdo_test conflict2-13.1 { 80300012df4Sdrh execsql { 80400012df4Sdrh CREATE TABLE t13(a PRIMARY KEY CHECK(a!=2)) WITHOUT rowid; 80500012df4Sdrh BEGIN; 80600012df4Sdrh REPLACE INTO t13 VALUES(1); 80700012df4Sdrh } 80800012df4Sdrh catchsql { 80900012df4Sdrh REPLACE INTO t13 VALUES(2); 81000012df4Sdrh } 811f9c8ce3cSdrh} {1 {CHECK constraint failed: t13}} 81200012df4Sdrhverify_ex_errcode conflict2-13.1b SQLITE_CONSTRAINT_CHECK 81300012df4Sdrhdo_test conflict2-13.2 { 81400012df4Sdrh execsql { 81500012df4Sdrh REPLACE INTO t13 VALUES(3); 81600012df4Sdrh COMMIT; 81700012df4Sdrh SELECT * FROM t13; 81800012df4Sdrh } 81900012df4Sdrh} {1 3} 82000012df4Sdrh 821af1c01c1Sdrh# Test for an unreleased bug in the REPLACE conflict resolution 822af1c01c1Sdrh# discovered on 2013-11-09. 823af1c01c1Sdrh# 824af1c01c1Sdrhdo_execsql_test conflict2-14.1 { 825af1c01c1Sdrh DROP TABLE IF EXISTS t1; 826af1c01c1Sdrh CREATE TABLE t1( 827af1c01c1Sdrh x TEXT PRIMARY KEY NOT NULL, 828af1c01c1Sdrh y TEXT NOT NULL, 829af1c01c1Sdrh z INTEGER 830af1c01c1Sdrh ); 831af1c01c1Sdrh INSERT INTO t1 VALUES('alpha','beta',1); 832af1c01c1Sdrh CREATE UNIQUE INDEX t1xy ON t1(x,y); 833af1c01c1Sdrh REPLACE INTO t1(x,y,z) VALUES('alpha','gamma',1); 834af1c01c1Sdrh PRAGMA integrity_check; 835af1c01c1Sdrh SELECT x,y FROM t1 INDEXED BY t1xy; 836af1c01c1Sdrh SELECT x,y,z FROM t1 NOT INDEXED; 837af1c01c1Sdrh} {ok alpha gamma alpha gamma 1} 838af1c01c1Sdrhdo_execsql_test conflict2-14.2 { 839af1c01c1Sdrh DROP TABLE IF EXISTS t1; 840af1c01c1Sdrh CREATE TABLE t1( 841af1c01c1Sdrh x TEXT PRIMARY KEY NOT NULL, 842af1c01c1Sdrh y TEXT NOT NULL, 843af1c01c1Sdrh z INTEGER 844af1c01c1Sdrh ) WITHOUT ROWID; 845af1c01c1Sdrh INSERT INTO t1 VALUES('alpha','beta',1); 846af1c01c1Sdrh CREATE UNIQUE INDEX t1xy ON t1(x,y); 847af1c01c1Sdrh REPLACE INTO t1(x,y,z) VALUES('alpha','gamma',1); 848af1c01c1Sdrh PRAGMA integrity_check; 849af1c01c1Sdrh SELECT x,y FROM t1 INDEXED BY t1xy; 850af1c01c1Sdrh SELECT x,y,z FROM t1 NOT INDEXED; 851af1c01c1Sdrh} {ok alpha gamma alpha gamma 1} 852af1c01c1Sdrh 853af1c01c1Sdrh 85400012df4Sdrh 85500012df4Sdrhfinish_test 856