Annotation of embedaddon/sqlite3/test/collate5.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 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>