OLD | NEW |
1 # 2005 December 30 | 1 # 2005 December 30 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
11 # | 11 # |
12 # $Id: shared.test,v 1.36 2009/03/16 13:19:36 danielk1977 Exp $ | 12 # $Id: shared.test,v 1.36 2009/03/16 13:19:36 danielk1977 Exp $ |
13 | 13 |
14 set testdir [file dirname $argv0] | 14 set testdir [file dirname $argv0] |
15 source $testdir/tester.tcl | 15 source $testdir/tester.tcl |
16 db close | 16 db close |
17 | 17 |
18 # These tests cannot be run without the ATTACH command. | 18 # These tests cannot be run without the ATTACH command. |
19 # | 19 # |
20 ifcapable !shared_cache||!attach { | 20 ifcapable !shared_cache||!attach { |
21 finish_test | 21 finish_test |
22 return | 22 return |
23 } | 23 } |
24 | 24 |
25 set ::enable_shared_cache [sqlite3_enable_shared_cache 1] | 25 set ::enable_shared_cache [sqlite3_enable_shared_cache 1] |
26 | 26 |
27 foreach av [list 0 1] { | 27 foreach av [list 0 1] { |
28 | 28 |
29 # Open the database connection and execute the auto-vacuum pragma | 29 # Open the database connection and execute the auto-vacuum pragma |
30 file delete -force test.db | 30 forcedelete test.db |
31 sqlite3 db test.db | 31 sqlite3 db test.db |
32 | 32 |
33 ifcapable autovacuum { | 33 ifcapable autovacuum { |
34 do_test shared-[expr $av+1].1.0 { | 34 do_test shared-[expr $av+1].1.0 { |
35 execsql "pragma auto_vacuum=$::av" | 35 execsql "pragma auto_vacuum=$::av" |
36 execsql {pragma auto_vacuum} | 36 execsql {pragma auto_vacuum} |
37 } "$av" | 37 } "$av" |
38 } else { | 38 } else { |
39 if {$av} { | 39 if {$av} { |
40 db close | 40 db close |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 # | 286 # |
287 | 287 |
288 # Open two database handles db and db2. Each has a single attach database | 288 # Open two database handles db and db2. Each has a single attach database |
289 # (as well as main): | 289 # (as well as main): |
290 # | 290 # |
291 # db.main -> ./test.db | 291 # db.main -> ./test.db |
292 # db.test2 -> ./test2.db | 292 # db.test2 -> ./test2.db |
293 # db2.main -> ./test2.db | 293 # db2.main -> ./test2.db |
294 # db2.test -> ./test.db | 294 # db2.test -> ./test.db |
295 # | 295 # |
296 file delete -force test.db | 296 forcedelete test.db |
297 file delete -force test2.db | 297 forcedelete test2.db |
298 file delete -force test2.db-journal | 298 forcedelete test2.db-journal |
299 sqlite3 db test.db | 299 sqlite3 db test.db |
300 sqlite3 db2 test2.db | 300 sqlite3 db2 test2.db |
301 do_test shared-$av.4.1.1 { | 301 do_test shared-$av.4.1.1 { |
302 set sqlite_open_file_count | 302 set sqlite_open_file_count |
303 expr $sqlite_open_file_count-($extrafds_prelock*2) | 303 expr $sqlite_open_file_count-($extrafds_prelock*2) |
304 } {2} | 304 } {2} |
305 do_test shared-$av.4.1.2 { | 305 do_test shared-$av.4.1.2 { |
306 execsql {ATTACH 'test2.db' AS test2} | 306 execsql {ATTACH 'test2.db' AS test2} |
307 set sqlite_open_file_count | 307 set sqlite_open_file_count |
308 expr $sqlite_open_file_count-($extrafds_postlock*2) | 308 expr $sqlite_open_file_count-($extrafds_postlock*2) |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 } {1 {(6) database schema is locked: test}} | 419 } {1 {(6) database schema is locked: test}} |
420 | 420 |
421 | 421 |
422 catch {db2 close} | 422 catch {db2 close} |
423 catch {db close} | 423 catch {db close} |
424 | 424 |
425 #-------------------------------------------------------------------------- | 425 #-------------------------------------------------------------------------- |
426 # Tests shared-5.* | 426 # Tests shared-5.* |
427 # | 427 # |
428 foreach db [list test.db test1.db test2.db test3.db] { | 428 foreach db [list test.db test1.db test2.db test3.db] { |
429 file delete -force $db ${db}-journal | 429 forcedelete $db ${db}-journal |
430 } | 430 } |
431 do_test shared-$av.5.1.1 { | 431 do_test shared-$av.5.1.1 { |
432 sqlite3 db1 test.db | 432 sqlite3 db1 test.db |
433 sqlite3 db2 test.db | 433 sqlite3 db2 test.db |
434 execsql { | 434 execsql { |
435 ATTACH 'test1.db' AS test1; | 435 ATTACH 'test1.db' AS test1; |
436 ATTACH 'test2.db' AS test2; | 436 ATTACH 'test2.db' AS test2; |
437 ATTACH 'test3.db' AS test3; | 437 ATTACH 'test3.db' AS test3; |
438 } db1 | 438 } db1 |
439 execsql { | 439 execsql { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 } { | 550 } { |
551 lappend ret $d | 551 lappend ret $d |
552 } | 552 } |
553 } | 553 } |
554 set ret | 554 set ret |
555 } {} | 555 } {} |
556 | 556 |
557 catch {db1 close} | 557 catch {db1 close} |
558 catch {db2 close} | 558 catch {db2 close} |
559 foreach f [list test.db test2.db] { | 559 foreach f [list test.db test2.db] { |
560 file delete -force $f ${f}-journal | 560 forcedelete $f ${f}-journal |
561 } | 561 } |
562 | 562 |
563 #-------------------------------------------------------------------------- | 563 #-------------------------------------------------------------------------- |
564 # Tests shared-7.* test auto-vacuum does not invalidate cursors from | 564 # Tests shared-7.* test auto-vacuum does not invalidate cursors from |
565 # other shared-cache users when it reorganizes the database on | 565 # other shared-cache users when it reorganizes the database on |
566 # COMMIT. | 566 # COMMIT. |
567 # | 567 # |
568 do_test shared-$av.7.1 { | 568 do_test shared-$av.7.1 { |
569 # This test case sets up a test database in auto-vacuum mode consisting | 569 # This test case sets up a test database in auto-vacuum mode consisting |
570 # of two tables, t1 and t2. Both have a single index. Table t1 is | 570 # of two tables, t1 and t2. Both have a single index. Table t1 is |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 } {0} | 636 } {0} |
637 | 637 |
638 catch {db close} | 638 catch {db close} |
639 catch {db2 close} | 639 catch {db2 close} |
640 unset -nocomplain contents | 640 unset -nocomplain contents |
641 | 641 |
642 #-------------------------------------------------------------------------- | 642 #-------------------------------------------------------------------------- |
643 # The following tests try to trick the shared-cache code into assuming | 643 # The following tests try to trick the shared-cache code into assuming |
644 # the wrong encoding for a database. | 644 # the wrong encoding for a database. |
645 # | 645 # |
646 file delete -force test.db test.db-journal | 646 forcedelete test.db test.db-journal |
647 ifcapable utf16 { | 647 ifcapable utf16 { |
648 do_test shared-$av.8.1.1 { | 648 do_test shared-$av.8.1.1 { |
649 sqlite3 db test.db | 649 sqlite3 db test.db |
650 execsql { | 650 execsql { |
651 PRAGMA encoding = 'UTF-16'; | 651 PRAGMA encoding = 'UTF-16'; |
652 SELECT * FROM sqlite_master; | 652 SELECT * FROM sqlite_master; |
653 } | 653 } |
654 } {} | 654 } {} |
655 do_test shared-$av.8.1.2 { | 655 do_test shared-$av.8.1.2 { |
656 string range [execsql {PRAGMA encoding;}] 0 end-2 | 656 string range [execsql {PRAGMA encoding;}] 0 end-2 |
(...skipping 11 matching lines...) Expand all Loading... |
668 SELECT * FROM sqlite_master; | 668 SELECT * FROM sqlite_master; |
669 } | 669 } |
670 } "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}" | 670 } "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}" |
671 do_test shared-$av.8.1.5 { | 671 do_test shared-$av.8.1.5 { |
672 db2 close | 672 db2 close |
673 execsql { | 673 execsql { |
674 PRAGMA encoding; | 674 PRAGMA encoding; |
675 } | 675 } |
676 } {UTF-8} | 676 } {UTF-8} |
677 | 677 |
678 file delete -force test2.db test2.db-journal | 678 forcedelete test2.db test2.db-journal |
679 do_test shared-$av.8.2.1 { | 679 do_test shared-$av.8.2.1 { |
680 execsql { | 680 execsql { |
681 ATTACH 'test2.db' AS aux; | 681 ATTACH 'test2.db' AS aux; |
682 SELECT * FROM aux.sqlite_master; | 682 SELECT * FROM aux.sqlite_master; |
683 } | 683 } |
684 } {} | 684 } {} |
685 do_test shared-$av.8.2.2 { | 685 do_test shared-$av.8.2.2 { |
686 sqlite3 db2 test2.db | 686 sqlite3 db2 test2.db |
687 execsql { | 687 execsql { |
688 PRAGMA encoding = 'UTF-16'; | 688 PRAGMA encoding = 'UTF-16'; |
689 CREATE TABLE def(d, e, f); | 689 CREATE TABLE def(d, e, f); |
690 } db2 | 690 } db2 |
691 string range [execsql {PRAGMA encoding;} db2] 0 end-2 | 691 string range [execsql {PRAGMA encoding;} db2] 0 end-2 |
692 } {UTF-16} | 692 } {UTF-16} |
693 | 693 |
694 catch {db close} | 694 catch {db close} |
695 catch {db2 close} | 695 catch {db2 close} |
696 file delete -force test.db test2.db | 696 forcedelete test.db test2.db |
697 | 697 |
698 do_test shared-$av.8.3.2 { | 698 do_test shared-$av.8.3.2 { |
699 sqlite3 db test.db | 699 sqlite3 db test.db |
700 execsql { CREATE TABLE def(d, e, f) } | 700 execsql { CREATE TABLE def(d, e, f) } |
701 execsql { PRAGMA encoding } | 701 execsql { PRAGMA encoding } |
702 } {UTF-8} | 702 } {UTF-8} |
703 do_test shared-$av.8.3.3 { | 703 do_test shared-$av.8.3.3 { |
704 set zDb16 "[encoding convertto unicode test.db]\x00\x00" | 704 set zDb16 "[encoding convertto unicode test.db]\x00\x00" |
705 set db16 [sqlite3_open16 $zDb16 {}] | 705 set db16 [sqlite3_open16 $zDb16 {}] |
706 | 706 |
(...skipping 18 matching lines...) Expand all Loading... |
725 do_test shared-$av.8.2.3 { | 725 do_test shared-$av.8.2.3 { |
726 catchsql { | 726 catchsql { |
727 SELECT * FROM aux.sqlite_master; | 727 SELECT * FROM aux.sqlite_master; |
728 } | 728 } |
729 } {1 {attached databases must use the same text encoding as main database}} | 729 } {1 {attached databases must use the same text encoding as main database}} |
730 } | 730 } |
731 } | 731 } |
732 | 732 |
733 catch {db close} | 733 catch {db close} |
734 catch {db2 close} | 734 catch {db2 close} |
735 file delete -force test.db test2.db | 735 forcedelete test.db test2.db |
736 | 736 |
737 #--------------------------------------------------------------------------- | 737 #--------------------------------------------------------------------------- |
738 # The following tests - shared-9.* - test interactions between TEMP triggers | 738 # The following tests - shared-9.* - test interactions between TEMP triggers |
739 # and shared-schemas. | 739 # and shared-schemas. |
740 # | 740 # |
741 ifcapable trigger&&tempdb { | 741 ifcapable trigger&&tempdb { |
742 | 742 |
743 do_test shared-$av.9.1 { | 743 do_test shared-$av.9.1 { |
744 sqlite3 db test.db | 744 sqlite3 db test.db |
745 sqlite3 db2 test.db | 745 sqlite3 db2 test.db |
(...skipping 19 matching lines...) Expand all Loading... |
765 } {} | 765 } {} |
766 | 766 |
767 } ; # End shared-9.* | 767 } ; # End shared-9.* |
768 | 768 |
769 #--------------------------------------------------------------------------- | 769 #--------------------------------------------------------------------------- |
770 # The following tests - shared-10.* - test that the library behaves | 770 # The following tests - shared-10.* - test that the library behaves |
771 # correctly when a connection to a shared-cache is closed. | 771 # correctly when a connection to a shared-cache is closed. |
772 # | 772 # |
773 do_test shared-$av.10.1 { | 773 do_test shared-$av.10.1 { |
774 # Create a small sample database with two connections to it (db and db2). | 774 # Create a small sample database with two connections to it (db and db2). |
775 file delete -force test.db | 775 forcedelete test.db |
776 sqlite3 db test.db | 776 sqlite3 db test.db |
777 sqlite3 db2 test.db | 777 sqlite3 db2 test.db |
778 execsql { | 778 execsql { |
779 CREATE TABLE ab(a PRIMARY KEY, b); | 779 CREATE TABLE ab(a PRIMARY KEY, b); |
780 CREATE TABLE de(d PRIMARY KEY, e); | 780 CREATE TABLE de(d PRIMARY KEY, e); |
781 INSERT INTO ab VALUES('Chiang Mai', 100000); | 781 INSERT INTO ab VALUES('Chiang Mai', 100000); |
782 INSERT INTO ab VALUES('Bangkok', 8000000); | 782 INSERT INTO ab VALUES('Bangkok', 8000000); |
783 INSERT INTO de VALUES('Ubon', 120000); | 783 INSERT INTO de VALUES('Ubon', 120000); |
784 INSERT INTO de VALUES('Khon Kaen', 200000); | 784 INSERT INTO de VALUES('Khon Kaen', 200000); |
785 } | 785 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 # Commit the external transaction. | 846 # Commit the external transaction. |
847 catchsql {COMMIT} db3 | 847 catchsql {COMMIT} db3 |
848 } {0 {}} | 848 } {0 {}} |
849 integrity_check shared-$av.10.10 | 849 integrity_check shared-$av.10.10 |
850 do_test shared-$av.10.11 { | 850 do_test shared-$av.10.11 { |
851 db close | 851 db close |
852 db3 close | 852 db3 close |
853 } {} | 853 } {} |
854 | 854 |
855 do_test shared-$av.11.1 { | 855 do_test shared-$av.11.1 { |
856 file delete -force test.db | 856 forcedelete test.db |
857 sqlite3 db test.db | 857 sqlite3 db test.db |
858 sqlite3 db2 test.db | 858 sqlite3 db2 test.db |
859 execsql { | 859 execsql { |
860 CREATE TABLE abc(a, b, c); | 860 CREATE TABLE abc(a, b, c); |
861 CREATE TABLE abc2(a, b, c); | 861 CREATE TABLE abc2(a, b, c); |
862 BEGIN; | 862 BEGIN; |
863 INSERT INTO abc VALUES(1, 2, 3); | 863 INSERT INTO abc VALUES(1, 2, 3); |
864 } | 864 } |
865 } {} | 865 } {} |
866 do_test shared-$av.11.2 { | 866 do_test shared-$av.11.2 { |
(...skipping 30 matching lines...) Expand all Loading... |
897 SELECT abc.a as I, abc2.a as II FROM abc, abc2; | 897 SELECT abc.a as I, abc2.a as II FROM abc, abc2; |
898 } { | 898 } { |
899 execsql { | 899 execsql { |
900 DELETE FROM abc WHERE 1; | 900 DELETE FROM abc WHERE 1; |
901 } | 901 } |
902 lappend res $I $II | 902 lappend res $I $II |
903 } | 903 } |
904 set res | 904 set res |
905 } {1 4 {} 7} | 905 } {1 4 {} 7} |
906 if {[llength [info command sqlite3_shared_cache_report]]==1} { | 906 if {[llength [info command sqlite3_shared_cache_report]]==1} { |
907 do_test shared-$av.11.9 { | 907 ifcapable curdir { |
908 string tolower [sqlite3_shared_cache_report] | 908 do_test shared-$av.11.9 { |
909 } [string tolower [list [file nativename [file normalize test.db]] 2]] | 909 string tolower [sqlite3_shared_cache_report] |
| 910 } [string tolower [list [file nativename [file normalize test.db]] 2]] |
| 911 } |
910 } | 912 } |
911 | 913 |
912 do_test shared-$av.11.11 { | 914 do_test shared-$av.11.11 { |
913 db close | 915 db close |
914 db2 close | 916 db2 close |
915 } {} | 917 } {} |
916 | 918 |
917 # This tests that if it is impossible to free any pages, SQLite will | 919 # This tests that if it is impossible to free any pages, SQLite will |
918 # exceed the limit set by PRAGMA cache_size. | 920 # exceed the limit set by PRAGMA cache_size. |
919 file delete -force test.db test.db-journal | 921 forcedelete test.db test.db-journal |
920 sqlite3 db test.db | 922 sqlite3 db test.db |
921 ifcapable pager_pragmas { | 923 ifcapable pager_pragmas { |
922 do_test shared-$av.12.1 { | 924 do_test shared-$av.12.1 { |
923 execsql { | 925 execsql { |
924 PRAGMA cache_size = 10; | 926 PRAGMA cache_size = 10; |
925 PRAGMA cache_size; | 927 PRAGMA cache_size; |
926 } | 928 } |
927 } {10} | 929 } {10} |
928 } | 930 } |
929 do_test shared-$av.12.2 { | 931 do_test shared-$av.12.2 { |
(...skipping 26 matching lines...) Expand all Loading... |
956 } | 958 } |
957 } {} | 959 } {} |
958 | 960 |
959 # Internally, locks are acquired on shared B-Tree structures in the order | 961 # Internally, locks are acquired on shared B-Tree structures in the order |
960 # that the structures appear in the virtual memory address space. This | 962 # that the structures appear in the virtual memory address space. This |
961 # test case attempts to cause the order of the structures in memory | 963 # test case attempts to cause the order of the structures in memory |
962 # to be different from the order in which they are attached to a given | 964 # to be different from the order in which they are attached to a given |
963 # database handle. This covers an extra line or two. | 965 # database handle. This covers an extra line or two. |
964 # | 966 # |
965 do_test shared-$av.13.1 { | 967 do_test shared-$av.13.1 { |
966 file delete -force test2.db test3.db test4.db test5.db | 968 forcedelete test2.db test3.db test4.db test5.db |
967 sqlite3 db :memory: | 969 sqlite3 db :memory: |
968 execsql { | 970 execsql { |
969 ATTACH 'test2.db' AS aux2; | 971 ATTACH 'test2.db' AS aux2; |
970 ATTACH 'test3.db' AS aux3; | 972 ATTACH 'test3.db' AS aux3; |
971 ATTACH 'test4.db' AS aux4; | 973 ATTACH 'test4.db' AS aux4; |
972 ATTACH 'test5.db' AS aux5; | 974 ATTACH 'test5.db' AS aux5; |
973 DETACH aux2; | 975 DETACH aux2; |
974 DETACH aux3; | 976 DETACH aux3; |
975 DETACH aux4; | 977 DETACH aux4; |
976 ATTACH 'test2.db' AS aux2; | 978 ATTACH 'test2.db' AS aux2; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1019 } {} | 1021 } {} |
1020 | 1022 |
1021 # Populate a database schema using connection [db]. Then drop it using | 1023 # Populate a database schema using connection [db]. Then drop it using |
1022 # [db2]. This is to try to find any points where shared-schema elements | 1024 # [db2]. This is to try to find any points where shared-schema elements |
1023 # are allocated using the lookaside buffer of [db]. | 1025 # are allocated using the lookaside buffer of [db]. |
1024 # | 1026 # |
1025 # Mutexes are enabled for this test as that activates a couple of useful | 1027 # Mutexes are enabled for this test as that activates a couple of useful |
1026 # assert() statements in the C code. | 1028 # assert() statements in the C code. |
1027 # | 1029 # |
1028 do_test shared-$av-15.1 { | 1030 do_test shared-$av-15.1 { |
1029 file delete -force test.db | 1031 forcedelete test.db |
1030 sqlite3 db test.db -fullmutex 1 | 1032 sqlite3 db test.db -fullmutex 1 |
1031 sqlite3 db2 test.db -fullmutex 1 | 1033 sqlite3 db2 test.db -fullmutex 1 |
1032 execsql { | 1034 execsql { |
1033 CREATE TABLE t1(a, b, c); | 1035 CREATE TABLE t1(a, b, c); |
1034 CREATE INDEX i1 ON t1(a, b); | 1036 CREATE INDEX i1 ON t1(a, b); |
1035 CREATE VIEW v1 AS SELECT * FROM t1; | 1037 CREATE VIEW v1 AS SELECT * FROM t1; |
1036 CREATE VIEW v2 AS SELECT * FROM t1, v1 | 1038 CREATE VIEW v2 AS SELECT * FROM t1, v1 |
1037 WHERE t1.c=v1.c GROUP BY t1.a ORDER BY v1.b; | 1039 WHERE t1.c=v1.c GROUP BY t1.a ORDER BY v1.b; |
1038 CREATE TRIGGER tr1 AFTER INSERT ON t1 | 1040 CREATE TRIGGER tr1 AFTER INSERT ON t1 |
1039 WHEN new.a!=1 | 1041 WHEN new.a!=1 |
1040 BEGIN | 1042 BEGIN |
1041 DELETE FROM t1 WHERE a=5; | 1043 DELETE FROM t1 WHERE a=5; |
1042 INSERT INTO t1 VALUES(1, 2, 3); | 1044 INSERT INTO t1 VALUES(1, 2, 3); |
1043 UPDATE t1 SET c=c+1; | 1045 UPDATE t1 SET c=c+1; |
1044 END; | 1046 END; |
1045 | 1047 |
1046 INSERT INTO t1 VALUES(5, 6, 7); | 1048 INSERT INTO t1 VALUES(5, 6, 7); |
1047 INSERT INTO t1 VALUES(8, 9, 10); | 1049 INSERT INTO t1 VALUES(8, 9, 10); |
1048 INSERT INTO t1 VALUES(11, 12, 13); | 1050 INSERT INTO t1 VALUES(11, 12, 13); |
1049 ANALYZE; | 1051 ANALYZE; |
1050 SELECT * FROM t1; | 1052 SELECT * FROM t1; |
1051 } | 1053 } |
1052 } {1 2 6 8 9 12 1 2 5 11 12 14 1 2 4} | 1054 } {1 2 6 8 9 12 1 2 5 11 12 14 1 2 4} |
1053 do_test shared-$av-15.2 { | 1055 do_test shared-$av-15.2 { |
1054 execsql { DROP TABLE t1 } db2 | 1056 execsql { DROP TABLE t1 } db2 |
1055 } {} | 1057 } {} |
1056 db close | 1058 db close |
1057 db2 close | 1059 db2 close |
1058 | 1060 |
1059 } | 1061 # Shared cache on a :memory: database. This only works for URI filenames. |
| 1062 # |
| 1063 do_test shared-$av-16.1 { |
| 1064 sqlite3 db1 file::memory: -uri 1 |
| 1065 sqlite3 db2 file::memory: -uri 1 |
| 1066 db1 eval { |
| 1067 CREATE TABLE t1(x); INSERT INTO t1 VALUES(1),(2),(3); |
| 1068 } |
| 1069 db2 eval { |
| 1070 SELECT x FROM t1 ORDER BY x; |
| 1071 } |
| 1072 } {1 2 3} |
| 1073 do_test shared-$av-16.2 { |
| 1074 db2 eval { |
| 1075 INSERT INTO t1 VALUES(99); |
| 1076 DELETE FROM t1 WHERE x=2; |
| 1077 } |
| 1078 db1 eval { |
| 1079 SELECT x FROM t1 ORDER BY x; |
| 1080 } |
| 1081 } {1 3 99} |
| 1082 |
| 1083 # Verify that there is no cache sharing ordinary (non-URI) filenames are |
| 1084 # used. |
| 1085 # |
| 1086 do_test shared-$av-16.3 { |
| 1087 db1 close |
| 1088 db2 close |
| 1089 sqlite3 db1 :memory: |
| 1090 sqlite3 db2 :memory: |
| 1091 db1 eval { |
| 1092 CREATE TABLE t1(x); INSERT INTO t1 VALUES(4),(5),(6); |
| 1093 } |
| 1094 catchsql { |
| 1095 SELECT * FROM t1; |
| 1096 } db2 |
| 1097 } {1 {no such table: t1}} |
| 1098 |
| 1099 # Shared cache on named memory databases. |
| 1100 # |
| 1101 do_test shared-$av-16.4 { |
| 1102 db1 close |
| 1103 db2 close |
| 1104 forcedelete test.db test.db-wal test.db-journal |
| 1105 sqlite3 db1 file:test.db?mode=memory -uri 1 |
| 1106 sqlite3 db2 file:test.db?mode=memory -uri 1 |
| 1107 db1 eval { |
| 1108 CREATE TABLE t1(x); INSERT INTO t1 VALUES(1),(2),(3); |
| 1109 } |
| 1110 db2 eval { |
| 1111 SELECT x FROM t1 ORDER BY x; |
| 1112 } |
| 1113 } {1 2 3} |
| 1114 do_test shared-$av-16.5 { |
| 1115 db2 eval { |
| 1116 INSERT INTO t1 VALUES(99); |
| 1117 DELETE FROM t1 WHERE x=2; |
| 1118 } |
| 1119 db1 eval { |
| 1120 SELECT x FROM t1 ORDER BY x; |
| 1121 } |
| 1122 } {1 3 99} |
| 1123 do_test shared-$av-16.6 { |
| 1124 file exists test.db |
| 1125 } {0} ;# Verify that the database is in-memory |
| 1126 |
| 1127 # Shared cache on named memory databases with different names. |
| 1128 # |
| 1129 do_test shared-$av-16.7 { |
| 1130 db1 close |
| 1131 db2 close |
| 1132 forcedelete test1.db test2.db |
| 1133 sqlite3 db1 file:test1.db?mode=memory -uri 1 |
| 1134 sqlite3 db2 file:test2.db?mode=memory -uri 1 |
| 1135 db1 eval { |
| 1136 CREATE TABLE t1(x); INSERT INTO t1 VALUES(1),(2),(3); |
| 1137 } |
| 1138 catchsql { |
| 1139 SELECT x FROM t1 ORDER BY x; |
| 1140 } db2 |
| 1141 } {1 {no such table: t1}} |
| 1142 do_test shared-$av-16.8 { |
| 1143 file exists test1.db |
| 1144 } {0} ;# Verify that the database is in-memory |
| 1145 |
| 1146 # Shared cache on named memory databases attached to readonly connections. |
| 1147 # |
| 1148 do_test shared-$av-16.8.1 { |
| 1149 db1 close |
| 1150 db2 close |
| 1151 |
| 1152 sqlite3 db test1.db |
| 1153 db eval { |
| 1154 CREATE TABLE yy(a, b); |
| 1155 INSERT INTO yy VALUES(77, 88); |
| 1156 } |
| 1157 db close |
| 1158 |
| 1159 sqlite3 db1 test1.db -uri 1 -readonly 1 |
| 1160 sqlite3 db2 test2.db -uri 1 |
| 1161 |
| 1162 db1 eval { |
| 1163 ATTACH 'file:mem?mode=memory&cache=shared' AS shared; |
| 1164 CREATE TABLE shared.xx(a, b); |
| 1165 INSERT INTO xx VALUES(55, 66); |
| 1166 } |
| 1167 db2 eval { |
| 1168 ATTACH 'file:mem?mode=memory&cache=shared' AS shared; |
| 1169 SELECT * FROM xx; |
| 1170 } |
| 1171 } {55 66} |
| 1172 |
| 1173 do_test shared-$av-16.8.2 { db1 eval { SELECT * FROM yy } } {77 88} |
| 1174 do_test shared-$av-16.8.3 { |
| 1175 list [catch {db1 eval { INSERT INTO yy VALUES(1, 2) }} msg] $msg |
| 1176 } {1 {attempt to write a readonly database}} |
| 1177 |
| 1178 db1 close |
| 1179 db2 close |
| 1180 |
| 1181 } ;# end of autovacuum on/off loop |
1060 | 1182 |
1061 sqlite3_enable_shared_cache $::enable_shared_cache | 1183 sqlite3_enable_shared_cache $::enable_shared_cache |
1062 finish_test | 1184 finish_test |
OLD | NEW |