Annotation of embedaddon/sqlite3/test/collate3.test, revision 1.1
1.1 ! misho 1: # 2001 September 15
! 2: #
! 3: # The author disclaims copyright to this source code. In place of
! 4: # a legal notice, here is a blessing:
! 5: #
! 6: # May you do good and not evil.
! 7: # May you find forgiveness for yourself and forgive others.
! 8: # May you share freely, never taking more than you give.
! 9: #
! 10: #***********************************************************************
! 11: # This file implements regression tests for SQLite library. The
! 12: # focus of this script is page cache subsystem.
! 13: #
! 14: # $Id: collate3.test,v 1.13 2008/08/20 16:35:10 drh Exp $
! 15:
! 16: set testdir [file dirname $argv0]
! 17: source $testdir/tester.tcl
! 18:
! 19: #
! 20: # Tests are organised as follows:
! 21: #
! 22: # collate3.1.* - Errors related to unknown collation sequences.
! 23: # collate3.2.* - Errors related to undefined collation sequences.
! 24: # collate3.3.* - Writing to a table that has an index with an undefined c.s.
! 25: # collate3.4.* - Misc errors.
! 26: # collate3.5.* - Collation factory.
! 27: #
! 28:
! 29: #
! 30: # These tests ensure that when a user executes a statement with an
! 31: # unknown collation sequence an error is returned.
! 32: #
! 33: do_test collate3-1.0 {
! 34: execsql {
! 35: CREATE TABLE collate3t1(c1);
! 36: }
! 37: } {}
! 38: do_test collate3-1.1 {
! 39: catchsql {
! 40: SELECT * FROM collate3t1 ORDER BY 1 collate garbage;
! 41: }
! 42: } {1 {no such collation sequence: garbage}}
! 43: do_test collate3-1.2 {
! 44: catchsql {
! 45: CREATE TABLE collate3t2(c1 collate garbage);
! 46: }
! 47: } {1 {no such collation sequence: garbage}}
! 48: do_test collate3-1.3 {
! 49: catchsql {
! 50: CREATE INDEX collate3i1 ON collate3t1(c1 COLLATE garbage);
! 51: }
! 52: } {1 {no such collation sequence: garbage}}
! 53:
! 54: execsql {
! 55: DROP TABLE collate3t1;
! 56: }
! 57:
! 58: #
! 59: # Create a table with a default collation sequence, then close
! 60: # and re-open the database without re-registering the collation
! 61: # sequence. Then make sure the library stops us from using
! 62: # the collation sequence in:
! 63: # * an explicitly collated ORDER BY
! 64: # * an ORDER BY that uses the default collation sequence
! 65: # * an expression (=)
! 66: # * a CREATE TABLE statement
! 67: # * a CREATE INDEX statement that uses a default collation sequence
! 68: # * a GROUP BY that uses the default collation sequence
! 69: # * a SELECT DISTINCT that uses the default collation sequence
! 70: # * Compound SELECTs that uses the default collation sequence
! 71: # * An ORDER BY on a compound SELECT with an explicit ORDER BY.
! 72: #
! 73: do_test collate3-2.0 {
! 74: db collate string_compare {string compare}
! 75: execsql {
! 76: CREATE TABLE collate3t1(c1 COLLATE string_compare, c2);
! 77: }
! 78: db close
! 79: sqlite3 db test.db
! 80: expr 0
! 81: } 0
! 82: do_test collate3-2.1 {
! 83: catchsql {
! 84: SELECT * FROM collate3t1 ORDER BY 1 COLLATE string_compare;
! 85: }
! 86: } {1 {no such collation sequence: string_compare}}
! 87: do_test collate3-2.2 {
! 88: catchsql {
! 89: SELECT * FROM collate3t1 ORDER BY c1;
! 90: }
! 91: } {1 {no such collation sequence: string_compare}}
! 92: do_test collate3-2.3 {
! 93: catchsql {
! 94: SELECT * FROM collate3t1 WHERE c1 = 'xxx';
! 95: }
! 96: } {1 {no such collation sequence: string_compare}}
! 97: do_test collate3-2.4 {
! 98: catchsql {
! 99: CREATE TABLE collate3t2(c1 COLLATE string_compare);
! 100: }
! 101: } {1 {no such collation sequence: string_compare}}
! 102: do_test collate3-2.5 {
! 103: catchsql {
! 104: CREATE INDEX collate3t1_i1 ON collate3t1(c1);
! 105: }
! 106: } {1 {no such collation sequence: string_compare}}
! 107: do_test collate3-2.6 {
! 108: catchsql {
! 109: SELECT * FROM collate3t1;
! 110: }
! 111: } {0 {}}
! 112: do_test collate3-2.7.1 {
! 113: catchsql {
! 114: SELECT count(*) FROM collate3t1 GROUP BY c1;
! 115: }
! 116: } {1 {no such collation sequence: string_compare}}
! 117: # do_test collate3-2.7.2 {
! 118: # catchsql {
! 119: # SELECT * FROM collate3t1 GROUP BY c1;
! 120: # }
! 121: # } {1 {GROUP BY may only be used on aggregate queries}}
! 122: do_test collate3-2.7.2 {
! 123: catchsql {
! 124: SELECT * FROM collate3t1 GROUP BY c1;
! 125: }
! 126: } {1 {no such collation sequence: string_compare}}
! 127: do_test collate3-2.8 {
! 128: catchsql {
! 129: SELECT DISTINCT c1 FROM collate3t1;
! 130: }
! 131: } {1 {no such collation sequence: string_compare}}
! 132:
! 133: ifcapable compound {
! 134: do_test collate3-2.9 {
! 135: catchsql {
! 136: SELECT c1 FROM collate3t1 UNION SELECT c1 FROM collate3t1;
! 137: }
! 138: } {1 {no such collation sequence: string_compare}}
! 139: do_test collate3-2.10 {
! 140: catchsql {
! 141: SELECT c1 FROM collate3t1 EXCEPT SELECT c1 FROM collate3t1;
! 142: }
! 143: } {1 {no such collation sequence: string_compare}}
! 144: do_test collate3-2.11 {
! 145: catchsql {
! 146: SELECT c1 FROM collate3t1 INTERSECT SELECT c1 FROM collate3t1;
! 147: }
! 148: } {1 {no such collation sequence: string_compare}}
! 149: do_test collate3-2.12 {
! 150: catchsql {
! 151: SELECT c1 FROM collate3t1 UNION ALL SELECT c1 FROM collate3t1;
! 152: }
! 153: } {0 {}}
! 154: do_test collate3-2.13 {
! 155: catchsql {
! 156: SELECT 10 UNION ALL SELECT 20 ORDER BY 1 COLLATE string_compare;
! 157: }
! 158: } {1 {no such collation sequence: string_compare}}
! 159: do_test collate3-2.14 {
! 160: catchsql {
! 161: SELECT 10 INTERSECT SELECT 20 ORDER BY 1 COLLATE string_compare;
! 162: }
! 163: } {1 {no such collation sequence: string_compare}}
! 164: do_test collate3-2.15 {
! 165: catchsql {
! 166: SELECT 10 EXCEPT SELECT 20 ORDER BY 1 COLLATE string_compare;
! 167: }
! 168: } {1 {no such collation sequence: string_compare}}
! 169: do_test collate3-2.16 {
! 170: catchsql {
! 171: SELECT 10 UNION SELECT 20 ORDER BY 1 COLLATE string_compare;
! 172: }
! 173: } {1 {no such collation sequence: string_compare}}
! 174: do_test collate3-2.17 {
! 175: catchsql {
! 176: SELECT c1 FROM collate3t1 UNION ALL SELECT c1 FROM collate3t1 ORDER BY 1;
! 177: }
! 178: } {1 {no such collation sequence: string_compare}}
! 179: } ;# ifcapable compound
! 180:
! 181: #
! 182: # Create an index that uses a collation sequence then close and
! 183: # re-open the database without re-registering the collation
! 184: # sequence. Then check that for the table with the index
! 185: # * An INSERT fails,
! 186: # * An UPDATE on the column with the index fails,
! 187: # * An UPDATE on a different column succeeds.
! 188: # * A DELETE with a WHERE clause fails
! 189: # * A DELETE without a WHERE clause succeeds
! 190: #
! 191: # Also, ensure that the restrictions tested by collate3-2.* still
! 192: # apply after the index has been created.
! 193: #
! 194: do_test collate3-3.0 {
! 195: db collate string_compare {string compare}
! 196: execsql {
! 197: CREATE INDEX collate3t1_i1 ON collate3t1(c1);
! 198: INSERT INTO collate3t1 VALUES('xxx', 'yyy');
! 199: }
! 200: db close
! 201: sqlite3 db test.db
! 202: expr 0
! 203: } 0
! 204: db eval {select * from collate3t1}
! 205: do_test collate3-3.1 {
! 206: catchsql {
! 207: INSERT INTO collate3t1 VALUES('xxx', 0);
! 208: }
! 209: } {1 {no such collation sequence: string_compare}}
! 210: do_test collate3-3.2 {
! 211: catchsql {
! 212: UPDATE collate3t1 SET c1 = 'xxx';
! 213: }
! 214: } {1 {no such collation sequence: string_compare}}
! 215: do_test collate3-3.3 {
! 216: catchsql {
! 217: UPDATE collate3t1 SET c2 = 'xxx';
! 218: }
! 219: } {0 {}}
! 220: do_test collate3-3.4 {
! 221: catchsql {
! 222: DELETE FROM collate3t1 WHERE 1;
! 223: }
! 224: } {1 {no such collation sequence: string_compare}}
! 225: do_test collate3-3.5 {
! 226: catchsql {
! 227: SELECT * FROM collate3t1;
! 228: }
! 229: } {0 {xxx xxx}}
! 230: do_test collate3-3.6 {
! 231: catchsql {
! 232: DELETE FROM collate3t1;
! 233: }
! 234: } {0 {}}
! 235: ifcapable {integrityck} {
! 236: do_test collate3-3.8 {
! 237: catchsql {
! 238: PRAGMA integrity_check
! 239: }
! 240: } {1 {no such collation sequence: string_compare}}
! 241: }
! 242: do_test collate3-3.9 {
! 243: catchsql {
! 244: SELECT * FROM collate3t1;
! 245: }
! 246: } {0 {}}
! 247: do_test collate3-3.10 {
! 248: catchsql {
! 249: SELECT * FROM collate3t1 ORDER BY 1 COLLATE string_compare;
! 250: }
! 251: } {1 {no such collation sequence: string_compare}}
! 252: do_test collate3-3.11 {
! 253: catchsql {
! 254: SELECT * FROM collate3t1 ORDER BY c1;
! 255: }
! 256: } {1 {no such collation sequence: string_compare}}
! 257: do_test collate3-3.12 {
! 258: catchsql {
! 259: SELECT * FROM collate3t1 WHERE c1 = 'xxx';
! 260: }
! 261: } {1 {no such collation sequence: string_compare}}
! 262: do_test collate3-3.13 {
! 263: catchsql {
! 264: CREATE TABLE collate3t2(c1 COLLATE string_compare);
! 265: }
! 266: } {1 {no such collation sequence: string_compare}}
! 267: do_test collate3-3.14 {
! 268: catchsql {
! 269: CREATE INDEX collate3t1_i2 ON collate3t1(c1);
! 270: }
! 271: } {1 {no such collation sequence: string_compare}}
! 272: do_test collate3-3.15 {
! 273: execsql {
! 274: DROP TABLE collate3t1;
! 275: }
! 276: } {}
! 277:
! 278: # Check we can create an index that uses an explicit collation
! 279: # sequence and then close and re-open the database.
! 280: do_test collate3-4.6 {
! 281: db collate user_defined "string compare"
! 282: execsql {
! 283: CREATE TABLE collate3t1(a, b);
! 284: INSERT INTO collate3t1 VALUES('hello', NULL);
! 285: CREATE INDEX collate3i1 ON collate3t1(a COLLATE user_defined);
! 286: }
! 287: } {}
! 288: do_test collate3-4.7 {
! 289: db close
! 290: sqlite3 db test.db
! 291: catchsql {
! 292: SELECT * FROM collate3t1 ORDER BY a COLLATE user_defined;
! 293: }
! 294: } {1 {no such collation sequence: user_defined}}
! 295: do_test collate3-4.8.1 {
! 296: db collate user_defined "string compare"
! 297: catchsql {
! 298: SELECT * FROM collate3t1 ORDER BY a COLLATE user_defined;
! 299: }
! 300: } {0 {hello {}}}
! 301: do_test collate3-4.8.2 {
! 302: db close
! 303: lindex [catch {
! 304: sqlite3 db test.db
! 305: }] 0
! 306: } {0}
! 307: do_test collate3-4.8.3 {
! 308: execsql {
! 309: DROP TABLE collate3t1;
! 310: }
! 311: } {}
! 312:
! 313: # Compare strings as numbers.
! 314: proc numeric_compare {lhs rhs} {
! 315: if {$rhs > $lhs} {
! 316: set res -1
! 317: } else {
! 318: set res [expr ($lhs > $rhs)?1:0]
! 319: }
! 320: return $res
! 321: }
! 322:
! 323: # Check we can create a view that uses an explicit collation
! 324: # sequence and then close and re-open the database.
! 325: ifcapable view {
! 326: do_test collate3-4.9 {
! 327: db collate user_defined numeric_compare
! 328: execsql {
! 329: CREATE TABLE collate3t1(a, b);
! 330: INSERT INTO collate3t1 VALUES('2', NULL);
! 331: INSERT INTO collate3t1 VALUES('101', NULL);
! 332: INSERT INTO collate3t1 VALUES('12', NULL);
! 333: CREATE VIEW collate3v1 AS SELECT * FROM collate3t1
! 334: ORDER BY 1 COLLATE user_defined;
! 335: SELECT * FROM collate3v1;
! 336: }
! 337: } {2 {} 12 {} 101 {}}
! 338: do_test collate3-4.10 {
! 339: db close
! 340: sqlite3 db test.db
! 341: catchsql {
! 342: SELECT * FROM collate3v1;
! 343: }
! 344: } {1 {no such collation sequence: user_defined}}
! 345: do_test collate3-4.11 {
! 346: db collate user_defined numeric_compare
! 347: catchsql {
! 348: SELECT * FROM collate3v1;
! 349: }
! 350: } {0 {2 {} 12 {} 101 {}}}
! 351: do_test collate3-4.12 {
! 352: execsql {
! 353: DROP TABLE collate3t1;
! 354: }
! 355: } {}
! 356: } ;# ifcapable view
! 357:
! 358: #
! 359: # Test the collation factory. In the code, the "no such collation sequence"
! 360: # message is only generated in two places. So these tests just test that
! 361: # the collation factory can be called once from each of those points.
! 362: #
! 363: do_test collate3-5.0 {
! 364: catchsql {
! 365: CREATE TABLE collate3t1(a);
! 366: INSERT INTO collate3t1 VALUES(10);
! 367: SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
! 368: }
! 369: } {1 {no such collation sequence: unk}}
! 370: do_test collate3-5.1 {
! 371: set ::cfact_cnt 0
! 372: proc cfact {nm} {
! 373: db collate $nm {string compare}
! 374: incr ::cfact_cnt
! 375: }
! 376: db collation_needed cfact
! 377: } {}
! 378: do_test collate3-5.2 {
! 379: catchsql {
! 380: SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
! 381: }
! 382: } {0 10}
! 383: do_test collate3-5.3 {
! 384: set ::cfact_cnt
! 385: } {1}
! 386: do_test collate3-5.4 {
! 387: catchsql {
! 388: SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
! 389: }
! 390: } {0 10}
! 391: do_test collate3-5.5 {
! 392: set ::cfact_cnt
! 393: } {1}
! 394: do_test collate3-5.6 {
! 395: catchsql {
! 396: SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
! 397: }
! 398: } {0 10}
! 399: do_test collate3-5.7 {
! 400: execsql {
! 401: DROP TABLE collate3t1;
! 402: CREATE TABLE collate3t1(a COLLATE unk);
! 403: }
! 404: db close
! 405: sqlite3 db test.db
! 406: catchsql {
! 407: SELECT a FROM collate3t1 ORDER BY 1;
! 408: }
! 409: } {1 {no such collation sequence: unk}}
! 410: do_test collate3-5.8 {
! 411: set ::cfact_cnt 0
! 412: proc cfact {nm} {
! 413: db collate $nm {string compare}
! 414: incr ::cfact_cnt
! 415: }
! 416: db collation_needed cfact
! 417: catchsql {
! 418: SELECT a FROM collate3t1 ORDER BY 1;
! 419: }
! 420: } {0 {}}
! 421:
! 422: do_test collate3-5.9 {
! 423: execsql {
! 424: DROP TABLE collate3t1;
! 425: }
! 426: } {}
! 427:
! 428: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>