Annotation of embedaddon/sqlite3/test/zeroblob.test, revision 1.1
1.1 ! misho 1: # 2007 May 02
! 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: # This file implements regression tests for SQLite library. The
! 12: # focus of this file is testing of the zero-filled blob functionality
! 13: # including the sqlite3_bind_zeroblob(), sqlite3_result_zeroblob(),
! 14: # and the built-in zeroblob() SQL function.
! 15: #
! 16: # $Id: zeroblob.test,v 1.14 2009/07/14 02:33:02 drh Exp $
! 17:
! 18: set testdir [file dirname $argv0]
! 19: source $testdir/tester.tcl
! 20:
! 21: ifcapable !incrblob {
! 22: finish_test
! 23: return
! 24: }
! 25:
! 26: # When zeroblob() is used for the last field of a column, then the
! 27: # content of the zeroblob is never instantiated on the VDBE stack.
! 28: # But it does get inserted into the database correctly.
! 29: #
! 30: db eval {PRAGMA cache_size=10}
! 31: sqlite3_memory_highwater 1
! 32: unset -nocomplain memused
! 33: set memused [sqlite3_memory_used]
! 34: do_test zeroblob-1.1 {
! 35: execsql {
! 36: CREATE TABLE t1(a,b,c,d);
! 37: }
! 38: set ::sqlite3_max_blobsize 0
! 39: execsql {
! 40: INSERT INTO t1 VALUES(2,3,4,zeroblob(1000000));
! 41: }
! 42: set ::sqlite3_max_blobsize
! 43: } {10}
! 44: do_test zeroblob-1.1.1 {
! 45: expr {[sqlite3_memory_highwater]<$::memused+25000}
! 46: } {1}
! 47: do_test zeroblob-1.2 {
! 48: execsql {
! 49: SELECT length(d) FROM t1
! 50: }
! 51: } {1000000}
! 52:
! 53: # If a non-NULL column follows the zeroblob, then the content of
! 54: # the zeroblob must be instantiated.
! 55: #
! 56: do_test zeroblob-1.3 {
! 57: set ::sqlite3_max_blobsize 0
! 58: execsql {
! 59: INSERT INTO t1 VALUES(3,4,zeroblob(10000),5);
! 60: }
! 61: set ::sqlite3_max_blobsize
! 62: } {10010}
! 63: do_test zeroblob-1.4 {
! 64: execsql {
! 65: SELECT length(c), length(d) FROM t1
! 66: }
! 67: } {1 1000000 10000 1}
! 68:
! 69: # Multiple zeroblobs can appear at the end of record. No instantiation
! 70: # of the blob content occurs on the stack.
! 71: #
! 72: do_test zeroblob-1.5 {
! 73: set ::sqlite3_max_blobsize 0
! 74: execsql {
! 75: INSERT INTO t1 VALUES(4,5,zeroblob(10000),zeroblob(10000));
! 76: }
! 77: set ::sqlite3_max_blobsize
! 78: } {11}
! 79: do_test zeroblob-1.6 {
! 80: execsql {
! 81: SELECT length(c), length(d) FROM t1
! 82: }
! 83: } {1 1000000 10000 1 10000 10000}
! 84:
! 85: # NULLs can follow the zeroblob() or be intermixed with zeroblobs and
! 86: # no instantiation of the zeroblobs occurs on the stack.
! 87: #
! 88: do_test zeroblob-1.7 {
! 89: set ::sqlite3_max_blobsize 0
! 90: execsql {
! 91: INSERT INTO t1 VALUES(5,zeroblob(10000),NULL,zeroblob(10000));
! 92: }
! 93: set ::sqlite3_max_blobsize
! 94: } {10}
! 95: do_test zeroblob-1.8 {
! 96: execsql {
! 97: SELECT length(b), length(d) FROM t1 WHERE a=5
! 98: }
! 99: } {10000 10000}
! 100:
! 101: # Comparisons against zeroblobs work.
! 102: #
! 103: do_test zeroblob-2.1 {
! 104: execsql {
! 105: SELECT a FROM t1 WHERE b=zeroblob(10000)
! 106: }
! 107: } {5}
! 108:
! 109: # Comparisons against zeroblobs work even when indexed.
! 110: #
! 111: do_test zeroblob-2.2 {
! 112: execsql {
! 113: CREATE INDEX i1_1 ON t1(b);
! 114: SELECT a FROM t1 WHERE b=zeroblob(10000);
! 115: }
! 116: } {5}
! 117:
! 118: # DISTINCT works for zeroblobs
! 119: #
! 120: ifcapable bloblit&&subquery&&compound {
! 121: do_test zeroblob-3.1 {
! 122: execsql {
! 123: SELECT count(DISTINCT a) FROM (
! 124: SELECT x'00000000000000000000' AS a
! 125: UNION ALL
! 126: SELECT zeroblob(10) AS a
! 127: )
! 128: }
! 129: } {1}
! 130: }
! 131:
! 132: # Concatentation works with zeroblob
! 133: #
! 134: ifcapable bloblit {
! 135: do_test zeroblob-4.1 {
! 136: execsql {
! 137: SELECT hex(zeroblob(2) || x'61')
! 138: }
! 139: } {000061}
! 140: }
! 141:
! 142: # Check various CAST(...) operations on zeroblob.
! 143: #
! 144: do_test zeroblob-5.1 {
! 145: execsql {
! 146: SELECT CAST (zeroblob(100) AS REAL);
! 147: }
! 148: } {0.0}
! 149: do_test zeroblob-5.2 {
! 150: execsql {
! 151: SELECT CAST (zeroblob(100) AS INTEGER);
! 152: }
! 153: } {0}
! 154: do_test zeroblob-5.3 {
! 155: execsql {
! 156: SELECT CAST (zeroblob(100) AS TEXT);
! 157: }
! 158: } {{}}
! 159: do_test zeroblob-5.4 {
! 160: execsql {
! 161: SELECT CAST(zeroblob(100) AS BLOB);
! 162: }
! 163: } [execsql {SELECT zeroblob(100)}]
! 164:
! 165:
! 166: # Check for malicious use of zeroblob. Make sure nothing crashes.
! 167: #
! 168: do_test zeroblob-6.1.1 {
! 169: execsql {select zeroblob(-1)}
! 170: } {{}}
! 171: do_test zeroblob-6.1.2 {
! 172: execsql {select zeroblob(-10)}
! 173: } {{}}
! 174: do_test zeroblob-6.1.3 {
! 175: execsql {select zeroblob(-100)}
! 176: } {{}}
! 177: do_test zeroblob-6.2 {
! 178: execsql {select length(zeroblob(-1))}
! 179: } {0}
! 180: do_test zeroblob-6.3 {
! 181: execsql {select zeroblob(-1)|1}
! 182: } {1}
! 183: do_test zeroblob-6.4 {
! 184: catchsql {select length(zeroblob(2147483648))}
! 185: } {1 {string or blob too big}}
! 186: do_test zeroblob-6.5 {
! 187: catchsql {select zeroblob(2147483648)}
! 188: } {1 {string or blob too big}}
! 189: do_test zeroblob-6.6 {
! 190: execsql {select hex(zeroblob(-1))}
! 191: } {{}}
! 192: do_test zeroblob-6.7 {
! 193: execsql {select typeof(zeroblob(-1))}
! 194: } {blob}
! 195:
! 196: # Test bind_zeroblob()
! 197: #
! 198: sqlite3_memory_highwater 1
! 199: unset -nocomplain memused
! 200: set memused [sqlite3_memory_used]
! 201: do_test zeroblob-7.1 {
! 202: set ::STMT [sqlite3_prepare $::DB "SELECT length(?)" -1 DUMMY]
! 203: set ::sqlite3_max_blobsize 0
! 204: sqlite3_bind_zeroblob $::STMT 1 450000
! 205: sqlite3_step $::STMT
! 206: } {SQLITE_ROW}
! 207: do_test zeroblob-7.2 {
! 208: sqlite3_column_int $::STMT 0
! 209: } {450000}
! 210: do_test zeroblob-7.3 {
! 211: sqlite3_finalize $::STMT
! 212: } {SQLITE_OK}
! 213: do_test zeroblob-7.4 {
! 214: set ::sqlite3_max_blobsize
! 215: } {0}
! 216: do_test zeroblob-7.5 {
! 217: expr {[sqlite3_memory_highwater]<$::memused+10000}
! 218: } {1}
! 219:
! 220: # Test that MakeRecord can handle a value with some real content
! 221: # and a zero-blob tail.
! 222: #
! 223: do_test zeroblob-8.1 {
! 224: llength [execsql {
! 225: SELECT 'hello' AS a, zeroblob(10) as b from t1 ORDER BY a, b;
! 226: }]
! 227: } {8}
! 228:
! 229:
! 230: # Ticket #3965
! 231: # zeroblobs on either size of an IN operator
! 232: #
! 233: do_test zeroblob-9.1 {
! 234: db eval {SELECT x'0000' IN (x'000000')}
! 235: } {0}
! 236: do_test zeroblob-9.2 {
! 237: db eval {SELECT x'0000' IN (x'0000')}
! 238: } {1}
! 239: do_test zeroblob-9.3 {
! 240: db eval {SELECT zeroblob(2) IN (x'000000')}
! 241: } {0}
! 242: do_test zeroblob-9.4 {
! 243: db eval {SELECT zeroblob(2) IN (x'0000')}
! 244: } {1}
! 245: do_test zeroblob-9.5 {
! 246: db eval {SELECT x'0000' IN (zeroblob(3))}
! 247: } {0}
! 248: do_test zeroblob-9.6 {
! 249: db eval {SELECT x'0000' IN (zeroblob(2))}
! 250: } {1}
! 251: do_test zeroblob-9.7 {
! 252: db eval {SELECT zeroblob(2) IN (zeroblob(3))}
! 253: } {0}
! 254: do_test zeroblob-9.8 {
! 255: db eval {SELECT zeroblob(2) IN (zeroblob(2))}
! 256: } {1}
! 257:
! 258:
! 259: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>