diff options
author | dan miller | 2007-10-20 02:49:29 +0000 |
---|---|---|
committer | dan miller | 2007-10-20 02:49:29 +0000 |
commit | e36d23a85ebff914d74bb541558c2b6082b78edb (patch) | |
tree | 54b58fdf162e78af64055282a6035c8d2443389d /libraries/sqlite/unix/sqlite-3.5.1/test/insert.test | |
parent | * Fixed an issue whereby avatar chat distances were being calculated against ... (diff) | |
download | opensim-SC-e36d23a85ebff914d74bb541558c2b6082b78edb.zip opensim-SC-e36d23a85ebff914d74bb541558c2b6082b78edb.tar.gz opensim-SC-e36d23a85ebff914d74bb541558c2b6082b78edb.tar.bz2 opensim-SC-e36d23a85ebff914d74bb541558c2b6082b78edb.tar.xz |
sqlite source (unix build) added to libraries
Diffstat (limited to 'libraries/sqlite/unix/sqlite-3.5.1/test/insert.test')
-rw-r--r-- | libraries/sqlite/unix/sqlite-3.5.1/test/insert.test | 391 |
1 files changed, 391 insertions, 0 deletions
diff --git a/libraries/sqlite/unix/sqlite-3.5.1/test/insert.test b/libraries/sqlite/unix/sqlite-3.5.1/test/insert.test new file mode 100644 index 0000000..9ea9cd7 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/test/insert.test | |||
@@ -0,0 +1,391 @@ | |||
1 | # 2001 September 15 | ||
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 file is testing the INSERT statement. | ||
13 | # | ||
14 | # $Id: insert.test,v 1.31 2007/04/05 11:25:59 drh Exp $ | ||
15 | |||
16 | set testdir [file dirname $argv0] | ||
17 | source $testdir/tester.tcl | ||
18 | |||
19 | # Try to insert into a non-existant table. | ||
20 | # | ||
21 | do_test insert-1.1 { | ||
22 | set v [catch {execsql {INSERT INTO test1 VALUES(1,2,3)}} msg] | ||
23 | lappend v $msg | ||
24 | } {1 {no such table: test1}} | ||
25 | |||
26 | # Try to insert into sqlite_master | ||
27 | # | ||
28 | do_test insert-1.2 { | ||
29 | set v [catch {execsql {INSERT INTO sqlite_master VALUES(1,2,3,4)}} msg] | ||
30 | lappend v $msg | ||
31 | } {1 {table sqlite_master may not be modified}} | ||
32 | |||
33 | # Try to insert the wrong number of entries. | ||
34 | # | ||
35 | do_test insert-1.3 { | ||
36 | execsql {CREATE TABLE test1(one int, two int, three int)} | ||
37 | set v [catch {execsql {INSERT INTO test1 VALUES(1,2)}} msg] | ||
38 | lappend v $msg | ||
39 | } {1 {table test1 has 3 columns but 2 values were supplied}} | ||
40 | do_test insert-1.3b { | ||
41 | set v [catch {execsql {INSERT INTO test1 VALUES(1,2,3,4)}} msg] | ||
42 | lappend v $msg | ||
43 | } {1 {table test1 has 3 columns but 4 values were supplied}} | ||
44 | do_test insert-1.3c { | ||
45 | set v [catch {execsql {INSERT INTO test1(one,two) VALUES(1,2,3,4)}} msg] | ||
46 | lappend v $msg | ||
47 | } {1 {4 values for 2 columns}} | ||
48 | do_test insert-1.3d { | ||
49 | set v [catch {execsql {INSERT INTO test1(one,two) VALUES(1)}} msg] | ||
50 | lappend v $msg | ||
51 | } {1 {1 values for 2 columns}} | ||
52 | |||
53 | # Try to insert into a non-existant column of a table. | ||
54 | # | ||
55 | do_test insert-1.4 { | ||
56 | set v [catch {execsql {INSERT INTO test1(one,four) VALUES(1,2)}} msg] | ||
57 | lappend v $msg | ||
58 | } {1 {table test1 has no column named four}} | ||
59 | |||
60 | # Make sure the inserts actually happen | ||
61 | # | ||
62 | do_test insert-1.5 { | ||
63 | execsql {INSERT INTO test1 VALUES(1,2,3)} | ||
64 | execsql {SELECT * FROM test1} | ||
65 | } {1 2 3} | ||
66 | do_test insert-1.5b { | ||
67 | execsql {INSERT INTO test1 VALUES(4,5,6)} | ||
68 | execsql {SELECT * FROM test1 ORDER BY one} | ||
69 | } {1 2 3 4 5 6} | ||
70 | do_test insert-1.5c { | ||
71 | execsql {INSERT INTO test1 VALUES(7,8,9)} | ||
72 | execsql {SELECT * FROM test1 ORDER BY one} | ||
73 | } {1 2 3 4 5 6 7 8 9} | ||
74 | |||
75 | do_test insert-1.6 { | ||
76 | execsql {DELETE FROM test1} | ||
77 | execsql {INSERT INTO test1(one,two) VALUES(1,2)} | ||
78 | execsql {SELECT * FROM test1 ORDER BY one} | ||
79 | } {1 2 {}} | ||
80 | do_test insert-1.6b { | ||
81 | execsql {INSERT INTO test1(two,three) VALUES(5,6)} | ||
82 | execsql {SELECT * FROM test1 ORDER BY one} | ||
83 | } {{} 5 6 1 2 {}} | ||
84 | do_test insert-1.6c { | ||
85 | execsql {INSERT INTO test1(three,one) VALUES(7,8)} | ||
86 | execsql {SELECT * FROM test1 ORDER BY one} | ||
87 | } {{} 5 6 1 2 {} 8 {} 7} | ||
88 | |||
89 | # A table to use for testing default values | ||
90 | # | ||
91 | do_test insert-2.1 { | ||
92 | execsql { | ||
93 | CREATE TABLE test2( | ||
94 | f1 int default -111, | ||
95 | f2 real default +4.32, | ||
96 | f3 int default +222, | ||
97 | f4 int default 7.89 | ||
98 | ) | ||
99 | } | ||
100 | execsql {SELECT * from test2} | ||
101 | } {} | ||
102 | do_test insert-2.2 { | ||
103 | execsql {INSERT INTO test2(f1,f3) VALUES(+10,-10)} | ||
104 | execsql {SELECT * FROM test2} | ||
105 | } {10 4.32 -10 7.89} | ||
106 | do_test insert-2.3 { | ||
107 | execsql {INSERT INTO test2(f2,f4) VALUES(1.23,-3.45)} | ||
108 | execsql {SELECT * FROM test2 WHERE f1==-111} | ||
109 | } {-111 1.23 222 -3.45} | ||
110 | do_test insert-2.4 { | ||
111 | execsql {INSERT INTO test2(f1,f2,f4) VALUES(77,+1.23,3.45)} | ||
112 | execsql {SELECT * FROM test2 WHERE f1==77} | ||
113 | } {77 1.23 222 3.45} | ||
114 | do_test insert-2.10 { | ||
115 | execsql { | ||
116 | DROP TABLE test2; | ||
117 | CREATE TABLE test2( | ||
118 | f1 int default 111, | ||
119 | f2 real default -4.32, | ||
120 | f3 text default hi, | ||
121 | f4 text default 'abc-123', | ||
122 | f5 varchar(10) | ||
123 | ) | ||
124 | } | ||
125 | execsql {SELECT * from test2} | ||
126 | } {} | ||
127 | do_test insert-2.11 { | ||
128 | execsql {INSERT INTO test2(f2,f4) VALUES(-2.22,'hi!')} | ||
129 | execsql {SELECT * FROM test2} | ||
130 | } {111 -2.22 hi hi! {}} | ||
131 | do_test insert-2.12 { | ||
132 | execsql {INSERT INTO test2(f1,f5) VALUES(1,'xyzzy')} | ||
133 | execsql {SELECT * FROM test2 ORDER BY f1} | ||
134 | } {1 -4.32 hi abc-123 xyzzy 111 -2.22 hi hi! {}} | ||
135 | |||
136 | # Do additional inserts with default values, but this time | ||
137 | # on a table that has indices. In particular we want to verify | ||
138 | # that the correct default values are inserted into the indices. | ||
139 | # | ||
140 | do_test insert-3.1 { | ||
141 | execsql { | ||
142 | DELETE FROM test2; | ||
143 | CREATE INDEX index9 ON test2(f1,f2); | ||
144 | CREATE INDEX indext ON test2(f4,f5); | ||
145 | SELECT * from test2; | ||
146 | } | ||
147 | } {} | ||
148 | |||
149 | # Update for sqlite3 v3: | ||
150 | # Change the 111 to '111' in the following two test cases, because | ||
151 | # the default value is being inserted as a string. TODO: It shouldn't be. | ||
152 | do_test insert-3.2 { | ||
153 | execsql {INSERT INTO test2(f2,f4) VALUES(-3.33,'hum')} | ||
154 | execsql {SELECT * FROM test2 WHERE f1='111' AND f2=-3.33} | ||
155 | } {111 -3.33 hi hum {}} | ||
156 | do_test insert-3.3 { | ||
157 | execsql {INSERT INTO test2(f1,f2,f5) VALUES(22,-4.44,'wham')} | ||
158 | execsql {SELECT * FROM test2 WHERE f1='111' AND f2=-3.33} | ||
159 | } {111 -3.33 hi hum {}} | ||
160 | do_test insert-3.4 { | ||
161 | execsql {SELECT * FROM test2 WHERE f1=22 AND f2=-4.44} | ||
162 | } {22 -4.44 hi abc-123 wham} | ||
163 | ifcapable {reindex} { | ||
164 | do_test insert-3.5 { | ||
165 | execsql REINDEX | ||
166 | } {} | ||
167 | } | ||
168 | integrity_check insert-3.5 | ||
169 | |||
170 | # Test of expressions in the VALUES clause | ||
171 | # | ||
172 | do_test insert-4.1 { | ||
173 | execsql { | ||
174 | CREATE TABLE t3(a,b,c); | ||
175 | INSERT INTO t3 VALUES(1+2+3,4,5); | ||
176 | SELECT * FROM t3; | ||
177 | } | ||
178 | } {6 4 5} | ||
179 | do_test insert-4.2 { | ||
180 | ifcapable subquery { | ||
181 | execsql {INSERT INTO t3 VALUES((SELECT max(a) FROM t3)+1,5,6);} | ||
182 | } else { | ||
183 | set maxa [execsql {SELECT max(a) FROM t3}] | ||
184 | execsql "INSERT INTO t3 VALUES($maxa+1,5,6);" | ||
185 | } | ||
186 | execsql { | ||
187 | SELECT * FROM t3 ORDER BY a; | ||
188 | } | ||
189 | } {6 4 5 7 5 6} | ||
190 | ifcapable subquery { | ||
191 | do_test insert-4.3 { | ||
192 | catchsql { | ||
193 | INSERT INTO t3 VALUES((SELECT max(a) FROM t3)+1,t3.a,6); | ||
194 | SELECT * FROM t3 ORDER BY a; | ||
195 | } | ||
196 | } {1 {no such column: t3.a}} | ||
197 | } | ||
198 | do_test insert-4.4 { | ||
199 | ifcapable subquery { | ||
200 | execsql {INSERT INTO t3 VALUES((SELECT b FROM t3 WHERE a=0),6,7);} | ||
201 | } else { | ||
202 | set b [execsql {SELECT b FROM t3 WHERE a = 0}] | ||
203 | if {$b==""} {set b NULL} | ||
204 | execsql "INSERT INTO t3 VALUES($b,6,7);" | ||
205 | } | ||
206 | execsql { | ||
207 | SELECT * FROM t3 ORDER BY a; | ||
208 | } | ||
209 | } {{} 6 7 6 4 5 7 5 6} | ||
210 | do_test insert-4.5 { | ||
211 | execsql { | ||
212 | SELECT b,c FROM t3 WHERE a IS NULL; | ||
213 | } | ||
214 | } {6 7} | ||
215 | do_test insert-4.6 { | ||
216 | catchsql { | ||
217 | INSERT INTO t3 VALUES(notafunc(2,3),2,3); | ||
218 | } | ||
219 | } {1 {no such function: notafunc}} | ||
220 | do_test insert-4.7 { | ||
221 | execsql { | ||
222 | INSERT INTO t3 VALUES(min(1,2,3),max(1,2,3),99); | ||
223 | SELECT * FROM t3 WHERE c=99; | ||
224 | } | ||
225 | } {1 3 99} | ||
226 | |||
227 | # Test the ability to insert from a temporary table into itself. | ||
228 | # Ticket #275. | ||
229 | # | ||
230 | ifcapable tempdb { | ||
231 | do_test insert-5.1 { | ||
232 | execsql { | ||
233 | CREATE TEMP TABLE t4(x); | ||
234 | INSERT INTO t4 VALUES(1); | ||
235 | SELECT * FROM t4; | ||
236 | } | ||
237 | } {1} | ||
238 | do_test insert-5.2 { | ||
239 | execsql { | ||
240 | INSERT INTO t4 SELECT x+1 FROM t4; | ||
241 | SELECT * FROM t4; | ||
242 | } | ||
243 | } {1 2} | ||
244 | ifcapable {explain} { | ||
245 | do_test insert-5.3 { | ||
246 | # verify that a temporary table is used to copy t4 to t4 | ||
247 | set x [execsql { | ||
248 | EXPLAIN INSERT INTO t4 SELECT x+2 FROM t4; | ||
249 | }] | ||
250 | expr {[lsearch $x OpenEphemeral]>0} | ||
251 | } {1} | ||
252 | } | ||
253 | |||
254 | do_test insert-5.4 { | ||
255 | # Verify that table "test1" begins on page 3. This should be the same | ||
256 | # page number used by "t4" above. | ||
257 | # | ||
258 | # Update for v3 - the first table now begins on page 2 of each file, not 3. | ||
259 | execsql { | ||
260 | SELECT rootpage FROM sqlite_master WHERE name='test1'; | ||
261 | } | ||
262 | } [expr $AUTOVACUUM?3:2] | ||
263 | do_test insert-5.5 { | ||
264 | # Verify that "t4" begins on page 3. | ||
265 | # | ||
266 | # Update for v3 - the first table now begins on page 2 of each file, not 3. | ||
267 | execsql { | ||
268 | SELECT rootpage FROM sqlite_temp_master WHERE name='t4'; | ||
269 | } | ||
270 | } {2} | ||
271 | do_test insert-5.6 { | ||
272 | # This should not use an intermediate temporary table. | ||
273 | execsql { | ||
274 | INSERT INTO t4 SELECT one FROM test1 WHERE three=7; | ||
275 | SELECT * FROM t4 | ||
276 | } | ||
277 | } {1 2 8} | ||
278 | ifcapable {explain} { | ||
279 | do_test insert-5.7 { | ||
280 | # verify that no temporary table is used to copy test1 to t4 | ||
281 | set x [execsql { | ||
282 | EXPLAIN INSERT INTO t4 SELECT one FROM test1; | ||
283 | }] | ||
284 | expr {[lsearch $x OpenTemp]>0} | ||
285 | } {0} | ||
286 | } | ||
287 | } | ||
288 | |||
289 | # Ticket #334: REPLACE statement corrupting indices. | ||
290 | # | ||
291 | ifcapable conflict { | ||
292 | # The REPLACE command is not available if SQLITE_OMIT_CONFLICT is | ||
293 | # defined at compilation time. | ||
294 | do_test insert-6.1 { | ||
295 | execsql { | ||
296 | CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE); | ||
297 | INSERT INTO t1 VALUES(1,2); | ||
298 | INSERT INTO t1 VALUES(2,3); | ||
299 | SELECT b FROM t1 WHERE b=2; | ||
300 | } | ||
301 | } {2} | ||
302 | do_test insert-6.2 { | ||
303 | execsql { | ||
304 | REPLACE INTO t1 VALUES(1,4); | ||
305 | SELECT b FROM t1 WHERE b=2; | ||
306 | } | ||
307 | } {} | ||
308 | do_test insert-6.3 { | ||
309 | execsql { | ||
310 | UPDATE OR REPLACE t1 SET a=2 WHERE b=4; | ||
311 | SELECT * FROM t1 WHERE b=4; | ||
312 | } | ||
313 | } {2 4} | ||
314 | do_test insert-6.4 { | ||
315 | execsql { | ||
316 | SELECT * FROM t1 WHERE b=3; | ||
317 | } | ||
318 | } {} | ||
319 | ifcapable {reindex} { | ||
320 | do_test insert-6.5 { | ||
321 | execsql REINDEX | ||
322 | } {} | ||
323 | } | ||
324 | do_test insert-6.6 { | ||
325 | execsql { | ||
326 | DROP TABLE t1; | ||
327 | } | ||
328 | } {} | ||
329 | } | ||
330 | |||
331 | # Test that the special optimization for queries of the form | ||
332 | # "SELECT max(x) FROM tbl" where there is an index on tbl(x) works with | ||
333 | # INSERT statments. | ||
334 | do_test insert-7.1 { | ||
335 | execsql { | ||
336 | CREATE TABLE t1(a); | ||
337 | INSERT INTO t1 VALUES(1); | ||
338 | INSERT INTO t1 VALUES(2); | ||
339 | CREATE INDEX i1 ON t1(a); | ||
340 | } | ||
341 | } {} | ||
342 | do_test insert-7.2 { | ||
343 | execsql { | ||
344 | INSERT INTO t1 SELECT max(a) FROM t1; | ||
345 | } | ||
346 | } {} | ||
347 | do_test insert-7.3 { | ||
348 | execsql { | ||
349 | SELECT a FROM t1; | ||
350 | } | ||
351 | } {1 2 2} | ||
352 | |||
353 | # Ticket #1140: Check for an infinite loop in the algorithm that tests | ||
354 | # to see if the right-hand side of an INSERT...SELECT references the left-hand | ||
355 | # side. | ||
356 | # | ||
357 | ifcapable subquery&&compound { | ||
358 | do_test insert-8.1 { | ||
359 | execsql { | ||
360 | INSERT INTO t3 SELECT * FROM (SELECT * FROM t3 UNION ALL SELECT 1,2,3) | ||
361 | } | ||
362 | } {} | ||
363 | } | ||
364 | |||
365 | # Make sure the rowid cache in the VDBE is reset correctly when | ||
366 | # an explicit rowid is given. | ||
367 | # | ||
368 | do_test insert-9.1 { | ||
369 | execsql { | ||
370 | CREATE TABLE t5(x); | ||
371 | INSERT INTO t5 VALUES(1); | ||
372 | INSERT INTO t5 VALUES(2); | ||
373 | INSERT INTO t5 VALUES(3); | ||
374 | INSERT INTO t5(rowid, x) SELECT nullif(x*2+10,14), x+100 FROM t5; | ||
375 | SELECT rowid, x FROM t5; | ||
376 | } | ||
377 | } {1 1 2 2 3 3 12 101 13 102 16 103} | ||
378 | do_test insert-9.2 { | ||
379 | execsql { | ||
380 | CREATE TABLE t6(x INTEGER PRIMARY KEY, y); | ||
381 | INSERT INTO t6 VALUES(1,1); | ||
382 | INSERT INTO t6 VALUES(2,2); | ||
383 | INSERT INTO t6 VALUES(3,3); | ||
384 | INSERT INTO t6 SELECT nullif(y*2+10,14), y+100 FROM t6; | ||
385 | SELECT x, y FROM t6; | ||
386 | } | ||
387 | } {1 1 2 2 3 3 12 101 13 102 16 103} | ||
388 | |||
389 | integrity_check insert-99.0 | ||
390 | |||
391 | finish_test | ||