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 154