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