123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- # 2007 May 02
- #
- # 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 implements regression tests for SQLite library. The
- # focus of this file is testing of the zero-filled blob functionality
- # including the sqlite3_bind_zeroblob(), sqlite3_result_zeroblob(),
- # and the built-in zeroblob() SQL function.
- #
- # $Id: zeroblob.test,v 1.14 2009/07/14 02:33:02 drh Exp $
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- ifcapable !incrblob {
- finish_test
- return
- }
- # When zeroblob() is used for the last field of a column, then the
- # content of the zeroblob is never instantiated on the VDBE stack.
- # But it does get inserted into the database correctly.
- #
- db eval {PRAGMA cache_size=10}
- sqlite3_memory_highwater 1
- unset -nocomplain memused
- set memused [sqlite3_memory_used]
- do_test zeroblob-1.1 {
- execsql {
- CREATE TABLE t1(a,b,c,d);
- }
- set ::sqlite3_max_blobsize 0
- execsql {
- INSERT INTO t1 VALUES(2,3,4,zeroblob(1000000));
- }
- set ::sqlite3_max_blobsize
- } {10}
- do_test zeroblob-1.1.1 {
- expr {[sqlite3_memory_highwater]<$::memused+25000}
- } {1}
- do_test zeroblob-1.2 {
- execsql {
- SELECT length(d) FROM t1
- }
- } {1000000}
- # If a non-NULL column follows the zeroblob, then the content of
- # the zeroblob must be instantiated.
- #
- do_test zeroblob-1.3 {
- set ::sqlite3_max_blobsize 0
- execsql {
- INSERT INTO t1 VALUES(3,4,zeroblob(10000),5);
- }
- set ::sqlite3_max_blobsize
- } {10010}
- do_test zeroblob-1.4 {
- execsql {
- SELECT length(c), length(d) FROM t1
- }
- } {1 1000000 10000 1}
- # Multiple zeroblobs can appear at the end of record. No instantiation
- # of the blob content occurs on the stack.
- #
- do_test zeroblob-1.5 {
- set ::sqlite3_max_blobsize 0
- execsql {
- INSERT INTO t1 VALUES(4,5,zeroblob(10000),zeroblob(10000));
- }
- set ::sqlite3_max_blobsize
- } {11}
- do_test zeroblob-1.6 {
- execsql {
- SELECT length(c), length(d) FROM t1
- }
- } {1 1000000 10000 1 10000 10000}
- # NULLs can follow the zeroblob() or be intermixed with zeroblobs and
- # no instantiation of the zeroblobs occurs on the stack.
- #
- do_test zeroblob-1.7 {
- set ::sqlite3_max_blobsize 0
- execsql {
- INSERT INTO t1 VALUES(5,zeroblob(10000),NULL,zeroblob(10000));
- }
- set ::sqlite3_max_blobsize
- } {10}
- do_test zeroblob-1.8 {
- execsql {
- SELECT length(b), length(d) FROM t1 WHERE a=5
- }
- } {10000 10000}
- # Comparisons against zeroblobs work.
- #
- do_test zeroblob-2.1 {
- execsql {
- SELECT a FROM t1 WHERE b=zeroblob(10000)
- }
- } {5}
- # Comparisons against zeroblobs work even when indexed.
- #
- do_test zeroblob-2.2 {
- execsql {
- CREATE INDEX i1_1 ON t1(b);
- SELECT a FROM t1 WHERE b=zeroblob(10000);
- }
- } {5}
- # DISTINCT works for zeroblobs
- #
- ifcapable bloblit&&subquery&&compound {
- do_test zeroblob-3.1 {
- execsql {
- SELECT count(DISTINCT a) FROM (
- SELECT x'00000000000000000000' AS a
- UNION ALL
- SELECT zeroblob(10) AS a
- )
- }
- } {1}
- }
- # Concatentation works with zeroblob
- #
- ifcapable bloblit {
- do_test zeroblob-4.1 {
- execsql {
- SELECT hex(zeroblob(2) || x'61')
- }
- } {000061}
- }
- # Check various CAST(...) operations on zeroblob.
- #
- do_test zeroblob-5.1 {
- execsql {
- SELECT CAST (zeroblob(100) AS REAL);
- }
- } {0.0}
- do_test zeroblob-5.2 {
- execsql {
- SELECT CAST (zeroblob(100) AS INTEGER);
- }
- } {0}
- do_test zeroblob-5.3 {
- execsql {
- SELECT CAST (zeroblob(100) AS TEXT);
- }
- } {{}}
- do_test zeroblob-5.4 {
- execsql {
- SELECT CAST(zeroblob(100) AS BLOB);
- }
- } [execsql {SELECT zeroblob(100)}]
-
- # Check for malicious use of zeroblob. Make sure nothing crashes.
- #
- do_test zeroblob-6.1.1 {
- execsql {select zeroblob(-1)}
- } {{}}
- do_test zeroblob-6.1.2 {
- execsql {select zeroblob(-10)}
- } {{}}
- do_test zeroblob-6.1.3 {
- execsql {select zeroblob(-100)}
- } {{}}
- do_test zeroblob-6.2 {
- execsql {select length(zeroblob(-1))}
- } {0}
- do_test zeroblob-6.3 {
- execsql {select zeroblob(-1)|1}
- } {1}
- do_test zeroblob-6.4 {
- catchsql {select length(zeroblob(2147483648))}
- } {1 {string or blob too big}}
- do_test zeroblob-6.5 {
- catchsql {select zeroblob(2147483648)}
- } {1 {string or blob too big}}
- do_test zeroblob-6.6 {
- execsql {select hex(zeroblob(-1))}
- } {{}}
- do_test zeroblob-6.7 {
- execsql {select typeof(zeroblob(-1))}
- } {blob}
- # Test bind_zeroblob()
- #
- sqlite3_memory_highwater 1
- unset -nocomplain memused
- set memused [sqlite3_memory_used]
- do_test zeroblob-7.1 {
- set ::STMT [sqlite3_prepare $::DB "SELECT length(?)" -1 DUMMY]
- set ::sqlite3_max_blobsize 0
- sqlite3_bind_zeroblob $::STMT 1 450000
- sqlite3_step $::STMT
- } {SQLITE_ROW}
- do_test zeroblob-7.2 {
- sqlite3_column_int $::STMT 0
- } {450000}
- do_test zeroblob-7.3 {
- sqlite3_finalize $::STMT
- } {SQLITE_OK}
- do_test zeroblob-7.4 {
- set ::sqlite3_max_blobsize
- } {0}
- do_test zeroblob-7.5 {
- expr {[sqlite3_memory_highwater]<$::memused+10000}
- } {1}
- # Test that MakeRecord can handle a value with some real content
- # and a zero-blob tail.
- #
- do_test zeroblob-8.1 {
- llength [execsql {
- SELECT 'hello' AS a, zeroblob(10) as b from t1 ORDER BY a, b;
- }]
- } {8}
- # Ticket #3965
- # zeroblobs on either size of an IN operator
- #
- do_test zeroblob-9.1 {
- db eval {SELECT x'0000' IN (x'000000')}
- } {0}
- do_test zeroblob-9.2 {
- db eval {SELECT x'0000' IN (x'0000')}
- } {1}
- do_test zeroblob-9.3 {
- db eval {SELECT zeroblob(2) IN (x'000000')}
- } {0}
- do_test zeroblob-9.4 {
- db eval {SELECT zeroblob(2) IN (x'0000')}
- } {1}
- do_test zeroblob-9.5 {
- db eval {SELECT x'0000' IN (zeroblob(3))}
- } {0}
- do_test zeroblob-9.6 {
- db eval {SELECT x'0000' IN (zeroblob(2))}
- } {1}
- do_test zeroblob-9.7 {
- db eval {SELECT zeroblob(2) IN (zeroblob(3))}
- } {0}
- do_test zeroblob-9.8 {
- db eval {SELECT zeroblob(2) IN (zeroblob(2))}
- } {1}
- finish_test
|