📄 sqllimits1.test
字号:
# 2007 May 8## The author disclaims copyright to this source code. In place of# a legal notice, here is a blessing:## May you do good and not evil.# May you find forgiveness for yourself and forgive others.# May you share freely, never taking more than you give.##***********************************************************************## This file contains tests to verify that the limits defined in# sqlite source file limits.h are enforced.## $Id: sqllimits1.test,v 1.31 2008/07/15 00:27:35 drh Exp $set testdir [file dirname $argv0]source $testdir/tester.tcl# Verify that the default per-connection limits are the same as# the compile-time hard limits.#sqlite3 db2 :memory:do_test sqllimits1-1.1 { sqlite3_limit db SQLITE_LIMIT_LENGTH -1} $SQLITE_MAX_LENGTHdo_test sqllimits1-1.2 { sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1} $SQLITE_MAX_SQL_LENGTHdo_test sqllimits1-1.3 { sqlite3_limit db SQLITE_LIMIT_COLUMN -1} $SQLITE_MAX_COLUMNdo_test sqllimits1-1.4 { sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1} $SQLITE_MAX_EXPR_DEPTHdo_test sqllimits1-1.5 { sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1} $SQLITE_MAX_COMPOUND_SELECTdo_test sqllimits1-1.6 { sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1} $SQLITE_MAX_VDBE_OPdo_test sqllimits1-1.7 { sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1} $SQLITE_MAX_FUNCTION_ARGdo_test sqllimits1-1.8 { sqlite3_limit db SQLITE_LIMIT_ATTACHED -1} $SQLITE_MAX_ATTACHEDdo_test sqllimits1-1.9 { sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1} $SQLITE_MAX_LIKE_PATTERN_LENGTHdo_test sqllimits1-1.10 { sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1} $SQLITE_MAX_VARIABLE_NUMBER# Limit parameters out of range.#do_test sqllimits1-1.20 { sqlite3_limit db SQLITE_LIMIT_TOOSMALL 123} {-1}do_test sqllimits1-1.21 { sqlite3_limit db SQLITE_LIMIT_TOOSMALL 123} {-1}do_test sqllimits1-1.22 { sqlite3_limit db SQLITE_LIMIT_TOOBIG 123} {-1}do_test sqllimits1-1.23 { sqlite3_limit db SQLITE_LIMIT_TOOBIG 123} {-1}# Decrease all limits by half. Verify that the new limits take.#if {$SQLITE_MAX_LENGTH>=2} { do_test sqllimits1-2.1.1 { sqlite3_limit db SQLITE_LIMIT_LENGTH \ [expr {$::SQLITE_MAX_LENGTH/2}] } $SQLITE_MAX_LENGTH do_test sqllimits1-2.1.2 { sqlite3_limit db SQLITE_LIMIT_LENGTH -1 } [expr {$SQLITE_MAX_LENGTH/2}]}if {$SQLITE_MAX_SQL_LENGTH>=2} { do_test sqllimits1-2.2.1 { sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH \ [expr {$::SQLITE_MAX_SQL_LENGTH/2}] } $SQLITE_MAX_SQL_LENGTH do_test sqllimits1-2.2.2 { sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1 } [expr {$SQLITE_MAX_SQL_LENGTH/2}]}if {$SQLITE_MAX_COLUMN>=2} { do_test sqllimits1-2.3.1 { sqlite3_limit db SQLITE_LIMIT_COLUMN \ [expr {$::SQLITE_MAX_COLUMN/2}] } $SQLITE_MAX_COLUMN do_test sqllimits1-2.3.2 { sqlite3_limit db SQLITE_LIMIT_COLUMN -1 } [expr {$SQLITE_MAX_COLUMN/2}]}if {$SQLITE_MAX_EXPR_DEPTH>=2} { do_test sqllimits1-2.4.1 { sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH \ [expr {$::SQLITE_MAX_EXPR_DEPTH/2}] } $SQLITE_MAX_EXPR_DEPTH do_test sqllimits1-2.4.2 { sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1 } [expr {$SQLITE_MAX_EXPR_DEPTH/2}]}if {$SQLITE_MAX_COMPOUND_SELECT>=2} { do_test sqllimits1-2.5.1 { sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT \ [expr {$::SQLITE_MAX_COMPOUND_SELECT/2}] } $SQLITE_MAX_COMPOUND_SELECT do_test sqllimits1-2.5.2 { sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1 } [expr {$SQLITE_MAX_COMPOUND_SELECT/2}]}if {$SQLITE_MAX_VDBE_OP>=2} { do_test sqllimits1-2.6.1 { sqlite3_limit db SQLITE_LIMIT_VDBE_OP \ [expr {$::SQLITE_MAX_VDBE_OP/2}] } $SQLITE_MAX_VDBE_OP do_test sqllimits1-2.6.2 { sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1 } [expr {$SQLITE_MAX_VDBE_OP/2}]}if {$SQLITE_MAX_FUNCTION_ARG>=2} { do_test sqllimits1-2.7.1 { sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG \ [expr {$::SQLITE_MAX_FUNCTION_ARG/2}] } $SQLITE_MAX_FUNCTION_ARG do_test sqllimits1-2.7.2 { sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1 } [expr {$SQLITE_MAX_FUNCTION_ARG/2}]}if {$SQLITE_MAX_ATTACHED>=2} { do_test sqllimits1-2.8.1 { sqlite3_limit db SQLITE_LIMIT_ATTACHED \ [expr {$::SQLITE_MAX_ATTACHED/2}] } $SQLITE_MAX_ATTACHED do_test sqllimits1-2.8.2 { sqlite3_limit db SQLITE_LIMIT_ATTACHED -1 } [expr {$SQLITE_MAX_ATTACHED/2}]}if {$SQLITE_MAX_LIKE_PATTERN_LENGTH>=2} { do_test sqllimits1-2.9.1 { sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH \ [expr {$::SQLITE_MAX_LIKE_PATTERN_LENGTH/2}] } $SQLITE_MAX_LIKE_PATTERN_LENGTH do_test sqllimits1-2.9.2 { sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1 } [expr {$SQLITE_MAX_LIKE_PATTERN_LENGTH/2}]}if {$SQLITE_MAX_VARIABLE_NUMBER>=2} { do_test sqllimits1-2.10.1 { sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER \ [expr {$::SQLITE_MAX_VARIABLE_NUMBER/2}] } $SQLITE_MAX_VARIABLE_NUMBER do_test sqllimits1-2.10.2 { sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1 } [expr {$SQLITE_MAX_VARIABLE_NUMBER/2}]}# In a separate database connection, verify that the limits are unchanged.#do_test sqllimits1-3.1 { sqlite3_limit db2 SQLITE_LIMIT_LENGTH -1} $SQLITE_MAX_LENGTHdo_test sqllimits1-3.2 { sqlite3_limit db2 SQLITE_LIMIT_SQL_LENGTH -1} $SQLITE_MAX_SQL_LENGTHdo_test sqllimits1-3.3 { sqlite3_limit db2 SQLITE_LIMIT_COLUMN -1} $SQLITE_MAX_COLUMNdo_test sqllimits1-3.4 { sqlite3_limit db2 SQLITE_LIMIT_EXPR_DEPTH -1} $SQLITE_MAX_EXPR_DEPTHdo_test sqllimits1-3.5 { sqlite3_limit db2 SQLITE_LIMIT_COMPOUND_SELECT -1} $SQLITE_MAX_COMPOUND_SELECTdo_test sqllimits1-3.6 { sqlite3_limit db2 SQLITE_LIMIT_VDBE_OP -1} $SQLITE_MAX_VDBE_OPdo_test sqllimits1-3.7 { sqlite3_limit db2 SQLITE_LIMIT_FUNCTION_ARG -1} $SQLITE_MAX_FUNCTION_ARGdo_test sqllimits1-3.8 { sqlite3_limit db2 SQLITE_LIMIT_ATTACHED -1} $SQLITE_MAX_ATTACHEDdo_test sqllimits1-3.9 { sqlite3_limit db2 SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1} $SQLITE_MAX_LIKE_PATTERN_LENGTHdo_test sqllimits1-3.10 { sqlite3_limit db2 SQLITE_LIMIT_VARIABLE_NUMBER -1} $SQLITE_MAX_VARIABLE_NUMBERdb2 close# Attempt to set all limits to the maximum 32-bit integer. Verify# that the limit does not exceed the compile-time upper bound.#do_test sqllimits1-4.1.1 { sqlite3_limit db SQLITE_LIMIT_LENGTH 0x7fffffff sqlite3_limit db SQLITE_LIMIT_LENGTH -1} $SQLITE_MAX_LENGTHdo_test sqllimits1-4.2.1 { sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffff sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1} $SQLITE_MAX_SQL_LENGTHdo_test sqllimits1-4.3.1 { sqlite3_limit db SQLITE_LIMIT_COLUMN 0x7fffffff sqlite3_limit db SQLITE_LIMIT_COLUMN -1} $SQLITE_MAX_COLUMNdo_test sqllimits1-4.4.1 { sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH 0x7fffffff sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1} $SQLITE_MAX_EXPR_DEPTHdo_test sqllimits1-4.5.1 { sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT 0x7fffffff sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1} $SQLITE_MAX_COMPOUND_SELECTdo_test sqllimits1-4.6.1 { sqlite3_limit db SQLITE_LIMIT_VDBE_OP 0x7fffffff sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1} $SQLITE_MAX_VDBE_OPdo_test sqllimits1-4.7.1 { sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG 0x7fffffff sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1} $SQLITE_MAX_FUNCTION_ARGdo_test sqllimits1-4.8.1 { sqlite3_limit db SQLITE_LIMIT_ATTACHED 0x7fffffff sqlite3_limit db SQLITE_LIMIT_ATTACHED -1} $SQLITE_MAX_ATTACHEDdo_test sqllimits1-4.9.1 { sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH 0x7fffffff sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1} $SQLITE_MAX_LIKE_PATTERN_LENGTHdo_test sqllimits1-4.10.1 { sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER 0x7fffffff sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1} $SQLITE_MAX_VARIABLE_NUMBER#--------------------------------------------------------------------# Test cases sqllimits1-5.* test that the SQLITE_MAX_LENGTH limit# is enforced.#db closesqlite3 db test.dbset LARGESIZE 99999set SQLITE_LIMIT_LENGTH 100000sqlite3_limit db SQLITE_LIMIT_LENGTH $SQLITE_LIMIT_LENGTHdo_test sqllimits1-5.1.1 { catchsql { SELECT randomblob(2147483647) }} {1 {string or blob too big}}do_test sqllimits1-5.1.2 { catchsql { SELECT zeroblob(2147483647) }} {1 {string or blob too big}}do_test sqllimits1-5.2 { catchsql { SELECT LENGTH(randomblob($::LARGESIZE)) }} [list 0 $LARGESIZE]do_test sqllimits1-5.3 { catchsql { SELECT quote(randomblob($::LARGESIZE)) }} {1 {string or blob too big}}do_test sqllimits1-5.4 { catchsql { SELECT LENGTH(zeroblob($::LARGESIZE)) }} [list 0 $LARGESIZE]do_test sqllimits1-5.5 { catchsql { SELECT quote(zeroblob($::LARGESIZE)) }} {1 {string or blob too big}}do_test sqllimits1-5.6 { catchsql { SELECT zeroblob(-1) }} {0 {{}}}do_test sqllimits1-5.9 { set ::str [string repeat A 65537] set ::rep [string repeat B 65537] catchsql { SELECT replace($::str, 'A', $::rep) }} {1 {string or blob too big}}do_test sqllimits1-5.10 { set ::str [string repeat %J 2100] catchsql { SELECT strftime($::str, '2003-10-31') }} {1 {string or blob too big}}do_test sqllimits1-5.11 { set ::str1 [string repeat A [expr {$SQLITE_LIMIT_LENGTH - 10}]] set ::str2 [string repeat B [expr {$SQLITE_LIMIT_LENGTH - 10}]] catchsql { SELECT $::str1 || $::str2 }} {1 {string or blob too big}}do_test sqllimits1-5.12 { set ::str1 [string repeat ' [expr {$SQLITE_LIMIT_LENGTH - 10}]] catchsql { SELECT quote($::str1) }} {1 {string or blob too big}}do_test sqllimits1-5.13 { set ::str1 [string repeat ' [expr {$SQLITE_LIMIT_LENGTH - 10}]] catchsql { SELECT hex($::str1) }} {1 {string or blob too big}}do_test sqllimits1-5.14.1 { set ::STMT [sqlite3_prepare db "SELECT ?" -1 TAIL] sqlite3_bind_zeroblob $::STMT 1 [expr {$SQLITE_LIMIT_LENGTH + 1}]} {}do_test sqllimits1-5.14.2 { sqlite3_step $::STMT } {SQLITE_ERROR}do_test sqllimits1-5.14.3 { sqlite3_reset $::STMT } {SQLITE_TOOBIG}do_test sqllimits1-5.14.4 { set np1 [expr {$SQLITE_LIMIT_LENGTH + 1}] set ::str1 [string repeat A $np1] catch {sqlite3_bind_text $::STMT 1 $::str1 -1} res set res} {SQLITE_TOOBIG}do_test sqllimits1-5.14.5 { catch {sqlite3_bind_text16 $::STMT 1 $::str1 -1} res set res} {SQLITE_TOOBIG}do_test sqllimits1-5.14.6 { catch {sqlite3_bind_text $::STMT 1 $::str1 $np1} res set res} {SQLITE_TOOBIG}do_test sqllimits1-5.14.7 { catch {sqlite3_bind_text16 $::STMT 1 $::str1 $np1} res set res} {SQLITE_TOOBIG}do_test sqllimits1-5.14.8 { set n [expr {$np1-1}] catch {sqlite3_bind_text $::STMT 1 $::str1 $n} res set res} {}do_test sqllimits1-5.14.9 { catch {sqlite3_bind_text16 $::STMT 1 $::str1 $n} res set res} {}sqlite3_finalize $::STMT do_test sqllimits1-5.15 { execsql { CREATE TABLE t4(x); INSERT INTO t4 VALUES(1); INSERT INTO t4 VALUES(2); INSERT INTO t4 SELECT 2+x FROM t4; } catchsql { SELECT group_concat(hex(randomblob(20000))) FROM t4; }} {1 {string or blob too big}}db eval {DROP TABLE t4}sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffffset strvalue [string repeat A $::SQLITE_LIMIT_LENGTH]do_test sqllimits1-5.16 { catchsql "SELECT '$strvalue'"} [list 0 $strvalue]do_test sqllimits1-5.17.1 { catchsql "SELECT 'A$strvalue'"} [list 1 {string or blob too big}]do_test sqllimits1-5.17.2 { sqlite3_limit db SQLITE_LIMIT_LENGTH 0x7fffffff catchsql {SELECT 'A' || $::strvalue}} [list 0 A$strvalue]do_test sqllimits1-5.17.3 { sqlite3_limit db SQLITE_LIMIT_LENGTH $SQLITE_LIMIT_LENGTH catchsql {SELECT 'A' || $::strvalue}} [list 1 {string or blob too big}]set blobvalue [string repeat 41 $::SQLITE_LIMIT_LENGTH]do_test sqllimits1-5.18 { catchsql "SELECT x'$blobvalue'"} [list 0 $strvalue]do_test sqllimits1-5.19 { catchsql "SELECT '41$blobvalue'"} [list 1 {string or blob too big}]unset blobvalueifcapable datetime { set strvalue [string repeat D [expr {$SQLITE_LIMIT_LENGTH-12}]] do_test sqllimits1-5.20 { catchsql {SELECT strftime('%Y ' || $::strvalue, '2008-01-02')} } [list 0 [list "2008 $strvalue"]] do_test sqllimits1-5.21 { catchsql {SELECT strftime('%Y-%m-%d ' || $::strvalue, '2008-01-02')} } {1 {string or blob too big}}}unset strvalue#--------------------------------------------------------------------# Test cases sqllimits1-6.* test that the SQLITE_MAX_SQL_LENGTH limit# is enforced.#do_test sqllimits1-6.1 { sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000 set sql "SELECT 1 WHERE 1==1" set tail " /* A comment to take up space in order to make the string\ longer without increasing the expression depth */\ AND 1 == 1" set N [expr {(50000 / [string length $tail])+1}] append sql [string repeat $tail $N] catchsql $sql} {1 {String or BLOB exceeded size limit}}do_test sqllimits1-6.3 { sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000 set sql "SELECT 1 WHERE 1==1" set tail " /* A comment to take up space in order to make the string\ longer without increasing the expression depth */\ AND 1 == 1" set N [expr {(50000 / [string length $tail])+1}] append sql [string repeat $tail $N] set nbytes [string length $sql] append sql { AND 0} set rc [catch {sqlite3_prepare db $sql $nbytes TAIL} STMT] lappend rc $STMT} {1 {(18) statement too long}}do_test sqllimits1-6.4 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -