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 17set testdir [file dirname $argv0] 18source $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. 33db collate BACKWARDS backwards_collate 34proc 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# 59do_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} {} 96do_test collate2-1.1 { 97 execsql { 98 SELECT a FROM collate2t1 WHERE a > 'aa' ORDER BY 1; 99 } 100} {ab bA bB ba bb} 101do_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} 106do_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} 111do_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} 116do_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} 121do_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} 127do_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} 133do_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} 139do_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} 144do_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} 149do_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} 154do_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} 159do_test collate2-1.3 { 160 execsql { 161 SELECT c FROM collate2t1 WHERE c > 'aa' ORDER BY 1; 162 } 163} {ba Ab Bb ab bb} 164do_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} 170do_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} 176do_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} 182do_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} 187do_test collate2-1.5 { 188 execsql { 189 SELECT b FROM collate2t1 WHERE b < 'aa' ORDER BY 1, oid; 190 } 191} {} 192do_test collate2-1.5.1 { 193 execsql { 194 SELECT b FROM collate2t1 WHERE b < 'aa' ORDER BY +b; 195 } 196} {} 197do_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} 202do_test collate2-1.7 { 203 execsql { 204 SELECT a FROM collate2t1 WHERE a = 'aa'; 205 } 206} {aa} 207do_test collate2-1.8 { 208 execsql { 209 SELECT b FROM collate2t1 WHERE b = 'aa' ORDER BY oid; 210 } 211} {aa aA Aa AA} 212do_test collate2-1.9 { 213 execsql { 214 SELECT c FROM collate2t1 WHERE c = 'aa'; 215 } 216} {aa} 217do_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} 222do_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} 227do_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} 232do_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} 237do_test collate2-1.14 { 238 execsql { 239 SELECT b FROM collate2t1 WHERE b <= 'aa' ORDER BY 1, oid; 240 } 241} {aa aA Aa AA} 242do_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} 247do_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} 252do_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} 257do_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} 262do_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} 267do_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} 274do_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} 281do_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 289ifcapable 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 325do_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} 330do_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} 335do_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} 340do_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} 345do_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} 350do_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} 355do_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} 360do_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} 365do_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} 370do_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} 375do_test collate2-2.11 { 376 execsql { 377 SELECT b FROM collate2t1 WHERE NOT b >= 'aa' ORDER BY 1, oid; 378 } 379} {} 380do_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} 385do_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} 390do_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} 395do_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} 400do_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} 405do_test collate2-2.17 { 406 execsql { 407 SELECT b FROM collate2t1 WHERE b NOT BETWEEN 'Aa' AND 'Bb' ORDER BY 1, oid; 408 } 409} {} 410do_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} 415do_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} 420do_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} 425do_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 431ifcapable 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 467do_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} 472do_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} 477do_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} 482do_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} 487do_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} 492do_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} 497do_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} 502do_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} 507do_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} 512do_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} 517do_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} 522do_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} 527do_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} 532do_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} 537do_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} 542do_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} 547do_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} 552do_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} 557do_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} 562do_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} 567do_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 573ifcapable 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 609do_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. 621do_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} 627do_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. 636do_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} 642do_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 649do_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# 663do_test collate2-5.0 { 664 execsql { 665 SELECT collate2t1.b FROM collate2t1 JOIN collate2t2 USING (b); 666 } 667} {aa aA Aa AA} 668do_test collate2-5.1 { 669 execsql { 670 SELECT collate2t1.b FROM collate2t2 JOIN collate2t1 USING (b); 671 } 672} {aa} 673do_test collate2-5.2 { 674 execsql { 675 SELECT collate2t1.b FROM collate2t1 NATURAL JOIN collate2t2; 676 } 677} {aa aA Aa AA} 678do_test collate2-5.3 { 679 execsql { 680 SELECT collate2t1.b FROM collate2t2 NATURAL JOIN collate2t1; 681 } 682} {aa} 683do_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 {} {} {}} 688do_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 694finish_test 695