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 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# If the library is not compiled with autoincrement support then 21# skip all tests in this file. 22# 23ifcapable {!autoinc} { 24 finish_test 25 return 26} 27 28if {[permutation]=="inmemory_journal"} { 29 finish_test 30 return 31} 32 33sqlite3_db_config_lookaside db 0 0 0 34 35# The database is initially empty. 36# 37do_test autoinc-1.1 { 38 execsql { 39 SELECT name FROM sqlite_master WHERE type='table'; 40 } 41} {} 42 43# Add a table with the AUTOINCREMENT feature. Verify that the 44# SQLITE_SEQUENCE table gets created. 45# 46do_test autoinc-1.2 { 47 execsql { 48 CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y); 49 SELECT name FROM sqlite_master WHERE type='table'; 50 } 51} {t1 sqlite_sequence} 52 53# The SQLITE_SEQUENCE table is initially empty 54# 55do_test autoinc-1.3 { 56 execsql { 57 SELECT * FROM sqlite_sequence; 58 } 59} {} 60do_test autoinc-1.3.1 { 61 catchsql { 62 CREATE INDEX seqidx ON sqlite_sequence(name) 63 } 64} {1 {table sqlite_sequence may not be indexed}} 65 66# Close and reopen the database. Verify that everything is still there. 67# 68do_test autoinc-1.4 { 69 db close 70 sqlite3 db test.db 71 execsql { 72 SELECT * FROM sqlite_sequence; 73 } 74} {} 75 76# We are not allowed to drop the sqlite_sequence table. 77# 78do_test autoinc-1.5 { 79 catchsql {DROP TABLE sqlite_sequence} 80} {1 {table sqlite_sequence may not be dropped}} 81do_test autoinc-1.6 { 82 execsql {SELECT name FROM sqlite_master WHERE type='table'} 83} {t1 sqlite_sequence} 84 85# Insert an entries into the t1 table and make sure the largest key 86# is always recorded in the sqlite_sequence table. 87# 88do_test autoinc-2.1 { 89 execsql { 90 SELECT * FROM sqlite_sequence 91 } 92} {} 93do_test autoinc-2.2 { 94 execsql { 95 INSERT INTO t1 VALUES(12,34); 96 SELECT * FROM sqlite_sequence; 97 } 98} {t1 12} 99do_test autoinc-2.3 { 100 execsql { 101 INSERT INTO t1 VALUES(1,23); 102 SELECT * FROM sqlite_sequence; 103 } 104} {t1 12} 105do_test autoinc-2.4 { 106 execsql { 107 INSERT INTO t1 VALUES(123,456); 108 SELECT * FROM sqlite_sequence; 109 } 110} {t1 123} 111do_test autoinc-2.5 { 112 execsql { 113 INSERT INTO t1 VALUES(NULL,567); 114 SELECT * FROM sqlite_sequence; 115 } 116} {t1 124} 117do_test autoinc-2.6 { 118 execsql { 119 DELETE FROM t1 WHERE y=567; 120 SELECT * FROM sqlite_sequence; 121 } 122} {t1 124} 123do_test autoinc-2.7 { 124 execsql { 125 INSERT INTO t1 VALUES(NULL,567); 126 SELECT * FROM sqlite_sequence; 127 } 128} {t1 125} 129do_test autoinc-2.8 { 130 execsql { 131 DELETE FROM t1; 132 SELECT * FROM sqlite_sequence; 133 } 134} {t1 125} 135do_test autoinc-2.9 { 136 execsql { 137 INSERT INTO t1 VALUES(12,34); 138 SELECT * FROM sqlite_sequence; 139 } 140} {t1 125} 141do_test autoinc-2.10 { 142 execsql { 143 INSERT INTO t1 VALUES(125,456); 144 SELECT * FROM sqlite_sequence; 145 } 146} {t1 125} 147do_test autoinc-2.11 { 148 execsql { 149 INSERT INTO t1 VALUES(-1234567,-1); 150 SELECT * FROM sqlite_sequence; 151 } 152} {t1 125} 153do_test autoinc-2.12 { 154 execsql { 155 INSERT INTO t1 VALUES(234,5678); 156 SELECT * FROM sqlite_sequence; 157 } 158} {t1 234} 159do_test autoinc-2.13 { 160 execsql { 161 DELETE FROM t1; 162 INSERT INTO t1 VALUES(NULL,1); 163 SELECT * FROM sqlite_sequence; 164 } 165} {t1 235} 166do_test autoinc-2.14 { 167 execsql { 168 SELECT * FROM t1; 169 } 170} {235 1} 171 172# Manually change the autoincrement values in sqlite_sequence. 173# 174do_test autoinc-2.20 { 175 execsql { 176 UPDATE sqlite_sequence SET seq=1234 WHERE name='t1'; 177 INSERT INTO t1 VALUES(NULL,2); 178 SELECT * FROM t1; 179 } 180} {235 1 1235 2} 181do_test autoinc-2.21 { 182 execsql { 183 SELECT * FROM sqlite_sequence; 184 } 185} {t1 1235} 186do_test autoinc-2.22 { 187 execsql { 188 UPDATE sqlite_sequence SET seq=NULL WHERE name='t1'; 189 INSERT INTO t1 VALUES(NULL,3); 190 SELECT * FROM t1; 191 } 192} {235 1 1235 2 1236 3} 193do_test autoinc-2.23 { 194 execsql { 195 SELECT * FROM sqlite_sequence; 196 } 197} {t1 1236} 198do_test autoinc-2.24 { 199 execsql { 200 UPDATE sqlite_sequence SET seq='a-string' WHERE name='t1'; 201 INSERT INTO t1 VALUES(NULL,4); 202 SELECT * FROM t1; 203 } 204} {235 1 1235 2 1236 3 1237 4} 205do_test autoinc-2.25 { 206 execsql { 207 SELECT * FROM sqlite_sequence; 208 } 209} {t1 1237} 210do_test autoinc-2.26 { 211 execsql { 212 DELETE FROM sqlite_sequence WHERE name='t1'; 213 INSERT INTO t1 VALUES(NULL,5); 214 SELECT * FROM t1; 215 } 216} {235 1 1235 2 1236 3 1237 4 1238 5} 217do_test autoinc-2.27 { 218 execsql { 219 SELECT * FROM sqlite_sequence; 220 } 221} {t1 1238} 222do_test autoinc-2.28 { 223 execsql { 224 UPDATE sqlite_sequence SET seq='-12345678901234567890' 225 WHERE name='t1'; 226 INSERT INTO t1 VALUES(NULL,6); 227 SELECT * FROM t1; 228 } 229} {235 1 1235 2 1236 3 1237 4 1238 5 1239 6} 230do_test autoinc-2.29 { 231 execsql { 232 SELECT * FROM sqlite_sequence; 233 } 234} {t1 1239} 235 236# Test multi-row inserts 237# 238do_test autoinc-2.50 { 239 execsql { 240 DELETE FROM t1 WHERE y>=3; 241 INSERT INTO t1 SELECT NULL, y+2 FROM t1; 242 SELECT * FROM t1; 243 } 244} {235 1 1235 2 1240 3 1241 4} 245do_test autoinc-2.51 { 246 execsql { 247 SELECT * FROM sqlite_sequence 248 } 249} {t1 1241} 250 251ifcapable tempdb { 252 do_test autoinc-2.52 { 253 execsql { 254 CREATE TEMP TABLE t2 AS SELECT y FROM t1; 255 } 256 execsql { 257 INSERT INTO t1 SELECT NULL, y+4 FROM t2; 258 SELECT * FROM t1; 259 } 260 } {235 1 1235 2 1240 3 1241 4 1242 5 1243 6 1244 7 1245 8} 261 do_test autoinc-2.53 { 262 execsql { 263 SELECT * FROM sqlite_sequence 264 } 265 } {t1 1245} 266 do_test autoinc-2.54 { 267 execsql { 268 DELETE FROM t1; 269 INSERT INTO t1 SELECT NULL, y FROM t2; 270 SELECT * FROM t1; 271 } 272 } {1246 1 1247 2 1248 3 1249 4} 273 do_test autoinc-2.55 { 274 execsql { 275 SELECT * FROM sqlite_sequence 276 } 277 } {t1 1249} 278} 279 280# Create multiple AUTOINCREMENT tables. Make sure all sequences are 281# tracked separately and do not interfere with one another. 282# 283do_test autoinc-2.70 { 284 catchsql { 285 DROP TABLE t2; 286 } 287 execsql { 288 CREATE TABLE t2(d, e INTEGER PRIMARY KEY AUTOINCREMENT, f); 289 INSERT INTO t2(d) VALUES(1); 290 SELECT * FROM sqlite_sequence; 291 } 292} [ifcapable tempdb {list t1 1249 t2 1} else {list t1 1241 t2 1}] 293do_test autoinc-2.71 { 294 execsql { 295 INSERT INTO t2(d) VALUES(2); 296 SELECT * FROM sqlite_sequence; 297 } 298} [ifcapable tempdb {list t1 1249 t2 2} else {list t1 1241 t2 2}] 299do_test autoinc-2.72 { 300 execsql { 301 INSERT INTO t1(x) VALUES(10000); 302 SELECT * FROM sqlite_sequence; 303 } 304} {t1 10000 t2 2} 305do_test autoinc-2.73 { 306 execsql { 307 CREATE TABLE t3(g INTEGER PRIMARY KEY AUTOINCREMENT, h); 308 INSERT INTO t3(h) VALUES(1); 309 SELECT * FROM sqlite_sequence; 310 } 311} {t1 10000 t2 2 t3 1} 312do_test autoinc-2.74 { 313 execsql { 314 INSERT INTO t2(d,e) VALUES(3,100); 315 SELECT * FROM sqlite_sequence; 316 } 317} {t1 10000 t2 100 t3 1} 318 319 320# When a table with an AUTOINCREMENT is deleted, the corresponding entry 321# in the SQLITE_SEQUENCE table should also be deleted. But the SQLITE_SEQUENCE 322# table itself should remain behind. 323# 324do_test autoinc-3.1 { 325 execsql {SELECT name FROM sqlite_sequence} 326} {t1 t2 t3} 327do_test autoinc-3.2 { 328 execsql { 329 DROP TABLE t1; 330 SELECT name FROM sqlite_sequence; 331 } 332} {t2 t3} 333do_test autoinc-3.3 { 334 execsql { 335 DROP TABLE t3; 336 SELECT name FROM sqlite_sequence; 337 } 338} {t2} 339do_test autoinc-3.4 { 340 execsql { 341 DROP TABLE t2; 342 SELECT name FROM sqlite_sequence; 343 } 344} {} 345 346# AUTOINCREMENT on TEMP tables. 347# 348ifcapable tempdb { 349 do_test autoinc-4.1 { 350 execsql { 351 SELECT 1, name FROM sqlite_master WHERE type='table'; 352 SELECT 2, name FROM temp.sqlite_master WHERE type='table'; 353 } 354 } {1 sqlite_sequence} 355 do_test autoinc-4.2 { 356 execsql { 357 CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y); 358 CREATE TEMP TABLE t3(a INTEGER PRIMARY KEY AUTOINCREMENT, b); 359 SELECT 1, name FROM sqlite_master WHERE type='table'; 360 SELECT 2, name FROM sqlite_temp_master WHERE type='table'; 361 } 362 } {1 sqlite_sequence 1 t1 2 t3 2 sqlite_sequence} 363 do_test autoinc-4.3 { 364 execsql { 365 SELECT 1, * FROM main.sqlite_sequence; 366 SELECT 2, * FROM temp.sqlite_sequence; 367 } 368 } {} 369 do_test autoinc-4.4 { 370 execsql { 371 INSERT INTO t1 VALUES(10,1); 372 INSERT INTO t3 VALUES(20,2); 373 INSERT INTO t1 VALUES(NULL,3); 374 INSERT INTO t3 VALUES(NULL,4); 375 } 376 } {} 377 378 ifcapable compound { 379 do_test autoinc-4.4.1 { 380 execsql { 381 SELECT * FROM t1 UNION ALL SELECT * FROM t3; 382 } 383 } {10 1 11 3 20 2 21 4} 384 } ;# ifcapable compound 385 386 do_test autoinc-4.5 { 387 execsql { 388 SELECT 1, * FROM main.sqlite_sequence; 389 SELECT 2, * FROM temp.sqlite_sequence; 390 } 391 } {1 t1 11 2 t3 21} 392 do_test autoinc-4.6 { 393 execsql { 394 INSERT INTO t1 SELECT * FROM t3; 395 SELECT 1, * FROM main.sqlite_sequence; 396 SELECT 2, * FROM temp.sqlite_sequence; 397 } 398 } {1 t1 21 2 t3 21} 399 do_test autoinc-4.7 { 400 execsql { 401 INSERT INTO t3 SELECT x+100, y FROM t1; 402 SELECT 1, * FROM main.sqlite_sequence; 403 SELECT 2, * FROM temp.sqlite_sequence; 404 } 405 } {1 t1 21 2 t3 121} 406 do_test autoinc-4.8 { 407 execsql { 408 DROP TABLE t3; 409 SELECT 1, * FROM main.sqlite_sequence; 410 SELECT 2, * FROM temp.sqlite_sequence; 411 } 412 } {1 t1 21} 413 do_test autoinc-4.9 { 414 execsql { 415 CREATE TEMP TABLE t2(p INTEGER PRIMARY KEY AUTOINCREMENT, q); 416 INSERT INTO t2 SELECT * FROM t1; 417 DROP TABLE t1; 418 SELECT 1, * FROM main.sqlite_sequence; 419 SELECT 2, * FROM temp.sqlite_sequence; 420 } 421 } {2 t2 21} 422 do_test autoinc-4.10 { 423 execsql { 424 DROP TABLE t2; 425 SELECT 1, * FROM main.sqlite_sequence; 426 SELECT 2, * FROM temp.sqlite_sequence; 427 } 428 } {} 429} 430 431# Make sure AUTOINCREMENT works on ATTACH-ed tables. 432# 433ifcapable tempdb&&attach { 434 do_test autoinc-5.1 { 435 forcedelete test2.db 436 forcedelete test2.db-journal 437 sqlite3 db2 test2.db 438 execsql { 439 CREATE TABLE t4(m INTEGER PRIMARY KEY AUTOINCREMENT, n); 440 CREATE TABLE t5(o, p INTEGER PRIMARY KEY AUTOINCREMENT); 441 } db2; 442 execsql { 443 ATTACH 'test2.db' as aux; 444 SELECT 1, * FROM main.sqlite_sequence; 445 SELECT 2, * FROM temp.sqlite_sequence; 446 SELECT 3, * FROM aux.sqlite_sequence; 447 } 448 } {} 449 do_test autoinc-5.2 { 450 execsql { 451 INSERT INTO t4 VALUES(NULL,1); 452 SELECT 1, * FROM main.sqlite_sequence; 453 SELECT 2, * FROM temp.sqlite_sequence; 454 SELECT 3, * FROM aux.sqlite_sequence; 455 } 456 } {3 t4 1} 457 do_test autoinc-5.3 { 458 execsql { 459 INSERT INTO t5 VALUES(100,200); 460 SELECT * FROM sqlite_sequence 461 } db2 462 } {t4 1 t5 200} 463 do_test autoinc-5.4 { 464 execsql { 465 SELECT 1, * FROM main.sqlite_sequence; 466 SELECT 2, * FROM temp.sqlite_sequence; 467 SELECT 3, * FROM aux.sqlite_sequence; 468 } 469 } {3 t4 1 3 t5 200} 470} 471 472# Requirement REQ00310: Make sure an insert fails if the sequence is 473# already at its maximum value. 474# 475ifcapable {rowid32} { 476 do_test autoinc-6.1 { 477 execsql { 478 CREATE TABLE t6(v INTEGER PRIMARY KEY AUTOINCREMENT, w); 479 INSERT INTO t6 VALUES(2147483647,1); 480 SELECT seq FROM main.sqlite_sequence WHERE name='t6'; 481 } 482 } 2147483647 483} 484ifcapable {!rowid32} { 485 do_test autoinc-6.1 { 486 execsql { 487 CREATE TABLE t6(v INTEGER PRIMARY KEY AUTOINCREMENT, w); 488 INSERT INTO t6 VALUES(9223372036854775807,1); 489 SELECT seq FROM main.sqlite_sequence WHERE name='t6'; 490 } 491 } 9223372036854775807 492} 493do_test autoinc-6.2 { 494 catchsql { 495 INSERT INTO t6 VALUES(NULL,1); 496 } 497} {1 {database or disk is full}} 498 499# Allow the AUTOINCREMENT keyword inside the parentheses 500# on a separate PRIMARY KEY designation. 501# 502do_test autoinc-7.1 { 503 execsql { 504 CREATE TABLE t7(x INTEGER, y REAL, PRIMARY KEY(x AUTOINCREMENT)); 505 INSERT INTO t7(y) VALUES(123); 506 INSERT INTO t7(y) VALUES(234); 507 DELETE FROM t7; 508 INSERT INTO t7(y) VALUES(345); 509 SELECT * FROM t7; 510 } 511} {3 345.0} 512 513# Test that if the AUTOINCREMENT is applied to a non integer primary key 514# the error message is sensible. 515do_test autoinc-7.2 { 516 catchsql { 517 CREATE TABLE t8(x TEXT PRIMARY KEY AUTOINCREMENT); 518 } 519} {1 {AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY}} 520 521 522# Ticket #1283. Make sure that preparing but never running a statement 523# that creates the sqlite_sequence table does not mess up the database. 524# 525do_test autoinc-8.1 { 526 catch {db2 close} 527 catch {db close} 528 forcedelete test.db 529 sqlite3 db test.db 530 set DB [sqlite3_connection_pointer db] 531 set STMT [sqlite3_prepare $DB { 532 CREATE TABLE t1( 533 x INTEGER PRIMARY KEY AUTOINCREMENT 534 ) 535 } -1 TAIL] 536 sqlite3_finalize $STMT 537 set STMT [sqlite3_prepare $DB { 538 CREATE TABLE t1( 539 x INTEGER PRIMARY KEY AUTOINCREMENT 540 ) 541 } -1 TAIL] 542 sqlite3_step $STMT 543 sqlite3_finalize $STMT 544 execsql { 545 INSERT INTO t1 VALUES(NULL); 546 SELECT * FROM t1; 547 } 548} {1} 549 550# Ticket #3148 551# Make sure the sqlite_sequence table is not damaged when doing 552# an empty insert - an INSERT INTO ... SELECT ... where the SELECT 553# clause returns an empty set. 554# 555do_test autoinc-9.1 { 556 db eval { 557 CREATE TABLE t2(x INTEGER PRIMARY KEY AUTOINCREMENT, y); 558 INSERT INTO t2 VALUES(NULL, 1); 559 CREATE TABLE t3(a INTEGER PRIMARY KEY AUTOINCREMENT, b); 560 INSERT INTO t3 SELECT * FROM t2 WHERE y>1; 561 562 SELECT * FROM sqlite_sequence WHERE name='t3'; 563 } 564} {t3 0} 565 566ifcapable trigger { 567 catchsql { pragma recursive_triggers = off } 568 569 # Ticket #3928. Make sure that triggers to not make extra slots in 570 # the SQLITE_SEQUENCE table. 571 # 572 do_test autoinc-3928.1 { 573 db eval { 574 CREATE TABLE t3928(a INTEGER PRIMARY KEY AUTOINCREMENT, b); 575 CREATE TRIGGER t3928r1 BEFORE INSERT ON t3928 BEGIN 576 INSERT INTO t3928(b) VALUES('before1'); 577 INSERT INTO t3928(b) VALUES('before2'); 578 END; 579 CREATE TRIGGER t3928r2 AFTER INSERT ON t3928 BEGIN 580 INSERT INTO t3928(b) VALUES('after1'); 581 INSERT INTO t3928(b) VALUES('after2'); 582 END; 583 INSERT INTO t3928(b) VALUES('test'); 584 SELECT * FROM t3928 ORDER BY a; 585 } 586 } {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} 587 do_test autoinc-3928.2 { 588 db eval { 589 SELECT * FROM sqlite_sequence WHERE name='t3928' 590 } 591 } {t3928 13} 592 593 do_test autoinc-3928.3 { 594 db eval { 595 DROP TRIGGER t3928r1; 596 DROP TRIGGER t3928r2; 597 CREATE TRIGGER t3928r3 BEFORE UPDATE ON t3928 598 WHEN typeof(new.b)=='integer' BEGIN 599 INSERT INTO t3928(b) VALUES('before-int-' || new.b); 600 END; 601 CREATE TRIGGER t3928r4 AFTER UPDATE ON t3928 602 WHEN typeof(new.b)=='integer' BEGIN 603 INSERT INTO t3928(b) VALUES('after-int-' || new.b); 604 END; 605 DELETE FROM t3928 WHERE a!=1; 606 UPDATE t3928 SET b=456 WHERE a=1; 607 SELECT * FROM t3928 ORDER BY a; 608 } 609 } {1 456 14 before-int-456 15 after-int-456} 610 do_test autoinc-3928.4 { 611 db eval { 612 SELECT * FROM sqlite_sequence WHERE name='t3928' 613 } 614 } {t3928 15} 615 616 do_test autoinc-3928.5 { 617 db eval { 618 CREATE TABLE t3928b(x); 619 INSERT INTO t3928b VALUES(100); 620 INSERT INTO t3928b VALUES(200); 621 INSERT INTO t3928b VALUES(300); 622 DELETE FROM t3928; 623 CREATE TABLE t3928c(y INTEGER PRIMARY KEY AUTOINCREMENT, z); 624 CREATE TRIGGER t3928br1 BEFORE DELETE ON t3928b BEGIN 625 INSERT INTO t3928(b) VALUES('before-del-'||old.x); 626 INSERT INTO t3928c(z) VALUES('before-del-'||old.x); 627 END; 628 CREATE TRIGGER t3928br2 AFTER DELETE ON t3928b BEGIN 629 INSERT INTO t3928(b) VALUES('after-del-'||old.x); 630 INSERT INTO t3928c(z) VALUES('after-del-'||old.x); 631 END; 632 DELETE FROM t3928b; 633 SELECT * FROM t3928 ORDER BY a; 634 } 635 } {16 before-del-100 17 after-del-100 18 before-del-200 19 after-del-200 20 before-del-300 21 after-del-300} 636 do_test autoinc-3928.6 { 637 db eval { 638 SELECT * FROM t3928c ORDER BY y; 639 } 640 } {1 before-del-100 2 after-del-100 3 before-del-200 4 after-del-200 5 before-del-300 6 after-del-300} 641 do_test autoinc-3928.7 { 642 db eval { 643 SELECT * FROM sqlite_sequence WHERE name LIKE 't3928%' ORDER BY name; 644 } 645 } {t3928 21 t3928c 6} 646 647 # Ticket [a696379c1f0886615541a48b35bd8181a80e88f8] 648 do_test autoinc-a69637.1 { 649 db eval { 650 CREATE TABLE ta69637_1(x INTEGER PRIMARY KEY AUTOINCREMENT, y); 651 CREATE TABLE ta69637_2(z); 652 CREATE TRIGGER ra69637_1 AFTER INSERT ON ta69637_2 BEGIN 653 INSERT INTO ta69637_1(y) VALUES(new.z+1); 654 END; 655 INSERT INTO ta69637_2 VALUES(123); 656 SELECT * FROM ta69637_1; 657 } 658 } {1 124} 659 do_test autoinc-a69637.2 { 660 db eval { 661 CREATE VIEW va69637_2 AS SELECT * FROM ta69637_2; 662 CREATE TRIGGER ra69637_2 INSTEAD OF INSERT ON va69637_2 BEGIN 663 INSERT INTO ta69637_1(y) VALUES(new.z+10000); 664 END; 665 INSERT INTO va69637_2 VALUES(123); 666 SELECT * FROM ta69637_1; 667 } 668 } {1 124 2 10123} 669} 670 671# 2016-10-03 ticket https://www.sqlite.org/src/tktview/7b3328086a5c1 672# Make sure autoincrement plays nicely with the xfer optimization 673# 674do_execsql_test autoinc-10.1 { 675 DELETE FROM sqlite_sequence; 676 CREATE TABLE t10a(a INTEGER PRIMARY KEY AUTOINCREMENT, b UNIQUE); 677 INSERT INTO t10a VALUES(888,9999); 678 CREATE TABLE t10b(x INTEGER PRIMARY KEY AUTOINCREMENT, y UNIQUE); 679 INSERT INTO t10b SELECT * FROM t10a; 680 SELECT * FROM sqlite_sequence; 681} {t10a 888 t10b 888} 682 683# 2018-04-21 autoincrement does not cause problems for upsert 684# 685do_execsql_test autoinc-11.1 { 686 CREATE TABLE t11(a INTEGER PRIMARY KEY AUTOINCREMENT,b UNIQUE); 687 INSERT INTO t11(a,b) VALUES(2,3),(5,6),(4,3),(1,2) 688 ON CONFLICT(b) DO UPDATE SET a=a+1000; 689 SELECT seq FROM sqlite_sequence WHERE name='t11'; 690} {5} 691 692# 2018-05-23 ticket d8dc2b3a58cd5dc2918a1d4acbba4676a23ada4c 693# Does not crash if the sqlite_sequence table schema is missing 694# or corrupt. 695# 696do_test autoinc-12.1 { 697 db close 698 forcedelete test.db 699 sqlite3 db test.db 700 sqlite3_db_config db DEFENSIVE 0 701 db eval { 702 CREATE TABLE fake_sequence(name TEXT PRIMARY KEY,seq) WITHOUT ROWID; 703 PRAGMA writable_schema=on; 704 UPDATE sqlite_master SET 705 sql=replace(sql,'fake_','sqlite_'), 706 name='sqlite_sequence', 707 tbl_name='sqlite_sequence' 708 WHERE name='fake_sequence'; 709 } 710 db close 711 sqlite3 db test.db 712 set res [catch {db eval { 713 CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 714 INSERT INTO t1(b) VALUES('one'); 715 }} msg] 716 lappend res $msg 717} {1 {database disk image is malformed}} 718do_test autoinc-12.2 { 719 db close 720 forcedelete test.db 721 sqlite3 db test.db 722 sqlite3_db_config db DEFENSIVE 0 723 db eval { 724 CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 725 INSERT INTO t1(b) VALUES('one'); 726 PRAGMA writable_schema=on; 727 UPDATE sqlite_master SET 728 sql=replace(sql,'sqlite_','x_'), 729 name='x_sequence', 730 tbl_name='x_sequence' 731 WHERE name='sqlite_sequence'; 732 } 733 db close 734 sqlite3 db test.db 735 set res [catch {db eval { 736 INSERT INTO t1(b) VALUES('two'); 737 }} msg] 738 lappend res $msg 739} {1 {database disk image is malformed}} 740ifcapable vtab { 741 set err "database disk image is malformed" 742} else { 743 set err {malformed database schema (sqlite_sequence) - near "VIRTUAL": syntax error} 744} 745do_test autoinc-12.3 { 746 db close 747 forcedelete test.db 748 sqlite3 db test.db 749 sqlite3_db_config db DEFENSIVE 0 750 db eval { 751 CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 752 INSERT INTO t1(b) VALUES('one'); 753 PRAGMA writable_schema=on; 754 UPDATE sqlite_master SET 755 sql='CREATE VIRTUAL TABLE sqlite_sequence USING sqlite_dbpage' 756 WHERE name='sqlite_sequence'; 757 } 758 db close 759 sqlite3 db test.db 760 set res [catch {db eval { 761 INSERT INTO t1(b) VALUES('two'); 762 }} msg] 763 lappend res $msg 764} [list 1 $err] 765do_test autoinc-12.4 { 766 db close 767 forcedelete test.db 768 sqlite3 db test.db 769 db eval { 770 CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 771 INSERT INTO t1(b) VALUES('one'); 772 CREATE TABLE fake(name TEXT PRIMARY KEY,seq) WITHOUT ROWID; 773 } 774 set root1 [db one {SELECT rootpage FROM sqlite_master 775 WHERE name='sqlite_sequence'}] 776 set root2 [db one {SELECT rootpage FROM sqlite_master 777 WHERE name='fake'}] 778 sqlite3_db_config db DEFENSIVE 0 779 db eval { 780 PRAGMA writable_schema=on; 781 UPDATE sqlite_master SET rootpage=$root2 782 WHERE name='sqlite_sequence'; 783 UPDATE sqlite_master SET rootpage=$root1 784 WHERE name='fake'; 785 } 786 db close 787 sqlite3 db test.db 788 set res [catch {db eval { 789 INSERT INTO t1(b) VALUES('two'); 790 }} msg] 791 lappend res $msg 792} {1 {database disk image is malformed}} 793breakpoint 794do_test autoinc-12.5 { 795 db close 796 forcedelete test.db 797 sqlite3 db test.db 798 sqlite3_db_config db DEFENSIVE 0 799 db eval { 800 CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 801 INSERT INTO t1(b) VALUES('one'); 802 PRAGMA writable_schema=on; 803 UPDATE sqlite_master SET 804 sql='CREATE TABLE sqlite_sequence(x)' 805 WHERE name='sqlite_sequence'; 806 } 807 db close 808 sqlite3 db test.db 809 set res [catch {db eval { 810 INSERT INTO t1(b) VALUES('two'); 811 }} msg] 812 lappend res $msg 813} {1 {database disk image is malformed}} 814do_test autoinc-12.6 { 815 db close 816 forcedelete test.db 817 sqlite3 db test.db 818 sqlite3_db_config db DEFENSIVE 0 819 db eval { 820 CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 821 INSERT INTO t1(b) VALUES('one'); 822 PRAGMA writable_schema=on; 823 UPDATE sqlite_master SET 824 sql='CREATE TABLE sqlite_sequence(x,y INTEGER PRIMARY KEY)' 825 WHERE name='sqlite_sequence'; 826 } 827 db close 828 sqlite3 db test.db 829 set res [catch {db eval { 830 INSERT INTO t1(b) VALUES('two'),('three'),('four'); 831 INSERT INTO t1(b) VALUES('five'); 832 PRAGMA integrity_check; 833 }} msg] 834 lappend res $msg 835} {0 ok} 836do_test autoinc-12.7 { 837 db close 838 forcedelete test.db 839 sqlite3 db test.db 840 sqlite3_db_config db DEFENSIVE 0 841 db eval { 842 CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT); 843 INSERT INTO t1(b) VALUES('one'); 844 PRAGMA writable_schema=on; 845 UPDATE sqlite_master SET 846 sql='CREATE TABLE sqlite_sequence(y INTEGER PRIMARY KEY,x)' 847 WHERE name='sqlite_sequence'; 848 } 849 db close 850 sqlite3 db test.db 851 set res [catch {db eval { 852 INSERT INTO t1(b) VALUES('two'),('three'),('four'); 853 INSERT INTO t1(b) VALUES('five'); 854 PRAGMA integrity_check; 855 }} msg] 856 lappend res $msg 857} {0 ok} 858 859finish_test 860