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