1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/zeroblob.test Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,230 @@
1.4 +# 2007 May 02
1.5 +#
1.6 +# The author disclaims copyright to this source code. In place of
1.7 +# a legal notice, here is a blessing:
1.8 +#
1.9 +# May you do good and not evil.
1.10 +# May you find forgiveness for yourself and forgive others.
1.11 +# May you share freely, never taking more than you give.
1.12 +#
1.13 +#***********************************************************************
1.14 +# This file implements regression tests for SQLite library. The
1.15 +# focus of this file is testing of the zero-filled blob functionality
1.16 +# including the sqlite3_bind_zeroblob(), sqlite3_result_zeroblob(),
1.17 +# and the built-in zeroblob() SQL function.
1.18 +#
1.19 +# $Id: zeroblob.test,v 1.13 2008/06/13 18:24:28 drh Exp $
1.20 +
1.21 +set testdir [file dirname $argv0]
1.22 +source $testdir/tester.tcl
1.23 +
1.24 +ifcapable !incrblob {
1.25 + finish_test
1.26 + return
1.27 +}
1.28 +
1.29 +# When zeroblob() is used for the last field of a column, then the
1.30 +# content of the zeroblob is never instantiated on the VDBE stack.
1.31 +# But it does get inserted into the database correctly.
1.32 +#
1.33 +db eval {PRAGMA cache_size=10}
1.34 +sqlite3_memory_highwater 1
1.35 +unset -nocomplain memused
1.36 +set memused [sqlite3_memory_used]
1.37 +do_test zeroblob-1.1 {
1.38 + execsql {
1.39 + CREATE TABLE t1(a,b,c,d);
1.40 + }
1.41 + set ::sqlite3_max_blobsize 0
1.42 + execsql {
1.43 + INSERT INTO t1 VALUES(2,3,4,zeroblob(1000000));
1.44 + }
1.45 + set ::sqlite3_max_blobsize
1.46 +} {10}
1.47 +do_test zeroblob-1.1.1 {
1.48 + expr {[sqlite3_memory_highwater]<$::memused+25000}
1.49 +} {1}
1.50 +do_test zeroblob-1.2 {
1.51 + execsql {
1.52 + SELECT length(d) FROM t1
1.53 + }
1.54 +} {1000000}
1.55 +
1.56 +# If a non-NULL column follows the zeroblob, then the content of
1.57 +# the zeroblob must be instantiated.
1.58 +#
1.59 +do_test zeroblob-1.3 {
1.60 + set ::sqlite3_max_blobsize 0
1.61 + execsql {
1.62 + INSERT INTO t1 VALUES(3,4,zeroblob(10000),5);
1.63 + }
1.64 + set ::sqlite3_max_blobsize
1.65 +} {10010}
1.66 +do_test zeroblob-1.4 {
1.67 + execsql {
1.68 + SELECT length(c), length(d) FROM t1
1.69 + }
1.70 +} {1 1000000 10000 1}
1.71 +
1.72 +# Multiple zeroblobs can appear at the end of record. No instantiation
1.73 +# of the blob content occurs on the stack.
1.74 +#
1.75 +do_test zeroblob-1.5 {
1.76 + set ::sqlite3_max_blobsize 0
1.77 + execsql {
1.78 + INSERT INTO t1 VALUES(4,5,zeroblob(10000),zeroblob(10000));
1.79 + }
1.80 + set ::sqlite3_max_blobsize
1.81 +} {11}
1.82 +do_test zeroblob-1.6 {
1.83 + execsql {
1.84 + SELECT length(c), length(d) FROM t1
1.85 + }
1.86 +} {1 1000000 10000 1 10000 10000}
1.87 +
1.88 +# NULLs can follow the zeroblob() or be intermixed with zeroblobs and
1.89 +# no instantiation of the zeroblobs occurs on the stack.
1.90 +#
1.91 +do_test zeroblob-1.7 {
1.92 + set ::sqlite3_max_blobsize 0
1.93 + execsql {
1.94 + INSERT INTO t1 VALUES(5,zeroblob(10000),NULL,zeroblob(10000));
1.95 + }
1.96 + set ::sqlite3_max_blobsize
1.97 +} {10}
1.98 +do_test zeroblob-1.8 {
1.99 + execsql {
1.100 + SELECT length(b), length(d) FROM t1 WHERE a=5
1.101 + }
1.102 +} {10000 10000}
1.103 +
1.104 +# Comparisons against zeroblobs work.
1.105 +#
1.106 +do_test zeroblob-2.1 {
1.107 + execsql {
1.108 + SELECT a FROM t1 WHERE b=zeroblob(10000)
1.109 + }
1.110 +} {5}
1.111 +
1.112 +# Comparisons against zeroblobs work even when indexed.
1.113 +#
1.114 +do_test zeroblob-2.2 {
1.115 + execsql {
1.116 + CREATE INDEX i1_1 ON t1(b);
1.117 + SELECT a FROM t1 WHERE b=zeroblob(10000);
1.118 + }
1.119 +} {5}
1.120 +
1.121 +# DISTINCT works for zeroblobs
1.122 +#
1.123 +ifcapable bloblit&&subquery&&compound {
1.124 + do_test zeroblob-3.1 {
1.125 + execsql {
1.126 + SELECT count(DISTINCT a) FROM (
1.127 + SELECT x'00000000000000000000' AS a
1.128 + UNION ALL
1.129 + SELECT zeroblob(10) AS a
1.130 + )
1.131 + }
1.132 + } {1}
1.133 +}
1.134 +
1.135 +# Concatentation works with zeroblob
1.136 +#
1.137 +ifcapable bloblit {
1.138 + do_test zeroblob-4.1 {
1.139 + execsql {
1.140 + SELECT hex(zeroblob(2) || x'61')
1.141 + }
1.142 + } {000061}
1.143 +}
1.144 +
1.145 +# Check various CAST(...) operations on zeroblob.
1.146 +#
1.147 +do_test zeroblob-5.1 {
1.148 + execsql {
1.149 + SELECT CAST (zeroblob(100) AS REAL);
1.150 + }
1.151 +} {0.0}
1.152 +do_test zeroblob-5.2 {
1.153 + execsql {
1.154 + SELECT CAST (zeroblob(100) AS INTEGER);
1.155 + }
1.156 +} {0}
1.157 +do_test zeroblob-5.3 {
1.158 + execsql {
1.159 + SELECT CAST (zeroblob(100) AS TEXT);
1.160 + }
1.161 +} {{}}
1.162 +do_test zeroblob-5.4 {
1.163 + execsql {
1.164 + SELECT CAST(zeroblob(100) AS BLOB);
1.165 + }
1.166 +} [execsql {SELECT zeroblob(100)}]
1.167 +
1.168 +
1.169 +# Check for malicious use of zeroblob. Make sure nothing crashes.
1.170 +#
1.171 +do_test zeroblob-6.1.1 {
1.172 + execsql {select zeroblob(-1)}
1.173 +} {{}}
1.174 +do_test zeroblob-6.1.2 {
1.175 + execsql {select zeroblob(-10)}
1.176 +} {{}}
1.177 +do_test zeroblob-6.1.3 {
1.178 + execsql {select zeroblob(-100)}
1.179 +} {{}}
1.180 +do_test zeroblob-6.2 {
1.181 + execsql {select length(zeroblob(-1))}
1.182 +} {0}
1.183 +do_test zeroblob-6.3 {
1.184 + execsql {select zeroblob(-1)|1}
1.185 +} {1}
1.186 +do_test zeroblob-6.4 {
1.187 + catchsql {select length(zeroblob(2147483648))}
1.188 +} {1 {string or blob too big}}
1.189 +do_test zeroblob-6.5 {
1.190 + catchsql {select zeroblob(2147483648)}
1.191 +} {1 {string or blob too big}}
1.192 +do_test zeroblob-6.6 {
1.193 + execsql {select hex(zeroblob(-1))}
1.194 +} {{}}
1.195 +do_test zeroblob-6.7 {
1.196 + execsql {select typeof(zeroblob(-1))}
1.197 +} {blob}
1.198 +
1.199 +# Test bind_zeroblob()
1.200 +#
1.201 +sqlite3_memory_highwater 1
1.202 +unset -nocomplain memused
1.203 +set memused [sqlite3_memory_used]
1.204 +do_test zeroblob-7.1 {
1.205 + set ::STMT [sqlite3_prepare $::DB "SELECT length(?)" -1 DUMMY]
1.206 + set ::sqlite3_max_blobsize 0
1.207 + sqlite3_bind_zeroblob $::STMT 1 450000
1.208 + sqlite3_step $::STMT
1.209 +} {SQLITE_ROW}
1.210 +do_test zeroblob-7.2 {
1.211 + sqlite3_column_int $::STMT 0
1.212 +} {450000}
1.213 +do_test zeroblob-7.3 {
1.214 + sqlite3_finalize $::STMT
1.215 +} {SQLITE_OK}
1.216 +do_test zeroblob-7.4 {
1.217 + set ::sqlite3_max_blobsize
1.218 +} {0}
1.219 +do_test zeroblob-7.5 {
1.220 + expr {[sqlite3_memory_highwater]<$::memused+10000}
1.221 +} {1}
1.222 +
1.223 +# Test that MakeRecord can handle a value with some real content
1.224 +# and a zero-blob tail.
1.225 +#
1.226 +do_test zeroblob-8.1 {
1.227 + llength [execsql {
1.228 + SELECT 'hello' AS a, zeroblob(10) as b from t1 ORDER BY a, b;
1.229 + }]
1.230 +} {8}
1.231 +
1.232 +
1.233 +finish_test