xref: /sqlite-3.40.0/test/collate3.test (revision 65df68e8)
1dc1bdc4fSdanielk1977# 2001 September 15
2d2b65b9fSdanielk1977#
3dc1bdc4fSdanielk1977# The author disclaims copyright to this source code.  In place of
4dc1bdc4fSdanielk1977# a legal notice, here is a blessing:
5d2b65b9fSdanielk1977#
6dc1bdc4fSdanielk1977#    May you do good and not evil.
7dc1bdc4fSdanielk1977#    May you find forgiveness for yourself and forgive others.
8dc1bdc4fSdanielk1977#    May you share freely, never taking more than you give.
9dc1bdc4fSdanielk1977#
10dc1bdc4fSdanielk1977#***********************************************************************
11d2b65b9fSdanielk1977# This file implements regression tests for SQLite library.  The
12dc1bdc4fSdanielk1977# focus of this script is page cache subsystem.
13d2b65b9fSdanielk1977#
147d10d5a6Sdrh# $Id: collate3.test,v 1.13 2008/08/20 16:35:10 drh Exp $
15d2b65b9fSdanielk1977
16d2b65b9fSdanielk1977set testdir [file dirname $argv0]
17d2b65b9fSdanielk1977source $testdir/tester.tcl
18d2b65b9fSdanielk1977
19d2b65b9fSdanielk1977#
20d2b65b9fSdanielk1977# Tests are organised as follows:
21d2b65b9fSdanielk1977#
22d2b65b9fSdanielk1977# collate3.1.* - Errors related to unknown collation sequences.
23d2b65b9fSdanielk1977# collate3.2.* - Errors related to undefined collation sequences.
24d2b65b9fSdanielk1977# collate3.3.* - Writing to a table that has an index with an undefined c.s.
25d2b65b9fSdanielk1977# collate3.4.* - Misc errors.
26d2b65b9fSdanielk1977# collate3.5.* - Collation factory.
27d2b65b9fSdanielk1977#
28d2b65b9fSdanielk1977
29d2b65b9fSdanielk1977#
30d2b65b9fSdanielk1977# These tests ensure that when a user executes a statement with an
31d2b65b9fSdanielk1977# unknown collation sequence an error is returned.
32d2b65b9fSdanielk1977#
33d2b65b9fSdanielk1977do_test collate3-1.0 {
34d2b65b9fSdanielk1977  execsql {
35*65df68e8Sdrh    CREATE TABLE collate3t1(c1 UNIQUE);
36d2b65b9fSdanielk1977  }
37d2b65b9fSdanielk1977} {}
38d2b65b9fSdanielk1977do_test collate3-1.1 {
39d2b65b9fSdanielk1977  catchsql {
40d2b65b9fSdanielk1977    SELECT * FROM collate3t1 ORDER BY 1 collate garbage;
41d2b65b9fSdanielk1977  }
42d2b65b9fSdanielk1977} {1 {no such collation sequence: garbage}}
43*65df68e8Sdrhdo_test collate3-1.1.2 {
44*65df68e8Sdrh  catchsql {
45*65df68e8Sdrh    SELECT DISTINCT c1 COLLATE garbage FROM collate3t1;
46*65df68e8Sdrh  }
47*65df68e8Sdrh} {1 {no such collation sequence: garbage}}
48d2b65b9fSdanielk1977do_test collate3-1.2 {
49d2b65b9fSdanielk1977  catchsql {
50d2b65b9fSdanielk1977    CREATE TABLE collate3t2(c1 collate garbage);
51d2b65b9fSdanielk1977  }
52d2b65b9fSdanielk1977} {1 {no such collation sequence: garbage}}
53d2b65b9fSdanielk1977do_test collate3-1.3 {
54d2b65b9fSdanielk1977  catchsql {
55d2b65b9fSdanielk1977    CREATE INDEX collate3i1 ON collate3t1(c1 COLLATE garbage);
56d2b65b9fSdanielk1977  }
57d2b65b9fSdanielk1977} {1 {no such collation sequence: garbage}}
58d2b65b9fSdanielk1977
59d2b65b9fSdanielk1977execsql {
60d2b65b9fSdanielk1977  DROP TABLE collate3t1;
61d2b65b9fSdanielk1977}
62d2b65b9fSdanielk1977
63911ce418Sdanproc caseless {a b} { string compare -nocase $a $b }
64911ce418Sdando_test collate3-1.4 {
65911ce418Sdan  db collate caseless caseless
66911ce418Sdan  execsql {
67911ce418Sdan    CREATE TABLE t1(a COLLATE caseless);
68911ce418Sdan    INSERT INTO t1 VALUES('Abc2');
69911ce418Sdan    INSERT INTO t1 VALUES('abc1');
70911ce418Sdan    INSERT INTO t1 VALUES('aBc3');
71911ce418Sdan  }
72911ce418Sdan  execsql { SELECT * FROM t1 ORDER BY a }
73911ce418Sdan} {abc1 Abc2 aBc3}
74911ce418Sdan
75911ce418Sdando_test collate3-1.5 {
76911ce418Sdan  db close
77911ce418Sdan  sqlite3 db test.db
78911ce418Sdan  catchsql { SELECT * FROM t1 ORDER BY a }
79911ce418Sdan} {1 {no such collation sequence: caseless}}
80911ce418Sdan
81911ce418Sdando_test collate3-1.6.1 {
82911ce418Sdan  db collate caseless caseless
83911ce418Sdan  execsql { CREATE INDEX i1 ON t1(a) }
84911ce418Sdan  execsql { SELECT * FROM t1 ORDER BY a }
85911ce418Sdan} {abc1 Abc2 aBc3}
86911ce418Sdan
87911ce418Sdando_test collate3-1.6.2 {
88911ce418Sdan  db close
89911ce418Sdan  sqlite3 db test.db
90911ce418Sdan  catchsql { SELECT * FROM t1 ORDER BY a }
91911ce418Sdan} {1 {no such collation sequence: caseless}}
92911ce418Sdan
93911ce418Sdando_test collate3-1.6.3 {
94911ce418Sdan  db close
95911ce418Sdan  sqlite3 db test.db
96911ce418Sdan  catchsql { PRAGMA integrity_check }
97911ce418Sdan} {1 {no such collation sequence: caseless}}
98911ce418Sdan
99911ce418Sdando_test collate3-1.6.4 {
100911ce418Sdan  db close
101911ce418Sdan  sqlite3 db test.db
102911ce418Sdan  catchsql { REINDEX }
103911ce418Sdan} {1 {no such collation sequence: caseless}}
104911ce418Sdan
105911ce418Sdando_test collate3-1.7.1 {
106911ce418Sdan  db collate caseless caseless
107911ce418Sdan  execsql {
108911ce418Sdan    DROP TABLE t1;
109911ce418Sdan    CREATE TABLE t1(a);
110911ce418Sdan    CREATE INDEX i1 ON t1(a COLLATE caseless);
111911ce418Sdan    INSERT INTO t1 VALUES('Abc2');
112911ce418Sdan    INSERT INTO t1 VALUES('abc1');
113911ce418Sdan    INSERT INTO t1 VALUES('aBc3');
114911ce418Sdan    SELECT * FROM t1 ORDER BY a COLLATE caseless;
115911ce418Sdan  }
116911ce418Sdan} {abc1 Abc2 aBc3}
117911ce418Sdan
118911ce418Sdando_test collate3-1.7.2 {
119911ce418Sdan  db close
120911ce418Sdan  sqlite3 db test.db
121911ce418Sdan  catchsql { SELECT * FROM t1 ORDER BY a COLLATE caseless}
122911ce418Sdan} {1 {no such collation sequence: caseless}}
123911ce418Sdan
124911ce418Sdando_test collate3-1.7.4 {
125911ce418Sdan  db close
126911ce418Sdan  sqlite3 db test.db
127911ce418Sdan  catchsql { REINDEX }
128911ce418Sdan} {1 {no such collation sequence: caseless}}
129911ce418Sdan
130911ce418Sdando_test collate3-1.7.3 {
131911ce418Sdan  db close
132911ce418Sdan  sqlite3 db test.db
133911ce418Sdan  catchsql { PRAGMA integrity_check }
134911ce418Sdan} {1 {no such collation sequence: caseless}}
135911ce418Sdan
136911ce418Sdando_test collate3-1.7.4 {
137911ce418Sdan  db close
138911ce418Sdan  sqlite3 db test.db
139911ce418Sdan  catchsql { REINDEX }
140911ce418Sdan} {1 {no such collation sequence: caseless}}
141911ce418Sdan
142911ce418Sdando_test collate3-1.7.5 {
143911ce418Sdan  db close
144911ce418Sdan  sqlite3 db test.db
145911ce418Sdan  db collate caseless caseless
146911ce418Sdan  catchsql { PRAGMA integrity_check }
147911ce418Sdan} {0 ok}
148911ce418Sdan
149d58792e0Sdanproc needed {nm} { db collate caseless caseless }
150911ce418Sdando_test collate3-1.7.6 {
151d58792e0Sdan  db close
152d58792e0Sdan  sqlite3 db test.db
153d58792e0Sdan  db collation_needed needed
154d58792e0Sdan  catchsql { PRAGMA integrity_check }
155d58792e0Sdan} {0 ok}
156d58792e0Sdan
157d58792e0Sdando_test collate3-1.8 {
158911ce418Sdan  execsql { DROP TABLE t1 }
159911ce418Sdan} {}
160911ce418Sdan
161d2b65b9fSdanielk1977#
162d2b65b9fSdanielk1977# Create a table with a default collation sequence, then close
163d2b65b9fSdanielk1977# and re-open the database without re-registering the collation
164d2b65b9fSdanielk1977# sequence. Then make sure the library stops us from using
165d2b65b9fSdanielk1977# the collation sequence in:
166d2b65b9fSdanielk1977# * an explicitly collated ORDER BY
167d2b65b9fSdanielk1977# * an ORDER BY that uses the default collation sequence
168d2b65b9fSdanielk1977# * an expression (=)
169d2b65b9fSdanielk1977# * a CREATE TABLE statement
170d2b65b9fSdanielk1977# * a CREATE INDEX statement that uses a default collation sequence
171d2b65b9fSdanielk1977# * a GROUP BY that uses the default collation sequence
172d2b65b9fSdanielk1977# * a SELECT DISTINCT that uses the default collation sequence
173d2b65b9fSdanielk1977# * Compound SELECTs that uses the default collation sequence
174d2b65b9fSdanielk1977# * An ORDER BY on a compound SELECT with an explicit ORDER BY.
175d2b65b9fSdanielk1977#
176d2b65b9fSdanielk1977do_test collate3-2.0 {
177d2b65b9fSdanielk1977  db collate string_compare {string compare}
178d2b65b9fSdanielk1977  execsql {
179d2b65b9fSdanielk1977    CREATE TABLE collate3t1(c1 COLLATE string_compare, c2);
180d2b65b9fSdanielk1977  }
181d2b65b9fSdanielk1977  db close
182ef4ac8f9Sdrh  sqlite3 db test.db
183d2b65b9fSdanielk1977  expr 0
184d2b65b9fSdanielk1977} 0
185d2b65b9fSdanielk1977do_test collate3-2.1 {
186d2b65b9fSdanielk1977  catchsql {
187d2b65b9fSdanielk1977    SELECT * FROM collate3t1 ORDER BY 1 COLLATE string_compare;
188d2b65b9fSdanielk1977  }
189d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
190d2b65b9fSdanielk1977do_test collate3-2.2 {
191d2b65b9fSdanielk1977  catchsql {
192d2b65b9fSdanielk1977    SELECT * FROM collate3t1 ORDER BY c1;
193d2b65b9fSdanielk1977  }
194d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
195d2b65b9fSdanielk1977do_test collate3-2.3 {
196d2b65b9fSdanielk1977  catchsql {
197d2b65b9fSdanielk1977    SELECT * FROM collate3t1 WHERE c1 = 'xxx';
198d2b65b9fSdanielk1977  }
199d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
200d2b65b9fSdanielk1977do_test collate3-2.4 {
201d2b65b9fSdanielk1977  catchsql {
202d2b65b9fSdanielk1977    CREATE TABLE collate3t2(c1 COLLATE string_compare);
203d2b65b9fSdanielk1977  }
204d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
205d2b65b9fSdanielk1977do_test collate3-2.5 {
206d2b65b9fSdanielk1977  catchsql {
207d2b65b9fSdanielk1977    CREATE INDEX collate3t1_i1 ON collate3t1(c1);
208d2b65b9fSdanielk1977  }
209d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
210d2b65b9fSdanielk1977do_test collate3-2.6 {
211d2b65b9fSdanielk1977  catchsql {
212d2b65b9fSdanielk1977    SELECT * FROM collate3t1;
213d2b65b9fSdanielk1977  }
214d2b65b9fSdanielk1977} {0 {}}
21549d642dbSdrhdo_test collate3-2.7.1 {
21649d642dbSdrh  catchsql {
21749d642dbSdrh    SELECT count(*) FROM collate3t1 GROUP BY c1;
21849d642dbSdrh  }
21949d642dbSdrh} {1 {no such collation sequence: string_compare}}
220e257300fSdanielk1977# do_test collate3-2.7.2 {
221e257300fSdanielk1977#   catchsql {
222e257300fSdanielk1977#     SELECT * FROM collate3t1 GROUP BY c1;
223e257300fSdanielk1977#   }
224e257300fSdanielk1977# } {1 {GROUP BY may only be used on aggregate queries}}
22549d642dbSdrhdo_test collate3-2.7.2 {
226d2b65b9fSdanielk1977  catchsql {
227d2b65b9fSdanielk1977    SELECT * FROM collate3t1 GROUP BY c1;
228d2b65b9fSdanielk1977  }
229e257300fSdanielk1977} {1 {no such collation sequence: string_compare}}
230d2b65b9fSdanielk1977do_test collate3-2.8 {
231d2b65b9fSdanielk1977  catchsql {
232d2b65b9fSdanielk1977    SELECT DISTINCT c1 FROM collate3t1;
233d2b65b9fSdanielk1977  }
234d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
235dc1bdc4fSdanielk1977
23627c77438Sdanielk1977ifcapable compound {
237d2b65b9fSdanielk1977  do_test collate3-2.9 {
238d2b65b9fSdanielk1977    catchsql {
239d2b65b9fSdanielk1977      SELECT c1 FROM collate3t1 UNION SELECT c1 FROM collate3t1;
240d2b65b9fSdanielk1977    }
241d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
242d2b65b9fSdanielk1977  do_test collate3-2.10 {
243d2b65b9fSdanielk1977    catchsql {
244d2b65b9fSdanielk1977      SELECT c1 FROM collate3t1 EXCEPT SELECT c1 FROM collate3t1;
245d2b65b9fSdanielk1977    }
246d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
247d2b65b9fSdanielk1977  do_test collate3-2.11 {
248d2b65b9fSdanielk1977    catchsql {
249d2b65b9fSdanielk1977      SELECT c1 FROM collate3t1 INTERSECT SELECT c1 FROM collate3t1;
250d2b65b9fSdanielk1977    }
251d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
252d2b65b9fSdanielk1977  do_test collate3-2.12 {
253d2b65b9fSdanielk1977    catchsql {
254d2b65b9fSdanielk1977      SELECT c1 FROM collate3t1 UNION ALL SELECT c1 FROM collate3t1;
255d2b65b9fSdanielk1977    }
256d2b65b9fSdanielk1977  } {0 {}}
257d2b65b9fSdanielk1977  do_test collate3-2.13 {
258d2b65b9fSdanielk1977    catchsql {
259d2b65b9fSdanielk1977      SELECT 10 UNION ALL SELECT 20 ORDER BY 1 COLLATE string_compare;
260d2b65b9fSdanielk1977    }
261d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
262d2b65b9fSdanielk1977  do_test collate3-2.14 {
263d2b65b9fSdanielk1977    catchsql {
264d2b65b9fSdanielk1977      SELECT 10 INTERSECT SELECT 20 ORDER BY 1 COLLATE string_compare;
265d2b65b9fSdanielk1977    }
266d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
267d2b65b9fSdanielk1977  do_test collate3-2.15 {
268d2b65b9fSdanielk1977    catchsql {
269d2b65b9fSdanielk1977      SELECT 10 EXCEPT SELECT 20 ORDER BY 1 COLLATE string_compare;
270d2b65b9fSdanielk1977    }
271d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
272d2b65b9fSdanielk1977  do_test collate3-2.16 {
273d2b65b9fSdanielk1977    catchsql {
274d2b65b9fSdanielk1977      SELECT 10 UNION SELECT 20 ORDER BY 1 COLLATE string_compare;
275d2b65b9fSdanielk1977    }
276d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
277d2b65b9fSdanielk1977  do_test collate3-2.17 {
278d2b65b9fSdanielk1977    catchsql {
279d2b65b9fSdanielk1977      SELECT c1 FROM collate3t1 UNION ALL SELECT c1 FROM collate3t1 ORDER BY 1;
280d2b65b9fSdanielk1977    }
281d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
28227c77438Sdanielk1977} ;# ifcapable compound
283d2b65b9fSdanielk1977
284d2b65b9fSdanielk1977#
285d2b65b9fSdanielk1977# Create an index that uses a collation sequence then close and
286d2b65b9fSdanielk1977# re-open the database without re-registering the collation
287d2b65b9fSdanielk1977# sequence. Then check that for the table with the index
288d2b65b9fSdanielk1977# * An INSERT fails,
289d2b65b9fSdanielk1977# * An UPDATE on the column with the index fails,
290d2b65b9fSdanielk1977# * An UPDATE on a different column succeeds.
291d2b65b9fSdanielk1977# * A DELETE with a WHERE clause fails
292d2b65b9fSdanielk1977# * A DELETE without a WHERE clause succeeds
293d2b65b9fSdanielk1977#
294d2b65b9fSdanielk1977# Also, ensure that the restrictions tested by collate3-2.* still
295d2b65b9fSdanielk1977# apply after the index has been created.
296d2b65b9fSdanielk1977#
297d2b65b9fSdanielk1977do_test collate3-3.0 {
298d2b65b9fSdanielk1977  db collate string_compare {string compare}
299d2b65b9fSdanielk1977  execsql {
300d2b65b9fSdanielk1977    CREATE INDEX collate3t1_i1 ON collate3t1(c1);
301d2b65b9fSdanielk1977    INSERT INTO collate3t1 VALUES('xxx', 'yyy');
302d2b65b9fSdanielk1977  }
303d2b65b9fSdanielk1977  db close
304ef4ac8f9Sdrh  sqlite3 db test.db
305d2b65b9fSdanielk1977  expr 0
306d2b65b9fSdanielk1977} 0
307d2b65b9fSdanielk1977db eval {select * from collate3t1}
308d2b65b9fSdanielk1977do_test collate3-3.1 {
309d2b65b9fSdanielk1977  catchsql {
310d2b65b9fSdanielk1977    INSERT INTO collate3t1 VALUES('xxx', 0);
311d2b65b9fSdanielk1977  }
312d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
313d2b65b9fSdanielk1977do_test collate3-3.2 {
314d2b65b9fSdanielk1977  catchsql {
315d2b65b9fSdanielk1977    UPDATE collate3t1 SET c1 = 'xxx';
316d2b65b9fSdanielk1977  }
317d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
318d2b65b9fSdanielk1977do_test collate3-3.3 {
319d2b65b9fSdanielk1977  catchsql {
320d2b65b9fSdanielk1977    UPDATE collate3t1 SET c2 = 'xxx';
321d2b65b9fSdanielk1977  }
322d2b65b9fSdanielk1977} {0 {}}
323d2b65b9fSdanielk1977do_test collate3-3.4 {
324d2b65b9fSdanielk1977  catchsql {
325d2b65b9fSdanielk1977    DELETE FROM collate3t1 WHERE 1;
326d2b65b9fSdanielk1977  }
327d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
328d2b65b9fSdanielk1977do_test collate3-3.5 {
329d2b65b9fSdanielk1977  catchsql {
330d2b65b9fSdanielk1977    SELECT * FROM collate3t1;
331d2b65b9fSdanielk1977  }
332d2b65b9fSdanielk1977} {0 {xxx xxx}}
333d2b65b9fSdanielk1977do_test collate3-3.6 {
334d2b65b9fSdanielk1977  catchsql {
335d2b65b9fSdanielk1977    DELETE FROM collate3t1;
336d2b65b9fSdanielk1977  }
337d2b65b9fSdanielk1977} {0 {}}
33840e016e4Sdrhifcapable {integrityck} {
339d2b65b9fSdanielk1977  do_test collate3-3.8 {
340d2b65b9fSdanielk1977    catchsql {
341d2b65b9fSdanielk1977      PRAGMA integrity_check
342d2b65b9fSdanielk1977    }
343d2b65b9fSdanielk1977  } {1 {no such collation sequence: string_compare}}
34440e016e4Sdrh}
345d2b65b9fSdanielk1977do_test collate3-3.9 {
346d2b65b9fSdanielk1977  catchsql {
347d2b65b9fSdanielk1977    SELECT * FROM collate3t1;
348d2b65b9fSdanielk1977  }
349d2b65b9fSdanielk1977} {0 {}}
350d2b65b9fSdanielk1977do_test collate3-3.10 {
351d2b65b9fSdanielk1977  catchsql {
352d2b65b9fSdanielk1977    SELECT * FROM collate3t1 ORDER BY 1 COLLATE string_compare;
353d2b65b9fSdanielk1977  }
354d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
355d2b65b9fSdanielk1977do_test collate3-3.11 {
356d2b65b9fSdanielk1977  catchsql {
357d2b65b9fSdanielk1977    SELECT * FROM collate3t1 ORDER BY c1;
358d2b65b9fSdanielk1977  }
359d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
360d2b65b9fSdanielk1977do_test collate3-3.12 {
361d2b65b9fSdanielk1977  catchsql {
362d2b65b9fSdanielk1977    SELECT * FROM collate3t1 WHERE c1 = 'xxx';
363d2b65b9fSdanielk1977  }
364d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
365d2b65b9fSdanielk1977do_test collate3-3.13 {
366d2b65b9fSdanielk1977  catchsql {
367d2b65b9fSdanielk1977    CREATE TABLE collate3t2(c1 COLLATE string_compare);
368d2b65b9fSdanielk1977  }
369d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
370d2b65b9fSdanielk1977do_test collate3-3.14 {
371d2b65b9fSdanielk1977  catchsql {
372d2b65b9fSdanielk1977    CREATE INDEX collate3t1_i2 ON collate3t1(c1);
373d2b65b9fSdanielk1977  }
374d2b65b9fSdanielk1977} {1 {no such collation sequence: string_compare}}
375d2b65b9fSdanielk1977do_test collate3-3.15 {
376d2b65b9fSdanielk1977  execsql {
377d2b65b9fSdanielk1977    DROP TABLE collate3t1;
378d2b65b9fSdanielk1977  }
379d2b65b9fSdanielk1977} {}
380d2b65b9fSdanielk1977
381d2b65b9fSdanielk1977# Check we can create an index that uses an explicit collation
382d2b65b9fSdanielk1977# sequence and then close and re-open the database.
383d2b65b9fSdanielk1977do_test collate3-4.6 {
384d2b65b9fSdanielk1977  db collate user_defined "string compare"
385d2b65b9fSdanielk1977  execsql {
386d2b65b9fSdanielk1977    CREATE TABLE collate3t1(a, b);
387d2b65b9fSdanielk1977    INSERT INTO collate3t1 VALUES('hello', NULL);
388d2b65b9fSdanielk1977    CREATE INDEX collate3i1 ON collate3t1(a COLLATE user_defined);
389d2b65b9fSdanielk1977  }
390d2b65b9fSdanielk1977} {}
391d2b65b9fSdanielk1977do_test collate3-4.7 {
392d2b65b9fSdanielk1977  db close
393ef4ac8f9Sdrh  sqlite3 db test.db
394d2b65b9fSdanielk1977  catchsql {
395d2b65b9fSdanielk1977    SELECT * FROM collate3t1 ORDER BY a COLLATE user_defined;
396d2b65b9fSdanielk1977  }
397d2b65b9fSdanielk1977} {1 {no such collation sequence: user_defined}}
3987d10d5a6Sdrhdo_test collate3-4.8.1 {
399d2b65b9fSdanielk1977  db collate user_defined "string compare"
400d2b65b9fSdanielk1977  catchsql {
401d2b65b9fSdanielk1977    SELECT * FROM collate3t1 ORDER BY a COLLATE user_defined;
402d2b65b9fSdanielk1977  }
403d2b65b9fSdanielk1977} {0 {hello {}}}
4047d10d5a6Sdrhdo_test collate3-4.8.2 {
405d2b65b9fSdanielk1977  db close
406d2b65b9fSdanielk1977  lindex [catch {
407ef4ac8f9Sdrh    sqlite3 db test.db
408d2b65b9fSdanielk1977  }] 0
409d2b65b9fSdanielk1977} {0}
4107d10d5a6Sdrhdo_test collate3-4.8.3 {
411d2b65b9fSdanielk1977  execsql {
412d2b65b9fSdanielk1977    DROP TABLE collate3t1;
413d2b65b9fSdanielk1977  }
414d2b65b9fSdanielk1977} {}
415d2b65b9fSdanielk1977
416d2b65b9fSdanielk1977# Compare strings as numbers.
417d2b65b9fSdanielk1977proc numeric_compare {lhs rhs} {
418d2b65b9fSdanielk1977  if {$rhs > $lhs} {
419d2b65b9fSdanielk1977    set res -1
420d2b65b9fSdanielk1977  } else {
421d2b65b9fSdanielk1977    set res [expr ($lhs > $rhs)?1:0]
422d2b65b9fSdanielk1977  }
423d2b65b9fSdanielk1977  return $res
424d2b65b9fSdanielk1977}
425d2b65b9fSdanielk1977
426d2b65b9fSdanielk1977# Check we can create a view that uses an explicit collation
427d2b65b9fSdanielk1977# sequence and then close and re-open the database.
4280fa8ddbdSdanielk1977ifcapable view {
429d2b65b9fSdanielk1977do_test collate3-4.9 {
430d2b65b9fSdanielk1977  db collate user_defined numeric_compare
431d2b65b9fSdanielk1977  execsql {
432d2b65b9fSdanielk1977    CREATE TABLE collate3t1(a, b);
433d2b65b9fSdanielk1977    INSERT INTO collate3t1 VALUES('2', NULL);
434d2b65b9fSdanielk1977    INSERT INTO collate3t1 VALUES('101', NULL);
435d2b65b9fSdanielk1977    INSERT INTO collate3t1 VALUES('12', NULL);
436d2b65b9fSdanielk1977    CREATE VIEW collate3v1 AS SELECT * FROM collate3t1
437d2b65b9fSdanielk1977        ORDER BY 1 COLLATE user_defined;
438d2b65b9fSdanielk1977    SELECT * FROM collate3v1;
439d2b65b9fSdanielk1977  }
440d2b65b9fSdanielk1977} {2 {} 12 {} 101 {}}
441d2b65b9fSdanielk1977do_test collate3-4.10 {
442d2b65b9fSdanielk1977  db close
443ef4ac8f9Sdrh  sqlite3 db test.db
444d2b65b9fSdanielk1977  catchsql {
445d2b65b9fSdanielk1977    SELECT * FROM collate3v1;
446d2b65b9fSdanielk1977  }
447d2b65b9fSdanielk1977} {1 {no such collation sequence: user_defined}}
448d2b65b9fSdanielk1977do_test collate3-4.11 {
449d2b65b9fSdanielk1977  db collate user_defined numeric_compare
450d2b65b9fSdanielk1977  catchsql {
451d2b65b9fSdanielk1977    SELECT * FROM collate3v1;
452d2b65b9fSdanielk1977  }
453d2b65b9fSdanielk1977} {0 {2 {} 12 {} 101 {}}}
454d2b65b9fSdanielk1977do_test collate3-4.12 {
455d2b65b9fSdanielk1977  execsql {
456d2b65b9fSdanielk1977    DROP TABLE collate3t1;
457d2b65b9fSdanielk1977  }
458d2b65b9fSdanielk1977} {}
4590fa8ddbdSdanielk1977} ;# ifcapable view
460d2b65b9fSdanielk1977
461d2b65b9fSdanielk1977#
462d2b65b9fSdanielk1977# Test the collation factory. In the code, the "no such collation sequence"
463d2b65b9fSdanielk1977# message is only generated in two places. So these tests just test that
464d2b65b9fSdanielk1977# the collation factory can be called once from each of those points.
465d2b65b9fSdanielk1977#
466d2b65b9fSdanielk1977do_test collate3-5.0 {
467d2b65b9fSdanielk1977  catchsql {
468d2b65b9fSdanielk1977    CREATE TABLE collate3t1(a);
469d2b65b9fSdanielk1977    INSERT INTO collate3t1 VALUES(10);
470d2b65b9fSdanielk1977    SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
471d2b65b9fSdanielk1977  }
472d2b65b9fSdanielk1977} {1 {no such collation sequence: unk}}
473d2b65b9fSdanielk1977do_test collate3-5.1 {
474d2b65b9fSdanielk1977  set ::cfact_cnt 0
475d2b65b9fSdanielk1977  proc cfact {nm} {
476d2b65b9fSdanielk1977    db collate $nm {string compare}
477d2b65b9fSdanielk1977    incr ::cfact_cnt
478d2b65b9fSdanielk1977  }
479d2b65b9fSdanielk1977  db collation_needed cfact
480d2b65b9fSdanielk1977} {}
481d2b65b9fSdanielk1977do_test collate3-5.2 {
482d2b65b9fSdanielk1977  catchsql {
483d2b65b9fSdanielk1977    SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
484d2b65b9fSdanielk1977  }
485d2b65b9fSdanielk1977} {0 10}
486d2b65b9fSdanielk1977do_test collate3-5.3 {
487d2b65b9fSdanielk1977  set ::cfact_cnt
488d2b65b9fSdanielk1977} {1}
489d2b65b9fSdanielk1977do_test collate3-5.4 {
490d2b65b9fSdanielk1977  catchsql {
491d2b65b9fSdanielk1977    SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
492d2b65b9fSdanielk1977  }
493d2b65b9fSdanielk1977} {0 10}
494d2b65b9fSdanielk1977do_test collate3-5.5 {
495d2b65b9fSdanielk1977  set ::cfact_cnt
496d2b65b9fSdanielk1977} {1}
497d2b65b9fSdanielk1977do_test collate3-5.6 {
498d2b65b9fSdanielk1977  catchsql {
499d2b65b9fSdanielk1977    SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
500d2b65b9fSdanielk1977  }
501d2b65b9fSdanielk1977} {0 10}
502d2b65b9fSdanielk1977do_test collate3-5.7 {
503d2b65b9fSdanielk1977  execsql {
504d2b65b9fSdanielk1977    DROP TABLE collate3t1;
505d2b65b9fSdanielk1977    CREATE TABLE collate3t1(a COLLATE unk);
506d2b65b9fSdanielk1977  }
507d2b65b9fSdanielk1977  db close
508ef4ac8f9Sdrh  sqlite3 db test.db
509d2b65b9fSdanielk1977  catchsql {
510d2b65b9fSdanielk1977    SELECT a FROM collate3t1 ORDER BY 1;
511d2b65b9fSdanielk1977  }
512d2b65b9fSdanielk1977} {1 {no such collation sequence: unk}}
513d2b65b9fSdanielk1977do_test collate3-5.8 {
514d2b65b9fSdanielk1977  set ::cfact_cnt 0
515d2b65b9fSdanielk1977  proc cfact {nm} {
516d2b65b9fSdanielk1977    db collate $nm {string compare}
517d2b65b9fSdanielk1977    incr ::cfact_cnt
518d2b65b9fSdanielk1977  }
519d2b65b9fSdanielk1977  db collation_needed cfact
520d2b65b9fSdanielk1977  catchsql {
521d2b65b9fSdanielk1977    SELECT a FROM collate3t1 ORDER BY 1;
522d2b65b9fSdanielk1977  }
523d2b65b9fSdanielk1977} {0 {}}
524d2b65b9fSdanielk1977
525d2b65b9fSdanielk1977do_test collate3-5.9 {
526d2b65b9fSdanielk1977  execsql {
527d2b65b9fSdanielk1977    DROP TABLE collate3t1;
528d2b65b9fSdanielk1977  }
529d2b65b9fSdanielk1977} {}
530d2b65b9fSdanielk1977
531d2b65b9fSdanielk1977finish_test
532