000001 # 2007 May 8 000002 # 000003 # The author disclaims copyright to this source code. In place of 000004 # a legal notice, here is a blessing: 000005 # 000006 # May you do good and not evil. 000007 # May you find forgiveness for yourself and forgive others. 000008 # May you share freely, never taking more than you give. 000009 # 000010 #*********************************************************************** 000011 # 000012 # This file contains tests to verify that the limits defined in 000013 # sqlite source file limits.h are enforced. 000014 # 000015 # $Id: sqllimits1.test,v 1.33 2009/06/25 01:47:12 drh Exp $ 000016 000017 set testdir [file dirname $argv0] 000018 source $testdir/tester.tcl 000019 set testprefix sqllimits1 000020 000021 # Verify that the default per-connection limits are the same as 000022 # the compile-time hard limits. 000023 # 000024 sqlite3 db2 :memory: 000025 do_test sqllimits1-1.1 { 000026 sqlite3_limit db SQLITE_LIMIT_LENGTH -1 000027 } $SQLITE_MAX_LENGTH 000028 do_test sqllimits1-1.2 { 000029 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1 000030 } $SQLITE_MAX_SQL_LENGTH 000031 do_test sqllimits1-1.3 { 000032 sqlite3_limit db SQLITE_LIMIT_COLUMN -1 000033 } $SQLITE_MAX_COLUMN 000034 do_test sqllimits1-1.4 { 000035 sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1 000036 } $SQLITE_MAX_EXPR_DEPTH 000037 do_test sqllimits1-1.5 { 000038 sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1 000039 } $SQLITE_MAX_COMPOUND_SELECT 000040 do_test sqllimits1-1.6 { 000041 sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1 000042 } $SQLITE_MAX_VDBE_OP 000043 do_test sqllimits1-1.7 { 000044 sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1 000045 } $SQLITE_MAX_FUNCTION_ARG 000046 do_test sqllimits1-1.8 { 000047 sqlite3_limit db SQLITE_LIMIT_ATTACHED -1 000048 } $SQLITE_MAX_ATTACHED 000049 do_test sqllimits1-1.9 { 000050 sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1 000051 } $SQLITE_MAX_LIKE_PATTERN_LENGTH 000052 do_test sqllimits1-1.10 { 000053 sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1 000054 } $SQLITE_MAX_VARIABLE_NUMBER 000055 do_test sqllimits1-1.11 { 000056 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH -1 000057 } $SQLITE_MAX_TRIGGER_DEPTH 000058 do_test sqllimits1-1.12 { 000059 sqlite3_limit db SQLITE_LIMIT_WORKER_THREADS 99999 000060 sqlite3_limit db SQLITE_LIMIT_WORKER_THREADS -1 000061 } $SQLITE_MAX_WORKER_THREADS 000062 000063 # Limit parameters out of range. 000064 # 000065 do_test sqllimits1-1.20 { 000066 sqlite3_limit db SQLITE_LIMIT_TOOSMALL 123 000067 } {-1} 000068 do_test sqllimits1-1.21 { 000069 sqlite3_limit db SQLITE_LIMIT_TOOSMALL 123 000070 } {-1} 000071 do_test sqllimits1-1.22 { 000072 sqlite3_limit db SQLITE_LIMIT_TOOBIG 123 000073 } {-1} 000074 do_test sqllimits1-1.23 { 000075 sqlite3_limit db SQLITE_LIMIT_TOOBIG 123 000076 } {-1} 000077 000078 # Minimum value for SQLITE_LIMIT_LENGTH is 30 000079 # 000080 do_test sqllimits1-1.30 { 000081 set prior [sqlite3_limit db SQLITE_LIMIT_LENGTH 1] 000082 sqlite3_limit db SQLITE_LIMIT_LENGTH $prior 000083 } 30 000084 000085 000086 # Decrease all limits by half. Verify that the new limits take. 000087 # 000088 if {$SQLITE_MAX_LENGTH>=2} { 000089 do_test sqllimits1-2.1.1 { 000090 sqlite3_limit db SQLITE_LIMIT_LENGTH \ 000091 [expr {$::SQLITE_MAX_LENGTH/2}] 000092 } $SQLITE_MAX_LENGTH 000093 do_test sqllimits1-2.1.2 { 000094 sqlite3_limit db SQLITE_LIMIT_LENGTH -1 000095 } [expr {$SQLITE_MAX_LENGTH/2}] 000096 } 000097 if {$SQLITE_MAX_SQL_LENGTH>=2} { 000098 do_test sqllimits1-2.2.1 { 000099 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH \ 000100 [expr {$::SQLITE_MAX_SQL_LENGTH/2}] 000101 } $SQLITE_MAX_SQL_LENGTH 000102 do_test sqllimits1-2.2.2 { 000103 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1 000104 } [expr {$SQLITE_MAX_SQL_LENGTH/2}] 000105 } 000106 if {$SQLITE_MAX_COLUMN>=2} { 000107 do_test sqllimits1-2.3.1 { 000108 sqlite3_limit db SQLITE_LIMIT_COLUMN \ 000109 [expr {$::SQLITE_MAX_COLUMN/2}] 000110 } $SQLITE_MAX_COLUMN 000111 do_test sqllimits1-2.3.2 { 000112 sqlite3_limit db SQLITE_LIMIT_COLUMN -1 000113 } [expr {$SQLITE_MAX_COLUMN/2}] 000114 } 000115 if {$SQLITE_MAX_EXPR_DEPTH>=2} { 000116 do_test sqllimits1-2.4.1 { 000117 sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH \ 000118 [expr {$::SQLITE_MAX_EXPR_DEPTH/2}] 000119 } $SQLITE_MAX_EXPR_DEPTH 000120 do_test sqllimits1-2.4.2 { 000121 sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1 000122 } [expr {$SQLITE_MAX_EXPR_DEPTH/2}] 000123 } 000124 if {$SQLITE_MAX_COMPOUND_SELECT>=2} { 000125 do_test sqllimits1-2.5.1 { 000126 sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT \ 000127 [expr {$::SQLITE_MAX_COMPOUND_SELECT/2}] 000128 } $SQLITE_MAX_COMPOUND_SELECT 000129 do_test sqllimits1-2.5.2 { 000130 sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1 000131 } [expr {$SQLITE_MAX_COMPOUND_SELECT/2}] 000132 } 000133 if {$SQLITE_MAX_VDBE_OP>=2} { 000134 do_test sqllimits1-2.6.1 { 000135 sqlite3_limit db SQLITE_LIMIT_VDBE_OP \ 000136 [expr {$::SQLITE_MAX_VDBE_OP/2}] 000137 } $SQLITE_MAX_VDBE_OP 000138 do_test sqllimits1-2.6.2 { 000139 sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1 000140 } [expr {$SQLITE_MAX_VDBE_OP/2}] 000141 } 000142 if {$SQLITE_MAX_FUNCTION_ARG>=2} { 000143 do_test sqllimits1-2.7.1 { 000144 sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG \ 000145 [expr {$::SQLITE_MAX_FUNCTION_ARG/2}] 000146 } $SQLITE_MAX_FUNCTION_ARG 000147 do_test sqllimits1-2.7.2 { 000148 sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1 000149 } [expr {$SQLITE_MAX_FUNCTION_ARG/2}] 000150 } 000151 if {$SQLITE_MAX_ATTACHED>=2} { 000152 do_test sqllimits1-2.8.1 { 000153 sqlite3_limit db SQLITE_LIMIT_ATTACHED \ 000154 [expr {$::SQLITE_MAX_ATTACHED/2}] 000155 } $SQLITE_MAX_ATTACHED 000156 do_test sqllimits1-2.8.2 { 000157 sqlite3_limit db SQLITE_LIMIT_ATTACHED -1 000158 } [expr {$SQLITE_MAX_ATTACHED/2}] 000159 } 000160 if {$SQLITE_MAX_LIKE_PATTERN_LENGTH>=2} { 000161 do_test sqllimits1-2.9.1 { 000162 sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH \ 000163 [expr {$::SQLITE_MAX_LIKE_PATTERN_LENGTH/2}] 000164 } $SQLITE_MAX_LIKE_PATTERN_LENGTH 000165 do_test sqllimits1-2.9.2 { 000166 sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1 000167 } [expr {$SQLITE_MAX_LIKE_PATTERN_LENGTH/2}] 000168 } 000169 if {$SQLITE_MAX_VARIABLE_NUMBER>=2} { 000170 do_test sqllimits1-2.10.1 { 000171 sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER \ 000172 [expr {$::SQLITE_MAX_VARIABLE_NUMBER/2}] 000173 } $SQLITE_MAX_VARIABLE_NUMBER 000174 do_test sqllimits1-2.10.2 { 000175 sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1 000176 } [expr {$SQLITE_MAX_VARIABLE_NUMBER/2}] 000177 } 000178 000179 # In a separate database connection, verify that the limits are unchanged. 000180 # 000181 do_test sqllimits1-3.1 { 000182 sqlite3_limit db2 SQLITE_LIMIT_LENGTH -1 000183 } $SQLITE_MAX_LENGTH 000184 do_test sqllimits1-3.2 { 000185 sqlite3_limit db2 SQLITE_LIMIT_SQL_LENGTH -1 000186 } $SQLITE_MAX_SQL_LENGTH 000187 do_test sqllimits1-3.3 { 000188 sqlite3_limit db2 SQLITE_LIMIT_COLUMN -1 000189 } $SQLITE_MAX_COLUMN 000190 do_test sqllimits1-3.4 { 000191 sqlite3_limit db2 SQLITE_LIMIT_EXPR_DEPTH -1 000192 } $SQLITE_MAX_EXPR_DEPTH 000193 do_test sqllimits1-3.5 { 000194 sqlite3_limit db2 SQLITE_LIMIT_COMPOUND_SELECT -1 000195 } $SQLITE_MAX_COMPOUND_SELECT 000196 do_test sqllimits1-3.6 { 000197 sqlite3_limit db2 SQLITE_LIMIT_VDBE_OP -1 000198 } $SQLITE_MAX_VDBE_OP 000199 do_test sqllimits1-3.7 { 000200 sqlite3_limit db2 SQLITE_LIMIT_FUNCTION_ARG -1 000201 } $SQLITE_MAX_FUNCTION_ARG 000202 do_test sqllimits1-3.8 { 000203 sqlite3_limit db2 SQLITE_LIMIT_ATTACHED -1 000204 } $SQLITE_MAX_ATTACHED 000205 do_test sqllimits1-3.9 { 000206 sqlite3_limit db2 SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1 000207 } $SQLITE_MAX_LIKE_PATTERN_LENGTH 000208 do_test sqllimits1-3.10 { 000209 sqlite3_limit db2 SQLITE_LIMIT_VARIABLE_NUMBER -1 000210 } $SQLITE_MAX_VARIABLE_NUMBER 000211 db2 close 000212 000213 # Attempt to set all limits to the maximum 32-bit integer. Verify 000214 # that the limit does not exceed the compile-time upper bound. 000215 # 000216 do_test sqllimits1-4.1.1 { 000217 sqlite3_limit db SQLITE_LIMIT_LENGTH 0x7fffffff 000218 sqlite3_limit db SQLITE_LIMIT_LENGTH -1 000219 } $SQLITE_MAX_LENGTH 000220 do_test sqllimits1-4.2.1 { 000221 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffff 000222 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1 000223 } $SQLITE_MAX_SQL_LENGTH 000224 do_test sqllimits1-4.3.1 { 000225 sqlite3_limit db SQLITE_LIMIT_COLUMN 0x7fffffff 000226 sqlite3_limit db SQLITE_LIMIT_COLUMN -1 000227 } $SQLITE_MAX_COLUMN 000228 do_test sqllimits1-4.4.1 { 000229 sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH 0x7fffffff 000230 sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1 000231 } $SQLITE_MAX_EXPR_DEPTH 000232 do_test sqllimits1-4.5.1 { 000233 sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT 0x7fffffff 000234 sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1 000235 } $SQLITE_MAX_COMPOUND_SELECT 000236 do_test sqllimits1-4.6.1 { 000237 sqlite3_limit db SQLITE_LIMIT_VDBE_OP 0x7fffffff 000238 sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1 000239 } $SQLITE_MAX_VDBE_OP 000240 do_test sqllimits1-4.7.1 { 000241 sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG 0x7fffffff 000242 sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1 000243 } $SQLITE_MAX_FUNCTION_ARG 000244 do_test sqllimits1-4.8.1 { 000245 sqlite3_limit db SQLITE_LIMIT_ATTACHED 0x7fffffff 000246 sqlite3_limit db SQLITE_LIMIT_ATTACHED -1 000247 } $SQLITE_MAX_ATTACHED 000248 do_test sqllimits1-4.9.1 { 000249 sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH 0x7fffffff 000250 sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1 000251 } $SQLITE_MAX_LIKE_PATTERN_LENGTH 000252 do_test sqllimits1-4.10.1 { 000253 sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER 0x7fffffff 000254 sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1 000255 } $SQLITE_MAX_VARIABLE_NUMBER 000256 000257 #-------------------------------------------------------------------- 000258 # Test cases sqllimits1-5.* test that the SQLITE_MAX_LENGTH limit 000259 # is enforced. 000260 # 000261 # EVIDENCE-OF: R-61987-00541 SQLITE_LIMIT_LENGTH The maximum size of any 000262 # string or BLOB or table row, in bytes. 000263 # 000264 db close 000265 sqlite3 db test.db 000266 set LARGESIZE 99999 000267 set SQLITE_LIMIT_LENGTH 100000 000268 sqlite3_limit db SQLITE_LIMIT_LENGTH $SQLITE_LIMIT_LENGTH 000269 000270 do_test sqllimits1-5.1.1 { 000271 catchsql { SELECT randomblob(2147483647) } 000272 } {1 {string or blob too big}} 000273 do_test sqllimits1-5.1.2 { 000274 catchsql { SELECT zeroblob(2147483647) } 000275 } {1 {string or blob too big}} 000276 000277 do_test sqllimits1-5.2 { 000278 catchsql { SELECT LENGTH(randomblob($::LARGESIZE)) } 000279 } [list 0 $LARGESIZE] 000280 000281 do_test sqllimits1-5.3 { 000282 catchsql { SELECT quote(randomblob($::LARGESIZE)) } 000283 } {1 {string or blob too big}} 000284 000285 do_test sqllimits1-5.4 { 000286 catchsql { SELECT LENGTH(zeroblob($::LARGESIZE)) } 000287 } [list 0 $LARGESIZE] 000288 000289 do_test sqllimits1-5.5 { 000290 catchsql { SELECT quote(zeroblob($::LARGESIZE)) } 000291 } {1 {string or blob too big}} 000292 000293 do_test sqllimits1-5.6 { 000294 catchsql { SELECT zeroblob(-1) } 000295 } {0 {{}}} 000296 000297 do_test sqllimits1-5.9 { 000298 set ::str [string repeat A 65537] 000299 set ::rep [string repeat B 65537] 000300 catchsql { SELECT replace($::str, 'A', $::rep) } 000301 } {1 {string or blob too big}} 000302 000303 do_test sqllimits1-5.10 { 000304 # Prior to 3.37.0 strftime() allocated a large static buffer into 000305 # which to format its output. Using that strategy, 2100 repeats was 000306 # enough to exceed 100KiB and provoke the error. As of 3.37.0 strftime() 000307 # uses the StrAccum functions, so it requires 12100 to fail. 000308 # 000309 # set ::str [string repeat %J 2100] 000310 set ::str [string repeat %J 12100] 000311 catchsql { SELECT length(strftime($::str, '2003-10-31')) } 000312 } {1 {string or blob too big}} 000313 000314 do_test sqllimits1-5.11 { 000315 set ::str1 [string repeat A [expr {$SQLITE_LIMIT_LENGTH - 10}]] 000316 set ::str2 [string repeat B [expr {$SQLITE_LIMIT_LENGTH - 10}]] 000317 catchsql { SELECT $::str1 || $::str2 } 000318 } {1 {string or blob too big}} 000319 000320 do_test sqllimits1-5.12 { 000321 set ::str1 [string repeat ' [expr {$SQLITE_LIMIT_LENGTH - 10}]] 000322 catchsql { SELECT quote($::str1) } 000323 } {1 {string or blob too big}} 000324 000325 do_test sqllimits1-5.13 { 000326 set ::str1 [string repeat ' [expr {$SQLITE_LIMIT_LENGTH - 10}]] 000327 catchsql { SELECT hex($::str1) } 000328 } {1 {string or blob too big}} 000329 000330 do_test sqllimits1-5.14.1 { 000331 set ::STMT [sqlite3_prepare db "SELECT ?" -1 TAIL] 000332 sqlite3_bind_zeroblob $::STMT 1 [expr {$SQLITE_LIMIT_LENGTH + 1}] 000333 } {} 000334 do_test sqllimits1-5.14.2 { 000335 sqlite3_step $::STMT 000336 } {SQLITE_ERROR} 000337 do_test sqllimits1-5.14.3 { 000338 sqlite3_reset $::STMT 000339 } {SQLITE_TOOBIG} 000340 do_test sqllimits1-5.14.4 { 000341 set np1 [expr {$SQLITE_LIMIT_LENGTH + 1}] 000342 set ::str1 [string repeat A $np1] 000343 catch {sqlite3_bind_text $::STMT 1 $::str1 -1} res 000344 set res 000345 } {SQLITE_TOOBIG} 000346 ifcapable utf16 { 000347 do_test sqllimits1-5.14.5 { 000348 catch {sqlite3_bind_text16 $::STMT 1 $::str1 -1} res 000349 set res 000350 } {SQLITE_TOOBIG} 000351 } 000352 do_test sqllimits1-5.14.6 { 000353 catch {sqlite3_bind_text $::STMT 1 $::str1 $np1} res 000354 set res 000355 } {SQLITE_TOOBIG} 000356 ifcapable utf16 { 000357 do_test sqllimits1-5.14.7 { 000358 catch {sqlite3_bind_text16 $::STMT 1 $::str1 [expr $np1+1]} res 000359 set res 000360 } {SQLITE_TOOBIG} 000361 } 000362 do_test sqllimits1-5.14.8 { 000363 set n [expr {$np1-1}] 000364 catch {sqlite3_bind_text $::STMT 1 $::str1 $n} res 000365 set res 000366 } {} 000367 do_test sqllimits1-5.14.9 { 000368 catch {sqlite3_bind_text16 $::STMT 1 $::str1 $n} res 000369 set res 000370 } {} 000371 sqlite3_finalize $::STMT 000372 000373 do_test sqllimits1-5.15 { 000374 execsql { 000375 CREATE TABLE t4(x); 000376 INSERT INTO t4 VALUES(1); 000377 INSERT INTO t4 VALUES(2); 000378 INSERT INTO t4 SELECT 2+x FROM t4; 000379 } 000380 catchsql { 000381 SELECT group_concat(hex(randomblob(20000))) FROM t4; 000382 } 000383 } {1 {string or blob too big}} 000384 db eval {DROP TABLE t4} 000385 000386 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffff 000387 set strvalue [string repeat A $::SQLITE_LIMIT_LENGTH] 000388 do_test sqllimits1-5.16 { 000389 catchsql "SELECT '$strvalue' AS x" 000390 } [list 0 $strvalue] 000391 do_test sqllimits1-5.17.1 { 000392 catchsql "SELECT 'A$strvalue'" 000393 } [list 1 {string or blob too big}] 000394 do_test sqllimits1-5.17.2 { 000395 sqlite3_limit db SQLITE_LIMIT_LENGTH 0x7fffffff 000396 catchsql {SELECT 'A' || $::strvalue} 000397 } [list 0 A$strvalue] 000398 do_test sqllimits1-5.17.3 { 000399 sqlite3_limit db SQLITE_LIMIT_LENGTH $SQLITE_LIMIT_LENGTH 000400 catchsql {SELECT 'A' || $::strvalue} 000401 } [list 1 {string or blob too big}] 000402 set blobvalue [string repeat 41 $::SQLITE_LIMIT_LENGTH] 000403 do_test sqllimits1-5.18 { 000404 catchsql "SELECT x'$blobvalue' AS x" 000405 } [list 0 $strvalue] 000406 do_test sqllimits1-5.19 { 000407 catchsql "SELECT '41$blobvalue'" 000408 } [list 1 {string or blob too big}] 000409 unset blobvalue 000410 000411 ifcapable datetime { 000412 set strvalue [string repeat D [expr {$SQLITE_LIMIT_LENGTH-11}]] 000413 do_test sqllimits1-5.20 { 000414 catchsql {SELECT strftime('%Y ' || $::strvalue, '2008-01-02')} 000415 } [list 0 [list "2008 $strvalue"]] 000416 do_test sqllimits1-5.21 { 000417 catchsql {SELECT strftime('%Y-%m-%d ' || $::strvalue, '2008-01-02')} 000418 } {1 {string or blob too big}} 000419 } 000420 unset strvalue 000421 000422 #-------------------------------------------------------------------- 000423 # Test cases sqllimits1-6.* test that the SQLITE_MAX_SQL_LENGTH limit 000424 # is enforced. 000425 # 000426 # EVIDENCE-OF: R-09808-17554 SQLITE_LIMIT_SQL_LENGTH The maximum length 000427 # of an SQL statement, in bytes. 000428 # 000429 do_test sqllimits1-6.1 { 000430 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000 000431 set sql "SELECT 1 WHERE 1==1" 000432 set tail " /* A comment to take up space in order to make the string\ 000433 longer without increasing the expression depth */\ 000434 AND 1 == 1" 000435 set N [expr {(50000 / [string length $tail])+1}] 000436 append sql [string repeat $tail $N] 000437 catchsql $sql 000438 } {1 {string or blob too big}} 000439 do_test sqllimits1-6.3 { 000440 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000 000441 set sql "SELECT 1 WHERE 1==1" 000442 set tail " /* A comment to take up space in order to make the string\ 000443 longer without increasing the expression depth */\ 000444 AND 1 == 1" 000445 set N [expr {(50000 / [string length $tail])+1}] 000446 append sql [string repeat $tail $N] 000447 set nbytes [string length $sql] 000448 append sql { AND 0} 000449 set rc [catch {sqlite3_prepare db $sql $nbytes TAIL} STMT] 000450 lappend rc $STMT 000451 } {1 {(18) statement too long}} 000452 do_test sqllimits1-6.4 { 000453 sqlite3_errmsg db 000454 } {statement too long} 000455 000456 #-------------------------------------------------------------------- 000457 # Test cases sqllimits1-7.* test that the limit set using the 000458 # max_page_count pragma. 000459 # 000460 do_test sqllimits1-7.1 { 000461 execsql { 000462 PRAGMA max_page_count = 1000; 000463 } 000464 } {1000} 000465 do_test sqllimits1-7.2 { 000466 execsql { CREATE TABLE trig (a INTEGER, b INTEGER); } 000467 000468 # Set up a tree of triggers to fire when a row is inserted 000469 # into table "trig". 000470 # 000471 # INSERT -> insert_b -> update_b -> insert_a -> update_a (chain 1) 000472 # -> update_a -> insert_a -> update_b (chain 2) 000473 # -> insert_a -> update_b -> insert_b -> update_a (chain 3) 000474 # -> update_a -> insert_b -> update_b (chain 4) 000475 # 000476 # Table starts with N rows. 000477 # 000478 # Chain 1: insert_b (update N rows) 000479 # -> update_b (insert 1 rows) 000480 # -> insert_a (update N rows) 000481 # -> update_a (insert 1 rows) 000482 # 000483 # chains 2, 3 and 4 are similar. Each inserts more than N^2 rows, where 000484 # N is the number of rows at the conclusion of the previous chain. 000485 # 000486 # Therefore, a single insert adds (N^16 plus some) rows to the database. 000487 # A really long loop... 000488 # 000489 execsql { 000490 CREATE TRIGGER update_b BEFORE UPDATE ON trig 000491 FOR EACH ROW BEGIN 000492 INSERT INTO trig VALUES (65, 'update_b'); 000493 END; 000494 000495 CREATE TRIGGER update_a AFTER UPDATE ON trig 000496 FOR EACH ROW BEGIN 000497 INSERT INTO trig VALUES (65, 'update_a'); 000498 END; 000499 000500 CREATE TRIGGER insert_b BEFORE INSERT ON trig 000501 FOR EACH ROW BEGIN 000502 UPDATE trig SET a = 1; 000503 END; 000504 000505 CREATE TRIGGER insert_a AFTER INSERT ON trig 000506 FOR EACH ROW BEGIN 000507 UPDATE trig SET a = 1; 000508 END; 000509 } 000510 } {} 000511 000512 do_test sqllimits1-7.3 { 000513 execsql { 000514 INSERT INTO trig VALUES (1,1); 000515 } 000516 } {} 000517 000518 do_test sqllimits1-7.4 { 000519 execsql { 000520 SELECT COUNT(*) FROM trig; 000521 } 000522 } {7} 000523 000524 # This tries to insert so many rows it fills up the database (limited 000525 # to 1MB, so not that noteworthy an achievement). 000526 # 000527 do_test sqllimits1-7.5 { 000528 catchsql { 000529 INSERT INTO trig VALUES (1,10); 000530 } 000531 } {1 {database or disk is full}} 000532 000533 do_test sqllimits1-7.6 { 000534 catchsql { 000535 SELECT COUNT(*) FROM trig; 000536 } 000537 } {0 7} 000538 000539 # Now check the response of the library to opening a file larger than 000540 # the current max_page_count value. The response is to change the 000541 # internal max_page_count value to match the actual size of the file. 000542 if {[db eval {PRAGMA auto_vacuum}]} { 000543 set fsize 1700 000544 } else { 000545 set fsize 1691 000546 } 000547 do_test sqllimits1-7.7.1 { 000548 execsql { 000549 PRAGMA max_page_count = 1000000; 000550 CREATE TABLE abc(a, b, c); 000551 INSERT INTO abc VALUES(1, 2, 3); 000552 INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; 000553 INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; 000554 INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; 000555 INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; 000556 INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; 000557 INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; 000558 INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; 000559 INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc; 000560 INSERT INTO abc SELECT a, b, c FROM abc; 000561 INSERT INTO abc SELECT b, a, c FROM abc; 000562 INSERT INTO abc SELECT c, b, a FROM abc; 000563 } 000564 expr [file size test.db] / 1024 000565 } $fsize 000566 do_test sqllimits1-7.7.2 { 000567 db close 000568 sqlite3 db test.db 000569 execsql { 000570 PRAGMA max_page_count = 1000; 000571 } 000572 execsql { 000573 SELECT count(*) FROM sqlite_master; 000574 } 000575 } {6} 000576 do_test sqllimits1-7.7.3 { 000577 execsql { 000578 PRAGMA max_page_count; 000579 } 000580 } $fsize 000581 do_test sqllimits1-7.7.4 { 000582 execsql { 000583 DROP TABLE abc; 000584 } 000585 } {} 000586 000587 #-------------------------------------------------------------------- 000588 # Test cases sqllimits1-8.* test the SQLITE_MAX_COLUMN limit. 000589 # 000590 # EVIDENCE-OF: R-43996-29471 SQLITE_LIMIT_COLUMN The maximum number of 000591 # columns in a table definition or in the result set of a SELECT or the 000592 # maximum number of columns in an index or in an ORDER BY or GROUP BY 000593 # clause. 000594 # 000595 set SQLITE_LIMIT_COLUMN 200 000596 sqlite3_limit db SQLITE_LIMIT_COLUMN $SQLITE_LIMIT_COLUMN 000597 do_test sqllimits1-8.1 { 000598 # Columns in a table. 000599 set cols [list] 000600 for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { 000601 lappend cols "c$i" 000602 } 000603 catchsql "CREATE TABLE t([join $cols ,])" 000604 } {1 {too many columns on t}} 000605 000606 do_test sqllimits1-8.2 { 000607 # Columns in the result-set of a SELECT. 000608 set cols [list] 000609 for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { 000610 lappend cols "sql AS sql$i" 000611 } 000612 catchsql "SELECT [join $cols ,] FROM sqlite_master" 000613 } {1 {too many columns in result set}} 000614 000615 do_test sqllimits1-8.3 { 000616 # Columns in the result-set of a sub-SELECT. 000617 set cols [list] 000618 for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { 000619 lappend cols "sql AS sql$i" 000620 } 000621 catchsql "SELECT sql4 FROM (SELECT [join $cols ,] FROM sqlite_master)" 000622 } {1 {too many columns in result set}} 000623 000624 do_test sqllimits1-8.4 { 000625 # Columns in an index. 000626 set cols [list] 000627 for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { 000628 lappend cols c 000629 } 000630 set sql1 "CREATE TABLE t1(c);" 000631 set sql2 "CREATE INDEX i1 ON t1([join $cols ,]);" 000632 catchsql "$sql1 ; $sql2" 000633 } {1 {too many columns in index}} 000634 000635 do_test sqllimits1-8.5 { 000636 # Columns in a GROUP BY clause. 000637 catchsql "SELECT * FROM t1 GROUP BY [join $cols ,]" 000638 } {1 {too many terms in GROUP BY clause}} 000639 000640 do_test sqllimits1-8.6 { 000641 # Columns in an ORDER BY clause. 000642 catchsql "SELECT * FROM t1 ORDER BY [join $cols ,]" 000643 } {1 {too many terms in ORDER BY clause}} 000644 000645 do_test sqllimits1-8.7 { 000646 # Assignments in an UPDATE statement. 000647 set cols [list] 000648 for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { 000649 lappend cols "c = 1" 000650 } 000651 catchsql "UPDATE t1 SET [join $cols ,];" 000652 } {1 {too many columns in set list}} 000653 000654 do_test sqllimits1-8.8 { 000655 # Columns in a view definition: 000656 set cols [list] 000657 for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { 000658 lappend cols "c$i" 000659 } 000660 execsql "CREATE VIEW v1 AS SELECT [join $cols ,] FROM t1;" 000661 catchsql {SELECT * FROM v1} 000662 } {1 {too many columns in result set}} 000663 000664 do_test sqllimits1-8.9 { 000665 # Columns in a view definition (testing * expansion): 000666 set cols [list] 000667 for {set i 0} {$i < $SQLITE_LIMIT_COLUMN} {incr i} { 000668 lappend cols "c$i" 000669 } 000670 execsql {DROP VIEW IF EXISTS v1} 000671 catchsql "CREATE TABLE t2([join $cols ,])" 000672 catchsql "CREATE VIEW v1 AS SELECT *, c1 AS o FROM t2;" 000673 catchsql "SELECT * FROM v1" 000674 } {1 {too many columns in result set}} 000675 000676 do_test sqllimits1-8.10 { 000677 # ORDER BY columns 000678 set cols [list] 000679 for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { 000680 lappend cols c 000681 } 000682 set sql "SELECT c FROM t1 ORDER BY [join $cols ,]" 000683 catchsql $sql 000684 } {1 {too many terms in ORDER BY clause}} 000685 do_test sqllimits1-8.11 { 000686 # ORDER BY columns 000687 set cols [list] 000688 for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { 000689 lappend cols [expr {$i%3 + 1}] 000690 } 000691 set sql "SELECT c, c+1, c+2 FROM t1 UNION SELECT c-1, c-2, c-3 FROM t1" 000692 append sql " ORDER BY [join $cols ,]" 000693 catchsql $sql 000694 } {1 {too many terms in ORDER BY clause}} 000695 000696 000697 #-------------------------------------------------------------------- 000698 # These tests - sqllimits1-9.* - test that the SQLITE_LIMIT_EXPR_DEPTH 000699 # limit is enforced. The limit refers to the number of terms in 000700 # the expression. 000701 # 000702 # EVIDENCE-OF: R-12723-08526 SQLITE_LIMIT_EXPR_DEPTH The maximum depth 000703 # of the parse tree on any expression. 000704 # 000705 if {$SQLITE_MAX_EXPR_DEPTH==0} { 000706 puts -nonewline stderr "WARNING: Compile with -DSQLITE_MAX_EXPR_DEPTH to run " 000707 puts stderr "tests sqllimits1-9.X" 000708 } else { 000709 do_test sqllimits1-9.1 { 000710 set max $::SQLITE_MAX_EXPR_DEPTH 000711 set expr "(1 [string repeat {AND 1 } $max])" 000712 catchsql [subst { 000713 SELECT $expr 000714 }] 000715 } "1 {Expression tree is too large (maximum depth $::SQLITE_MAX_EXPR_DEPTH)}" 000716 000717 if 0 { 000718 # Attempting to beat the expression depth limit using nested SELECT 000719 # queries causes a parser stack overflow. 000720 do_test sqllimits1-9.2 { 000721 set max $::SQLITE_MAX_EXPR_DEPTH 000722 set expr "SELECT 1" 000723 for {set i 0} {$i <= $max} {incr i} { 000724 set expr "SELECT ($expr)" 000725 } 000726 catchsql [subst { $expr }] 000727 } "1 {parser stack overflow}" 000728 000729 do_test sqllimits1-9.3 { 000730 execsql { 000731 PRAGMA max_page_count = 1000000; -- 1 GB 000732 CREATE TABLE v0(a); 000733 INSERT INTO v0 VALUES(1); 000734 } 000735 db transaction { 000736 for {set i 1} {$i < 200} {incr i} { 000737 set expr "(a [string repeat {AND 1 } 50]) AS a" 000738 execsql [subst { 000739 CREATE VIEW v${i} AS SELECT $expr FROM v[expr {$i-1}] 000740 }] 000741 } 000742 } 000743 } {} 000744 000745 do_test sqllimits1-9.4 { 000746 catchsql { 000747 SELECT a FROM v199 000748 } 000749 } "1 {Expression tree is too large (maximum depth $::SQLITE_MAX_EXPR_DEPTH)}" 000750 } 000751 } 000752 000753 #-------------------------------------------------------------------- 000754 # Test cases sqllimits1-10.* test that the SQLITE_MAX_VDBE_OP 000755 # limit works as expected. The limit refers to the number of opcodes 000756 # in a single VDBE program. 000757 # 000758 # TODO 000759 000760 #-------------------------------------------------------------------- 000761 # Test the SQLITE_LIMIT_FUNCTION_ARG limit works. Test case names 000762 # match the pattern "sqllimits1-11.*". 000763 # 000764 # EVIDENCE-OF: R-59001-45278 SQLITE_LIMIT_FUNCTION_ARG The maximum 000765 # number of arguments on a function. 000766 # 000767 for {set max 5} {$max<=$SQLITE_MAX_FUNCTION_ARG} {incr max} { 000768 do_test sqllimits1-11.$max.1 { 000769 set vals [list] 000770 sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG $::max 000771 for {set i 0} {$i < $::max} {incr i} { 000772 lappend vals $i 000773 } 000774 catchsql "SELECT max([join $vals ,])" 000775 } "0 [expr {$::max - 1}]" 000776 do_test sqllimits1-11.$max.2 { 000777 set vals [list] 000778 for {set i 0} {$i <= $::max} {incr i} { 000779 lappend vals $i 000780 } 000781 catchsql "SELECT max([join $vals ,])" 000782 } {1 {too many arguments on function max}} 000783 000784 # Test that it is SQLite, and not the implementation of the 000785 # user function that is throwing the error. 000786 proc myfunc {args} {error "I don't like to be called!"} 000787 do_test sqllimits1-11.$max.2 { 000788 db function myfunc myfunc 000789 set vals [list] 000790 for {set i 0} {$i <= $::max} {incr i} { 000791 lappend vals $i 000792 } 000793 catchsql "SELECT myfunc([join $vals ,])" 000794 } {1 {too many arguments on function myfunc}} 000795 } 000796 000797 #-------------------------------------------------------------------- 000798 # Test cases sqllimits1-12.*: Test the SQLITE_MAX_ATTACHED limit. 000799 # 000800 # EVIDENCE-OF: R-41778-26203 SQLITE_LIMIT_ATTACHED The maximum number of 000801 # attached databases. 000802 # 000803 ifcapable attach { 000804 do_test sqllimits1-12.1 { 000805 set max $::SQLITE_MAX_ATTACHED 000806 for {set i 0} {$i < ($max)} {incr i} { 000807 forcedelete test${i}.db test${i}.db-journal 000808 } 000809 for {set i 0} {$i < ($max)} {incr i} { 000810 execsql "ATTACH 'test${i}.db' AS aux${i}" 000811 } 000812 catchsql "ATTACH 'test${i}.db' AS aux${i}" 000813 } "1 {too many attached databases - max $::SQLITE_MAX_ATTACHED}" 000814 do_test sqllimits1-12.2 { 000815 set max $::SQLITE_MAX_ATTACHED 000816 for {set i 0} {$i < ($max)} {incr i} { 000817 execsql "DETACH aux${i}" 000818 } 000819 } {} 000820 } 000821 000822 #-------------------------------------------------------------------- 000823 # Test cases sqllimits1-13.*: Check that the SQLITE_MAX_VARIABLE_NUMBER 000824 # limit works. 000825 # 000826 # EVIDENCE-OF: R-42363-29104 SQLITE_LIMIT_VARIABLE_NUMBER The maximum 000827 # index number of any parameter in an SQL statement. 000828 # 000829 do_test sqllimits1-13.1 { 000830 set max $::SQLITE_MAX_VARIABLE_NUMBER 000831 catchsql "SELECT ?[expr {$max+1}] FROM t1" 000832 } "1 {variable number must be between ?1 and ?$::SQLITE_MAX_VARIABLE_NUMBER}" 000833 do_test sqllimits1-13.2 { 000834 set max $::SQLITE_MAX_VARIABLE_NUMBER 000835 set vals [list] 000836 for {set i 0} {$i < ($max+3)} {incr i} { 000837 lappend vals ? 000838 } 000839 catchsql "SELECT [join $vals ,] FROM t1" 000840 } "1 {too many SQL variables}" 000841 000842 000843 #-------------------------------------------------------------------- 000844 # Test cases sqllimits1-15.* verify that the 000845 # SQLITE_MAX_LIKE_PATTERN_LENGTH limit is enforced. This limit only 000846 # applies to the built-in LIKE operator, supplying an external 000847 # implementation by overriding the like() scalar function bypasses 000848 # this limitation. 000849 # 000850 # EVIDENCE-OF: R-12940-37052 SQLITE_LIMIT_LIKE_PATTERN_LENGTH The 000851 # maximum length of the pattern argument to the LIKE or GLOB operators. 000852 # 000853 # These tests check that the limit is not incorrectly applied to 000854 # the left-hand-side of the LIKE operator (the string being tested 000855 # against the pattern). 000856 # 000857 set SQLITE_LIMIT_LIKE_PATTERN 1000 000858 sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH $SQLITE_LIMIT_LIKE_PATTERN 000859 do_test sqllimits1-15.1 { 000860 set max $::SQLITE_LIMIT_LIKE_PATTERN 000861 set ::pattern [string repeat "A%" [expr $max/2]] 000862 set ::string [string repeat "A" [expr {$max*2}]] 000863 execsql { 000864 SELECT $::string LIKE $::pattern; 000865 } 000866 } {1} 000867 do_test sqllimits1-15.2 { 000868 set max $::SQLITE_LIMIT_LIKE_PATTERN 000869 set ::pattern [string repeat "A%" [expr {($max/2) + 1}]] 000870 set ::string [string repeat "A" [expr {$max*2}]] 000871 catchsql { 000872 SELECT $::string LIKE $::pattern; 000873 } 000874 } {1 {LIKE or GLOB pattern too complex}} 000875 000876 #-------------------------------------------------------------------- 000877 # This test case doesn't really belong with the other limits tests. 000878 # It is in this file because it is taxing to run, like the limits tests. 000879 # 000880 # Update for 3.37.0: strftime() used to allocate a large static buffer 000881 # into which it would write its result. With that implementation, the 000882 # following would trigger an SQLITE_TOOBIG error. But strftime() now 000883 # uses the StrAccum functions, causing this test to fail. 000884 # 000885 #do_test sqllimits1-16.1 { 000886 # set ::N [expr int(([expr pow(2,32)]/50) + 1)] 000887 # expr (($::N*50) & 0xffffffff)<55 000888 #} {1} 000889 #do_test sqllimits1-16.2 { 000890 # set ::format "[string repeat A 60][string repeat "%J" $::N]" 000891 # catchsql { 000892 # SELECT strftime($::format, 1); 000893 # } 000894 #} {1 {string or blob too big}} 000895 000896 do_catchsql_test sqllimits1.17.0 { 000897 SELECT *,*,*,*,*,*,*,* FROM ( 000898 SELECT *,*,*,*,*,*,*,* FROM ( 000899 SELECT *,*,*,*,*,*,*,* FROM ( 000900 SELECT *,*,*,*,*,*,*,* FROM ( 000901 SELECT *,*,*,*,*,*,*,* FROM ( 000902 SELECT 1,2,3,4,5,6,7,8,9,10 000903 ) 000904 )))) 000905 } "1 {too many columns in result set}" 000906 000907 000908 foreach {key value} [array get saved] { 000909 catch {set $key $value} 000910 } 000911 000912 #------------------------------------------------------------------------- 000913 # At one point the following caused an assert() to fail. 000914 # 000915 sqlite3_limit db SQLITE_LIMIT_LENGTH 10000 000916 set nm [string repeat x 10000] 000917 do_catchsql_test sqllimits1-17.1 " 000918 CREATE TABLE $nm (x PRIMARY KEY) 000919 " {1 {string or blob too big}} 000920 000921 #------------------------------------------------------------------------- 000922 # 000923 sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT 10 000924 do_catchsql_test sqllimits1-18.1 { 000925 CREATE TABLE b1(x); 000926 INSERT INTO b1 VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); 000927 } {0 {}} 000928 000929 do_catchsql_test sqllimits1-18.2 { 000930 INSERT INTO b1 VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9), (10) 000931 UNION VALUES(11); 000932 } {0 {}} 000933 000934 #------------------------------------------------------------------------- 000935 # 000936 reset_db 000937 ifcapable utf16 { 000938 do_execsql_test 19.0 { 000939 PRAGMA encoding = 'utf16'; 000940 } 000941 set bigstr [string repeat abcdefghij 5000] 000942 set bigstr16 [encoding convertto unicode $bigstr] 000943 000944 do_test 19.1 { 000945 string length $bigstr16 000946 } {100000} 000947 000948 do_test 19.2 { 000949 set ::stmt [sqlite3_prepare db "SELECT length( ? )" -1 TAIL] 000950 sqlite3_bind_text16 $::stmt 1 $bigstr16 100000 000951 sqlite3_step $::stmt 000952 set val [sqlite3_column_int $::stmt 0] 000953 sqlite3_finalize $::stmt 000954 set val 000955 } {50000} 000956 000957 sqlite3_limit db SQLITE_LIMIT_LENGTH 100000 000958 000959 do_test 19.3 { 000960 set ::stmt [sqlite3_prepare db "SELECT length( ? )" -1 TAIL] 000961 sqlite3_bind_text16 $::stmt 1 $bigstr16 100000 000962 sqlite3_step $::stmt 000963 set val [sqlite3_column_int $::stmt 0] 000964 sqlite3_finalize $::stmt 000965 set val 000966 } {50000} 000967 000968 sqlite3_limit db SQLITE_LIMIT_LENGTH 99999 000969 000970 do_test 19.4 { 000971 set ::stmt [sqlite3_prepare db "SELECT length( ? )" -1 TAIL] 000972 list [catch { sqlite3_bind_text16 $::stmt 1 $bigstr16 100000 } msg] $msg 000973 } {1 SQLITE_TOOBIG} 000974 sqlite3_finalize $::stmt 000975 000976 sqlite3_limit db SQLITE_LIMIT_LENGTH 100000 000977 000978 do_test 19.5 { 000979 set ::stmt [sqlite3_prepare db "SELECT length( ? )" -1 TAIL] 000980 list [catch { sqlite3_bind_text16 $::stmt 1 $bigstr16 100002 } msg] $msg 000981 } {1 SQLITE_TOOBIG} 000982 sqlite3_finalize $::stmt 000983 } 000984 000985 finish_test