xref: /sqlite-3.40.0/test/conflict.test (revision 92e21ef0)
1bb37fdc7Sdrh# 2002 January 29
2bb37fdc7Sdrh#
3bb37fdc7Sdrh# The author disclaims copyright to this source code.  In place of
4bb37fdc7Sdrh# a legal notice, here is a blessing:
5bb37fdc7Sdrh#
6bb37fdc7Sdrh#    May you do good and not evil.
7bb37fdc7Sdrh#    May you find forgiveness for yourself and forgive others.
8bb37fdc7Sdrh#    May you share freely, never taking more than you give.
9bb37fdc7Sdrh#
10bb37fdc7Sdrh#***********************************************************************
11bb37fdc7Sdrh# This file implements regression tests for SQLite library.
12bb37fdc7Sdrh#
13bb37fdc7Sdrh# This file implements tests for the conflict resolution extension
14bb37fdc7Sdrh# to SQLite.
15bb37fdc7Sdrh#
16bb37fdc7Sdrh
17bb37fdc7Sdrhset testdir [file dirname $argv0]
18bb37fdc7Sdrhsource $testdir/tester.tcl
19bb37fdc7Sdrh
203bdca9c9Sdanielk1977ifcapable !conflict {
213bdca9c9Sdanielk1977  finish_test
223bdca9c9Sdanielk1977  return
233bdca9c9Sdanielk1977}
243bdca9c9Sdanielk1977
250d65dc0eSdrh# Create tables for the first group of tests.
26bb37fdc7Sdrh#
270d65dc0eSdrhdo_test conflict-1.0 {
28bb37fdc7Sdrh  execsql {
29bb37fdc7Sdrh    CREATE TABLE t1(a, b, c, UNIQUE(a,b));
300d65dc0eSdrh    CREATE TABLE t2(x);
31bb37fdc7Sdrh    SELECT c FROM t1 ORDER BY c;
32bb37fdc7Sdrh  }
330d65dc0eSdrh} {}
34bb37fdc7Sdrh
350d65dc0eSdrh# Six columns of configuration data as follows:
360d65dc0eSdrh#
370d65dc0eSdrh#   i      The reference number of the test
380d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
390d65dc0eSdrh#   t0     True if there is an error from $cmd
400d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
410d65dc0eSdrh#   t2     Content of "x" column of t2
42af6df11fSdrh#   t3     Number of temporary files created by this test
430d65dc0eSdrh#
44af6df11fSdrhforeach {i cmd t0 t1 t2 t3} {
45af6df11fSdrh  1 INSERT                  1 {}  1  0
46af6df11fSdrh  2 {INSERT OR IGNORE}      0 3   1  0
47af6df11fSdrh  3 {INSERT OR REPLACE}     0 4   1  0
48af6df11fSdrh  4 REPLACE                 0 4   1  0
49af6df11fSdrh  5 {INSERT OR FAIL}        1 {}  1  0
50af6df11fSdrh  6 {INSERT OR ABORT}       1 {}  1  0
51af6df11fSdrh  7 {INSERT OR ROLLBACK}    1 {}  {} 0
520d65dc0eSdrh} {
530d65dc0eSdrh  do_test conflict-1.$i {
54af6df11fSdrh    set ::sqlite_opentemp_count 0
550d65dc0eSdrh    set r0 [catch {execsql [subst {
56bb37fdc7Sdrh      DELETE FROM t1;
570d65dc0eSdrh      DELETE FROM t2;
58bb37fdc7Sdrh      INSERT INTO t1 VALUES(1,2,3);
59af6df11fSdrh      BEGIN;
600d65dc0eSdrh      INSERT INTO t2 VALUES(1);
610d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,4);
620d65dc0eSdrh    }]} r1]
636b8b8749Sdrh    catch {execsql {COMMIT}}
640d65dc0eSdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
650d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
66af6df11fSdrh    set r3 $::sqlite_opentemp_count
67af6df11fSdrh    list $r0 $r1 $r2 $r3
68af6df11fSdrh  } [list $t0 $t1 $t2 $t3]
69bb37fdc7Sdrh}
70bb37fdc7Sdrh
710d65dc0eSdrh# Create tables for the first group of tests.
720d65dc0eSdrh#
730d65dc0eSdrhdo_test conflict-2.0 {
74ef6764a1Sdrh  execsql {
75ef6764a1Sdrh    DROP TABLE t1;
76ef6764a1Sdrh    DROP TABLE t2;
770d65dc0eSdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(a,b));
780d65dc0eSdrh    CREATE TABLE t2(x);
79ef6764a1Sdrh    SELECT c FROM t1 ORDER BY c;
80ef6764a1Sdrh  }
810d65dc0eSdrh} {}
82ef6764a1Sdrh
830d65dc0eSdrh# Six columns of configuration data as follows:
840d65dc0eSdrh#
850d65dc0eSdrh#   i      The reference number of the test
860d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
870d65dc0eSdrh#   t0     True if there is an error from $cmd
880d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
890d65dc0eSdrh#   t2     Content of "x" column of t2
900d65dc0eSdrh#
91af6df11fSdrhforeach {i cmd t0 t1 t2} {
92af6df11fSdrh  1 INSERT                  1 {}  1
93af6df11fSdrh  2 {INSERT OR IGNORE}      0 3   1
94af6df11fSdrh  3 {INSERT OR REPLACE}     0 4   1
95af6df11fSdrh  4 REPLACE                 0 4   1
96af6df11fSdrh  5 {INSERT OR FAIL}        1 {}  1
97af6df11fSdrh  6 {INSERT OR ABORT}       1 {}  1
98af6df11fSdrh  7 {INSERT OR ROLLBACK}    1 {}  {}
990d65dc0eSdrh} {
1000d65dc0eSdrh  do_test conflict-2.$i {
1010d65dc0eSdrh    set r0 [catch {execsql [subst {
102ef6764a1Sdrh      DELETE FROM t1;
1030d65dc0eSdrh      DELETE FROM t2;
104ef6764a1Sdrh      INSERT INTO t1 VALUES(1,2,3);
105af6df11fSdrh      BEGIN;
1060d65dc0eSdrh      INSERT INTO t2 VALUES(1);
1070d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,4);
1080d65dc0eSdrh    }]} r1]
1096b8b8749Sdrh    catch {execsql {COMMIT}}
1100d65dc0eSdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
1110d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
1120d65dc0eSdrh    list $r0 $r1 $r2
1130d65dc0eSdrh  } [list $t0 $t1 $t2]
114ef6764a1Sdrh}
1150d65dc0eSdrh
1160d65dc0eSdrh# Create tables for the first group of tests.
1170d65dc0eSdrh#
1180d65dc0eSdrhdo_test conflict-3.0 {
1190d65dc0eSdrh  execsql {
1200d65dc0eSdrh    DROP TABLE t1;
1210d65dc0eSdrh    DROP TABLE t2;
122e0194f2bSdrh    CREATE TABLE t1(a, b, c INTEGER, PRIMARY KEY(c), UNIQUE(a,b));
1230d65dc0eSdrh    CREATE TABLE t2(x);
124ef6764a1Sdrh    SELECT c FROM t1 ORDER BY c;
125ef6764a1Sdrh  }
1260d65dc0eSdrh} {}
1270d65dc0eSdrh
1280d65dc0eSdrh# Six columns of configuration data as follows:
1290d65dc0eSdrh#
1300d65dc0eSdrh#   i      The reference number of the test
1310d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
1320d65dc0eSdrh#   t0     True if there is an error from $cmd
1330d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
1340d65dc0eSdrh#   t2     Content of "x" column of t2
1350d65dc0eSdrh#
136af6df11fSdrhforeach {i cmd t0 t1 t2} {
137af6df11fSdrh  1 INSERT                  1 {}  1
138af6df11fSdrh  2 {INSERT OR IGNORE}      0 3   1
139af6df11fSdrh  3 {INSERT OR REPLACE}     0 4   1
140af6df11fSdrh  4 REPLACE                 0 4   1
141af6df11fSdrh  5 {INSERT OR FAIL}        1 {}  1
142af6df11fSdrh  6 {INSERT OR ABORT}       1 {}  1
143af6df11fSdrh  7 {INSERT OR ROLLBACK}    1 {}  {}
1440d65dc0eSdrh} {
1450d65dc0eSdrh  do_test conflict-3.$i {
1460d65dc0eSdrh    set r0 [catch {execsql [subst {
1470d65dc0eSdrh      DELETE FROM t1;
1480d65dc0eSdrh      DELETE FROM t2;
1490d65dc0eSdrh      INSERT INTO t1 VALUES(1,2,3);
150af6df11fSdrh      BEGIN;
1510d65dc0eSdrh      INSERT INTO t2 VALUES(1);
1520d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,4);
1530d65dc0eSdrh    }]} r1]
1546b8b8749Sdrh    catch {execsql {COMMIT}}
1550d65dc0eSdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
1560d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
1570d65dc0eSdrh    list $r0 $r1 $r2
1580d65dc0eSdrh  } [list $t0 $t1 $t2]
159ef6764a1Sdrh}
1600d65dc0eSdrh
1610d65dc0eSdrhdo_test conflict-4.0 {
1620d65dc0eSdrh  execsql {
1630d65dc0eSdrh    DROP TABLE t2;
1640d65dc0eSdrh    CREATE TABLE t2(x);
1650d65dc0eSdrh    SELECT x FROM t2;
166ef6764a1Sdrh  }
1670d65dc0eSdrh} {}
1680d65dc0eSdrh
1690d65dc0eSdrh# Six columns of configuration data as follows:
1700d65dc0eSdrh#
1710d65dc0eSdrh#   i      The reference number of the test
1720d65dc0eSdrh#   conf1  The conflict resolution algorithm on the UNIQUE constraint
1730d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
1740d65dc0eSdrh#   t0     True if there is an error from $cmd
1750d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
1760d65dc0eSdrh#   t2     Content of "x" column of t2
1770d65dc0eSdrh#
178af6df11fSdrhforeach {i conf1 cmd t0 t1 t2} {
179af6df11fSdrh  1 {}       INSERT                  1 {}  1
180af6df11fSdrh  2 REPLACE  INSERT                  0 4   1
181af6df11fSdrh  3 IGNORE   INSERT                  0 3   1
182af6df11fSdrh  4 FAIL     INSERT                  1 {}  1
183af6df11fSdrh  5 ABORT    INSERT                  1 {}  1
184af6df11fSdrh  6 ROLLBACK INSERT                  1 {}  {}
185af6df11fSdrh  7 REPLACE  {INSERT OR IGNORE}      0 3   1
186af6df11fSdrh  8 IGNORE   {INSERT OR REPLACE}     0 4   1
187af6df11fSdrh  9 FAIL     {INSERT OR IGNORE}      0 3   1
188af6df11fSdrh 10 ABORT    {INSERT OR REPLACE}     0 4   1
189af6df11fSdrh 11 ROLLBACK {INSERT OR IGNORE }     0 3   1
1900d65dc0eSdrh} {
1910d65dc0eSdrh  do_test conflict-4.$i {
1920d65dc0eSdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
1930d65dc0eSdrh    set r0 [catch {execsql [subst {
1940d65dc0eSdrh      DROP TABLE t1;
1950d65dc0eSdrh      CREATE TABLE t1(a,b,c,UNIQUE(a,b) $conf1);
1960d65dc0eSdrh      DELETE FROM t2;
1970d65dc0eSdrh      INSERT INTO t1 VALUES(1,2,3);
198af6df11fSdrh      BEGIN;
1990d65dc0eSdrh      INSERT INTO t2 VALUES(1);
2000d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,4);
2010d65dc0eSdrh    }]} r1]
2026b8b8749Sdrh    catch {execsql {COMMIT}}
2030d65dc0eSdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
2040d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
2050d65dc0eSdrh    list $r0 $r1 $r2
2060d65dc0eSdrh  } [list $t0 $t1 $t2]
207ef6764a1Sdrh}
2080d65dc0eSdrh
2090d65dc0eSdrhdo_test conflict-5.0 {
2100d65dc0eSdrh  execsql {
2110d65dc0eSdrh    DROP TABLE t2;
2120d65dc0eSdrh    CREATE TABLE t2(x);
2130d65dc0eSdrh    SELECT x FROM t2;
2140d65dc0eSdrh  }
2150d65dc0eSdrh} {}
2160d65dc0eSdrh
2170d65dc0eSdrh# Six columns of configuration data as follows:
2180d65dc0eSdrh#
2190d65dc0eSdrh#   i      The reference number of the test
2200d65dc0eSdrh#   conf1  The conflict resolution algorithm on the NOT NULL constraint
2210d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
2220d65dc0eSdrh#   t0     True if there is an error from $cmd
2230d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
2240d65dc0eSdrh#   t2     Content of "x" column of t2
2250d65dc0eSdrh#
226af6df11fSdrhforeach {i conf1 cmd t0 t1 t2} {
227af6df11fSdrh  1 {}       INSERT                  1 {}  1
228af6df11fSdrh  2 REPLACE  INSERT                  0 5   1
229af6df11fSdrh  3 IGNORE   INSERT                  0 {}  1
230af6df11fSdrh  4 FAIL     INSERT                  1 {}  1
231af6df11fSdrh  5 ABORT    INSERT                  1 {}  1
232af6df11fSdrh  6 ROLLBACK INSERT                  1 {}  {}
233af6df11fSdrh  7 REPLACE  {INSERT OR IGNORE}      0 {}  1
234af6df11fSdrh  8 IGNORE   {INSERT OR REPLACE}     0 5   1
235af6df11fSdrh  9 FAIL     {INSERT OR IGNORE}      0 {}  1
236af6df11fSdrh 10 ABORT    {INSERT OR REPLACE}     0 5   1
237af6df11fSdrh 11 ROLLBACK {INSERT OR IGNORE}      0 {}  1
238af6df11fSdrh 12 {}       {INSERT OR IGNORE}      0 {}  1
239af6df11fSdrh 13 {}       {INSERT OR REPLACE}     0 5   1
240af6df11fSdrh 14 {}       {INSERT OR FAIL}        1 {}  1
241af6df11fSdrh 15 {}       {INSERT OR ABORT}       1 {}  1
242af6df11fSdrh 16 {}       {INSERT OR ROLLBACK}    1 {}  {}
2430d65dc0eSdrh} {
244f9c8ce3cSdrh  if {$t0} {set t1 {NOT NULL constraint failed: t1.c}}
2450d65dc0eSdrh  do_test conflict-5.$i {
2460d65dc0eSdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
2470d65dc0eSdrh    set r0 [catch {execsql [subst {
2480d65dc0eSdrh      DROP TABLE t1;
2490d65dc0eSdrh      CREATE TABLE t1(a,b,c NOT NULL $conf1 DEFAULT 5);
2500d65dc0eSdrh      DELETE FROM t2;
251af6df11fSdrh      BEGIN;
2520d65dc0eSdrh      INSERT INTO t2 VALUES(1);
2530d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,NULL);
2540d65dc0eSdrh    }]} r1]
2556b8b8749Sdrh    catch {execsql {COMMIT}}
2560d65dc0eSdrh    if {!$r0} {set r1 [execsql {SELECT c FROM t1}]}
2570d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
2580d65dc0eSdrh    list $r0 $r1 $r2
2590d65dc0eSdrh  } [list $t0 $t1 $t2]
2600d65dc0eSdrh}
2610d65dc0eSdrh
2620d65dc0eSdrhdo_test conflict-6.0 {
2630d65dc0eSdrh  execsql {
2640d65dc0eSdrh    DROP TABLE t2;
2650d65dc0eSdrh    CREATE TABLE t2(a,b,c);
2660d65dc0eSdrh    INSERT INTO t2 VALUES(1,2,1);
2670d65dc0eSdrh    INSERT INTO t2 VALUES(2,3,2);
2680d65dc0eSdrh    INSERT INTO t2 VALUES(3,4,1);
2690d65dc0eSdrh    INSERT INTO t2 VALUES(4,5,4);
2700d65dc0eSdrh    SELECT c FROM t2 ORDER BY b;
2710d65dc0eSdrh    CREATE TABLE t3(x);
2720d65dc0eSdrh    INSERT INTO t3 VALUES(1);
2730d65dc0eSdrh  }
2740d65dc0eSdrh} {1 2 1 4}
2750d65dc0eSdrh
2760d65dc0eSdrh# Six columns of configuration data as follows:
2770d65dc0eSdrh#
2780d65dc0eSdrh#   i      The reference number of the test
2790d65dc0eSdrh#   conf1  The conflict resolution algorithm on the UNIQUE constraint
2800d65dc0eSdrh#   cmd    An UPDATE command to execute against table t1
2810d65dc0eSdrh#   t0     True if there is an error from $cmd
2820d65dc0eSdrh#   t1     Content of "b" column of t1 assuming no error in $cmd
2830d65dc0eSdrh#   t2     Content of "x" column of t3
2841e9daa6aSdrh#   t3     Number of temporary files for tables
2851e9daa6aSdrh#   t4     Number of temporary files for statement journals
2860d65dc0eSdrh#
2873ac9a864Sdrh# Update (2007-08-21): Since temporary table files are now opened lazily,
2883ac9a864Sdrh# and none of the following tests use large quantities of data, t3 is always 0.
2893ac9a864Sdrh#
2903ac9a864Sdrh# Update (2016-03-04): Subjournals now also open lazily, so t4 is also always 0.
2917a2b1eebSdanielk1977#
2921e9daa6aSdrhforeach {i conf1 cmd t0 t1 t2 t3 t4} {
2933ac9a864Sdrh  1 {}       UPDATE                  1 {6 7 8 9}  1 0 0
2947a2b1eebSdanielk1977  2 REPLACE  UPDATE                  0 {7 6 9}    1 0 0
2957a2b1eebSdanielk1977  3 IGNORE   UPDATE                  0 {6 7 3 9}  1 0 0
2961e9daa6aSdrh  4 FAIL     UPDATE                  1 {6 7 3 4}  1 0 0
2973ac9a864Sdrh  5 ABORT    UPDATE                  1 {1 2 3 4}  1 0 0
2981e9daa6aSdrh  6 ROLLBACK UPDATE                  1 {1 2 3 4}  0 0 0
2997a2b1eebSdanielk1977  7 REPLACE  {UPDATE OR IGNORE}      0 {6 7 3 9}  1 0 0
3007a2b1eebSdanielk1977  8 IGNORE   {UPDATE OR REPLACE}     0 {7 6 9}    1 0 0
3017a2b1eebSdanielk1977  9 FAIL     {UPDATE OR IGNORE}      0 {6 7 3 9}  1 0 0
3027a2b1eebSdanielk1977 10 ABORT    {UPDATE OR REPLACE}     0 {7 6 9}    1 0 0
3037a2b1eebSdanielk1977 11 ROLLBACK {UPDATE OR IGNORE}      0 {6 7 3 9}  1 0 0
3047a2b1eebSdanielk1977 12 {}       {UPDATE OR IGNORE}      0 {6 7 3 9}  1 0 0
3057a2b1eebSdanielk1977 13 {}       {UPDATE OR REPLACE}     0 {7 6 9}    1 0 0
3061e9daa6aSdrh 14 {}       {UPDATE OR FAIL}        1 {6 7 3 4}  1 0 0
3073ac9a864Sdrh 15 {}       {UPDATE OR ABORT}       1 {1 2 3 4}  1 0 0
3081e9daa6aSdrh 16 {}       {UPDATE OR ROLLBACK}    1 {1 2 3 4}  0 0 0
3090d65dc0eSdrh} {
310f9c8ce3cSdrh  if {$t0} {set t1 {UNIQUE constraint failed: t1.a}}
311d2db0906Sdan  if {[info exists TEMP_STORE] && $TEMP_STORE==3} {
312d829335eSdanielk1977    set t3 0
3131e9daa6aSdrh  } else {
3141e9daa6aSdrh    set t3 [expr {$t3+$t4}]
3151e9daa6aSdrh  }
3160d65dc0eSdrh  do_test conflict-6.$i {
317af6df11fSdrh    db close
318af6df11fSdrh    sqlite3 db test.db
3190d65dc0eSdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
320abec0beeSdrh    execsql {pragma temp_store=file}
321af6df11fSdrh    set ::sqlite_opentemp_count 0
3220d65dc0eSdrh    set r0 [catch {execsql [subst {
3230d65dc0eSdrh      DROP TABLE t1;
3240d65dc0eSdrh      CREATE TABLE t1(a,b,c, UNIQUE(a) $conf1);
3250d65dc0eSdrh      INSERT INTO t1 SELECT * FROM t2;
3260d65dc0eSdrh      UPDATE t3 SET x=0;
327af6df11fSdrh      BEGIN;
3280d65dc0eSdrh      $cmd t3 SET x=1;
3291dd397f0Sdrh      $cmd t1 SET b=b*2;
3300d65dc0eSdrh      $cmd t1 SET a=c+5;
3310d65dc0eSdrh    }]} r1]
3326b8b8749Sdrh    catch {execsql {COMMIT}}
3330d65dc0eSdrh    if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]}
3340d65dc0eSdrh    set r2 [execsql {SELECT x FROM t3}]
335af6df11fSdrh    list $r0 $r1 $r2 $::sqlite_opentemp_count
336af6df11fSdrh  } [list $t0 $t1 $t2 $t3]
3370d65dc0eSdrh}
338ef6764a1Sdrh
339fe1a1773Sdrh# Test to make sure a lot of IGNOREs don't cause a stack overflow
340fe1a1773Sdrh#
341fe1a1773Sdrhdo_test conflict-7.1 {
342fe1a1773Sdrh  execsql {
343fe1a1773Sdrh    DROP TABLE t1;
344fe1a1773Sdrh    DROP TABLE t2;
345fe1a1773Sdrh    DROP TABLE t3;
346fe1a1773Sdrh    CREATE TABLE t1(a unique, b);
347fe1a1773Sdrh  }
348fe1a1773Sdrh  for {set i 1} {$i<=50} {incr i} {
349fe1a1773Sdrh    execsql "INSERT into t1 values($i,[expr {$i+1}]);"
350fe1a1773Sdrh  }
351fe1a1773Sdrh  execsql {
352fe1a1773Sdrh    SELECT count(*), min(a), max(b) FROM t1;
353fe1a1773Sdrh  }
354fe1a1773Sdrh} {50 1 51}
355fe1a1773Sdrhdo_test conflict-7.2 {
356fe1a1773Sdrh  execsql {
357fe1a1773Sdrh    PRAGMA count_changes=on;
358fe1a1773Sdrh    UPDATE OR IGNORE t1 SET a=1000;
359fe1a1773Sdrh  }
360fe1a1773Sdrh} {1}
361c8d30ac1Sdrhdo_test conflict-7.2.1 {
362c8d30ac1Sdrh  db changes
363c8d30ac1Sdrh} {1}
364fe1a1773Sdrhdo_test conflict-7.3 {
365fe1a1773Sdrh  execsql {
366fe1a1773Sdrh    SELECT b FROM t1 WHERE a=1000;
367fe1a1773Sdrh  }
368fe1a1773Sdrh} {2}
369fe1a1773Sdrhdo_test conflict-7.4 {
370fe1a1773Sdrh  execsql {
371fe1a1773Sdrh    SELECT count(*) FROM t1;
372fe1a1773Sdrh  }
373fe1a1773Sdrh} {50}
374fe1a1773Sdrhdo_test conflict-7.5 {
375fe1a1773Sdrh  execsql {
376fe1a1773Sdrh    PRAGMA count_changes=on;
377fe1a1773Sdrh    UPDATE OR REPLACE t1 SET a=1001;
378fe1a1773Sdrh  }
379fe1a1773Sdrh} {50}
380c8d30ac1Sdrhdo_test conflict-7.5.1 {
381c8d30ac1Sdrh  db changes
382c8d30ac1Sdrh} {50}
383fe1a1773Sdrhdo_test conflict-7.6 {
384fe1a1773Sdrh  execsql {
385fe1a1773Sdrh    SELECT b FROM t1 WHERE a=1001;
386fe1a1773Sdrh  }
387fe1a1773Sdrh} {51}
388fe1a1773Sdrhdo_test conflict-7.7 {
389fe1a1773Sdrh  execsql {
390fe1a1773Sdrh    SELECT count(*) FROM t1;
391fe1a1773Sdrh  }
392fe1a1773Sdrh} {1}
393b28af71aSdanielk1977
394b28af71aSdanielk1977# Update for version 3: A SELECT statement no longer resets the change
395b28af71aSdanielk1977# counter (Test result changes from 0 to 50).
396c8d30ac1Sdrhdo_test conflict-7.7.1 {
397c8d30ac1Sdrh  db changes
398b28af71aSdanielk1977} {50}
399fe1a1773Sdrh
400feeb1394Sdrh# Make sure the row count is right for rows that are ignored on
401feeb1394Sdrh# an insert.
402feeb1394Sdrh#
403feeb1394Sdrhdo_test conflict-8.1 {
404feeb1394Sdrh  execsql {
405feeb1394Sdrh    DELETE FROM t1;
406feeb1394Sdrh    INSERT INTO t1 VALUES(1,2);
407feeb1394Sdrh  }
408feeb1394Sdrh  execsql {
409feeb1394Sdrh    INSERT OR IGNORE INTO t1 VALUES(2,3);
410feeb1394Sdrh  }
411feeb1394Sdrh} {1}
412c8d30ac1Sdrhdo_test conflict-8.1.1 {
413c8d30ac1Sdrh  db changes
414c8d30ac1Sdrh} {1}
415feeb1394Sdrhdo_test conflict-8.2 {
416feeb1394Sdrh  execsql {
417feeb1394Sdrh    INSERT OR IGNORE INTO t1 VALUES(2,4);
418feeb1394Sdrh  }
419feeb1394Sdrh} {0}
420c8d30ac1Sdrhdo_test conflict-8.2.1 {
421c8d30ac1Sdrh  db changes
422c8d30ac1Sdrh} {0}
423feeb1394Sdrhdo_test conflict-8.3 {
424feeb1394Sdrh  execsql {
425feeb1394Sdrh    INSERT OR REPLACE INTO t1 VALUES(2,4);
426feeb1394Sdrh  }
427feeb1394Sdrh} {1}
428c8d30ac1Sdrhdo_test conflict-8.3.1 {
429c8d30ac1Sdrh  db changes
430c8d30ac1Sdrh} {1}
431feeb1394Sdrhdo_test conflict-8.4 {
432feeb1394Sdrh  execsql {
433feeb1394Sdrh    INSERT OR IGNORE INTO t1 SELECT * FROM t1;
434feeb1394Sdrh  }
435feeb1394Sdrh} {0}
436c8d30ac1Sdrhdo_test conflict-8.4.1 {
437c8d30ac1Sdrh  db changes
438c8d30ac1Sdrh} {0}
439feeb1394Sdrhdo_test conflict-8.5 {
440feeb1394Sdrh  execsql {
441feeb1394Sdrh    INSERT OR IGNORE INTO t1 SELECT a+2,b+2 FROM t1;
442feeb1394Sdrh  }
443feeb1394Sdrh} {2}
444c8d30ac1Sdrhdo_test conflict-8.5.1 {
445c8d30ac1Sdrh  db changes
446c8d30ac1Sdrh} {2}
447feeb1394Sdrhdo_test conflict-8.6 {
448feeb1394Sdrh  execsql {
449feeb1394Sdrh    INSERT OR IGNORE INTO t1 SELECT a+3,b+3 FROM t1;
450feeb1394Sdrh  }
451feeb1394Sdrh} {3}
452c8d30ac1Sdrhdo_test conflict-8.6.1 {
453c8d30ac1Sdrh  db changes
454c8d30ac1Sdrh} {3}
455fe1a1773Sdrh
4563b167c75Sdrhintegrity_check conflict-8.99
4573b167c75Sdrh
4583b167c75Sdrhdo_test conflict-9.1 {
4593b167c75Sdrh  execsql {
4603b167c75Sdrh    PRAGMA count_changes=0;
4613b167c75Sdrh    CREATE TABLE t2(
4623b167c75Sdrh      a INTEGER UNIQUE ON CONFLICT IGNORE,
4633b167c75Sdrh      b INTEGER UNIQUE ON CONFLICT FAIL,
4643b167c75Sdrh      c INTEGER UNIQUE ON CONFLICT REPLACE,
4653b167c75Sdrh      d INTEGER UNIQUE ON CONFLICT ABORT,
4663b167c75Sdrh      e INTEGER UNIQUE ON CONFLICT ROLLBACK
4673b167c75Sdrh    );
4683b167c75Sdrh    CREATE TABLE t3(x);
4693b167c75Sdrh    INSERT INTO t3 VALUES(1);
4703b167c75Sdrh    SELECT * FROM t3;
4713b167c75Sdrh  }
4723b167c75Sdrh} {1}
4733b167c75Sdrhdo_test conflict-9.2 {
4743b167c75Sdrh  catchsql {
4753b167c75Sdrh    INSERT INTO t2 VALUES(1,1,1,1,1);
4763b167c75Sdrh    INSERT INTO t2 VALUES(2,2,2,2,2);
4773b167c75Sdrh    SELECT * FROM t2;
4783b167c75Sdrh  }
4793b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
4803b167c75Sdrhdo_test conflict-9.3 {
4813b167c75Sdrh  catchsql {
4823b167c75Sdrh    INSERT INTO t2 VALUES(1,3,3,3,3);
4833b167c75Sdrh    SELECT * FROM t2;
4843b167c75Sdrh  }
4853b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
4863b167c75Sdrhdo_test conflict-9.4 {
4873b167c75Sdrh  catchsql {
4883b167c75Sdrh    UPDATE t2 SET a=a+1 WHERE a=1;
4893b167c75Sdrh    SELECT * FROM t2;
4903b167c75Sdrh  }
4913b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
4923b167c75Sdrhdo_test conflict-9.5 {
4933b167c75Sdrh  catchsql {
4943b167c75Sdrh    INSERT INTO t2 VALUES(3,1,3,3,3);
4953b167c75Sdrh    SELECT * FROM t2;
4963b167c75Sdrh  }
497f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}}
4983b167c75Sdrhdo_test conflict-9.6 {
4993b167c75Sdrh  catchsql {
5003b167c75Sdrh    UPDATE t2 SET b=b+1 WHERE b=1;
5013b167c75Sdrh    SELECT * FROM t2;
5023b167c75Sdrh  }
503f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}}
5043b167c75Sdrhdo_test conflict-9.7 {
5053b167c75Sdrh  catchsql {
5063b167c75Sdrh    BEGIN;
5073b167c75Sdrh    UPDATE t3 SET x=x+1;
5083b167c75Sdrh    INSERT INTO t2 VALUES(3,1,3,3,3);
5093b167c75Sdrh    SELECT * FROM t2;
5103b167c75Sdrh  }
511f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}}
5123b167c75Sdrhdo_test conflict-9.8 {
5133b167c75Sdrh  execsql {COMMIT}
5143b167c75Sdrh  execsql {SELECT * FROM t3}
5153b167c75Sdrh} {2}
516483750baSdrhdo_test conflict-9.9 {
5173b167c75Sdrh  catchsql {
5183b167c75Sdrh    BEGIN;
5193b167c75Sdrh    UPDATE t3 SET x=x+1;
5203b167c75Sdrh    UPDATE t2 SET b=b+1 WHERE b=1;
5213b167c75Sdrh    SELECT * FROM t2;
5223b167c75Sdrh  }
523f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.b}}
5243b167c75Sdrhdo_test conflict-9.10 {
5253b167c75Sdrh  execsql {COMMIT}
5263b167c75Sdrh  execsql {SELECT * FROM t3}
5273b167c75Sdrh} {3}
5283b167c75Sdrhdo_test conflict-9.11 {
5293b167c75Sdrh  catchsql {
5303b167c75Sdrh    INSERT INTO t2 VALUES(3,3,3,1,3);
5313b167c75Sdrh    SELECT * FROM t2;
5323b167c75Sdrh  }
533f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}}
5343b167c75Sdrhdo_test conflict-9.12 {
5353b167c75Sdrh  catchsql {
5363b167c75Sdrh    UPDATE t2 SET d=d+1 WHERE d=1;
5373b167c75Sdrh    SELECT * FROM t2;
5383b167c75Sdrh  }
539f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}}
5403b167c75Sdrhdo_test conflict-9.13 {
5413b167c75Sdrh  catchsql {
5423b167c75Sdrh    BEGIN;
5433b167c75Sdrh    UPDATE t3 SET x=x+1;
5443b167c75Sdrh    INSERT INTO t2 VALUES(3,3,3,1,3);
5453b167c75Sdrh    SELECT * FROM t2;
5463b167c75Sdrh  }
547f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}}
5483b167c75Sdrhdo_test conflict-9.14 {
5493b167c75Sdrh  execsql {COMMIT}
5503b167c75Sdrh  execsql {SELECT * FROM t3}
5513b167c75Sdrh} {4}
5523b167c75Sdrhdo_test conflict-9.15 {
5533b167c75Sdrh  catchsql {
5543b167c75Sdrh    BEGIN;
5553b167c75Sdrh    UPDATE t3 SET x=x+1;
5563b167c75Sdrh    UPDATE t2 SET d=d+1 WHERE d=1;
5573b167c75Sdrh    SELECT * FROM t2;
5583b167c75Sdrh  }
559f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.d}}
5603b167c75Sdrhdo_test conflict-9.16 {
5613b167c75Sdrh  execsql {COMMIT}
5623b167c75Sdrh  execsql {SELECT * FROM t3}
5633b167c75Sdrh} {5}
5643b167c75Sdrhdo_test conflict-9.17 {
5653b167c75Sdrh  catchsql {
5663b167c75Sdrh    INSERT INTO t2 VALUES(3,3,3,3,1);
5673b167c75Sdrh    SELECT * FROM t2;
5683b167c75Sdrh  }
569f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}}
5703b167c75Sdrhdo_test conflict-9.18 {
5713b167c75Sdrh  catchsql {
5723b167c75Sdrh    UPDATE t2 SET e=e+1 WHERE e=1;
5733b167c75Sdrh    SELECT * FROM t2;
5743b167c75Sdrh  }
575f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}}
5763b167c75Sdrhdo_test conflict-9.19 {
5773b167c75Sdrh  catchsql {
5783b167c75Sdrh    BEGIN;
5793b167c75Sdrh    UPDATE t3 SET x=x+1;
5803b167c75Sdrh    INSERT INTO t2 VALUES(3,3,3,3,1);
5813b167c75Sdrh    SELECT * FROM t2;
5823b167c75Sdrh  }
583f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}}
584433dccfbSdrhverify_ex_errcode conflict-9.21b SQLITE_CONSTRAINT_UNIQUE
5853b167c75Sdrhdo_test conflict-9.20 {
5866b8b8749Sdrh  catch {execsql {COMMIT}}
5873b167c75Sdrh  execsql {SELECT * FROM t3}
5883b167c75Sdrh} {5}
5893b167c75Sdrhdo_test conflict-9.21 {
5903b167c75Sdrh  catchsql {
5913b167c75Sdrh    BEGIN;
5923b167c75Sdrh    UPDATE t3 SET x=x+1;
5933b167c75Sdrh    UPDATE t2 SET e=e+1 WHERE e=1;
5943b167c75Sdrh    SELECT * FROM t2;
5953b167c75Sdrh  }
596f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t2.e}}
597433dccfbSdrhverify_ex_errcode conflict-9.21b SQLITE_CONSTRAINT_UNIQUE
5983b167c75Sdrhdo_test conflict-9.22 {
5996b8b8749Sdrh  catch {execsql {COMMIT}}
6003b167c75Sdrh  execsql {SELECT * FROM t3}
6013b167c75Sdrh} {5}
6023b167c75Sdrhdo_test conflict-9.23 {
6033b167c75Sdrh  catchsql {
6043b167c75Sdrh    INSERT INTO t2 VALUES(3,3,1,3,3);
6053b167c75Sdrh    SELECT * FROM t2;
6063b167c75Sdrh  }
6073b167c75Sdrh} {0 {2 2 2 2 2 3 3 1 3 3}}
6083b167c75Sdrhdo_test conflict-9.24 {
6093b167c75Sdrh  catchsql {
6103b167c75Sdrh    UPDATE t2 SET c=c-1 WHERE c=2;
6113b167c75Sdrh    SELECT * FROM t2;
6123b167c75Sdrh  }
6133b167c75Sdrh} {0 {2 2 1 2 2}}
6143b167c75Sdrhdo_test conflict-9.25 {
6153b167c75Sdrh  catchsql {
6163b167c75Sdrh    BEGIN;
6173b167c75Sdrh    UPDATE t3 SET x=x+1;
6183b167c75Sdrh    INSERT INTO t2 VALUES(3,3,1,3,3);
6193b167c75Sdrh    SELECT * FROM t2;
6203b167c75Sdrh  }
6213b167c75Sdrh} {0 {3 3 1 3 3}}
6223b167c75Sdrhdo_test conflict-9.26 {
6236b8b8749Sdrh  catch {execsql {COMMIT}}
6243b167c75Sdrh  execsql {SELECT * FROM t3}
6253b167c75Sdrh} {6}
626bb37fdc7Sdrh
627a996e477Sdrhdo_test conflict-10.1 {
628a996e477Sdrh  catchsql {
629a996e477Sdrh    DELETE FROM t1;
63033752f8aSdanielk1977    BEGIN;
63133752f8aSdanielk1977    INSERT OR ROLLBACK INTO t1 VALUES(1,2);
63233752f8aSdanielk1977    INSERT OR ROLLBACK INTO t1 VALUES(1,3);
633a996e477Sdrh    COMMIT;
634a996e477Sdrh  }
635a996e477Sdrh  execsql {SELECT * FROM t1}
636a996e477Sdrh} {}
637a996e477Sdrhdo_test conflict-10.2 {
638a996e477Sdrh  catchsql {
639a996e477Sdrh    CREATE TABLE t4(x);
640a996e477Sdrh    CREATE UNIQUE INDEX t4x ON t4(x);
64133752f8aSdanielk1977    BEGIN;
64233752f8aSdanielk1977    INSERT OR ROLLBACK INTO t4 VALUES(1);
64333752f8aSdanielk1977    INSERT OR ROLLBACK INTO t4 VALUES(1);
644a996e477Sdrh    COMMIT;
645a996e477Sdrh  }
646a996e477Sdrh  execsql {SELECT * FROM t4}
647a996e477Sdrh} {}
648a996e477Sdrh
64941712ef1Sdrh# Ticket #1171.  Make sure statement rollbacks do not
65041712ef1Sdrh# damage the database.
65141712ef1Sdrh#
65241712ef1Sdrhdo_test conflict-11.1 {
65341712ef1Sdrh  execsql {
65441712ef1Sdrh    -- Create a database object (pages 2, 3 of the file)
65541712ef1Sdrh    BEGIN;
65641712ef1Sdrh      CREATE TABLE abc(a UNIQUE, b, c);
65741712ef1Sdrh      INSERT INTO abc VALUES(1, 2, 3);
65841712ef1Sdrh      INSERT INTO abc VALUES(4, 5, 6);
65941712ef1Sdrh      INSERT INTO abc VALUES(7, 8, 9);
66041712ef1Sdrh    COMMIT;
66141712ef1Sdrh  }
66241712ef1Sdrh
66341712ef1Sdrh
66441712ef1Sdrh  # Set a small cache size so that changes will spill into
66541712ef1Sdrh  # the database file.
66641712ef1Sdrh  execsql {
66741712ef1Sdrh    PRAGMA cache_size = 10;
66841712ef1Sdrh  }
66941712ef1Sdrh
67041712ef1Sdrh  # Make lots of changes.  Because of the small cache, some
67141712ef1Sdrh  # (most?) of these changes will spill into the disk file.
67241712ef1Sdrh  # In other words, some of the changes will not be held in
67341712ef1Sdrh  # cache.
67441712ef1Sdrh  #
67541712ef1Sdrh  execsql {
67641712ef1Sdrh    BEGIN;
67741712ef1Sdrh      -- Make sure the pager is in EXCLUSIVE state.
67841712ef1Sdrh      CREATE TABLE def(d, e, f);
67941712ef1Sdrh      INSERT INTO def VALUES
68041712ef1Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
68141712ef1Sdrh      INSERT INTO def SELECT * FROM def;
68241712ef1Sdrh      INSERT INTO def SELECT * FROM def;
68341712ef1Sdrh      INSERT INTO def SELECT * FROM def;
68441712ef1Sdrh      INSERT INTO def SELECT * FROM def;
68541712ef1Sdrh      INSERT INTO def SELECT * FROM def;
68641712ef1Sdrh      INSERT INTO def SELECT * FROM def;
68741712ef1Sdrh      INSERT INTO def SELECT * FROM def;
68841712ef1Sdrh      DELETE FROM abc WHERE a = 4;
68941712ef1Sdrh  }
69041712ef1Sdrh
69141712ef1Sdrh  # Execute a statement that does a statement rollback due to
69241712ef1Sdrh  # a constraint failure.
69341712ef1Sdrh  #
69441712ef1Sdrh  catchsql {
69541712ef1Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
69641712ef1Sdrh  }
69741712ef1Sdrh
69841712ef1Sdrh  # Rollback the database.  Verify that the state of the ABC table
69941712ef1Sdrh  # is unchanged from the beginning of the transaction.  In other words,
70041712ef1Sdrh  # make sure the DELETE on table ABC that occurred within the transaction
70141712ef1Sdrh  # had no effect.
70241712ef1Sdrh  #
70341712ef1Sdrh  execsql {
70441712ef1Sdrh    ROLLBACK;
70541712ef1Sdrh    SELECT * FROM abc;
70641712ef1Sdrh  }
70741712ef1Sdrh} {1 2 3 4 5 6 7 8 9}
70841712ef1Sdrhintegrity_check conflict-11.2
70941712ef1Sdrh
71041712ef1Sdrh# Repeat test conflict-11.1 but this time commit.
71141712ef1Sdrh#
71241712ef1Sdrhdo_test conflict-11.3 {
71341712ef1Sdrh  execsql {
71441712ef1Sdrh    BEGIN;
71541712ef1Sdrh      -- Make sure the pager is in EXCLUSIVE state.
71641712ef1Sdrh      UPDATE abc SET a=a+1;
71741712ef1Sdrh      CREATE TABLE def(d, e, f);
71841712ef1Sdrh      INSERT INTO def VALUES
71941712ef1Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
72041712ef1Sdrh      INSERT INTO def SELECT * FROM def;
72141712ef1Sdrh      INSERT INTO def SELECT * FROM def;
72241712ef1Sdrh      INSERT INTO def SELECT * FROM def;
72341712ef1Sdrh      INSERT INTO def SELECT * FROM def;
72441712ef1Sdrh      INSERT INTO def SELECT * FROM def;
72541712ef1Sdrh      INSERT INTO def SELECT * FROM def;
72641712ef1Sdrh      INSERT INTO def SELECT * FROM def;
72741712ef1Sdrh      DELETE FROM abc WHERE a = 4;
72841712ef1Sdrh  }
72941712ef1Sdrh  catchsql {
73041712ef1Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
73141712ef1Sdrh  }
73241712ef1Sdrh  execsql {
73341712ef1Sdrh    ROLLBACK;
73441712ef1Sdrh    SELECT * FROM abc;
73541712ef1Sdrh  }
73641712ef1Sdrh} {1 2 3 4 5 6 7 8 9}
73741712ef1Sdrh# Repeat test conflict-11.1 but this time commit.
73841712ef1Sdrh#
73941712ef1Sdrhdo_test conflict-11.5 {
74041712ef1Sdrh  execsql {
74141712ef1Sdrh    BEGIN;
74241712ef1Sdrh      -- Make sure the pager is in EXCLUSIVE state.
74341712ef1Sdrh      CREATE TABLE def(d, e, f);
74441712ef1Sdrh      INSERT INTO def VALUES
74541712ef1Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
74641712ef1Sdrh      INSERT INTO def SELECT * FROM def;
74741712ef1Sdrh      INSERT INTO def SELECT * FROM def;
74841712ef1Sdrh      INSERT INTO def SELECT * FROM def;
74941712ef1Sdrh      INSERT INTO def SELECT * FROM def;
75041712ef1Sdrh      INSERT INTO def SELECT * FROM def;
75141712ef1Sdrh      INSERT INTO def SELECT * FROM def;
75241712ef1Sdrh      INSERT INTO def SELECT * FROM def;
75341712ef1Sdrh      DELETE FROM abc WHERE a = 4;
75441712ef1Sdrh  }
75541712ef1Sdrh  catchsql {
75641712ef1Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
75741712ef1Sdrh  }
75841712ef1Sdrh  execsql {
75941712ef1Sdrh    COMMIT;
76041712ef1Sdrh    SELECT * FROM abc;
76141712ef1Sdrh  }
76241712ef1Sdrh} {1 2 3 7 8 9}
76341712ef1Sdrhintegrity_check conflict-11.6
76441712ef1Sdrh
76560a713c6Sdrh# Make sure UPDATE OR REPLACE works on tables that have only
76660a713c6Sdrh# an INTEGER PRIMARY KEY.
76760a713c6Sdrh#
76860a713c6Sdrhdo_test conflict-12.1 {
76960a713c6Sdrh  execsql {
77060a713c6Sdrh    CREATE TABLE t5(a INTEGER PRIMARY KEY, b text);
77160a713c6Sdrh    INSERT INTO t5 VALUES(1,'one');
77260a713c6Sdrh    INSERT INTO t5 VALUES(2,'two');
77360a713c6Sdrh    SELECT * FROM t5
77460a713c6Sdrh  }
77560a713c6Sdrh} {1 one 2 two}
77660a713c6Sdrhdo_test conflict-12.2 {
77760a713c6Sdrh  execsql {
77860a713c6Sdrh    UPDATE OR IGNORE t5 SET a=a+1 WHERE a=1;
77960a713c6Sdrh    SELECT * FROM t5;
78060a713c6Sdrh  }
78160a713c6Sdrh} {1 one 2 two}
78260a713c6Sdrhdo_test conflict-12.3 {
78360a713c6Sdrh  catchsql {
78460a713c6Sdrh    UPDATE t5 SET a=a+1 WHERE a=1;
78560a713c6Sdrh  }
786f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t5.a}}
787433dccfbSdrhverify_ex_errcode conflict-12.3b SQLITE_CONSTRAINT_PRIMARYKEY
78860a713c6Sdrhdo_test conflict-12.4 {
78960a713c6Sdrh  execsql {
79060a713c6Sdrh    UPDATE OR REPLACE t5 SET a=a+1 WHERE a=1;
79160a713c6Sdrh    SELECT * FROM t5;
79260a713c6Sdrh  }
79360a713c6Sdrh} {2 one}
794f9c8ce3cSdrhdo_test conflict-12.5 {
795f9c8ce3cSdrh  catchsql {
796f9c8ce3cSdrh    CREATE TABLE t5b(x);
797f9c8ce3cSdrh    INSERT INTO t5b(rowid, x) VALUES(1,10),(2,11);
798f9c8ce3cSdrh    UPDATE t5b SET rowid=rowid+1 WHERE x=10;
799f9c8ce3cSdrh  }
800f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t5b.rowid}}
801f9c8ce3cSdrhverify_ex_errcode conflict-12.5b SQLITE_CONSTRAINT_ROWID
80260a713c6Sdrh
803ed717fe3Sdrh
8046dc84902Sdrh# Ticket [c38baa3d969eab7946dc50ba9d9b4f0057a19437]
8056dc84902Sdrh# REPLACE works like ABORT on a CHECK constraint.
8066dc84902Sdrh#
8076dc84902Sdrhdo_test conflict-13.1 {
8086dc84902Sdrh  execsql {
8096dc84902Sdrh    CREATE TABLE t13(a CHECK(a!=2));
8106dc84902Sdrh    BEGIN;
8116dc84902Sdrh    REPLACE INTO t13 VALUES(1);
8126dc84902Sdrh  }
8136dc84902Sdrh  catchsql {
8146dc84902Sdrh    REPLACE INTO t13 VALUES(2);
8156dc84902Sdrh  }
816*92e21ef0Sdrh} {1 {CHECK constraint failed: a!=2}}
817433dccfbSdrhverify_ex_errcode conflict-13.1b SQLITE_CONSTRAINT_CHECK
8186dc84902Sdrhdo_test conflict-13.2 {
8196dc84902Sdrh  execsql {
8206dc84902Sdrh    REPLACE INTO t13 VALUES(3);
8216dc84902Sdrh    COMMIT;
8226dc84902Sdrh    SELECT * FROM t13;
8236dc84902Sdrh  }
8246dc84902Sdrh} {1 3}
8256dc84902Sdrh
8266dc84902Sdrh
8279bfb0794Sdrh# Ticket https://www.sqlite.org/src/tktview/e6f1f2e34dceeb1ed61531c7e9
8289bfb0794Sdrh# Verify that it is not possible to sneak a NULL value into a NOT NULL
8299bfb0794Sdrh# column using REPLACE.
8309bfb0794Sdrh#
8319bfb0794Sdrhdo_catchsql_test conflict-14.1 {
8329bfb0794Sdrh  DROP TABLE IF EXISTS t1;
8339bfb0794Sdrh  CREATE TABLE t1(x NOT NULL DEFAULT NULL);
8349bfb0794Sdrh  REPLACE INTO t1 DEFAULT VALUES;
8359bfb0794Sdrh} {1 {NOT NULL constraint failed: t1.x}}
8369bfb0794Sdrh
837d35bdd6cSdrh# 2019-12-15 gramfuzz1 find
838d35bdd6cSdrh# Three UNIQUE constraints, where the third would is a duplicate except
839d35bdd6cSdrh# that it adds ON CONFLICT REPLACE.  Verify that the indexes end up
840d35bdd6cSdrh# sorted in the correct order (REPLACE last) so that constraint processing
841d35bdd6cSdrh# works correctly.
842d35bdd6cSdrh#
843d35bdd6cSdrhreset_db
844d35bdd6cSdrhdo_execsql_test conflict-15.10 {
845d35bdd6cSdrh  CREATE TABLE t1(
846d35bdd6cSdrh    x PRIMARY KEY,
847d35bdd6cSdrh    UNIQUE(x,x),
848d35bdd6cSdrh    UNIQUE(x,x) ON CONFLICT REPLACE
849d35bdd6cSdrh  );
850d35bdd6cSdrh  INSERT INTO t1(x) VALUES(1);
851d35bdd6cSdrh  SELECT * FROM t1;
852d35bdd6cSdrh} {1}
853d35bdd6cSdrhdo_catchsql_test conflict-15.20 {
854d35bdd6cSdrh  INSERT INTO t1(x) VALUES(1);
855d35bdd6cSdrh} {1 {UNIQUE constraint failed: t1.x}}
856d35bdd6cSdrhdo_execsql_test conflict-15.30 {
857d35bdd6cSdrh  SELECT * FROM t1;
858d35bdd6cSdrh} {1}
8599bfb0794Sdrh
860bb37fdc7Sdrhfinish_test
861