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