xref: /sqlite-3.40.0/test/conflict2.test (revision 00012df4)
1*00012df4Sdrh# 2013-11-04
2*00012df4Sdrh#
3*00012df4Sdrh# The author disclaims copyright to this source code.  In place of
4*00012df4Sdrh# a legal notice, here is a blessing:
5*00012df4Sdrh#
6*00012df4Sdrh#    May you do good and not evil.
7*00012df4Sdrh#    May you find forgiveness for yourself and forgive others.
8*00012df4Sdrh#    May you share freely, never taking more than you give.
9*00012df4Sdrh#
10*00012df4Sdrh#***********************************************************************
11*00012df4Sdrh# This file implements regression tests for SQLite library.
12*00012df4Sdrh#
13*00012df4Sdrh# This file implements tests for the conflict resolution extension
14*00012df4Sdrh# in WITHOUT ROWID tables
15*00012df4Sdrh#
16*00012df4Sdrh
17*00012df4Sdrhset testdir [file dirname $argv0]
18*00012df4Sdrhsource $testdir/tester.tcl
19*00012df4Sdrh
20*00012df4Sdrhifcapable !conflict {
21*00012df4Sdrh  finish_test
22*00012df4Sdrh  return
23*00012df4Sdrh}
24*00012df4Sdrh
25*00012df4Sdrh# Create tables for the first group of tests.
26*00012df4Sdrh#
27*00012df4Sdrhdo_test conflict2-1.0 {
28*00012df4Sdrh  execsql {
29*00012df4Sdrh    CREATE TABLE t1(a, b, c, PRIMARY KEY(a,b)) WITHOUT rowid;
30*00012df4Sdrh    CREATE TABLE t2(x);
31*00012df4Sdrh    SELECT c FROM t1 ORDER BY c;
32*00012df4Sdrh  }
33*00012df4Sdrh} {}
34*00012df4Sdrh
35*00012df4Sdrh# Six columns of configuration data as follows:
36*00012df4Sdrh#
37*00012df4Sdrh#   i      The reference number of the test
38*00012df4Sdrh#   cmd    An INSERT or REPLACE command to execute against table t1
39*00012df4Sdrh#   t0     True if there is an error from $cmd
40*00012df4Sdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
41*00012df4Sdrh#   t2     Content of "x" column of t2
42*00012df4Sdrh#   t3     Number of temporary files created by this test
43*00012df4Sdrh#
44*00012df4Sdrhforeach {i cmd t0 t1 t2 t3} {
45*00012df4Sdrh  1 INSERT                  1 {}  1  0
46*00012df4Sdrh  2 {INSERT OR IGNORE}      0 3   1  0
47*00012df4Sdrh  3 {INSERT OR REPLACE}     0 4   1  0
48*00012df4Sdrh  4 REPLACE                 0 4   1  0
49*00012df4Sdrh  5 {INSERT OR FAIL}        1 {}  1  0
50*00012df4Sdrh  6 {INSERT OR ABORT}       1 {}  1  0
51*00012df4Sdrh  7 {INSERT OR ROLLBACK}    1 {}  {} 0
52*00012df4Sdrh} {
53*00012df4Sdrh  do_test conflict2-1.$i {
54*00012df4Sdrh    set ::sqlite_opentemp_count 0
55*00012df4Sdrh    set r0 [catch {execsql [subst {
56*00012df4Sdrh      DELETE FROM t1;
57*00012df4Sdrh      DELETE FROM t2;
58*00012df4Sdrh      INSERT INTO t1 VALUES(1,2,3);
59*00012df4Sdrh      BEGIN;
60*00012df4Sdrh      INSERT INTO t2 VALUES(1);
61*00012df4Sdrh      $cmd INTO t1 VALUES(1,2,4);
62*00012df4Sdrh    }]} r1]
63*00012df4Sdrh    catch {execsql {COMMIT}}
64*00012df4Sdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
65*00012df4Sdrh    set r2 [execsql {SELECT x FROM t2}]
66*00012df4Sdrh    set r3 $::sqlite_opentemp_count
67*00012df4Sdrh    list $r0 $r1 $r2 $r3
68*00012df4Sdrh  } [list $t0 $t1 $t2 $t3]
69*00012df4Sdrh}
70*00012df4Sdrh
71*00012df4Sdrh# Create tables for the first group of tests.
72*00012df4Sdrh#
73*00012df4Sdrhdo_test conflict2-2.0 {
74*00012df4Sdrh  execsql {
75*00012df4Sdrh    DROP TABLE t1;
76*00012df4Sdrh    DROP TABLE t2;
77*00012df4Sdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(a,b)) WITHOUT rowid;
78*00012df4Sdrh    CREATE TABLE t2(x);
79*00012df4Sdrh    SELECT c FROM t1 ORDER BY c;
80*00012df4Sdrh  }
81*00012df4Sdrh} {}
82*00012df4Sdrh
83*00012df4Sdrh# Six columns of configuration data as follows:
84*00012df4Sdrh#
85*00012df4Sdrh#   i      The reference number of the test
86*00012df4Sdrh#   cmd    An INSERT or REPLACE command to execute against table t1
87*00012df4Sdrh#   t0     True if there is an error from $cmd
88*00012df4Sdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
89*00012df4Sdrh#   t2     Content of "x" column of t2
90*00012df4Sdrh#
91*00012df4Sdrhforeach {i cmd t0 t1 t2} {
92*00012df4Sdrh  1 INSERT                  1 {}  1
93*00012df4Sdrh  2 {INSERT OR IGNORE}      0 3   1
94*00012df4Sdrh  3 {INSERT OR REPLACE}     0 4   1
95*00012df4Sdrh  4 REPLACE                 0 4   1
96*00012df4Sdrh  5 {INSERT OR FAIL}        1 {}  1
97*00012df4Sdrh  6 {INSERT OR ABORT}       1 {}  1
98*00012df4Sdrh  7 {INSERT OR ROLLBACK}    1 {}  {}
99*00012df4Sdrh} {
100*00012df4Sdrh  do_test conflict2-2.$i {
101*00012df4Sdrh    set r0 [catch {execsql [subst {
102*00012df4Sdrh      DELETE FROM t1;
103*00012df4Sdrh      DELETE FROM t2;
104*00012df4Sdrh      INSERT INTO t1 VALUES(1,2,3);
105*00012df4Sdrh      BEGIN;
106*00012df4Sdrh      INSERT INTO t2 VALUES(1);
107*00012df4Sdrh      $cmd INTO t1 VALUES(1,2,4);
108*00012df4Sdrh    }]} r1]
109*00012df4Sdrh    catch {execsql {COMMIT}}
110*00012df4Sdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
111*00012df4Sdrh    set r2 [execsql {SELECT x FROM t2}]
112*00012df4Sdrh    list $r0 $r1 $r2
113*00012df4Sdrh  } [list $t0 $t1 $t2]
114*00012df4Sdrh}
115*00012df4Sdrh
116*00012df4Sdrh# Create tables for the first group of tests.
117*00012df4Sdrh#
118*00012df4Sdrhdo_test conflict2-3.0 {
119*00012df4Sdrh  execsql {
120*00012df4Sdrh    DROP TABLE t1;
121*00012df4Sdrh    DROP TABLE t2;
122*00012df4Sdrh    CREATE TABLE t1(a, b, c INTEGER, PRIMARY KEY(c), UNIQUE(a,b)) WITHOUT rowid;
123*00012df4Sdrh    CREATE TABLE t2(x);
124*00012df4Sdrh    SELECT c FROM t1 ORDER BY c;
125*00012df4Sdrh  }
126*00012df4Sdrh} {}
127*00012df4Sdrh
128*00012df4Sdrh# Six columns of configuration data as follows:
129*00012df4Sdrh#
130*00012df4Sdrh#   i      The reference number of the test
131*00012df4Sdrh#   cmd    An INSERT or REPLACE command to execute against table t1
132*00012df4Sdrh#   t0     True if there is an error from $cmd
133*00012df4Sdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
134*00012df4Sdrh#   t2     Content of "x" column of t2
135*00012df4Sdrh#
136*00012df4Sdrhforeach {i cmd t0 t1 t2} {
137*00012df4Sdrh  1 INSERT                  1 {}  1
138*00012df4Sdrh  2 {INSERT OR IGNORE}      0 3   1
139*00012df4Sdrh  3 {INSERT OR REPLACE}     0 4   1
140*00012df4Sdrh  4 REPLACE                 0 4   1
141*00012df4Sdrh  5 {INSERT OR FAIL}        1 {}  1
142*00012df4Sdrh  6 {INSERT OR ABORT}       1 {}  1
143*00012df4Sdrh  7 {INSERT OR ROLLBACK}    1 {}  {}
144*00012df4Sdrh} {
145*00012df4Sdrh  do_test conflict2-3.$i {
146*00012df4Sdrh    set r0 [catch {execsql [subst {
147*00012df4Sdrh      DELETE FROM t1;
148*00012df4Sdrh      DELETE FROM t2;
149*00012df4Sdrh      INSERT INTO t1 VALUES(1,2,3);
150*00012df4Sdrh      BEGIN;
151*00012df4Sdrh      INSERT INTO t2 VALUES(1);
152*00012df4Sdrh      $cmd INTO t1 VALUES(1,2,4);
153*00012df4Sdrh    }]} r1]
154*00012df4Sdrh    catch {execsql {COMMIT}}
155*00012df4Sdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
156*00012df4Sdrh    set r2 [execsql {SELECT x FROM t2}]
157*00012df4Sdrh    list $r0 $r1 $r2
158*00012df4Sdrh  } [list $t0 $t1 $t2]
159*00012df4Sdrh}
160*00012df4Sdrh
161*00012df4Sdrhdo_test conflict2-4.0 {
162*00012df4Sdrh  execsql {
163*00012df4Sdrh    DROP TABLE t2;
164*00012df4Sdrh    CREATE TABLE t2(x);
165*00012df4Sdrh    SELECT x FROM t2;
166*00012df4Sdrh  }
167*00012df4Sdrh} {}
168*00012df4Sdrh
169*00012df4Sdrh# Six columns of configuration data as follows:
170*00012df4Sdrh#
171*00012df4Sdrh#   i      The reference number of the test
172*00012df4Sdrh#   conf1  The conflict resolution algorithm on the UNIQUE constraint
173*00012df4Sdrh#   cmd    An INSERT or REPLACE command to execute against table t1
174*00012df4Sdrh#   t0     True if there is an error from $cmd
175*00012df4Sdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
176*00012df4Sdrh#   t2     Content of "x" column of t2
177*00012df4Sdrh#
178*00012df4Sdrhforeach {i conf1 cmd t0 t1 t2} {
179*00012df4Sdrh  1 {}       INSERT                  1 {}  1
180*00012df4Sdrh  2 REPLACE  INSERT                  0 4   1
181*00012df4Sdrh  3 IGNORE   INSERT                  0 3   1
182*00012df4Sdrh  4 FAIL     INSERT                  1 {}  1
183*00012df4Sdrh  5 ABORT    INSERT                  1 {}  1
184*00012df4Sdrh  6 ROLLBACK INSERT                  1 {}  {}
185*00012df4Sdrh  7 REPLACE  {INSERT OR IGNORE}      0 3   1
186*00012df4Sdrh  8 IGNORE   {INSERT OR REPLACE}     0 4   1
187*00012df4Sdrh  9 FAIL     {INSERT OR IGNORE}      0 3   1
188*00012df4Sdrh 10 ABORT    {INSERT OR REPLACE}     0 4   1
189*00012df4Sdrh 11 ROLLBACK {INSERT OR IGNORE }     0 3   1
190*00012df4Sdrh} {
191*00012df4Sdrh  do_test conflict2-4.$i {
192*00012df4Sdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
193*00012df4Sdrh    set r0 [catch {execsql [subst {
194*00012df4Sdrh      DROP TABLE t1;
195*00012df4Sdrh      CREATE TABLE t1(a,b,c,PRIMARY KEY(a,b) $conf1) WITHOUT rowid;
196*00012df4Sdrh      DELETE FROM t2;
197*00012df4Sdrh      INSERT INTO t1 VALUES(1,2,3);
198*00012df4Sdrh      BEGIN;
199*00012df4Sdrh      INSERT INTO t2 VALUES(1);
200*00012df4Sdrh      $cmd INTO t1 VALUES(1,2,4);
201*00012df4Sdrh    }]} r1]
202*00012df4Sdrh    catch {execsql {COMMIT}}
203*00012df4Sdrh    if {$r0} {set r1 {}} {set r1 [execsql {SELECT c FROM t1}]}
204*00012df4Sdrh    set r2 [execsql {SELECT x FROM t2}]
205*00012df4Sdrh    list $r0 $r1 $r2
206*00012df4Sdrh  } [list $t0 $t1 $t2]
207*00012df4Sdrh}
208*00012df4Sdrh
209*00012df4Sdrhdo_test conflict2-5.0 {
210*00012df4Sdrh  execsql {
211*00012df4Sdrh    DROP TABLE t2;
212*00012df4Sdrh    CREATE TABLE t2(x);
213*00012df4Sdrh    SELECT x FROM t2;
214*00012df4Sdrh  }
215*00012df4Sdrh} {}
216*00012df4Sdrh
217*00012df4Sdrh# Six columns of configuration data as follows:
218*00012df4Sdrh#
219*00012df4Sdrh#   i      The reference number of the test
220*00012df4Sdrh#   conf1  The conflict resolution algorithm on the NOT NULL constraint
221*00012df4Sdrh#   cmd    An INSERT or REPLACE command to execute against table t1
222*00012df4Sdrh#   t0     True if there is an error from $cmd
223*00012df4Sdrh#   t1     Content of "c" column of t1 assuming no error in $cmd
224*00012df4Sdrh#   t2     Content of "x" column of t2
225*00012df4Sdrh#
226*00012df4Sdrhforeach {i conf1 cmd t0 t1 t2} {
227*00012df4Sdrh  1 {}       INSERT                  1 {}  1
228*00012df4Sdrh  2 REPLACE  INSERT                  0 5   1
229*00012df4Sdrh  3 IGNORE   INSERT                  0 {}  1
230*00012df4Sdrh  4 FAIL     INSERT                  1 {}  1
231*00012df4Sdrh  5 ABORT    INSERT                  1 {}  1
232*00012df4Sdrh  6 ROLLBACK INSERT                  1 {}  {}
233*00012df4Sdrh  7 REPLACE  {INSERT OR IGNORE}      0 {}  1
234*00012df4Sdrh  8 IGNORE   {INSERT OR REPLACE}     0 5   1
235*00012df4Sdrh  9 FAIL     {INSERT OR IGNORE}      0 {}  1
236*00012df4Sdrh 10 ABORT    {INSERT OR REPLACE}     0 5   1
237*00012df4Sdrh 11 ROLLBACK {INSERT OR IGNORE}      0 {}  1
238*00012df4Sdrh 12 {}       {INSERT OR IGNORE}      0 {}  1
239*00012df4Sdrh 13 {}       {INSERT OR REPLACE}     0 5   1
240*00012df4Sdrh 14 {}       {INSERT OR FAIL}        1 {}  1
241*00012df4Sdrh 15 {}       {INSERT OR ABORT}       1 {}  1
242*00012df4Sdrh 16 {}       {INSERT OR ROLLBACK}    1 {}  {}
243*00012df4Sdrh} {
244*00012df4Sdrh  if {$t0} {set t1 {t1.c may not be NULL}}
245*00012df4Sdrh  do_test conflict2-5.$i {
246*00012df4Sdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
247*00012df4Sdrh    set r0 [catch {execsql [subst {
248*00012df4Sdrh      DROP TABLE t1;
249*00012df4Sdrh      CREATE TABLE t1(a,b,c NOT NULL $conf1 DEFAULT 5);
250*00012df4Sdrh      DELETE FROM t2;
251*00012df4Sdrh      BEGIN;
252*00012df4Sdrh      INSERT INTO t2 VALUES(1);
253*00012df4Sdrh      $cmd INTO t1 VALUES(1,2,NULL);
254*00012df4Sdrh    }]} r1]
255*00012df4Sdrh    catch {execsql {COMMIT}}
256*00012df4Sdrh    if {!$r0} {set r1 [execsql {SELECT c FROM t1}]}
257*00012df4Sdrh    set r2 [execsql {SELECT x FROM t2}]
258*00012df4Sdrh    list $r0 $r1 $r2
259*00012df4Sdrh  } [list $t0 $t1 $t2]
260*00012df4Sdrh}
261*00012df4Sdrh
262*00012df4Sdrhdo_test conflict2-6.0 {
263*00012df4Sdrh  execsql {
264*00012df4Sdrh    DROP TABLE t2;
265*00012df4Sdrh    CREATE TABLE t2(a,b,c);
266*00012df4Sdrh    INSERT INTO t2 VALUES(1,2,1);
267*00012df4Sdrh    INSERT INTO t2 VALUES(2,3,2);
268*00012df4Sdrh    INSERT INTO t2 VALUES(3,4,1);
269*00012df4Sdrh    INSERT INTO t2 VALUES(4,5,4);
270*00012df4Sdrh    SELECT c FROM t2 ORDER BY b;
271*00012df4Sdrh    CREATE TABLE t3(x);
272*00012df4Sdrh    INSERT INTO t3 VALUES(1);
273*00012df4Sdrh  }
274*00012df4Sdrh} {1 2 1 4}
275*00012df4Sdrh
276*00012df4Sdrh# Six columns of configuration data as follows:
277*00012df4Sdrh#
278*00012df4Sdrh#   i      The reference number of the test
279*00012df4Sdrh#   conf1  The conflict resolution algorithm on the UNIQUE constraint
280*00012df4Sdrh#   cmd    An UPDATE command to execute against table t1
281*00012df4Sdrh#   t0     True if there is an error from $cmd
282*00012df4Sdrh#   t1     Content of "b" column of t1 assuming no error in $cmd
283*00012df4Sdrh#   t2     Content of "x" column of t3
284*00012df4Sdrh#   t3     Number of temporary files for tables
285*00012df4Sdrh#   t4     Number of temporary files for statement journals
286*00012df4Sdrh#
287*00012df4Sdrh# Update: Since temporary table files are now opened lazily, and none
288*00012df4Sdrh# of the following tests use large quantities of data, t3 is always 0.
289*00012df4Sdrh#
290*00012df4Sdrhforeach {i conf1 cmd t0 t1 t2 t3 t4} {
291*00012df4Sdrh  1 {}       UPDATE                  1 {6 7 8 9}  1 0 1
292*00012df4Sdrh  2 REPLACE  UPDATE                  0 {7 6 9}    1 0 0
293*00012df4Sdrh  3 IGNORE   UPDATE                  0 {6 7 3 9}  1 0 0
294*00012df4Sdrh  4 FAIL     UPDATE                  1 {6 7 3 4}  1 0 0
295*00012df4Sdrh  5 ABORT    UPDATE                  1 {1 2 3 4}  1 0 1
296*00012df4Sdrh  6 ROLLBACK UPDATE                  1 {1 2 3 4}  0 0 0
297*00012df4Sdrh  7 REPLACE  {UPDATE OR IGNORE}      0 {6 7 3 9}  1 0 0
298*00012df4Sdrh  8 IGNORE   {UPDATE OR REPLACE}     0 {7 6 9}    1 0 1
299*00012df4Sdrh  9 FAIL     {UPDATE OR IGNORE}      0 {6 7 3 9}  1 0 0
300*00012df4Sdrh 10 ABORT    {UPDATE OR REPLACE}     0 {7 6 9}    1 0 1
301*00012df4Sdrh 11 ROLLBACK {UPDATE OR IGNORE}      0 {6 7 3 9}  1 0 0
302*00012df4Sdrh 12 {}       {UPDATE OR IGNORE}      0 {6 7 3 9}  1 0 0
303*00012df4Sdrh 13 {}       {UPDATE OR REPLACE}     0 {7 6 9}    1 0 1
304*00012df4Sdrh 14 {}       {UPDATE OR FAIL}        1 {6 7 3 4}  1 0 0
305*00012df4Sdrh 15 {}       {UPDATE OR ABORT}       1 {1 2 3 4}  1 0 1
306*00012df4Sdrh 16 {}       {UPDATE OR ROLLBACK}    1 {1 2 3 4}  0 0 0
307*00012df4Sdrh} {
308*00012df4Sdrh  if {$t0} {set t1 {PRIMARY KEY must be unique}}
309*00012df4Sdrh  if {[info exists TEMP_STORE] && $TEMP_STORE==3} {
310*00012df4Sdrh    set t3 0
311*00012df4Sdrh  } else {
312*00012df4Sdrh    set t3 [expr {$t3+$t4}]
313*00012df4Sdrh  }
314*00012df4Sdrh  do_test conflict2-6.$i {
315*00012df4Sdrh    db close
316*00012df4Sdrh    sqlite3 db test.db
317*00012df4Sdrh    if {$conf1!=""} {set conf1 "ON CONFLICT $conf1"}
318*00012df4Sdrh    execsql {pragma temp_store=file}
319*00012df4Sdrh    set ::sqlite_opentemp_count 0
320*00012df4Sdrh    set r0 [catch {execsql [subst {
321*00012df4Sdrh      DROP TABLE t1;
322*00012df4Sdrh      CREATE TABLE t1(a,b,c, PRIMARY KEY(a) $conf1) WITHOUT rowid;
323*00012df4Sdrh      INSERT INTO t1 SELECT * FROM t2;
324*00012df4Sdrh      UPDATE t3 SET x=0;
325*00012df4Sdrh      BEGIN;
326*00012df4Sdrh      $cmd t3 SET x=1;
327*00012df4Sdrh      $cmd t1 SET b=b*2;
328*00012df4Sdrh      $cmd t1 SET a=c+5;
329*00012df4Sdrh    }]} r1]
330*00012df4Sdrh    catch {execsql {COMMIT}}
331*00012df4Sdrh    if {!$r0} {set r1 [execsql {SELECT a FROM t1 ORDER BY b}]}
332*00012df4Sdrh    set r2 [execsql {SELECT x FROM t3}]
333*00012df4Sdrh    list $r0 $r1 $r2 $::sqlite_opentemp_count
334*00012df4Sdrh  } [list $t0 $t1 $t2 $t3]
335*00012df4Sdrh}
336*00012df4Sdrh
337*00012df4Sdrh# Test to make sure a lot of IGNOREs don't cause a stack overflow
338*00012df4Sdrh#
339*00012df4Sdrhdo_test conflict2-7.1 {
340*00012df4Sdrh  execsql {
341*00012df4Sdrh    DROP TABLE t1;
342*00012df4Sdrh    DROP TABLE t2;
343*00012df4Sdrh    DROP TABLE t3;
344*00012df4Sdrh    CREATE TABLE t1(a PRIMARY KEY, b) without rowid;
345*00012df4Sdrh  }
346*00012df4Sdrh  for {set i 1} {$i<=50} {incr i} {
347*00012df4Sdrh    execsql "INSERT into t1 values($i,[expr {$i+1}]);"
348*00012df4Sdrh  }
349*00012df4Sdrh  execsql {
350*00012df4Sdrh    SELECT count(*), min(a), max(b) FROM t1;
351*00012df4Sdrh  }
352*00012df4Sdrh} {50 1 51}
353*00012df4Sdrhdo_test conflict2-7.2 {
354*00012df4Sdrh  execsql {
355*00012df4Sdrh    PRAGMA count_changes=on;
356*00012df4Sdrh    UPDATE OR IGNORE t1 SET a=1000;
357*00012df4Sdrh  }
358*00012df4Sdrh} {1}
359*00012df4Sdrhdo_test conflict2-7.2.1 {
360*00012df4Sdrh  db changes
361*00012df4Sdrh} {1}
362*00012df4Sdrhdo_test conflict2-7.3 {
363*00012df4Sdrh  execsql {
364*00012df4Sdrh    SELECT b FROM t1 WHERE a=1000;
365*00012df4Sdrh  }
366*00012df4Sdrh} {2}
367*00012df4Sdrhdo_test conflict2-7.4 {
368*00012df4Sdrh  execsql {
369*00012df4Sdrh    SELECT count(*) FROM t1;
370*00012df4Sdrh  }
371*00012df4Sdrh} {50}
372*00012df4Sdrhdo_test conflict2-7.5 {
373*00012df4Sdrh  execsql {
374*00012df4Sdrh    PRAGMA count_changes=on;
375*00012df4Sdrh    UPDATE OR REPLACE t1 SET a=1001;
376*00012df4Sdrh  }
377*00012df4Sdrh} {50}
378*00012df4Sdrhdo_test conflict2-7.5.1 {
379*00012df4Sdrh  db changes
380*00012df4Sdrh} {50}
381*00012df4Sdrhdo_test conflict2-7.6 {
382*00012df4Sdrh  execsql {
383*00012df4Sdrh    SELECT b FROM t1 WHERE a=1001;
384*00012df4Sdrh  }
385*00012df4Sdrh} {51}
386*00012df4Sdrhdo_test conflict2-7.7 {
387*00012df4Sdrh  execsql {
388*00012df4Sdrh    SELECT count(*) FROM t1;
389*00012df4Sdrh  }
390*00012df4Sdrh} {1}
391*00012df4Sdrh
392*00012df4Sdrh# Update for version 3: A SELECT statement no longer resets the change
393*00012df4Sdrh# counter (Test result changes from 0 to 50).
394*00012df4Sdrhdo_test conflict2-7.7.1 {
395*00012df4Sdrh  db changes
396*00012df4Sdrh} {50}
397*00012df4Sdrh
398*00012df4Sdrh# Make sure the row count is right for rows that are ignored on
399*00012df4Sdrh# an insert.
400*00012df4Sdrh#
401*00012df4Sdrhdo_test conflict2-8.1 {
402*00012df4Sdrh  execsql {
403*00012df4Sdrh    DELETE FROM t1;
404*00012df4Sdrh    INSERT INTO t1 VALUES(1,2);
405*00012df4Sdrh  }
406*00012df4Sdrh  execsql {
407*00012df4Sdrh    INSERT OR IGNORE INTO t1 VALUES(2,3);
408*00012df4Sdrh  }
409*00012df4Sdrh} {1}
410*00012df4Sdrhdo_test conflict2-8.1.1 {
411*00012df4Sdrh  db changes
412*00012df4Sdrh} {1}
413*00012df4Sdrhdo_test conflict2-8.2 {
414*00012df4Sdrh  execsql {
415*00012df4Sdrh    INSERT OR IGNORE INTO t1 VALUES(2,4);
416*00012df4Sdrh  }
417*00012df4Sdrh} {0}
418*00012df4Sdrhdo_test conflict2-8.2.1 {
419*00012df4Sdrh  db changes
420*00012df4Sdrh} {0}
421*00012df4Sdrhdo_test conflict2-8.3 {
422*00012df4Sdrh  execsql {
423*00012df4Sdrh    INSERT OR REPLACE INTO t1 VALUES(2,4);
424*00012df4Sdrh  }
425*00012df4Sdrh} {1}
426*00012df4Sdrhdo_test conflict2-8.3.1 {
427*00012df4Sdrh  db changes
428*00012df4Sdrh} {1}
429*00012df4Sdrhdo_test conflict2-8.4 {
430*00012df4Sdrh  execsql {
431*00012df4Sdrh    INSERT OR IGNORE INTO t1 SELECT * FROM t1;
432*00012df4Sdrh  }
433*00012df4Sdrh} {0}
434*00012df4Sdrhdo_test conflict2-8.4.1 {
435*00012df4Sdrh  db changes
436*00012df4Sdrh} {0}
437*00012df4Sdrhdo_test conflict2-8.5 {
438*00012df4Sdrh  execsql {
439*00012df4Sdrh    INSERT OR IGNORE INTO t1 SELECT a+2,b+2 FROM t1;
440*00012df4Sdrh  }
441*00012df4Sdrh} {2}
442*00012df4Sdrhdo_test conflict2-8.5.1 {
443*00012df4Sdrh  db changes
444*00012df4Sdrh} {2}
445*00012df4Sdrhdo_test conflict2-8.6 {
446*00012df4Sdrh  execsql {
447*00012df4Sdrh    INSERT OR IGNORE INTO t1 SELECT a+3,b+3 FROM t1;
448*00012df4Sdrh  }
449*00012df4Sdrh} {3}
450*00012df4Sdrhdo_test conflict2-8.6.1 {
451*00012df4Sdrh  db changes
452*00012df4Sdrh} {3}
453*00012df4Sdrh
454*00012df4Sdrhintegrity_check conflict2-8.99
455*00012df4Sdrh
456*00012df4Sdrhdo_test conflict2-9.1 {
457*00012df4Sdrh  execsql {
458*00012df4Sdrh    PRAGMA count_changes=0;
459*00012df4Sdrh    CREATE TABLE t2(
460*00012df4Sdrh      a INTEGER PRIMARY KEY ON CONFLICT IGNORE,
461*00012df4Sdrh      b INTEGER UNIQUE ON CONFLICT FAIL,
462*00012df4Sdrh      c INTEGER UNIQUE ON CONFLICT REPLACE,
463*00012df4Sdrh      d INTEGER UNIQUE ON CONFLICT ABORT,
464*00012df4Sdrh      e INTEGER UNIQUE ON CONFLICT ROLLBACK
465*00012df4Sdrh    ) WITHOUT rowid;
466*00012df4Sdrh    CREATE TABLE t3(x);
467*00012df4Sdrh    INSERT INTO t3 VALUES(1);
468*00012df4Sdrh    SELECT * FROM t3;
469*00012df4Sdrh  }
470*00012df4Sdrh} {1}
471*00012df4Sdrhdo_test conflict2-9.2 {
472*00012df4Sdrh  catchsql {
473*00012df4Sdrh    INSERT INTO t2 VALUES(1,1,1,1,1);
474*00012df4Sdrh    INSERT INTO t2 VALUES(2,2,2,2,2);
475*00012df4Sdrh    SELECT * FROM t2;
476*00012df4Sdrh  }
477*00012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
478*00012df4Sdrhdo_test conflict2-9.3 {
479*00012df4Sdrh  catchsql {
480*00012df4Sdrh    INSERT INTO t2 VALUES(1,3,3,3,3);
481*00012df4Sdrh    SELECT * FROM t2;
482*00012df4Sdrh  }
483*00012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
484*00012df4Sdrhdo_test conflict2-9.4 {
485*00012df4Sdrh  catchsql {
486*00012df4Sdrh    UPDATE t2 SET a=a+1 WHERE a=1;
487*00012df4Sdrh    SELECT * FROM t2;
488*00012df4Sdrh  }
489*00012df4Sdrh} {0 {1 1 1 1 1 2 2 2 2 2}}
490*00012df4Sdrhdo_test conflict2-9.5 {
491*00012df4Sdrh  catchsql {
492*00012df4Sdrh    INSERT INTO t2 VALUES(3,1,3,3,3);
493*00012df4Sdrh  }
494*00012df4Sdrh} {1 {column b is not unique}}
495*00012df4Sdrhdo_test conflict2-9.5b {
496*00012df4Sdrh  db eval {SELECT * FROM t2;}
497*00012df4Sdrh} {1 1 1 1 1 2 2 2 2 2}
498*00012df4Sdrhdo_test conflict2-9.6 {
499*00012df4Sdrh  catchsql {
500*00012df4Sdrh    UPDATE t2 SET b=b+1 WHERE b=1;
501*00012df4Sdrh    SELECT * FROM t2;
502*00012df4Sdrh  }
503*00012df4Sdrh} {1 {column b is not unique}}
504*00012df4Sdrhdo_test conflict2-9.6b {
505*00012df4Sdrh  db eval {SELECT * FROM t2;}
506*00012df4Sdrh} {1 1 1 1 1 2 2 2 2 2}
507*00012df4Sdrhdo_test conflict2-9.7 {
508*00012df4Sdrh  catchsql {
509*00012df4Sdrh    BEGIN;
510*00012df4Sdrh    UPDATE t3 SET x=x+1;
511*00012df4Sdrh    INSERT INTO t2 VALUES(3,1,3,3,3);
512*00012df4Sdrh    SELECT * FROM t2;
513*00012df4Sdrh  }
514*00012df4Sdrh} {1 {column b is not unique}}
515*00012df4Sdrhdo_test conflict2-9.8 {
516*00012df4Sdrh  execsql {COMMIT}
517*00012df4Sdrh  execsql {SELECT * FROM t3}
518*00012df4Sdrh} {2}
519*00012df4Sdrhdo_test conflict2-9.9 {
520*00012df4Sdrh  catchsql {
521*00012df4Sdrh    BEGIN;
522*00012df4Sdrh    UPDATE t3 SET x=x+1;
523*00012df4Sdrh    UPDATE t2 SET b=b+1 WHERE b=1;
524*00012df4Sdrh    SELECT * FROM t2;
525*00012df4Sdrh  }
526*00012df4Sdrh} {1 {column b is not unique}}
527*00012df4Sdrhdo_test conflict2-9.10 {
528*00012df4Sdrh  execsql {COMMIT}
529*00012df4Sdrh  execsql {SELECT * FROM t3}
530*00012df4Sdrh} {3}
531*00012df4Sdrhdo_test conflict2-9.11 {
532*00012df4Sdrh  catchsql {
533*00012df4Sdrh    INSERT INTO t2 VALUES(3,3,3,1,3);
534*00012df4Sdrh    SELECT * FROM t2;
535*00012df4Sdrh  }
536*00012df4Sdrh} {1 {column d is not unique}}
537*00012df4Sdrhdo_test conflict2-9.12 {
538*00012df4Sdrh  catchsql {
539*00012df4Sdrh    UPDATE t2 SET d=d+1 WHERE d=1;
540*00012df4Sdrh    SELECT * FROM t2;
541*00012df4Sdrh  }
542*00012df4Sdrh} {1 {column d is not unique}}
543*00012df4Sdrhdo_test conflict2-9.13 {
544*00012df4Sdrh  catchsql {
545*00012df4Sdrh    BEGIN;
546*00012df4Sdrh    UPDATE t3 SET x=x+1;
547*00012df4Sdrh    INSERT INTO t2 VALUES(3,3,3,1,3);
548*00012df4Sdrh    SELECT * FROM t2;
549*00012df4Sdrh  }
550*00012df4Sdrh} {1 {column d is not unique}}
551*00012df4Sdrhdo_test conflict2-9.14 {
552*00012df4Sdrh  execsql {COMMIT}
553*00012df4Sdrh  execsql {SELECT * FROM t3}
554*00012df4Sdrh} {4}
555*00012df4Sdrhdo_test conflict2-9.15 {
556*00012df4Sdrh  catchsql {
557*00012df4Sdrh    BEGIN;
558*00012df4Sdrh    UPDATE t3 SET x=x+1;
559*00012df4Sdrh    UPDATE t2 SET d=d+1 WHERE d=1;
560*00012df4Sdrh    SELECT * FROM t2;
561*00012df4Sdrh  }
562*00012df4Sdrh} {1 {column d is not unique}}
563*00012df4Sdrhdo_test conflict2-9.16 {
564*00012df4Sdrh  execsql {COMMIT}
565*00012df4Sdrh  execsql {SELECT * FROM t3}
566*00012df4Sdrh} {5}
567*00012df4Sdrhdo_test conflict2-9.17 {
568*00012df4Sdrh  catchsql {
569*00012df4Sdrh    INSERT INTO t2 VALUES(3,3,3,3,1);
570*00012df4Sdrh    SELECT * FROM t2;
571*00012df4Sdrh  }
572*00012df4Sdrh} {1 {column e is not unique}}
573*00012df4Sdrhdo_test conflict2-9.18 {
574*00012df4Sdrh  catchsql {
575*00012df4Sdrh    UPDATE t2 SET e=e+1 WHERE e=1;
576*00012df4Sdrh    SELECT * FROM t2;
577*00012df4Sdrh  }
578*00012df4Sdrh} {1 {column e is not unique}}
579*00012df4Sdrhdo_test conflict2-9.19 {
580*00012df4Sdrh  catchsql {
581*00012df4Sdrh    BEGIN;
582*00012df4Sdrh    UPDATE t3 SET x=x+1;
583*00012df4Sdrh    INSERT INTO t2 VALUES(3,3,3,3,1);
584*00012df4Sdrh    SELECT * FROM t2;
585*00012df4Sdrh  }
586*00012df4Sdrh} {1 {column e is not unique}}
587*00012df4Sdrhverify_ex_errcode conflict2-9.21b SQLITE_CONSTRAINT_UNIQUE
588*00012df4Sdrhdo_test conflict2-9.20 {
589*00012df4Sdrh  catch {execsql {COMMIT}}
590*00012df4Sdrh  execsql {SELECT * FROM t3}
591*00012df4Sdrh} {5}
592*00012df4Sdrhdo_test conflict2-9.21 {
593*00012df4Sdrh  catchsql {
594*00012df4Sdrh    BEGIN;
595*00012df4Sdrh    UPDATE t3 SET x=x+1;
596*00012df4Sdrh    UPDATE t2 SET e=e+1 WHERE e=1;
597*00012df4Sdrh    SELECT * FROM t2;
598*00012df4Sdrh  }
599*00012df4Sdrh} {1 {column e is not unique}}
600*00012df4Sdrhverify_ex_errcode conflict2-9.21b SQLITE_CONSTRAINT_UNIQUE
601*00012df4Sdrhdo_test conflict2-9.22 {
602*00012df4Sdrh  catch {execsql {COMMIT}}
603*00012df4Sdrh  execsql {SELECT * FROM t3}
604*00012df4Sdrh} {5}
605*00012df4Sdrhdo_test conflict2-9.23 {
606*00012df4Sdrh  catchsql {
607*00012df4Sdrh    INSERT INTO t2 VALUES(3,3,1,3,3);
608*00012df4Sdrh    SELECT * FROM t2;
609*00012df4Sdrh  }
610*00012df4Sdrh} {0 {2 2 2 2 2 3 3 1 3 3}}
611*00012df4Sdrhdo_test conflict2-9.24 {
612*00012df4Sdrh  catchsql {
613*00012df4Sdrh    UPDATE t2 SET c=c-1 WHERE c=2;
614*00012df4Sdrh    SELECT * FROM t2;
615*00012df4Sdrh  }
616*00012df4Sdrh} {0 {2 2 1 2 2}}
617*00012df4Sdrhdo_test conflict2-9.25 {
618*00012df4Sdrh  catchsql {
619*00012df4Sdrh    BEGIN;
620*00012df4Sdrh    UPDATE t3 SET x=x+1;
621*00012df4Sdrh    INSERT INTO t2 VALUES(3,3,1,3,3);
622*00012df4Sdrh    SELECT * FROM t2;
623*00012df4Sdrh  }
624*00012df4Sdrh} {0 {3 3 1 3 3}}
625*00012df4Sdrhdo_test conflict2-9.26 {
626*00012df4Sdrh  catch {execsql {COMMIT}}
627*00012df4Sdrh  execsql {SELECT * FROM t3}
628*00012df4Sdrh} {6}
629*00012df4Sdrh
630*00012df4Sdrhdo_test conflict2-10.1 {
631*00012df4Sdrh  catchsql {
632*00012df4Sdrh    DELETE FROM t1;
633*00012df4Sdrh    BEGIN;
634*00012df4Sdrh    INSERT OR ROLLBACK INTO t1 VALUES(1,2);
635*00012df4Sdrh    INSERT OR ROLLBACK INTO t1 VALUES(1,3);
636*00012df4Sdrh    COMMIT;
637*00012df4Sdrh  }
638*00012df4Sdrh  execsql {SELECT * FROM t1}
639*00012df4Sdrh} {}
640*00012df4Sdrhdo_test conflict2-10.2 {
641*00012df4Sdrh  catchsql {
642*00012df4Sdrh    CREATE TABLE t4(x);
643*00012df4Sdrh    CREATE UNIQUE INDEX t4x ON t4(x);
644*00012df4Sdrh    BEGIN;
645*00012df4Sdrh    INSERT OR ROLLBACK INTO t4 VALUES(1);
646*00012df4Sdrh    INSERT OR ROLLBACK INTO t4 VALUES(1);
647*00012df4Sdrh    COMMIT;
648*00012df4Sdrh  }
649*00012df4Sdrh  execsql {SELECT * FROM t4}
650*00012df4Sdrh} {}
651*00012df4Sdrh
652*00012df4Sdrh# Ticket #1171.  Make sure statement rollbacks do not
653*00012df4Sdrh# damage the database.
654*00012df4Sdrh#
655*00012df4Sdrhdo_test conflict2-11.1 {
656*00012df4Sdrh  execsql {
657*00012df4Sdrh    -- Create a database object (pages 2, 3 of the file)
658*00012df4Sdrh    BEGIN;
659*00012df4Sdrh      CREATE TABLE abc(a PRIMARY KEY, b, c) WITHOUT rowid;
660*00012df4Sdrh      INSERT INTO abc VALUES(1, 2, 3);
661*00012df4Sdrh      INSERT INTO abc VALUES(4, 5, 6);
662*00012df4Sdrh      INSERT INTO abc VALUES(7, 8, 9);
663*00012df4Sdrh    COMMIT;
664*00012df4Sdrh  }
665*00012df4Sdrh
666*00012df4Sdrh
667*00012df4Sdrh  # Set a small cache size so that changes will spill into
668*00012df4Sdrh  # the database file.
669*00012df4Sdrh  execsql {
670*00012df4Sdrh    PRAGMA cache_size = 10;
671*00012df4Sdrh  }
672*00012df4Sdrh
673*00012df4Sdrh  # Make lots of changes.  Because of the small cache, some
674*00012df4Sdrh  # (most?) of these changes will spill into the disk file.
675*00012df4Sdrh  # In other words, some of the changes will not be held in
676*00012df4Sdrh  # cache.
677*00012df4Sdrh  #
678*00012df4Sdrh  execsql {
679*00012df4Sdrh    BEGIN;
680*00012df4Sdrh      -- Make sure the pager is in EXCLUSIVE state.
681*00012df4Sdrh      CREATE TABLE def(d, e, f);
682*00012df4Sdrh      INSERT INTO def VALUES
683*00012df4Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
684*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
685*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
686*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
687*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
688*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
689*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
690*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
691*00012df4Sdrh      DELETE FROM abc WHERE a = 4;
692*00012df4Sdrh  }
693*00012df4Sdrh
694*00012df4Sdrh  # Execute a statement that does a statement rollback due to
695*00012df4Sdrh  # a constraint failure.
696*00012df4Sdrh  #
697*00012df4Sdrh  catchsql {
698*00012df4Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
699*00012df4Sdrh  }
700*00012df4Sdrh
701*00012df4Sdrh  # Rollback the database.  Verify that the state of the ABC table
702*00012df4Sdrh  # is unchanged from the beginning of the transaction.  In other words,
703*00012df4Sdrh  # make sure the DELETE on table ABC that occurred within the transaction
704*00012df4Sdrh  # had no effect.
705*00012df4Sdrh  #
706*00012df4Sdrh  execsql {
707*00012df4Sdrh    ROLLBACK;
708*00012df4Sdrh    SELECT * FROM abc;
709*00012df4Sdrh  }
710*00012df4Sdrh} {1 2 3 4 5 6 7 8 9}
711*00012df4Sdrhintegrity_check conflict2-11.2
712*00012df4Sdrh
713*00012df4Sdrh# Repeat test conflict2-11.1 but this time commit.
714*00012df4Sdrh#
715*00012df4Sdrhdo_test conflict2-11.3 {
716*00012df4Sdrh  execsql {
717*00012df4Sdrh    BEGIN;
718*00012df4Sdrh      -- Make sure the pager is in EXCLUSIVE state.
719*00012df4Sdrh      UPDATE abc SET a=a+1;
720*00012df4Sdrh      CREATE TABLE def(d, e, f);
721*00012df4Sdrh      INSERT INTO def VALUES
722*00012df4Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
723*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
724*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
725*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
726*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
727*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
728*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
729*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
730*00012df4Sdrh      DELETE FROM abc WHERE a = 4;
731*00012df4Sdrh  }
732*00012df4Sdrh  catchsql {
733*00012df4Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
734*00012df4Sdrh  }
735*00012df4Sdrh  execsql {
736*00012df4Sdrh    ROLLBACK;
737*00012df4Sdrh    SELECT * FROM abc;
738*00012df4Sdrh  }
739*00012df4Sdrh} {1 2 3 4 5 6 7 8 9}
740*00012df4Sdrh# Repeat test conflict2-11.1 but this time commit.
741*00012df4Sdrh#
742*00012df4Sdrhdo_test conflict2-11.5 {
743*00012df4Sdrh  execsql {
744*00012df4Sdrh    BEGIN;
745*00012df4Sdrh      -- Make sure the pager is in EXCLUSIVE state.
746*00012df4Sdrh      CREATE TABLE def(d, e, f);
747*00012df4Sdrh      INSERT INTO def VALUES
748*00012df4Sdrh          ('xxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzz');
749*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
750*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
751*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
752*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
753*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
754*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
755*00012df4Sdrh      INSERT INTO def SELECT * FROM def;
756*00012df4Sdrh      DELETE FROM abc WHERE a = 4;
757*00012df4Sdrh  }
758*00012df4Sdrh  catchsql {
759*00012df4Sdrh    INSERT INTO abc SELECT 10, 20, 30 FROM def;
760*00012df4Sdrh  }
761*00012df4Sdrh  execsql {
762*00012df4Sdrh    COMMIT;
763*00012df4Sdrh    SELECT * FROM abc;
764*00012df4Sdrh  }
765*00012df4Sdrh} {1 2 3 7 8 9}
766*00012df4Sdrhintegrity_check conflict2-11.6
767*00012df4Sdrh
768*00012df4Sdrh# Make sure UPDATE OR REPLACE works on tables that have only
769*00012df4Sdrh# an INTEGER PRIMARY KEY.
770*00012df4Sdrh#
771*00012df4Sdrhdo_test conflict2-12.1 {
772*00012df4Sdrh  execsql {
773*00012df4Sdrh    CREATE TABLE t5(a INTEGER PRIMARY KEY, b text) WITHOUT rowid;
774*00012df4Sdrh    INSERT INTO t5 VALUES(1,'one');
775*00012df4Sdrh    INSERT INTO t5 VALUES(2,'two');
776*00012df4Sdrh    SELECT * FROM t5
777*00012df4Sdrh  }
778*00012df4Sdrh} {1 one 2 two}
779*00012df4Sdrhdo_test conflict2-12.2 {
780*00012df4Sdrh  execsql {
781*00012df4Sdrh    UPDATE OR IGNORE t5 SET a=a+1 WHERE a=1;
782*00012df4Sdrh    SELECT * FROM t5;
783*00012df4Sdrh  }
784*00012df4Sdrh} {1 one 2 two}
785*00012df4Sdrhdo_test conflict2-12.3 {
786*00012df4Sdrh  catchsql {
787*00012df4Sdrh    UPDATE t5 SET a=a+1 WHERE a=1;
788*00012df4Sdrh  }
789*00012df4Sdrh} {1 {PRIMARY KEY must be unique}}
790*00012df4Sdrhverify_ex_errcode conflict2-12.3b SQLITE_CONSTRAINT_PRIMARYKEY
791*00012df4Sdrhdo_test conflict2-12.4 {
792*00012df4Sdrh  execsql {
793*00012df4Sdrh    UPDATE OR REPLACE t5 SET a=a+1 WHERE a=1;
794*00012df4Sdrh    SELECT * FROM t5;
795*00012df4Sdrh  }
796*00012df4Sdrh} {2 one}
797*00012df4Sdrh
798*00012df4Sdrh
799*00012df4Sdrh# Ticket [c38baa3d969eab7946dc50ba9d9b4f0057a19437]
800*00012df4Sdrh# REPLACE works like ABORT on a CHECK constraint.
801*00012df4Sdrh#
802*00012df4Sdrhdo_test conflict2-13.1 {
803*00012df4Sdrh  execsql {
804*00012df4Sdrh    CREATE TABLE t13(a PRIMARY KEY CHECK(a!=2)) WITHOUT rowid;
805*00012df4Sdrh    BEGIN;
806*00012df4Sdrh    REPLACE INTO t13 VALUES(1);
807*00012df4Sdrh  }
808*00012df4Sdrh  catchsql {
809*00012df4Sdrh    REPLACE INTO t13 VALUES(2);
810*00012df4Sdrh  }
811*00012df4Sdrh} {1 {constraint failed}}
812*00012df4Sdrhverify_ex_errcode conflict2-13.1b SQLITE_CONSTRAINT_CHECK
813*00012df4Sdrhdo_test conflict2-13.2 {
814*00012df4Sdrh  execsql {
815*00012df4Sdrh    REPLACE INTO t13 VALUES(3);
816*00012df4Sdrh    COMMIT;
817*00012df4Sdrh    SELECT * FROM t13;
818*00012df4Sdrh  }
819*00012df4Sdrh} {1 3}
820*00012df4Sdrh
821*00012df4Sdrh
822*00012df4Sdrhfinish_test
823