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