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