Annotation of embedaddon/sqlite3/test/autoinc.test, revision 1.1

1.1     ! misho       1: # 2004 November 12
        !             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.  The
        !            12: # focus of this script is testing the AUTOINCREMENT features.
        !            13: #
        !            14: # $Id: autoinc.test,v 1.14 2009/06/23 20:28:54 drh Exp $
        !            15: #
        !            16: 
        !            17: set testdir [file dirname $argv0]
        !            18: source $testdir/tester.tcl
        !            19: 
        !            20: # If the library is not compiled with autoincrement support then
        !            21: # skip all tests in this file.
        !            22: #
        !            23: ifcapable {!autoinc} {
        !            24:   finish_test
        !            25:   return
        !            26: }
        !            27: 
        !            28: sqlite3_db_config_lookaside db 0 0 0
        !            29: 
        !            30: # The database is initially empty.
        !            31: #
        !            32: do_test autoinc-1.1 {
        !            33:   execsql {
        !            34:     SELECT name FROM sqlite_master WHERE type='table';
        !            35:   }
        !            36: } {}
        !            37: 
        !            38: # Add a table with the AUTOINCREMENT feature.  Verify that the
        !            39: # SQLITE_SEQUENCE table gets created.
        !            40: #
        !            41: do_test autoinc-1.2 {
        !            42:   execsql {
        !            43:     CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
        !            44:     SELECT name FROM sqlite_master WHERE type='table';
        !            45:   }
        !            46: } {t1 sqlite_sequence}
        !            47: 
        !            48: # The SQLITE_SEQUENCE table is initially empty
        !            49: #
        !            50: do_test autoinc-1.3 {
        !            51:   execsql {
        !            52:     SELECT * FROM sqlite_sequence;
        !            53:   }
        !            54: } {}
        !            55: do_test autoinc-1.3.1 {
        !            56:   catchsql {
        !            57:     CREATE INDEX seqidx ON sqlite_sequence(name)
        !            58:   }
        !            59: } {1 {table sqlite_sequence may not be indexed}}
        !            60: 
        !            61: # Close and reopen the database.  Verify that everything is still there.
        !            62: #
        !            63: do_test autoinc-1.4 {
        !            64:   db close
        !            65:   sqlite3 db test.db
        !            66:   execsql {
        !            67:     SELECT * FROM sqlite_sequence;
        !            68:   }
        !            69: } {}
        !            70: 
        !            71: # We are not allowed to drop the sqlite_sequence table.
        !            72: #
        !            73: do_test autoinc-1.5 {
        !            74:   catchsql {DROP TABLE sqlite_sequence}
        !            75: } {1 {table sqlite_sequence may not be dropped}}
        !            76: do_test autoinc-1.6 {
        !            77:   execsql {SELECT name FROM sqlite_master WHERE type='table'}
        !            78: } {t1 sqlite_sequence}
        !            79: 
        !            80: # Insert an entries into the t1 table and make sure the largest key
        !            81: # is always recorded in the sqlite_sequence table.
        !            82: #
        !            83: do_test autoinc-2.1 {
        !            84:   execsql {
        !            85:     SELECT * FROM sqlite_sequence
        !            86:   }
        !            87: } {}
        !            88: do_test autoinc-2.2 {
        !            89:   execsql {
        !            90:     INSERT INTO t1 VALUES(12,34);
        !            91:     SELECT * FROM sqlite_sequence;
        !            92:   }
        !            93: } {t1 12}
        !            94: do_test autoinc-2.3 {
        !            95:   execsql {
        !            96:     INSERT INTO t1 VALUES(1,23);
        !            97:     SELECT * FROM sqlite_sequence;
        !            98:   }
        !            99: } {t1 12}
        !           100: do_test autoinc-2.4 {
        !           101:   execsql {
        !           102:     INSERT INTO t1 VALUES(123,456);
        !           103:     SELECT * FROM sqlite_sequence;
        !           104:   }
        !           105: } {t1 123}
        !           106: do_test autoinc-2.5 {
        !           107:   execsql {
        !           108:     INSERT INTO t1 VALUES(NULL,567);
        !           109:     SELECT * FROM sqlite_sequence;
        !           110:   }
        !           111: } {t1 124}
        !           112: do_test autoinc-2.6 {
        !           113:   execsql {
        !           114:     DELETE FROM t1 WHERE y=567;
        !           115:     SELECT * FROM sqlite_sequence;
        !           116:   }
        !           117: } {t1 124}
        !           118: do_test autoinc-2.7 {
        !           119:   execsql {
        !           120:     INSERT INTO t1 VALUES(NULL,567);
        !           121:     SELECT * FROM sqlite_sequence;
        !           122:   }
        !           123: } {t1 125}
        !           124: do_test autoinc-2.8 {
        !           125:   execsql {
        !           126:     DELETE FROM t1;
        !           127:     SELECT * FROM sqlite_sequence;
        !           128:   }
        !           129: } {t1 125}
        !           130: do_test autoinc-2.9 {
        !           131:   execsql {
        !           132:     INSERT INTO t1 VALUES(12,34);
        !           133:     SELECT * FROM sqlite_sequence;
        !           134:   }
        !           135: } {t1 125}
        !           136: do_test autoinc-2.10 {
        !           137:   execsql {
        !           138:     INSERT INTO t1 VALUES(125,456);
        !           139:     SELECT * FROM sqlite_sequence;
        !           140:   }
        !           141: } {t1 125}
        !           142: do_test autoinc-2.11 {
        !           143:   execsql {
        !           144:     INSERT INTO t1 VALUES(-1234567,-1);
        !           145:     SELECT * FROM sqlite_sequence;
        !           146:   }
        !           147: } {t1 125}
        !           148: do_test autoinc-2.12 {
        !           149:   execsql {
        !           150:     INSERT INTO t1 VALUES(234,5678);
        !           151:     SELECT * FROM sqlite_sequence;
        !           152:   }
        !           153: } {t1 234}
        !           154: do_test autoinc-2.13 {
        !           155:   execsql {
        !           156:     DELETE FROM t1;
        !           157:     INSERT INTO t1 VALUES(NULL,1);
        !           158:     SELECT * FROM sqlite_sequence;
        !           159:   }
        !           160: } {t1 235}
        !           161: do_test autoinc-2.14 {
        !           162:   execsql {
        !           163:     SELECT * FROM t1;
        !           164:   }
        !           165: } {235 1}
        !           166: 
        !           167: # Manually change the autoincrement values in sqlite_sequence.
        !           168: #
        !           169: do_test autoinc-2.20 {
        !           170:   execsql {
        !           171:     UPDATE sqlite_sequence SET seq=1234 WHERE name='t1';
        !           172:     INSERT INTO t1 VALUES(NULL,2);
        !           173:     SELECT * FROM t1;
        !           174:   }
        !           175: } {235 1 1235 2}
        !           176: do_test autoinc-2.21 {
        !           177:   execsql {
        !           178:     SELECT * FROM sqlite_sequence;
        !           179:   }
        !           180: } {t1 1235}
        !           181: do_test autoinc-2.22 {
        !           182:   execsql {
        !           183:     UPDATE sqlite_sequence SET seq=NULL WHERE name='t1';
        !           184:     INSERT INTO t1 VALUES(NULL,3);
        !           185:     SELECT * FROM t1;
        !           186:   }
        !           187: } {235 1 1235 2 1236 3}
        !           188: do_test autoinc-2.23 {
        !           189:   execsql {
        !           190:     SELECT * FROM sqlite_sequence;
        !           191:   }
        !           192: } {t1 1236}
        !           193: do_test autoinc-2.24 {
        !           194:   execsql {
        !           195:     UPDATE sqlite_sequence SET seq='a-string' WHERE name='t1';
        !           196:     INSERT INTO t1 VALUES(NULL,4);
        !           197:     SELECT * FROM t1;
        !           198:   }
        !           199: } {235 1 1235 2 1236 3 1237 4}
        !           200: do_test autoinc-2.25 {
        !           201:   execsql {
        !           202:     SELECT * FROM sqlite_sequence;
        !           203:   }
        !           204: } {t1 1237}
        !           205: do_test autoinc-2.26 {
        !           206:   execsql {
        !           207:     DELETE FROM sqlite_sequence WHERE name='t1';
        !           208:     INSERT INTO t1 VALUES(NULL,5);
        !           209:     SELECT * FROM t1;
        !           210:   }
        !           211: } {235 1 1235 2 1236 3 1237 4 1238 5}
        !           212: do_test autoinc-2.27 {
        !           213:   execsql {
        !           214:     SELECT * FROM sqlite_sequence;
        !           215:   }
        !           216: } {t1 1238}
        !           217: do_test autoinc-2.28 {
        !           218:   execsql {
        !           219:     UPDATE sqlite_sequence SET seq='12345678901234567890'
        !           220:       WHERE name='t1';
        !           221:     INSERT INTO t1 VALUES(NULL,6);
        !           222:     SELECT * FROM t1;
        !           223:   }
        !           224: } {235 1 1235 2 1236 3 1237 4 1238 5 1239 6}
        !           225: do_test autoinc-2.29 {
        !           226:   execsql {
        !           227:     SELECT * FROM sqlite_sequence;
        !           228:   }
        !           229: } {t1 1239}
        !           230: 
        !           231: # Test multi-row inserts
        !           232: #
        !           233: do_test autoinc-2.50 {
        !           234:   execsql {
        !           235:     DELETE FROM t1 WHERE y>=3;
        !           236:     INSERT INTO t1 SELECT NULL, y+2 FROM t1;
        !           237:     SELECT * FROM t1;
        !           238:   }
        !           239: } {235 1 1235 2 1240 3 1241 4}
        !           240: do_test autoinc-2.51 {
        !           241:   execsql {
        !           242:     SELECT * FROM sqlite_sequence
        !           243:   }
        !           244: } {t1 1241}
        !           245: 
        !           246: ifcapable tempdb {
        !           247:   do_test autoinc-2.52 {
        !           248:     execsql {
        !           249:       CREATE TEMP TABLE t2 AS SELECT y FROM t1;
        !           250:     }
        !           251:     execsql {
        !           252:       INSERT INTO t1 SELECT NULL, y+4 FROM t2;
        !           253:       SELECT * FROM t1;
        !           254:     }
        !           255:   } {235 1 1235 2 1240 3 1241 4 1242 5 1243 6 1244 7 1245 8}
        !           256:   do_test autoinc-2.53 {
        !           257:     execsql {
        !           258:       SELECT * FROM sqlite_sequence
        !           259:     }
        !           260:   } {t1 1245}
        !           261:   do_test autoinc-2.54 {
        !           262:     execsql {
        !           263:       DELETE FROM t1;
        !           264:       INSERT INTO t1 SELECT NULL, y FROM t2;
        !           265:       SELECT * FROM t1;
        !           266:     }
        !           267:   } {1246 1 1247 2 1248 3 1249 4}
        !           268:   do_test autoinc-2.55 {
        !           269:     execsql {
        !           270:       SELECT * FROM sqlite_sequence
        !           271:     }
        !           272:   } {t1 1249}
        !           273: }
        !           274: 
        !           275: # Create multiple AUTOINCREMENT tables.  Make sure all sequences are
        !           276: # tracked separately and do not interfere with one another.
        !           277: #
        !           278: do_test autoinc-2.70 {
        !           279:   catchsql {
        !           280:     DROP TABLE t2;
        !           281:   }
        !           282:   execsql {
        !           283:     CREATE TABLE t2(d, e INTEGER PRIMARY KEY AUTOINCREMENT, f);
        !           284:     INSERT INTO t2(d) VALUES(1);
        !           285:     SELECT * FROM sqlite_sequence;
        !           286:   }
        !           287: } [ifcapable tempdb {list t1 1249 t2 1} else {list t1 1241 t2 1}]
        !           288: do_test autoinc-2.71 {
        !           289:   execsql {
        !           290:     INSERT INTO t2(d) VALUES(2);
        !           291:     SELECT * FROM sqlite_sequence;
        !           292:   }
        !           293: } [ifcapable tempdb {list t1 1249 t2 2} else {list t1 1241 t2 2}]
        !           294: do_test autoinc-2.72 {
        !           295:   execsql {
        !           296:     INSERT INTO t1(x) VALUES(10000);
        !           297:     SELECT * FROM sqlite_sequence;
        !           298:   }
        !           299: } {t1 10000 t2 2}
        !           300: do_test autoinc-2.73 {
        !           301:   execsql {
        !           302:     CREATE TABLE t3(g INTEGER PRIMARY KEY AUTOINCREMENT, h);
        !           303:     INSERT INTO t3(h) VALUES(1);
        !           304:     SELECT * FROM sqlite_sequence;
        !           305:   }
        !           306: } {t1 10000 t2 2 t3 1}
        !           307: do_test autoinc-2.74 {
        !           308:   execsql {
        !           309:     INSERT INTO t2(d,e) VALUES(3,100);
        !           310:     SELECT * FROM sqlite_sequence;
        !           311:   }
        !           312: } {t1 10000 t2 100 t3 1}
        !           313: 
        !           314: 
        !           315: # When a table with an AUTOINCREMENT is deleted, the corresponding entry
        !           316: # in the SQLITE_SEQUENCE table should also be deleted.  But the SQLITE_SEQUENCE
        !           317: # table itself should remain behind.
        !           318: #
        !           319: do_test autoinc-3.1 {
        !           320:   execsql {SELECT name FROM sqlite_sequence}
        !           321: } {t1 t2 t3}
        !           322: do_test autoinc-3.2 {
        !           323:   execsql {
        !           324:     DROP TABLE t1;
        !           325:     SELECT name FROM sqlite_sequence;
        !           326:   }
        !           327: } {t2 t3}
        !           328: do_test autoinc-3.3 {
        !           329:   execsql {
        !           330:     DROP TABLE t3;
        !           331:     SELECT name FROM sqlite_sequence;
        !           332:   }
        !           333: } {t2}
        !           334: do_test autoinc-3.4 {
        !           335:   execsql {
        !           336:     DROP TABLE t2;
        !           337:     SELECT name FROM sqlite_sequence;
        !           338:   }
        !           339: } {}
        !           340: 
        !           341: # AUTOINCREMENT on TEMP tables.
        !           342: #
        !           343: ifcapable tempdb {
        !           344:   do_test autoinc-4.1 {
        !           345:     execsql {
        !           346:       SELECT 1, name FROM sqlite_master WHERE type='table';
        !           347:       SELECT 2, name FROM sqlite_temp_master WHERE type='table';
        !           348:     }
        !           349:   } {1 sqlite_sequence}
        !           350:   do_test autoinc-4.2 {
        !           351:     execsql {
        !           352:       CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
        !           353:       CREATE TEMP TABLE t3(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
        !           354:       SELECT 1, name FROM sqlite_master WHERE type='table';
        !           355:       SELECT 2, name FROM sqlite_temp_master WHERE type='table';
        !           356:     }
        !           357:   } {1 sqlite_sequence 1 t1 2 t3 2 sqlite_sequence}
        !           358:   do_test autoinc-4.3 {
        !           359:     execsql {
        !           360:       SELECT 1, * FROM main.sqlite_sequence;
        !           361:       SELECT 2, * FROM temp.sqlite_sequence;
        !           362:     }
        !           363:   } {}
        !           364:   do_test autoinc-4.4 {
        !           365:     execsql {
        !           366:       INSERT INTO t1 VALUES(10,1);
        !           367:       INSERT INTO t3 VALUES(20,2);
        !           368:       INSERT INTO t1 VALUES(NULL,3);
        !           369:       INSERT INTO t3 VALUES(NULL,4);
        !           370:     }
        !           371:   } {}
        !           372:   
        !           373:   ifcapable compound {
        !           374:   do_test autoinc-4.4.1 {
        !           375:     execsql {
        !           376:       SELECT * FROM t1 UNION ALL SELECT * FROM t3;
        !           377:     }
        !           378:   } {10 1 11 3 20 2 21 4}
        !           379:   } ;# ifcapable compound
        !           380:   
        !           381:   do_test autoinc-4.5 {
        !           382:     execsql {
        !           383:       SELECT 1, * FROM main.sqlite_sequence;
        !           384:       SELECT 2, * FROM temp.sqlite_sequence;
        !           385:     }
        !           386:   } {1 t1 11 2 t3 21}
        !           387:   do_test autoinc-4.6 {
        !           388:     execsql {
        !           389:       INSERT INTO t1 SELECT * FROM t3;
        !           390:       SELECT 1, * FROM main.sqlite_sequence;
        !           391:       SELECT 2, * FROM temp.sqlite_sequence;
        !           392:     }
        !           393:   } {1 t1 21 2 t3 21}
        !           394:   do_test autoinc-4.7 {
        !           395:     execsql {
        !           396:       INSERT INTO t3 SELECT x+100, y  FROM t1;
        !           397:       SELECT 1, * FROM main.sqlite_sequence;
        !           398:       SELECT 2, * FROM temp.sqlite_sequence;
        !           399:     }
        !           400:   } {1 t1 21 2 t3 121}
        !           401:   do_test autoinc-4.8 {
        !           402:     execsql {
        !           403:       DROP TABLE t3;
        !           404:       SELECT 1, * FROM main.sqlite_sequence;
        !           405:       SELECT 2, * FROM temp.sqlite_sequence;
        !           406:     }
        !           407:   } {1 t1 21}
        !           408:   do_test autoinc-4.9 {
        !           409:     execsql {
        !           410:       CREATE TEMP TABLE t2(p INTEGER PRIMARY KEY AUTOINCREMENT, q);
        !           411:       INSERT INTO t2 SELECT * FROM t1;
        !           412:       DROP TABLE t1;
        !           413:       SELECT 1, * FROM main.sqlite_sequence;
        !           414:       SELECT 2, * FROM temp.sqlite_sequence;
        !           415:     }
        !           416:   } {2 t2 21}
        !           417:   do_test autoinc-4.10 {
        !           418:     execsql {
        !           419:       DROP TABLE t2;
        !           420:       SELECT 1, * FROM main.sqlite_sequence;
        !           421:       SELECT 2, * FROM temp.sqlite_sequence;
        !           422:     }
        !           423:   } {}
        !           424: }
        !           425: 
        !           426: # Make sure AUTOINCREMENT works on ATTACH-ed tables.
        !           427: #
        !           428: ifcapable tempdb&&attach {
        !           429:   do_test autoinc-5.1 {
        !           430:     forcedelete test2.db
        !           431:     forcedelete test2.db-journal
        !           432:     sqlite3 db2 test2.db
        !           433:     execsql {
        !           434:       CREATE TABLE t4(m INTEGER PRIMARY KEY AUTOINCREMENT, n);
        !           435:       CREATE TABLE t5(o, p INTEGER PRIMARY KEY AUTOINCREMENT);
        !           436:     } db2;
        !           437:     execsql {
        !           438:       ATTACH 'test2.db' as aux;
        !           439:       SELECT 1, * FROM main.sqlite_sequence;
        !           440:       SELECT 2, * FROM temp.sqlite_sequence;
        !           441:       SELECT 3, * FROM aux.sqlite_sequence;
        !           442:     }
        !           443:   } {}
        !           444:   do_test autoinc-5.2 {
        !           445:     execsql {
        !           446:       INSERT INTO t4 VALUES(NULL,1);
        !           447:       SELECT 1, * FROM main.sqlite_sequence;
        !           448:       SELECT 2, * FROM temp.sqlite_sequence;
        !           449:       SELECT 3, * FROM aux.sqlite_sequence;
        !           450:     }
        !           451:   } {3 t4 1}
        !           452:   do_test autoinc-5.3 {
        !           453:     execsql {
        !           454:       INSERT INTO t5 VALUES(100,200);
        !           455:       SELECT * FROM sqlite_sequence
        !           456:     } db2
        !           457:   } {t4 1 t5 200}
        !           458:   do_test autoinc-5.4 {
        !           459:     execsql {
        !           460:       SELECT 1, * FROM main.sqlite_sequence;
        !           461:       SELECT 2, * FROM temp.sqlite_sequence;
        !           462:       SELECT 3, * FROM aux.sqlite_sequence;
        !           463:     }
        !           464:   } {3 t4 1 3 t5 200}
        !           465: }
        !           466: 
        !           467: # Requirement REQ00310:  Make sure an insert fails if the sequence is
        !           468: # already at its maximum value.
        !           469: #
        !           470: ifcapable {rowid32} {
        !           471:   do_test autoinc-6.1 {
        !           472:     execsql {
        !           473:       CREATE TABLE t6(v INTEGER PRIMARY KEY AUTOINCREMENT, w);
        !           474:       INSERT INTO t6 VALUES(2147483647,1);
        !           475:       SELECT seq FROM main.sqlite_sequence WHERE name='t6';
        !           476:     }
        !           477:   } 2147483647
        !           478: }
        !           479: ifcapable {!rowid32} {
        !           480:   do_test autoinc-6.1 {
        !           481:     execsql {
        !           482:       CREATE TABLE t6(v INTEGER PRIMARY KEY AUTOINCREMENT, w);
        !           483:       INSERT INTO t6 VALUES(9223372036854775807,1);
        !           484:       SELECT seq FROM main.sqlite_sequence WHERE name='t6';
        !           485:     }
        !           486:   } 9223372036854775807
        !           487: }
        !           488: do_test autoinc-6.2 {
        !           489:   catchsql {
        !           490:     INSERT INTO t6 VALUES(NULL,1);
        !           491:   }
        !           492: } {1 {database or disk is full}}
        !           493: 
        !           494: # Allow the AUTOINCREMENT keyword inside the parentheses
        !           495: # on a separate PRIMARY KEY designation.
        !           496: #
        !           497: do_test autoinc-7.1 {
        !           498:   execsql {
        !           499:     CREATE TABLE t7(x INTEGER, y REAL, PRIMARY KEY(x AUTOINCREMENT));
        !           500:     INSERT INTO t7(y) VALUES(123);
        !           501:     INSERT INTO t7(y) VALUES(234);
        !           502:     DELETE FROM t7;
        !           503:     INSERT INTO t7(y) VALUES(345);
        !           504:     SELECT * FROM t7;
        !           505:   }
        !           506: } {3 345.0}
        !           507: 
        !           508: # Test that if the AUTOINCREMENT is applied to a non integer primary key
        !           509: # the error message is sensible.
        !           510: do_test autoinc-7.2 {
        !           511:   catchsql {
        !           512:     CREATE TABLE t8(x TEXT PRIMARY KEY AUTOINCREMENT);
        !           513:   }
        !           514: } {1 {AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY}}
        !           515: 
        !           516: 
        !           517: # Ticket #1283.  Make sure that preparing but never running a statement
        !           518: # that creates the sqlite_sequence table does not mess up the database.
        !           519: #
        !           520: do_test autoinc-8.1 {
        !           521:   catch {db2 close}
        !           522:   catch {db close}
        !           523:   forcedelete test.db
        !           524:   sqlite3 db test.db
        !           525:   set DB [sqlite3_connection_pointer db]
        !           526:   set STMT [sqlite3_prepare $DB {
        !           527:      CREATE TABLE t1(
        !           528:        x INTEGER PRIMARY KEY AUTOINCREMENT
        !           529:      )
        !           530:   } -1 TAIL]
        !           531:   sqlite3_finalize $STMT
        !           532:   set STMT [sqlite3_prepare $DB {
        !           533:      CREATE TABLE t1(
        !           534:        x INTEGER PRIMARY KEY AUTOINCREMENT
        !           535:      )
        !           536:   } -1 TAIL]
        !           537:   sqlite3_step $STMT
        !           538:   sqlite3_finalize $STMT
        !           539:   execsql {
        !           540:     INSERT INTO t1 VALUES(NULL);
        !           541:     SELECT * FROM t1;
        !           542:   }
        !           543: } {1}
        !           544: 
        !           545: # Ticket #3148
        !           546: # Make sure the sqlite_sequence table is not damaged when doing
        !           547: # an empty insert - an INSERT INTO ... SELECT ... where the SELECT
        !           548: # clause returns an empty set.
        !           549: #
        !           550: do_test autoinc-9.1 {
        !           551:   db eval {
        !           552:     CREATE TABLE t2(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
        !           553:     INSERT INTO t2 VALUES(NULL, 1);
        !           554:     CREATE TABLE t3(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
        !           555:     INSERT INTO t3 SELECT * FROM t2 WHERE y>1;
        !           556: 
        !           557:     SELECT * FROM sqlite_sequence WHERE name='t3';
        !           558:   }
        !           559: } {t3 0}
        !           560: 
        !           561: ifcapable trigger {
        !           562:   catchsql { pragma recursive_triggers = off } 
        !           563:   
        !           564:   # Ticket #3928.  Make sure that triggers to not make extra slots in
        !           565:   # the SQLITE_SEQUENCE table.
        !           566:   #
        !           567:   do_test autoinc-3928.1 {
        !           568:     db eval {
        !           569:       CREATE TABLE t3928(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
        !           570:       CREATE TRIGGER t3928r1 BEFORE INSERT ON t3928 BEGIN
        !           571:         INSERT INTO t3928(b) VALUES('before1');
        !           572:         INSERT INTO t3928(b) VALUES('before2');
        !           573:       END;
        !           574:       CREATE TRIGGER t3928r2 AFTER INSERT ON t3928 BEGIN
        !           575:         INSERT INTO t3928(b) VALUES('after1');
        !           576:         INSERT INTO t3928(b) VALUES('after2');
        !           577:       END;
        !           578:       INSERT INTO t3928(b) VALUES('test');
        !           579:       SELECT * FROM t3928 ORDER BY a;
        !           580:     }
        !           581:   } {1 before1 2 after1 3 after2 4 before2 5 after1 6 after2 7 test 8 before1 9 before2 10 after1 11 before1 12 before2 13 after2}
        !           582:   do_test autoinc-3928.2 {
        !           583:     db eval {
        !           584:       SELECT * FROM sqlite_sequence WHERE name='t3928'
        !           585:     }
        !           586:   } {t3928 13}
        !           587: 
        !           588:   do_test autoinc-3928.3 {
        !           589:     db eval {
        !           590:       DROP TRIGGER t3928r1;
        !           591:       DROP TRIGGER t3928r2;
        !           592:       CREATE TRIGGER t3928r3 BEFORE UPDATE ON t3928 
        !           593:         WHEN typeof(new.b)=='integer' BEGIN
        !           594:            INSERT INTO t3928(b) VALUES('before-int-' || new.b);
        !           595:       END;
        !           596:       CREATE TRIGGER t3928r4 AFTER UPDATE ON t3928 
        !           597:         WHEN typeof(new.b)=='integer' BEGIN
        !           598:            INSERT INTO t3928(b) VALUES('after-int-' || new.b);
        !           599:       END;
        !           600:       DELETE FROM t3928 WHERE a!=1;
        !           601:       UPDATE t3928 SET b=456 WHERE a=1;
        !           602:       SELECT * FROM t3928 ORDER BY a;
        !           603:     }
        !           604:   } {1 456 14 before-int-456 15 after-int-456}
        !           605:   do_test autoinc-3928.4 {
        !           606:     db eval {
        !           607:       SELECT * FROM sqlite_sequence WHERE name='t3928'
        !           608:     }
        !           609:   } {t3928 15}
        !           610:   
        !           611:   do_test autoinc-3928.5 {
        !           612:     db eval {
        !           613:       CREATE TABLE t3928b(x);
        !           614:       INSERT INTO t3928b VALUES(100);
        !           615:       INSERT INTO t3928b VALUES(200);
        !           616:       INSERT INTO t3928b VALUES(300);
        !           617:       DELETE FROM t3928;
        !           618:       CREATE TABLE t3928c(y INTEGER PRIMARY KEY AUTOINCREMENT, z);
        !           619:       CREATE TRIGGER t3928br1 BEFORE DELETE ON t3928b BEGIN
        !           620:         INSERT INTO t3928(b) VALUES('before-del-'||old.x);
        !           621:         INSERT INTO t3928c(z) VALUES('before-del-'||old.x);
        !           622:       END;
        !           623:       CREATE TRIGGER t3928br2 AFTER DELETE ON t3928b BEGIN
        !           624:         INSERT INTO t3928(b) VALUES('after-del-'||old.x);
        !           625:         INSERT INTO t3928c(z) VALUES('after-del-'||old.x);
        !           626:       END;
        !           627:       DELETE FROM t3928b;
        !           628:       SELECT * FROM t3928 ORDER BY a;
        !           629:     }
        !           630:   } {16 before-del-100 17 after-del-100 18 before-del-200 19 after-del-200 20 before-del-300 21 after-del-300}
        !           631:   do_test autoinc-3928.6 {
        !           632:     db eval {
        !           633:       SELECT * FROM t3928c ORDER BY y;
        !           634:     }
        !           635:   } {1 before-del-100 2 after-del-100 3 before-del-200 4 after-del-200 5 before-del-300 6 after-del-300}
        !           636:   do_test autoinc-3928.7 {
        !           637:     db eval {
        !           638:       SELECT * FROM sqlite_sequence WHERE name LIKE 't3928%' ORDER BY name;
        !           639:     }
        !           640:   } {t3928 21 t3928c 6}
        !           641:   
        !           642:   # Ticket [a696379c1f0886615541a48b35bd8181a80e88f8]
        !           643:   do_test autoinc-a69637.1 {
        !           644:     db eval {
        !           645:       CREATE TABLE ta69637_1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
        !           646:       CREATE TABLE ta69637_2(z);
        !           647:       CREATE TRIGGER ra69637_1 AFTER INSERT ON ta69637_2 BEGIN
        !           648:         INSERT INTO ta69637_1(y) VALUES(new.z+1);
        !           649:       END;
        !           650:       INSERT INTO ta69637_2 VALUES(123);
        !           651:       SELECT * FROM ta69637_1;
        !           652:     }
        !           653:   } {1 124}
        !           654:   do_test autoinc-a69637.2 {
        !           655:     db eval {
        !           656:       CREATE VIEW va69637_2 AS SELECT * FROM ta69637_2;
        !           657:       CREATE TRIGGER ra69637_2 INSTEAD OF INSERT ON va69637_2 BEGIN
        !           658:         INSERT INTO ta69637_1(y) VALUES(new.z+10000);
        !           659:       END;
        !           660:       INSERT INTO va69637_2 VALUES(123);
        !           661:       SELECT * FROM ta69637_1;
        !           662:     }
        !           663:   } {1 124 2 10123}
        !           664: }
        !           665: 
        !           666: 
        !           667: 
        !           668: finish_test

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