persistentstorage/sqlite3api/TEST/TclScript/collate2.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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