blob: 88e489b0b1888d3bbd714c5ad5892ed1163b6431 [file] [log] [blame]
drh4343fea2004-11-05 23:46:15 +00001# 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#
drhe8f52c52008-07-12 14:52:20 +000014# $Id: reindex.test,v 1.4 2008/07/12 14:52:20 drh Exp $
drh4343fea2004-11-05 23:46:15 +000015
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
danc12655d2019-05-14 11:33:09 +000018set testprefix reindex
drh4343fea2004-11-05 23:46:15 +000019
20# There is nothing to test if REINDEX is disable for this build.
21#
22ifcapable {!reindex} {
23 finish_test
24 return
25}
26
27# Basic sanity checks.
28#
29do_test reindex-1.1 {
30 execsql {
31 CREATE TABLE t1(a,b);
32 INSERT INTO t1 VALUES(1,2);
33 INSERT INTO t1 VALUES(3,4);
34 CREATE INDEX i1 ON t1(a);
35 REINDEX;
36 }
37} {}
38integrity_check reindex-1.2
39do_test reindex-1.3 {
40 execsql {
41 REINDEX t1;
42 }
43} {}
44integrity_check reindex-1.4
45do_test reindex-1.5 {
46 execsql {
47 REINDEX i1;
48 }
49} {}
50integrity_check reindex-1.6
51do_test reindex-1.7 {
52 execsql {
53 REINDEX main.t1;
54 }
55} {}
56do_test reindex-1.8 {
57 execsql {
58 REINDEX main.i1;
59 }
60} {}
61do_test reindex-1.9 {
62 catchsql {
63 REINDEX bogus
64 }
65} {1 {unable to identify the object to be reindexed}}
66
drhe497f002004-11-07 13:01:49 +000067# Set up a table for testing that includes several different collating
68# sequences including some that we can modify.
69#
70do_test reindex-2.1 {
71 proc c1 {a b} {
72 return [expr {-[string compare $a $b]}]
73 }
74 proc c2 {a b} {
75 return [expr {-[string compare [string tolower $a] [string tolower $b]]}]
76 }
77 db collate c1 c1
78 db collate c2 c2
79 execsql {
80 CREATE TABLE t2(
81 a TEXT PRIMARY KEY COLLATE c1,
82 b TEXT UNIQUE COLLATE c2,
83 c TEXT COLLATE nocase,
84 d TEST COLLATE binary
85 );
86 INSERT INTO t2 VALUES('abc','abc','abc','abc');
87 INSERT INTO t2 VALUES('ABCD','ABCD','ABCD','ABCD');
88 INSERT INTO t2 VALUES('bcd','bcd','bcd','bcd');
89 INSERT INTO t2 VALUES('BCDE','BCDE','BCDE','BCDE');
90 SELECT a FROM t2 ORDER BY a;
91 }
92} {bcd abc BCDE ABCD}
93do_test reindex-2.2 {
94 execsql {
95 SELECT b FROM t2 ORDER BY b;
96 }
97} {BCDE bcd ABCD abc}
98do_test reindex-2.3 {
99 execsql {
100 SELECT c FROM t2 ORDER BY c;
101 }
102} {abc ABCD bcd BCDE}
103do_test reindex-2.4 {
104 execsql {
105 SELECT d FROM t2 ORDER BY d;
106 }
107} {ABCD BCDE abc bcd}
108
109# Change a collating sequence function. Verify that REINDEX rebuilds
110# the index.
111#
112do_test reindex-2.5 {
113 proc c1 {a b} {
114 return [string compare $a $b]
115 }
116 execsql {
117 SELECT a FROM t2 ORDER BY a;
118 }
119} {bcd abc BCDE ABCD}
120ifcapable {integrityck} {
121 do_test reindex-2.5.1 {
122 string equal ok [execsql {PRAGMA integrity_check}]
123 } {0}
124}
125do_test reindex-2.6 {
126 execsql {
127 REINDEX c2;
128 SELECT a FROM t2 ORDER BY a;
129 }
130} {bcd abc BCDE ABCD}
131do_test reindex-2.7 {
132 execsql {
133 REINDEX t1;
134 SELECT a FROM t2 ORDER BY a;
135 }
136} {bcd abc BCDE ABCD}
137do_test reindex-2.8 {
138 execsql {
139 REINDEX c1;
140 SELECT a FROM t2 ORDER BY a;
141 }
142} {ABCD BCDE abc bcd}
143integrity_check reindex-2.8.1
144
danielk197733a5edc2005-01-27 00:22:02 +0000145# Try to REINDEX an index for which the collation sequence is not available.
146#
147do_test reindex-3.1 {
148 sqlite3 db2 test.db
149 catchsql {
150 REINDEX c1;
151 } db2
152} {1 {no such collation sequence: c1}}
153do_test reindex-3.2 {
154 proc need_collate {collation} {
155 db2 collate c1 c1
156 }
157 db2 collation_needed need_collate
158 catchsql {
159 REINDEX c1;
160 } db2
161} {0 {}}
162do_test reindex-3.3 {
163 catchsql {
164 REINDEX;
165 } db2
166} {1 {no such collation sequence: c2}}
167
168do_test reindex-3.99 {
169 db2 close
170} {}
171
danc12655d2019-05-14 11:33:09 +0000172#-------------------------------------------------------------------------
173foreach {tn wo} {1 "" 2 "WITHOUT ROWID"} {
174 reset_db
175 eval [string map [list %without_rowid% $wo] {
176 do_execsql_test 4.$tn.0 {
177 CREATE TABLE t0 (
178 c0 INTEGER PRIMARY KEY DESC,
179 c1 UNIQUE DEFAULT NULL
180 ) %without_rowid% ;
181 INSERT INTO t0(c0) VALUES (1), (2), (3), (4), (5);
182 SELECT c0 FROM t0 WHERE c1 IS NULL ORDER BY 1;
183 } {1 2 3 4 5}
184
185 do_execsql_test 4.$tn.1 {
186 REINDEX;
187 }
188
189 do_execsql_test 4.$tn.2 {
190 SELECT c0 FROM t0 WHERE c1 IS NULL ORDER BY 1;
191 } {1 2 3 4 5}
192
193 do_execsql_test 4.$tn.3 {
194 SELECT c0 FROM t0 WHERE c1 IS NULL AND c0 IN (1,2,3,4,5);
195 } {1 2 3 4 5}
196
197 do_execsql_test 4.$tn.4 {
198 PRAGMA integrity_check;
199 } {ok}
200 }]
201}
202
203
204
drh4343fea2004-11-05 23:46:15 +0000205finish_test