Annotation of embedaddon/sqlite3/test/autoinc.test, revision 1.1.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>