Improved comments, including a typo fix, on the whereLoopCheaperProperSubset()
[sqlite.git] / test / fts3malloc.test
blobed30fe24c8ab0928bae84471e7b8c9e2ad302d2b
1 # 2009 October 22
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
12 # This file contains tests to verify that malloc() errors that occur
13 # within the FTS3 module code are handled correctly. 
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
18 ifcapable !fts3 { finish_test ; return }
19 source $testdir/malloc_common.tcl
20 source $testdir/fts3_common.tcl
22 # Ensure the lookaside buffer is disabled for these tests.
24 sqlite3 db test.db
25 sqlite3_db_config_lookaside db 0 0 0
27 set sqlite_fts3_enable_parentheses 1
28 set DO_MALLOC_TEST 1
30 # Test organization:
32 # fts3_malloc-1.*: Test OOM during CREATE and DROP table statements.
33 # fts3_malloc-2.*: Test OOM during SELECT operations.
34 # fts3_malloc-3.*: Test OOM during SELECT operations with a larger database.
35 # fts3_malloc-4.*: Test OOM during database write operations.
36 # fts3_malloc-5.*: Test that a couple of memory leaks that could follow
37 #                  OOM in tokenizer code have been fixed.
41 proc normal_list {l} {
42   set ret [list]
43   foreach elem $l {lappend ret $elem}
44   set ret
47 do_write_test fts3_malloc-1.1 sqlite_master {
48   CREATE VIRTUAL TABLE ft1 USING fts3(a, b)
50 do_write_test fts3_malloc-1.2 sqlite_master {
51   CREATE VIRTUAL TABLE ft2 USING fts3([a], [b]);
53 do_write_test fts3_malloc-1.3 sqlite_master {
54   CREATE VIRTUAL TABLE ft3 USING fts3('a', "b");
56 do_write_test fts3_malloc-1.4 sqlite_master {
57   CREATE VIRTUAL TABLE ft4 USING fts3(`a`, 'fred''s column');
59 do_error_test fts3_malloc-1.5 {
60   CREATE VIRTUAL TABLE ft5 USING fts3(a, b, tokenize unknown)
61 } {unknown tokenizer: unknown}
62 do_write_test fts3_malloc-1.6 sqlite_master {
63   CREATE VIRTUAL TABLE ft6 USING fts3(a, b, tokenize porter)
65 do_write_test fts3_malloc-1.7 sqlite_master {
66   CREATE VIRTUAL TABLE ft7 USING fts4(a, b, notindexed=b)
69 # Test the xConnect/xDisconnect methods:
70 #db eval { ATTACH 'test2.db' AS aux }
71 #do_write_test fts3_malloc-1.6 aux.sqlite_master {
72 #  CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
74 #do_write_test fts3_malloc-1.6 aux.sqlite_master {
75 #  CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
80 do_test fts3_malloc-2.0 {
81   execsql { 
82     DROP TABLE ft1;
83     DROP TABLE ft2;
84     DROP TABLE ft3;
85     DROP TABLE ft4;
86     DROP TABLE ft6;
87     DROP TABLE ft7;
88   }
89   execsql { CREATE VIRTUAL TABLE ft USING fts3(a, b) }
90   for {set ii 1} {$ii < 32} {incr ii} {
91     set a [list]
92     set b [list]
93     if {$ii & 0x01} {lappend a one   ; lappend b neung}
94     if {$ii & 0x02} {lappend a two   ; lappend b song }
95     if {$ii & 0x04} {lappend a three ; lappend b sahm }
96     if {$ii & 0x08} {lappend a four  ; lappend b see  }
97     if {$ii & 0x10} {lappend a five  ; lappend b hah  }
98     execsql { INSERT INTO ft VALUES($a, $b) }
99   }
100 } {}
102 foreach {tn sql result} {
103   1 "SELECT count(*) FROM sqlite_master" {5}
104   2 "SELECT * FROM ft WHERE docid = 1"   {one neung}
105   3 "SELECT * FROM ft WHERE docid = 2"   {two song}
106   4 "SELECT * FROM ft WHERE docid = 3"   {{one two} {neung song}}
108   5 "SELECT a FROM ft" {
109     {one}                     {two}                 {one two}
110     {three}                   {one three}           {two three}     
111     {one two three}           {four}                {one four} 
112     {two four}                {one two four}        {three four}   
113     {one three four}          {two three four}      {one two three four}  
114     {five}                    {one five}            {two five}            
115     {one two five}            {three five}          {one three five} 
116     {two three five}          {one two three five}  {four five}
117     {one four five}           {two four five}       {one two four five}
118     {three four five}         {one three four five} {two three four five}
119     {one two three four five}
120   }
122   6 "SELECT a FROM ft WHERE a MATCH 'one'" {
123     {one} {one two} {one three} {one two three}
124     {one four} {one two four} {one three four} {one two three four}
125     {one five} {one two five} {one three five} {one two three five}
126     {one four five} {one two four five} 
127     {one three four five} {one two three four five}
128   }
130   7 "SELECT a FROM ft WHERE a MATCH 'o*'" {
131     {one} {one two} {one three} {one two three}
132     {one four} {one two four} {one three four} {one two three four}
133     {one five} {one two five} {one three five} {one two three five}
134     {one four five} {one two four five} 
135     {one three four five} {one two three four five}
136   }
138   8 "SELECT a FROM ft WHERE a MATCH 'o* t*'" {
139     {one two}             {one three}           {one two three} 
140     {one two four}        {one three four}      {one two three four} 
141     {one two five}        {one three five}      {one two three five} 
142     {one two four five}   {one three four five} {one two three four five}
143   }
145   9 "SELECT a FROM ft WHERE a MATCH '\"o* t*\"'" {
146     {one two}             {one three}           {one two three} 
147     {one two four}        {one three four}      {one two three four} 
148     {one two five}        {one three five}      {one two three five} 
149     {one two four five}   {one three four five} {one two three four five}
150   }
152   10 {SELECT a FROM ft WHERE a MATCH '"o* f*"'} {
153     {one four}            {one five}            {one four five}
154   }
156   11 {SELECT a FROM ft WHERE a MATCH '"one two three"'} {
157     {one two three}
158     {one two three four}  
159     {one two three five}
160     {one two three four five}
161   }
163   12 {SELECT a FROM ft WHERE a MATCH '"two three four"'} {
164     {two three four}
165     {one two three four}
166     {two three four five}
167     {one two three four five}
168   }
170   12 {SELECT a FROM ft WHERE a MATCH '"two three" five'} {
171     {two three five}         {one two three five}
172     {two three four five}    {one two three four five}
173   }
175   13 {SELECT a FROM ft WHERE ft MATCH '"song sahm" hah'} {
176     {two three five}         {one two three five}
177     {two three four five}    {one two three four five}
178   }
180   14 {SELECT a FROM ft WHERE b MATCH 'neung'} {
181     {one}                    {one two} 
182     {one three}              {one two three}
183     {one four}               {one two four} 
184     {one three four}         {one two three four}
185     {one five}               {one two five} 
186     {one three five}         {one two three five}
187     {one four five}          {one two four five} 
188     {one three four five}    {one two three four five}
189   }
191   15 {SELECT a FROM ft WHERE b MATCH '"neung song sahm"'} {
192     {one two three}          {one two three four}  
193     {one two three five}     {one two three four five}
194   }
196   16 {SELECT a FROM ft WHERE b MATCH 'hah "song sahm"'} {
197     {two three five}         {one two three five}
198     {two three four five}    {one two three four five}
199   }
201   17 {SELECT a FROM ft WHERE b MATCH 'song OR sahm'} {
202     {two}                     {one two}             {three}
203     {one three}               {two three}           {one two three}
204     {two four}                {one two four}        {three four}   
205     {one three four}          {two three four}      {one two three four}  
206     {two five}                {one two five}        {three five}
207     {one three five}          {two three five}      {one two three five}
208     {two four five}           {one two four five}   {three four five}
209     {one three four five}     {two three four five} {one two three four five}
210   }
212   18 {SELECT a FROM ft WHERE a MATCH 'three NOT two'} {
213     {three}                   {one three}           {three four}   
214     {one three four}          {three five}          {one three five}
215     {three four five}         {one three four five}
216   }
218   19 {SELECT a FROM ft WHERE b MATCH 'sahm NOT song'} {
219     {three}                   {one three}           {three four}   
220     {one three four}          {three five}          {one three five}
221     {three four five}         {one three four five}
222   }
224   20 {SELECT a FROM ft WHERE ft MATCH 'sahm NOT song'} {
225     {three}                   {one three}           {three four}   
226     {one three four}          {three five}          {one three five}
227     {three four five}         {one three four five}
228   }
230   21 {SELECT a FROM ft WHERE b MATCH 'neung NEAR song NEAR sahm'} {
231     {one two three}           {one two three four}  
232     {one two three five}      {one two three four five}
233   }
235 } {
236   set result [normal_list $result]
237   do_select_test fts3_malloc-2.$tn $sql $result
240 do_test fts3_malloc-3.0 {
241   execsql BEGIN
242   for {set ii 32} {$ii < 1024} {incr ii} {
243     set a [list]
244     set b [list]
245     if {$ii & 0x0001} {lappend a one   ; lappend b neung }
246     if {$ii & 0x0002} {lappend a two   ; lappend b song  }
247     if {$ii & 0x0004} {lappend a three ; lappend b sahm  }
248     if {$ii & 0x0008} {lappend a four  ; lappend b see   }
249     if {$ii & 0x0010} {lappend a five  ; lappend b hah   }
250     if {$ii & 0x0020} {lappend a six   ; lappend b hok   }
251     if {$ii & 0x0040} {lappend a seven ; lappend b jet   }
252     if {$ii & 0x0080} {lappend a eight ; lappend b bairt }
253     if {$ii & 0x0100} {lappend a nine  ; lappend b gow   }
254     if {$ii & 0x0200} {lappend a ten   ; lappend b sip   }
255     execsql { INSERT INTO ft VALUES($a, $b) }
256   }
257   execsql COMMIT
258 } {}
259 foreach {tn sql result} {
260   1 "SELECT count(*) FROM ft" {1023}
262   2 "SELECT a FROM ft WHERE a MATCH 'one two three four five six seven eight'" {
263      {one two three four five six seven eight}
264      {one two three four five six seven eight nine}
265      {one two three four five six seven eight ten}
266      {one two three four five six seven eight nine ten}
267   }
269   3 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH 'o*'} {
270     512 262144
271   }
273   4 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH '"two three four"'} {
274     128 66368
275   }
276 } {
277   set result [normal_list $result]
278   do_select_test fts3_malloc-3.$tn $sql $result
281 do_test fts3_malloc-4.0 {
282   execsql { DELETE FROM ft WHERE docid>=32 }
283 } {}
284 foreach {tn sql} {
285   1 "DELETE FROM ft WHERE ft MATCH 'one'"
286   2 "DELETE FROM ft WHERE ft MATCH 'three'"
287   3 "DELETE FROM ft WHERE ft MATCH 'five'"
288 } {
289   do_write_test fts3_malloc-4.1.$tn ft_content $sql
291 do_test fts3_malloc-4.2 {
292   execsql { SELECT a FROM ft }
293 } {two four {two four}}
295 do_write_test fts3_malloc-5.1 ft_content {
296   INSERT INTO ft VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken', 'cynics!')
298 do_test fts3_malloc-5.2 {
299   execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) }
300 } {}
302 do_write_test fts3_malloc-5.3 ft_content {
303   INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')
307 finish_test