Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Side by Side Diff: third_party/sqlite/src/test/vtab1.test

Issue 901033002: Import SQLite 3.8.7.4. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Chromium changes to support SQLite 3.8.7.4. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # 2006 June 10 1 # 2006 June 10
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 # This file implements regression tests for SQLite library. The 11 # This file implements regression tests for SQLite library. The
12 # focus of this file is creating and dropping virtual tables. 12 # focus of this file is creating and dropping virtual tables.
13 # 13 #
14 # $Id: vtab1.test,v 1.57 2008/08/01 17:51:47 danielk1977 Exp $ 14 # $Id: vtab1.test,v 1.57 2008/08/01 17:51:47 danielk1977 Exp $
15 15
16 set testdir [file dirname $argv0] 16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl 17 source $testdir/tester.tcl
18 set testprefix vtab1
18 19
19 ifcapable !vtab||!schema_pragmas { 20 ifcapable !vtab||!schema_pragmas {
20 finish_test 21 finish_test
21 return 22 return
22 } 23 }
23 24
24 #---------------------------------------------------------------------- 25 #----------------------------------------------------------------------
25 # Organization of tests in this file: 26 # Organization of tests in this file:
26 # 27 #
27 # vtab1-1.*: Error conditions and other issues surrounding creation/connection 28 # vtab1-1.*: Error conditions and other issues surrounding creation/connection
28 # of a virtual module. 29 # of a virtual module.
29 # vtab1-2.*: Test sqlite3_declare_vtab() and the xConnect/xDisconnect methods. 30 # vtab1-2.*: Test sqlite3_declare_vtab() and the xConnect/xDisconnect methods.
30 # vtab1-3.*: Table scans and WHERE clauses. 31 # vtab1-3.*: Table scans and WHERE clauses.
31 # vtab1-4.*: Table scans and ORDER BY clauses. 32 # vtab1-4.*: Table scans and ORDER BY clauses.
32 # vtab1-5.*: Test queries that include joins. This brings the 33 # vtab1-5.*: Test queries that include joins. This brings the
33 # sqlite3_index_info.estimatedCost variable into play. 34 # sqlite3_index_info.estimatedCost variable into play.
34 # vtab1-6.*: Test UPDATE/INSERT/DELETE on vtables. 35 # vtab1-6.*: Test UPDATE/INSERT/DELETE on vtables.
35 # vtab1-7.*: Test sqlite3_last_insert_rowid(). 36 # vtab1-7.*: Test sqlite3_last_insert_rowid().
36 # 37 #
37 # This file uses the "echo" module (see src/test8.c). Refer to comments 38 # This file uses the "echo" module (see src/test8.c). Refer to comments
38 # in that file for the special behaviour of the Tcl $echo_module variable. 39 # in that file for the special behaviour of the Tcl $echo_module variable.
39 # 40 #
40 # TODO: 41 # TODO:
41 # * How to test the sqlite3_index_constraint_usage.omit field? 42 # * How to test the sqlite3_index_constraint_usage.omit field?
42 # * vtab1-5.* 43 # * vtab1-5.*
43 # 44 #
44 # vtab1-14.*: Test 'IN' constraints - i.e. "SELECT * FROM t1 WHERE id IN(...)" 45 # vtab1-14.*: Test 'IN' constraints - i.e. "SELECT * FROM t1 WHERE id IN(...)"
45 # 46 #
47 # vtab1-18.*: Check that the LIKE optimization is not applied when the lhs
48 # is a virtual table column.
49 #
46 50
47 51
48 #---------------------------------------------------------------------- 52 #----------------------------------------------------------------------
49 # Test cases vtab1.1.* 53 # Test cases vtab1.1.*
50 # 54 #
51 55
52 # We cannot create a virtual table if the module has not been registered. 56 # We cannot create a virtual table if the module has not been registered.
53 # 57 #
54 do_test vtab1-1.1 { 58 do_test vtab1-1.1.1 {
55 explain { 59 explain {
56 CREATE VIRTUAL TABLE t1 USING echo; 60 CREATE VIRTUAL TABLE t1 USING echo;
57 } 61 }
58 catchsql { 62 catchsql {
59 CREATE VIRTUAL TABLE t1 USING echo; 63 CREATE VIRTUAL TABLE t1 USING echo;
60 } 64 }
61 } {1 {no such module: echo}} 65 } {1 {no such module: echo}}
66 do_test vtab1-1.1.2 {
67 catchsql {
68 CREATE VIRTUAL TABLE IF NOT EXISTS t1 USING echo;
69 }
70 } {1 {no such module: echo}}
62 do_test vtab1-1.2 { 71 do_test vtab1-1.2 {
63 execsql { 72 execsql {
64 SELECT name FROM sqlite_master ORDER BY 1 73 SELECT name FROM sqlite_master ORDER BY 1
65 } 74 }
66 } {} 75 } {}
67 76
68 # Register the module 77 # Register the module
69 register_echo_module [sqlite3_connection_pointer db] 78 register_echo_module [sqlite3_connection_pointer db]
70 79
71 # Once a module has been registered, virtual tables using that module 80 # Once a module has been registered, virtual tables using that module
72 # may be created. However if a module xCreate() fails to call 81 # may be created. However if a module xCreate() fails to call
73 # sqlite3_declare_vtab() an error will be raised and the table not created. 82 # sqlite3_declare_vtab() an error will be raised and the table not created.
74 # 83 #
75 # The "echo" module does not invoke sqlite3_declare_vtab() if it is 84 # The "echo" module does not invoke sqlite3_declare_vtab() if it is
76 # passed zero arguments. 85 # passed zero arguments.
77 # 86 #
78 do_test vtab1-1.3 { 87 do_test vtab1-1.3.1 {
79 catchsql { 88 catchsql {
80 CREATE VIRTUAL TABLE t1 USING echo; 89 CREATE VIRTUAL TABLE t1 USING echo;
81 } 90 }
82 } {1 {vtable constructor did not declare schema: t1}} 91 } {1 {vtable constructor did not declare schema: t1}}
92 do_test vtab1-1.3.2 {
93 catchsql {
94 CREATE VIRTUAL TABLE IF NOT EXISTS t1 USING echo;
95 }
96 } {1 {vtable constructor did not declare schema: t1}}
83 do_test vtab1-1.4 { 97 do_test vtab1-1.4 {
84 execsql { 98 execsql {
85 SELECT name FROM sqlite_master ORDER BY 1 99 SELECT name FROM sqlite_master ORDER BY 1
86 } 100 }
87 } {} 101 } {}
88 102
89 # The "echo" module xCreate method returns an error and does not create 103 # The "echo" module xCreate method returns an error and does not create
90 # the virtual table if it is passed an argument that does not correspond 104 # the virtual table if it is passed an argument that does not correspond
91 # to an existing real table in the same database. 105 # to an existing real table in the same database.
92 # 106 #
93 do_test vtab1-1.5 { 107 do_test vtab1-1.5.1 {
94 catchsql { 108 catchsql {
95 CREATE VIRTUAL TABLE t1 USING echo(no_such_table); 109 CREATE VIRTUAL TABLE t1 USING echo(no_such_table);
96 } 110 }
97 } {1 {vtable constructor failed: t1}} 111 } {1 {vtable constructor failed: t1}}
112 do_test vtab1-1.5.2 {
113 catchsql {
114 CREATE VIRTUAL TABLE IF NOT EXISTS t1 USING echo(no_such_table);
115 }
116 } {1 {vtable constructor failed: t1}}
98 do_test vtab1-1.6 { 117 do_test vtab1-1.6 {
99 execsql { 118 execsql {
100 SELECT name FROM sqlite_master ORDER BY 1 119 SELECT name FROM sqlite_master ORDER BY 1
101 } 120 }
102 } {} 121 } {}
103 122
104 # Ticket #2156. Using the sqlite3_prepare_v2() API, make sure that 123 # Ticket #2156. Using the sqlite3_prepare_v2() API, make sure that
105 # a CREATE VIRTUAL TABLE statement can be used multiple times. 124 # a CREATE VIRTUAL TABLE statement can be used multiple times.
106 # 125 #
107 do_test vtab1-1.2152.1 { 126 do_test vtab1-1.2152.1 {
(...skipping 13 matching lines...) Expand all
121 } SQLITE_DONE 140 } SQLITE_DONE
122 do_test vtab-1.2152.4 { 141 do_test vtab-1.2152.4 {
123 sqlite3_finalize $STMT 142 sqlite3_finalize $STMT
124 db eval {DROP TABLE t2152a; DROP TABLE t2152b} 143 db eval {DROP TABLE t2152a; DROP TABLE t2152b}
125 } {} 144 } {}
126 145
127 # Test to make sure nothing goes wrong and no memory is leaked if we 146 # Test to make sure nothing goes wrong and no memory is leaked if we
128 # select an illegal table-name (i.e a reserved name or the name of a 147 # select an illegal table-name (i.e a reserved name or the name of a
129 # table that already exists). 148 # table that already exists).
130 # 149 #
131 do_test vtab1-1.7 { 150 do_test vtab1-1.7.1 {
132 catchsql { 151 catchsql {
133 CREATE VIRTUAL TABLE sqlite_master USING echo; 152 CREATE VIRTUAL TABLE sqlite_master USING echo;
134 } 153 }
135 } {1 {object name reserved for internal use: sqlite_master}} 154 } {1 {object name reserved for internal use: sqlite_master}}
136 do_test vtab1-1.8 { 155 do_test vtab1-1.7.2 {
156 catchsql {
157 CREATE VIRTUAL TABLE IF NOT EXISTS sqlite_master USING echo;
158 }
159 } {1 {object name reserved for internal use: sqlite_master}}
160 do_test vtab1-1.8.1 {
137 catchsql { 161 catchsql {
138 CREATE TABLE treal(a, b, c); 162 CREATE TABLE treal(a, b, c);
139 CREATE VIRTUAL TABLE treal USING echo(treal); 163 CREATE VIRTUAL TABLE treal USING echo(treal);
140 } 164 }
141 } {1 {table treal already exists}} 165 } {1 {table treal already exists}}
166 do_test vtab1-1.8.2 {
167 catchsql {
168 CREATE VIRTUAL TABLE IF NOT EXISTS treal USING echo(treal);
169 }
170 } {0 {}}
142 do_test vtab1-1.9 { 171 do_test vtab1-1.9 {
143 execsql { 172 execsql {
144 DROP TABLE treal; 173 DROP TABLE treal;
145 SELECT name FROM sqlite_master ORDER BY 1 174 SELECT name FROM sqlite_master ORDER BY 1
146 } 175 }
147 } {} 176 } {}
148 177
149 do_test vtab1-1.10 { 178 do_test vtab1-1.10 {
150 execsql { 179 execsql {
151 CREATE TABLE treal(a, b, c); 180 CREATE TABLE treal(a, b, c);
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 execsql { 611 execsql {
583 SELECT * FROM et1, et2 WHERE et2.d = 2; 612 SELECT * FROM et1, et2 WHERE et2.d = 2;
584 } 613 }
585 } [list \ 614 } [list \
586 1 red green 2 hearts diamonds \ 615 1 red green 2 hearts diamonds \
587 2 blue black 2 hearts diamonds \ 616 2 blue black 2 hearts diamonds \
588 ] 617 ]
589 do_test vtab1-5-7 { 618 do_test vtab1-5-7 {
590 filter $::echo_module 619 filter $::echo_module
591 } [list \ 620 } [list \
621 xFilter {SELECT rowid, * FROM 't1'} \
592 xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \ 622 xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \
593 xFilter {SELECT rowid, * FROM 't1'} \ 623 xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \
594 ] 624 ]
595 625
596 execsql { 626 execsql {
597 DROP TABLE t1; 627 DROP TABLE t1;
598 DROP TABLE t2; 628 DROP TABLE t2;
599 DROP TABLE et1; 629 DROP TABLE et1;
600 DROP TABLE et2; 630 DROP TABLE et2;
601 } 631 }
602 632
603 #---------------------------------------------------------------------- 633 #----------------------------------------------------------------------
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 } 747 }
718 db changes 748 db changes
719 } {2} 749 } {2}
720 do_test vtab1-6-8.4 { 750 do_test vtab1-6-8.4 {
721 execsql { 751 execsql {
722 SELECT * FROM techo ORDER BY a; 752 SELECT * FROM techo ORDER BY a;
723 } 753 }
724 } {} 754 } {}
725 execsql {PRAGMA count_changes=OFF} 755 execsql {PRAGMA count_changes=OFF}
726 756
727 file delete -force test2.db 757 forcedelete test2.db
728 file delete -force test2.db-journal 758 forcedelete test2.db-journal
729 sqlite3 db2 test2.db 759 sqlite3 db2 test2.db
730 execsql { 760 execsql {
731 CREATE TABLE techo(a PRIMARY KEY, b, c); 761 CREATE TABLE techo(a PRIMARY KEY, b, c);
732 } db2 762 } db2
733 proc check_echo_table {tn} { 763 proc check_echo_table {tn} {
734 set ::data1 [execsql {SELECT rowid, * FROM techo}] 764 set ::data1 [execsql {SELECT rowid, * FROM techo}]
735 set ::data2 [execsql {SELECT rowid, * FROM techo} db2] 765 set ::data2 [execsql {SELECT rowid, * FROM techo} db2]
736 do_test $tn { 766 do_test $tn {
737 string equal $::data1 $::data2 767 string equal $::data1 $::data2
738 } 1 768 } 1
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 INSERT INTO b VALUES(2, 'C', 'D'); 1033 INSERT INTO b VALUES(2, 'C', 'D');
1004 INSERT INTO b VALUES(3, 'E', 'F'); 1034 INSERT INTO b VALUES(3, 'E', 'F');
1005 INSERT INTO c VALUES(3, 'G', 'H'); 1035 INSERT INTO c VALUES(3, 'G', 'H');
1006 CREATE VIRTUAL TABLE echo_c USING echo(c); 1036 CREATE VIRTUAL TABLE echo_c USING echo(c);
1007 } 1037 }
1008 } {} 1038 } {}
1009 1039
1010 # First test outside of a transaction. 1040 # First test outside of a transaction.
1011 do_test vtab1.12-2 { 1041 do_test vtab1.12-2 {
1012 catchsql { INSERT INTO echo_c SELECT * FROM b; } 1042 catchsql { INSERT INTO echo_c SELECT * FROM b; }
1013 } {1 {echo-vtab-error: column a is not unique}} 1043 } {1 {echo-vtab-error: UNIQUE constraint failed: c.a}}
1014 do_test vtab1.12-2.1 { 1044 do_test vtab1.12-2.1 {
1015 sqlite3_errmsg db 1045 sqlite3_errmsg db
1016 } {echo-vtab-error: column a is not unique} 1046 } {echo-vtab-error: UNIQUE constraint failed: c.a}
1017 do_test vtab1.12-3 { 1047 do_test vtab1.12-3 {
1018 execsql { SELECT * FROM c } 1048 execsql { SELECT * FROM c }
1019 } {3 G H} 1049 } {3 G H}
1020 1050
1021 # Now the real test - wrapped in a transaction. 1051 # Now the real test - wrapped in a transaction.
1022 do_test vtab1.12-4 { 1052 do_test vtab1.12-4 {
1023 execsql {BEGIN} 1053 execsql {BEGIN}
1024 catchsql { INSERT INTO echo_c SELECT * FROM b; } 1054 catchsql { INSERT INTO echo_c SELECT * FROM b; }
1025 } {1 {echo-vtab-error: column a is not unique}} 1055 } {1 {echo-vtab-error: UNIQUE constraint failed: c.a}}
1026 do_test vtab1.12-5 { 1056 do_test vtab1.12-5 {
1027 execsql { SELECT * FROM c } 1057 execsql { SELECT * FROM c }
1028 } {3 G H} 1058 } {3 G H}
1029 do_test vtab1.12-6 { 1059 do_test vtab1.12-6 {
1030 execsql { COMMIT } 1060 execsql { COMMIT }
1031 execsql { SELECT * FROM c } 1061 execsql { SELECT * FROM c }
1032 } {3 G H} 1062 } {3 G H}
1033 1063
1034 # At one point (ticket #2759), a WHERE clause of the form "<column> IS NULL" 1064 # At one point (ticket #2759), a WHERE clause of the form "<column> IS NULL"
1035 # on a virtual table was causing an assert() to fail in the compiler. 1065 # on a virtual table was causing an assert() to fail in the compiler.
(...skipping 19 matching lines...) Expand all
1055 SELECT * FROM echo_c WHERE b IS NULL 1085 SELECT * FROM echo_c WHERE b IS NULL
1056 } 1086 }
1057 } {15 {} 16} 1087 } {15 {} 16}
1058 do_test vtab1.13-3 { 1088 do_test vtab1.13-3 {
1059 execsql { 1089 execsql {
1060 SELECT * FROM echo_c WHERE b IS NULL AND a = 15; 1090 SELECT * FROM echo_c WHERE b IS NULL AND a = 15;
1061 } 1091 }
1062 } {15 {} 16} 1092 } {15 {} 16}
1063 1093
1064 1094
1065 do_test vtab1-14.1 { 1095 do_test vtab1-14.001 {
1066 execsql { DELETE FROM c } 1096 execsql {SELECT rowid, * FROM echo_c WHERE +rowid IN (1,2,3)}
1067 set echo_module "" 1097 } {1 3 G H 2 {} 15 16 3 15 {} 16}
1068 execsql { SELECT * FROM echo_c WHERE rowid IN (1, 2, 3) } 1098 do_test vtab1-14.002 {
1069 set echo_module 1099 execsql {SELECT rowid, * FROM echo_c WHERE rowid IN (1,2,3)}
1070 } [list xBestIndex {SELECT rowid, * FROM 'c'} xFilter {SELECT rowid, * FROM 'c'} ] 1100 } {1 3 G H 2 {} 15 16 3 15 {} 16}
1101 do_test vtab1-14.003 {
1102 execsql {SELECT rowid, * FROM echo_c WHERE +rowid IN (0,1,5,2,'a',3,NULL)}
1103 } {1 3 G H 2 {} 15 16 3 15 {} 16}
1104 do_test vtab1-14.004 {
1105 execsql {SELECT rowid, * FROM echo_c WHERE rowid IN (0,1,5,'a',2,3,NULL)}
1106 } {1 3 G H 2 {} 15 16 3 15 {} 16}
1107 do_test vtab1-14.005 {
1108 execsql {SELECT rowid, * FROM echo_c WHERE rowid NOT IN (0,1,5,'a',2,3)}
1109 } {}
1110 do_test vtab1-14.006 {
1111 execsql {SELECT rowid, * FROM echo_c WHERE rowid NOT IN (0,5,'a',2,3)}
1112 } {1 3 G H}
1113 do_test vtab1-14.007 {
1114 execsql {SELECT rowid, * FROM echo_c WHERE +rowid NOT IN (0,5,'a',2,3,NULL)}
1115 } {}
1116 do_test vtab1-14.008 {
1117 execsql {SELECT rowid, * FROM echo_c WHERE rowid NOT IN (0,5,'a',2,3,NULL)}
1118 } {}
1119 do_test vtab1-14.011 {
1120 execsql {SELECT * FROM echo_c WHERE +a IN (1,3,8,'x',NULL,15,24)}
1121 } {3 G H 15 {} 16}
1122 do_test vtab1-14.012 {
1123 execsql {SELECT * FROM echo_c WHERE a IN (1,3,8,'x',NULL,15,24)}
1124 } {3 G H 15 {} 16}
1125 do_test vtab1-14.013 {
1126 execsql {SELECT * FROM echo_c WHERE a NOT IN (1,8,'x',15,24)}
1127 } {3 G H}
1128 do_test vtab1-14.014 {
1129 execsql {SELECT * FROM echo_c WHERE a NOT IN (1,8,'x',NULL,15,24)}
1130 } {}
1131 do_test vtab1-14.015 {
1132 execsql {SELECT * FROM echo_c WHERE +a NOT IN (1,8,'x',NULL,15,24)}
1133 } {}
1134
1135
1136
1137 #do_test vtab1-14.1 {
1138 # execsql { DELETE FROM c }
1139 # set echo_module ""
1140 # execsql { SELECT * FROM echo_c WHERE rowid IN (1, 2, 3) }
1141 # set echo_module
1142 #} {/.*xBestIndex {SELECT rowid, . FROM 'c' WHERE rowid = .} xFilter {SELECT row id, . FROM 'c'} 1/}
1071 1143
1072 do_test vtab1-14.2 { 1144 do_test vtab1-14.2 {
1073 set echo_module "" 1145 set echo_module ""
1074 execsql { SELECT * FROM echo_c WHERE rowid = 1 } 1146 execsql { SELECT * FROM echo_c WHERE rowid = 1 }
1075 set echo_module 1147 set echo_module
1076 } [list xBestIndex {SELECT rowid, * FROM 'c' WHERE rowid = ?} xFilter {SELECT ro wid, * FROM 'c' WHERE rowid = ?} 1] 1148 } [list xBestIndex {SELECT rowid, * FROM 'c' WHERE rowid = ?} xFilter {SELECT ro wid, * FROM 'c' WHERE rowid = ?} 1]
1077 1149
1078 do_test vtab1-14.3 { 1150 do_test vtab1-14.3 {
1079 set echo_module "" 1151 set echo_module ""
1080 execsql { SELECT * FROM echo_c WHERE a = 1 } 1152 execsql { SELECT * FROM echo_c WHERE a = 1 }
1081 set echo_module 1153 set echo_module
1082 } [list xBestIndex {SELECT rowid, * FROM 'c' WHERE a = ?} xFilter {SELECT rowid, * FROM 'c' WHERE a = ?} 1] 1154 } [list xBestIndex {SELECT rowid, * FROM 'c' WHERE a = ?} xFilter {SELECT rowid, * FROM 'c' WHERE a = ?} 1]
1083 1155
1084 do_test vtab1-14.4 { 1156 #do_test vtab1-14.4 {
1085 set echo_module "" 1157 # set echo_module ""
1086 execsql { SELECT * FROM echo_c WHERE a IN (1, 2) } 1158 # execsql { SELECT * FROM echo_c WHERE a IN (1, 2) }
1087 set echo_module 1159 # set echo_module
1088 } [list xBestIndex {SELECT rowid, * FROM 'c'} xFilter {SELECT rowid, * FROM 'c'} ] 1160 #} {/xBestIndex {SELECT rowid, . FROM 'c' WHERE a = .} xFilter {SELECT rowid, . FROM 'c' WHERE a = .} 1/}
1089 1161
1090 do_test vtab1-15.1 { 1162 do_test vtab1-15.1 {
1091 execsql { 1163 execsql {
1092 CREATE TABLE t1(a, b, c); 1164 CREATE TABLE t1(a, b, c);
1093 CREATE VIRTUAL TABLE echo_t1 USING echo(t1); 1165 CREATE VIRTUAL TABLE echo_t1 USING echo(t1);
1094 } 1166 }
1095 } {} 1167 } {}
1096 do_test vtab1-15.2 { 1168 do_test vtab1-15.2 {
1097 execsql { 1169 execsql {
1098 INSERT INTO echo_t1(rowid) VALUES(45); 1170 INSERT INTO echo_t1(rowid) VALUES(45);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1171 do_test vtab1-17.1 { 1243 do_test vtab1-17.1 {
1172 execsql { 1244 execsql {
1173 PRAGMA writable_schema = 1; 1245 PRAGMA writable_schema = 1;
1174 INSERT INTO sqlite_master VALUES( 1246 INSERT INTO sqlite_master VALUES(
1175 'table', 't3', 't3', 0, 'INSERT INTO "%s%s" VALUES(1)' 1247 'table', 't3', 't3', 0, 'INSERT INTO "%s%s" VALUES(1)'
1176 ); 1248 );
1177 } 1249 }
1178 catchsql { CREATE VIRTUAL TABLE t4 USING echo(t3); } 1250 catchsql { CREATE VIRTUAL TABLE t4 USING echo(t3); }
1179 } {1 {vtable constructor failed: t4}} 1251 } {1 {vtable constructor failed: t4}}
1180 1252
1253 # This test verifies that ticket 48f29963 is fixed.
1254 #
1255 do_test vtab1-17.1 {
1256 execsql {
1257 CREATE TABLE t5(a, b);
1258 CREATE VIRTUAL TABLE e5 USING echo_v2(t5);
1259 BEGIN;
1260 INSERT INTO e5 VALUES(1, 2);
1261 DROP TABLE e5;
1262 SAVEPOINT one;
1263 ROLLBACK TO one;
1264 COMMIT;
1265 }
1266 } {}
1267
1268 do_test vtab1-17.2 {
1269 execsql { DELETE FROM sqlite_master WHERE sql LIKE 'insert%' }
1270 } {}
1271
1272 #-------------------------------------------------------------------------
1273 # The following tests - vtab1-18.* - test that the optimization of LIKE
1274 # constraints in where.c plays well with virtual tables.
1275 #
1276 # 18.1.*: Case-insensitive LIKE.
1277 # 18.2.*: Case-sensitive LIKE.
1278 #
1181 unset -nocomplain echo_module_begin_fail 1279 unset -nocomplain echo_module_begin_fail
1280
1281 do_execsql_test 18.1.0 {
1282 CREATE TABLE t6(a, b TEXT);
1283 CREATE INDEX i6 ON t6(b, a);
1284 INSERT INTO t6 VALUES(1, 'Peter');
1285 INSERT INTO t6 VALUES(2, 'Andrew');
1286 INSERT INTO t6 VALUES(3, 'James');
1287 INSERT INTO t6 VALUES(4, 'John');
1288 INSERT INTO t6 VALUES(5, 'Phillip');
1289 INSERT INTO t6 VALUES(6, 'Bartholomew');
1290 CREATE VIRTUAL TABLE e6 USING echo(t6);
1291 }
1292
1293 foreach {tn sql res filter} {
1294 1.1 "SELECT a FROM e6 WHERE b>'James'" {4 1 5}
1295 {xFilter {SELECT rowid, * FROM 't6' WHERE b > ?} James}
1296
1297 1.2 "SELECT a FROM e6 WHERE b>='J' AND b<'K'" {3 4}
1298 {xFilter {SELECT rowid, * FROM 't6' WHERE b >= ? AND b < ?} J K}
1299
1300 1.3 "SELECT a FROM e6 WHERE b LIKE 'J%'" {3 4}
1301 {xFilter {SELECT rowid, * FROM 't6'}}
1302
1303 1.4 "SELECT a FROM e6 WHERE b LIKE 'j%'" {3 4}
1304 {xFilter {SELECT rowid, * FROM 't6'}}
1305 } {
1306 set echo_module {}
1307 do_execsql_test 18.$tn.1 $sql $res
1308 do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter
1309 }
1310
1311 do_execsql_test 18.2.0 { PRAGMA case_sensitive_like = ON }
1312 foreach {tn sql res filter} {
1313 2.1 "SELECT a FROM e6 WHERE b LIKE 'J%'" {3 4}
1314 {xFilter {SELECT rowid, * FROM 't6'}}
1315
1316 2.2 "SELECT a FROM e6 WHERE b LIKE 'j%'" {}
1317 {xFilter {SELECT rowid, * FROM 't6'}}
1318 } {
1319 set echo_module {}
1320 do_execsql_test 18.$tn.1 $sql $res
1321 do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter
1322 }
1323 do_execsql_test 18.2.x { PRAGMA case_sensitive_like = OFF }
1324
1325 #-------------------------------------------------------------------------
1326 # Test that an existing module may not be overridden.
1327 #
1328 do_test 19.1 {
1329 sqlite3 db2 test.db
1330 register_echo_module [sqlite3_connection_pointer db2]
1331 } SQLITE_OK
1332 do_test 19.2 {
1333 register_echo_module [sqlite3_connection_pointer db2]
1334 } SQLITE_MISUSE
1335 do_test 19.3 {
1336 db2 close
1337 } {}
1338
1339 #-------------------------------------------------------------------------
1340 # Test that the bug fixed by [b0c1ba655d69] really is fixed.
1341 #
1342 do_execsql_test 20.1 {
1343 CREATE TABLE t7 (a, b);
1344 CREATE TABLE t8 (c, d);
1345 CREATE INDEX i2 ON t7(a);
1346 CREATE INDEX i3 ON t7(b);
1347 CREATE INDEX i4 ON t8(c);
1348 CREATE INDEX i5 ON t8(d);
1349
1350 CREATE VIRTUAL TABLE t7v USING echo(t7);
1351 CREATE VIRTUAL TABLE t8v USING echo(t8);
1352 }
1353
1354 do_test 20.2 {
1355 for {set i 0} {$i < 1000} {incr i} {
1356 db eval {INSERT INTO t7 VALUES($i, $i)}
1357 db eval {INSERT INTO t8 VALUES($i, $i)}
1358 }
1359 } {}
1360
1361 do_execsql_test 20.3 {
1362 SELECT a, b FROM (
1363 SELECT a, b FROM t7 WHERE a=11 OR b=12
1364 UNION ALL
1365 SELECT c, d FROM t8 WHERE c=5 OR d=6
1366 )
1367 ORDER BY 1, 2;
1368 } {5 5 6 6 11 11 12 12}
1369
1370 do_execsql_test 20.4 {
1371 SELECT a, b FROM (
1372 SELECT a, b FROM t7v WHERE a=11 OR b=12
1373 UNION ALL
1374 SELECT c, d FROM t8v WHERE c=5 OR d=6
1375 )
1376 ORDER BY 1, 2;
1377 } {5 5 6 6 11 11 12 12}
1378
1379 #-------------------------------------------------------------------------
1380 #
1381 do_execsql_test 21.1 {
1382 CREATE TABLE t9(a,b,c);
1383 CREATE VIRTUAL TABLE t9v USING echo(t9);
1384
1385 INSERT INTO t9 VALUES(1,2,3);
1386 INSERT INTO t9 VALUES(3,2,1);
1387 INSERT INTO t9 VALUES(2,2,2);
1388 }
1389
1390 do_execsql_test 21.2 {
1391 SELECT * FROM t9v WHERE a<b;
1392 } {1 2 3}
1393
1394 do_execsql_test 21.3 {
1395 SELECT * FROM t9v WHERE a=b;
1396 } {2 2 2}
1397
1182 finish_test 1398 finish_test
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698