1dc1bdc4fSdanielk1977# 2dc1bdc4fSdanielk1977# 2001 September 15 3dc1bdc4fSdanielk1977# 4dc1bdc4fSdanielk1977# The author disclaims copyright to this source code. In place of 5dc1bdc4fSdanielk1977# a legal notice, here is a blessing: 6dc1bdc4fSdanielk1977# 7dc1bdc4fSdanielk1977# May you do good and not evil. 8dc1bdc4fSdanielk1977# May you find forgiveness for yourself and forgive others. 9dc1bdc4fSdanielk1977# May you share freely, never taking more than you give. 10dc1bdc4fSdanielk1977# 11dc1bdc4fSdanielk1977#*********************************************************************** 12dc1bdc4fSdanielk1977# This file implements regression tests for SQLite library. The 13dc1bdc4fSdanielk1977# focus of this script is collation sequences in concert with triggers. 14dc1bdc4fSdanielk1977# 15*eb5453d1Sdanielk1977# $Id: collate6.test,v 1.4 2007/07/30 14:40:48 danielk1977 Exp $ 16dc1bdc4fSdanielk1977 17dc1bdc4fSdanielk1977set testdir [file dirname $argv0] 18dc1bdc4fSdanielk1977source $testdir/tester.tcl 19dc1bdc4fSdanielk1977 20798da52cSdrh# There are no tests in this file that will work without 21798da52cSdrh# trigger support. 22798da52cSdrh# 23798da52cSdrhifcapable {!trigger} { 24798da52cSdrh finish_test 25798da52cSdrh return 26798da52cSdrh} 27798da52cSdrh 28dc1bdc4fSdanielk1977# Create a case-insensitive collation type NOCASE for use in testing. 29dc1bdc4fSdanielk1977# Normally, capital letters are less than their lower-case counterparts. 30dc1bdc4fSdanielk1977db collate NOCASE nocase_collate 31dc1bdc4fSdanielk1977proc nocase_collate {a b} { 32dc1bdc4fSdanielk1977 return [string compare -nocase $a $b] 33dc1bdc4fSdanielk1977} 34dc1bdc4fSdanielk1977 35dc1bdc4fSdanielk1977# 36dc1bdc4fSdanielk1977# Tests are organized as follows: 37dc1bdc4fSdanielk1977# collate6-1.* - triggers. 38dc1bdc4fSdanielk1977# 39dc1bdc4fSdanielk1977 40dc1bdc4fSdanielk1977do_test collate6-1.0 { 41dc1bdc4fSdanielk1977 execsql { 42dc1bdc4fSdanielk1977 CREATE TABLE collate6log(a, b); 43dc1bdc4fSdanielk1977 CREATE TABLE collate6tab(a COLLATE NOCASE, b COLLATE BINARY); 44dc1bdc4fSdanielk1977 } 45dc1bdc4fSdanielk1977} {} 46dc1bdc4fSdanielk1977 47dc1bdc4fSdanielk1977# Test that the default collation sequence applies to new.* references 48dc1bdc4fSdanielk1977# in WHEN clauses. 49dc1bdc4fSdanielk1977do_test collate6-1.1 { 50dc1bdc4fSdanielk1977 execsql { 51dc1bdc4fSdanielk1977 CREATE TRIGGER collate6trig BEFORE INSERT ON collate6tab 52dc1bdc4fSdanielk1977 WHEN new.a = 'a' BEGIN 53dc1bdc4fSdanielk1977 INSERT INTO collate6log VALUES(new.a, new.b); 54dc1bdc4fSdanielk1977 END; 55dc1bdc4fSdanielk1977 } 56dc1bdc4fSdanielk1977} {} 57dc1bdc4fSdanielk1977do_test collate6-1.2 { 58dc1bdc4fSdanielk1977 execsql { 59dc1bdc4fSdanielk1977 INSERT INTO collate6tab VALUES('a', 'b'); 60dc1bdc4fSdanielk1977 SELECT * FROM collate6log; 61dc1bdc4fSdanielk1977 } 62dc1bdc4fSdanielk1977} {a b} 63dc1bdc4fSdanielk1977do_test collate6-1.3 { 64dc1bdc4fSdanielk1977 execsql { 65dc1bdc4fSdanielk1977 INSERT INTO collate6tab VALUES('A', 'B'); 66dc1bdc4fSdanielk1977 SELECT * FROM collate6log; 67dc1bdc4fSdanielk1977 } 68dc1bdc4fSdanielk1977} {a b A B} 69dc1bdc4fSdanielk1977do_test collate6-1.4 { 70dc1bdc4fSdanielk1977 execsql { 71dc1bdc4fSdanielk1977 DROP TRIGGER collate6trig; 72dc1bdc4fSdanielk1977 DELETE FROM collate6log; 73dc1bdc4fSdanielk1977 } 74dc1bdc4fSdanielk1977} {} 75dc1bdc4fSdanielk1977 76dc1bdc4fSdanielk1977# Test that the default collation sequence applies to new.* references 77dc1bdc4fSdanielk1977# in the body of triggers. 78dc1bdc4fSdanielk1977do_test collate6-1.5 { 79dc1bdc4fSdanielk1977 execsql { 80dc1bdc4fSdanielk1977 CREATE TRIGGER collate6trig BEFORE INSERT ON collate6tab BEGIN 81dc1bdc4fSdanielk1977 INSERT INTO collate6log VALUES(new.a='a', new.b='b'); 82dc1bdc4fSdanielk1977 END; 83dc1bdc4fSdanielk1977 } 84dc1bdc4fSdanielk1977} {} 85dc1bdc4fSdanielk1977do_test collate6-1.6 { 86dc1bdc4fSdanielk1977 execsql { 87dc1bdc4fSdanielk1977 INSERT INTO collate6tab VALUES('a', 'b'); 88dc1bdc4fSdanielk1977 SELECT * FROM collate6log; 89dc1bdc4fSdanielk1977 } 90dc1bdc4fSdanielk1977} {1 1} 91dc1bdc4fSdanielk1977do_test collate6-1.7 { 92dc1bdc4fSdanielk1977 execsql { 93dc1bdc4fSdanielk1977 INSERT INTO collate6tab VALUES('A', 'B'); 94dc1bdc4fSdanielk1977 SELECT * FROM collate6log; 95dc1bdc4fSdanielk1977 } 96dc1bdc4fSdanielk1977} {1 1 1 0} 97dc1bdc4fSdanielk1977do_test collate6-1.8 { 98dc1bdc4fSdanielk1977 execsql { 99dc1bdc4fSdanielk1977 DROP TRIGGER collate6trig; 100dc1bdc4fSdanielk1977 DELETE FROM collate6log; 101dc1bdc4fSdanielk1977 } 102dc1bdc4fSdanielk1977} {} 103dc1bdc4fSdanielk1977 104dc1bdc4fSdanielk1977do_test collate6-1.9 { 105dc1bdc4fSdanielk1977 execsql { 106dc1bdc4fSdanielk1977 DROP TABLE collate6tab; 107dc1bdc4fSdanielk1977 } 108dc1bdc4fSdanielk1977} {} 109dc1bdc4fSdanielk1977 1100c3f607cSdanielk1977# Test that an explicit collation sequence overrides an implicit 1110c3f607cSdanielk1977# one attached to a 'new' reference. 1120c3f607cSdanielk1977# 1130c3f607cSdanielk1977do_test collate6-2.1 { 1140c3f607cSdanielk1977 execsql { 1150c3f607cSdanielk1977 CREATE TABLE abc(a COLLATE binary, b, c); 1160c3f607cSdanielk1977 CREATE TABLE def(a, b, c); 1170c3f607cSdanielk1977 CREATE TRIGGER abc_t1 AFTER INSERT ON abc BEGIN 1180c3f607cSdanielk1977 INSERT INTO def SELECT * FROM abc WHERE a < new.a COLLATE nocase; 1190c3f607cSdanielk1977 END 1200c3f607cSdanielk1977 } 1210c3f607cSdanielk1977} {} 1220c3f607cSdanielk1977do_test collate6-2.2 { 1230c3f607cSdanielk1977 execsql { 1240c3f607cSdanielk1977 INSERT INTO abc VALUES('One', 'Two', 'Three'); 1250c3f607cSdanielk1977 INSERT INTO abc VALUES('one', 'two', 'three'); 1260c3f607cSdanielk1977 SELECT * FROM def; 1270c3f607cSdanielk1977 } 1280c3f607cSdanielk1977} {} 1290c3f607cSdanielk1977do_test collate6-2.3 { 1300c3f607cSdanielk1977 execsql { 1310c3f607cSdanielk1977 UPDATE abc SET a = 'four' WHERE a = 'one'; 1320c3f607cSdanielk1977 CREATE TRIGGER abc_t2 AFTER UPDATE ON abc BEGIN 1330c3f607cSdanielk1977 INSERT INTO def SELECT * FROM abc WHERE a < new.a COLLATE nocase; 1340c3f607cSdanielk1977 END; 1350c3f607cSdanielk1977 SELECT * FROM def; 1360c3f607cSdanielk1977 } 1370c3f607cSdanielk1977} {} 1380c3f607cSdanielk1977 139*eb5453d1Sdanielk1977# At one point the 6-3.2 (but not 6-3.1) was causing an assert() to fail. 140*eb5453d1Sdanielk1977# 141*eb5453d1Sdanielk1977do_test collate6-3.1 { 142*eb5453d1Sdanielk1977 execsql { 143*eb5453d1Sdanielk1977 SELECT 1 FROM sqlite_master WHERE name COLLATE nocase = 'hello'; 144*eb5453d1Sdanielk1977 } 145*eb5453d1Sdanielk1977} {} 146*eb5453d1Sdanielk1977do_test collate6-3.2 { 147*eb5453d1Sdanielk1977 execsql { 148*eb5453d1Sdanielk1977 SELECT 1 FROM sqlite_master WHERE 'hello' = name COLLATE nocase; 149*eb5453d1Sdanielk1977 } 150*eb5453d1Sdanielk1977} {} 151*eb5453d1Sdanielk1977 152dc1bdc4fSdanielk1977 153dc1bdc4fSdanielk1977finish_test 154