OLD | NEW |
(Empty) | |
| 1 # 2007 April 27 |
| 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. |
| 12 # |
| 13 # The focus of the tests in this file are to verify that the |
| 14 # underlying TEXT or BLOB representation of an sqlite3_value |
| 15 # changes appropriately when APIs from the following set are |
| 16 # called: |
| 17 # |
| 18 # sqlite3_value_text() |
| 19 # sqlite3_value_text16() |
| 20 # sqlite3_value_blob() |
| 21 # sqlite3_value_bytes() |
| 22 # sqlite3_value_bytes16() |
| 23 # |
| 24 # $Id: ptrchng.test,v 1.5 2008/07/12 14:52:20 drh Exp $ |
| 25 |
| 26 set testdir [file dirname $argv0] |
| 27 source $testdir/tester.tcl |
| 28 |
| 29 ifcapable !bloblit { |
| 30 finish_test |
| 31 return |
| 32 } |
| 33 |
| 34 # Register the "pointer_change" SQL function. |
| 35 # |
| 36 sqlite3_create_function db |
| 37 |
| 38 do_test ptrchng-1.1 { |
| 39 execsql { |
| 40 CREATE TABLE t1(x INTEGER PRIMARY KEY, y BLOB); |
| 41 INSERT INTO t1 VALUES(1, 'abc'); |
| 42 INSERT INTO t1 VALUES(2, |
| 43 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234356789'); |
| 44 INSERT INTO t1 VALUES(3, x'626c6f62'); |
| 45 INSERT INTO t1 VALUES(4, |
| 46 x'000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324' |
| 47 ); |
| 48 SELECT count(*) FROM t1; |
| 49 } |
| 50 } {4} |
| 51 |
| 52 # For the short entries that fit in the Mem.zBuf[], the pointer should |
| 53 # never change regardless of what type conversions occur. |
| 54 # |
| 55 # UPDATE: No longer true, as Mem.zBuf[] has been removed. |
| 56 # |
| 57 do_test ptrchng-2.1 { |
| 58 execsql { |
| 59 SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=1 |
| 60 } |
| 61 } {0} |
| 62 do_test ptrchng-2.2 { |
| 63 execsql { |
| 64 SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=1 |
| 65 } |
| 66 } {0} |
| 67 ifcapable utf16 { |
| 68 do_test ptrchng-2.3 { |
| 69 execsql { |
| 70 SELECT pointer_change(y, 'text', 'noop', 'text16') FROM t1 WHERE x=1 |
| 71 } |
| 72 } {1} |
| 73 do_test ptrchng-2.4 { |
| 74 execsql { |
| 75 SELECT pointer_change(y, 'blob', 'noop', 'text16') FROM t1 WHERE x=1 |
| 76 } |
| 77 } {1} |
| 78 do_test ptrchng-2.5 { |
| 79 execsql { |
| 80 SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 WHERE x=1 |
| 81 } |
| 82 } {0} |
| 83 do_test ptrchng-2.6 { |
| 84 execsql { |
| 85 SELECT pointer_change(y, 'text16', 'noop', 'text') FROM t1 WHERE x=1 |
| 86 } |
| 87 } {1} |
| 88 } |
| 89 do_test ptrchng-2.11 { |
| 90 execsql { |
| 91 SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=3 |
| 92 } |
| 93 } {0} |
| 94 do_test ptrchng-2.12 { |
| 95 execsql { |
| 96 SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=3 |
| 97 } |
| 98 } {0} |
| 99 ifcapable utf16 { |
| 100 do_test ptrchng-2.13 { |
| 101 execsql { |
| 102 SELECT pointer_change(y, 'text', 'noop', 'text16') FROM t1 WHERE x=3 |
| 103 } |
| 104 } {1} |
| 105 do_test ptrchng-2.14 { |
| 106 execsql { |
| 107 SELECT pointer_change(y, 'blob', 'noop', 'text16') FROM t1 WHERE x=3 |
| 108 } |
| 109 } {1} |
| 110 do_test ptrchng-2.15 { |
| 111 execsql { |
| 112 SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 WHERE x=3 |
| 113 } |
| 114 } {0} |
| 115 do_test ptrchng-2.16 { |
| 116 execsql { |
| 117 SELECT pointer_change(y, 'text16', 'noop', 'text') FROM t1 WHERE x=3 |
| 118 } |
| 119 } {1} |
| 120 } |
| 121 |
| 122 # For the long entries that do not fit in the Mem.zBuf[], the pointer |
| 123 # should change sometimes. |
| 124 # |
| 125 do_test ptrchng-3.1 { |
| 126 execsql { |
| 127 SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=2 |
| 128 } |
| 129 } {0} |
| 130 do_test ptrchng-3.2 { |
| 131 execsql { |
| 132 SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=2 |
| 133 } |
| 134 } {0} |
| 135 ifcapable utf16 { |
| 136 do_test ptrchng-3.3 { |
| 137 execsql { |
| 138 SELECT pointer_change(y, 'text', 'noop', 'text16') FROM t1 WHERE x=2 |
| 139 } |
| 140 } {1} |
| 141 do_test ptrchng-3.4 { |
| 142 execsql { |
| 143 SELECT pointer_change(y, 'blob', 'noop', 'text16') FROM t1 WHERE x=2 |
| 144 } |
| 145 } {1} |
| 146 do_test ptrchng-3.5 { |
| 147 execsql { |
| 148 SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 WHERE x=2 |
| 149 } |
| 150 } {0} |
| 151 do_test ptrchng-3.6 { |
| 152 execsql { |
| 153 SELECT pointer_change(y, 'text16', 'noop', 'text') FROM t1 WHERE x=2 |
| 154 } |
| 155 } {1} |
| 156 } |
| 157 do_test ptrchng-3.11 { |
| 158 execsql { |
| 159 SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=4 |
| 160 } |
| 161 } {0} |
| 162 do_test ptrchng-3.12 { |
| 163 execsql { |
| 164 SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=4 |
| 165 } |
| 166 } {0} |
| 167 ifcapable utf16 { |
| 168 do_test ptrchng-3.13 { |
| 169 execsql { |
| 170 SELECT pointer_change(y, 'text', 'noop', 'text16') FROM t1 WHERE x=4 |
| 171 } |
| 172 } {1} |
| 173 do_test ptrchng-3.14 { |
| 174 execsql { |
| 175 SELECT pointer_change(y, 'blob', 'noop', 'text16') FROM t1 WHERE x=4 |
| 176 } |
| 177 } {1} |
| 178 do_test ptrchng-3.15 { |
| 179 execsql { |
| 180 SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 WHERE x=4 |
| 181 } |
| 182 } {0} |
| 183 do_test ptrchng-3.16 { |
| 184 execsql { |
| 185 SELECT pointer_change(y, 'text16', 'noop', 'text') FROM t1 WHERE x=4 |
| 186 } |
| 187 } {1} |
| 188 } |
| 189 |
| 190 # A call to _bytes() should never reformat a _text() or _blob(). |
| 191 # |
| 192 do_test ptrchng-4.1 { |
| 193 execsql { |
| 194 SELECT pointer_change(y, 'text', 'bytes', 'text') FROM t1 |
| 195 } |
| 196 } {0 0 0 0} |
| 197 do_test ptrchng-4.2 { |
| 198 execsql { |
| 199 SELECT pointer_change(y, 'blob', 'bytes', 'blob') FROM t1 |
| 200 } |
| 201 } {0 0 0 0} |
| 202 |
| 203 # A call to _blob() should never trigger a reformat |
| 204 # |
| 205 do_test ptrchng-5.1 { |
| 206 execsql { |
| 207 SELECT pointer_change(y, 'text', 'bytes', 'blob') FROM t1 |
| 208 } |
| 209 } {0 0 0 0} |
| 210 ifcapable utf16 { |
| 211 do_test ptrchng-5.2 { |
| 212 execsql { |
| 213 SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 |
| 214 } |
| 215 } {0 0 0 0} |
| 216 do_test ptrchng-5.3 { |
| 217 execsql { |
| 218 SELECT pointer_change(y, 'text16', 'bytes16', 'blob') FROM t1 |
| 219 } |
| 220 } {0 0 0 0} |
| 221 } |
| 222 |
| 223 finish_test |
OLD | NEW |