Annotation of embedaddon/sqlite3/test/collate2.test, revision 1.1

1.1     ! misho       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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>