| OLD | NEW |
| (Empty) |
| 1 # 2005 December 21 | |
| 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 script is descending indices. | |
| 13 # | |
| 14 # $Id: descidx1.test,v 1.10 2008/03/19 00:21:31 drh Exp $ | |
| 15 # | |
| 16 | |
| 17 set testdir [file dirname $argv0] | |
| 18 source $testdir/tester.tcl | |
| 19 | |
| 20 db eval {PRAGMA legacy_file_format=OFF} | |
| 21 | |
| 22 # This procedure sets the value of the file-format in file 'test.db' | |
| 23 # to $newval. Also, the schema cookie is incremented. | |
| 24 # | |
| 25 proc set_file_format {newval} { | |
| 26 hexio_write test.db 44 [hexio_render_int32 $newval] | |
| 27 set schemacookie [hexio_get_int [hexio_read test.db 40 4]] | |
| 28 incr schemacookie | |
| 29 hexio_write test.db 40 [hexio_render_int32 $schemacookie] | |
| 30 return {} | |
| 31 } | |
| 32 | |
| 33 # This procedure returns the value of the file-format in file 'test.db'. | |
| 34 # | |
| 35 proc get_file_format {{fname test.db}} { | |
| 36 return [hexio_get_int [hexio_read $fname 44 4]] | |
| 37 } | |
| 38 | |
| 39 | |
| 40 # Verify that the file format starts as 4. | |
| 41 # | |
| 42 do_test descidx1-1.1 { | |
| 43 execsql { | |
| 44 CREATE TABLE t1(a,b); | |
| 45 CREATE INDEX i1 ON t1(b ASC); | |
| 46 } | |
| 47 get_file_format | |
| 48 } {4} | |
| 49 do_test descidx1-1.2 { | |
| 50 execsql { | |
| 51 CREATE INDEX i2 ON t1(a DESC); | |
| 52 } | |
| 53 get_file_format | |
| 54 } {4} | |
| 55 | |
| 56 # Put some information in the table and verify that the descending | |
| 57 # index actually works. | |
| 58 # | |
| 59 do_test descidx1-2.1 { | |
| 60 execsql { | |
| 61 INSERT INTO t1 VALUES(1,1); | |
| 62 INSERT INTO t1 VALUES(2,2); | |
| 63 INSERT INTO t1 SELECT a+2, a+2 FROM t1; | |
| 64 INSERT INTO t1 SELECT a+4, a+4 FROM t1; | |
| 65 SELECT b FROM t1 WHERE a>3 AND a<7; | |
| 66 } | |
| 67 } {6 5 4} | |
| 68 do_test descidx1-2.2 { | |
| 69 execsql { | |
| 70 SELECT a FROM t1 WHERE b>3 AND b<7; | |
| 71 } | |
| 72 } {4 5 6} | |
| 73 do_test descidx1-2.3 { | |
| 74 execsql { | |
| 75 SELECT b FROM t1 WHERE a>=3 AND a<7; | |
| 76 } | |
| 77 } {6 5 4 3} | |
| 78 do_test descidx1-2.4 { | |
| 79 execsql { | |
| 80 SELECT b FROM t1 WHERE a>3 AND a<=7; | |
| 81 } | |
| 82 } {7 6 5 4} | |
| 83 do_test descidx1-2.5 { | |
| 84 execsql { | |
| 85 SELECT b FROM t1 WHERE a>=3 AND a<=7; | |
| 86 } | |
| 87 } {7 6 5 4 3} | |
| 88 do_test descidx1-2.6 { | |
| 89 execsql { | |
| 90 SELECT a FROM t1 WHERE b>=3 AND b<=7; | |
| 91 } | |
| 92 } {3 4 5 6 7} | |
| 93 | |
| 94 # This procedure executes the SQL. Then it checks to see if the OP_Sort | |
| 95 # opcode was executed. If an OP_Sort did occur, then "sort" is appended | |
| 96 # to the result. If no OP_Sort happened, then "nosort" is appended. | |
| 97 # | |
| 98 # This procedure is used to check to make sure sorting is or is not | |
| 99 # occurring as expected. | |
| 100 # | |
| 101 proc cksort {sql} { | |
| 102 set ::sqlite_sort_count 0 | |
| 103 set data [execsql $sql] | |
| 104 if {$::sqlite_sort_count} {set x sort} {set x nosort} | |
| 105 lappend data $x | |
| 106 return $data | |
| 107 } | |
| 108 | |
| 109 # Test sorting using a descending index. | |
| 110 # | |
| 111 do_test descidx1-3.1 { | |
| 112 cksort {SELECT a FROM t1 ORDER BY a} | |
| 113 } {1 2 3 4 5 6 7 8 nosort} | |
| 114 do_test descidx1-3.2 { | |
| 115 cksort {SELECT a FROM t1 ORDER BY a ASC} | |
| 116 } {1 2 3 4 5 6 7 8 nosort} | |
| 117 do_test descidx1-3.3 { | |
| 118 cksort {SELECT a FROM t1 ORDER BY a DESC} | |
| 119 } {8 7 6 5 4 3 2 1 nosort} | |
| 120 do_test descidx1-3.4 { | |
| 121 cksort {SELECT b FROM t1 ORDER BY a} | |
| 122 } {1 2 3 4 5 6 7 8 nosort} | |
| 123 do_test descidx1-3.5 { | |
| 124 cksort {SELECT b FROM t1 ORDER BY a ASC} | |
| 125 } {1 2 3 4 5 6 7 8 nosort} | |
| 126 do_test descidx1-3.6 { | |
| 127 cksort {SELECT b FROM t1 ORDER BY a DESC} | |
| 128 } {8 7 6 5 4 3 2 1 nosort} | |
| 129 do_test descidx1-3.7 { | |
| 130 cksort {SELECT a FROM t1 ORDER BY b} | |
| 131 } {1 2 3 4 5 6 7 8 nosort} | |
| 132 do_test descidx1-3.8 { | |
| 133 cksort {SELECT a FROM t1 ORDER BY b ASC} | |
| 134 } {1 2 3 4 5 6 7 8 nosort} | |
| 135 do_test descidx1-3.9 { | |
| 136 cksort {SELECT a FROM t1 ORDER BY b DESC} | |
| 137 } {8 7 6 5 4 3 2 1 nosort} | |
| 138 do_test descidx1-3.10 { | |
| 139 cksort {SELECT b FROM t1 ORDER BY b} | |
| 140 } {1 2 3 4 5 6 7 8 nosort} | |
| 141 do_test descidx1-3.11 { | |
| 142 cksort {SELECT b FROM t1 ORDER BY b ASC} | |
| 143 } {1 2 3 4 5 6 7 8 nosort} | |
| 144 do_test descidx1-3.12 { | |
| 145 cksort {SELECT b FROM t1 ORDER BY b DESC} | |
| 146 } {8 7 6 5 4 3 2 1 nosort} | |
| 147 | |
| 148 do_test descidx1-3.21 { | |
| 149 cksort {SELECT a FROM t1 WHERE a>3 AND a<8 ORDER BY a} | |
| 150 } {4 5 6 7 nosort} | |
| 151 do_test descidx1-3.22 { | |
| 152 cksort {SELECT a FROM t1 WHERE a>3 AND a<8 ORDER BY a ASC} | |
| 153 } {4 5 6 7 nosort} | |
| 154 do_test descidx1-3.23 { | |
| 155 cksort {SELECT a FROM t1 WHERE a>3 AND a<8 ORDER BY a DESC} | |
| 156 } {7 6 5 4 nosort} | |
| 157 do_test descidx1-3.24 { | |
| 158 cksort {SELECT b FROM t1 WHERE a>3 AND a<8 ORDER BY a} | |
| 159 } {4 5 6 7 nosort} | |
| 160 do_test descidx1-3.25 { | |
| 161 cksort {SELECT b FROM t1 WHERE a>3 AND a<8 ORDER BY a ASC} | |
| 162 } {4 5 6 7 nosort} | |
| 163 do_test descidx1-3.26 { | |
| 164 cksort {SELECT b FROM t1 WHERE a>3 AND a<8 ORDER BY a DESC} | |
| 165 } {7 6 5 4 nosort} | |
| 166 | |
| 167 # Create a table with indices that are descending on some terms and | |
| 168 # ascending on others. | |
| 169 # | |
| 170 ifcapable bloblit { | |
| 171 do_test descidx1-4.1 { | |
| 172 execsql { | |
| 173 CREATE TABLE t2(a INT, b TEXT, c BLOB, d REAL); | |
| 174 CREATE INDEX i3 ON t2(a ASC, b DESC, c ASC); | |
| 175 CREATE INDEX i4 ON t2(b DESC, a ASC, d DESC); | |
| 176 INSERT INTO t2 VALUES(1,'one',x'31',1.0); | |
| 177 INSERT INTO t2 VALUES(2,'two',x'3232',2.0); | |
| 178 INSERT INTO t2 VALUES(3,'three',x'333333',3.0); | |
| 179 INSERT INTO t2 VALUES(4,'four',x'34343434',4.0); | |
| 180 INSERT INTO t2 VALUES(5,'five',x'3535353535',5.0); | |
| 181 INSERT INTO t2 VALUES(6,'six',x'363636363636',6.0); | |
| 182 INSERT INTO t2 VALUES(2,'two',x'323232',2.1); | |
| 183 INSERT INTO t2 VALUES(2,'zwei',x'3232',2.2); | |
| 184 INSERT INTO t2 VALUES(2,NULL,NULL,2.3); | |
| 185 SELECT count(*) FROM t2; | |
| 186 } | |
| 187 } {9} | |
| 188 do_test descidx1-4.2 { | |
| 189 execsql { | |
| 190 SELECT d FROM t2 ORDER BY a; | |
| 191 } | |
| 192 } {1.0 2.2 2.0 2.1 2.3 3.0 4.0 5.0 6.0} | |
| 193 do_test descidx1-4.3 { | |
| 194 execsql { | |
| 195 SELECT d FROM t2 WHERE a>=2; | |
| 196 } | |
| 197 } {2.2 2.0 2.1 2.3 3.0 4.0 5.0 6.0} | |
| 198 do_test descidx1-4.4 { | |
| 199 execsql { | |
| 200 SELECT d FROM t2 WHERE a>2; | |
| 201 } | |
| 202 } {3.0 4.0 5.0 6.0} | |
| 203 do_test descidx1-4.5 { | |
| 204 execsql { | |
| 205 SELECT d FROM t2 WHERE a=2 AND b>'two'; | |
| 206 } | |
| 207 } {2.2} | |
| 208 do_test descidx1-4.6 { | |
| 209 execsql { | |
| 210 SELECT d FROM t2 WHERE a=2 AND b>='two'; | |
| 211 } | |
| 212 } {2.2 2.0 2.1} | |
| 213 do_test descidx1-4.7 { | |
| 214 execsql { | |
| 215 SELECT d FROM t2 WHERE a=2 AND b<'two'; | |
| 216 } | |
| 217 } {} | |
| 218 do_test descidx1-4.8 { | |
| 219 execsql { | |
| 220 SELECT d FROM t2 WHERE a=2 AND b<='two'; | |
| 221 } | |
| 222 } {2.0 2.1} | |
| 223 } | |
| 224 | |
| 225 do_test descidx1-5.1 { | |
| 226 execsql { | |
| 227 CREATE TABLE t3(a,b,c,d); | |
| 228 CREATE INDEX t3i1 ON t3(a DESC, b ASC, c DESC, d ASC); | |
| 229 INSERT INTO t3 VALUES(0,0,0,0); | |
| 230 INSERT INTO t3 VALUES(0,0,0,1); | |
| 231 INSERT INTO t3 VALUES(0,0,1,0); | |
| 232 INSERT INTO t3 VALUES(0,0,1,1); | |
| 233 INSERT INTO t3 VALUES(0,1,0,0); | |
| 234 INSERT INTO t3 VALUES(0,1,0,1); | |
| 235 INSERT INTO t3 VALUES(0,1,1,0); | |
| 236 INSERT INTO t3 VALUES(0,1,1,1); | |
| 237 INSERT INTO t3 VALUES(1,0,0,0); | |
| 238 INSERT INTO t3 VALUES(1,0,0,1); | |
| 239 INSERT INTO t3 VALUES(1,0,1,0); | |
| 240 INSERT INTO t3 VALUES(1,0,1,1); | |
| 241 INSERT INTO t3 VALUES(1,1,0,0); | |
| 242 INSERT INTO t3 VALUES(1,1,0,1); | |
| 243 INSERT INTO t3 VALUES(1,1,1,0); | |
| 244 INSERT INTO t3 VALUES(1,1,1,1); | |
| 245 SELECT count(*) FROM t3; | |
| 246 } | |
| 247 } {16} | |
| 248 do_test descidx1-5.2 { | |
| 249 cksort { | |
| 250 SELECT a||b||c||d FROM t3 ORDER BY a,b,c,d; | |
| 251 } | |
| 252 } {0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 11
11 sort} | |
| 253 do_test descidx1-5.3 { | |
| 254 cksort { | |
| 255 SELECT a||b||c||d FROM t3 ORDER BY a DESC, b ASC, c DESC, d ASC; | |
| 256 } | |
| 257 } {1010 1011 1000 1001 1110 1111 1100 1101 0010 0011 0000 0001 0110 0111 0100 01
01 nosort} | |
| 258 do_test descidx1-5.4 { | |
| 259 cksort { | |
| 260 SELECT a||b||c||d FROM t3 ORDER BY a ASC, b DESC, c ASC, d DESC; | |
| 261 } | |
| 262 } {0101 0100 0111 0110 0001 0000 0011 0010 1101 1100 1111 1110 1001 1000 1011 10
10 nosort} | |
| 263 do_test descidx1-5.5 { | |
| 264 cksort { | |
| 265 SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a DESC, b ASC, c DESC | |
| 266 } | |
| 267 } {101 100 111 110 001 000 011 010 nosort} | |
| 268 do_test descidx1-5.6 { | |
| 269 cksort { | |
| 270 SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a ASC, b DESC, c ASC | |
| 271 } | |
| 272 } {010 011 000 001 110 111 100 101 nosort} | |
| 273 do_test descidx1-5.7 { | |
| 274 cksort { | |
| 275 SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a ASC, b DESC, c DESC | |
| 276 } | |
| 277 } {011 010 001 000 111 110 101 100 sort} | |
| 278 do_test descidx1-5.8 { | |
| 279 cksort { | |
| 280 SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a ASC, b ASC, c ASC | |
| 281 } | |
| 282 } {000 001 010 011 100 101 110 111 sort} | |
| 283 do_test descidx1-5.9 { | |
| 284 cksort { | |
| 285 SELECT a||b||c FROM t3 WHERE d=0 ORDER BY a DESC, b DESC, c ASC | |
| 286 } | |
| 287 } {110 111 100 101 010 011 000 001 sort} | |
| 288 | |
| 289 # Test the legacy_file_format pragma here because we have access to | |
| 290 # the get_file_format command. | |
| 291 # | |
| 292 ifcapable legacyformat { | |
| 293 do_test descidx1-6.1 { | |
| 294 db close | |
| 295 file delete -force test.db test.db-journal | |
| 296 sqlite3 db test.db | |
| 297 execsql {PRAGMA legacy_file_format} | |
| 298 } {1} | |
| 299 } else { | |
| 300 do_test descidx1-6.1 { | |
| 301 db close | |
| 302 file delete -force test.db test.db-journal | |
| 303 sqlite3 db test.db | |
| 304 execsql {PRAGMA legacy_file_format} | |
| 305 } {0} | |
| 306 } | |
| 307 do_test descidx1-6.2 { | |
| 308 execsql {PRAGMA legacy_file_format=YES} | |
| 309 execsql {PRAGMA legacy_file_format} | |
| 310 } {1} | |
| 311 do_test descidx1-6.3 { | |
| 312 execsql { | |
| 313 CREATE TABLE t1(a,b,c); | |
| 314 } | |
| 315 get_file_format | |
| 316 } {1} | |
| 317 ifcapable vacuum { | |
| 318 # Verify that the file format is preserved across a vacuum. | |
| 319 do_test descidx1-6.3.1 { | |
| 320 execsql {VACUUM} | |
| 321 get_file_format | |
| 322 } {1} | |
| 323 } | |
| 324 do_test descidx1-6.4 { | |
| 325 db close | |
| 326 file delete -force test.db test.db-journal | |
| 327 sqlite3 db test.db | |
| 328 execsql {PRAGMA legacy_file_format=NO} | |
| 329 execsql {PRAGMA legacy_file_format} | |
| 330 } {0} | |
| 331 do_test descidx1-6.5 { | |
| 332 execsql { | |
| 333 CREATE TABLE t1(a,b,c); | |
| 334 CREATE INDEX i1 ON t1(a ASC, b DESC, c ASC); | |
| 335 INSERT INTO t1 VALUES(1,2,3); | |
| 336 INSERT INTO t1 VALUES(1,1,0); | |
| 337 INSERT INTO t1 VALUES(1,2,1); | |
| 338 INSERT INTO t1 VALUES(1,3,4); | |
| 339 } | |
| 340 get_file_format | |
| 341 } {4} | |
| 342 ifcapable vacuum { | |
| 343 # Verify that the file format is preserved across a vacuum. | |
| 344 do_test descidx1-6.6 { | |
| 345 execsql {VACUUM} | |
| 346 get_file_format | |
| 347 } {4} | |
| 348 do_test descidx1-6.7 { | |
| 349 execsql { | |
| 350 PRAGMA legacy_file_format=ON; | |
| 351 VACUUM; | |
| 352 } | |
| 353 get_file_format | |
| 354 } {4} | |
| 355 } | |
| 356 | |
| 357 | |
| 358 | |
| 359 finish_test | |
| OLD | NEW |