xref: /sqlite-3.40.0/test/fts3fault.test (revision a90579db)
1e25ac099Sdan# 2010 June 15
2e25ac099Sdan#
3e25ac099Sdan# The author disclaims copyright to this source code.  In place of
4e25ac099Sdan# a legal notice, here is a blessing:
5e25ac099Sdan#
6e25ac099Sdan#    May you do good and not evil.
7e25ac099Sdan#    May you find forgiveness for yourself and forgive others.
8e25ac099Sdan#    May you share freely, never taking more than you give.
9e25ac099Sdan#
10e25ac099Sdan#***********************************************************************
11e25ac099Sdan#
12e25ac099Sdan
13e25ac099Sdanset testdir [file dirname $argv0]
14e25ac099Sdansource $testdir/tester.tcl
15e25ac099Sdan
16e25ac099Sdanset ::testprefix fts3fault
17e25ac099Sdan
18acf1987dSdan# If SQLITE_ENABLE_FTS3 is not defined, omit this file.
19acf1987dSdanifcapable !fts3 { finish_test ; return }
20acf1987dSdan
21*a90579dbSdanif 0 {
22*a90579dbSdan
23e25ac099Sdan# Test error handling in the sqlite3Fts3Init() function. This is the
24e25ac099Sdan# function that registers the FTS3 module and various support functions
25e25ac099Sdan# with SQLite.
26e25ac099Sdan#
27e25ac099Sdando_faultsim_test 1 -body {
28e25ac099Sdan  sqlite3 db test.db
29e25ac099Sdan  expr 0
30e25ac099Sdan} -test {
31e25ac099Sdan  catch { db close }
32e25ac099Sdan}
33e25ac099Sdan
34e25ac099Sdan# Test error handling in an "ALTER TABLE ... RENAME TO" statement on an
35e25ac099Sdan# FTS3 table. Specifically, test renaming the table within a transaction
36e25ac099Sdan# after it has been written to.
37e25ac099Sdan#
38e25ac099Sdanfaultsim_delete_and_reopen
39e25ac099Sdando_execsql_test 2.0 {
40e25ac099Sdan  CREATE VIRTUAL TABLE t1 USING fts3;
41e25ac099Sdan  INSERT INTO t1 VALUES('test renaming the table');
42e25ac099Sdan  INSERT INTO t1 VALUES(' after it has been written');
43e25ac099Sdan}
44e25ac099Sdando_faultsim_test 2 -prep {
45e25ac099Sdan  sqlite3 db test.db
46e25ac099Sdan  execsql {
47e25ac099Sdan    BEGIN;
48e25ac099Sdan      INSERT INTO t1 VALUES('registers the FTS3 module');
49e25ac099Sdan      INSERT INTO t1 VALUES('various support functions');
50e25ac099Sdan  }
51e25ac099Sdan} -body {
52e25ac099Sdan  execsql { ALTER TABLE t1 RENAME TO t2 }
53e25ac099Sdan} -test {
54e25ac099Sdan  faultsim_test_result {0 {}}
55e25ac099Sdan}
56e25ac099Sdan
57e25ac099Sdan# Test error handling in the special case where a single prefix query
58e25ac099Sdan# matches terms that reside on a large range of leaf nodes.
59e25ac099Sdan#
60e25ac099Sdando_test fts3fault-3.0 {
61e25ac099Sdan  sqlite3 db test.db
62e25ac099Sdan  execsql { CREATE VIRTUAL TABLE t3 USING fts4; }
63e25ac099Sdan  execsql { INSERT INTO t3(t3) VALUES('nodesize=50') }
64e25ac099Sdan  execsql { BEGIN }
65e25ac099Sdan  for {set i 0} {$i < 1000} {incr i} {
66e25ac099Sdan    execsql { INSERT INTO t3 VALUES('aaa' || $i) }
67e25ac099Sdan  }
68e25ac099Sdan  execsql { COMMIT }
69e25ac099Sdan} {}
70e25ac099Sdan
71e25ac099Sdando_faultsim_test 3 -faults oom-transient -prep {
72e25ac099Sdan  sqlite3 db test.db
73e25ac099Sdan  execsql { SELECT * FROM t3 WHERE t3 MATCH 'x' }
74e25ac099Sdan} -body {
75e25ac099Sdan  execsql { SELECT count(rowid) FROM t3 WHERE t3 MATCH 'aa*' }
76e25ac099Sdan} -test {
77e25ac099Sdan  faultsim_test_result {0 1000}
78e25ac099Sdan}
79e25ac099Sdan
80e25ac099Sdando_test fts3fault-4.0 {
81e25ac099Sdan  faultsim_delete_and_reopen
82e25ac099Sdan  execsql {
83e25ac099Sdan    CREATE VIRTUAL TABLE t4 USING fts4;
84e25ac099Sdan    INSERT INTO t4 VALUES('The British Government called on');
85e25ac099Sdan    INSERT INTO t4 VALUES('as pesetas then became much');
86e25ac099Sdan  }
87e25ac099Sdan} {}
88e25ac099Sdanfaultsim_save_and_close
89e25ac099Sdando_faultsim_test 4 -prep {
90e25ac099Sdan  faultsim_restore_and_reopen
91e25ac099Sdan  execsql { SELECT content FROM t4 }
92e25ac099Sdan} -body {
93e25ac099Sdan  execsql { SELECT optimize(t4) FROM t4 LIMIT 1 }
94e25ac099Sdan} -test {
95e25ac099Sdan  faultsim_test_result {0 {{Index optimized}}}
96e25ac099Sdan}
97e25ac099Sdan
98e25ac099Sdando_test fts3fault-5.0 {
99e25ac099Sdan  faultsim_delete_and_reopen
100e25ac099Sdan  execsql {
101e25ac099Sdan    CREATE VIRTUAL TABLE t5 USING fts4;
102e25ac099Sdan    INSERT INTO t5 VALUES('The British Government called on');
103e25ac099Sdan    INSERT INTO t5 VALUES('as pesetas then became much');
104e25ac099Sdan  }
105e25ac099Sdan} {}
106e25ac099Sdanfaultsim_save_and_close
107e25ac099Sdando_faultsim_test 5 -prep {
108e25ac099Sdan  faultsim_restore_and_reopen
109e25ac099Sdan  execsql {
110e25ac099Sdan    BEGIN;
111e25ac099Sdan      INSERT INTO t5 VALUES('influential in shaping his future outlook');
112e25ac099Sdan      INSERT INTO t5 VALUES('might be acceptable to the British electorate');
113e25ac099Sdan  }
114e25ac099Sdan} -body {
115e25ac099Sdan  execsql { SELECT rowid FROM t5 WHERE t5 MATCH 'british' }
116e25ac099Sdan} -test {
117e25ac099Sdan  faultsim_test_result {0 {1 4}}
118e25ac099Sdan}
119e25ac099Sdan
120e25ac099Sdando_test fts3fault-6.0 {
121e25ac099Sdan  faultsim_delete_and_reopen
122e25ac099Sdan  execsql { CREATE VIRTUAL TABLE t6 USING fts4 }
123e25ac099Sdan} {}
124e25ac099Sdanfaultsim_save_and_close
125e25ac099Sdando_faultsim_test 6 -prep {
126e25ac099Sdan  faultsim_restore_and_reopen
127e25ac099Sdan  execsql { SELECT rowid FROM t6 }
128e25ac099Sdan} -body {
129e25ac099Sdan  execsql { DROP TABLE t6 }
130e25ac099Sdan} -test {
131e25ac099Sdan  faultsim_test_result {0 {}}
132e25ac099Sdan}
133e25ac099Sdan
134af4c214eSdan# Test various malloc failures while processing FTS4 parameters.
135af4c214eSdan#
136af4c214eSdando_faultsim_test 7.1 -prep {
137af4c214eSdan  faultsim_delete_and_reopen
138af4c214eSdan} -body {
139af4c214eSdan  execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchinfo=fts3) }
140af4c214eSdan} -test {
141af4c214eSdan  faultsim_test_result {0 {}}
142af4c214eSdan}
143af4c214eSdando_faultsim_test 7.2 -prep {
144af4c214eSdan  faultsim_delete_and_reopen
145af4c214eSdan} -body {
146af4c214eSdan  execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchinfo=fs3) }
147af4c214eSdan} -test {
148af4c214eSdan  faultsim_test_result {1 {unrecognized matchinfo: fs3}} \
1499fc160c7Sdan                       {1 {vtable constructor failed: t1}} \
1509fc160c7Sdan                       {1 {SQL logic error or missing database}}
151af4c214eSdan}
152af4c214eSdando_faultsim_test 7.3 -prep {
153af4c214eSdan  faultsim_delete_and_reopen
154af4c214eSdan} -body {
155af4c214eSdan  execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchnfo=fts3) }
156af4c214eSdan} -test {
157af4c214eSdan  faultsim_test_result {1 {unrecognized parameter: matchnfo=fts3}} \
1589fc160c7Sdan                       {1 {vtable constructor failed: t1}} \
1599fc160c7Sdan                       {1 {SQL logic error or missing database}}
160c2f16cb1Sdan}
161c2f16cb1Sdan
162*a90579dbSdan
163*a90579dbSdan}
164*a90579dbSdan
165c2f16cb1Sdanproc mit {blob} {
166c2f16cb1Sdan  set scan(littleEndian) i*
167c2f16cb1Sdan  set scan(bigEndian) I*
168c2f16cb1Sdan  binary scan $blob $scan($::tcl_platform(byteOrder)) r
169c2f16cb1Sdan  return $r
170c2f16cb1Sdan}
171c2f16cb1Sdan
172c2f16cb1Sdando_test 8.0 {
173c2f16cb1Sdan  faultsim_delete_and_reopen
174c2f16cb1Sdan  execsql { CREATE VIRTUAL TABLE t8 USING fts4 }
175c2f16cb1Sdan  execsql "INSERT INTO t8 VALUES('a b c')"
176c2f16cb1Sdan  execsql "INSERT INTO t8 VALUES('b b b')"
177c2f16cb1Sdan  execsql "INSERT INTO t8 VALUES('[string repeat {c } 50000]')"
178c2f16cb1Sdan  execsql "INSERT INTO t8 VALUES('d d d')"
179c2f16cb1Sdan  execsql "INSERT INTO t8 VALUES('e e e')"
180c2f16cb1Sdan  execsql "INSERT INTO t8(t8) VALUES('optimize')"
181c2f16cb1Sdan  faultsim_save_and_close
182c2f16cb1Sdan} {}
183c2f16cb1Sdan
184*a90579dbSdando_faultsim_test 8.1 -faults oom-t* -prep {
185c2f16cb1Sdan  faultsim_restore_and_reopen
186c2f16cb1Sdan  db func mit mit
187c2f16cb1Sdan} -body {
188c2f16cb1Sdan  execsql { SELECT mit(matchinfo(t8, 'x')) FROM t8 WHERE t8 MATCH 'a b c' }
189c2f16cb1Sdan} -test {
190c2f16cb1Sdan  faultsim_test_result {0 {{1 1 1 1 4 2 1 5 5}}}
191c2f16cb1Sdan}
192*a90579dbSdan
193c2f16cb1Sdando_faultsim_test 8.2 -faults oom-t* -prep {
194c2f16cb1Sdan  faultsim_restore_and_reopen
195c2f16cb1Sdan  db func mit mit
196c2f16cb1Sdan} -body {
197c2f16cb1Sdan  execsql { SELECT mit(matchinfo(t8, 's')) FROM t8 WHERE t8 MATCH 'a b c' }
198c2f16cb1Sdan} -test {
199c2f16cb1Sdan  faultsim_test_result {0 3}
200c2f16cb1Sdan}
201c2f16cb1Sdando_faultsim_test 8.3 -prep {
202c2f16cb1Sdan  faultsim_restore_and_reopen
203c2f16cb1Sdan  db func mit mit
204c2f16cb1Sdan} -body {
205c2f16cb1Sdan  execsql { SELECT mit(matchinfo(t8, 'a')) FROM t8 WHERE t8 MATCH 'a b c' }
206c2f16cb1Sdan} -test {
207c2f16cb1Sdan  faultsim_test_result {0 10002}
208c2f16cb1Sdan}
209c2f16cb1Sdando_faultsim_test 8.4 -prep {
210c2f16cb1Sdan  faultsim_restore_and_reopen
211c2f16cb1Sdan  db func mit mit
212c2f16cb1Sdan} -body {
213c2f16cb1Sdan  execsql { SELECT mit(matchinfo(t8, 'l')) FROM t8 WHERE t8 MATCH 'a b c' }
214c2f16cb1Sdan} -test {
215c2f16cb1Sdan  faultsim_test_result {0 3}
216c2f16cb1Sdan}
217c2f16cb1Sdan
218c2f16cb1Sdando_test 9.0 {
219c2f16cb1Sdan  faultsim_delete_and_reopen
220c2f16cb1Sdan  execsql {
221c2f16cb1Sdan    CREATE VIRTUAL TABLE t9 USING fts4(tokenize=porter);
222c2f16cb1Sdan    INSERT INTO t9 VALUES(
223c2f16cb1Sdan      'this record is used toooooooooooooooooooooooooooooooooooooo try to'
224c2f16cb1Sdan    );
225c2f16cb1Sdan    SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to*';
226c2f16cb1Sdan  }
227c2f16cb1Sdan  faultsim_save_and_close
228c2f16cb1Sdan} {}
229c2f16cb1Sdando_faultsim_test 9.1 -prep {
230c2f16cb1Sdan  faultsim_restore_and_reopen
231c2f16cb1Sdan} -body {
232c2f16cb1Sdan  execsql { SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to*' }
233c2f16cb1Sdan} -test {
234c2f16cb1Sdan  faultsim_test_result {0 {{0 0 20 39 0 0 64 2}}}
235c2f16cb1Sdan}
236c2f16cb1Sdan
237e25ac099Sdanfinish_test
238