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.5 2007/02/01 23:02:46 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.3 { 140 execsql { 141 SELECT c FROM collate2t1 WHERE c > 'aa' ORDER BY 1; 142 } 143} {ba Ab Bb ab bb} 144do_test collate2-1.3.1 { 145 execsql { 146 SELECT c FROM collate2t1 WHERE a COLLATE backwards > 'aa' 147 ORDER BY 1; 148 } 149} {ba Ab Bb ab bb} 150do_test collate2-1.3.2 { 151 execsql { 152 SELECT c FROM collate2t1 WHERE b COLLATE backwards > 'aa' 153 ORDER BY 1; 154 } 155} {ba Ab Bb ab bb} 156do_test collate2-1.3.3 { 157 execsql { 158 SELECT c FROM collate2t1 WHERE c COLLATE backwards > 'aa' 159 ORDER BY 1; 160 } 161} {ba Ab Bb ab bb} 162do_test collate2-1.4 { 163 execsql { 164 SELECT a FROM collate2t1 WHERE a < 'aa' ORDER BY 1; 165 } 166} {AA AB Aa Ab BA BB Ba Bb aA aB} 167do_test collate2-1.5 { 168 execsql { 169 SELECT b FROM collate2t1 WHERE b < 'aa' ORDER BY 1, oid; 170 } 171} {} 172do_test collate2-1.6 { 173 execsql { 174 SELECT c FROM collate2t1 WHERE c < 'aa' ORDER BY 1; 175 } 176} {AA BA aA bA AB BB aB bB Aa Ba} 177do_test collate2-1.7 { 178 execsql { 179 SELECT a FROM collate2t1 WHERE a = 'aa'; 180 } 181} {aa} 182do_test collate2-1.8 { 183 execsql { 184 SELECT b FROM collate2t1 WHERE b = 'aa' ORDER BY oid; 185 } 186} {aa aA Aa AA} 187do_test collate2-1.9 { 188 execsql { 189 SELECT c FROM collate2t1 WHERE c = 'aa'; 190 } 191} {aa} 192do_test collate2-1.10 { 193 execsql { 194 SELECT a FROM collate2t1 WHERE a >= 'aa' ORDER BY 1; 195 } 196} {aa ab bA bB ba bb} 197do_test collate2-1.11 { 198 execsql { 199 SELECT b FROM collate2t1 WHERE b >= 'aa' ORDER BY 1, oid; 200 } 201} {aa aA Aa AA ab aB Ab AB ba bA Ba BA bb bB Bb BB} 202do_test collate2-1.12 { 203 execsql { 204 SELECT c FROM collate2t1 WHERE c >= 'aa' ORDER BY 1; 205 } 206} {aa ba Ab Bb ab bb} 207do_test collate2-1.13 { 208 execsql { 209 SELECT a FROM collate2t1 WHERE a <= 'aa' ORDER BY 1; 210 } 211} {AA AB Aa Ab BA BB Ba Bb aA aB aa} 212do_test collate2-1.14 { 213 execsql { 214 SELECT b FROM collate2t1 WHERE b <= 'aa' ORDER BY 1, oid; 215 } 216} {aa aA Aa AA} 217do_test collate2-1.15 { 218 execsql { 219 SELECT c FROM collate2t1 WHERE c <= 'aa' ORDER BY 1; 220 } 221} {AA BA aA bA AB BB aB bB Aa Ba aa} 222do_test collate2-1.16 { 223 execsql { 224 SELECT a FROM collate2t1 WHERE a BETWEEN 'Aa' AND 'Bb' ORDER BY 1; 225 } 226} {Aa Ab BA BB Ba Bb} 227do_test collate2-1.17 { 228 execsql { 229 SELECT b FROM collate2t1 WHERE b BETWEEN 'Aa' AND 'Bb' ORDER BY 1, oid; 230 } 231} {aa aA Aa AA ab aB Ab AB ba bA Ba BA bb bB Bb BB} 232do_test collate2-1.18 { 233 execsql { 234 SELECT c FROM collate2t1 WHERE c BETWEEN 'Aa' AND 'Bb' ORDER BY 1; 235 } 236} {Aa Ba aa ba Ab Bb} 237do_test collate2-1.19 { 238 execsql { 239 SELECT a FROM collate2t1 WHERE 240 CASE a WHEN 'aa' THEN 1 ELSE 0 END 241 ORDER BY 1, oid; 242 } 243} {aa} 244do_test collate2-1.20 { 245 execsql { 246 SELECT b FROM collate2t1 WHERE 247 CASE b WHEN 'aa' THEN 1 ELSE 0 END 248 ORDER BY 1, oid; 249 } 250} {aa aA Aa AA} 251do_test collate2-1.21 { 252 execsql { 253 SELECT c FROM collate2t1 WHERE 254 CASE c WHEN 'aa' THEN 1 ELSE 0 END 255 ORDER BY 1, oid; 256 } 257} {aa} 258 259ifcapable subquery { 260 do_test collate2-1.22 { 261 execsql { 262 SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb') ORDER BY 1, oid; 263 } 264 } {aa bb} 265 do_test collate2-1.23 { 266 execsql { 267 SELECT b FROM collate2t1 WHERE b IN ('aa', 'bb') ORDER BY 1, oid; 268 } 269 } {aa aA Aa AA bb bB Bb BB} 270 do_test collate2-1.24 { 271 execsql { 272 SELECT c FROM collate2t1 WHERE c IN ('aa', 'bb') ORDER BY 1, oid; 273 } 274 } {aa bb} 275 do_test collate2-1.25 { 276 execsql { 277 SELECT a FROM collate2t1 278 WHERE a IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 279 } 280 } {aa bb} 281 do_test collate2-1.26 { 282 execsql { 283 SELECT b FROM collate2t1 284 WHERE b IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 285 } 286 } {aa bb aA bB Aa Bb AA BB} 287 do_test collate2-1.27 { 288 execsql { 289 SELECT c FROM collate2t1 290 WHERE c IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 291 } 292 } {aa bb} 293} ;# ifcapable subquery 294 295do_test collate2-2.1 { 296 execsql { 297 SELECT a FROM collate2t1 WHERE NOT a > 'aa' ORDER BY 1; 298 } 299} {AA AB Aa Ab BA BB Ba Bb aA aB aa} 300do_test collate2-2.2 { 301 execsql { 302 SELECT b FROM collate2t1 WHERE NOT b > 'aa' ORDER BY 1, oid; 303 } 304} {aa aA Aa AA} 305do_test collate2-2.3 { 306 execsql { 307 SELECT c FROM collate2t1 WHERE NOT c > 'aa' ORDER BY 1; 308 } 309} {AA BA aA bA AB BB aB bB Aa Ba aa} 310do_test collate2-2.4 { 311 execsql { 312 SELECT a FROM collate2t1 WHERE NOT a < 'aa' ORDER BY 1; 313 } 314} {aa ab bA bB ba bb} 315do_test collate2-2.5 { 316 execsql { 317 SELECT b FROM collate2t1 WHERE NOT b < 'aa' ORDER BY 1, oid; 318 } 319} {aa aA Aa AA ab aB Ab AB ba bA Ba BA bb bB Bb BB} 320do_test collate2-2.6 { 321 execsql { 322 SELECT c FROM collate2t1 WHERE NOT c < 'aa' ORDER BY 1; 323 } 324} {aa ba Ab Bb ab bb} 325do_test collate2-2.7 { 326 execsql { 327 SELECT a FROM collate2t1 WHERE NOT a = 'aa'; 328 } 329} {ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 330do_test collate2-2.8 { 331 execsql { 332 SELECT b FROM collate2t1 WHERE NOT b = 'aa'; 333 } 334} {ab ba bb aB bA bB Ab Ba Bb AB BA BB} 335do_test collate2-2.9 { 336 execsql { 337 SELECT c FROM collate2t1 WHERE NOT c = 'aa'; 338 } 339} {ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 340do_test collate2-2.10 { 341 execsql { 342 SELECT a FROM collate2t1 WHERE NOT a >= 'aa' ORDER BY 1; 343 } 344} {AA AB Aa Ab BA BB Ba Bb aA aB} 345do_test collate2-2.11 { 346 execsql { 347 SELECT b FROM collate2t1 WHERE NOT b >= 'aa' ORDER BY 1, oid; 348 } 349} {} 350do_test collate2-2.12 { 351 execsql { 352 SELECT c FROM collate2t1 WHERE NOT c >= 'aa' ORDER BY 1; 353 } 354} {AA BA aA bA AB BB aB bB Aa Ba} 355do_test collate2-2.13 { 356 execsql { 357 SELECT a FROM collate2t1 WHERE NOT a <= 'aa' ORDER BY 1; 358 } 359} {ab bA bB ba bb} 360do_test collate2-2.14 { 361 execsql { 362 SELECT b FROM collate2t1 WHERE NOT b <= 'aa' ORDER BY 1, oid; 363 } 364} {ab aB Ab AB ba bA Ba BA bb bB Bb BB} 365do_test collate2-2.15 { 366 execsql { 367 SELECT c FROM collate2t1 WHERE NOT c <= 'aa' ORDER BY 1; 368 } 369} {ba Ab Bb ab bb} 370do_test collate2-2.16 { 371 execsql { 372 SELECT a FROM collate2t1 WHERE a NOT BETWEEN 'Aa' AND 'Bb' ORDER BY 1; 373 } 374} {AA AB aA aB aa ab bA bB ba bb} 375do_test collate2-2.17 { 376 execsql { 377 SELECT b FROM collate2t1 WHERE b NOT BETWEEN 'Aa' AND 'Bb' ORDER BY 1, oid; 378 } 379} {} 380do_test collate2-2.18 { 381 execsql { 382 SELECT c FROM collate2t1 WHERE c NOT BETWEEN 'Aa' AND 'Bb' ORDER BY 1; 383 } 384} {AA BA aA bA AB BB aB bB ab bb} 385do_test collate2-2.19 { 386 execsql { 387 SELECT a FROM collate2t1 WHERE NOT CASE a WHEN 'aa' THEN 1 ELSE 0 END; 388 } 389} {{} ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 390do_test collate2-2.20 { 391 execsql { 392 SELECT b FROM collate2t1 WHERE NOT CASE b WHEN 'aa' THEN 1 ELSE 0 END; 393 } 394} {{} ab ba bb aB bA bB Ab Ba Bb AB BA BB} 395do_test collate2-2.21 { 396 execsql { 397 SELECT c FROM collate2t1 WHERE NOT CASE c WHEN 'aa' THEN 1 ELSE 0 END; 398 } 399} {{} ab ba bb aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 400 401ifcapable subquery { 402 do_test collate2-2.22 { 403 execsql { 404 SELECT a FROM collate2t1 WHERE NOT a IN ('aa', 'bb'); 405 } 406 } {ab ba aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 407 do_test collate2-2.23 { 408 execsql { 409 SELECT b FROM collate2t1 WHERE NOT b IN ('aa', 'bb'); 410 } 411 } {ab ba aB bA Ab Ba AB BA} 412 do_test collate2-2.24 { 413 execsql { 414 SELECT c FROM collate2t1 WHERE NOT c IN ('aa', 'bb'); 415 } 416 } {ab ba aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 417 do_test collate2-2.25 { 418 execsql { 419 SELECT a FROM collate2t1 420 WHERE NOT a IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 421 } 422 } {ab ba aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 423 do_test collate2-2.26 { 424 execsql { 425 SELECT b FROM collate2t1 426 WHERE NOT b IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 427 } 428 } {ab ba aB bA Ab Ba AB BA} 429 do_test collate2-2.27 { 430 execsql { 431 SELECT c FROM collate2t1 432 WHERE NOT c IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')); 433 } 434 } {ab ba aA aB bA bB Aa Ab Ba Bb AA AB BA BB} 435} 436 437do_test collate2-3.1 { 438 execsql { 439 SELECT a > 'aa' FROM collate2t1; 440 } 441} {{} 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0} 442do_test collate2-3.2 { 443 execsql { 444 SELECT b > 'aa' FROM collate2t1; 445 } 446} {{} 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1} 447do_test collate2-3.3 { 448 execsql { 449 SELECT c > 'aa' FROM collate2t1; 450 } 451} {{} 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0} 452do_test collate2-3.4 { 453 execsql { 454 SELECT a < 'aa' FROM collate2t1; 455 } 456} {{} 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1} 457do_test collate2-3.5 { 458 execsql { 459 SELECT b < 'aa' FROM collate2t1; 460 } 461} {{} 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 462do_test collate2-3.6 { 463 execsql { 464 SELECT c < 'aa' FROM collate2t1; 465 } 466} {{} 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1} 467do_test collate2-3.7 { 468 execsql { 469 SELECT a = 'aa' FROM collate2t1; 470 } 471} {{} 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 472do_test collate2-3.8 { 473 execsql { 474 SELECT b = 'aa' FROM collate2t1; 475 } 476} {{} 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0} 477do_test collate2-3.9 { 478 execsql { 479 SELECT c = 'aa' FROM collate2t1; 480 } 481} {{} 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 482do_test collate2-3.10 { 483 execsql { 484 SELECT a <= 'aa' FROM collate2t1; 485 } 486} {{} 1 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1} 487do_test collate2-3.11 { 488 execsql { 489 SELECT b <= 'aa' FROM collate2t1; 490 } 491} {{} 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0} 492do_test collate2-3.12 { 493 execsql { 494 SELECT c <= 'aa' FROM collate2t1; 495 } 496} {{} 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1} 497do_test collate2-3.13 { 498 execsql { 499 SELECT a >= 'aa' FROM collate2t1; 500 } 501} {{} 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0} 502do_test collate2-3.14 { 503 execsql { 504 SELECT b >= 'aa' FROM collate2t1; 505 } 506} {{} 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1} 507do_test collate2-3.15 { 508 execsql { 509 SELECT c >= 'aa' FROM collate2t1; 510 } 511} {{} 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0} 512do_test collate2-3.16 { 513 execsql { 514 SELECT a BETWEEN 'Aa' AND 'Bb' FROM collate2t1; 515 } 516} {{} 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1} 517do_test collate2-3.17 { 518 execsql { 519 SELECT b BETWEEN 'Aa' AND 'Bb' FROM collate2t1; 520 } 521} {{} 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1} 522do_test collate2-3.18 { 523 execsql { 524 SELECT c BETWEEN 'Aa' AND 'Bb' FROM collate2t1; 525 } 526} {{} 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0} 527do_test collate2-3.19 { 528 execsql { 529 SELECT CASE a WHEN 'aa' THEN 1 ELSE 0 END FROM collate2t1; 530 } 531} {0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 532do_test collate2-3.20 { 533 execsql { 534 SELECT CASE b WHEN 'aa' THEN 1 ELSE 0 END FROM collate2t1; 535 } 536} {0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0} 537do_test collate2-3.21 { 538 execsql { 539 SELECT CASE c WHEN 'aa' THEN 1 ELSE 0 END FROM collate2t1; 540 } 541} {0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} 542 543ifcapable subquery { 544 do_test collate2-3.22 { 545 execsql { 546 SELECT a IN ('aa', 'bb') FROM collate2t1; 547 } 548 } {{} 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0} 549 do_test collate2-3.23 { 550 execsql { 551 SELECT b IN ('aa', 'bb') FROM collate2t1; 552 } 553 } {{} 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1} 554 do_test collate2-3.24 { 555 execsql { 556 SELECT c IN ('aa', 'bb') FROM collate2t1; 557 } 558 } {{} 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0} 559 do_test collate2-3.25 { 560 execsql { 561 SELECT a IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')) 562 FROM collate2t1; 563 } 564 } {{} 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0} 565 do_test collate2-3.26 { 566 execsql { 567 SELECT b IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')) 568 FROM collate2t1; 569 } 570 } {{} 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1} 571 do_test collate2-3.27 { 572 execsql { 573 SELECT c IN (SELECT a FROM collate2t1 WHERE a IN ('aa', 'bb')) 574 FROM collate2t1; 575 } 576 } {{} 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0} 577} 578 579do_test collate2-4.0 { 580 execsql { 581 CREATE TABLE collate2t2(b COLLATE binary); 582 CREATE TABLE collate2t3(b text); 583 INSERT INTO collate2t2 VALUES('aa'); 584 INSERT INTO collate2t3 VALUES('aa'); 585 } 586} {} 587 588# Test that when both sides of a binary comparison operator have 589# default collation types, the collate type for the leftmost term 590# is used. 591do_test collate2-4.1 { 592 execsql { 593 SELECT collate2t1.a FROM collate2t1, collate2t2 594 WHERE collate2t1.b = collate2t2.b; 595 } 596} {aa aA Aa AA} 597do_test collate2-4.2 { 598 execsql { 599 SELECT collate2t1.a FROM collate2t1, collate2t2 600 WHERE collate2t2.b = collate2t1.b; 601 } 602} {aa} 603 604# Test that when one side has a default collation type and the other 605# does not, the collation type is used. 606do_test collate2-4.3 { 607 execsql { 608 SELECT collate2t1.a FROM collate2t1, collate2t3 609 WHERE collate2t1.b = collate2t3.b||''; 610 } 611} {aa aA Aa AA} 612do_test collate2-4.4 { 613 execsql { 614 SELECT collate2t1.a FROM collate2t1, collate2t3 615 WHERE collate2t3.b||'' = collate2t1.b; 616 } 617} {aa aA Aa AA} 618 619do_test collate2-4.5 { 620 execsql { 621 DROP TABLE collate2t3; 622 } 623} {} 624 625# 626# Test that the default collation types are used when the JOIN syntax 627# is used in place of a WHERE clause. 628# 629# SQLite transforms the JOIN syntax into a WHERE clause internally, so 630# the focus of these tests is to ensure that the table on the left-hand-side 631# of the join determines the collation type used. 632# 633do_test collate2-5.0 { 634 execsql { 635 SELECT collate2t1.b FROM collate2t1 JOIN collate2t2 USING (b); 636 } 637} {aa aA Aa AA} 638do_test collate2-5.1 { 639 execsql { 640 SELECT collate2t1.b FROM collate2t2 JOIN collate2t1 USING (b); 641 } 642} {aa} 643do_test collate2-5.2 { 644 execsql { 645 SELECT collate2t1.b FROM collate2t1 NATURAL JOIN collate2t2; 646 } 647} {aa aA Aa AA} 648do_test collate2-5.3 { 649 execsql { 650 SELECT collate2t1.b FROM collate2t2 NATURAL JOIN collate2t1; 651 } 652} {aa} 653do_test collate2-5.4 { 654 execsql { 655 SELECT collate2t2.b FROM collate2t1 LEFT OUTER JOIN collate2t2 USING (b) order by collate2t1.oid; 656 } 657} {{} aa {} {} {} aa {} {} {} aa {} {} {} aa {} {} {}} 658do_test collate2-5.5 { 659 execsql { 660 SELECT collate2t1.b, collate2t2.b FROM collate2t2 LEFT OUTER JOIN collate2t1 USING (b); 661 } 662} {aa aa} 663 664finish_test 665