1f3388144Sdrh# 2004 November 12 2f3388144Sdrh# 3f3388144Sdrh# The author disclaims copyright to this source code. In place of 4f3388144Sdrh# a legal notice, here is a blessing: 5f3388144Sdrh# 6f3388144Sdrh# May you do good and not evil. 7f3388144Sdrh# May you find forgiveness for yourself and forgive others. 8f3388144Sdrh# May you share freely, never taking more than you give. 9f3388144Sdrh# 10f3388144Sdrh#************************************************************************* 11f3388144Sdrh# This file implements regression tests for SQLite library. The 12f3388144Sdrh# focus of this script is testing the AUTOINCREMENT features. 13f3388144Sdrh# 140b9f50d8Sdrh# $Id: autoinc.test,v 1.14 2009/06/23 20:28:54 drh Exp $ 15f3388144Sdrh# 16f3388144Sdrh 17f3388144Sdrhset testdir [file dirname $argv0] 18f3388144Sdrhsource $testdir/tester.tcl 19*b84b38fdSdanset testprefix autoinc 20f3388144Sdrh 21f3388144Sdrh# If the library is not compiled with autoincrement support then 22f3388144Sdrh# skip all tests in this file. 23f3388144Sdrh# 24f3388144Sdrhifcapable {!autoinc} { 25f3388144Sdrh finish_test 26f3388144Sdrh return 27f3388144Sdrh} 28f3388144Sdrh 29867e6de4Sdanif {[permutation]=="inmemory_journal"} { 30867e6de4Sdan finish_test 31867e6de4Sdan return 32867e6de4Sdan} 33867e6de4Sdan 34165921a7Sdansqlite3_db_config_lookaside db 0 0 0 35165921a7Sdan 36f3388144Sdrh# The database is initially empty. 37f3388144Sdrh# 38f3388144Sdrhdo_test autoinc-1.1 { 39f3388144Sdrh execsql { 40f3388144Sdrh SELECT name FROM sqlite_master WHERE type='table'; 41f3388144Sdrh } 42f3388144Sdrh} {} 43f3388144Sdrh 44f3388144Sdrh# Add a table with the AUTOINCREMENT feature. Verify that the 45f3388144Sdrh# SQLITE_SEQUENCE table gets created. 46f3388144Sdrh# 47f3388144Sdrhdo_test autoinc-1.2 { 48f3388144Sdrh execsql { 49f3388144Sdrh CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y); 50f3388144Sdrh SELECT name FROM sqlite_master WHERE type='table'; 51f3388144Sdrh } 52f3388144Sdrh} {t1 sqlite_sequence} 53f3388144Sdrh 54f3388144Sdrh# The SQLITE_SEQUENCE table is initially empty 55f3388144Sdrh# 56f3388144Sdrhdo_test autoinc-1.3 { 57f3388144Sdrh execsql { 58f3388144Sdrh SELECT * FROM sqlite_sequence; 59f3388144Sdrh } 60f3388144Sdrh} {} 61c456e57aSdrhdo_test autoinc-1.3.1 { 62c456e57aSdrh catchsql { 63c456e57aSdrh CREATE INDEX seqidx ON sqlite_sequence(name) 64c456e57aSdrh } 65c456e57aSdrh} {1 {table sqlite_sequence may not be indexed}} 66f3388144Sdrh 67f3388144Sdrh# Close and reopen the database. Verify that everything is still there. 68f3388144Sdrh# 69f3388144Sdrhdo_test autoinc-1.4 { 70f3388144Sdrh db close 71f3388144Sdrh sqlite3 db test.db 72f3388144Sdrh execsql { 73f3388144Sdrh SELECT * FROM sqlite_sequence; 74f3388144Sdrh } 75f3388144Sdrh} {} 76f3388144Sdrh 77f3388144Sdrh# We are not allowed to drop the sqlite_sequence table. 78f3388144Sdrh# 79f3388144Sdrhdo_test autoinc-1.5 { 80f3388144Sdrh catchsql {DROP TABLE sqlite_sequence} 81f3388144Sdrh} {1 {table sqlite_sequence may not be dropped}} 82f3388144Sdrhdo_test autoinc-1.6 { 83f3388144Sdrh execsql {SELECT name FROM sqlite_master WHERE type='table'} 84f3388144Sdrh} {t1 sqlite_sequence} 85f3388144Sdrh 86f3388144Sdrh# Insert an entries into the t1 table and make sure the largest key 87f3388144Sdrh# is always recorded in the sqlite_sequence table. 88f3388144Sdrh# 89f3388144Sdrhdo_test autoinc-2.1 { 90f3388144Sdrh execsql { 91f3388144Sdrh SELECT * FROM sqlite_sequence 92f3388144Sdrh } 93f3388144Sdrh} {} 94f3388144Sdrhdo_test autoinc-2.2 { 95f3388144Sdrh execsql { 96f3388144Sdrh INSERT INTO t1 VALUES(12,34); 97f3388144Sdrh SELECT * FROM sqlite_sequence; 98f3388144Sdrh } 99f3388144Sdrh} {t1 12} 100f3388144Sdrhdo_test autoinc-2.3 { 101f3388144Sdrh execsql { 102f3388144Sdrh INSERT INTO t1 VALUES(1,23); 103f3388144Sdrh SELECT * FROM sqlite_sequence; 104f3388144Sdrh } 105f3388144Sdrh} {t1 12} 106f3388144Sdrhdo_test autoinc-2.4 { 107f3388144Sdrh execsql { 108f3388144Sdrh INSERT INTO t1 VALUES(123,456); 109f3388144Sdrh SELECT * FROM sqlite_sequence; 110f3388144Sdrh } 111f3388144Sdrh} {t1 123} 112f3388144Sdrhdo_test autoinc-2.5 { 113f3388144Sdrh execsql { 114f3388144Sdrh INSERT INTO t1 VALUES(NULL,567); 115f3388144Sdrh SELECT * FROM sqlite_sequence; 116f3388144Sdrh } 117f3388144Sdrh} {t1 124} 118f3388144Sdrhdo_test autoinc-2.6 { 119f3388144Sdrh execsql { 120f3388144Sdrh DELETE FROM t1 WHERE y=567; 121f3388144Sdrh SELECT * FROM sqlite_sequence; 122f3388144Sdrh } 123f3388144Sdrh} {t1 124} 124f3388144Sdrhdo_test autoinc-2.7 { 125f3388144Sdrh execsql { 126f3388144Sdrh INSERT INTO t1 VALUES(NULL,567); 127f3388144Sdrh SELECT * FROM sqlite_sequence; 128f3388144Sdrh } 129f3388144Sdrh} {t1 125} 130f3388144Sdrhdo_test autoinc-2.8 { 131f3388144Sdrh execsql { 132f3388144Sdrh DELETE FROM t1; 133f3388144Sdrh SELECT * FROM sqlite_sequence; 134f3388144Sdrh } 135f3388144Sdrh} {t1 125} 136f3388144Sdrhdo_test autoinc-2.9 { 137f3388144Sdrh execsql { 138f3388144Sdrh INSERT INTO t1 VALUES(12,34); 139f3388144Sdrh SELECT * FROM sqlite_sequence; 140f3388144Sdrh } 141f3388144Sdrh} {t1 125} 142f3388144Sdrhdo_test autoinc-2.10 { 143f3388144Sdrh execsql { 144f3388144Sdrh INSERT INTO t1 VALUES(125,456); 145f3388144Sdrh SELECT * FROM sqlite_sequence; 146f3388144Sdrh } 147f3388144Sdrh} {t1 125} 148f3388144Sdrhdo_test autoinc-2.11 { 149f3388144Sdrh execsql { 150f3388144Sdrh INSERT INTO t1 VALUES(-1234567,-1); 151f3388144Sdrh SELECT * FROM sqlite_sequence; 152f3388144Sdrh } 153f3388144Sdrh} {t1 125} 154f3388144Sdrhdo_test autoinc-2.12 { 155f3388144Sdrh execsql { 156f3388144Sdrh INSERT INTO t1 VALUES(234,5678); 157f3388144Sdrh SELECT * FROM sqlite_sequence; 158f3388144Sdrh } 159f3388144Sdrh} {t1 234} 160f3388144Sdrhdo_test autoinc-2.13 { 161f3388144Sdrh execsql { 162f3388144Sdrh DELETE FROM t1; 163f3388144Sdrh INSERT INTO t1 VALUES(NULL,1); 164f3388144Sdrh SELECT * FROM sqlite_sequence; 165f3388144Sdrh } 166f3388144Sdrh} {t1 235} 167f3388144Sdrhdo_test autoinc-2.14 { 168f3388144Sdrh execsql { 169f3388144Sdrh SELECT * FROM t1; 170f3388144Sdrh } 171f3388144Sdrh} {235 1} 172f3388144Sdrh 173f3388144Sdrh# Manually change the autoincrement values in sqlite_sequence. 174f3388144Sdrh# 175f3388144Sdrhdo_test autoinc-2.20 { 176f3388144Sdrh execsql { 177f3388144Sdrh UPDATE sqlite_sequence SET seq=1234 WHERE name='t1'; 178f3388144Sdrh INSERT INTO t1 VALUES(NULL,2); 179f3388144Sdrh SELECT * FROM t1; 180f3388144Sdrh } 181f3388144Sdrh} {235 1 1235 2} 182f3388144Sdrhdo_test autoinc-2.21 { 183f3388144Sdrh execsql { 184f3388144Sdrh SELECT * FROM sqlite_sequence; 185f3388144Sdrh } 186f3388144Sdrh} {t1 1235} 187f3388144Sdrhdo_test autoinc-2.22 { 188f3388144Sdrh execsql { 189f3388144Sdrh UPDATE sqlite_sequence SET seq=NULL WHERE name='t1'; 190f3388144Sdrh INSERT INTO t1 VALUES(NULL,3); 191f3388144Sdrh SELECT * FROM t1; 192f3388144Sdrh } 193f3388144Sdrh} {235 1 1235 2 1236 3} 194f3388144Sdrhdo_test autoinc-2.23 { 195f3388144Sdrh execsql { 196f3388144Sdrh SELECT * FROM sqlite_sequence; 197f3388144Sdrh } 198f3388144Sdrh} {t1 1236} 199f3388144Sdrhdo_test autoinc-2.24 { 200f3388144Sdrh execsql { 201f3388144Sdrh UPDATE sqlite_sequence SET seq='a-string' WHERE name='t1'; 202f3388144Sdrh INSERT INTO t1 VALUES(NULL,4); 203f3388144Sdrh SELECT * FROM t1; 204f3388144Sdrh } 205f3388144Sdrh} {235 1 1235 2 1236 3 1237 4} 206f3388144Sdrhdo_test autoinc-2.25 { 207f3388144Sdrh execsql { 208f3388144Sdrh SELECT * FROM sqlite_sequence; 209f3388144Sdrh } 210f3388144Sdrh} {t1 1237} 211f3388144Sdrhdo_test autoinc-2.26 { 212f3388144Sdrh execsql { 213f3388144Sdrh DELETE FROM sqlite_sequence WHERE name='t1'; 214f3388144Sdrh INSERT INTO t1 VALUES(NULL,5); 215f3388144Sdrh SELECT * FROM t1; 216f3388144Sdrh } 217f3388144Sdrh} {235 1 1235 2 1236 3 1237 4 1238 5} 218f3388144Sdrhdo_test autoinc-2.27 { 219f3388144Sdrh execsql { 220f3388144Sdrh SELECT * FROM sqlite_sequence; 221f3388144Sdrh } 222f3388144Sdrh} {t1 1238} 223f3388144Sdrhdo_test autoinc-2.28 { 224f3388144Sdrh execsql { 225de1a8b8cSdrh UPDATE sqlite_sequence SET seq='-12345678901234567890' 226f3388144Sdrh WHERE name='t1'; 227f3388144Sdrh INSERT INTO t1 VALUES(NULL,6); 228f3388144Sdrh SELECT * FROM t1; 229f3388144Sdrh } 230f3388144Sdrh} {235 1 1235 2 1236 3 1237 4 1238 5 1239 6} 231f3388144Sdrhdo_test autoinc-2.29 { 232f3388144Sdrh execsql { 233f3388144Sdrh SELECT * FROM sqlite_sequence; 234f3388144Sdrh } 235f3388144Sdrh} {t1 1239} 236f3388144Sdrh 237f3388144Sdrh# Test multi-row inserts 238f3388144Sdrh# 239f3388144Sdrhdo_test autoinc-2.50 { 240f3388144Sdrh execsql { 241f3388144Sdrh DELETE FROM t1 WHERE y>=3; 242f3388144Sdrh INSERT INTO t1 SELECT NULL, y+2 FROM t1; 243f3388144Sdrh SELECT * FROM t1; 244f3388144Sdrh } 245f3388144Sdrh} {235 1 1235 2 1240 3 1241 4} 246f3388144Sdrhdo_test autoinc-2.51 { 247f3388144Sdrh execsql { 248f3388144Sdrh SELECT * FROM sqlite_sequence 249f3388144Sdrh } 250f3388144Sdrh} {t1 1241} 25153c0f748Sdanielk1977 25253c0f748Sdanielk1977ifcapable tempdb { 253f3388144Sdrh do_test autoinc-2.52 { 254f3388144Sdrh execsql { 255f3388144Sdrh CREATE TEMP TABLE t2 AS SELECT y FROM t1; 256287fb61cSdanielk1977 } 257287fb61cSdanielk1977 execsql { 258f3388144Sdrh INSERT INTO t1 SELECT NULL, y+4 FROM t2; 259f3388144Sdrh SELECT * FROM t1; 260f3388144Sdrh } 261f3388144Sdrh } {235 1 1235 2 1240 3 1241 4 1242 5 1243 6 1244 7 1245 8} 262f3388144Sdrh do_test autoinc-2.53 { 263f3388144Sdrh execsql { 264f3388144Sdrh SELECT * FROM sqlite_sequence 265f3388144Sdrh } 266f3388144Sdrh } {t1 1245} 267f3388144Sdrh do_test autoinc-2.54 { 268f3388144Sdrh execsql { 269f3388144Sdrh DELETE FROM t1; 270f3388144Sdrh INSERT INTO t1 SELECT NULL, y FROM t2; 271f3388144Sdrh SELECT * FROM t1; 272f3388144Sdrh } 273f3388144Sdrh } {1246 1 1247 2 1248 3 1249 4} 274f3388144Sdrh do_test autoinc-2.55 { 275f3388144Sdrh execsql { 276f3388144Sdrh SELECT * FROM sqlite_sequence 277f3388144Sdrh } 278f3388144Sdrh } {t1 1249} 27953c0f748Sdanielk1977} 280f3388144Sdrh 281f3388144Sdrh# Create multiple AUTOINCREMENT tables. Make sure all sequences are 282f3388144Sdrh# tracked separately and do not interfere with one another. 283f3388144Sdrh# 284f3388144Sdrhdo_test autoinc-2.70 { 28553c0f748Sdanielk1977 catchsql { 286f3388144Sdrh DROP TABLE t2; 28753c0f748Sdanielk1977 } 28853c0f748Sdanielk1977 execsql { 289f3388144Sdrh CREATE TABLE t2(d, e INTEGER PRIMARY KEY AUTOINCREMENT, f); 290f3388144Sdrh INSERT INTO t2(d) VALUES(1); 291f3388144Sdrh SELECT * FROM sqlite_sequence; 292f3388144Sdrh } 29353c0f748Sdanielk1977} [ifcapable tempdb {list t1 1249 t2 1} else {list t1 1241 t2 1}] 294f3388144Sdrhdo_test autoinc-2.71 { 295f3388144Sdrh execsql { 296f3388144Sdrh INSERT INTO t2(d) VALUES(2); 297f3388144Sdrh SELECT * FROM sqlite_sequence; 298f3388144Sdrh } 29953c0f748Sdanielk1977} [ifcapable tempdb {list t1 1249 t2 2} else {list t1 1241 t2 2}] 300f3388144Sdrhdo_test autoinc-2.72 { 301f3388144Sdrh execsql { 302f3388144Sdrh INSERT INTO t1(x) VALUES(10000); 303f3388144Sdrh SELECT * FROM sqlite_sequence; 304f3388144Sdrh } 305f3388144Sdrh} {t1 10000 t2 2} 306f3388144Sdrhdo_test autoinc-2.73 { 307f3388144Sdrh execsql { 308f3388144Sdrh CREATE TABLE t3(g INTEGER PRIMARY KEY AUTOINCREMENT, h); 309f3388144Sdrh INSERT INTO t3(h) VALUES(1); 310f3388144Sdrh SELECT * FROM sqlite_sequence; 311f3388144Sdrh } 312f3388144Sdrh} {t1 10000 t2 2 t3 1} 313f3388144Sdrhdo_test autoinc-2.74 { 314f3388144Sdrh execsql { 315f3388144Sdrh INSERT INTO t2(d,e) VALUES(3,100); 316f3388144Sdrh SELECT * FROM sqlite_sequence; 317f3388144Sdrh } 318f3388144Sdrh} {t1 10000 t2 100 t3 1} 319f3388144Sdrh 320f3388144Sdrh 321f3388144Sdrh# When a table with an AUTOINCREMENT is deleted, the corresponding entry 322f3388144Sdrh# in the SQLITE_SEQUENCE table should also be deleted. But the SQLITE_SEQUENCE 323f3388144Sdrh# table itself should remain behind. 324f3388144Sdrh# 325f3388144Sdrhdo_test autoinc-3.1 { 326f3388144Sdrh execsql {SELECT name FROM sqlite_sequence} 327f3388144Sdrh} {t1 t2 t3} 328f3388144Sdrhdo_test autoinc-3.2 { 329f3388144Sdrh execsql { 330f3388144Sdrh DROP TABLE t1; 331f3388144Sdrh SELECT name FROM sqlite_sequence; 332f3388144Sdrh } 333f3388144Sdrh} {t2 t3} 334f3388144Sdrhdo_test autoinc-3.3 { 335f3388144Sdrh execsql { 336f3388144Sdrh DROP TABLE t3; 337f3388144Sdrh SELECT name FROM sqlite_sequence; 338f3388144Sdrh } 339f3388144Sdrh} {t2} 340f3388144Sdrhdo_test autoinc-3.4 { 341f3388144Sdrh execsql { 342f3388144Sdrh DROP TABLE t2; 343f3388144Sdrh SELECT name FROM sqlite_sequence; 344f3388144Sdrh } 345f3388144Sdrh} {} 346f3388144Sdrh 347f3388144Sdrh# AUTOINCREMENT on TEMP tables. 348f3388144Sdrh# 34953c0f748Sdanielk1977ifcapable tempdb { 350f3388144Sdrh do_test autoinc-4.1 { 351f3388144Sdrh execsql { 35227c77438Sdanielk1977 SELECT 1, name FROM sqlite_master WHERE type='table'; 353e0a04a36Sdrh SELECT 2, name FROM temp.sqlite_master WHERE type='table'; 354f3388144Sdrh } 355f3388144Sdrh } {1 sqlite_sequence} 356f3388144Sdrh do_test autoinc-4.2 { 357f3388144Sdrh execsql { 358f3388144Sdrh CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y); 359f3388144Sdrh CREATE TEMP TABLE t3(a INTEGER PRIMARY KEY AUTOINCREMENT, b); 36027c77438Sdanielk1977 SELECT 1, name FROM sqlite_master WHERE type='table'; 36127c77438Sdanielk1977 SELECT 2, name FROM sqlite_temp_master WHERE type='table'; 362f3388144Sdrh } 363f3388144Sdrh } {1 sqlite_sequence 1 t1 2 t3 2 sqlite_sequence} 364f3388144Sdrh do_test autoinc-4.3 { 365f3388144Sdrh execsql { 36627c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 36727c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 368f3388144Sdrh } 369f3388144Sdrh } {} 370f3388144Sdrh do_test autoinc-4.4 { 371f3388144Sdrh execsql { 372f3388144Sdrh INSERT INTO t1 VALUES(10,1); 373f3388144Sdrh INSERT INTO t3 VALUES(20,2); 374f3388144Sdrh INSERT INTO t1 VALUES(NULL,3); 375f3388144Sdrh INSERT INTO t3 VALUES(NULL,4); 37627c77438Sdanielk1977 } 37727c77438Sdanielk1977 } {} 37827c77438Sdanielk1977 37927c77438Sdanielk1977 ifcapable compound { 38027c77438Sdanielk1977 do_test autoinc-4.4.1 { 38127c77438Sdanielk1977 execsql { 382f3388144Sdrh SELECT * FROM t1 UNION ALL SELECT * FROM t3; 383f3388144Sdrh } 384f3388144Sdrh } {10 1 11 3 20 2 21 4} 38527c77438Sdanielk1977 } ;# ifcapable compound 38627c77438Sdanielk1977 387f3388144Sdrh do_test autoinc-4.5 { 388f3388144Sdrh execsql { 38927c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 39027c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 391f3388144Sdrh } 392f3388144Sdrh } {1 t1 11 2 t3 21} 393f3388144Sdrh do_test autoinc-4.6 { 394f3388144Sdrh execsql { 395f3388144Sdrh INSERT INTO t1 SELECT * FROM t3; 39627c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 39727c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 398f3388144Sdrh } 399f3388144Sdrh } {1 t1 21 2 t3 21} 400f3388144Sdrh do_test autoinc-4.7 { 401f3388144Sdrh execsql { 402f3388144Sdrh INSERT INTO t3 SELECT x+100, y FROM t1; 40327c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 40427c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 405f3388144Sdrh } 406f3388144Sdrh } {1 t1 21 2 t3 121} 407f3388144Sdrh do_test autoinc-4.8 { 408f3388144Sdrh execsql { 409f3388144Sdrh DROP TABLE t3; 41027c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 41127c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 412f3388144Sdrh } 413f3388144Sdrh } {1 t1 21} 414f3388144Sdrh do_test autoinc-4.9 { 415f3388144Sdrh execsql { 416f3388144Sdrh CREATE TEMP TABLE t2(p INTEGER PRIMARY KEY AUTOINCREMENT, q); 417f3388144Sdrh INSERT INTO t2 SELECT * FROM t1; 418f3388144Sdrh DROP TABLE t1; 41927c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 42027c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 421f3388144Sdrh } 422f3388144Sdrh } {2 t2 21} 423f3388144Sdrh do_test autoinc-4.10 { 424f3388144Sdrh execsql { 425f3388144Sdrh DROP TABLE t2; 42627c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 42727c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 428f3388144Sdrh } 429f3388144Sdrh } {} 43053c0f748Sdanielk1977} 431f3388144Sdrh 432f3388144Sdrh# Make sure AUTOINCREMENT works on ATTACH-ed tables. 433f3388144Sdrh# 4345a8f9374Sdanielk1977ifcapable tempdb&&attach { 435f3388144Sdrh do_test autoinc-5.1 { 436fda06befSmistachkin forcedelete test2.db 437fda06befSmistachkin forcedelete test2.db-journal 438f3388144Sdrh sqlite3 db2 test2.db 439f3388144Sdrh execsql { 440f3388144Sdrh CREATE TABLE t4(m INTEGER PRIMARY KEY AUTOINCREMENT, n); 441f3388144Sdrh CREATE TABLE t5(o, p INTEGER PRIMARY KEY AUTOINCREMENT); 442f3388144Sdrh } db2; 443f3388144Sdrh execsql { 444f3388144Sdrh ATTACH 'test2.db' as aux; 44527c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 44627c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 44727c77438Sdanielk1977 SELECT 3, * FROM aux.sqlite_sequence; 448f3388144Sdrh } 449f3388144Sdrh } {} 450f3388144Sdrh do_test autoinc-5.2 { 451f3388144Sdrh execsql { 452f3388144Sdrh INSERT INTO t4 VALUES(NULL,1); 45327c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 45427c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 45527c77438Sdanielk1977 SELECT 3, * FROM aux.sqlite_sequence; 456f3388144Sdrh } 457f3388144Sdrh } {3 t4 1} 458f3388144Sdrh do_test autoinc-5.3 { 459f3388144Sdrh execsql { 460f3388144Sdrh INSERT INTO t5 VALUES(100,200); 461f3388144Sdrh SELECT * FROM sqlite_sequence 462f3388144Sdrh } db2 463f3388144Sdrh } {t4 1 t5 200} 464f3388144Sdrh do_test autoinc-5.4 { 465f3388144Sdrh execsql { 46627c77438Sdanielk1977 SELECT 1, * FROM main.sqlite_sequence; 46727c77438Sdanielk1977 SELECT 2, * FROM temp.sqlite_sequence; 46827c77438Sdanielk1977 SELECT 3, * FROM aux.sqlite_sequence; 469f3388144Sdrh } 470f3388144Sdrh } {3 t4 1 3 t5 200} 47153c0f748Sdanielk1977} 472f3388144Sdrh 473f3388144Sdrh# Requirement REQ00310: Make sure an insert fails if the sequence is 474f3388144Sdrh# already at its maximum value. 475f3388144Sdrh# 47675f86a4bSdrhifcapable {rowid32} { 47775f86a4bSdrh do_test autoinc-6.1 { 47875f86a4bSdrh execsql { 47975f86a4bSdrh CREATE TABLE t6(v INTEGER PRIMARY KEY AUTOINCREMENT, w); 48075f86a4bSdrh INSERT INTO t6 VALUES(2147483647,1); 48175f86a4bSdrh SELECT seq FROM main.sqlite_sequence WHERE name='t6'; 48275f86a4bSdrh } 48375f86a4bSdrh } 2147483647 48475f86a4bSdrh} 48575f86a4bSdrhifcapable {!rowid32} { 486f3388144Sdrh do_test autoinc-6.1 { 487f3388144Sdrh execsql { 488f3388144Sdrh CREATE TABLE t6(v INTEGER PRIMARY KEY AUTOINCREMENT, w); 489f3388144Sdrh INSERT INTO t6 VALUES(9223372036854775807,1); 490f3388144Sdrh SELECT seq FROM main.sqlite_sequence WHERE name='t6'; 491f3388144Sdrh } 492f3388144Sdrh } 9223372036854775807 49375f86a4bSdrh} 494f3388144Sdrhdo_test autoinc-6.2 { 495f3388144Sdrh catchsql { 496f3388144Sdrh INSERT INTO t6 VALUES(NULL,1); 497f3388144Sdrh } 4982db0bbc2Sdrh} {1 {database or disk is full}} 499f3388144Sdrh 500f3388144Sdrh# Allow the AUTOINCREMENT keyword inside the parentheses 501f3388144Sdrh# on a separate PRIMARY KEY designation. 502f3388144Sdrh# 503f3388144Sdrhdo_test autoinc-7.1 { 504f3388144Sdrh execsql { 505f3388144Sdrh CREATE TABLE t7(x INTEGER, y REAL, PRIMARY KEY(x AUTOINCREMENT)); 506f3388144Sdrh INSERT INTO t7(y) VALUES(123); 507f3388144Sdrh INSERT INTO t7(y) VALUES(234); 508f3388144Sdrh DELETE FROM t7; 509f3388144Sdrh INSERT INTO t7(y) VALUES(345); 510f3388144Sdrh SELECT * FROM t7; 511f3388144Sdrh } 5128a51256cSdrh} {3 345.0} 513f3388144Sdrh 514576ec6b3Sdanielk1977# Test that if the AUTOINCREMENT is applied to a non integer primary key 515576ec6b3Sdanielk1977# the error message is sensible. 516576ec6b3Sdanielk1977do_test autoinc-7.2 { 517576ec6b3Sdanielk1977 catchsql { 518576ec6b3Sdanielk1977 CREATE TABLE t8(x TEXT PRIMARY KEY AUTOINCREMENT); 519576ec6b3Sdanielk1977 } 520576ec6b3Sdanielk1977} {1 {AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY}} 521576ec6b3Sdanielk1977 52278776ecdSdrh 52378776ecdSdrh# Ticket #1283. Make sure that preparing but never running a statement 52478776ecdSdrh# that creates the sqlite_sequence table does not mess up the database. 52578776ecdSdrh# 52678776ecdSdrhdo_test autoinc-8.1 { 527f3388144Sdrh catch {db2 close} 52878776ecdSdrh catch {db close} 529fda06befSmistachkin forcedelete test.db 530dddca286Sdrh sqlite3 db test.db 531dddca286Sdrh set DB [sqlite3_connection_pointer db] 53278776ecdSdrh set STMT [sqlite3_prepare $DB { 53378776ecdSdrh CREATE TABLE t1( 53478776ecdSdrh x INTEGER PRIMARY KEY AUTOINCREMENT 53578776ecdSdrh ) 53678776ecdSdrh } -1 TAIL] 53778776ecdSdrh sqlite3_finalize $STMT 53878776ecdSdrh set STMT [sqlite3_prepare $DB { 53978776ecdSdrh CREATE TABLE t1( 54078776ecdSdrh x INTEGER PRIMARY KEY AUTOINCREMENT 54178776ecdSdrh ) 54278776ecdSdrh } -1 TAIL] 54378776ecdSdrh sqlite3_step $STMT 54478776ecdSdrh sqlite3_finalize $STMT 54578776ecdSdrh execsql { 54678776ecdSdrh INSERT INTO t1 VALUES(NULL); 54778776ecdSdrh SELECT * FROM t1; 54878776ecdSdrh } 54978776ecdSdrh} {1} 55078776ecdSdrh 551c9ded4c6Sdrh# Ticket #3148 552c9ded4c6Sdrh# Make sure the sqlite_sequence table is not damaged when doing 553c9ded4c6Sdrh# an empty insert - an INSERT INTO ... SELECT ... where the SELECT 554c9ded4c6Sdrh# clause returns an empty set. 555c9ded4c6Sdrh# 556c9ded4c6Sdrhdo_test autoinc-9.1 { 557c9ded4c6Sdrh db eval { 558c9ded4c6Sdrh CREATE TABLE t2(x INTEGER PRIMARY KEY AUTOINCREMENT, y); 559c9ded4c6Sdrh INSERT INTO t2 VALUES(NULL, 1); 560c9ded4c6Sdrh CREATE TABLE t3(a INTEGER PRIMARY KEY AUTOINCREMENT, b); 561c9ded4c6Sdrh INSERT INTO t3 SELECT * FROM t2 WHERE y>1; 562c9ded4c6Sdrh 563c9ded4c6Sdrh SELECT * FROM sqlite_sequence WHERE name='t3'; 564c9ded4c6Sdrh } 565c9ded4c6Sdrh} {t3 0} 566c9ded4c6Sdrh 56775cbd984Sdanifcapable trigger { 5685bde73c4Sdan catchsql { pragma recursive_triggers = off } 56976d462eeSdan 5700b9f50d8Sdrh # Ticket #3928. Make sure that triggers to not make extra slots in 5710b9f50d8Sdrh # the SQLITE_SEQUENCE table. 5720b9f50d8Sdrh # 5730b9f50d8Sdrh do_test autoinc-3928.1 { 5740b9f50d8Sdrh db eval { 5750b9f50d8Sdrh CREATE TABLE t3928(a INTEGER PRIMARY KEY AUTOINCREMENT, b); 5760b9f50d8Sdrh CREATE TRIGGER t3928r1 BEFORE INSERT ON t3928 BEGIN 5770b9f50d8Sdrh INSERT INTO t3928(b) VALUES('before1'); 5780b9f50d8Sdrh INSERT INTO t3928(b) VALUES('before2'); 5790b9f50d8Sdrh END; 5800b9f50d8Sdrh CREATE TRIGGER t3928r2 AFTER INSERT ON t3928 BEGIN 5810b9f50d8Sdrh INSERT INTO t3928(b) VALUES('after1'); 5820b9f50d8Sdrh INSERT INTO t3928(b) VALUES('after2'); 5830b9f50d8Sdrh END; 5840b9f50d8Sdrh INSERT INTO t3928(b) VALUES('test'); 5850b9f50d8Sdrh SELECT * FROM t3928 ORDER BY a; 5860b9f50d8Sdrh } 5870b9f50d8Sdrh } {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} 5880b9f50d8Sdrh do_test autoinc-3928.2 { 5890b9f50d8Sdrh db eval { 5900b9f50d8Sdrh SELECT * FROM sqlite_sequence WHERE name='t3928' 5910b9f50d8Sdrh } 5920b9f50d8Sdrh } {t3928 13} 5930b9f50d8Sdrh 5940b9f50d8Sdrh do_test autoinc-3928.3 { 5950b9f50d8Sdrh db eval { 5960b9f50d8Sdrh DROP TRIGGER t3928r1; 5970b9f50d8Sdrh DROP TRIGGER t3928r2; 5980b9f50d8Sdrh CREATE TRIGGER t3928r3 BEFORE UPDATE ON t3928 5990b9f50d8Sdrh WHEN typeof(new.b)=='integer' BEGIN 6000b9f50d8Sdrh INSERT INTO t3928(b) VALUES('before-int-' || new.b); 6010b9f50d8Sdrh END; 6020b9f50d8Sdrh CREATE TRIGGER t3928r4 AFTER UPDATE ON t3928 6030b9f50d8Sdrh WHEN typeof(new.b)=='integer' BEGIN 6040b9f50d8Sdrh INSERT INTO t3928(b) VALUES('after-int-' || new.b); 6050b9f50d8Sdrh END; 6060b9f50d8Sdrh DELETE FROM t3928 WHERE a!=1; 6070b9f50d8Sdrh UPDATE t3928 SET b=456 WHERE a=1; 6080b9f50d8Sdrh SELECT * FROM t3928 ORDER BY a; 6090b9f50d8Sdrh } 6100b9f50d8Sdrh } {1 456 14 before-int-456 15 after-int-456} 6110b9f50d8Sdrh do_test autoinc-3928.4 { 6120b9f50d8Sdrh db eval { 6130b9f50d8Sdrh SELECT * FROM sqlite_sequence WHERE name='t3928' 6140b9f50d8Sdrh } 6150b9f50d8Sdrh } {t3928 15} 6160b9f50d8Sdrh 6170b9f50d8Sdrh do_test autoinc-3928.5 { 6180b9f50d8Sdrh db eval { 6190b9f50d8Sdrh CREATE TABLE t3928b(x); 6200b9f50d8Sdrh INSERT INTO t3928b VALUES(100); 6210b9f50d8Sdrh INSERT INTO t3928b VALUES(200); 6220b9f50d8Sdrh INSERT INTO t3928b VALUES(300); 6230b9f50d8Sdrh DELETE FROM t3928; 6240b9f50d8Sdrh CREATE TABLE t3928c(y INTEGER PRIMARY KEY AUTOINCREMENT, z); 6250b9f50d8Sdrh CREATE TRIGGER t3928br1 BEFORE DELETE ON t3928b BEGIN 6260b9f50d8Sdrh INSERT INTO t3928(b) VALUES('before-del-'||old.x); 6270b9f50d8Sdrh INSERT INTO t3928c(z) VALUES('before-del-'||old.x); 6280b9f50d8Sdrh END; 6290b9f50d8Sdrh CREATE TRIGGER t3928br2 AFTER DELETE ON t3928b BEGIN 6300b9f50d8Sdrh INSERT INTO t3928(b) VALUES('after-del-'||old.x); 6310b9f50d8Sdrh INSERT INTO t3928c(z) VALUES('after-del-'||old.x); 6320b9f50d8Sdrh END; 6330b9f50d8Sdrh DELETE FROM t3928b; 6340b9f50d8Sdrh SELECT * FROM t3928 ORDER BY a; 6350b9f50d8Sdrh } 6360b9f50d8Sdrh } {16 before-del-100 17 after-del-100 18 before-del-200 19 after-del-200 20 before-del-300 21 after-del-300} 6370b9f50d8Sdrh do_test autoinc-3928.6 { 6380b9f50d8Sdrh db eval { 6390b9f50d8Sdrh SELECT * FROM t3928c ORDER BY y; 6400b9f50d8Sdrh } 6410b9f50d8Sdrh } {1 before-del-100 2 after-del-100 3 before-del-200 4 after-del-200 5 before-del-300 6 after-del-300} 6420b9f50d8Sdrh do_test autoinc-3928.7 { 6430b9f50d8Sdrh db eval { 6440b9f50d8Sdrh SELECT * FROM sqlite_sequence WHERE name LIKE 't3928%' ORDER BY name; 6450b9f50d8Sdrh } 6460b9f50d8Sdrh } {t3928 21 t3928c 6} 647c9ded4c6Sdrh 6483492dd71Sdrh # Ticket [a696379c1f0886615541a48b35bd8181a80e88f8] 6493492dd71Sdrh do_test autoinc-a69637.1 { 6503492dd71Sdrh db eval { 6513492dd71Sdrh CREATE TABLE ta69637_1(x INTEGER PRIMARY KEY AUTOINCREMENT, y); 6523492dd71Sdrh CREATE TABLE ta69637_2(z); 6533492dd71Sdrh CREATE TRIGGER ra69637_1 AFTER INSERT ON ta69637_2 BEGIN 6543492dd71Sdrh INSERT INTO ta69637_1(y) VALUES(new.z+1); 6553492dd71Sdrh END; 6563492dd71Sdrh INSERT INTO ta69637_2 VALUES(123); 6573492dd71Sdrh SELECT * FROM ta69637_1; 6583492dd71Sdrh } 6593492dd71Sdrh } {1 124} 6603492dd71Sdrh do_test autoinc-a69637.2 { 6613492dd71Sdrh db eval { 6623492dd71Sdrh CREATE VIEW va69637_2 AS SELECT * FROM ta69637_2; 6633492dd71Sdrh CREATE TRIGGER ra69637_2 INSTEAD OF INSERT ON va69637_2 BEGIN 6643492dd71Sdrh INSERT INTO ta69637_1(y) VALUES(new.z+10000); 6653492dd71Sdrh END; 6663492dd71Sdrh INSERT INTO va69637_2 VALUES(123); 6673492dd71Sdrh SELECT * FROM ta69637_1; 6683492dd71Sdrh } 6693492dd71Sdrh } {1 124 2 10123} 67075cbd984Sdan} 6713492dd71Sdrh 6721dd518cfSdrh# 2016-10-03 ticket https://www.sqlite.org/src/tktview/7b3328086a5c1 6731dd518cfSdrh# Make sure autoincrement plays nicely with the xfer optimization 6741dd518cfSdrh# 6751dd518cfSdrhdo_execsql_test autoinc-10.1 { 6761dd518cfSdrh DELETE FROM sqlite_sequence; 6771dd518cfSdrh CREATE TABLE t10a(a INTEGER PRIMARY KEY AUTOINCREMENT, b UNIQUE); 6781dd518cfSdrh INSERT INTO t10a VALUES(888,9999); 6791dd518cfSdrh CREATE TABLE t10b(x INTEGER PRIMARY KEY AUTOINCREMENT, y UNIQUE); 6801dd518cfSdrh INSERT INTO t10b SELECT * FROM t10a; 6811dd518cfSdrh SELECT * FROM sqlite_sequence; 6821dd518cfSdrh} {t10a 888 t10b 888} 6831dd518cfSdrh 684f3d7bbb7Sdrh# 2018-04-21 autoincrement does not cause problems for upsert 685f3d7bbb7Sdrh# 686f3d7bbb7Sdrhdo_execsql_test autoinc-11.1 { 687f3d7bbb7Sdrh CREATE TABLE t11(a INTEGER PRIMARY KEY AUTOINCREMENT,b UNIQUE); 688f3d7bbb7Sdrh INSERT INTO t11(a,b) VALUES(2,3),(5,6),(4,3),(1,2) 689f3d7bbb7Sdrh ON CONFLICT(b) DO UPDATE SET a=a+1000; 690f3d7bbb7Sdrh SELECT seq FROM sqlite_sequence WHERE name='t11'; 691f3d7bbb7Sdrh} {5} 6923492dd71Sdrh 693186ebd41Sdrh# 2018-05-23 ticket d8dc2b3a58cd5dc2918a1d4acbba4676a23ada4c 694186ebd41Sdrh# Does not crash if the sqlite_sequence table schema is missing 695186ebd41Sdrh# or corrupt. 696186ebd41Sdrh# 697186ebd41Sdrhdo_test autoinc-12.1 { 698186ebd41Sdrh db close 699186ebd41Sdrh forcedelete test.db 700186ebd41Sdrh sqlite3 db test.db 7016ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 702186ebd41Sdrh db eval { 703186ebd41Sdrh CREATE TABLE fake_sequence(name TEXT PRIMARY KEY,seq) WITHOUT ROWID; 704186ebd41Sdrh PRAGMA writable_schema=on; 705186ebd41Sdrh UPDATE sqlite_master SET 706186ebd41Sdrh sql=replace(sql,'fake_','sqlite_'), 707186ebd41Sdrh name='sqlite_sequence', 708186ebd41Sdrh tbl_name='sqlite_sequence' 709186ebd41Sdrh WHERE name='fake_sequence'; 710186ebd41Sdrh } 711186ebd41Sdrh db close 712186ebd41Sdrh sqlite3 db test.db 713186ebd41Sdrh set res [catch {db eval { 714186ebd41Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 715186ebd41Sdrh INSERT INTO t1(b) VALUES('one'); 716186ebd41Sdrh }} msg] 717186ebd41Sdrh lappend res $msg 718186ebd41Sdrh} {1 {database disk image is malformed}} 719186ebd41Sdrhdo_test autoinc-12.2 { 720186ebd41Sdrh db close 721186ebd41Sdrh forcedelete test.db 722186ebd41Sdrh sqlite3 db test.db 7236ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 724186ebd41Sdrh db eval { 725186ebd41Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 726186ebd41Sdrh INSERT INTO t1(b) VALUES('one'); 727186ebd41Sdrh PRAGMA writable_schema=on; 728186ebd41Sdrh UPDATE sqlite_master SET 729186ebd41Sdrh sql=replace(sql,'sqlite_','x_'), 730186ebd41Sdrh name='x_sequence', 731186ebd41Sdrh tbl_name='x_sequence' 732186ebd41Sdrh WHERE name='sqlite_sequence'; 733186ebd41Sdrh } 734186ebd41Sdrh db close 735186ebd41Sdrh sqlite3 db test.db 736186ebd41Sdrh set res [catch {db eval { 737186ebd41Sdrh INSERT INTO t1(b) VALUES('two'); 738186ebd41Sdrh }} msg] 739186ebd41Sdrh lappend res $msg 740186ebd41Sdrh} {1 {database disk image is malformed}} 741d3e17ffbSdanifcapable vtab { 742d3e17ffbSdan set err "database disk image is malformed" 743d3e17ffbSdan} else { 744d3e17ffbSdan set err {malformed database schema (sqlite_sequence) - near "VIRTUAL": syntax error} 745d3e17ffbSdan} 746186ebd41Sdrhdo_test autoinc-12.3 { 747186ebd41Sdrh db close 748186ebd41Sdrh forcedelete test.db 749186ebd41Sdrh sqlite3 db test.db 7506ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 751186ebd41Sdrh db eval { 752186ebd41Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 753186ebd41Sdrh INSERT INTO t1(b) VALUES('one'); 754186ebd41Sdrh PRAGMA writable_schema=on; 755186ebd41Sdrh UPDATE sqlite_master SET 756186ebd41Sdrh sql='CREATE VIRTUAL TABLE sqlite_sequence USING sqlite_dbpage' 757186ebd41Sdrh WHERE name='sqlite_sequence'; 758186ebd41Sdrh } 759186ebd41Sdrh db close 760186ebd41Sdrh sqlite3 db test.db 761186ebd41Sdrh set res [catch {db eval { 762186ebd41Sdrh INSERT INTO t1(b) VALUES('two'); 763186ebd41Sdrh }} msg] 764186ebd41Sdrh lappend res $msg 765d3e17ffbSdan} [list 1 $err] 766186ebd41Sdrhdo_test autoinc-12.4 { 767186ebd41Sdrh db close 768186ebd41Sdrh forcedelete test.db 769186ebd41Sdrh sqlite3 db test.db 770186ebd41Sdrh db eval { 771186ebd41Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 772186ebd41Sdrh INSERT INTO t1(b) VALUES('one'); 773186ebd41Sdrh CREATE TABLE fake(name TEXT PRIMARY KEY,seq) WITHOUT ROWID; 774186ebd41Sdrh } 775186ebd41Sdrh set root1 [db one {SELECT rootpage FROM sqlite_master 776186ebd41Sdrh WHERE name='sqlite_sequence'}] 777186ebd41Sdrh set root2 [db one {SELECT rootpage FROM sqlite_master 778186ebd41Sdrh WHERE name='fake'}] 7796ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 780186ebd41Sdrh db eval { 781186ebd41Sdrh PRAGMA writable_schema=on; 782186ebd41Sdrh UPDATE sqlite_master SET rootpage=$root2 783186ebd41Sdrh WHERE name='sqlite_sequence'; 784186ebd41Sdrh UPDATE sqlite_master SET rootpage=$root1 785186ebd41Sdrh WHERE name='fake'; 786186ebd41Sdrh } 787186ebd41Sdrh db close 788186ebd41Sdrh sqlite3 db test.db 789186ebd41Sdrh set res [catch {db eval { 790186ebd41Sdrh INSERT INTO t1(b) VALUES('two'); 791186ebd41Sdrh }} msg] 792186ebd41Sdrh lappend res $msg 793186ebd41Sdrh} {1 {database disk image is malformed}} 794186ebd41Sdrhbreakpoint 795186ebd41Sdrhdo_test autoinc-12.5 { 796186ebd41Sdrh db close 797186ebd41Sdrh forcedelete test.db 798186ebd41Sdrh sqlite3 db test.db 7996ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 800186ebd41Sdrh db eval { 801186ebd41Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 802186ebd41Sdrh INSERT INTO t1(b) VALUES('one'); 803186ebd41Sdrh PRAGMA writable_schema=on; 804186ebd41Sdrh UPDATE sqlite_master SET 805186ebd41Sdrh sql='CREATE TABLE sqlite_sequence(x)' 806186ebd41Sdrh WHERE name='sqlite_sequence'; 807186ebd41Sdrh } 808186ebd41Sdrh db close 809186ebd41Sdrh sqlite3 db test.db 810186ebd41Sdrh set res [catch {db eval { 811186ebd41Sdrh INSERT INTO t1(b) VALUES('two'); 812186ebd41Sdrh }} msg] 813186ebd41Sdrh lappend res $msg 814186ebd41Sdrh} {1 {database disk image is malformed}} 815186ebd41Sdrhdo_test autoinc-12.6 { 816186ebd41Sdrh db close 817186ebd41Sdrh forcedelete test.db 818186ebd41Sdrh sqlite3 db test.db 8196ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 820186ebd41Sdrh db eval { 821186ebd41Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 822186ebd41Sdrh INSERT INTO t1(b) VALUES('one'); 823186ebd41Sdrh PRAGMA writable_schema=on; 824186ebd41Sdrh UPDATE sqlite_master SET 825186ebd41Sdrh sql='CREATE TABLE sqlite_sequence(x,y INTEGER PRIMARY KEY)' 826186ebd41Sdrh WHERE name='sqlite_sequence'; 827186ebd41Sdrh } 828186ebd41Sdrh db close 829186ebd41Sdrh sqlite3 db test.db 830186ebd41Sdrh set res [catch {db eval { 831186ebd41Sdrh INSERT INTO t1(b) VALUES('two'),('three'),('four'); 832186ebd41Sdrh INSERT INTO t1(b) VALUES('five'); 833186ebd41Sdrh PRAGMA integrity_check; 834186ebd41Sdrh }} msg] 835186ebd41Sdrh lappend res $msg 836186ebd41Sdrh} {0 ok} 837186ebd41Sdrhdo_test autoinc-12.7 { 838186ebd41Sdrh db close 839186ebd41Sdrh forcedelete test.db 840186ebd41Sdrh sqlite3 db test.db 8416ab91a7aSdrh sqlite3_db_config db DEFENSIVE 0 842186ebd41Sdrh db eval { 843186ebd41Sdrh CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 844186ebd41Sdrh INSERT INTO t1(b) VALUES('one'); 845186ebd41Sdrh PRAGMA writable_schema=on; 846186ebd41Sdrh UPDATE sqlite_master SET 847186ebd41Sdrh sql='CREATE TABLE sqlite_sequence(y INTEGER PRIMARY KEY,x)' 848186ebd41Sdrh WHERE name='sqlite_sequence'; 849186ebd41Sdrh } 850186ebd41Sdrh db close 851186ebd41Sdrh sqlite3 db test.db 852186ebd41Sdrh set res [catch {db eval { 853186ebd41Sdrh INSERT INTO t1(b) VALUES('two'),('three'),('four'); 854186ebd41Sdrh INSERT INTO t1(b) VALUES('five'); 855186ebd41Sdrh PRAGMA integrity_check; 856186ebd41Sdrh }} msg] 857186ebd41Sdrh lappend res $msg 858186ebd41Sdrh} {0 ok} 859186ebd41Sdrh 860*b84b38fdSdan#-------------------------------------------------------------------------- 861*b84b38fdSdanreset_db 862*b84b38fdSdando_execsql_test 13.0 { 863*b84b38fdSdan CREATE TABLE t1(i INTEGER PRIMARY KEY AUTOINCREMENT, j); 864*b84b38fdSdan CREATE TABLE t2(i INTEGER PRIMARY KEY AUTOINCREMENT, j); 865*b84b38fdSdan CREATE TABLE t3(i INTEGER PRIMARY KEY AUTOINCREMENT, j); 866*b84b38fdSdan 867*b84b38fdSdan INSERT INTO t1 VALUES(NULL, 1); 868*b84b38fdSdan INSERT INTO t2 VALUES(NULL, 2); 869*b84b38fdSdan INSERT INTO t3 VALUES(NULL, 3); 870*b84b38fdSdan 871*b84b38fdSdan SELECT name FROM sqlite_sequence; 872*b84b38fdSdan} {t1 t2 t3} 873*b84b38fdSdan 874*b84b38fdSdando_execsql_test 13.1 { 875*b84b38fdSdan UPDATE sqlite_sequence SET name=NULL WHERE name='t2'; 876*b84b38fdSdan INSERT INTO t3 VALUES(NULL, 4); 877*b84b38fdSdan DELETE FROM t3; 878*b84b38fdSdan INSERT INTO t3 VALUES(NULL, 5); 879*b84b38fdSdan SELECT * FROM t3; 880*b84b38fdSdan} {3 5} 881*b84b38fdSdan 882*b84b38fdSdan 883f3388144Sdrhfinish_test 884