1 # 2 # 2001 September 15 3 # 4 # The author disclaims copyright to this source code. In place of 5 # a legal notice, here is a blessing: 6 # 7 # May you do good and not evil. 8 # May you find forgiveness for yourself and forgive others. 9 # May you share freely, never taking more than you give. 10 # 11 #*********************************************************************** 12 # This file implements regression tests for SQLite library. The 13 # focus of this script is page cache subsystem. 14 # 15 # $Id: collate2.test,v 1.6 2008/08/20 16:35:10 drh Exp $ 16 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 20 # 21 # Tests are organised as follows: 22 # 23 # collate2-1.* WHERE <expr> expressions (sqliteExprIfTrue). 24 # collate2-2.* WHERE NOT <expr> expressions (sqliteExprIfFalse). 25 # collate2-3.* SELECT <expr> expressions (sqliteExprCode). 26 # collate2-4.* Precedence of collation/data types in binary comparisons 27 # collate2-5.* JOIN syntax. 28 # 29 30 # Create a collation type BACKWARDS for use in testing. This collation type 31 # is similar to the built-in TEXT collation type except the order of 32 # characters in each string is reversed before the comparison is performed. 33 db collate BACKWARDS backwards_collate 34 proc backwards_collate {a b} { 35 set ra {}; 36 set rb {} 37 foreach c [split $a {}] { set ra $c$ra } 38 foreach c [split $b {}] { set rb $c$rb } 39 return [string compare $ra $rb] 40 } 41 42 # The following values are used in these tests: 43 # NULL aa ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB 44 # 45 # The collation orders for each of the tested collation types are: 46 # 47 # BINARY: NULL AA AB Aa Ab BA BB Ba Bb aA aB aa ab bA bB ba bb 48 # NOCASE: NULL aa aA Aa AA ab aB Ab AB ba bA Ba BA bb bB Bb BB 49 # BACKWARDS: NULL AA BA aA bA AB BB aB bB Aa Ba aa ba Ab Bb ab bb 50 # 51 # These tests verify that the default collation type for a column is used 52 # for comparison operators (<, >, <=, >=, =) involving that column and 53 # an expression that is not a column with a default collation type. 54 # 55 # The collation sequences BINARY and NOCASE are built-in, the BACKWARDS 56 # collation sequence is implemented by the TCL proc backwards_collate 57 # above. 58 # 59 do_test collate2-1.0 { 60 execsql { 61 CREATE TABLE collate2t1( 62 a COLLATE BINARY, 63 b COLLATE NOCASE, 64 c COLLATE BACKWARDS 65 ); 66 INSERT INTO collate2t1 VALUES( NULL, NULL, NULL ); 67 68 INSERT INTO collate2t1 VALUES( 'aa', 'aa', 'aa' ); 69 INSERT INTO collate2t1 VALUES( 'ab', 'ab', 'ab' ); 70 INSERT INTO collate2t1 VALUES( 'ba', 'ba', 'ba' ); 71 INSERT INTO collate2t1 VALUES( 'bb', 'bb', 'bb' ); 72 73 INSERT INTO collate2t1 VALUES( 'aA', 'aA', 'aA' ); 74 INSERT INTO collate2t1 VALUES( 'aB', 'aB', 'aB' ); 75 INSERT INTO collate2t1 VALUES( 'bA', 'bA', 'bA' ); 76 INSERT INTO collate2t1 VALUES( 'bB', 'bB', 'bB' ); 77 78 INSERT INTO collate2t1 VALUES( 'Aa', 'Aa', 'Aa' ); 79 INSERT INTO collate2t1 VALUES( 'Ab', 'Ab', 'Ab' ); 80 INSERT INTO collate2t1 VALUES( 'Ba', 'Ba', 'Ba' ); 81 INSERT INTO collate2t1 VALUES( 'Bb', 'Bb', 'Bb' ); 82 83 INSERT INTO collate2t1 VALUES( 'AA', 'AA', 'AA' ); 84 INSERT INTO collate2t1 VALUES( 'AB', 'AB', 'AB' ); 85 INSERT INTO collate2t1 VALUES( 'BA', 'BA', 'BA' ); 86 INSERT INTO collate2t1 VALUES( 'BB', 'BB', 'BB' ); 87 } 88 if {[info exists collate_test_use_index]} { 89 execsql { 90 CREATE INDEX collate2t1_i1 ON collate2t1(a); 91 CREATE INDEX collate2t1_i2 ON collate2t1(b); 92 CREATE INDEX collate2t1_i3 ON collate2t1(c); 93 } 94 } 95 } {} 96 do_test collate2-1.1 { 97 execsql { 98 SELECT a FROM collate2t1 WHERE a > 'aa' ORDER BY 1; 99 } 100 } {ab bA bB ba bb} 101 do_test collate2-1.1.1 { 102 execsql { 103 SELECT a FROM collate2t1 WHERE a COLLATE binary > 'aa' ORDER BY 1; 104 } 105 } {ab bA bB ba bb} 106 do_test collate2-1.1.2 { 107 execsql { 108 SELECT a FROM collate2t1 WHERE b COLLATE binary > 'aa' ORDER BY 1; 109 } 110 } {ab bA bB ba bb} 111 do_test collate2-1.1.3 { 112 execsql { 113 SELECT a FROM collate2t1 WHERE c COLLATE binary > 'aa' ORDER BY 1; 114 } 115 } {ab bA bB ba bb} 116 do_test collate2-1.2 { 117 execsql { 118 SELECT b FROM collate2t1 WHERE b > 'aa' ORDER BY 1, oid; 119 } 120 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 121 do_test collate2-1.2.1 { 122 execsql { 123 SELECT b FROM collate2t1 WHERE a COLLATE nocase > 'aa' 124 ORDER BY 1, oid; 125 } 126 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 127 do_test collate2-1.2.2 { 128 execsql { 129 SELECT b FROM collate2t1 WHERE b COLLATE nocase > 'aa' 130 ORDER BY 1, oid; 131 } 132 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 133 do_test collate2-1.2.3 { 134 execsql { 135 SELECT b FROM collate2t1 WHERE c COLLATE nocase > 'aa' 136 ORDER BY 1, oid; 137 } 138 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 139 do_test collate2-1.2.4 { 140 execsql { 141 SELECT b FROM collate2t1 WHERE b > 'aa' ORDER BY +b; 142 } 143 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 144 do_test collate2-1.2.5 { 145 execsql { 146 SELECT b FROM collate2t1 WHERE a COLLATE nocase > 'aa' ORDER BY +b; 147 } 148 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 149 do_test collate2-1.2.6 { 150 execsql { 151 SELECT b FROM collate2t1 WHERE b COLLATE nocase > 'aa' ORDER BY +b; 152 } 153 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 154 do_test collate2-1.2.7 { 155 execsql { 156 SELECT b FROM collate2t1 WHERE c COLLATE nocase > 'aa' ORDER BY +b; 157 } 158 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 159 do_test collate2-1.3 { 160 execsql { 161 SELECT c FROM collate2t1 WHERE c > 'aa' ORDER BY 1; 162 } 163 } {ba Ab Bb ab bb} 164 do_test collate2-1.3.1 { 165 execsql { 166 SELECT c FROM collate2t1 WHERE a COLLATE backwards > 'aa' 167 ORDER BY 1; 168 } 169 } {ba Ab Bb ab bb} 170 do_test collate2-1.3.2 { 171 execsql { 172 SELECT c FROM collate2t1 WHERE b COLLATE backwards > 'aa' 173 ORDER BY 1; 174 } 175 } {ba Ab Bb ab bb} 176 do_test collate2-1.3.3 { 177 execsql { 178 SELECT c FROM collate2t1 WHERE c COLLATE backwards > 'aa' 179 ORDER BY 1; 180 } 181 } {ba Ab Bb ab bb} 182 do_test collate2-1.4 { 183 execsql { 184 SELECT a FROM collate2t1 WHERE a < 'aa' ORDER BY 1; 185 } 186 } {AA AB Aa Ab BA BB Ba Bb aA aB} 187 do_test collate2-1.5 { 188 execsql { 189 SELECT b FROM collate2t1 WHERE b < 'aa' ORDER BY 1, oid; 190 } 191 } {} 192 do_test collate2-1.5.1 { 193 execsql { 194 SELECT b FROM collate2t1 WHERE b < 'aa' ORDER BY +b; 195 } 196 } {} 197 do_test collate2-1.6 { 198 execsql { 199 SELECT c FROM collate2t1 WHERE c < 'aa' ORDER BY 1; 200 } 201 } {AA BA aA bA AB BB aB bB Aa Ba} 202 do_test collate2-1.7 { 203 execsql { 204 SELECT a FROM collate2t1 WHERE a = 'aa'; 205 } 206 } {aa} 207 do_test collate2-1.8 { 208 execsql { 209 SELECT b FROM collate2t1 WHERE b = 'aa' ORDER BY oid; 210 } 211 } {aa aA Aa AA} 212 do_test collate2-1.9 { 213 execsql { 214 SELECT c FROM collate2t1 WHERE c = 'aa'; 215 } 216 } {aa} 217 do_test collate2-1.10 { 218 execsql { 219 SELECT a FROM collate2t1 WHERE a >= 'aa' ORDER BY 1; 220 } 221 } {aa ab bA bB ba bb} 222 do_test collate2-1.11 { 223 execsql { 224 SELECT b FROM collate2t1 WHERE b >= 'aa' ORDER BY 1, oid; 225 } 226 } {aa aA Aa AA ab aB Ab AB ba bA Ba BA bb bB Bb BB} 227 do_test collate2-1.12 { 228 execsql { 229 SELECT c FROM collate2t1 WHERE c >= 'aa' ORDER BY 1; 230 } 231 } {aa ba Ab Bb ab bb} 232 do_test collate2-1.13 { 233 execsql { 234 SELECT a FROM collate2t1 WHERE a <= 'aa' ORDER BY 1; 235 } 236 } {AA AB Aa Ab BA BB Ba Bb aA aB aa} 237 do_test collate2-1.14 { 238 execsql { 239 SELECT b FROM collate2t1 WHERE b <= 'aa' ORDER BY 1, oid; 240 } 241 } {aa aA Aa AA} 242 do_test collate2-1.15 { 243 execsql { 244 SELECT c FROM collate2t1 WHERE c <= 'aa' ORDER BY 1; 245 } 246 } {AA BA aA bA AB BB aB bB Aa Ba aa} 247 do_test collate2-1.16 { 248 execsql { 249 SELECT a FROM collate2t1 WHERE a BETWEEN 'Aa' AND 'Bb' ORDER BY 1; 250 } 251 } {Aa Ab BA BB Ba Bb} 252 do_test collate2-1.17 { 253 execsql { 254 SELECT b FROM collate2t1 WHERE b BETWEEN 'Aa' AND 'Bb' ORDER BY 1, oid; 255 } 256 } {aa aA Aa AA ab aB Ab AB ba bA Ba BA bb bB Bb BB} 257 do_test collate2-1.17.1 { 258 execsql { 259 SELECT b FROM collate2t1 WHERE b BETWEEN 'Aa' AND 'Bb' ORDER BY +b; 260 } 261 } {aa aA Aa AA ab aB Ab AB ba bA Ba BA bb bB Bb BB} 262 do_test collate2-1.18 { 263 execsql { 264 SELECT c FROM collate2t1 WHERE c BETWEEN 'Aa' AND 'Bb' ORDER BY 1; 265 } 266 } {Aa Ba aa ba Ab Bb} 267 do_test collate2-1.19 { 268 execsql { 269 SELECT a FROM collate2t1 WHERE 270 CASE a WHEN 'aa' THEN 1 ELSE 0 END 271 ORDER BY 1, oid; 272 } 273 } {aa} 274 do_test collate2-1.20 { 275 execsql { 276 SELECT b FROM collate2t1 WHERE 277 CASE b WHEN 'aa' THEN 1 ELSE 0 END 278 ORDER BY 1, oid; 279 } 280 } {aa aA Aa AA} 281 do_test collate2-1.21 { 282 execsql { 283 SELECT c FROM collate2t1 WHERE 284 CASE c WHEN 'aa' THEN 1 ELSE 0 END 285 ORDER BY 1, oid; 286 } 287 } {aa} 288 289 ifcapable subquery { 290 do_test collate2-1.22 { 291 execsql { 292 SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb') ORDER BY 1, oid; 293 } 294 } {aa bb} 295 do_test collate2-1.23 { 296 execsql { 297 SELECT b FROM collate2t1 WHERE b IN ('aa', 'bb') ORDER BY 1, oid; 298 } 299 } {aa aA Aa AA bb bB Bb BB} 300 do_test collate2-1.24 { 301 execsql { 302 SELECT c FROM collate2t1 WHERE c IN ('aa', 'bb') ORDER BY 1, oid; 303 } 304 } {aa bb} 305 do_test collate2-1.25 { 306 execsql { 307 SELECT a FROM collate2t1 308 WHERE a IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 309 } 310 } {aa bb} 311 do_test collate2-1.26 { 312 execsql { 313 SELECT b FROM collate2t1 314 WHERE b IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 315 } 316 } {aa bb aA bB Aa Bb AA BB} 317 do_test collate2-1.27 { 318 execsql { 319 SELECT c FROM collate2t1 320 WHERE c IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 321 } 322 } {aa bb} 323 } ;# ifcapable subquery 324 325 do_test collate2-2.1 { 326 execsql { 327 SELECT a FROM collate2t1 WHERE NOT a > 'aa' ORDER BY 1; 328 } 329 } {AA AB Aa Ab BA BB Ba Bb aA aB aa} 330 do_test collate2-2.2 { 331 execsql { 332 SELECT b FROM collate2t1 WHERE NOT b > 'aa' ORDER BY 1, oid; 333 } 334 } {aa aA Aa AA} 335 do_test collate2-2.3 { 336 execsql { 337 SELECT c FROM collate2t1 WHERE NOT c > 'aa' ORDER BY 1; 338 } 339 } {AA BA aA bA AB BB aB bB Aa Ba aa} 340 do_test collate2-2.4 { 341 execsql { 342 SELECT a FROM collate2t1 WHERE NOT a < 'aa' ORDER BY 1; 343 } 344 } {aa ab bA bB ba bb} 345 do_test collate2-2.5 { 346 execsql { 347 SELECT b FROM collate2t1 WHERE NOT b < 'aa' ORDER BY 1, oid; 348 } 349 } {aa aA Aa AA ab aB Ab AB ba bA Ba BA bb bB Bb BB} 350 do_test collate2-2.6 { 351 execsql { 352 SELECT c FROM collate2t1 WHERE NOT c < 'aa' ORDER BY 1; 353 } 354 } {aa ba Ab Bb ab bb} 355 do_test collate2-2.7 { 356 execsql { 357 SELECT a FROM collate2t1 WHERE NOT a = 'aa'; 358 } 359 } {ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 360 do_test collate2-2.8 { 361 execsql { 362 SELECT b FROM collate2t1 WHERE NOT b = 'aa'; 363 } 364 } {ab ba bb aB bA bB Ab Ba Bb AB BA BB} 365 do_test collate2-2.9 { 366 execsql { 367 SELECT c FROM collate2t1 WHERE NOT c = 'aa'; 368 } 369 } {ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 370 do_test collate2-2.10 { 371 execsql { 372 SELECT a FROM collate2t1 WHERE NOT a >= 'aa' ORDER BY 1; 373 } 374 } {AA AB Aa Ab BA BB Ba Bb aA aB} 375 do_test collate2-2.11 { 376 execsql { 377 SELECT b FROM collate2t1 WHERE NOT b >= 'aa' ORDER BY 1, oid; 378 } 379 } {} 380 do_test collate2-2.12 { 381 execsql { 382 SELECT c FROM collate2t1 WHERE NOT c >= 'aa' ORDER BY 1; 383 } 384 } {AA BA aA bA AB BB aB bB Aa Ba} 385 do_test collate2-2.13 { 386 execsql { 387 SELECT a FROM collate2t1 WHERE NOT a <= 'aa' ORDER BY 1; 388 } 389 } {ab bA bB ba bb} 390 do_test collate2-2.14 { 391 execsql { 392 SELECT b FROM collate2t1 WHERE NOT b <= 'aa' ORDER BY 1, oid; 393 } 394 } {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 395 do_test collate2-2.15 { 396 execsql { 397 SELECT c FROM collate2t1 WHERE NOT c <= 'aa' ORDER BY 1; 398 } 399 } {ba Ab Bb ab bb} 400 do_test collate2-2.16 { 401 execsql { 402 SELECT a FROM collate2t1 WHERE a NOT BETWEEN 'Aa' AND 'Bb' ORDER BY 1; 403 } 404 } {AA AB aA aB aa ab bA bB ba bb} 405 do_test collate2-2.17 { 406 execsql { 407 SELECT b FROM collate2t1 WHERE b NOT BETWEEN 'Aa' AND 'Bb' ORDER BY 1, oid; 408 } 409 } {} 410 do_test collate2-2.18 { 411 execsql { 412 SELECT c FROM collate2t1 WHERE c NOT BETWEEN 'Aa' AND 'Bb' ORDER BY 1; 413 } 414 } {AA BA aA bA AB BB aB bB ab bb} 415 do_test collate2-2.19 { 416 execsql { 417 SELECT a FROM collate2t1 WHERE NOT CASE a WHEN 'aa' THEN 1 ELSE 0 END; 418 } 419 } {{} ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 420 do_test collate2-2.20 { 421 execsql { 422 SELECT b FROM collate2t1 WHERE NOT CASE b WHEN 'aa' THEN 1 ELSE 0 END; 423 } 424 } {{} ab ba bb aB bA bB Ab Ba Bb AB BA BB} 425 do_test collate2-2.21 { 426 execsql { 427 SELECT c FROM collate2t1 WHERE NOT CASE c WHEN 'aa' THEN 1 ELSE 0 END; 428 } 429 } {{} ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 430 431 ifcapable subquery { 432 do_test collate2-2.22 { 433 execsql { 434 SELECT a FROM collate2t1 WHERE NOT a IN ('aa', 'bb'); 435 } 436 } {ab ba aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 437 do_test collate2-2.23 { 438 execsql { 439 SELECT b FROM collate2t1 WHERE NOT b IN ('aa', 'bb'); 440 } 441 } {ab ba aB bA Ab Ba AB BA} 442 do_test collate2-2.24 { 443 execsql { 444 SELECT c FROM collate2t1 WHERE NOT c IN ('aa', 'bb'); 445 } 446 } {ab ba aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 447 do_test collate2-2.25 { 448 execsql { 449 SELECT a FROM collate2t1 450 WHERE NOT a IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 451 } 452 } {ab ba aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 453 do_test collate2-2.26 { 454 execsql { 455 SELECT b FROM collate2t1 456 WHERE NOT b IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 457 } 458 } {ab ba aB bA Ab Ba AB BA} 459 do_test collate2-2.27 { 460 execsql { 461 SELECT c FROM collate2t1 462 WHERE NOT c IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 463 } 464 } {ab ba aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 465 } 466 467 do_test collate2-3.1 { 468 execsql { 469 SELECT a > 'aa' FROM collate2t1; 470 } 471 } {{} 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0} 472 do_test collate2-3.2 { 473 execsql { 474 SELECT b > 'aa' FROM collate2t1; 475 } 476 } {{} 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1} 477 do_test collate2-3.3 { 478 execsql { 479 SELECT c > 'aa' FROM collate2t1; 480 } 481 } {{} 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0} 482 do_test collate2-3.4 { 483 execsql { 484 SELECT a < 'aa' FROM collate2t1; 485 } 486 } {{} 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1} 487 do_test collate2-3.5 { 488 execsql { 489 SELECT b < 'aa' FROM collate2t1; 490 } 491 } {{} 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 492 do_test collate2-3.6 { 493 execsql { 494 SELECT c < 'aa' FROM collate2t1; 495 } 496 } {{} 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1} 497 do_test collate2-3.7 { 498 execsql { 499 SELECT a = 'aa' FROM collate2t1; 500 } 501 } {{} 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 502 do_test collate2-3.8 { 503 execsql { 504 SELECT b = 'aa' FROM collate2t1; 505 } 506 } {{} 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0} 507 do_test collate2-3.9 { 508 execsql { 509 SELECT c = 'aa' FROM collate2t1; 510 } 511 } {{} 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 512 do_test collate2-3.10 { 513 execsql { 514 SELECT a <= 'aa' FROM collate2t1; 515 } 516 } {{} 1 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1} 517 do_test collate2-3.11 { 518 execsql { 519 SELECT b <= 'aa' FROM collate2t1; 520 } 521 } {{} 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0} 522 do_test collate2-3.12 { 523 execsql { 524 SELECT c <= 'aa' FROM collate2t1; 525 } 526 } {{} 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1} 527 do_test collate2-3.13 { 528 execsql { 529 SELECT a >= 'aa' FROM collate2t1; 530 } 531 } {{} 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0} 532 do_test collate2-3.14 { 533 execsql { 534 SELECT b >= 'aa' FROM collate2t1; 535 } 536 } {{} 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1} 537 do_test collate2-3.15 { 538 execsql { 539 SELECT c >= 'aa' FROM collate2t1; 540 } 541 } {{} 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0} 542 do_test collate2-3.16 { 543 execsql { 544 SELECT a BETWEEN 'Aa' AND 'Bb' FROM collate2t1; 545 } 546 } {{} 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1} 547 do_test collate2-3.17 { 548 execsql { 549 SELECT b BETWEEN 'Aa' AND 'Bb' FROM collate2t1; 550 } 551 } {{} 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1} 552 do_test collate2-3.18 { 553 execsql { 554 SELECT c BETWEEN 'Aa' AND 'Bb' FROM collate2t1; 555 } 556 } {{} 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0} 557 do_test collate2-3.19 { 558 execsql { 559 SELECT CASE a WHEN 'aa' THEN 1 ELSE 0 END FROM collate2t1; 560 } 561 } {0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 562 do_test collate2-3.20 { 563 execsql { 564 SELECT CASE b WHEN 'aa' THEN 1 ELSE 0 END FROM collate2t1; 565 } 566 } {0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0} 567 do_test collate2-3.21 { 568 execsql { 569 SELECT CASE c WHEN 'aa' THEN 1 ELSE 0 END FROM collate2t1; 570 } 571 } {0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 572 573 ifcapable subquery { 574 do_test collate2-3.22 { 575 execsql { 576 SELECT a IN ('aa', 'bb') FROM collate2t1; 577 } 578 } {{} 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0} 579 do_test collate2-3.23 { 580 execsql { 581 SELECT b IN ('aa', 'bb') FROM collate2t1; 582 } 583 } {{} 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1} 584 do_test collate2-3.24 { 585 execsql { 586 SELECT c IN ('aa', 'bb') FROM collate2t1; 587 } 588 } {{} 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0} 589 do_test collate2-3.25 { 590 execsql { 591 SELECT a IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')) 592 FROM collate2t1; 593 } 594 } {{} 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0} 595 do_test collate2-3.26 { 596 execsql { 597 SELECT b IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')) 598 FROM collate2t1; 599 } 600 } {{} 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1} 601 do_test collate2-3.27 { 602 execsql { 603 SELECT c IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')) 604 FROM collate2t1; 605 } 606 } {{} 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0} 607 } 608 609 do_test collate2-4.0 { 610 execsql { 611 CREATE TABLE collate2t2(b COLLATE binary); 612 CREATE TABLE collate2t3(b text); 613 INSERT INTO collate2t2 VALUES('aa'); 614 INSERT INTO collate2t3 VALUES('aa'); 615 } 616 } {} 617 618 # Test that when both sides of a binary comparison operator have 619 # default collation types, the collate type for the leftmost term 620 # is used. 621 do_test collate2-4.1 { 622 execsql { 623 SELECT collate2t1.a FROM collate2t1, collate2t2 624 WHERE collate2t1.b = collate2t2.b; 625 } 626 } {aa aA Aa AA} 627 do_test collate2-4.2 { 628 execsql { 629 SELECT collate2t1.a FROM collate2t1, collate2t2 630 WHERE collate2t2.b = collate2t1.b; 631 } 632 } {aa} 633 634 # Test that when one side has a default collation type and the other 635 # does not, the collation type is used. 636 do_test collate2-4.3 { 637 execsql { 638 SELECT collate2t1.a FROM collate2t1, collate2t3 639 WHERE collate2t1.b = collate2t3.b||''; 640 } 641 } {aa aA Aa AA} 642 do_test collate2-4.4 { 643 execsql { 644 SELECT collate2t1.a FROM collate2t1, collate2t3 645 WHERE collate2t3.b||'' = collate2t1.b; 646 } 647 } {aa aA Aa AA} 648 649 do_test collate2-4.5 { 650 execsql { 651 DROP TABLE collate2t3; 652 } 653 } {} 654 655 # 656 # Test that the default collation types are used when the JOIN syntax 657 # is used in place of a WHERE clause. 658 # 659 # SQLite transforms the JOIN syntax into a WHERE clause internally, so 660 # the focus of these tests is to ensure that the table on the left-hand-side 661 # of the join determines the collation type used. 662 # 663 do_test collate2-5.0 { 664 execsql { 665 SELECT collate2t1.b FROM collate2t1 JOIN collate2t2 USING (b); 666 } 667 } {aa aA Aa AA} 668 do_test collate2-5.1 { 669 execsql { 670 SELECT collate2t1.b FROM collate2t2 JOIN collate2t1 USING (b); 671 } 672 } {aa} 673 do_test collate2-5.2 { 674 execsql { 675 SELECT collate2t1.b FROM collate2t1 NATURAL JOIN collate2t2; 676 } 677 } {aa aA Aa AA} 678 do_test collate2-5.3 { 679 execsql { 680 SELECT collate2t1.b FROM collate2t2 NATURAL JOIN collate2t1; 681 } 682 } {aa} 683 do_test collate2-5.4 { 684 execsql { 685 SELECT collate2t2.b FROM collate2t1 LEFT OUTER JOIN collate2t2 USING (b) order by collate2t1.oid; 686 } 687 } {{} aa {} {} {} aa {} {} {} aa {} {} {} aa {} {} {}} 688 do_test collate2-5.5 { 689 execsql { 690 SELECT collate2t1.b, collate2t2.b FROM collate2t2 LEFT OUTER JOIN collate2t1 USING (b); 691 } 692 } {aa aa} 693 694 finish_test 695