Annotation of embedaddon/sqlite3/test/collate5.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 file is testing DISTINCT, UNION, INTERSECT and EXCEPT
                     14: # SELECT statements that use user-defined collation sequences. Also
                     15: # GROUP BY clauses that use user-defined collation sequences.
                     16: #
                     17: # $Id: collate5.test,v 1.7 2008/09/16 11:58:20 drh Exp $
                     18: 
                     19: set testdir [file dirname $argv0]
                     20: source $testdir/tester.tcl
                     21: 
                     22: 
                     23: #
                     24: # Tests are organised as follows:
                     25: # collate5-1.* - DISTINCT
                     26: # collate5-2.* - Compound SELECT
                     27: # collate5-3.* - ORDER BY on compound SELECT
                     28: # collate5-4.* - GROUP BY
                     29: 
                     30: # Create the collation sequence 'TEXT', purely for asthetic reasons. The
                     31: # test cases in this script could just as easily use BINARY.
                     32: db collate TEXT [list string compare]
                     33: 
                     34: # Mimic the SQLite 2 collation type NUMERIC.
                     35: db collate numeric numeric_collate
                     36: proc numeric_collate {lhs rhs} {
                     37:   if {$lhs == $rhs} {return 0} 
                     38:   return [expr ($lhs>$rhs)?1:-1]
                     39: }
                     40: 
                     41: #
                     42: # These tests - collate5-1.* - focus on the DISTINCT keyword.
                     43: #
                     44: do_test collate5-1.0 {
                     45:   execsql {
                     46:     CREATE TABLE collate5t1(a COLLATE nocase, b COLLATE text);
                     47: 
                     48:     INSERT INTO collate5t1 VALUES('a', 'apple');
                     49:     INSERT INTO collate5t1 VALUES('A', 'Apple');
                     50:     INSERT INTO collate5t1 VALUES('b', 'banana');
                     51:     INSERT INTO collate5t1 VALUES('B', 'banana');
                     52:     INSERT INTO collate5t1 VALUES('n', NULL);
                     53:     INSERT INTO collate5t1 VALUES('N', NULL);
                     54:   } 
                     55: } {}
                     56: do_test collate5-1.1 {
                     57:   execsql {
                     58:     SELECT DISTINCT a FROM collate5t1;
                     59:   }
                     60: } {a b n}
                     61: do_test collate5-1.2 {
                     62:   execsql {
                     63:     SELECT DISTINCT b FROM collate5t1;
                     64:   }
                     65: } {apple Apple banana {}}
                     66: do_test collate5-1.3 {
                     67:   execsql {
                     68:     SELECT DISTINCT a, b FROM collate5t1;
                     69:   }
                     70: } {a apple A Apple b banana n {}}
                     71: 
                     72: # Ticket #3376
                     73: #
                     74: do_test collate5-1.11 {
                     75:   execsql {
                     76:     CREATE TABLE tkt3376(a COLLATE nocase PRIMARY KEY);
                     77:     INSERT INTO tkt3376 VALUES('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz');
                     78:     INSERT INTO tkt3376 VALUES('ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789');
                     79:     SELECT DISTINCT a FROM tkt3376;
                     80:   }
                     81: } {abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789ABXYZ012234567890123456789}
                     82: do_test collate5-1.12 {
                     83:   sqlite3 db2 :memory:
                     84:   db2 eval {
                     85:     PRAGMA encoding=UTF16le;
                     86:     CREATE TABLE tkt3376(a COLLATE nocase PRIMARY KEY);
                     87:     INSERT INTO tkt3376 VALUES('abc');
                     88:     INSERT INTO tkt3376 VALUES('ABX');
                     89:     SELECT DISTINCT a FROM tkt3376;
                     90:   }
                     91: } {abc ABX}
                     92: catch {db2 close}
                     93: 
                     94: # The remainder of this file tests compound SELECT statements.
                     95: # Omit it if the library is compiled such that they are omitted.
                     96: #
                     97: ifcapable !compound {
                     98:   finish_test
                     99:   return
                    100: }
                    101: 
                    102: #
                    103: # Tests named collate5-2.* focus on UNION, EXCEPT and INTERSECT
                    104: # queries that use user-defined collation sequences.
                    105: #
                    106: # collate5-2.1.* - UNION
                    107: # collate5-2.2.* - INTERSECT
                    108: # collate5-2.3.* - EXCEPT
                    109: #
                    110: do_test collate5-2.0 {
                    111:   execsql {
                    112:     CREATE TABLE collate5t2(a COLLATE text, b COLLATE nocase);
                    113: 
                    114:     INSERT INTO collate5t2 VALUES('a', 'apple');
                    115:     INSERT INTO collate5t2 VALUES('A', 'apple');
                    116:     INSERT INTO collate5t2 VALUES('b', 'banana');
                    117:     INSERT INTO collate5t2 VALUES('B', 'Banana');
                    118:   } 
                    119: } {}
                    120: 
                    121: do_test collate5-2.1.1 {
                    122:   execsql {
                    123:     SELECT a FROM collate5t1 UNION select a FROM collate5t2;
                    124:   }
                    125: } {A B N}
                    126: do_test collate5-2.1.2 {
                    127:   execsql {
                    128:     SELECT a FROM collate5t2 UNION select a FROM collate5t1;
                    129:   }
                    130: } {A B N a b n}
                    131: do_test collate5-2.1.3 {
                    132:   execsql {
                    133:     SELECT a, b FROM collate5t1 UNION select a, b FROM collate5t2;
                    134:   }
                    135: } {A Apple A apple B Banana b banana N {}}
                    136: do_test collate5-2.1.4 {
                    137:   execsql {
                    138:     SELECT a, b FROM collate5t2 UNION select a, b FROM collate5t1;
                    139:   }
                    140: } {A Apple B banana N {} a apple b banana n {}}
                    141: 
                    142: do_test collate5-2.2.1 {
                    143:   execsql {
                    144:     SELECT a FROM collate5t1 EXCEPT select a FROM collate5t2;
                    145:   }
                    146: } {N}
                    147: do_test collate5-2.2.2 {
                    148:   execsql {
                    149:     SELECT a FROM collate5t2 EXCEPT select a FROM collate5t1 WHERE a != 'a';
                    150:   }
                    151: } {A a}
                    152: do_test collate5-2.2.3 {
                    153:   execsql {
                    154:     SELECT a, b FROM collate5t1 EXCEPT select a, b FROM collate5t2;
                    155:   }
                    156: } {A Apple N {}}
                    157: do_test collate5-2.2.4 {
                    158:   execsql {
                    159:     SELECT a, b FROM collate5t2 EXCEPT select a, b FROM collate5t1 
                    160:       where a != 'a';
                    161:   }
                    162: } {A apple a apple}
                    163: 
                    164: do_test collate5-2.3.1 {
                    165:   execsql {
                    166:     SELECT a FROM collate5t1 INTERSECT select a FROM collate5t2;
                    167:   }
                    168: } {A B}
                    169: do_test collate5-2.3.2 {
                    170:   execsql {
                    171:     SELECT a FROM collate5t2 INTERSECT select a FROM collate5t1 WHERE a != 'a';
                    172:   }
                    173: } {B b}
                    174: do_test collate5-2.3.3 {
                    175:   execsql {
                    176:     SELECT a, b FROM collate5t1 INTERSECT select a, b FROM collate5t2;
                    177:   }
                    178: } {a apple B banana}
                    179: do_test collate5-2.3.4 {
                    180:   execsql {
                    181:     SELECT a, b FROM collate5t2 INTERSECT select a, b FROM collate5t1;
                    182:   }
                    183: } {A apple B Banana a apple b banana}
                    184: 
                    185: #
                    186: # This test ensures performs a UNION operation with a bunch of different
                    187: # length records. The goal is to test that the logic that compares records
                    188: # for the compound SELECT operators works with record lengths that lie
                    189: # either side of the troublesome 256 and 65536 byte marks.
                    190: #
                    191: set ::lens [list \
                    192:   0 1 2 3 4 5 6 7 8 9 \
                    193:   240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 \
                    194:   257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 \
                    195:   65520 65521 65522 65523 65524 65525 65526 65527 65528 65529 65530 \
                    196:   65531 65532 65533 65534 65535 65536 65537 65538 65539 65540 65541 \
                    197:   65542 65543 65544 65545 65546 65547 65548 65549 65550 65551 ]
                    198: do_test collate5-2.4.0 {
                    199:   execsql {
                    200:     BEGIN;
                    201:     CREATE TABLE collate5t3(a, b);
                    202:   }
                    203:   foreach ii $::lens { 
                    204:     execsql "INSERT INTO collate5t3 VALUES($ii, '[string repeat a $ii]');"
                    205:   }
                    206:   expr [llength [execsql {
                    207:     COMMIT;
                    208:     SELECT * FROM collate5t3 UNION SELECT * FROM collate5t3;
                    209:   }]] / 2
                    210: } [llength $::lens]
                    211: do_test collate5-2.4.1 {
                    212:   execsql {DROP TABLE collate5t3;}
                    213: } {}
                    214: unset ::lens
                    215: 
                    216: #
                    217: # These tests - collate5-3.* - focus on compound SELECT queries that 
                    218: # feature ORDER BY clauses.
                    219: #
                    220: do_test collate5-3.0 {
                    221:   execsql {
                    222:     SELECT a FROM collate5t1 UNION ALL SELECT a FROM collate5t2 ORDER BY 1;
                    223:   }
                    224: } {a A a A b B b B n N}
                    225: do_test collate5-3.1 {
                    226:   execsql {
                    227:     SELECT a FROM collate5t2 UNION ALL SELECT a FROM collate5t1 ORDER BY 1;
                    228:   }
                    229: } {A A B B N a a b b n}
                    230: do_test collate5-3.2 {
                    231:   execsql {
                    232:     SELECT a FROM collate5t1 UNION ALL SELECT a FROM collate5t2 
                    233:       ORDER BY 1 COLLATE TEXT;
                    234:   }
                    235: } {A A B B N a a b b n}
                    236: 
                    237: do_test collate5-3.3 {
                    238:   execsql {
                    239:     CREATE TABLE collate5t_cn(a COLLATE NUMERIC);
                    240:     CREATE TABLE collate5t_ct(a COLLATE TEXT);
                    241:     INSERT INTO collate5t_cn VALUES('1');
                    242:     INSERT INTO collate5t_cn VALUES('11');
                    243:     INSERT INTO collate5t_cn VALUES('101');
                    244:     INSERT INTO collate5t_ct SELECT * FROM collate5t_cn;
                    245:   }
                    246: } {}
                    247: do_test collate5-3.4 {
                    248:   execsql {
                    249:     SELECT a FROM collate5t_cn INTERSECT SELECT a FROM collate5t_ct ORDER BY 1;
                    250:   }
                    251: } {1 11 101}
                    252: do_test collate5-3.5 {
                    253:   execsql {
                    254:     SELECT a FROM collate5t_ct INTERSECT SELECT a FROM collate5t_cn ORDER BY 1;
                    255:   }
                    256: } {1 101 11}
                    257: 
                    258: do_test collate5-3.20 {
                    259:   execsql {
                    260:     DROP TABLE collate5t_cn;
                    261:     DROP TABLE collate5t_ct;
                    262:     DROP TABLE collate5t1;
                    263:     DROP TABLE collate5t2;
                    264:   }
                    265: } {}
                    266: 
                    267: do_test collate5-4.0 {
                    268:   execsql {
                    269:     CREATE TABLE collate5t1(a COLLATE NOCASE, b COLLATE NUMERIC); 
                    270:     INSERT INTO collate5t1 VALUES('a', '1');
                    271:     INSERT INTO collate5t1 VALUES('A', '1.0');
                    272:     INSERT INTO collate5t1 VALUES('b', '2');
                    273:     INSERT INTO collate5t1 VALUES('B', '3');
                    274:   }
                    275: } {}
                    276: do_test collate5-4.1 {
                    277:   string tolower [execsql {
                    278:     SELECT a, count(*) FROM collate5t1 GROUP BY a;
                    279:   }]
                    280: } {a 2 b 2}
                    281: do_test collate5-4.2 {
                    282:   execsql {
                    283:     SELECT a, b, count(*) FROM collate5t1 GROUP BY a, b ORDER BY a, b;
                    284:   }
                    285: } {A 1.0 2 b 2 1 B 3 1}
                    286: do_test collate5-4.3 {
                    287:   execsql {
                    288:     DROP TABLE collate5t1;
                    289:   }
                    290: } {}
                    291: 
                    292: finish_test

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