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>