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*ef6764a1Sdrh# $Id: conflict.test,v 1.2 2002/01/30 04:32:01 drh Exp $ 17bb37fdc7Sdrh 18bb37fdc7Sdrhset testdir [file dirname $argv0] 19bb37fdc7Sdrhsource $testdir/tester.tcl 20bb37fdc7Sdrh 21bb37fdc7Sdrh# Create a table with three fields, two of which must be 22bb37fdc7Sdrh# UNIQUE. 23bb37fdc7Sdrh# 24bb37fdc7Sdrhdo_test conflict-1.1 { 25bb37fdc7Sdrh execsql { 26bb37fdc7Sdrh CREATE TABLE t1(a, b, c, UNIQUE(a,b)); 27bb37fdc7Sdrh INSERT INTO t1 VALUES(1,2,3); 28bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 29bb37fdc7Sdrh } 30bb37fdc7Sdrh} {3} 31bb37fdc7Sdrhdo_test conflict-1.2 { 32bb37fdc7Sdrh catchsql { 33bb37fdc7Sdrh INSERT INTO t1 VALUES(1,2,4); 34bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 35bb37fdc7Sdrh } 36bb37fdc7Sdrh} {1 {constraint failed}} 37bb37fdc7Sdrhdo_test conflict-1.3 { 38bb37fdc7Sdrh catchsql { 39bb37fdc7Sdrh INSERT ON CONFLICT IGNORE INTO t1 VALUES(1,2,4); 40bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 41bb37fdc7Sdrh } 42bb37fdc7Sdrh} {0 3} 43bb37fdc7Sdrhdo_test conflict-1.4 { 44bb37fdc7Sdrh catchsql { 45bb37fdc7Sdrh INSERT ON CONFLICT REPLACE INTO t1 VALUES(1,2,4); 46bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 47bb37fdc7Sdrh } 48bb37fdc7Sdrh} {0 4} 49bb37fdc7Sdrhdo_test conflict-1.5 { 50bb37fdc7Sdrh catchsql { 51bb37fdc7Sdrh INSERT ON CONFLICT ABORT INTO t1 VALUES(1,2,5); 52bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 53bb37fdc7Sdrh } 54bb37fdc7Sdrh} {1 {constraint failed}} 55bb37fdc7Sdrhdo_test conflict-1.6 { 56bb37fdc7Sdrh catchsql { 57bb37fdc7Sdrh INSERT IGNORE INTO t1 VALUES(1,2,5); 58bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 59bb37fdc7Sdrh } 60bb37fdc7Sdrh} {0 4} 61bb37fdc7Sdrhdo_test conflict-1.7 { 62bb37fdc7Sdrh catchsql { 63bb37fdc7Sdrh INSERT REPLACE INTO t1 VALUES(1,2,5); 64bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 65bb37fdc7Sdrh } 66bb37fdc7Sdrh} {0 5} 67bb37fdc7Sdrhdo_test conflict-1.8 { 68bb37fdc7Sdrh catchsql { 69bb37fdc7Sdrh INSERT ON CONFLICT ABORT INTO t1 VALUES(1,2,6); 70bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 71bb37fdc7Sdrh } 72bb37fdc7Sdrh} {1 {constraint failed}} 73bb37fdc7Sdrh 74bb37fdc7Sdrhdo_test conflict-1.9 { 75bb37fdc7Sdrh execsql { 76bb37fdc7Sdrh BEGIN; 77bb37fdc7Sdrh CREATE TABLE t2(a,b,c); 78bb37fdc7Sdrh INSERT INTO t2 VALUES(1,2,11); 79bb37fdc7Sdrh INSERT INTO t2 VALUES(1,2,12); 80bb37fdc7Sdrh INSERT INTO t2 VALUES(1,2,13); 81bb37fdc7Sdrh INSERT INTO t2 VALUES(1,2,14); 82bb37fdc7Sdrh INSERT INTO t2 VALUES(1,3,21); 83bb37fdc7Sdrh INSERT INTO t2 VALUES(1,3,22); 84bb37fdc7Sdrh INSERT INTO t2 VALUES(1,3,23); 85bb37fdc7Sdrh INSERT INTO t2 VALUES(1,3,24); 86bb37fdc7Sdrh COMMIT; 87bb37fdc7Sdrh SELECT count(*) FROM t2; 88bb37fdc7Sdrh } 89bb37fdc7Sdrh} 8 90bb37fdc7Sdrhdo_test conflict-1.10 { 91bb37fdc7Sdrh catchsql { 92bb37fdc7Sdrh INSERT IGNORE INTO t1 SELECT a,b,c FROM t2 ORDER BY c; 93bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 94bb37fdc7Sdrh } 95bb37fdc7Sdrh} {0 {5 21}} 96bb37fdc7Sdrhdo_test conflict-1.11 { 97bb37fdc7Sdrh catchsql { 98bb37fdc7Sdrh INSERT REPLACE INTO t1 SELECT a,b,c FROM t2 ORDER BY c; 99bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 100bb37fdc7Sdrh } 101bb37fdc7Sdrh} {0 {14 24}} 102bb37fdc7Sdrh 103bb37fdc7Sdrh###### Fix me! 104bb37fdc7Sdrhdo_test conflict-1.12 { 105bb37fdc7Sdrh catchsql { 106bb37fdc7Sdrh INSERT REPLACE INTO t1 SELECT a,b,c FROM t2 ORDER BY c DESC; 107bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 108bb37fdc7Sdrh } 109bb37fdc7Sdrh} {0 {14 24}} 110bb37fdc7Sdrh 111bb37fdc7Sdrhdo_test conflict-1.13 { 112bb37fdc7Sdrh execsql { 113bb37fdc7Sdrh BEGIN; 114bb37fdc7Sdrh DELETE FROM t1; 115bb37fdc7Sdrh INSERT INTO t1 VALUES(1,2,3); 116bb37fdc7Sdrh INSERT INTO t1 VALUES(1,3,4); 117bb37fdc7Sdrh INSERT INTO t1 VALUES(2,3,5); 118bb37fdc7Sdrh COMMIT; 119bb37fdc7Sdrh SELECT * FROM t1 ORDER BY c; 120bb37fdc7Sdrh } 121bb37fdc7Sdrh} {1 2 3 1 3 4 2 3 5} 122bb37fdc7Sdrhdo_test conflict-1.14 { 123bb37fdc7Sdrh catchsql { 124bb37fdc7Sdrh UPDATE ON CONFLICT ABORT t1 SET b=3 WHERE b=2; 125bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 126bb37fdc7Sdrh } 127bb37fdc7Sdrh} {1 {constraint failed}}; 128bb37fdc7Sdrhdo_test conflict-1.15 { 129bb37fdc7Sdrh catchsql { 130bb37fdc7Sdrh UPDATE t1 SET b=3 WHERE b=2; 131bb37fdc7Sdrh SELECT c FROM t1 ORDER BY c; 132bb37fdc7Sdrh } 133bb37fdc7Sdrh} {1 {constraint failed}}; 134bb37fdc7Sdrhdo_test conflict-1.16 { 135bb37fdc7Sdrh catchsql { 136bb37fdc7Sdrh UPDATE ON CONFLICT IGNORE t1 SET b=3 WHERE b=2; 137bb37fdc7Sdrh SELECT * FROM t1 ORDER BY c; 138bb37fdc7Sdrh } 139bb37fdc7Sdrh} {0 {1 2 3 1 3 4 2 3 5}} 140bb37fdc7Sdrhdo_test conflict-1.17 { 141bb37fdc7Sdrh catchsql { 142bb37fdc7Sdrh UPDATE ON CONFLICT REPLACE t1 SET b=3 WHERE b=2; 143bb37fdc7Sdrh SELECT * FROM t1 ORDER BY c; 144bb37fdc7Sdrh } 145bb37fdc7Sdrh} {0 {1 3 3 2 3 5}} 146bb37fdc7Sdrh 147*ef6764a1Sdrhdo_test conflict-2.1 { 148*ef6764a1Sdrh execsql { 149*ef6764a1Sdrh DROP TABLE t1; 150*ef6764a1Sdrh DROP TABLE t2; 151*ef6764a1Sdrh CREATE TABLE t1(a integer primary key, b, c, UNIQUE(a,b)); 152*ef6764a1Sdrh CREATE INDEX t1b ON t1(b); 153*ef6764a1Sdrh CREATE INDEX t1bc ON t1(b,c); 154*ef6764a1Sdrh INSERT INTO t1 VALUES(1,2,3); 155*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 156*ef6764a1Sdrh } 157*ef6764a1Sdrh} {3} 158*ef6764a1Sdrhdo_test conflict-2.2 { 159*ef6764a1Sdrh catchsql { 160*ef6764a1Sdrh INSERT INTO t1 VALUES(1,2,4); 161*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 162*ef6764a1Sdrh } 163*ef6764a1Sdrh} {1 {constraint failed}} 164*ef6764a1Sdrhdo_test conflict-2.3 { 165*ef6764a1Sdrh catchsql { 166*ef6764a1Sdrh INSERT ON CONFLICT IGNORE INTO t1 VALUES(1,2,4); 167*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 168*ef6764a1Sdrh } 169*ef6764a1Sdrh} {0 3} 170*ef6764a1Sdrhdo_test conflict-2.4 { 171*ef6764a1Sdrh catchsql { 172*ef6764a1Sdrh INSERT ON CONFLICT REPLACE INTO t1 VALUES(1,2,4); 173*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 174*ef6764a1Sdrh } 175*ef6764a1Sdrh} {0 4} 176*ef6764a1Sdrhdo_test conflict-2.5 { 177*ef6764a1Sdrh catchsql { 178*ef6764a1Sdrh INSERT ON CONFLICT ABORT INTO t1 VALUES(1,2,5); 179*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 180*ef6764a1Sdrh } 181*ef6764a1Sdrh} {1 {constraint failed}} 182*ef6764a1Sdrhdo_test conflict-2.6 { 183*ef6764a1Sdrh catchsql { 184*ef6764a1Sdrh INSERT IGNORE INTO t1 VALUES(1,2,5); 185*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 186*ef6764a1Sdrh } 187*ef6764a1Sdrh} {0 4} 188*ef6764a1Sdrhdo_test conflict-2.7 { 189*ef6764a1Sdrh catchsql { 190*ef6764a1Sdrh INSERT REPLACE INTO t1 VALUES(1,2,5); 191*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 192*ef6764a1Sdrh } 193*ef6764a1Sdrh} {0 5} 194*ef6764a1Sdrhdo_test conflict-2.8 { 195*ef6764a1Sdrh catchsql { 196*ef6764a1Sdrh INSERT ON CONFLICT ABORT INTO t1 VALUES(1,2,6); 197*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 198*ef6764a1Sdrh } 199*ef6764a1Sdrh} {1 {constraint failed}} 200*ef6764a1Sdrh 201*ef6764a1Sdrhdo_test conflict-2.9 { 202*ef6764a1Sdrh execsql { 203*ef6764a1Sdrh BEGIN; 204*ef6764a1Sdrh CREATE TABLE t2(a,b,c INTEGER PRIMARY KEY); 205*ef6764a1Sdrh INSERT INTO t2 VALUES(1,2,11); 206*ef6764a1Sdrh INSERT INTO t2 VALUES(1,2,12); 207*ef6764a1Sdrh INSERT INTO t2 VALUES(1,2,13); 208*ef6764a1Sdrh INSERT INTO t2 VALUES(1,2,14); 209*ef6764a1Sdrh INSERT INTO t2 VALUES(2,2,21); 210*ef6764a1Sdrh INSERT INTO t2 VALUES(2,2,22); 211*ef6764a1Sdrh INSERT INTO t2 VALUES(2,2,23); 212*ef6764a1Sdrh INSERT INTO t2 VALUES(2,2,24); 213*ef6764a1Sdrh COMMIT; 214*ef6764a1Sdrh SELECT count(*) FROM t2; 215*ef6764a1Sdrh } 216*ef6764a1Sdrh} 8 217*ef6764a1Sdrhdo_test conflict-2.10 { 218*ef6764a1Sdrh catchsql { 219*ef6764a1Sdrh INSERT IGNORE INTO t1 SELECT a,b,c FROM t2 ORDER BY c; 220*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 221*ef6764a1Sdrh } 222*ef6764a1Sdrh} {0 {5 21}} 223*ef6764a1Sdrhdo_test conflict-2.11 { 224*ef6764a1Sdrh catchsql { 225*ef6764a1Sdrh INSERT REPLACE INTO t1 SELECT a,b,c FROM t2 ORDER BY c; 226*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 227*ef6764a1Sdrh } 228*ef6764a1Sdrh} {0 {14 24}} 229*ef6764a1Sdrh 230*ef6764a1Sdrh###### Fix me! 231*ef6764a1Sdrhdo_test conflict-2.12 { 232*ef6764a1Sdrh catchsql { 233*ef6764a1Sdrh INSERT REPLACE INTO t1 SELECT a,b,c FROM t2 ORDER BY c DESC; 234*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 235*ef6764a1Sdrh } 236*ef6764a1Sdrh} {0 {14 24}} 237*ef6764a1Sdrh 238*ef6764a1Sdrhdo_test conflict-2.13 { 239*ef6764a1Sdrh execsql { 240*ef6764a1Sdrh BEGIN; 241*ef6764a1Sdrh DELETE FROM t1; 242*ef6764a1Sdrh INSERT INTO t1 VALUES(1,2,3); 243*ef6764a1Sdrh INSERT INTO t1 VALUES(2,3,4); 244*ef6764a1Sdrh INSERT INTO t1 VALUES(3,3,5); 245*ef6764a1Sdrh COMMIT; 246*ef6764a1Sdrh SELECT * FROM t1 ORDER BY c; 247*ef6764a1Sdrh } 248*ef6764a1Sdrh} {1 2 3 2 3 4 3 3 5} 249*ef6764a1Sdrhdo_test conflict-2.14 { 250*ef6764a1Sdrh catchsql { 251*ef6764a1Sdrh UPDATE ON CONFLICT ABORT t1 SET a=2, b=3 WHERE b=2; 252*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 253*ef6764a1Sdrh } 254*ef6764a1Sdrh} {1 {constraint failed}}; 255*ef6764a1Sdrhdo_test conflict-2.15 { 256*ef6764a1Sdrh catchsql { 257*ef6764a1Sdrh UPDATE t1 SET a=2, b=3 WHERE b=2; 258*ef6764a1Sdrh SELECT c FROM t1 ORDER BY c; 259*ef6764a1Sdrh } 260*ef6764a1Sdrh} {1 {constraint failed}}; 261*ef6764a1Sdrhdo_test conflict-2.16 { 262*ef6764a1Sdrh catchsql { 263*ef6764a1Sdrh UPDATE ON CONFLICT IGNORE t1 SET a=2, b=3 WHERE b=2; 264*ef6764a1Sdrh SELECT * FROM t1 ORDER BY c; 265*ef6764a1Sdrh } 266*ef6764a1Sdrh} {0 {1 2 3 2 3 4 3 3 5}} 267*ef6764a1Sdrhdo_test conflict-2.17 { 268*ef6764a1Sdrh catchsql { 269*ef6764a1Sdrh UPDATE ON CONFLICT REPLACE t1 SET a=2, b=3 WHERE b=2; 270*ef6764a1Sdrh SELECT * FROM t1 ORDER BY c; 271*ef6764a1Sdrh } 272*ef6764a1Sdrh} {0 {2 3 3 3 3 5}} 273*ef6764a1Sdrh 274bb37fdc7Sdrh 275bb37fdc7Sdrhfinish_test 276