OLD | NEW |
| (Empty) |
1 # 2010 October 30 | |
2 # | |
3 # May you do good and not evil. | |
4 # May you find forgiveness for yourself and forgive others. | |
5 # May you share freely, never taking more than you give. | |
6 # | |
7 #*********************************************************************** | |
8 # Test that the FTS3 extension does not crash when it encounters a | |
9 # corrupt data structure on disk. | |
10 # | |
11 | |
12 set testdir [file dirname $argv0] | |
13 source $testdir/tester.tcl | |
14 | |
15 # If SQLITE_ENABLE_FTS3 is not defined, omit this file. | |
16 ifcapable !fts3 { finish_test ; return } | |
17 | |
18 set ::testprefix fts3corrupt2 | |
19 | |
20 set data [list] | |
21 lappend data {*}{ | |
22 "amxtvoo adqwroyhz auq aithtir avniqnuynvf axp ahibayfynig agbicpm" | |
23 "ajdtebs anteaxr aieynenwmd awpl alo akxcrwow aoxftge aoqvgul" | |
24 "amcfvdr auz apu aebelm ahuxyz aqc asyafdb agulvhvqu" | |
25 "apepwfyz azkhdvkw aenyelxzbk aslnitbyet aycdsdcpgr aqzzdbc agfi axnypydou" | |
26 "aaqrzzcm apcxdxo atumltzj aevvivo aodknoft aqoyytoz alobx apldt" | |
27 "adjllxlhnmj aiuhvuj adwppceuht atvj azrsam ahkjqdhny audlqxr aotgcd" | |
28 "aira azflsceos awj auzbobfkc awmezplr aeh awec ahndxlmv" | |
29 "aydwnied alk auoap agihyqeix aymqxzajnl aydwnied aojkarx agbo" | |
30 "ahajsmcl anvx amdhjm aoptsj agugzjjm apkevm acnj acjg" | |
31 "amwtkw aogttbykvt aubwrfqnbjf ajow agsj aerkqzjdqst anenlvbalkn arfajzzgckx" | |
32 "adqqqofkmz amjpavjuhw aqgehgnb awvvxlbtqzn agstqko akmkzehyh atagzey agwja" | |
33 "amag ahe autkllywhr avnk atmt akn anvdh aixfrv" | |
34 "aqdyerbws avefykly awl azaduojgzo anxfsmw axpt abgbvk ati" | |
35 "attyqkwz aiweypiczul afy asitaqbczhh aitxisizpv auhviq aibql ajfqc" | |
36 "aylzprtmta aiuemihqrpi awluvgsw ampbuy axlifpzfqr aems aoaxwads apianfn" | |
37 "aodrkijelq acdb aaserrdxm aqyasgofqu aevvivo afi apmwu aeoqysl" | |
38 "amqnk ankaotm ayfy ajcupeeoc advcbukan aucahlwnyk adbfyo azqjpeant" | |
39 "afczpp asqrs ahslvda akhlf aiqgdp atyd aznuglxqbrg awirndrh" | |
40 "aqhiajp amxeazb asxuehg akod axvolvsp agcz asmovmohy acmqa" | |
41 "avvomv aafms ashuaec arevx audtq alrwqhjvao avgsgpg ajbrctpsel" | |
42 "atxoirr ayopboobqdu ajunntua arh aernimxid aipljda aglo aefk" | |
43 "aonxf acmnnkna abgviaswe aulvcbv axp apemgakpzo aibql acioaid" | |
44 "axo alrwqhjvao ayqounftdzl azmoakdyh apajze ajk artvy apxiamy" | |
45 "ayjafsraz addjj agsj asejtziqws acatvhegu aoxdjqblsvv aekdmmbs aaobe" | |
46 "abjjvzubkwt alczv ati awz auyxgcxeb aymjoym anqoukprtyt atwfhpmbooh" | |
47 "ajfqz aethlgir aclcx aowlyvetby aproqm afjlqtkv anebfy akzrcpfrrvw" | |
48 "aoledfotm aiwlfm aeejlaej anz abgbvk aktfn aayoh anpywgdvgz" | |
49 "acvmldguld asdvz aqb aeomsyzyu aggylhprbdz asrfkwz auipybpsn agsnszzfb" | |
50 } | |
51 | |
52 do_test fts3corrupt2-1.0 { | |
53 execsql BEGIN | |
54 execsql { CREATE VIRTUAL TABLE t2 USING FTS3(a, b); } | |
55 execsql { INSERT INTO t2(t2) VALUES('nodesize=32') } | |
56 foreach d $data { | |
57 execsql { INSERT INTO t2 VALUES($d, $d) } | |
58 } | |
59 execsql COMMIT | |
60 execsql { SELECT count(*) FROM t2_segments } | |
61 } {163} | |
62 | |
63 proc set_byte {blob byte val} { | |
64 binary format a*ca* \ | |
65 [string range $blob 0 [expr $byte-1]] \ | |
66 $val \ | |
67 [string range $blob [expr $byte+1] end] \ | |
68 } | |
69 | |
70 set tn 0 | |
71 set c 256 | |
72 foreach {rowid sz blob} [ | |
73 db eval {SELECT rowid, length(block), block FROM t2_segments} | |
74 ] { | |
75 incr tn | |
76 set c [expr (($c+255)%256)] | |
77 for {set i 0} {$i < $sz} {incr i} { | |
78 set b2 [set_byte $blob $i $c] | |
79 execsql { UPDATE t2_segments SET block = $b2 WHERE rowid = $rowid } | |
80 do_test fts3corrupt2-1.$tn.$i { | |
81 catchsql { SELECT * FROM t2 WHERE t2 MATCH 'a*' } | |
82 set {} {} | |
83 } {} | |
84 } | |
85 execsql { UPDATE t2_segments SET block = $blob WHERE rowid = $rowid } | |
86 } | |
87 | |
88 foreach c {50 100 150 200 250} { | |
89 foreach {rowid sz blob} [ | |
90 db eval {SELECT rowid, length(root), root FROM t2_segdir} | |
91 ] { | |
92 incr tn | |
93 for {set i 0} {$i < $sz} {incr i} { | |
94 set b2 [set_byte $blob $i $c] | |
95 execsql { UPDATE t2_segdir SET root = $b2 WHERE rowid = $rowid } | |
96 do_test fts3corrupt2-2.$c.$tn.$i { | |
97 catchsql { SELECT * FROM t2 WHERE t2 MATCH 'a*' } | |
98 set {} {} | |
99 } {} | |
100 } | |
101 execsql { UPDATE t2_segdir SET root = $blob WHERE rowid = $rowid } | |
102 } | |
103 } | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 finish_test | |
OLD | NEW |