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