xref: /sqlite-3.40.0/test/conflict.test (revision 3bdca9c9)
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#
16*3bdca9c9Sdanielk1977# $Id: conflict.test,v 1.27 2006/01/17 09:35:02 danielk1977 Exp $
17bb37fdc7Sdrh
18bb37fdc7Sdrhset testdir [file dirname $argv0]
19bb37fdc7Sdrhsource $testdir/tester.tcl
20bb37fdc7Sdrh
21*3bdca9c9Sdanielk1977ifcapable !conflict {
22*3bdca9c9Sdanielk1977  finish_test
23*3bdca9c9Sdanielk1977  return
24*3bdca9c9Sdanielk1977}
25*3bdca9c9Sdanielk1977
260d65dc0eSdrh# Create tables for the first group of tests.
27bb37fdc7Sdrh#
280d65dc0eSdrhdo_test conflict-1.0 {
29bb37fdc7Sdrh  execsql {
30bb37fdc7Sdrh    CREATE TABLE t1(a, b, c, UNIQUE(a,b));
310d65dc0eSdrh    CREATE TABLE t2(x);
32bb37fdc7Sdrh    SELECT c FROM t1 ORDER BY c;
33bb37fdc7Sdrh  }
340d65dc0eSdrh} {}
35bb37fdc7Sdrh
360d65dc0eSdrh# Six columns of configuration data as follows:
370d65dc0eSdrh#
380d65dc0eSdrh#   i      The reference number of the test
390d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
400d65dc0eSdrh#   t0     True if there is an error from $cmd
410d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
420d65dc0eSdrh#   t2     Content of "x" column of t2
43af6df11fSdrh#   t3     Number of temporary files created by this test
440d65dc0eSdrh#
45af6df11fSdrhforeach {i cmd t0 t1 t2 t3} {
46af6df11fSdrh  1 INSERT                  1 {}  1  0
47af6df11fSdrh  2 {INSERT OR IGNORE}      0 3   1  0
48af6df11fSdrh  3 {INSERT OR REPLACE}     0 4   1  0
49af6df11fSdrh  4 REPLACE                 0 4   1  0
50af6df11fSdrh  5 {INSERT OR FAIL}        1 {}  1  0
51af6df11fSdrh  6 {INSERT OR ABORT}       1 {}  1  0
52af6df11fSdrh  7 {INSERT OR ROLLBACK}    1 {}  {} 0
530d65dc0eSdrh} {
540d65dc0eSdrh  do_test conflict-1.$i {
55af6df11fSdrh    set ::sqlite_opentemp_count 0
560d65dc0eSdrh    set r0 [catch {execsql [subst {
57bb37fdc7Sdrh      DELETE FROM t1;
580d65dc0eSdrh      DELETE FROM t2;
59bb37fdc7Sdrh      INSERT INTO t1 VALUES(1,2,3);
60af6df11fSdrh      BEGIN;
610d65dc0eSdrh      INSERT INTO t2 VALUES(1);
620d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,4);
630d65dc0eSdrh    }]} r1]
646b8b8749Sdrh    catch {execsql {COMMIT}}
650d65dc0eSdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
660d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
67af6df11fSdrh    set r3 $::sqlite_opentemp_count
68af6df11fSdrh    list $r0 $r1 $r2 $r3
69af6df11fSdrh  } [list $t0 $t1 $t2 $t3]
70bb37fdc7Sdrh}
71bb37fdc7Sdrh
720d65dc0eSdrh# Create tables for the first group of tests.
730d65dc0eSdrh#
740d65dc0eSdrhdo_test conflict-2.0 {
75ef6764a1Sdrh  execsql {
76ef6764a1Sdrh    DROP TABLE t1;
77ef6764a1Sdrh    DROP TABLE t2;
780d65dc0eSdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(a,b));
790d65dc0eSdrh    CREATE TABLE t2(x);
80ef6764a1Sdrh    SELECT c FROM t1 ORDER BY c;
81ef6764a1Sdrh  }
820d65dc0eSdrh} {}
83ef6764a1Sdrh
840d65dc0eSdrh# Six columns of configuration data as follows:
850d65dc0eSdrh#
860d65dc0eSdrh#   i      The reference number of the test
870d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
880d65dc0eSdrh#   t0     True if there is an error from $cmd
890d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
900d65dc0eSdrh#   t2     Content of "x" column of t2
910d65dc0eSdrh#
92af6df11fSdrhforeach {i cmd t0 t1 t2} {
93af6df11fSdrh  1 INSERT                  1 {}  1
94af6df11fSdrh  2 {INSERT OR IGNORE}      0 3   1
95af6df11fSdrh  3 {INSERT OR REPLACE}     0 4   1
96af6df11fSdrh  4 REPLACE                 0 4   1
97af6df11fSdrh  5 {INSERT OR FAIL}        1 {}  1
98af6df11fSdrh  6 {INSERT OR ABORT}       1 {}  1
99af6df11fSdrh  7 {INSERT OR ROLLBACK}    1 {}  {}
1000d65dc0eSdrh} {
1010d65dc0eSdrh  do_test conflict-2.$i {
1020d65dc0eSdrh    set r0 [catch {execsql [subst {
103ef6764a1Sdrh      DELETE FROM t1;
1040d65dc0eSdrh      DELETE FROM t2;
105ef6764a1Sdrh      INSERT INTO t1 VALUES(1,2,3);
106af6df11fSdrh      BEGIN;
1070d65dc0eSdrh      INSERT INTO t2 VALUES(1);
1080d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,4);
1090d65dc0eSdrh    }]} r1]
1106b8b8749Sdrh    catch {execsql {COMMIT}}
1110d65dc0eSdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
1120d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
1130d65dc0eSdrh    list $r0 $r1 $r2
1140d65dc0eSdrh  } [list $t0 $t1 $t2]
115ef6764a1Sdrh}
1160d65dc0eSdrh
1170d65dc0eSdrh# Create tables for the first group of tests.
1180d65dc0eSdrh#
1190d65dc0eSdrhdo_test conflict-3.0 {
1200d65dc0eSdrh  execsql {
1210d65dc0eSdrh    DROP TABLE t1;
1220d65dc0eSdrh    DROP TABLE t2;
123e0194f2bSdrh    CREATE TABLE t1(a, b, c INTEGER, PRIMARY KEY(c), UNIQUE(a,b));
1240d65dc0eSdrh    CREATE TABLE t2(x);
125ef6764a1Sdrh    SELECT c FROM t1 ORDER BY c;
126ef6764a1Sdrh  }
1270d65dc0eSdrh} {}
1280d65dc0eSdrh
1290d65dc0eSdrh# Six columns of configuration data as follows:
1300d65dc0eSdrh#
1310d65dc0eSdrh#   i      The reference number of the test
1320d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
1330d65dc0eSdrh#   t0     True if there is an error from $cmd
1340d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
1350d65dc0eSdrh#   t2     Content of "x" column of t2
1360d65dc0eSdrh#
137af6df11fSdrhforeach {i cmd t0 t1 t2} {
138af6df11fSdrh  1 INSERT                  1 {}  1
139af6df11fSdrh  2 {INSERT OR IGNORE}      0 3   1
140af6df11fSdrh  3 {INSERT OR REPLACE}     0 4   1
141af6df11fSdrh  4 REPLACE                 0 4   1
142af6df11fSdrh  5 {INSERT OR FAIL}        1 {}  1
143af6df11fSdrh  6 {INSERT OR ABORT}       1 {}  1
144af6df11fSdrh  7 {INSERT OR ROLLBACK}    1 {}  {}
1450d65dc0eSdrh} {
1460d65dc0eSdrh  do_test conflict-3.$i {
1470d65dc0eSdrh    set r0 [catch {execsql [subst {
1480d65dc0eSdrh      DELETE FROM t1;
1490d65dc0eSdrh      DELETE FROM t2;
1500d65dc0eSdrh      INSERT INTO t1 VALUES(1,2,3);
151af6df11fSdrh      BEGIN;
1520d65dc0eSdrh      INSERT INTO t2 VALUES(1);
1530d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,4);
1540d65dc0eSdrh    }]} r1]
1556b8b8749Sdrh    catch {execsql {COMMIT}}
1560d65dc0eSdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
1570d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
1580d65dc0eSdrh    list $r0 $r1 $r2
1590d65dc0eSdrh  } [list $t0 $t1 $t2]
160ef6764a1Sdrh}
1610d65dc0eSdrh
1620d65dc0eSdrhdo_test conflict-4.0 {
1630d65dc0eSdrh  execsql {
1640d65dc0eSdrh    DROP TABLE t2;
1650d65dc0eSdrh    CREATE TABLE t2(x);
1660d65dc0eSdrh    SELECT x FROM t2;
167ef6764a1Sdrh  }
1680d65dc0eSdrh} {}
1690d65dc0eSdrh
1700d65dc0eSdrh# Six columns of configuration data as follows:
1710d65dc0eSdrh#
1720d65dc0eSdrh#   i      The reference number of the test
1730d65dc0eSdrh#   conf1  The conflict resolution algorithm on the UNIQUE constraint
1740d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
1750d65dc0eSdrh#   t0     True if there is an error from $cmd
1760d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
1770d65dc0eSdrh#   t2     Content of "x" column of t2
1780d65dc0eSdrh#
179af6df11fSdrhforeach {i conf1 cmd t0 t1 t2} {
180af6df11fSdrh  1 {}       INSERT                  1 {}  1
181af6df11fSdrh  2 REPLACE  INSERT                  0 4   1
182af6df11fSdrh  3 IGNORE   INSERT                  0 3   1
183af6df11fSdrh  4 FAIL     INSERT                  1 {}  1
184af6df11fSdrh  5 ABORT    INSERT                  1 {}  1
185af6df11fSdrh  6 ROLLBACK INSERT                  1 {}  {}
186af6df11fSdrh  7 REPLACE  {INSERT OR IGNORE}      0 3   1
187af6df11fSdrh  8 IGNORE   {INSERT OR REPLACE}     0 4   1
188af6df11fSdrh  9 FAIL     {INSERT OR IGNORE}      0 3   1
189af6df11fSdrh 10 ABORT    {INSERT OR REPLACE}     0 4   1
190af6df11fSdrh 11 ROLLBACK {INSERT OR IGNORE }     0 3   1
1910d65dc0eSdrh} {
1920d65dc0eSdrh  do_test conflict-4.$i {
1930d65dc0eSdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
1940d65dc0eSdrh    set r0 [catch {execsql [subst {
1950d65dc0eSdrh      DROP TABLE t1;
1960d65dc0eSdrh      CREATE TABLE t1(a,b,c,UNIQUE(a,b) $conf1);
1970d65dc0eSdrh      DELETE FROM t2;
1980d65dc0eSdrh      INSERT INTO t1 VALUES(1,2,3);
199af6df11fSdrh      BEGIN;
2000d65dc0eSdrh      INSERT INTO t2 VALUES(1);
2010d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,4);
2020d65dc0eSdrh    }]} r1]
2036b8b8749Sdrh    catch {execsql {COMMIT}}
2040d65dc0eSdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
2050d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
2060d65dc0eSdrh    list $r0 $r1 $r2
2070d65dc0eSdrh  } [list $t0 $t1 $t2]
208ef6764a1Sdrh}
2090d65dc0eSdrh
2100d65dc0eSdrhdo_test conflict-5.0 {
2110d65dc0eSdrh  execsql {
2120d65dc0eSdrh    DROP TABLE t2;
2130d65dc0eSdrh    CREATE TABLE t2(x);
2140d65dc0eSdrh    SELECT x FROM t2;
2150d65dc0eSdrh  }
2160d65dc0eSdrh} {}
2170d65dc0eSdrh
2180d65dc0eSdrh# Six columns of configuration data as follows:
2190d65dc0eSdrh#
2200d65dc0eSdrh#   i      The reference number of the test
2210d65dc0eSdrh#   conf1  The conflict resolution algorithm on the NOT NULL constraint
2220d65dc0eSdrh#   cmd    An INSERT or REPLACE command to execute against table t1
2230d65dc0eSdrh#   t0     True if there is an error from $cmd
2240d65dc0eSdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
2250d65dc0eSdrh#   t2     Content of "x" column of t2
2260d65dc0eSdrh#
227af6df11fSdrhforeach {i conf1 cmd t0 t1 t2} {
228af6df11fSdrh  1 {}       INSERT                  1 {}  1
229af6df11fSdrh  2 REPLACE  INSERT                  0 5   1
230af6df11fSdrh  3 IGNORE   INSERT                  0 {}  1
231af6df11fSdrh  4 FAIL     INSERT                  1 {}  1
232af6df11fSdrh  5 ABORT    INSERT                  1 {}  1
233af6df11fSdrh  6 ROLLBACK INSERT                  1 {}  {}
234af6df11fSdrh  7 REPLACE  {INSERT OR IGNORE}      0 {}  1
235af6df11fSdrh  8 IGNORE   {INSERT OR REPLACE}     0 5   1
236af6df11fSdrh  9 FAIL     {INSERT OR IGNORE}      0 {}  1
237af6df11fSdrh 10 ABORT    {INSERT OR REPLACE}     0 5   1
238af6df11fSdrh 11 ROLLBACK {INSERT OR IGNORE}      0 {}  1
239af6df11fSdrh 12 {}       {INSERT OR IGNORE}      0 {}  1
240af6df11fSdrh 13 {}       {INSERT OR REPLACE}     0 5   1
241af6df11fSdrh 14 {}       {INSERT OR FAIL}        1 {}  1
242af6df11fSdrh 15 {}       {INSERT OR ABORT}       1 {}  1
243af6df11fSdrh 16 {}       {INSERT OR ROLLBACK}    1 {}  {}
2440d65dc0eSdrh} {
245483750baSdrh  if {$t0} {set t1 {t1.c may not be NULL}}
2460d65dc0eSdrh  do_test conflict-5.$i {
2470d65dc0eSdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
2480d65dc0eSdrh    set r0 [catch {execsql [subst {
2490d65dc0eSdrh      DROP TABLE t1;
2500d65dc0eSdrh      CREATE TABLE t1(a,b,c NOT NULL $conf1 DEFAULT 5);
2510d65dc0eSdrh      DELETE FROM t2;
252af6df11fSdrh      BEGIN;
2530d65dc0eSdrh      INSERT INTO t2 VALUES(1);
2540d65dc0eSdrh      $cmd INTO t1 VALUES(1,2,NULL);
2550d65dc0eSdrh    }]} r1]
2566b8b8749Sdrh    catch {execsql {COMMIT}}
2570d65dc0eSdrh    if {!$r0} {set r1 [execsql {SELECT c FROM t1}]}
2580d65dc0eSdrh    set r2 [execsql {SELECT x FROM t2}]
2590d65dc0eSdrh    list $r0 $r1 $r2
2600d65dc0eSdrh  } [list $t0 $t1 $t2]
2610d65dc0eSdrh}
2620d65dc0eSdrh
2630d65dc0eSdrhdo_test conflict-6.0 {
2640d65dc0eSdrh  execsql {
2650d65dc0eSdrh    DROP TABLE t2;
2660d65dc0eSdrh    CREATE TABLE t2(a,b,c);
2670d65dc0eSdrh    INSERT INTO t2 VALUES(1,2,1);
2680d65dc0eSdrh    INSERT INTO t2 VALUES(2,3,2);
2690d65dc0eSdrh    INSERT INTO t2 VALUES(3,4,1);
2700d65dc0eSdrh    INSERT INTO t2 VALUES(4,5,4);
2710d65dc0eSdrh    SELECT c FROM t2 ORDER BY b;
2720d65dc0eSdrh    CREATE TABLE t3(x);
2730d65dc0eSdrh    INSERT INTO t3 VALUES(1);
2740d65dc0eSdrh  }
2750d65dc0eSdrh} {1 2 1 4}
2760d65dc0eSdrh
2770d65dc0eSdrh# Six columns of configuration data as follows:
2780d65dc0eSdrh#
2790d65dc0eSdrh#   i      The reference number of the test
2800d65dc0eSdrh#   conf1  The conflict resolution algorithm on the UNIQUE constraint
2810d65dc0eSdrh#   cmd    An UPDATE command to execute against table t1
2820d65dc0eSdrh#   t0     True if there is an error from $cmd
2830d65dc0eSdrh#   t1     Content of "b" column of t1 assuming no error in $cmd
2840d65dc0eSdrh#   t2     Content of "x" column of t3
285af6df11fSdrh#   t3     Number of temporary files created
2860d65dc0eSdrh#
287af6df11fSdrhforeach {i conf1 cmd t0 t1 t2 t3} {
288af6df11fSdrh  1 {}       UPDATE                  1 {6 7 8 9}  1 1
2890342b1f5Sdrh  2 REPLACE  UPDATE                  0 {7 6 9}    1 1
2900342b1f5Sdrh  3 IGNORE   UPDATE                  0 {6 7 3 9}  1 1
291af6df11fSdrh  4 FAIL     UPDATE                  1 {6 7 3 4}  1 0
292af6df11fSdrh  5 ABORT    UPDATE                  1 {1 2 3 4}  1 1
293af6df11fSdrh  6 ROLLBACK UPDATE                  1 {1 2 3 4}  0 0
2940342b1f5Sdrh  7 REPLACE  {UPDATE OR IGNORE}      0 {6 7 3 9}  1 1
2950342b1f5Sdrh  8 IGNORE   {UPDATE OR REPLACE}     0 {7 6 9}    1 1
2960342b1f5Sdrh  9 FAIL     {UPDATE OR IGNORE}      0 {6 7 3 9}  1 1
2970342b1f5Sdrh 10 ABORT    {UPDATE OR REPLACE}     0 {7 6 9}    1 1
2980342b1f5Sdrh 11 ROLLBACK {UPDATE OR IGNORE}      0 {6 7 3 9}  1 1
2990342b1f5Sdrh 12 {}       {UPDATE OR IGNORE}      0 {6 7 3 9}  1 1
3000342b1f5Sdrh 13 {}       {UPDATE OR REPLACE}     0 {7 6 9}    1 1
301af6df11fSdrh 14 {}       {UPDATE OR FAIL}        1 {6 7 3 4}  1 0
302af6df11fSdrh 15 {}       {UPDATE OR ABORT}       1 {1 2 3 4}  1 1
303af6df11fSdrh 16 {}       {UPDATE OR ROLLBACK}    1 {1 2 3 4}  0 0
3040d65dc0eSdrh} {
30537ed48edSdrh  if {$t0} {set t1 {column a is not unique}}
3060d65dc0eSdrh  do_test conflict-6.$i {
307af6df11fSdrh    db close
308af6df11fSdrh    sqlite3 db test.db
3090d65dc0eSdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
310abec0beeSdrh    execsql {pragma temp_store=file}
311af6df11fSdrh    set ::sqlite_opentemp_count 0
3120d65dc0eSdrh    set r0 [catch {execsql [subst {
3130d65dc0eSdrh      DROP TABLE t1;
3140d65dc0eSdrh      CREATE TABLE t1(a,b,c, UNIQUE(a) $conf1);
3150d65dc0eSdrh      INSERT INTO t1 SELECT * FROM t2;
3160d65dc0eSdrh      UPDATE t3 SET x=0;
317af6df11fSdrh      BEGIN;
3180d65dc0eSdrh      $cmd t3 SET x=1;
3191dd397f0Sdrh      $cmd t1 SET b=b*2;
3200d65dc0eSdrh      $cmd t1 SET a=c+5;
3210d65dc0eSdrh    }]} r1]
3226b8b8749Sdrh    catch {execsql {COMMIT}}
3230d65dc0eSdrh    if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]}
3240d65dc0eSdrh    set r2 [execsql {SELECT x FROM t3}]
325af6df11fSdrh    list $r0 $r1 $r2 $::sqlite_opentemp_count
326af6df11fSdrh  } [list $t0 $t1 $t2 $t3]
3270d65dc0eSdrh}
328ef6764a1Sdrh
329fe1a1773Sdrh# Test to make sure a lot of IGNOREs don't cause a stack overflow
330fe1a1773Sdrh#
331fe1a1773Sdrhdo_test conflict-7.1 {
332fe1a1773Sdrh  execsql {
333fe1a1773Sdrh    DROP TABLE t1;
334fe1a1773Sdrh    DROP TABLE t2;
335fe1a1773Sdrh    DROP TABLE t3;
336fe1a1773Sdrh    CREATE TABLE t1(a unique, b);
337fe1a1773Sdrh  }
338fe1a1773Sdrh  for {set i 1} {$i<=50} {incr i} {
339fe1a1773Sdrh    execsql "INSERT into t1 values($i,[expr {$i+1}]);"
340fe1a1773Sdrh  }
341fe1a1773Sdrh  execsql {
342fe1a1773Sdrh    SELECT count(*), min(a), max(b) FROM t1;
343fe1a1773Sdrh  }
344fe1a1773Sdrh} {50 1 51}
345fe1a1773Sdrhdo_test conflict-7.2 {
346fe1a1773Sdrh  execsql {
347fe1a1773Sdrh    PRAGMA count_changes=on;
348fe1a1773Sdrh    UPDATE OR IGNORE t1 SET a=1000;
349fe1a1773Sdrh  }
350fe1a1773Sdrh} {1}
351c8d30ac1Sdrhdo_test conflict-7.2.1 {
352c8d30ac1Sdrh  db changes
353c8d30ac1Sdrh} {1}
354fe1a1773Sdrhdo_test conflict-7.3 {
355fe1a1773Sdrh  execsql {
356fe1a1773Sdrh    SELECT b FROM t1 WHERE a=1000;
357fe1a1773Sdrh  }
358fe1a1773Sdrh} {2}
359fe1a1773Sdrhdo_test conflict-7.4 {
360fe1a1773Sdrh  execsql {
361fe1a1773Sdrh    SELECT count(*) FROM t1;
362fe1a1773Sdrh  }
363fe1a1773Sdrh} {50}
364fe1a1773Sdrhdo_test conflict-7.5 {
365fe1a1773Sdrh  execsql {
366fe1a1773Sdrh    PRAGMA count_changes=on;
367fe1a1773Sdrh    UPDATE OR REPLACE t1 SET a=1001;
368fe1a1773Sdrh  }
369fe1a1773Sdrh} {50}
370c8d30ac1Sdrhdo_test conflict-7.5.1 {
371c8d30ac1Sdrh  db changes
372c8d30ac1Sdrh} {50}
373fe1a1773Sdrhdo_test conflict-7.6 {
374fe1a1773Sdrh  execsql {
375fe1a1773Sdrh    SELECT b FROM t1 WHERE a=1001;
376fe1a1773Sdrh  }
377fe1a1773Sdrh} {51}
378fe1a1773Sdrhdo_test conflict-7.7 {
379fe1a1773Sdrh  execsql {
380fe1a1773Sdrh    SELECT count(*) FROM t1;
381fe1a1773Sdrh  }
382fe1a1773Sdrh} {1}
383b28af71aSdanielk1977
384b28af71aSdanielk1977# Update for version 3: A SELECT statement no longer resets the change
385b28af71aSdanielk1977# counter (Test result changes from 0 to 50).
386c8d30ac1Sdrhdo_test conflict-7.7.1 {
387c8d30ac1Sdrh  db changes
388b28af71aSdanielk1977} {50}
389fe1a1773Sdrh
390feeb1394Sdrh# Make sure the row count is right for rows that are ignored on
391feeb1394Sdrh# an insert.
392feeb1394Sdrh#
393feeb1394Sdrhdo_test conflict-8.1 {
394feeb1394Sdrh  execsql {
395feeb1394Sdrh    DELETE FROM t1;
396feeb1394Sdrh    INSERT INTO t1 VALUES(1,2);
397feeb1394Sdrh  }
398feeb1394Sdrh  execsql {
399feeb1394Sdrh    INSERT OR IGNORE INTO t1 VALUES(2,3);
400feeb1394Sdrh  }
401feeb1394Sdrh} {1}
402c8d30ac1Sdrhdo_test conflict-8.1.1 {
403c8d30ac1Sdrh  db changes
404c8d30ac1Sdrh} {1}
405feeb1394Sdrhdo_test conflict-8.2 {
406feeb1394Sdrh  execsql {
407feeb1394Sdrh    INSERT OR IGNORE INTO t1 VALUES(2,4);
408feeb1394Sdrh  }
409feeb1394Sdrh} {0}
410c8d30ac1Sdrhdo_test conflict-8.2.1 {
411c8d30ac1Sdrh  db changes
412c8d30ac1Sdrh} {0}
413feeb1394Sdrhdo_test conflict-8.3 {
414feeb1394Sdrh  execsql {
415feeb1394Sdrh    INSERT OR REPLACE INTO t1 VALUES(2,4);
416feeb1394Sdrh  }
417feeb1394Sdrh} {1}
418c8d30ac1Sdrhdo_test conflict-8.3.1 {
419c8d30ac1Sdrh  db changes
420c8d30ac1Sdrh} {1}
421feeb1394Sdrhdo_test conflict-8.4 {
422feeb1394Sdrh  execsql {
423feeb1394Sdrh    INSERT OR IGNORE INTO t1 SELECT * FROM t1;
424feeb1394Sdrh  }
425feeb1394Sdrh} {0}
426c8d30ac1Sdrhdo_test conflict-8.4.1 {
427c8d30ac1Sdrh  db changes
428c8d30ac1Sdrh} {0}
429feeb1394Sdrhdo_test conflict-8.5 {
430feeb1394Sdrh  execsql {
431feeb1394Sdrh    INSERT OR IGNORE INTO t1 SELECT a+2,b+2 FROM t1;
432feeb1394Sdrh  }
433feeb1394Sdrh} {2}
434c8d30ac1Sdrhdo_test conflict-8.5.1 {
435c8d30ac1Sdrh  db changes
436c8d30ac1Sdrh} {2}
437feeb1394Sdrhdo_test conflict-8.6 {
438feeb1394Sdrh  execsql {
439feeb1394Sdrh    INSERT OR IGNORE INTO t1 SELECT a+3,b+3 FROM t1;
440feeb1394Sdrh  }
441feeb1394Sdrh} {3}
442c8d30ac1Sdrhdo_test conflict-8.6.1 {
443c8d30ac1Sdrh  db changes
444c8d30ac1Sdrh} {3}
445fe1a1773Sdrh
4463b167c75Sdrhintegrity_check conflict-8.99
4473b167c75Sdrh
4483b167c75Sdrhdo_test conflict-9.1 {
4493b167c75Sdrh  execsql {
4503b167c75Sdrh    PRAGMA count_changes=0;
4513b167c75Sdrh    CREATE TABLE t2(
4523b167c75Sdrh      a INTEGER UNIQUE ON CONFLICT IGNORE,
4533b167c75Sdrh      b INTEGER UNIQUE ON CONFLICT FAIL,
4543b167c75Sdrh      c INTEGER UNIQUE ON CONFLICT REPLACE,
4553b167c75Sdrh      d INTEGER UNIQUE ON CONFLICT ABORT,
4563b167c75Sdrh      e INTEGER UNIQUE ON CONFLICT ROLLBACK
4573b167c75Sdrh    );
4583b167c75Sdrh    CREATE TABLE t3(x);
4593b167c75Sdrh    INSERT INTO t3 VALUES(1);
4603b167c75Sdrh    SELECT * FROM t3;
4613b167c75Sdrh  }
4623b167c75Sdrh} {1}
4633b167c75Sdrhdo_test conflict-9.2 {
4643b167c75Sdrh  catchsql {
4653b167c75Sdrh    INSERT INTO t2 VALUES(1,1,1,1,1);
4663b167c75Sdrh    INSERT INTO t2 VALUES(2,2,2,2,2);
4673b167c75Sdrh    SELECT * FROM t2;
4683b167c75Sdrh  }
4693b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
4703b167c75Sdrhdo_test conflict-9.3 {
4713b167c75Sdrh  catchsql {
4723b167c75Sdrh    INSERT INTO t2 VALUES(1,3,3,3,3);
4733b167c75Sdrh    SELECT * FROM t2;
4743b167c75Sdrh  }
4753b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
4763b167c75Sdrhdo_test conflict-9.4 {
4773b167c75Sdrh  catchsql {
4783b167c75Sdrh    UPDATE t2 SET a=a+1 WHERE a=1;
4793b167c75Sdrh    SELECT * FROM t2;
4803b167c75Sdrh  }
4813b167c75Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
4823b167c75Sdrhdo_test conflict-9.5 {
4833b167c75Sdrh  catchsql {
4843b167c75Sdrh    INSERT INTO t2 VALUES(3,1,3,3,3);
4853b167c75Sdrh    SELECT * FROM t2;
4863b167c75Sdrh  }
48737ed48edSdrh} {1 {column b is not unique}}
4883b167c75Sdrhdo_test conflict-9.6 {
4893b167c75Sdrh  catchsql {
4903b167c75Sdrh    UPDATE t2 SET b=b+1 WHERE b=1;
4913b167c75Sdrh    SELECT * FROM t2;
4923b167c75Sdrh  }
49337ed48edSdrh} {1 {column b is not unique}}
4943b167c75Sdrhdo_test conflict-9.7 {
4953b167c75Sdrh  catchsql {
4963b167c75Sdrh    BEGIN;
4973b167c75Sdrh    UPDATE t3 SET x=x+1;
4983b167c75Sdrh    INSERT INTO t2 VALUES(3,1,3,3,3);
4993b167c75Sdrh    SELECT * FROM t2;
5003b167c75Sdrh  }
50137ed48edSdrh} {1 {column b is not unique}}
5023b167c75Sdrhdo_test conflict-9.8 {
5033b167c75Sdrh  execsql {COMMIT}
5043b167c75Sdrh  execsql {SELECT * FROM t3}
5053b167c75Sdrh} {2}
506483750baSdrhdo_test conflict-9.9 {
5073b167c75Sdrh  catchsql {
5083b167c75Sdrh    BEGIN;
5093b167c75Sdrh    UPDATE t3 SET x=x+1;
5103b167c75Sdrh    UPDATE t2 SET b=b+1 WHERE b=1;
5113b167c75Sdrh    SELECT * FROM t2;
5123b167c75Sdrh  }
51337ed48edSdrh} {1 {column b is not unique}}
5143b167c75Sdrhdo_test conflict-9.10 {
5153b167c75Sdrh  execsql {COMMIT}
5163b167c75Sdrh  execsql {SELECT * FROM t3}
5173b167c75Sdrh} {3}
5183b167c75Sdrhdo_test conflict-9.11 {
5193b167c75Sdrh  catchsql {
5203b167c75Sdrh    INSERT INTO t2 VALUES(3,3,3,1,3);
5213b167c75Sdrh    SELECT * FROM t2;
5223b167c75Sdrh  }
52337ed48edSdrh} {1 {column d is not unique}}
5243b167c75Sdrhdo_test conflict-9.12 {
5253b167c75Sdrh  catchsql {
5263b167c75Sdrh    UPDATE t2 SET d=d+1 WHERE d=1;
5273b167c75Sdrh    SELECT * FROM t2;
5283b167c75Sdrh  }
52937ed48edSdrh} {1 {column d is not unique}}
5303b167c75Sdrhdo_test conflict-9.13 {
5313b167c75Sdrh  catchsql {
5323b167c75Sdrh    BEGIN;
5333b167c75Sdrh    UPDATE t3 SET x=x+1;
5343b167c75Sdrh    INSERT INTO t2 VALUES(3,3,3,1,3);
5353b167c75Sdrh    SELECT * FROM t2;
5363b167c75Sdrh  }
53737ed48edSdrh} {1 {column d is not unique}}
5383b167c75Sdrhdo_test conflict-9.14 {
5393b167c75Sdrh  execsql {COMMIT}
5403b167c75Sdrh  execsql {SELECT * FROM t3}
5413b167c75Sdrh} {4}
5423b167c75Sdrhdo_test conflict-9.15 {
5433b167c75Sdrh  catchsql {
5443b167c75Sdrh    BEGIN;
5453b167c75Sdrh    UPDATE t3 SET x=x+1;
5463b167c75Sdrh    UPDATE t2 SET d=d+1 WHERE d=1;
5473b167c75Sdrh    SELECT * FROM t2;
5483b167c75Sdrh  }
54937ed48edSdrh} {1 {column d is not unique}}
5503b167c75Sdrhdo_test conflict-9.16 {
5513b167c75Sdrh  execsql {COMMIT}
5523b167c75Sdrh  execsql {SELECT * FROM t3}
5533b167c75Sdrh} {5}
5543b167c75Sdrhdo_test conflict-9.17 {
5553b167c75Sdrh  catchsql {
5563b167c75Sdrh    INSERT INTO t2 VALUES(3,3,3,3,1);
5573b167c75Sdrh    SELECT * FROM t2;
5583b167c75Sdrh  }
55937ed48edSdrh} {1 {column e is not unique}}
5603b167c75Sdrhdo_test conflict-9.18 {
5613b167c75Sdrh  catchsql {
5623b167c75Sdrh    UPDATE t2 SET e=e+1 WHERE e=1;
5633b167c75Sdrh    SELECT * FROM t2;
5643b167c75Sdrh  }
56537ed48edSdrh} {1 {column e is not unique}}
5663b167c75Sdrhdo_test conflict-9.19 {
5673b167c75Sdrh  catchsql {
5683b167c75Sdrh    BEGIN;
5693b167c75Sdrh    UPDATE t3 SET x=x+1;
5703b167c75Sdrh    INSERT INTO t2 VALUES(3,3,3,3,1);
5713b167c75Sdrh    SELECT * FROM t2;
5723b167c75Sdrh  }
57337ed48edSdrh} {1 {column e is not unique}}
5743b167c75Sdrhdo_test conflict-9.20 {
5756b8b8749Sdrh  catch {execsql {COMMIT}}
5763b167c75Sdrh  execsql {SELECT * FROM t3}
5773b167c75Sdrh} {5}
5783b167c75Sdrhdo_test conflict-9.21 {
5793b167c75Sdrh  catchsql {
5803b167c75Sdrh    BEGIN;
5813b167c75Sdrh    UPDATE t3 SET x=x+1;
5823b167c75Sdrh    UPDATE t2 SET e=e+1 WHERE e=1;
5833b167c75Sdrh    SELECT * FROM t2;
5843b167c75Sdrh  }
58537ed48edSdrh} {1 {column e is not unique}}
5863b167c75Sdrhdo_test conflict-9.22 {
5876b8b8749Sdrh  catch {execsql {COMMIT}}
5883b167c75Sdrh  execsql {SELECT * FROM t3}
5893b167c75Sdrh} {5}
5903b167c75Sdrhdo_test conflict-9.23 {
5913b167c75Sdrh  catchsql {
5923b167c75Sdrh    INSERT INTO t2 VALUES(3,3,1,3,3);
5933b167c75Sdrh    SELECT * FROM t2;
5943b167c75Sdrh  }
5953b167c75Sdrh} {0 {2 2 2 2 2 3 3 1 3 3}}
5963b167c75Sdrhdo_test conflict-9.24 {
5973b167c75Sdrh  catchsql {
5983b167c75Sdrh    UPDATE t2 SET c=c-1 WHERE c=2;
5993b167c75Sdrh    SELECT * FROM t2;
6003b167c75Sdrh  }
6013b167c75Sdrh} {0 {2 2 1 2 2}}
6023b167c75Sdrhdo_test conflict-9.25 {
6033b167c75Sdrh  catchsql {
6043b167c75Sdrh    BEGIN;
6053b167c75Sdrh    UPDATE t3 SET x=x+1;
6063b167c75Sdrh    INSERT INTO t2 VALUES(3,3,1,3,3);
6073b167c75Sdrh    SELECT * FROM t2;
6083b167c75Sdrh  }
6093b167c75Sdrh} {0 {3 3 1 3 3}}
6103b167c75Sdrhdo_test conflict-9.26 {
6116b8b8749Sdrh  catch {execsql {COMMIT}}
6123b167c75Sdrh  execsql {SELECT * FROM t3}
6133b167c75Sdrh} {6}
614bb37fdc7Sdrh
615a996e477Sdrhdo_test conflict-10.1 {
616a996e477Sdrh  catchsql {
617a996e477Sdrh    DELETE FROM t1;
61833752f8aSdanielk1977    BEGIN;
61933752f8aSdanielk1977    INSERT OR ROLLBACK INTO t1 VALUES(1,2);
62033752f8aSdanielk1977    INSERT OR ROLLBACK INTO t1 VALUES(1,3);
621a996e477Sdrh    COMMIT;
622a996e477Sdrh  }
623a996e477Sdrh  execsql {SELECT * FROM t1}
624a996e477Sdrh} {}
625a996e477Sdrhdo_test conflict-10.2 {
626a996e477Sdrh  catchsql {
627a996e477Sdrh    CREATE TABLE t4(x);
628a996e477Sdrh    CREATE UNIQUE INDEX t4x ON t4(x);
62933752f8aSdanielk1977    BEGIN;
63033752f8aSdanielk1977    INSERT OR ROLLBACK INTO t4 VALUES(1);
63133752f8aSdanielk1977    INSERT OR ROLLBACK INTO t4 VALUES(1);
632a996e477Sdrh    COMMIT;
633a996e477Sdrh  }
634a996e477Sdrh  execsql {SELECT * FROM t4}
635a996e477Sdrh} {}
636a996e477Sdrh
63741712ef1Sdrh# Ticket #1171.  Make sure statement rollbacks do not
63841712ef1Sdrh# damage the database.
63941712ef1Sdrh#
64041712ef1Sdrhdo_test conflict-11.1 {
64141712ef1Sdrh  execsql {
64241712ef1Sdrh    -- Create a database object (pages 2, 3 of the file)
64341712ef1Sdrh    BEGIN;
64441712ef1Sdrh      CREATE TABLE abc(a UNIQUE, b, c);
64541712ef1Sdrh      INSERT INTO abc VALUES(1, 2, 3);
64641712ef1Sdrh      INSERT INTO abc VALUES(4, 5, 6);
64741712ef1Sdrh      INSERT INTO abc VALUES(7, 8, 9);
64841712ef1Sdrh    COMMIT;
64941712ef1Sdrh  }
65041712ef1Sdrh
65141712ef1Sdrh
65241712ef1Sdrh  # Set a small cache size so that changes will spill into
65341712ef1Sdrh  # the database file.
65441712ef1Sdrh  execsql {
65541712ef1Sdrh    PRAGMA cache_size = 10;
65641712ef1Sdrh  }
65741712ef1Sdrh
65841712ef1Sdrh  # Make lots of changes.  Because of the small cache, some
65941712ef1Sdrh  # (most?) of these changes will spill into the disk file.
66041712ef1Sdrh  # In other words, some of the changes will not be held in
66141712ef1Sdrh  # cache.
66241712ef1Sdrh  #
66341712ef1Sdrh  execsql {
66441712ef1Sdrh    BEGIN;
66541712ef1Sdrh      -- Make sure the pager is in EXCLUSIVE state.
66641712ef1Sdrh      CREATE TABLE def(d, e, f);
66741712ef1Sdrh      INSERT INTO def VALUES
66841712ef1Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
66941712ef1Sdrh      INSERT INTO def SELECT * FROM def;
67041712ef1Sdrh      INSERT INTO def SELECT * FROM def;
67141712ef1Sdrh      INSERT INTO def SELECT * FROM def;
67241712ef1Sdrh      INSERT INTO def SELECT * FROM def;
67341712ef1Sdrh      INSERT INTO def SELECT * FROM def;
67441712ef1Sdrh      INSERT INTO def SELECT * FROM def;
67541712ef1Sdrh      INSERT INTO def SELECT * FROM def;
67641712ef1Sdrh      DELETE FROM abc WHERE a = 4;
67741712ef1Sdrh  }
67841712ef1Sdrh
67941712ef1Sdrh  # Execute a statement that does a statement rollback due to
68041712ef1Sdrh  # a constraint failure.
68141712ef1Sdrh  #
68241712ef1Sdrh  catchsql {
68341712ef1Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
68441712ef1Sdrh  }
68541712ef1Sdrh
68641712ef1Sdrh  # Rollback the database.  Verify that the state of the ABC table
68741712ef1Sdrh  # is unchanged from the beginning of the transaction.  In other words,
68841712ef1Sdrh  # make sure the DELETE on table ABC that occurred within the transaction
68941712ef1Sdrh  # had no effect.
69041712ef1Sdrh  #
69141712ef1Sdrh  execsql {
69241712ef1Sdrh    ROLLBACK;
69341712ef1Sdrh    SELECT * FROM abc;
69441712ef1Sdrh  }
69541712ef1Sdrh} {1 2 3 4 5 6 7 8 9}
69641712ef1Sdrhintegrity_check conflict-11.2
69741712ef1Sdrh
69841712ef1Sdrh# Repeat test conflict-11.1 but this time commit.
69941712ef1Sdrh#
70041712ef1Sdrhdo_test conflict-11.3 {
70141712ef1Sdrh  execsql {
70241712ef1Sdrh    BEGIN;
70341712ef1Sdrh      -- Make sure the pager is in EXCLUSIVE state.
70441712ef1Sdrh      UPDATE abc SET a=a+1;
70541712ef1Sdrh      CREATE TABLE def(d, e, f);
70641712ef1Sdrh      INSERT INTO def VALUES
70741712ef1Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
70841712ef1Sdrh      INSERT INTO def SELECT * FROM def;
70941712ef1Sdrh      INSERT INTO def SELECT * FROM def;
71041712ef1Sdrh      INSERT INTO def SELECT * FROM def;
71141712ef1Sdrh      INSERT INTO def SELECT * FROM def;
71241712ef1Sdrh      INSERT INTO def SELECT * FROM def;
71341712ef1Sdrh      INSERT INTO def SELECT * FROM def;
71441712ef1Sdrh      INSERT INTO def SELECT * FROM def;
71541712ef1Sdrh      DELETE FROM abc WHERE a = 4;
71641712ef1Sdrh  }
71741712ef1Sdrh  catchsql {
71841712ef1Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
71941712ef1Sdrh  }
72041712ef1Sdrh  execsql {
72141712ef1Sdrh    ROLLBACK;
72241712ef1Sdrh    SELECT * FROM abc;
72341712ef1Sdrh  }
72441712ef1Sdrh} {1 2 3 4 5 6 7 8 9}
72541712ef1Sdrh# Repeat test conflict-11.1 but this time commit.
72641712ef1Sdrh#
72741712ef1Sdrhdo_test conflict-11.5 {
72841712ef1Sdrh  execsql {
72941712ef1Sdrh    BEGIN;
73041712ef1Sdrh      -- Make sure the pager is in EXCLUSIVE state.
73141712ef1Sdrh      CREATE TABLE def(d, e, f);
73241712ef1Sdrh      INSERT INTO def VALUES
73341712ef1Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
73441712ef1Sdrh      INSERT INTO def SELECT * FROM def;
73541712ef1Sdrh      INSERT INTO def SELECT * FROM def;
73641712ef1Sdrh      INSERT INTO def SELECT * FROM def;
73741712ef1Sdrh      INSERT INTO def SELECT * FROM def;
73841712ef1Sdrh      INSERT INTO def SELECT * FROM def;
73941712ef1Sdrh      INSERT INTO def SELECT * FROM def;
74041712ef1Sdrh      INSERT INTO def SELECT * FROM def;
74141712ef1Sdrh      DELETE FROM abc WHERE a = 4;
74241712ef1Sdrh  }
74341712ef1Sdrh  catchsql {
74441712ef1Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
74541712ef1Sdrh  }
74641712ef1Sdrh  execsql {
74741712ef1Sdrh    COMMIT;
74841712ef1Sdrh    SELECT * FROM abc;
74941712ef1Sdrh  }
75041712ef1Sdrh} {1 2 3 7 8 9}
75141712ef1Sdrhintegrity_check conflict-11.6
75241712ef1Sdrh
753ed717fe3Sdrh
754bb37fdc7Sdrhfinish_test
755