diff options
Diffstat (limited to 'libraries/sqlite/unix/sqlite-3.5.1/test/sqllimits1.test')
-rw-r--r-- | libraries/sqlite/unix/sqlite-3.5.1/test/sqllimits1.test | 576 |
1 files changed, 576 insertions, 0 deletions
diff --git a/libraries/sqlite/unix/sqlite-3.5.1/test/sqllimits1.test b/libraries/sqlite/unix/sqlite-3.5.1/test/sqllimits1.test new file mode 100644 index 0000000..6641e08 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/test/sqllimits1.test | |||
@@ -0,0 +1,576 @@ | |||
1 | # 2007 May 8 | ||
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 | # | ||
12 | # This file contains tests to verify that the limits defined in | ||
13 | # sqlite source file limits.h are enforced. | ||
14 | # | ||
15 | # $Id: sqllimits1.test,v 1.18 2007/09/06 23:39:37 drh Exp $ | ||
16 | |||
17 | set testdir [file dirname $argv0] | ||
18 | source $testdir/tester.tcl | ||
19 | |||
20 | # Test organization: | ||
21 | # | ||
22 | # sqllimits-1.*: SQLITE_MAX_LENGTH | ||
23 | # sqllimits-2.*: SQLITE_MAX_SQL_LENGTH | ||
24 | # sqllimits-3.*: SQLITE_MAX_PAGE_COUNT (and the max_page_count pragma) | ||
25 | # sqllimits-4.*: SQLITE_MAX_COLUMN | ||
26 | # | ||
27 | # | ||
28 | # sqllimits-7.*: SQLITE_MAX_FUNCTION_ARG | ||
29 | # sqllimits-8.*: SQLITE_MAX_ATTACHED | ||
30 | # sqllimits-9.*: SQLITE_MAX_VARIABLE_NUMBER | ||
31 | # sqllimits-10.*: SQLITE_MAX_PAGE_SIZE | ||
32 | # sqllimits-11.*: SQLITE_MAX_LIKE_PATTERN_LENGTH | ||
33 | # | ||
34 | # Todo: | ||
35 | # | ||
36 | # sqllimits-5.*: SQLITE_MAX_EXPR_DEPTH (sqlite todo) | ||
37 | # sqllimits-6.*: SQLITE_MAX_VDBE_OP (sqlite todo) | ||
38 | # sqllimits-12.*: SQLITE_MAX_PAGE_COUNT (sqlite todo) | ||
39 | # | ||
40 | |||
41 | unset -nocomplain saved | ||
42 | foreach var [info vars SQLITE_MAX_*] { | ||
43 | set saved($var) [set $var] | ||
44 | } | ||
45 | |||
46 | set SQLITE_MAX_LENGTH 100000 | ||
47 | set SQLITE_MAX_COLUMN | ||
48 | set SQLITE_MAX_SQL_LENGTH 50000 | ||
49 | set SQLITE_MAX_EXPR_DEPTH 1000 | ||
50 | set SQLITE_MAX_COMPOUND_SELECT 5 | ||
51 | set SQLITE_MAX_VDBE_OP | ||
52 | set SQLITE_MAX_FUNCTION_ARG | ||
53 | set SQLITE_MAX_VARIABLE_NUMBER | ||
54 | set SQLITE_MAX_PAGE_SIZE | ||
55 | set SQLITE_MAX_PAGE_COUNT | ||
56 | set SQLITE_MAX_LIKE_PATTERN_LENGTH 1000 | ||
57 | |||
58 | #-------------------------------------------------------------------- | ||
59 | # Test cases sqllimits-1.* test that the SQLITE_MAX_LENGTH limit | ||
60 | # is enforced. | ||
61 | # | ||
62 | do_test sqllimits-1.1.1 { | ||
63 | catchsql { SELECT randomblob(2147483647) } | ||
64 | } {1 {string or blob too big}} | ||
65 | do_test sqllimits-1.1.2 { | ||
66 | catchsql { SELECT zeroblob(2147483647) } | ||
67 | } {1 {string or blob too big}} | ||
68 | |||
69 | # Large, but allowable, blob-size. | ||
70 | # | ||
71 | set ::LARGESIZE [expr $SQLITE_MAX_LENGTH - 1] | ||
72 | |||
73 | do_test sqllimits-1.2 { | ||
74 | catchsql { SELECT LENGTH(randomblob($::LARGESIZE)) } | ||
75 | } "0 $::LARGESIZE" | ||
76 | |||
77 | do_test sqllimits-1.3 { | ||
78 | catchsql { SELECT quote(randomblob($::LARGESIZE)) } | ||
79 | } {1 {string or blob too big}} | ||
80 | |||
81 | do_test sqllimits-1.4 { | ||
82 | catchsql { SELECT LENGTH(zeroblob($::LARGESIZE)) } | ||
83 | } "0 $::LARGESIZE" | ||
84 | |||
85 | do_test sqllimits-1.5 { | ||
86 | catchsql { SELECT quote(zeroblob($::LARGESIZE)) } | ||
87 | } {1 {string or blob too big}} | ||
88 | |||
89 | do_test sqllimits-1.6 { | ||
90 | catchsql { SELECT zeroblob(-1) } | ||
91 | } {0 {{}}} | ||
92 | |||
93 | do_test sqllimits-1.9 { | ||
94 | set ::str [string repeat A 65537] | ||
95 | set ::rep [string repeat B 65537] | ||
96 | catchsql { SELECT replace($::str, 'A', $::rep) } | ||
97 | } {1 {string or blob too big}} | ||
98 | |||
99 | do_test sqllimits-1.10 { | ||
100 | set ::str [string repeat %J 2100] | ||
101 | catchsql { SELECT strftime($::str, '2003-10-31') } | ||
102 | } {1 {string or blob too big}} | ||
103 | |||
104 | do_test sqllimits-1.11 { | ||
105 | set ::str1 [string repeat A [expr {$SQLITE_MAX_LENGTH - 10}]] | ||
106 | set ::str2 [string repeat B [expr {$SQLITE_MAX_LENGTH - 10}]] | ||
107 | catchsql { SELECT $::str1 || $::str2 } | ||
108 | } {1 {string or blob too big}} | ||
109 | |||
110 | do_test sqllimits-1.12 { | ||
111 | set ::str1 [string repeat ' [expr {$SQLITE_MAX_LENGTH - 10}]] | ||
112 | catchsql { SELECT quote($::str1) } | ||
113 | } {1 {string or blob too big}} | ||
114 | |||
115 | do_test sqllimits-1.13 { | ||
116 | set ::str1 [string repeat ' [expr {$SQLITE_MAX_LENGTH - 10}]] | ||
117 | catchsql { SELECT hex($::str1) } | ||
118 | } {1 {string or blob too big}} | ||
119 | |||
120 | do_test sqllimits-1.14.1 { | ||
121 | set ::STMT [sqlite3_prepare $::DB "SELECT ?" -1 TAIL] | ||
122 | sqlite3_bind_zeroblob $::STMT 1 [expr {$SQLITE_MAX_LENGTH + 1}] | ||
123 | } {} | ||
124 | do_test sqllimits-1.14.2 { | ||
125 | sqlite3_step $::STMT | ||
126 | } {SQLITE_ERROR} | ||
127 | do_test sqllimits-1.14.3 { | ||
128 | sqlite3_finalize $::STMT | ||
129 | } {SQLITE_TOOBIG} | ||
130 | |||
131 | #-------------------------------------------------------------------- | ||
132 | # Test cases sqllimits-2.* test that the SQLITE_MAX_SQL_LENGTH limit | ||
133 | # is enforced. | ||
134 | # | ||
135 | do_test sqllimits-2.1 { | ||
136 | set sql "SELECT 1 WHERE 1==1" | ||
137 | set N [expr {$::SQLITE_MAX_SQL_LENGTH / [string length " AND 1==1"]}] | ||
138 | append sql [string repeat " AND 1==1" $N] | ||
139 | catchsql $sql | ||
140 | } {1 {String or BLOB exceeded size limit}} | ||
141 | |||
142 | #-------------------------------------------------------------------- | ||
143 | # Test cases sqllimits-3.* test that the limit set using the | ||
144 | # max_page_count pragma. | ||
145 | # | ||
146 | do_test sqllimits-3.1 { | ||
147 | execsql { | ||
148 | PRAGMA max_page_count = 1000; | ||
149 | } | ||
150 | } {1000} | ||
151 | do_test sqllimits-3.2 { | ||
152 | execsql { CREATE TABLE trig (a INTEGER, b INTEGER); } | ||
153 | |||
154 | # Set up a tree of triggers to fire when a row is inserted | ||
155 | # into table "trig". | ||
156 | # | ||
157 | # INSERT -> insert_b -> update_b -> insert_a -> update_a (chain 1) | ||
158 | # -> update_a -> insert_a -> update_b (chain 2) | ||
159 | # -> insert_a -> update_b -> insert_b -> update_a (chain 3) | ||
160 | # -> update_a -> insert_b -> update_b (chain 4) | ||
161 | # | ||
162 | # Table starts with N rows. | ||
163 | # | ||
164 | # Chain 1: insert_b (update N rows) | ||
165 | # -> update_b (insert 1 rows) | ||
166 | # -> insert_a (update N rows) | ||
167 | # -> update_a (insert 1 rows) | ||
168 | # | ||
169 | # chains 2, 3 and 4 are similar. Each inserts more than N^2 rows, where | ||
170 | # N is the number of rows at the conclusion of the previous chain. | ||
171 | # | ||
172 | # Therefore, a single insert adds (N^16 plus some) rows to the database. | ||
173 | # A really long loop... | ||
174 | # | ||
175 | execsql { | ||
176 | CREATE TRIGGER update_b BEFORE UPDATE ON trig | ||
177 | FOR EACH ROW BEGIN | ||
178 | INSERT INTO trig VALUES (65, 'update_b'); | ||
179 | END; | ||
180 | |||
181 | CREATE TRIGGER update_a AFTER UPDATE ON trig | ||
182 | FOR EACH ROW BEGIN | ||
183 | INSERT INTO trig VALUES (65, 'update_a'); | ||
184 | END; | ||
185 | |||
186 | CREATE TRIGGER insert_b BEFORE INSERT ON trig | ||
187 | FOR EACH ROW BEGIN | ||
188 | UPDATE trig SET a = 1; | ||
189 | END; | ||
190 | |||
191 | CREATE TRIGGER insert_a AFTER INSERT ON trig | ||
192 | FOR EACH ROW BEGIN | ||
193 | UPDATE trig SET a = 1; | ||
194 | END; | ||
195 | } | ||
196 | } {} | ||
197 | |||
198 | do_test sqllimits1-3.3 { | ||
199 | execsql { | ||
200 | INSERT INTO trig VALUES (1,1); | ||
201 | } | ||
202 | } {} | ||
203 | |||
204 | do_test sqllimits1-3.4 { | ||
205 | execsql { | ||
206 | SELECT COUNT(*) FROM trig; | ||
207 | } | ||
208 | } {7} | ||
209 | |||
210 | # This tries to insert so many rows it fills up the database (limited | ||
211 | # to 1MB, so not that noteworthy an achievement). | ||
212 | # | ||
213 | do_test sqllimits1-3.5 { | ||
214 | catchsql { | ||
215 | INSERT INTO trig VALUES (1,10); | ||
216 | } | ||
217 | } {1 {database or disk is full}} | ||
218 | |||
219 | do_test sqllimits1-3.6 { | ||
220 | catchsql { | ||
221 | SELECT COUNT(*) FROM trig; | ||
222 | } | ||
223 | } {0 7} | ||
224 | |||
225 | # Now check the response of the library to opening a file larger than | ||
226 | # the current max_page_count value. The response is to change the | ||
227 | # internal max_page_count value to match the actual size of the file. | ||
228 | do_test sqllimits1-3.7.1 { | ||
229 | execsql { | ||
230 | PRAGMA max_page_count = 1000000; | ||
231 | CREATE TABLE abc(a, b, c); | ||
232 | INSERT INTO abc VALUES(1, 2, 3); | ||
233 | INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; | ||
234 | INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; | ||
235 | INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; | ||
236 | INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; | ||
237 | INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; | ||
238 | INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; | ||
239 | INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; | ||
240 | INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; | ||
241 | INSERT INTO abc SELECT a, b, c FROM abc; | ||
242 | INSERT INTO abc SELECT b, a, c FROM abc; | ||
243 | INSERT INTO abc SELECT c, b, a FROM abc; | ||
244 | } | ||
245 | expr [file size test.db] / 1024 | ||
246 | } {1691} | ||
247 | do_test sqllimits1-3.7.2 { | ||
248 | db close | ||
249 | sqlite3 db test.db | ||
250 | execsql { | ||
251 | PRAGMA max_page_count = 1000; | ||
252 | } | ||
253 | execsql { | ||
254 | SELECT count(*) FROM sqlite_master; | ||
255 | } | ||
256 | } {6} | ||
257 | do_test sqllimits1-3.7.3 { | ||
258 | execsql { | ||
259 | PRAGMA max_page_count; | ||
260 | } | ||
261 | } {1691} | ||
262 | do_test sqllimits1-3.7.4 { | ||
263 | execsql { | ||
264 | DROP TABLE abc; | ||
265 | } | ||
266 | } {} | ||
267 | |||
268 | #-------------------------------------------------------------------- | ||
269 | # Test cases sqllimits1-4.* test the SQLITE_MAX_COLUMN limit. | ||
270 | # | ||
271 | do_test sqllimits-1.4.1 { | ||
272 | # Columns in a table. | ||
273 | set cols [list] | ||
274 | for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} { | ||
275 | lappend cols "c$i" | ||
276 | } | ||
277 | catchsql "CREATE TABLE t([join $cols ,])" | ||
278 | } {1 {too many columns on t}} | ||
279 | |||
280 | do_test sqllimits-1.4.2 { | ||
281 | # Columns in the result-set of a SELECT. | ||
282 | set cols [list] | ||
283 | for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} { | ||
284 | lappend cols "sql AS sql$i" | ||
285 | } | ||
286 | catchsql "SELECT [join $cols ,] FROM sqlite_master" | ||
287 | } {1 {too many columns in result set}} | ||
288 | |||
289 | do_test sqllimits-1.4.3 { | ||
290 | # Columns in the result-set of a sub-SELECT. | ||
291 | set cols [list] | ||
292 | for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} { | ||
293 | lappend cols "sql AS sql$i" | ||
294 | } | ||
295 | catchsql "SELECT sql4 FROM (SELECT [join $cols ,] FROM sqlite_master)" | ||
296 | } {1 {too many columns in result set}} | ||
297 | |||
298 | do_test sqllimits-1.4.4 { | ||
299 | # Columns in an index. | ||
300 | set cols [list] | ||
301 | for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} { | ||
302 | lappend cols c | ||
303 | } | ||
304 | set sql1 "CREATE TABLE t1(c);" | ||
305 | set sql2 "CREATE INDEX i1 ON t1([join $cols ,]);" | ||
306 | catchsql "$sql1 ; $sql2" | ||
307 | } {1 {too many columns in index}} | ||
308 | |||
309 | do_test sqllimits-1.4.5 { | ||
310 | # Columns in a GROUP BY clause. | ||
311 | catchsql "SELECT * FROM t1 GROUP BY [join $cols ,]" | ||
312 | } {1 {too many terms in GROUP BY clause}} | ||
313 | |||
314 | do_test sqllimits-1.4.6 { | ||
315 | # Columns in an ORDER BY clause. | ||
316 | catchsql "SELECT * FROM t1 ORDER BY [join $cols ,]" | ||
317 | } {1 {too many terms in ORDER BY clause}} | ||
318 | |||
319 | do_test sqllimits-1.4.7 { | ||
320 | # Assignments in an UPDATE statement. | ||
321 | set cols [list] | ||
322 | for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} { | ||
323 | lappend cols "c = 1" | ||
324 | } | ||
325 | catchsql "UPDATE t1 SET [join $cols ,];" | ||
326 | } {1 {too many columns in set list}} | ||
327 | |||
328 | do_test sqllimits-1.4.8 { | ||
329 | # Columns in a view definition: | ||
330 | set cols [list] | ||
331 | for {set i 0} {$i <= $SQLITE_MAX_COLUMN} {incr i} { | ||
332 | lappend cols "c$i" | ||
333 | } | ||
334 | catchsql "CREATE VIEW v1 AS SELECT [join $cols ,] FROM t1;" | ||
335 | } {1 {too many columns in result set}} | ||
336 | |||
337 | do_test sqllimits-1.4.9 { | ||
338 | # Columns in a view definition (testing * expansion): | ||
339 | set cols [list] | ||
340 | for {set i 0} {$i < $SQLITE_MAX_COLUMN} {incr i} { | ||
341 | lappend cols "c$i" | ||
342 | } | ||
343 | catchsql "CREATE TABLE t2([join $cols ,])" | ||
344 | catchsql "CREATE VIEW v1 AS SELECT *, c1 AS o FROM t2;" | ||
345 | } {1 {too many columns in result set}} | ||
346 | |||
347 | #-------------------------------------------------------------------- | ||
348 | # These tests - sqllimits-5.* - test that the SQLITE_MAX_EXPR_DEPTH | ||
349 | # limit is enforced. The limit refers to the number of terms in | ||
350 | # the expression. | ||
351 | # | ||
352 | if {$::SQLITE_MAX_EXPR_DEPTH != 1000} { | ||
353 | puts -nonewline stderr "WARNING: Compile with -DSQLITE_MAX_EXPR_DEPTH to run " | ||
354 | puts stderr "tests sqllimits-1.5.X" | ||
355 | } else { | ||
356 | do_test sqllimits-1.5.1 { | ||
357 | set max $::SQLITE_MAX_EXPR_DEPTH | ||
358 | set expr "(1 [string repeat {AND 1 } $max])" | ||
359 | catchsql [subst { | ||
360 | SELECT $expr | ||
361 | }] | ||
362 | } "1 {Expression tree is too large (maximum depth $::SQLITE_MAX_EXPR_DEPTH)}" | ||
363 | |||
364 | # Attempting to beat the expression depth limit using nested SELECT | ||
365 | # queries causes a parser stack overflow. | ||
366 | do_test sqllimits-1.5.2 { | ||
367 | set max $::SQLITE_MAX_EXPR_DEPTH | ||
368 | set expr "SELECT 1" | ||
369 | for {set i 0} {$i <= $max} {incr i} { | ||
370 | set expr "SELECT ($expr)" | ||
371 | } | ||
372 | catchsql [subst { $expr }] | ||
373 | } "1 {parser stack overflow}" | ||
374 | |||
375 | |||
376 | do_test sqllimits-1.5.3 { | ||
377 | execsql { | ||
378 | PRAGMA max_page_count = 1000000; -- 1 GB | ||
379 | CREATE TABLE v0(a); | ||
380 | INSERT INTO v0 VALUES(1); | ||
381 | } | ||
382 | db transaction { | ||
383 | for {set i 1} {$i < 200} {incr i} { | ||
384 | set expr "(a [string repeat {AND 1 } 50]) AS a" | ||
385 | execsql [subst { | ||
386 | CREATE VIEW v${i} AS SELECT $expr FROM v[expr {$i-1}] | ||
387 | }] | ||
388 | } | ||
389 | } | ||
390 | } {} | ||
391 | |||
392 | do_test sqllimits-1.5.4 { | ||
393 | catchsql { | ||
394 | SELECT a FROM v199 | ||
395 | } | ||
396 | } "1 {Expression tree is too large (maximum depth $::SQLITE_MAX_EXPR_DEPTH)}" | ||
397 | } | ||
398 | |||
399 | #-------------------------------------------------------------------- | ||
400 | # Test cases sqllimits-6.* test that the SQLITE_MAX_VDBE_OP | ||
401 | # limit works as expected. The limit refers to the number of opcodes | ||
402 | # in a single VDBE program. | ||
403 | # | ||
404 | # TODO | ||
405 | |||
406 | #-------------------------------------------------------------------- | ||
407 | # Test the SQLITE_MAX_FUNCTION_ARG limit works. Test case names | ||
408 | # match the pattern "sqllimits-7.*". | ||
409 | # | ||
410 | do_test sqllimits-1.7.1 { | ||
411 | set max $::SQLITE_MAX_FUNCTION_ARG | ||
412 | set vals [list] | ||
413 | for {set i 0} {$i < $SQLITE_MAX_FUNCTION_ARG} {incr i} { | ||
414 | lappend vals $i | ||
415 | } | ||
416 | catchsql "SELECT max([join $vals ,])" | ||
417 | } "0 [expr {$::SQLITE_MAX_FUNCTION_ARG - 1}]" | ||
418 | do_test sqllimits-1.7.2 { | ||
419 | set max $::SQLITE_MAX_FUNCTION_ARG | ||
420 | set vals [list] | ||
421 | for {set i 0} {$i <= $SQLITE_MAX_FUNCTION_ARG} {incr i} { | ||
422 | lappend vals $i | ||
423 | } | ||
424 | catchsql "SELECT max([join $vals ,])" | ||
425 | } {1 {too many arguments on function max}} | ||
426 | |||
427 | # Test that it is SQLite, and not the implementation of the | ||
428 | # user function that is throwing the error. | ||
429 | proc myfunc {args} {error "I don't like to be called!"} | ||
430 | do_test sqllimits-1.7.2 { | ||
431 | db function myfunc myfunc | ||
432 | set max $::SQLITE_MAX_FUNCTION_ARG | ||
433 | set vals [list] | ||
434 | for {set i 0} {$i <= $SQLITE_MAX_FUNCTION_ARG} {incr i} { | ||
435 | lappend vals $i | ||
436 | } | ||
437 | catchsql "SELECT myfunc([join $vals ,])" | ||
438 | } {1 {too many arguments on function myfunc}} | ||
439 | |||
440 | #-------------------------------------------------------------------- | ||
441 | # Test cases sqllimits-8.*: Test the SQLITE_MAX_ATTACHED limit. | ||
442 | # | ||
443 | # TODO | ||
444 | do_test sqllimits-1.8.1 { | ||
445 | set max $::SQLITE_MAX_ATTACHED | ||
446 | for {set i 0} {$i < ($max)} {incr i} { | ||
447 | file delete -force test${i}.db test${i}.db-journal | ||
448 | } | ||
449 | for {set i 0} {$i < ($max)} {incr i} { | ||
450 | execsql "ATTACH 'test${i}.db' AS aux${i}" | ||
451 | } | ||
452 | catchsql "ATTACH 'test${i}.db' AS aux${i}" | ||
453 | } "1 {too many attached databases - max $::SQLITE_MAX_ATTACHED}" | ||
454 | do_test sqllimits-1.8.2 { | ||
455 | set max $::SQLITE_MAX_ATTACHED | ||
456 | for {set i 0} {$i < ($max)} {incr i} { | ||
457 | execsql "DETACH aux${i}" | ||
458 | } | ||
459 | } {} | ||
460 | |||
461 | #-------------------------------------------------------------------- | ||
462 | # Test cases sqllimits-9.*: Check that the SQLITE_MAX_VARIABLE_NUMBER | ||
463 | # limit works. | ||
464 | # | ||
465 | do_test sqllimits-1.9.1 { | ||
466 | set max $::SQLITE_MAX_VARIABLE_NUMBER | ||
467 | catchsql "SELECT ?[expr {$max+1}] FROM t1" | ||
468 | } "1 {variable number must be between ?1 and ?$::SQLITE_MAX_VARIABLE_NUMBER}" | ||
469 | do_test sqllimits-1.9.2 { | ||
470 | set max $::SQLITE_MAX_VARIABLE_NUMBER | ||
471 | set vals [list] | ||
472 | for {set i 0} {$i < ($max+3)} {incr i} { | ||
473 | lappend vals ? | ||
474 | } | ||
475 | catchsql "SELECT [join $vals ,] FROM t1" | ||
476 | } "1 {too many SQL variables}" | ||
477 | |||
478 | |||
479 | #-------------------------------------------------------------------- | ||
480 | # sqllimits-10.*: Test the SQLITE_MAX_PAGE_SIZE define is enforced. | ||
481 | # This is probably tested elsewhere too (pagerX.test). Attempts | ||
482 | # to raise the page size above this limit are silently ignored. | ||
483 | # | ||
484 | do_test sqllimits-1.10.1 { | ||
485 | db close | ||
486 | file delete -force test.db test.db-journal | ||
487 | sqlite3 db test.db | ||
488 | set max $::SQLITE_MAX_PAGE_SIZE | ||
489 | catchsql "PRAGMA page_size = [expr {$max*2}]" | ||
490 | } {0 {}} | ||
491 | do_test sqllimits-1.10.2 { | ||
492 | catchsql "PRAGMA page_size" | ||
493 | } {0 1024} | ||
494 | do_test sqllimits-1.10.3 { | ||
495 | set max $::SQLITE_MAX_PAGE_SIZE | ||
496 | catchsql "PRAGMA page_size = $max" | ||
497 | } {0 {}} | ||
498 | do_test sqllimits-1.10.4 { | ||
499 | execsql "pragma page_size" | ||
500 | } $::SQLITE_MAX_PAGE_SIZE | ||
501 | do_test sqllimits-1.10.5 { | ||
502 | set max $::SQLITE_MAX_PAGE_SIZE | ||
503 | execsql "pragma page_size = [expr {$max - 5}]" | ||
504 | execsql "pragma page_size" | ||
505 | } $::SQLITE_MAX_PAGE_SIZE | ||
506 | |||
507 | # Opening a database where the page size is too large should generate | ||
508 | # an error. | ||
509 | # | ||
510 | do_test sqllimits-1.10.5 { | ||
511 | db close | ||
512 | file delete -force test.db | ||
513 | set ::SQLITE_MAX_PAGE_SIZE 32768 | ||
514 | sqlite3 db test.db | ||
515 | db eval {PRAGMA page_size=32768} | ||
516 | db eval {CREATE TABLE t1(x);} | ||
517 | db eval {PRAGMA page_size} | ||
518 | } {32768} | ||
519 | do_test sqllimits-1.10.6 { | ||
520 | db close | ||
521 | set ::SQLITE_MAX_PAGE_SIZE 8192 | ||
522 | sqlite3 db test.db | ||
523 | catchsql {SELECT name FROM sqlite_master} | ||
524 | } {1 {file is encrypted or is not a database}} | ||
525 | db close | ||
526 | file delete -force test.db | ||
527 | sqlite3 db test.db | ||
528 | |||
529 | #-------------------------------------------------------------------- | ||
530 | # Test cases sqllimits-11.* verify that the | ||
531 | # SQLITE_MAX_LIKE_PATTERN_LENGTH limit is enforced. This limit only | ||
532 | # applies to the built-in LIKE operator, supplying an external | ||
533 | # implementation by overriding the like() scalar function bypasses | ||
534 | # this limitation. | ||
535 | # | ||
536 | # These tests check that the limit is not incorrectly applied to | ||
537 | # the left-hand-side of the LIKE operator (the string being tested | ||
538 | # against the pattern). | ||
539 | # | ||
540 | do_test sqllimits-1.11.1 { | ||
541 | set max $::SQLITE_MAX_LIKE_PATTERN_LENGTH | ||
542 | set ::pattern [string repeat "A%" [expr $max/2]] | ||
543 | set ::string [string repeat "A" [expr {$max*2}]] | ||
544 | execsql { | ||
545 | SELECT $::string LIKE $::pattern; | ||
546 | } | ||
547 | } {1} | ||
548 | do_test sqllimits-1.11.2 { | ||
549 | set max $::SQLITE_MAX_LIKE_PATTERN_LENGTH | ||
550 | set ::pattern [string repeat "A%" [expr {($max/2) + 1}]] | ||
551 | set ::string [string repeat "A" [expr {$max*2}]] | ||
552 | catchsql { | ||
553 | SELECT $::string LIKE $::pattern; | ||
554 | } | ||
555 | } {1 {LIKE or GLOB pattern too complex}} | ||
556 | |||
557 | #-------------------------------------------------------------------- | ||
558 | # This test case doesn't really belong with the other limits tests. | ||
559 | # It is in this file because it is taxing to run, like the limits tests. | ||
560 | # | ||
561 | do_test sqllimits-1.12.1 { | ||
562 | set ::N [expr int(([expr pow(2,32)]/50) + 1)] | ||
563 | expr (($::N*50) & 0xffffffff)<55 | ||
564 | } {1} | ||
565 | do_test sqllimits-1.12.2 { | ||
566 | set ::format "[string repeat A 60][string repeat "%J" $::N]" | ||
567 | catchsql { | ||
568 | SELECT strftime($::format, 1); | ||
569 | } | ||
570 | } {1 {string or blob too big}} | ||
571 | |||
572 | |||
573 | foreach {key value} [array get saved] { | ||
574 | catch {set $key $value} | ||
575 | } | ||
576 | finish_test | ||