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