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