1: # 2004 November 5
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.
12: # This file implements tests for the REINDEX command.
13: #
14: # $Id: reindex.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18:
19: # There is nothing to test if REINDEX is disable for this build.
20: #
21: ifcapable {!reindex} {
22: finish_test
23: return
24: }
25:
26: # Basic sanity checks.
27: #
28: do_test reindex-1.1 {
29: execsql {
30: CREATE TABLE t1(a,b);
31: INSERT INTO t1 VALUES(1,2);
32: INSERT INTO t1 VALUES(3,4);
33: CREATE INDEX i1 ON t1(a);
34: REINDEX;
35: }
36: } {}
37: integrity_check reindex-1.2
38: do_test reindex-1.3 {
39: execsql {
40: REINDEX t1;
41: }
42: } {}
43: integrity_check reindex-1.4
44: do_test reindex-1.5 {
45: execsql {
46: REINDEX i1;
47: }
48: } {}
49: integrity_check reindex-1.6
50: do_test reindex-1.7 {
51: execsql {
52: REINDEX main.t1;
53: }
54: } {}
55: do_test reindex-1.8 {
56: execsql {
57: REINDEX main.i1;
58: }
59: } {}
60: do_test reindex-1.9 {
61: catchsql {
62: REINDEX bogus
63: }
64: } {1 {unable to identify the object to be reindexed}}
65:
66: # Set up a table for testing that includes several different collating
67: # sequences including some that we can modify.
68: #
69: do_test reindex-2.1 {
70: proc c1 {a b} {
71: return [expr {-[string compare $a $b]}]
72: }
73: proc c2 {a b} {
74: return [expr {-[string compare [string tolower $a] [string tolower $b]]}]
75: }
76: db collate c1 c1
77: db collate c2 c2
78: execsql {
79: CREATE TABLE t2(
80: a TEXT PRIMARY KEY COLLATE c1,
81: b TEXT UNIQUE COLLATE c2,
82: c TEXT COLLATE nocase,
83: d TEST COLLATE binary
84: );
85: INSERT INTO t2 VALUES('abc','abc','abc','abc');
86: INSERT INTO t2 VALUES('ABCD','ABCD','ABCD','ABCD');
87: INSERT INTO t2 VALUES('bcd','bcd','bcd','bcd');
88: INSERT INTO t2 VALUES('BCDE','BCDE','BCDE','BCDE');
89: SELECT a FROM t2 ORDER BY a;
90: }
91: } {bcd abc BCDE ABCD}
92: do_test reindex-2.2 {
93: execsql {
94: SELECT b FROM t2 ORDER BY b;
95: }
96: } {BCDE bcd ABCD abc}
97: do_test reindex-2.3 {
98: execsql {
99: SELECT c FROM t2 ORDER BY c;
100: }
101: } {abc ABCD bcd BCDE}
102: do_test reindex-2.4 {
103: execsql {
104: SELECT d FROM t2 ORDER BY d;
105: }
106: } {ABCD BCDE abc bcd}
107:
108: # Change a collating sequence function. Verify that REINDEX rebuilds
109: # the index.
110: #
111: do_test reindex-2.5 {
112: proc c1 {a b} {
113: return [string compare $a $b]
114: }
115: execsql {
116: SELECT a FROM t2 ORDER BY a;
117: }
118: } {bcd abc BCDE ABCD}
119: ifcapable {integrityck} {
120: do_test reindex-2.5.1 {
121: string equal ok [execsql {PRAGMA integrity_check}]
122: } {0}
123: }
124: do_test reindex-2.6 {
125: execsql {
126: REINDEX c2;
127: SELECT a FROM t2 ORDER BY a;
128: }
129: } {bcd abc BCDE ABCD}
130: do_test reindex-2.7 {
131: execsql {
132: REINDEX t1;
133: SELECT a FROM t2 ORDER BY a;
134: }
135: } {bcd abc BCDE ABCD}
136: do_test reindex-2.8 {
137: execsql {
138: REINDEX c1;
139: SELECT a FROM t2 ORDER BY a;
140: }
141: } {ABCD BCDE abc bcd}
142: integrity_check reindex-2.8.1
143:
144: # Try to REINDEX an index for which the collation sequence is not available.
145: #
146: do_test reindex-3.1 {
147: sqlite3 db2 test.db
148: catchsql {
149: REINDEX c1;
150: } db2
151: } {1 {no such collation sequence: c1}}
152: do_test reindex-3.2 {
153: proc need_collate {collation} {
154: db2 collate c1 c1
155: }
156: db2 collation_needed need_collate
157: catchsql {
158: REINDEX c1;
159: } db2
160: } {0 {}}
161: do_test reindex-3.3 {
162: catchsql {
163: REINDEX;
164: } db2
165: } {1 {no such collation sequence: c2}}
166:
167: do_test reindex-3.99 {
168: db2 close
169: } {}
170:
171: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>