xref: /sqlite-3.40.0/test/conflict2.test (revision 92e21ef0)
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