Annotation of embedaddon/sqlite3/test/collate6.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 collation sequences in concert with triggers.
        !            14: #
        !            15: # $Id: collate6.test,v 1.4 2007/07/30 14:40:48 danielk1977 Exp $
        !            16: 
        !            17: set testdir [file dirname $argv0]
        !            18: source $testdir/tester.tcl
        !            19: 
        !            20: # There are no tests in this file that will work without
        !            21: # trigger support.
        !            22: #
        !            23: ifcapable {!trigger} {
        !            24:   finish_test
        !            25:   return
        !            26: }
        !            27: 
        !            28: # Create a case-insensitive collation type NOCASE for use in testing. 
        !            29: # Normally, capital letters are less than their lower-case counterparts.
        !            30: db collate NOCASE nocase_collate
        !            31: proc nocase_collate {a b} {
        !            32:   return [string compare -nocase $a $b]
        !            33: }
        !            34: 
        !            35: #
        !            36: # Tests are organized as follows:
        !            37: # collate6-1.* - triggers.
        !            38: #
        !            39: 
        !            40: do_test collate6-1.0 {
        !            41:   execsql {
        !            42:     CREATE TABLE collate6log(a, b);
        !            43:     CREATE TABLE collate6tab(a COLLATE NOCASE, b COLLATE BINARY);
        !            44:   }
        !            45: } {}
        !            46: 
        !            47: # Test that the default collation sequence applies to new.* references 
        !            48: # in WHEN clauses.
        !            49: do_test collate6-1.1 {
        !            50:   execsql {
        !            51:     CREATE TRIGGER collate6trig BEFORE INSERT ON collate6tab 
        !            52:       WHEN new.a = 'a' BEGIN
        !            53:         INSERT INTO collate6log VALUES(new.a, new.b);
        !            54:     END;
        !            55:   }
        !            56: } {}
        !            57: do_test collate6-1.2 {
        !            58:   execsql {
        !            59:     INSERT INTO collate6tab VALUES('a', 'b');
        !            60:     SELECT * FROM collate6log;
        !            61:   }
        !            62: } {a b}
        !            63: do_test collate6-1.3 {
        !            64:   execsql {
        !            65:     INSERT INTO collate6tab VALUES('A', 'B');
        !            66:     SELECT * FROM collate6log;
        !            67:   }
        !            68: } {a b A B}
        !            69: do_test collate6-1.4 {
        !            70:   execsql {
        !            71:     DROP TRIGGER collate6trig;
        !            72:     DELETE FROM collate6log;
        !            73:   } 
        !            74: } {}
        !            75: 
        !            76: # Test that the default collation sequence applies to new.* references 
        !            77: # in the body of triggers.
        !            78: do_test collate6-1.5 {
        !            79:   execsql {
        !            80:     CREATE TRIGGER collate6trig BEFORE INSERT ON collate6tab BEGIN
        !            81:       INSERT INTO collate6log VALUES(new.a='a', new.b='b');
        !            82:     END;
        !            83:   }
        !            84: } {}
        !            85: do_test collate6-1.6 {
        !            86:   execsql {
        !            87:     INSERT INTO collate6tab VALUES('a', 'b');
        !            88:     SELECT * FROM collate6log;
        !            89:   }
        !            90: } {1 1}
        !            91: do_test collate6-1.7 {
        !            92:   execsql {
        !            93:     INSERT INTO collate6tab VALUES('A', 'B');
        !            94:     SELECT * FROM collate6log;
        !            95:   }
        !            96: } {1 1 1 0}
        !            97: do_test collate6-1.8 {
        !            98:   execsql {
        !            99:     DROP TRIGGER collate6trig;
        !           100:     DELETE FROM collate6log;
        !           101:   } 
        !           102: } {}
        !           103: 
        !           104: do_test collate6-1.9 {
        !           105:   execsql {
        !           106:     DROP TABLE collate6tab;
        !           107:   }
        !           108: } {}
        !           109: 
        !           110: # Test that an explicit collation sequence overrides an implicit 
        !           111: # one attached to a 'new' reference.
        !           112: #
        !           113: do_test collate6-2.1 {
        !           114:   execsql {
        !           115:     CREATE TABLE abc(a COLLATE binary, b, c);
        !           116:     CREATE TABLE def(a, b, c);
        !           117:     CREATE TRIGGER abc_t1 AFTER INSERT ON abc BEGIN
        !           118:       INSERT INTO def SELECT * FROM abc WHERE a < new.a COLLATE nocase;
        !           119:     END
        !           120:   }
        !           121: } {}
        !           122: do_test collate6-2.2 {
        !           123:   execsql {
        !           124:     INSERT INTO abc VALUES('One', 'Two', 'Three');
        !           125:     INSERT INTO abc VALUES('one', 'two', 'three');
        !           126:     SELECT * FROM def;
        !           127:   }
        !           128: } {}
        !           129: do_test collate6-2.3 {
        !           130:   execsql {
        !           131:     UPDATE abc SET a = 'four' WHERE a = 'one';
        !           132:     CREATE TRIGGER abc_t2 AFTER UPDATE ON abc BEGIN
        !           133:       INSERT INTO def SELECT * FROM abc WHERE a < new.a COLLATE nocase;
        !           134:     END;
        !           135:     SELECT * FROM def;
        !           136:   }
        !           137: } {}
        !           138: 
        !           139: # At one point the 6-3.2 (but not 6-3.1) was causing an assert() to fail.
        !           140: #
        !           141: do_test collate6-3.1 {
        !           142:   execsql {
        !           143:     SELECT 1 FROM sqlite_master WHERE name COLLATE nocase = 'hello';
        !           144:   }
        !           145: } {}
        !           146: do_test collate6-3.2 {
        !           147:   execsql {
        !           148:     SELECT 1 FROM sqlite_master WHERE 'hello' = name COLLATE nocase;
        !           149:   }
        !           150: } {}
        !           151: 
        !           152: 
        !           153: finish_test

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