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