zeroblob.test 5.9 KB

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