Annotation of embedaddon/sqlite3/ext/rtree/rtree1.test, revision 1.1

1.1     ! misho       1: # 2008 Feb 19
        !             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: #
        !            12: # The focus of this file is testing the r-tree extension.
        !            13: #
        !            14: 
        !            15: if {![info exists testdir]} {
        !            16:   set testdir [file join [file dirname [info script]] .. .. test]
        !            17: }
        !            18: source [file join [file dirname [info script]] rtree_util.tcl]
        !            19: source $testdir/tester.tcl
        !            20: 
        !            21: # Test plan:
        !            22: #
        !            23: #   rtree-1.*: Creating/destroying r-tree tables.
        !            24: #   rtree-2.*: Test the implicit constraints - unique rowid and
        !            25: #              (coord[N]<=coord[N+1]) for even values of N. Also
        !            26: #              automatic assigning of rowid values.
        !            27: #   rtree-3.*: Linear scans of r-tree data.
        !            28: #   rtree-4.*: Test INSERT
        !            29: #   rtree-5.*: Test DELETE
        !            30: #   rtree-6.*: Test UPDATE
        !            31: #   rtree-7.*: Test renaming an r-tree table.
        !            32: #   rtree-8.*: Test constrained scans of r-tree data.
        !            33: #
        !            34: #   rtree-12.*: Test that on-conflict clauses are supported.
        !            35: #
        !            36: 
        !            37: ifcapable !rtree {
        !            38:   finish_test
        !            39:   return
        !            40: }
        !            41: 
        !            42: #----------------------------------------------------------------------------
        !            43: # Test cases rtree-1.* test CREATE and DROP table statements.
        !            44: #
        !            45: 
        !            46: # Test creating and dropping an rtree table.
        !            47: #
        !            48: do_test rtree-1.1.1 {
        !            49:   execsql { CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2) }
        !            50: } {}
        !            51: do_test rtree-1.1.2 {
        !            52:   execsql { SELECT name FROM sqlite_master ORDER BY name }
        !            53: } {t1 t1_node t1_parent t1_rowid}
        !            54: do_test rtree-1.1.3 {
        !            55:   execsql { 
        !            56:     DROP TABLE t1; 
        !            57:     SELECT name FROM sqlite_master ORDER BY name;
        !            58:   }
        !            59: } {}
        !            60: 
        !            61: # Test creating and dropping an rtree table with an odd name in
        !            62: # an attached database.
        !            63: #
        !            64: do_test rtree-1.2.1 {
        !            65:   file delete -force test2.db
        !            66:   execsql {
        !            67:     ATTACH 'test2.db' AS aux;
        !            68:     CREATE VIRTUAL TABLE aux.'a" "b' USING rtree(ii, x1, x2, y1, y2);
        !            69:   }
        !            70: } {}
        !            71: do_test rtree-1.2.2 {
        !            72:   execsql { SELECT name FROM sqlite_master ORDER BY name }
        !            73: } {}
        !            74: do_test rtree-1.2.3 {
        !            75:   execsql { SELECT name FROM aux.sqlite_master ORDER BY name }
        !            76: } {{a" "b} {a" "b_node} {a" "b_parent} {a" "b_rowid}}
        !            77: do_test rtree-1.2.4 {
        !            78:   execsql { 
        !            79:     DROP TABLE aux.'a" "b'; 
        !            80:     SELECT name FROM aux.sqlite_master ORDER BY name;
        !            81:   }
        !            82: } {}
        !            83: 
        !            84: # Test that the logic for checking the number of columns specified
        !            85: # for an rtree table. Acceptable values are odd numbers between 3 and
        !            86: # 11, inclusive.
        !            87: #
        !            88: set cols [list i1 i2 i3 i4 i5 i6 i7 i8 i9 iA iB iC iD iE iF iG iH iI iJ iK]
        !            89: for {set nCol 1} {$nCol<[llength $cols]} {incr nCol} {
        !            90: 
        !            91:   set columns [join [lrange $cols 0 [expr {$nCol-1}]] ,]
        !            92: 
        !            93:   set X {0 {}}
        !            94:   if {$nCol%2 == 0}  { set X {1 {Wrong number of columns for an rtree table}} }
        !            95:   if {$nCol < 3}     { set X {1 {Too few columns for an rtree table}} }
        !            96:   if {$nCol > 11}    { set X {1 {Too many columns for an rtree table}} }
        !            97: 
        !            98:   do_test rtree-1.3.$nCol {
        !            99:     catchsql " 
        !           100:       CREATE VIRTUAL TABLE t1 USING rtree($columns);
        !           101:     "
        !           102:   } $X
        !           103: 
        !           104:   catchsql { DROP TABLE t1 }
        !           105: }
        !           106: 
        !           107: # Test that it is possible to open an existing database that contains
        !           108: # r-tree tables.
        !           109: #
        !           110: do_test rtree-1.4.1 {
        !           111:   execsql {
        !           112:     CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2);
        !           113:     INSERT INTO t1 VALUES(1, 5.0, 10.0);
        !           114:     INSERT INTO t1 VALUES(2, 15.0, 20.0);
        !           115:   }
        !           116: } {}
        !           117: do_test rtree-1.4.2 {
        !           118:   db close
        !           119:   sqlite3 db test.db
        !           120:   execsql { SELECT * FROM t1 ORDER BY ii }
        !           121: } {1 5.0 10.0 2 15.0 20.0}
        !           122: do_test rtree-1.4.3 {
        !           123:   execsql { DROP TABLE t1 }
        !           124: } {}
        !           125: 
        !           126: # Test that it is possible to create an r-tree table with ridiculous
        !           127: # column names.
        !           128: #
        !           129: do_test rtree-1.5.1 {
        !           130:   execsql {
        !           131:     CREATE VIRTUAL TABLE t1 USING rtree("the key", "x dim.", "x2'dim");
        !           132:     INSERT INTO t1 VALUES(1, 2, 3);
        !           133:     SELECT "the key", "x dim.", "x2'dim" FROM t1;
        !           134:   }
        !           135: } {1 2.0 3.0}
        !           136: do_test rtree-1.5.1 {
        !           137:   execsql { DROP TABLE t1 }
        !           138: } {}
        !           139: 
        !           140: # Force the r-tree constructor to fail.
        !           141: #
        !           142: do_test rtree-1.6.1 {
        !           143:   execsql { CREATE TABLE t1_rowid(a); }
        !           144:   catchsql {
        !           145:     CREATE VIRTUAL TABLE t1 USING rtree("the key", "x dim.", "x2'dim");
        !           146:   }
        !           147: } {1 {table "t1_rowid" already exists}}
        !           148: do_test rtree-1.6.1 {
        !           149:   execsql { DROP TABLE t1_rowid }
        !           150: } {}
        !           151: 
        !           152: #----------------------------------------------------------------------------
        !           153: # Test cases rtree-2.* 
        !           154: #
        !           155: do_test rtree-2.1.1 {
        !           156:   execsql { 
        !           157:     CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2);
        !           158:     SELECT * FROM t1;
        !           159:   }
        !           160: } {}
        !           161: 
        !           162: do_test rtree-2.1.2 {
        !           163:   execsql { INSERT INTO t1 VALUES(NULL, 1, 3, 2, 4) }
        !           164:   execsql { SELECT * FROM t1 }
        !           165: } {1 1.0 3.0 2.0 4.0}
        !           166: do_test rtree-2.1.3 {
        !           167:   execsql { INSERT INTO t1 VALUES(NULL, 1, 3, 2, 4) }
        !           168:   execsql { SELECT rowid FROM t1 ORDER BY rowid }
        !           169: } {1 2}
        !           170: do_test rtree-2.1.3 {
        !           171:   execsql { INSERT INTO t1 VALUES(NULL, 1, 3, 2, 4) }
        !           172:   execsql { SELECT ii FROM t1 ORDER BY ii }
        !           173: } {1 2 3}
        !           174: 
        !           175: do_test rtree-2.2.1 {
        !           176:   catchsql { INSERT INTO t1 VALUES(2, 1, 3, 2, 4) }
        !           177: } {1 {constraint failed}}
        !           178: do_test rtree-2.2.2 {
        !           179:   catchsql { INSERT INTO t1 VALUES(4, 1, 3, 4, 2) }
        !           180: } {1 {constraint failed}}
        !           181: do_test rtree-2.2.3 {
        !           182:   catchsql { INSERT INTO t1 VALUES(4, 3, 1, 2, 4) }
        !           183: } {1 {constraint failed}}
        !           184: do_test rtree-2.2.4 {
        !           185:   execsql { SELECT ii FROM t1 ORDER BY ii }
        !           186: } {1 2 3}
        !           187: 
        !           188: do_test rtree-2.X {
        !           189:   execsql { DROP TABLE t1 }
        !           190: } {}
        !           191: 
        !           192: #----------------------------------------------------------------------------
        !           193: # Test cases rtree-3.* test linear scans of r-tree table data. To test
        !           194: # this we have to insert some data into an r-tree, but that is not the
        !           195: # focus of these tests.
        !           196: #
        !           197: do_test rtree-3.1.1 {
        !           198:   execsql { 
        !           199:     CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2);
        !           200:     SELECT * FROM t1;
        !           201:   }
        !           202: } {}
        !           203: do_test rtree-3.1.2 {
        !           204:   execsql { 
        !           205:     INSERT INTO t1 VALUES(5, 1, 3, 2, 4);
        !           206:     SELECT * FROM t1;
        !           207:   }
        !           208: } {5 1.0 3.0 2.0 4.0}
        !           209: do_test rtree-3.1.3 {
        !           210:   execsql {
        !           211:     INSERT INTO t1 VALUES(6, 2, 6, 4, 8);
        !           212:     SELECT * FROM t1;
        !           213:   }
        !           214: } {5 1.0 3.0 2.0 4.0 6 2.0 6.0 4.0 8.0}
        !           215: 
        !           216: # Test the constraint on the coordinates (c[i]<=c[i+1] where (i%2==0)):
        !           217: do_test rtree-3.2.1 {
        !           218:   catchsql { INSERT INTO t1 VALUES(7, 2, 6, 4, 3) }
        !           219: } {1 {constraint failed}}
        !           220: do_test rtree-3.2.2 {
        !           221:   catchsql { INSERT INTO t1 VALUES(8, 2, 6, 3, 3) }
        !           222: } {0 {}}
        !           223: 
        !           224: #----------------------------------------------------------------------------
        !           225: # Test cases rtree-5.* test DELETE operations.
        !           226: #
        !           227: do_test rtree-5.1.1 {
        !           228:   execsql { CREATE VIRTUAL TABLE t2 USING rtree(ii, x1, x2) }
        !           229: } {}
        !           230: do_test rtree-5.1.2 {
        !           231:   execsql { 
        !           232:     INSERT INTO t2 VALUES(1, 10, 20);
        !           233:     INSERT INTO t2 VALUES(2, 30, 40);
        !           234:     INSERT INTO t2 VALUES(3, 50, 60);
        !           235:     SELECT * FROM t2 ORDER BY ii;
        !           236:   }
        !           237: } {1 10.0 20.0 2 30.0 40.0 3 50.0 60.0}
        !           238: do_test rtree-5.1.3 {
        !           239:   execsql { 
        !           240:     DELETE FROM t2 WHERE ii=2;
        !           241:     SELECT * FROM t2 ORDER BY ii;
        !           242:   }
        !           243: } {1 10.0 20.0 3 50.0 60.0}
        !           244: do_test rtree-5.1.4 {
        !           245:   execsql { 
        !           246:     DELETE FROM t2 WHERE ii=1;
        !           247:     SELECT * FROM t2 ORDER BY ii;
        !           248:   }
        !           249: } {3 50.0 60.0}
        !           250: do_test rtree-5.1.5 {
        !           251:   execsql { 
        !           252:     DELETE FROM t2 WHERE ii=3;
        !           253:     SELECT * FROM t2 ORDER BY ii;
        !           254:   }
        !           255: } {}
        !           256: do_test rtree-5.1.6 {
        !           257:   execsql { SELECT * FROM t2_rowid }
        !           258: } {}
        !           259: 
        !           260: #----------------------------------------------------------------------------
        !           261: # Test cases rtree-5.* test UPDATE operations.
        !           262: #
        !           263: do_test rtree-6.1.1 {
        !           264:   execsql { CREATE VIRTUAL TABLE t3 USING rtree(ii, x1, x2, y1, y2) }
        !           265: } {}
        !           266: do_test rtree-6.1.2 {
        !           267:   execsql {
        !           268:     INSERT INTO t3 VALUES(1, 2, 3, 4, 5);
        !           269:     UPDATE t3 SET x2=5;
        !           270:     SELECT * FROM t3;
        !           271:   }
        !           272: } {1 2.0 5.0 4.0 5.0}
        !           273: do_test rtree-6.1.3 {
        !           274:   execsql { UPDATE t3 SET ii = 2 }
        !           275:   execsql { SELECT * FROM t3 }
        !           276: } {2 2.0 5.0 4.0 5.0}
        !           277: 
        !           278: #----------------------------------------------------------------------------
        !           279: # Test cases rtree-7.* test rename operations.
        !           280: #
        !           281: do_test rtree-7.1.1 {
        !           282:   execsql {
        !           283:     CREATE VIRTUAL TABLE t4 USING rtree(ii, x1, x2, y1, y2, z1, z2);
        !           284:     INSERT INTO t4 VALUES(1, 2, 3, 4, 5, 6, 7);
        !           285:   }
        !           286: } {}
        !           287: do_test rtree-7.1.2 {
        !           288:   execsql { ALTER TABLE t4 RENAME TO t5 }
        !           289:   execsql { SELECT * FROM t5 }
        !           290: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           291: do_test rtree-7.1.3 {
        !           292:   db close
        !           293:   sqlite3 db test.db
        !           294:   execsql { SELECT * FROM t5 }
        !           295: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           296: do_test rtree-7.1.4 {
        !           297:   execsql { ALTER TABLE t5 RENAME TO 'raisara "one"'''}
        !           298:   execsql { SELECT * FROM "raisara ""one""'" }
        !           299: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           300: do_test rtree-7.1.5 {
        !           301:   execsql { SELECT * FROM 'raisara "one"''' }
        !           302: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           303: do_test rtree-7.1.6 {
        !           304:   execsql { ALTER TABLE "raisara ""one""'" RENAME TO "abc 123" }
        !           305:   execsql { SELECT * FROM "abc 123" }
        !           306: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           307: do_test rtree-7.1.7 {
        !           308:   db close
        !           309:   sqlite3 db test.db
        !           310:   execsql { SELECT * FROM "abc 123" }
        !           311: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           312: 
        !           313: # An error midway through a rename operation.
        !           314: do_test rtree-7.2.1 {
        !           315:   execsql { 
        !           316:     CREATE TABLE t4_node(a);
        !           317:   }
        !           318:   catchsql { ALTER TABLE "abc 123" RENAME TO t4 }
        !           319: } {1 {SQL logic error or missing database}}
        !           320: do_test rtree-7.2.2 {
        !           321:   execsql { SELECT * FROM "abc 123" }
        !           322: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           323: do_test rtree-7.2.3 {
        !           324:   execsql { 
        !           325:     DROP TABLE t4_node;
        !           326:     CREATE TABLE t4_rowid(a);
        !           327:   }
        !           328:   catchsql { ALTER TABLE "abc 123" RENAME TO t4 }
        !           329: } {1 {SQL logic error or missing database}}
        !           330: do_test rtree-7.2.4 {
        !           331:   db close
        !           332:   sqlite3 db test.db
        !           333:   execsql { SELECT * FROM "abc 123" }
        !           334: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           335: do_test rtree-7.2.5 {
        !           336:   execsql { DROP TABLE t4_rowid }
        !           337:   execsql { ALTER TABLE "abc 123" RENAME TO t4 }
        !           338:   execsql { SELECT * FROM t4 }
        !           339: } {1 2.0 3.0 4.0 5.0 6.0 7.0}
        !           340: 
        !           341: 
        !           342: #----------------------------------------------------------------------------
        !           343: # Test cases rtree-8.*
        !           344: #
        !           345: 
        !           346: # Test that the function to determine if a leaf cell is part of the
        !           347: # result set works.
        !           348: do_test rtree-8.1.1 {
        !           349:   execsql {
        !           350:     CREATE VIRTUAL TABLE t6 USING rtree(ii, x1, x2);
        !           351:     INSERT INTO t6 VALUES(1, 3, 7);
        !           352:     INSERT INTO t6 VALUES(2, 4, 6);
        !           353:   }
        !           354: } {}
        !           355: do_test rtree-8.1.2 { execsql { SELECT ii FROM t6 WHERE x1>2 } } {1 2}
        !           356: do_test rtree-8.1.3 { execsql { SELECT ii FROM t6 WHERE x1>3 } } {2}
        !           357: do_test rtree-8.1.4 { execsql { SELECT ii FROM t6 WHERE x1>4 } } {}
        !           358: do_test rtree-8.1.5 { execsql { SELECT ii FROM t6 WHERE x1>5 } } {}
        !           359: do_test rtree-8.1.6 { execsql { SELECT ii FROM t6 WHERE x1<3 } } {}
        !           360: do_test rtree-8.1.7 { execsql { SELECT ii FROM t6 WHERE x1<4 } } {1}
        !           361: do_test rtree-8.1.8 { execsql { SELECT ii FROM t6 WHERE x1<5 } } {1 2}
        !           362: 
        !           363: #----------------------------------------------------------------------------
        !           364: # Test cases rtree-9.*
        !           365: #
        !           366: # Test that ticket #3549 is fixed.
        !           367: do_test rtree-9.1 {
        !           368:   execsql {
        !           369:     CREATE TABLE foo (id INTEGER PRIMARY KEY);
        !           370:     CREATE VIRTUAL TABLE bar USING rtree (id, minX, maxX, minY, maxY);
        !           371:     INSERT INTO foo VALUES (null);
        !           372:     INSERT INTO foo SELECT null FROM foo;
        !           373:     INSERT INTO foo SELECT null FROM foo;
        !           374:     INSERT INTO foo SELECT null FROM foo;
        !           375:     INSERT INTO foo SELECT null FROM foo;
        !           376:     INSERT INTO foo SELECT null FROM foo;
        !           377:     INSERT INTO foo SELECT null FROM foo;
        !           378:     DELETE FROM foo WHERE id > 40;
        !           379:     INSERT INTO bar SELECT NULL, 0, 0, 0, 0 FROM foo;
        !           380:   }
        !           381: } {}
        !           382: 
        !           383: # This used to crash.
        !           384: do_test rtree-9.2 {
        !           385:   execsql {
        !           386:     SELECT count(*) FROM bar b1, bar b2, foo s1 WHERE s1.id = b1.id;
        !           387:   }
        !           388: } {1600}
        !           389: do_test rtree-9.3 {
        !           390:   execsql {
        !           391:     SELECT count(*) FROM bar b1, bar b2, foo s1 
        !           392:     WHERE b1.minX <= b2.maxX AND s1.id = b1.id;
        !           393:   }
        !           394: } {1600}
        !           395: 
        !           396: #-------------------------------------------------------------------------
        !           397: # Ticket #3970: Check that the error message is meaningful when a 
        !           398: # keyword is used as a column name.
        !           399: #
        !           400: do_test rtree-10.1 {
        !           401:   catchsql { CREATE VIRTUAL TABLE t7 USING rtree(index, x1, y1, x2, y2) }
        !           402: } {1 {near "index": syntax error}}
        !           403: 
        !           404: #-------------------------------------------------------------------------
        !           405: # Test last_insert_rowid().
        !           406: # 
        !           407: do_test rtree-11.1 {
        !           408:   execsql {
        !           409:     CREATE VIRTUAL TABLE t8 USING rtree(idx, x1, x2, y1, y2);
        !           410:     INSERT INTO t8 VALUES(1, 1.0, 1.0, 2.0, 2.0);
        !           411:     SELECT last_insert_rowid();
        !           412:   }
        !           413: } {1}
        !           414: do_test rtree-11.2 {
        !           415:   execsql {
        !           416:     INSERT INTO t8 VALUES(NULL, 1.0, 1.0, 2.0, 2.0);
        !           417:     SELECT last_insert_rowid();
        !           418:   }
        !           419: } {2}
        !           420: 
        !           421: #-------------------------------------------------------------------------
        !           422: # Test on-conflict clause handling.
        !           423: #
        !           424: db_delete_and_reopen
        !           425: do_execsql_test 12.0 {
        !           426:   CREATE VIRTUAL TABLE t1 USING rtree_i32(idx, x1, x2, y1, y2);
        !           427:   INSERT INTO t1 VALUES(1,   1, 2, 3, 4);
        !           428:   INSERT INTO t1 VALUES(2,   2, 3, 4, 5);
        !           429:   INSERT INTO t1 VALUES(3,   3, 4, 5, 6);
        !           430: 
        !           431:   CREATE TABLE source(idx, x1, x2, y1, y2);
        !           432:   INSERT INTO source VALUES(5, 8, 8, 8, 8);
        !           433:   INSERT INTO source VALUES(2, 7, 7, 7, 7);
        !           434:   
        !           435: }
        !           436: db_save_and_close
        !           437: foreach {tn sql_template testdata} {
        !           438:   1    "INSERT %CONF% INTO t1 VALUES(2, 7, 7, 7, 7)" {
        !           439:     ROLLBACK 0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
        !           440:     ABORT    0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           441:     IGNORE   0 0 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           442:     FAIL     0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           443:     REPLACE  0 0 {1 1 2 3 4   2 7 7 7 7   3 3 4 5 6   4 4 5 6 7}
        !           444:   }
        !           445: 
        !           446:   2    "INSERT %CONF% INTO t1 SELECT * FROM source" {
        !           447:     ROLLBACK 1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
        !           448:     ABORT    1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           449:     IGNORE   1 0 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7  5 8 8 8 8}
        !           450:     FAIL     1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7  5 8 8 8 8}
        !           451:     REPLACE  1 0 {1 1 2 3 4   2 7 7 7 7   3 3 4 5 6   4 4 5 6 7  5 8 8 8 8}
        !           452:   }
        !           453: 
        !           454:   3    "UPDATE %CONF% t1 SET idx = 2 WHERE idx = 4" {
        !           455:     ROLLBACK 1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
        !           456:     ABORT    1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           457:     IGNORE   1 0 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           458:     FAIL     1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           459:     REPLACE  1 0 {1 1 2 3 4   2 4 5 6 7   3 3 4 5 6}
        !           460:   }
        !           461: 
        !           462:   3    "UPDATE %CONF% t1 SET idx = ((idx+1)%5)+1 WHERE idx > 2" {
        !           463:     ROLLBACK 1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
        !           464:     ABORT    1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           465:     IGNORE   1 0 {1 1 2 3 4   2 2 3 4 5               4 4 5 6 7   5 3 4 5 6}
        !           466:     FAIL     1 1 {1 1 2 3 4   2 2 3 4 5               4 4 5 6 7   5 3 4 5 6}
        !           467:     REPLACE  1 0 {1 4 5 6 7   2 2 3 4 5                           5 3 4 5 6}
        !           468:   }
        !           469: 
        !           470:   4    "INSERT %CONF% INTO t1 VALUES(2, 7, 6, 7, 7)" {
        !           471:     ROLLBACK 0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
        !           472:     ABORT    0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           473:     IGNORE   0 0 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           474:     FAIL     0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           475:     REPLACE  0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
        !           476:   }
        !           477: 
        !           478: } {
        !           479:   foreach {mode uses error data} $testdata {
        !           480:     db_restore_and_reopen
        !           481: 
        !           482:     set sql [string map [list %CONF% "OR $mode"] $sql_template]
        !           483:     set testname "12.$tn.[string tolower $mode]"
        !           484: 
        !           485:     execsql {
        !           486:       BEGIN;
        !           487:         INSERT INTO t1 VALUES(4,   4, 5, 6, 7);
        !           488:     }
        !           489: 
        !           490:     set res(0) {0 {}}
        !           491:     set res(1) {1 {constraint failed}}
        !           492:     do_catchsql_test $testname.1 $sql $res($error)
        !           493:     do_test $testname.2 [list sql_uses_stmt db $sql] $uses
        !           494:     do_execsql_test $testname.3 { SELECT * FROM t1 ORDER BY idx } $data
        !           495: 
        !           496:     do_test $testname.4 { rtree_check db t1 } 0
        !           497:     db close
        !           498:   }
        !           499: }
        !           500: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>