OLD | NEW |
| (Empty) |
1 # 2014 June 17 | |
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 # | |
12 # This file is focused on OOM errors. | |
13 # | |
14 | |
15 source [file join [file dirname [info script]] fts5_common.tcl] | |
16 source $testdir/malloc_common.tcl | |
17 set testprefix fts5fault2 | |
18 | |
19 # If SQLITE_ENABLE_FTS3 is defined, omit this file. | |
20 ifcapable !fts5 { | |
21 finish_test | |
22 return | |
23 } | |
24 | |
25 set doc [string trim [string repeat "x y z " 200]] | |
26 do_execsql_test 1.0 { | |
27 CREATE TABLE t1(a INTEGER PRIMARY KEY, x); | |
28 CREATE VIRTUAL TABLE x1 USING fts5(x, content='t1', content_rowid='a'); | |
29 INSERT INTO x1(x1, rank) VALUES('pgsz', 32); | |
30 WITH input(a,b) AS ( | |
31 SELECT 1, $doc UNION ALL | |
32 SELECT a+1, ($doc || CASE WHEN (a+1)%100 THEN '' ELSE ' xyz' END) | |
33 FROM input WHERE a < 1000 | |
34 ) | |
35 INSERT INTO t1 SELECT * FROM input; | |
36 | |
37 INSERT INTO x1(x1) VALUES('rebuild'); | |
38 } | |
39 | |
40 do_faultsim_test 1.1 -faults oom-* -prep { | |
41 } -body { | |
42 execsql { SELECT rowid FROM x1 WHERE x1 MATCH 'z AND xyz' } | |
43 } -test { | |
44 faultsim_test_result {0 {100 200 300 400 500 600 700 800 900 1000}} | |
45 } | |
46 | |
47 do_faultsim_test 1.2 -faults oom-* -prep { | |
48 } -body { | |
49 execsql { SELECT rowid FROM x1 WHERE x1 MATCH 'z + xyz' ORDER BY 1 DESC} | |
50 } -test { | |
51 faultsim_test_result {0 {1000 900 800 700 600 500 400 300 200 100}} | |
52 } | |
53 | |
54 #------------------------------------------------------------------------- | |
55 # OOM within a query that accesses the in-memory hash table. | |
56 # | |
57 reset_db | |
58 do_execsql_test 2.0 { | |
59 CREATE VIRTUAL TABLE "a b c" USING fts5(a, b, c); | |
60 INSERT INTO "a b c" VALUES('one two', 'x x x', 'three four'); | |
61 INSERT INTO "a b c" VALUES('nine ten', 'y y y', 'two two'); | |
62 } | |
63 | |
64 do_faultsim_test 2.1 -faults oom-trans* -prep { | |
65 execsql { | |
66 BEGIN; | |
67 INSERT INTO "a b c" VALUES('one one', 'z z z', 'nine ten'); | |
68 } | |
69 } -body { | |
70 execsql { SELECT rowid FROM "a b c" WHERE "a b c" MATCH 'one' } | |
71 } -test { | |
72 faultsim_test_result {0 {1 3}} | |
73 catchsql { ROLLBACK } | |
74 } | |
75 | |
76 #------------------------------------------------------------------------- | |
77 # OOM within an 'optimize' operation that writes multiple pages to disk. | |
78 # | |
79 reset_db | |
80 do_execsql_test 3.0 { | |
81 CREATE VIRTUAL TABLE zzz USING fts5(z); | |
82 INSERT INTO zzz(zzz, rank) VALUES('pgsz', 32); | |
83 INSERT INTO zzz VALUES('a b c d'); | |
84 INSERT INTO zzz SELECT 'c d e f' FROM zzz; | |
85 INSERT INTO zzz SELECT 'e f g h' FROM zzz; | |
86 INSERT INTO zzz SELECT 'i j k l' FROM zzz; | |
87 INSERT INTO zzz SELECT 'l k m n' FROM zzz; | |
88 INSERT INTO zzz SELECT 'o p q r' FROM zzz; | |
89 } | |
90 faultsim_save_and_close | |
91 | |
92 do_faultsim_test 3.1 -faults oom-trans* -prep { | |
93 faultsim_restore_and_reopen | |
94 execsql { SELECT rowid FROM zzz } | |
95 } -body { | |
96 execsql { INSERT INTO zzz(zzz) VALUES('optimize') } | |
97 } -test { | |
98 faultsim_test_result {0 {}} | |
99 } | |
100 | |
101 #------------------------------------------------------------------------- | |
102 # OOM within an 'integrity-check' operation. | |
103 # | |
104 reset_db | |
105 db func rnddoc fts5_rnddoc | |
106 do_execsql_test 4.0 { | |
107 CREATE VIRTUAL TABLE zzz USING fts5(z); | |
108 INSERT INTO zzz(zzz, rank) VALUES('pgsz', 32); | |
109 WITH ii(i) AS (SELECT 1 UNION SELECT i+1 FROM ii WHERE i<10) | |
110 INSERT INTO zzz SELECT rnddoc(10) || ' xccc' FROM ii; | |
111 } | |
112 | |
113 do_faultsim_test 4.1 -faults oom-trans* -prep { | |
114 } -body { | |
115 execsql { INSERT INTO zzz(zzz) VALUES('integrity-check') } | |
116 } -test { | |
117 faultsim_test_result {0 {}} | |
118 } | |
119 | |
120 #------------------------------------------------------------------------- | |
121 # OOM while parsing a tokenize=option | |
122 # | |
123 reset_db | |
124 faultsim_save_and_close | |
125 do_faultsim_test 5.0 -faults oom-* -prep { | |
126 faultsim_restore_and_reopen | |
127 } -body { | |
128 execsql { | |
129 CREATE VIRTUAL TABLE uio USING fts5(a, b, | |
130 tokenize="porter 'ascii'", | |
131 content="another table", | |
132 content_rowid="somecolumn" | |
133 ); | |
134 } | |
135 } -test { | |
136 faultsim_test_result {0 {}} | |
137 } | |
138 | |
139 finish_test | |
140 | |
OLD | NEW |