xref: /sqlite-3.40.0/test/collate2.test (revision ef5ecb41)
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