Home | History | Annotate | Download | only in test
      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
    695