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