xref: /sqlite-3.40.0/test/fts3fault.test (revision acf1987d)
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
18*acf1987dSdan# If SQLITE_ENABLE_FTS3 is not defined, omit this file.
19*acf1987dSdanifcapable !fts3 { finish_test ; return }
20*acf1987dSdan
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}} \
147af4c214eSdan                       {1 {vtable constructor failed: t1}}
148af4c214eSdan}
149af4c214eSdando_faultsim_test 7.3 -prep {
150af4c214eSdan  faultsim_delete_and_reopen
151af4c214eSdan} -body {
152af4c214eSdan  execsql { CREATE VIRTUAL TABLE t1 USING fts4(a, b, matchnfo=fts3) }
153af4c214eSdan} -test {
154af4c214eSdan  faultsim_test_result {1 {unrecognized parameter: matchnfo=fts3}} \
155af4c214eSdan                       {1 {vtable constructor failed: t1}}
156af4c214eSdan}
157af4c214eSdan
158e25ac099Sdanfinish_test
159