Ensure that the xColumnText(), xQueryPhrase() and xPhraseFirstColumn() APIs all retur...
[sqlite.git] / test / fts4aa.test
blob0c6c0b972f1afbdb512265c090d3b8f67f8318fe
1 # 2010 February 02
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 #*************************************************************************
11 # This file implements regression tests for SQLite library.  The
12 # focus of this script is testing the FTS4 module.
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
19 # If SQLITE_ENABLE_FTS3 is defined, omit this file.
20 ifcapable !fts3 {
21   finish_test
22   return
25 # Create the fts_kjv_genesis procedure which fills and FTS3/4 table with
26 # the complete text of the Book of Genesis.
28 source $testdir/genesis.tcl
30 # The following is a list of queries to perform against the above
31 # FTS3/FTS4 database.  We will be trying these queries in various
32 # configurations to ensure that they always return the same answers.
34 set fts4aa_queries {
35   {abraham}
36   {the king}
37   {"the king"}
38   {abraham OR joseph}
39   {ab* OR jos*}
40   {lived t*}
41   {spake hebrew}
42   {melchizedek}
43   {t* melchizedek}
44   {melchizedek t*}
46 unset -nocomplain fts4aa_res
48 # Set up the baseline results
50 do_test fts4aa-1.0 {
51   db eval {
52     CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter);
53   }
54   fts_kjv_genesis
55   foreach q $::fts4aa_queries {
56     set r [db eval {SELECT docid FROM t1 WHERE words MATCH $q ORDER BY docid}]
57     set ::fts4aa_res($q) $r
58   }
59 } {}
61 # Legacy test cases
63 do_test fts4aa-1.1 {
64   db eval {
65     SELECT docid FROM t1 EXCEPT SELECT docid FROM t1_docsize
66   }
67 } {}
68 do_test fts4aa-1.2 {
69   db eval {
70     SELECT docid FROM t1_docsize EXCEPT SELECT docid FROM t1
71   }
72 } {}
74 proc mit {blob} {
75   set scan(littleEndian) i*
76   set scan(bigEndian) I*
77   binary scan $blob $scan($::tcl_platform(byteOrder)) r
78   return $r
80 db func mit mit
82 do_test fts4aa-1.3 {
83   db eval {
84     SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1 WHERE t1 MATCH 'melchizedek';
85   }
86 } {1014018 {1 1 1 1 1 1533 25 20}}
87 do_test fts4aa-1.4 {
88   db eval {
89     SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1
90      WHERE t1 MATCH 'spake hebrew'
91      ORDER BY docid;
92   }
93 } {1039014 {2 1 1 40 40 1 6 6 1533 25 42} 1039017 {2 1 1 40 40 1 6 6 1533 25 26}}
94 do_test fts4aa-1.5 {
95   db eval {
96     SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1
97      WHERE t1 MATCH 'laban overtook jacob'
98      ORDER BY docid;
99   }
100 } {1031025 {3 1 2 54 46 1 3 3 2 181 160 1533 25 24}}
102 do_test fts4aa-1.6 {
103   db eval {
104     DELETE FROM t1 WHERE docid!=1050026;
105     SELECT hex(size) FROM t1_docsize;
106     SELECT hex(value) FROM t1_stat;
107   }
108 } {17 01176F}
110 do_test fts4aa-1.7 {
111   db eval {
112     SELECT docid FROM t1 EXCEPT SELECT docid FROM t1_docsize
113   }
114 } {}
115 do_test fts4aa-1.8 {
116   db eval {
117     SELECT docid FROM t1_docsize EXCEPT SELECT docid FROM t1
118   }
119 } {}
120 ifcapable fts4_deferred {
121   do_test fts4aa-1.9 {
122     # Note: Token 'in' is being deferred in the following query. 
123     db eval {
124       SELECT docid, mit(matchinfo(t1, 'pcxnal')) FROM t1
125        WHERE t1 MATCH 'joseph died in egypt'
126        ORDER BY docid;
127     }
128   } {1050026 {4 1 1 1 1 1 1 1 2 1 1 1 1 1 1 23 23}}
131 # Should get the same search results from FTS3
133 do_test fts4aa-2.0 {
134   db eval {
135     DROP TABLE t1;
136     CREATE VIRTUAL TABLE t1 USING fts3(words, tokenize porter);
137   }
138   fts_kjv_genesis
139 } {}
140 unset -nocomplain ii
141 set ii 0
142 foreach {q r} [array get fts4aa_res] {
143   incr ii
144   do_test fts4aa-2.$ii {
145     db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid}
146   } $r
149 # Should get the same search results when the page size is very large
151 do_test fts4aa-3.0 {
152   db close
153   forcedelete test.db
154   sqlite3 db test.db
155   db eval {
156     PRAGMA page_size=65536;
157     CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter);
158   }
159   fts_kjv_genesis
160 } {}
161 unset -nocomplain ii
162 set ii 0
163 foreach {q r} [array get fts4aa_res] {
164   incr ii
165   do_test fts4aa-3.$ii {
166     db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid}
167   } $r
170 # Should get the same search results when an authorizer prevents
171 # all PRAGMA statements.
173 proc no_pragma_auth {code arg1 arg2 arg3 arg4 args} {
174   if {$code=="SQLITE_PRAGMA"} {return SQLITE_DENY}
175   return SQLITE_OK;
177 do_test fts4aa-4.0 {
178   db auth ::no_pragma_auth
179   db eval {
180     DROP TABLE t1;
181     CREATE VIRTUAL TABLE t1 USING fts4(words, tokenize porter);
182   }
183   fts_kjv_genesis
184 } {}
185 unset -nocomplain ii
186 set ii 0
187 foreach {q r} [array get fts4aa_res] {
188   incr ii
189   do_test fts4aa-4.$ii {
190     db eval {SELECT docid FROM t1 WHERE words MATCH $::q ORDER BY docid}
191   } $r
194 # 2019-11-16 https://bugs.chromium.org/p/chromium/issues/detail?id=1025472
196 db close
197 sqlite3 db :memory:
198 do_execsql_test fts4aa-5.10 {
199   CREATE VIRTUAL TABLE t1 USING fts4(a, b, c, d, e,f,g,h,i,j,k,l,m,n,o,p,q,r);
200   INSERT INTO t1 VALUES('X Y', '2', '3', '4', '5', '6', '7', '8', '9', '0',
201                         'a','b','c','d','e','f','g','h');
202   UPDATE t1_docsize SET size=x'88' WHERE docid=1;
203 } {}
204 do_catchsql_test fts4aa-5.20 {
205   SELECT quote(matchinfo(t1, 'l')) FROM t1 WHERE t1 MATCH 'X Y';
206 } {1 {database disk image is malformed}}
207 do_execsql_test fts4aa-5.30 {
208   DROP TABLE t1;
209   CREATE VIRTUAL TABLE t1 USING fts4(a,b,c,d);
210   INSERT INTO t1 VALUES('one two','three four','five six','seven eight');
211 } {}
212 do_catchsql_test fts4aa-5.40 {
213   UPDATE t1_stat SET value=x'01010101' WHERE id=0;
214   SELECT quote(matchinfo(t1,'a')) FROM t1 WHERE t1 MATCH 'one two';
215 } {1 {database disk image is malformed}}
216 do_catchsql_test fts4aa-5.50 {
217   UPDATE t1_stat SET value=x'010101' WHERE id=0;
218   SELECT quote(matchinfo(t1,'a')) FROM t1 WHERE t1 MATCH 'one two';
219 } {1 {database disk image is malformed}}
220 do_catchsql_test fts4aa-5.60 {
221   UPDATE t1_stat SET value=x'01' WHERE id=0;
222   SELECT quote(matchinfo(t1,'a')) FROM t1 WHERE t1 MATCH 'one two';
223 } {1 {database disk image is malformed}}
224 do_catchsql_test fts4aa-5.70 {
225   UPDATE t1_stat SET value=x'' WHERE id=0;
226   SELECT quote(matchinfo(t1,'a')) FROM t1 WHERE t1 MATCH 'one two';
227 } {1 {database disk image is malformed}}
229 # 2019-11-18 https://bugs.chromium.org/p/chromium/issues/detail?id=1025467
230 db close
231 sqlite3 db :memory:
232 if {$tcl_platform(byteOrder)=="littleEndian"} {
233   set res {X'0200000000000000000000000E0000000E00000001000000010000000100000001000000'}
234 } else {
235   set res {X'0000000200000000000000000000000E0000000E00000001000000010000000100000001'}
237 do_catchsql_test fts4aa-6.10 {
238   CREATE VIRTUAL TABLE f USING fts4();
239   INSERT INTO f_segdir VALUES (77,91,0,0,'255 77',x'0001308000004d5c4ddddddd4d4d7b4d4d4d614d8019ff4d05000001204d4d2e4d6e4d4d4d4b4d6c4d004d4d4d4d4d4d3d000000004d5d4d4d645d4d004d4d4d4d4d4d4d4d4d454d6910004d05ffff054d646c4d004d5d4d4d4d4d3d000000004d4d4d4d4d4d4d4d4d4d4d69624d4d4d04004d4d4d4d4d604d4ce1404d554d45');
240   INSERT INTO f_segdir VALUES (77,108,0,0,'255 77',x'0001310000fa64004d4d4d3c5d4d654d4d4d614d8000ff4d05000001204d4d2e4d6e4d4d4dff4d4d4d4d4d4d00104d4d4d4d000000004d4d4d0400311d4d4d4d4d4d4d4d4d4d684d6910004d05ffff054d4d6c4d004d4d4d4d4d4d3d000000004d4d4d4d644d4d4d4d4d4d69624d4d4d03ed4d4d4d4d4d604d4ce1404d550080');
241   INSERT INTO f_stat VALUES (0,x'80808080100000000064004d4d4d3c4d4d654d4d4d614d8000ff4df6ff1a00204d4d2e4d6e4d4d4d104d4d4d4d4d4d00104d4d4d4d4d4d69574d4d4d000031044d4d4d3e4d4d4c4d05004d6910');
242   SELECT quote(matchinfo(f,'pnax')) from f where f match '0 1';
243 } {1 {database disk image is malformed}}
245 # 2019-11-18 Detect infinite loop in fts3SelectLeaf()
246 db close
247 sqlite3 db :memory:
248 do_catchsql_test fts4aa-7.10 {
249   CREATE VIRTUAL TABLE f USING fts4();
250   INSERT INTO f_segdir VALUES (63,60,60,60,'60 60',x'3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c483c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c20003c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c283c3c3c3c3c3c3c3c3c3c3c223c3c3c3c3c3c3c3c3c');
251   INSERT INTO f_segments VALUES (60,x'3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c5a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c5e3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c803c3c3c3c3c3c233c3c3c3c1c3c3c3c3c3c3c3c3c3c3c3c1b3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c273c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1a3c3c3c3c3c3c000200003c3c3c3c3c3c3c3c3c3c3c3c3c383c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d898d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d3c3c3c3c3c3c3c3c3c3cba3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c00023c3c3c3c3c3c383c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cbc3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2c3c3c3c403c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c16161616161616163c3c3c3c3c3c3c3c3c3c3c3c3c583c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2b3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1c013c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c20003c3c3c3c3c3c3c3c3c3c3c800000003c3c3c3c3c3c3c2c3c3c3c3c3c3c353c08080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808f4080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808083c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c323c3c3c3c3c3c3c3c3c3c3c4f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cfcfcfcfcfcfcfcfcfcfcfc10fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfd02fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc03e8fcfcfcfc3c3c3c3c3c3c8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c553c3c3c3c3c3c3c3c3c3c3c3c3c573c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c000000803c3c4dd5d5a6d52cf3d5d5d5d5d5d5d5d5d5d5d5d5d5d53c3c3c3c3f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c013c3c3c3c00643c3c3c3ce93c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c263c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c363c3c3c3c3c3c3c3c3c3c3c3c3c3c543c3c3c3c3c3c3c3c3c3c273c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c330000003c3c3c3c3c3c3c3c3c3c3c3c3c3c4d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c000010003c3c3c3c3c3c413c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c403c3c3c3c3c3c3c3c3c3c3c3cec0000fa3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c4c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c5e3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c1b3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c593c3c3c3c3c3c243c3c373c3c3c3c3cff3c3c3c3c3c3c3c3c3c3c3c3c3c000080003c3c3c3c3c3c3c3c3c3c353c3c3c3c3c3d3c3c3c3c3c3c3c3c3c3c3c3c4d3c3c3c3c3c3c3c3c3c3c3c3c3c40003c3c3c3c3c293c3c3c3c3c3c3c3c3c3d3c3c3c3c3c3c3c3c353c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c4f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cff7f3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c2d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3ca43c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3cbf3c3c3c3c3c3c3c3c3c008000003c3c3c3c3c3c3c3c343c3c373c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c593c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c');
252   SELECT * from f where f match '0';
253 } {1 {database disk image is malformed}}
256 finish_test