xref: /sqlite-3.40.0/test/collate6.test (revision eb5453d1)
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