Annotation of embedaddon/sqlite3/test/collate4.test, revision 1.1.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: collate4.test,v 1.9 2008/01/05 17:39:30 danielk1977 Exp $
                     16: 
                     17: set testdir [file dirname $argv0]
                     18: source $testdir/tester.tcl
                     19: 
                     20: db collate TEXT text_collate
                     21: proc text_collate {a b} {
                     22:   return [string compare $a $b]
                     23: }
                     24: 
                     25: # Do an SQL statement.  Append the search count to the end of the result.
                     26: #
                     27: proc count sql {
                     28:   set ::sqlite_search_count 0
                     29:   return [concat [execsql $sql] $::sqlite_search_count]
                     30: }
                     31: 
                     32: # This procedure executes the SQL.  Then it checks the generated program
                     33: # for the SQL and appends a "nosort" to the result if the program contains the
                     34: # SortCallback opcode.  If the program does not contain the SortCallback
                     35: # opcode it appends "sort"
                     36: #
                     37: proc cksort {sql} {
                     38:   set ::sqlite_sort_count 0
                     39:   set data [execsql $sql]
                     40:   if {$::sqlite_sort_count} {set x sort} {set x nosort}
                     41:   lappend data $x
                     42:   return $data
                     43: }
                     44: 
                     45: # 
                     46: # Test cases are organized roughly as follows:
                     47: #
                     48: # collate4-1.*      ORDER BY.
                     49: # collate4-2.*      WHERE clauses.
                     50: # collate4-3.*      constraints (primary key, unique).
                     51: # collate4-4.*      simple min() or max() queries.
                     52: # collate4-5.*      REINDEX command
                     53: # collate4-6.*      INTEGER PRIMARY KEY indices.
                     54: #
                     55: 
                     56: #
                     57: # These tests - collate4-1.* - check that indices are correctly
                     58: # selected or not selected to implement ORDER BY clauses when 
                     59: # user defined collation sequences are involved. 
                     60: #
                     61: # Because these tests also exercise all the different ways indices 
                     62: # can be created, they also serve to verify that indices are correctly 
                     63: # initialised with user-defined collation sequences when they are
                     64: # created.
                     65: #
                     66: # Tests named collate4-1.1.* use indices with a single column. Tests
                     67: # collate4-1.2.* use indices with two columns.
                     68: #
                     69: do_test collate4-1.1.0 {
                     70:   execsql {
                     71:     CREATE TABLE collate4t1(a COLLATE NOCASE, b COLLATE TEXT);
                     72:     INSERT INTO collate4t1 VALUES( 'a', 'a' );
                     73:     INSERT INTO collate4t1 VALUES( 'b', 'b' );
                     74:     INSERT INTO collate4t1 VALUES( NULL, NULL );
                     75:     INSERT INTO collate4t1 VALUES( 'B', 'B' );
                     76:     INSERT INTO collate4t1 VALUES( 'A', 'A' );
                     77:     CREATE INDEX collate4i1 ON collate4t1(a);
                     78:     CREATE INDEX collate4i2 ON collate4t1(b);
                     79:   }
                     80: } {}
                     81: do_test collate4-1.1.1 {
                     82:   cksort {SELECT a FROM collate4t1 ORDER BY a}
                     83: } {{} a A b B nosort}
                     84: do_test collate4-1.1.2 {
                     85:   cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE NOCASE}
                     86: } {{} a A b B nosort}
                     87: do_test collate4-1.1.3 {
                     88:   cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE TEXT}
                     89: } {{} A B a b sort}
                     90: do_test collate4-1.1.4 {
                     91:   cksort {SELECT b FROM collate4t1 ORDER BY b}
                     92: } {{} A B a b nosort}
                     93: do_test collate4-1.1.5 {
                     94:   cksort {SELECT b FROM collate4t1 ORDER BY b COLLATE TEXT}
                     95: } {{} A B a b nosort}
                     96: do_test collate4-1.1.6 {
                     97:   cksort {SELECT b FROM collate4t1 ORDER BY b COLLATE NOCASE}
                     98: } {{} a A b B sort}
                     99: 
                    100: do_test collate4-1.1.7 {
                    101:   execsql {
                    102:     CREATE TABLE collate4t2(
                    103:       a PRIMARY KEY COLLATE NOCASE, 
                    104:       b UNIQUE COLLATE TEXT
                    105:     );
                    106:     INSERT INTO collate4t2 VALUES( 'a', 'a' );
                    107:     INSERT INTO collate4t2 VALUES( NULL, NULL );
                    108:     INSERT INTO collate4t2 VALUES( 'B', 'B' );
                    109:   }
                    110: } {}
                    111: do_test collate4-1.1.8 {
                    112:   cksort {SELECT a FROM collate4t2 ORDER BY a}
                    113: } {{} a B nosort}
                    114: do_test collate4-1.1.9 {
                    115:   cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE NOCASE}
                    116: } {{} a B nosort}
                    117: do_test collate4-1.1.10 {
                    118:   cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE TEXT}
                    119: } {{} B a sort}
                    120: do_test collate4-1.1.11 {
                    121:   cksort {SELECT b FROM collate4t2 ORDER BY b}
                    122: } {{} B a nosort}
                    123: do_test collate4-1.1.12 {
                    124:   cksort {SELECT b FROM collate4t2 ORDER BY b COLLATE TEXT}
                    125: } {{} B a nosort}
                    126: do_test collate4-1.1.13 {
                    127:   cksort {SELECT b FROM collate4t2 ORDER BY b COLLATE NOCASE}
                    128: } {{} a B sort}
                    129: 
                    130: do_test collate4-1.1.14 {
                    131:   execsql {
                    132:     CREATE TABLE collate4t3(
                    133:       b COLLATE TEXT,  
                    134:       a COLLATE NOCASE, 
                    135:       UNIQUE(a), PRIMARY KEY(b)
                    136:     );
                    137:     INSERT INTO collate4t3 VALUES( 'a', 'a' );
                    138:     INSERT INTO collate4t3 VALUES( NULL, NULL );
                    139:     INSERT INTO collate4t3 VALUES( 'B', 'B' );
                    140:   }
                    141: } {}
                    142: do_test collate4-1.1.15 {
                    143:   cksort {SELECT a FROM collate4t3 ORDER BY a}
                    144: } {{} a B nosort}
                    145: do_test collate4-1.1.16 {
                    146:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE NOCASE}
                    147: } {{} a B nosort}
                    148: do_test collate4-1.1.17 {
                    149:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE TEXT}
                    150: } {{} B a sort}
                    151: do_test collate4-1.1.18 {
                    152:   cksort {SELECT b FROM collate4t3 ORDER BY b}
                    153: } {{} B a nosort}
                    154: do_test collate4-1.1.19 {
                    155:   cksort {SELECT b FROM collate4t3 ORDER BY b COLLATE TEXT}
                    156: } {{} B a nosort}
                    157: do_test collate4-1.1.20 {
                    158:   cksort {SELECT b FROM collate4t3 ORDER BY b COLLATE NOCASE}
                    159: } {{} a B sort}
                    160: 
                    161: do_test collate4-1.1.21 {
                    162:   execsql {
                    163:     CREATE TABLE collate4t4(a COLLATE NOCASE, b COLLATE TEXT);
                    164:     INSERT INTO collate4t4 VALUES( 'a', 'a' );
                    165:     INSERT INTO collate4t4 VALUES( 'b', 'b' );
                    166:     INSERT INTO collate4t4 VALUES( NULL, NULL );
                    167:     INSERT INTO collate4t4 VALUES( 'B', 'B' );
                    168:     INSERT INTO collate4t4 VALUES( 'A', 'A' );
                    169:     CREATE INDEX collate4i3 ON collate4t4(a COLLATE TEXT);
                    170:     CREATE INDEX collate4i4 ON collate4t4(b COLLATE NOCASE);
                    171:   }
                    172: } {}
                    173: do_test collate4-1.1.22 {
                    174:   cksort {SELECT a FROM collate4t4 ORDER BY a}
                    175: } {{} a A b B sort}
                    176: do_test collate4-1.1.23 {
                    177:   cksort {SELECT a FROM collate4t4 ORDER BY a COLLATE NOCASE}
                    178: } {{} a A b B sort}
                    179: do_test collate4-1.1.24 {
                    180:   cksort {SELECT a FROM collate4t4 ORDER BY a COLLATE TEXT}
                    181: } {{} A B a b nosort}
                    182: do_test collate4-1.1.25 {
                    183:   cksort {SELECT b FROM collate4t4 ORDER BY b}
                    184: } {{} A B a b sort}
                    185: do_test collate4-1.1.26 {
                    186:   cksort {SELECT b FROM collate4t4 ORDER BY b COLLATE TEXT}
                    187: } {{} A B a b sort}
                    188: do_test collate4-1.1.27 {
                    189:   cksort {SELECT b FROM collate4t4 ORDER BY b COLLATE NOCASE}
                    190: } {{} a A b B nosort}
                    191: 
                    192: do_test collate4-1.1.30 {
                    193:   execsql {
                    194:     DROP TABLE collate4t1;
                    195:     DROP TABLE collate4t2;
                    196:     DROP TABLE collate4t3;
                    197:     DROP TABLE collate4t4;
                    198:   }
                    199: } {}
                    200: 
                    201: do_test collate4-1.2.0 {
                    202:   execsql {
                    203:     CREATE TABLE collate4t1(a COLLATE NOCASE, b COLLATE TEXT);
                    204:     INSERT INTO collate4t1 VALUES( 'a', 'a' );
                    205:     INSERT INTO collate4t1 VALUES( 'b', 'b' );
                    206:     INSERT INTO collate4t1 VALUES( NULL, NULL );
                    207:     INSERT INTO collate4t1 VALUES( 'B', 'B' );
                    208:     INSERT INTO collate4t1 VALUES( 'A', 'A' );
                    209:     CREATE INDEX collate4i1 ON collate4t1(a, b);
                    210:   }
                    211: } {}
                    212: do_test collate4-1.2.1 {
                    213:   cksort {SELECT a FROM collate4t1 ORDER BY a}
                    214: } {{} A a B b nosort}
                    215: do_test collate4-1.2.2 {
                    216:   cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE nocase}
                    217: } {{} A a B b nosort}
                    218: do_test collate4-1.2.3 {
                    219:   cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE text}
                    220: } {{} A B a b sort}
                    221: do_test collate4-1.2.4 {
                    222:   cksort {SELECT a FROM collate4t1 ORDER BY a, b}
                    223: } {{} A a B b nosort}
                    224: do_test collate4-1.2.5 {
                    225:   cksort {SELECT a FROM collate4t1 ORDER BY a, b COLLATE nocase}
                    226: } {{} a A b B sort}
                    227: do_test collate4-1.2.6 {
                    228:   cksort {SELECT a FROM collate4t1 ORDER BY a, b COLLATE text}
                    229: } {{} A a B b nosort}
                    230: 
                    231: do_test collate4-1.2.7 {
                    232:   execsql {
                    233:     CREATE TABLE collate4t2(
                    234:       a COLLATE NOCASE, 
                    235:       b COLLATE TEXT, 
                    236:       PRIMARY KEY(a, b)
                    237:     );
                    238:     INSERT INTO collate4t2 VALUES( 'a', 'a' );
                    239:     INSERT INTO collate4t2 VALUES( NULL, NULL );
                    240:     INSERT INTO collate4t2 VALUES( 'B', 'B' );
                    241:   }
                    242: } {}
                    243: do_test collate4-1.2.8 {
                    244:   cksort {SELECT a FROM collate4t2 ORDER BY a}
                    245: } {{} a B nosort}
                    246: do_test collate4-1.2.9 {
                    247:   cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE nocase}
                    248: } {{} a B nosort}
                    249: do_test collate4-1.2.10 {
                    250:   cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE text}
                    251: } {{} B a sort}
                    252: do_test collate4-1.2.11 {
                    253:   cksort {SELECT a FROM collate4t2 ORDER BY a, b}
                    254: } {{} a B nosort}
                    255: do_test collate4-1.2.12 {
                    256:   cksort {SELECT a FROM collate4t2 ORDER BY a, b COLLATE nocase}
                    257: } {{} a B sort}
                    258: do_test collate4-1.2.13 {
                    259:   cksort {SELECT a FROM collate4t2 ORDER BY a, b COLLATE text}
                    260: } {{} a B nosort}
                    261: 
                    262: do_test collate4-1.2.14 {
                    263:   execsql {
                    264:     CREATE TABLE collate4t3(a COLLATE NOCASE, b COLLATE TEXT);
                    265:     INSERT INTO collate4t3 VALUES( 'a', 'a' );
                    266:     INSERT INTO collate4t3 VALUES( 'b', 'b' );
                    267:     INSERT INTO collate4t3 VALUES( NULL, NULL );
                    268:     INSERT INTO collate4t3 VALUES( 'B', 'B' );
                    269:     INSERT INTO collate4t3 VALUES( 'A', 'A' );
                    270:     CREATE INDEX collate4i2 ON collate4t3(a COLLATE TEXT, b COLLATE NOCASE);
                    271:   }
                    272: } {}
                    273: do_test collate4-1.2.15 {
                    274:   cksort {SELECT a FROM collate4t3 ORDER BY a}
                    275: } {{} a A b B sort}
                    276: do_test collate4-1.2.16 {
                    277:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE nocase}
                    278: } {{} a A b B sort}
                    279: do_test collate4-1.2.17 {
                    280:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text}
                    281: } {{} A B a b nosort}
                    282: do_test collate4-1.2.18 {
                    283:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b}
                    284: } {{} A B a b sort}
                    285: do_test collate4-1.2.19 {
                    286:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b COLLATE nocase}
                    287: } {{} A B a b nosort}
                    288: do_test collate4-1.2.20 {
                    289:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b COLLATE text}
                    290: } {{} A B a b sort}
                    291: do_test collate4-1.2.21 {
                    292:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text DESC}
                    293: } {b a B A {} nosort}
                    294: do_test collate4-1.2.22 {
                    295:   cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text DESC, b}
                    296: } {b a B A {} sort}
                    297: do_test collate4-1.2.23 {
                    298:   cksort {SELECT a FROM collate4t3 
                    299:             ORDER BY a COLLATE text DESC, b COLLATE nocase}
                    300: } {b a B A {} sort}
                    301: do_test collate4-1.2.24 {
                    302:   cksort {SELECT a FROM collate4t3 
                    303:             ORDER BY a COLLATE text DESC, b COLLATE nocase DESC}
                    304: } {b a B A {} nosort}
                    305: 
                    306: do_test collate4-1.2.25 {
                    307:   execsql {
                    308:     DROP TABLE collate4t1;
                    309:     DROP TABLE collate4t2;
                    310:     DROP TABLE collate4t3;
                    311:   }
                    312: } {}
                    313: 
                    314: #
                    315: # These tests - collate4-2.* - check that indices are correctly
                    316: # selected or not selected to implement WHERE clauses when user 
                    317: # defined collation sequences are involved. 
                    318: #
                    319: # Indices may optimise WHERE clauses using <, >, <=, >=, = or IN
                    320: # operators.
                    321: #
                    322: do_test collate4-2.1.0 {
                    323:   execsql {
                    324:     PRAGMA automatic_index=OFF;
                    325:     CREATE TABLE collate4t1(a COLLATE NOCASE);
                    326:     CREATE TABLE collate4t2(b COLLATE TEXT);
                    327: 
                    328:     INSERT INTO collate4t1 VALUES('a');
                    329:     INSERT INTO collate4t1 VALUES('A');
                    330:     INSERT INTO collate4t1 VALUES('b');
                    331:     INSERT INTO collate4t1 VALUES('B');
                    332:     INSERT INTO collate4t1 VALUES('c');
                    333:     INSERT INTO collate4t1 VALUES('C');
                    334:     INSERT INTO collate4t1 VALUES('d');
                    335:     INSERT INTO collate4t1 VALUES('D');
                    336:     INSERT INTO collate4t1 VALUES('e');
                    337:     INSERT INTO collate4t1 VALUES('D');
                    338: 
                    339:     INSERT INTO collate4t2 VALUES('A');
                    340:     INSERT INTO collate4t2 VALUES('Z');
                    341:   }
                    342: } {}
                    343: do_test collate4-2.1.1 {
                    344:   count {
                    345:     SELECT * FROM collate4t2, collate4t1 WHERE a = b;
                    346:   }
                    347: } {A a A A 19}
                    348: do_test collate4-2.1.2 {
                    349:   execsql {
                    350:     CREATE INDEX collate4i1 ON collate4t1(a);
                    351:   }
                    352:   count {
                    353:     SELECT * FROM collate4t2, collate4t1 WHERE a = b;
                    354:   }
                    355: } {A a A A 5}
                    356: do_test collate4-2.1.3 {
                    357:   count {
                    358:     SELECT * FROM collate4t2, collate4t1 WHERE b = a;
                    359:   }
                    360: } {A A 19}
                    361: do_test collate4-2.1.4 {
                    362:   execsql {
                    363:     DROP INDEX collate4i1;
                    364:     CREATE INDEX collate4i1 ON collate4t1(a COLLATE TEXT);
                    365:   }
                    366:   count {
                    367:     SELECT * FROM collate4t2, collate4t1 WHERE a = b;
                    368:   }
                    369: } {A a A A 19}
                    370: do_test collate4-2.1.5 {
                    371:   count {
                    372:     SELECT * FROM collate4t2, collate4t1 WHERE b = a;
                    373:   }
                    374: } {A A 4}
                    375: ifcapable subquery {
                    376:   do_test collate4-2.1.6 {
                    377:     count {
                    378:       SELECT a FROM collate4t1 WHERE a IN (SELECT * FROM collate4t2);
                    379:     }
                    380:   } {a A 10}
                    381:   do_test collate4-2.1.7 {
                    382:     execsql {
                    383:       DROP INDEX collate4i1;
                    384:       CREATE INDEX collate4i1 ON collate4t1(a);
                    385:     }
                    386:     count {
                    387:       SELECT a FROM collate4t1 WHERE a IN (SELECT * FROM collate4t2);
                    388:     }
                    389:   } {a A 6}
                    390:   do_test collate4-2.1.8 {
                    391:     count {
                    392:       SELECT a FROM collate4t1 WHERE a IN ('z', 'a');
                    393:     }
                    394:   } {a A 5}
                    395:   do_test collate4-2.1.9 {
                    396:     execsql {
                    397:       DROP INDEX collate4i1;
                    398:       CREATE INDEX collate4i1 ON collate4t1(a COLLATE TEXT);
                    399:     }
                    400:     count {
                    401:       SELECT a FROM collate4t1 WHERE a IN ('z', 'a');
                    402:     }
                    403:   } {a A 9}
                    404: }
                    405: do_test collate4-2.1.10 {
                    406:   execsql {
                    407:     DROP TABLE collate4t1;
                    408:     DROP TABLE collate4t2;
                    409:   }
                    410: } {}
                    411: 
                    412: do_test collate4-2.2.0 {
                    413:   execsql {
                    414:     CREATE TABLE collate4t1(a COLLATE nocase, b COLLATE text, c);
                    415:     CREATE TABLE collate4t2(a COLLATE nocase, b COLLATE text, c COLLATE TEXT);
                    416: 
                    417:     INSERT INTO collate4t1 VALUES('0', '0', '0');
                    418:     INSERT INTO collate4t1 VALUES('0', '0', '1');
                    419:     INSERT INTO collate4t1 VALUES('0', '1', '0');
                    420:     INSERT INTO collate4t1 VALUES('0', '1', '1');
                    421:     INSERT INTO collate4t1 VALUES('1', '0', '0');
                    422:     INSERT INTO collate4t1 VALUES('1', '0', '1');
                    423:     INSERT INTO collate4t1 VALUES('1', '1', '0');
                    424:     INSERT INTO collate4t1 VALUES('1', '1', '1');
                    425:     insert into collate4t2 SELECT * FROM collate4t1;
                    426:   }
                    427: } {}
                    428: do_test collate4-2.2.1 {
                    429:   count {
                    430:     SELECT * FROM collate4t2 NOT INDEXED NATURAL JOIN collate4t1 NOT INDEXED;
                    431:   }
                    432: } {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 63}
                    433: do_test collate4-2.2.1b {
                    434:   execsql {
                    435:     CREATE INDEX collate4i1 ON collate4t1(a, b, c);
                    436:   }
                    437:   count {
                    438:     SELECT * FROM collate4t2 NATURAL JOIN collate4t1;
                    439:   }
                    440: } {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 29}
                    441: do_test collate4-2.2.2 {
                    442:   execsql {
                    443:     DROP INDEX collate4i1;
                    444:     CREATE INDEX collate4i1 ON collate4t1(a, b, c COLLATE text);
                    445:   }
                    446:   count {
                    447:     SELECT * FROM collate4t2 NATURAL JOIN collate4t1;
                    448:   }
                    449: } {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 22}
                    450: 
                    451: do_test collate4-2.2.10 {
                    452:   execsql {
                    453:     DROP TABLE collate4t1;
                    454:     DROP TABLE collate4t2;
                    455:   }
                    456: } {}
                    457: 
                    458: #
                    459: # These tests - collate4-3.* verify that indices that implement
                    460: # UNIQUE and PRIMARY KEY constraints operate correctly with user
                    461: # defined collation sequences.
                    462: #
                    463: do_test collate4-3.0 {
                    464:   execsql {
                    465:     CREATE TABLE collate4t1(a PRIMARY KEY COLLATE NOCASE);
                    466:   }
                    467: } {}
                    468: do_test collate4-3.1 {
                    469:   catchsql {
                    470:     INSERT INTO collate4t1 VALUES('abc');
                    471:     INSERT INTO collate4t1 VALUES('ABC');
                    472:   }
                    473: } {1 {column a is not unique}}
                    474: do_test collate4-3.2 {
                    475:   execsql {
                    476:     SELECT * FROM collate4t1;
                    477:   }
                    478: } {abc}
                    479: do_test collate4-3.3 {
                    480:   catchsql {
                    481:     INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
                    482:   }
                    483: } {1 {column a is not unique}}
                    484: do_test collate4-3.4 {
                    485:   catchsql {
                    486:     INSERT INTO collate4t1 VALUES(1);
                    487:     UPDATE collate4t1 SET a = 'abc';
                    488:   }
                    489: } {1 {column a is not unique}}
                    490: do_test collate4-3.5 {
                    491:   execsql {
                    492:     DROP TABLE collate4t1;
                    493:     CREATE TABLE collate4t1(a COLLATE NOCASE UNIQUE);
                    494:   }
                    495: } {}
                    496: do_test collate4-3.6 {
                    497:   catchsql {
                    498:     INSERT INTO collate4t1 VALUES('abc');
                    499:     INSERT INTO collate4t1 VALUES('ABC');
                    500:   }
                    501: } {1 {column a is not unique}}
                    502: do_test collate4-3.7 {
                    503:   execsql {
                    504:     SELECT * FROM collate4t1;
                    505:   }
                    506: } {abc}
                    507: do_test collate4-3.8 {
                    508:   catchsql {
                    509:     INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
                    510:   }
                    511: } {1 {column a is not unique}}
                    512: do_test collate4-3.9 {
                    513:   catchsql {
                    514:     INSERT INTO collate4t1 VALUES(1);
                    515:     UPDATE collate4t1 SET a = 'abc';
                    516:   }
                    517: } {1 {column a is not unique}}
                    518: do_test collate4-3.10 {
                    519:   execsql {
                    520:     DROP TABLE collate4t1;
                    521:     CREATE TABLE collate4t1(a);
                    522:     CREATE UNIQUE INDEX collate4i1 ON collate4t1(a COLLATE NOCASE);
                    523:   }
                    524: } {}
                    525: do_test collate4-3.11 {
                    526:   catchsql {
                    527:     INSERT INTO collate4t1 VALUES('abc');
                    528:     INSERT INTO collate4t1 VALUES('ABC');
                    529:   }
                    530: } {1 {column a is not unique}}
                    531: do_test collate4-3.12 {
                    532:   execsql {
                    533:     SELECT * FROM collate4t1;
                    534:   }
                    535: } {abc}
                    536: do_test collate4-3.13 {
                    537:   catchsql {
                    538:     INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
                    539:   }
                    540: } {1 {column a is not unique}}
                    541: do_test collate4-3.14 {
                    542:   catchsql {
                    543:     INSERT INTO collate4t1 VALUES(1);
                    544:     UPDATE collate4t1 SET a = 'abc';
                    545:   }
                    546: } {1 {column a is not unique}}
                    547: 
                    548: do_test collate4-3.15 {
                    549:   execsql {
                    550:     DROP TABLE collate4t1;
                    551:   }
                    552: } {}
                    553: 
                    554: # Mimic the SQLite 2 collation type NUMERIC.
                    555: db collate numeric numeric_collate
                    556: proc numeric_collate {lhs rhs} {
                    557:   if {$lhs == $rhs} {return 0} 
                    558:   return [expr ($lhs>$rhs)?1:-1]
                    559: }
                    560: 
                    561: #
                    562: # These tests - collate4-4.* check that min() and max() only ever 
                    563: # use indices constructed with built-in collation type numeric.
                    564: #
                    565: # CHANGED:  min() and max() now use the collation type. If there
                    566: # is an indice that can be used, it is used.
                    567: #
                    568: do_test collate4-4.0 {
                    569:   execsql {
                    570:     CREATE TABLE collate4t1(a COLLATE TEXT);
                    571:     INSERT INTO collate4t1 VALUES('2');
                    572:     INSERT INTO collate4t1 VALUES('10');
                    573:     INSERT INTO collate4t1 VALUES('20');
                    574:     INSERT INTO collate4t1 VALUES('104');
                    575:   }
                    576: } {}
                    577: do_test collate4-4.1 {
                    578:   count {
                    579:     SELECT max(a) FROM collate4t1
                    580:   }
                    581: } {20 3}
                    582: do_test collate4-4.2 {
                    583:   count {
                    584:     SELECT min(a) FROM collate4t1
                    585:   }
                    586: } {10 3}
                    587: do_test collate4-4.3 {
                    588:   # Test that the index with collation type TEXT is used.
                    589:   execsql {
                    590:     CREATE INDEX collate4i1 ON collate4t1(a);
                    591:   }
                    592:   count {
                    593:     SELECT min(a) FROM collate4t1;
                    594:   }
                    595: } {10 1}
                    596: do_test collate4-4.4 {
                    597:   count {
                    598:     SELECT max(a) FROM collate4t1;
                    599:   }
                    600: } {20 0}
                    601: do_test collate4-4.5 {
                    602:   # Test that the index with collation type NUMERIC is not used.
                    603:   execsql {
                    604:     DROP INDEX collate4i1;
                    605:     CREATE INDEX collate4i1 ON collate4t1(a COLLATE NUMERIC);
                    606:   }
                    607:   count {
                    608:     SELECT min(a) FROM collate4t1;
                    609:   }
                    610: } {10 3}
                    611: do_test collate4-4.6 {
                    612:   count {
                    613:     SELECT max(a) FROM collate4t1;
                    614:   }
                    615: } {20 3}
                    616: do_test collate4-4.7 {
                    617:   execsql {
                    618:     DROP TABLE collate4t1;
                    619:   }
                    620: } {}
                    621: 
                    622: # Also test the scalar min() and max() functions.
                    623: #
                    624: do_test collate4-4.8 {
                    625:   execsql {
                    626:     CREATE TABLE collate4t1(a COLLATE TEXT, b COLLATE NUMERIC);
                    627:     INSERT INTO collate4t1 VALUES('11', '101');
                    628:     INSERT INTO collate4t1 VALUES('101', '11')
                    629:   }
                    630: } {}
                    631: do_test collate4-4.9 {
                    632:   execsql {
                    633:     SELECT max(a, b) FROM collate4t1;
                    634:   }
                    635: } {11 11}
                    636: do_test collate4-4.10 {
                    637:   execsql {
                    638:     SELECT max(b, a) FROM collate4t1;
                    639:   }
                    640: } {101 101}
                    641: do_test collate4-4.11 {
                    642:   execsql {
                    643:     SELECT max(a, '101') FROM collate4t1;
                    644:   }
                    645: } {11 101}
                    646: do_test collate4-4.12 {
                    647:   execsql {
                    648:     SELECT max('101', a) FROM collate4t1;
                    649:   }
                    650: } {11 101}
                    651: do_test collate4-4.13 {
                    652:   execsql {
                    653:     SELECT max(b, '101') FROM collate4t1;
                    654:   }
                    655: } {101 101}
                    656: do_test collate4-4.14 {
                    657:   execsql {
                    658:     SELECT max('101', b) FROM collate4t1;
                    659:   }
                    660: } {101 101}
                    661: 
                    662: do_test collate4-4.15 {
                    663:   execsql {
                    664:     DROP TABLE collate4t1;
                    665:   }
                    666: } {}
                    667: 
                    668: #
                    669: # These tests - collate4.6.* - ensure that implict INTEGER PRIMARY KEY 
                    670: # indices do not confuse collation sequences. 
                    671: #
                    672: # These indices are never used for sorting in SQLite. And you can't
                    673: # create another index on an INTEGER PRIMARY KEY column, so we don't have 
                    674: # to test that.
                    675: # (Revised 2004-Nov-22):  The ROWID can be used for sorting now.
                    676: #
                    677: do_test collate4-6.0 {
                    678:   execsql {
                    679:     CREATE TABLE collate4t1(a INTEGER PRIMARY KEY);
                    680:     INSERT INTO collate4t1 VALUES(101);
                    681:     INSERT INTO collate4t1 VALUES(10);
                    682:     INSERT INTO collate4t1 VALUES(15);
                    683:   }
                    684: } {}
                    685: do_test collate4-6.1 {
                    686:   cksort {
                    687:     SELECT * FROM collate4t1 ORDER BY 1;
                    688:   }
                    689: } {10 15 101 nosort}
                    690: do_test collate4-6.2 {
                    691:   cksort {
                    692:     SELECT * FROM collate4t1 ORDER BY oid;
                    693:   }
                    694: } {10 15 101 nosort}
                    695: do_test collate4-6.3 {
                    696:   cksort {
                    697:     SELECT * FROM collate4t1 ORDER BY oid||'' COLLATE TEXT;
                    698:   }
                    699: } {10 101 15 sort}
                    700: 
                    701: finish_test

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