]> granicus.if.org Git - postgresql/blob - src/test/regress/sql/tsearch.sql
9fd12076acedb0b7c2a617466070b49e76f40778
[postgresql] / src / test / regress / sql / tsearch.sql
1 --
2 -- Sanity checks for text search catalogs
3 --
4 -- NB: we assume the oidjoins test will have caught any dangling links,
5 -- that is OID or REGPROC fields that are not zero and do not match some
6 -- row in the linked-to table.  However, if we want to enforce that a link
7 -- field can't be 0, we have to check it here.
8
9 -- Find unexpected zero link entries
10
11 SELECT oid, prsname
12 FROM pg_ts_parser
13 WHERE prsnamespace = 0 OR prsstart = 0 OR prstoken = 0 OR prsend = 0 OR
14       -- prsheadline is optional
15       prslextype = 0;
16
17 SELECT oid, dictname
18 FROM pg_ts_dict
19 WHERE dictnamespace = 0 OR dictowner = 0 OR dicttemplate = 0;
20
21 SELECT oid, tmplname
22 FROM pg_ts_template
23 WHERE tmplnamespace = 0 OR tmpllexize = 0;  -- tmplinit is optional
24
25 SELECT oid, cfgname
26 FROM pg_ts_config
27 WHERE cfgnamespace = 0 OR cfgowner = 0 OR cfgparser = 0;
28
29 SELECT mapcfg, maptokentype, mapseqno
30 FROM pg_ts_config_map
31 WHERE mapcfg = 0 OR mapdict = 0;
32
33 -- Look for pg_ts_config_map entries that aren't one of parser's token types
34 SELECT * FROM
35   ( SELECT oid AS cfgid, (ts_token_type(cfgparser)).tokid AS tokid
36     FROM pg_ts_config ) AS tt
37 RIGHT JOIN pg_ts_config_map AS m
38     ON (tt.cfgid=m.mapcfg AND tt.tokid=m.maptokentype)
39 WHERE
40     tt.cfgid IS NULL OR tt.tokid IS NULL;
41
42 -- test basic text search behavior without indexes, then with
43
44 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
45 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
46 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
47 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
48 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
49 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
50 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
51
52 create index wowidx on test_tsvector using gist (a);
53
54 SET enable_seqscan=OFF;
55
56 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
57 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
58 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
59 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
60 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
61 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
62 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
63 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
64
65 RESET enable_seqscan;
66
67 DROP INDEX wowidx;
68
69 CREATE INDEX wowidx ON test_tsvector USING gin (a);
70
71 SET enable_seqscan=OFF;
72
73 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
74 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
75 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
76 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
77 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
78 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
79 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
80 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
81
82 RESET enable_seqscan;
83 INSERT INTO test_tsvector VALUES ('???', 'DFG:1A,2B,6C,10 FGH');
84 SELECT * FROM ts_stat('SELECT a FROM test_tsvector') ORDER BY ndoc DESC, nentry DESC, word LIMIT 10;
85 SELECT * FROM ts_stat('SELECT a FROM test_tsvector', 'AB') ORDER BY ndoc DESC, nentry DESC, word;
86
87 --dictionaries and to_tsvector
88
89 SELECT ts_lexize('english_stem', 'skies');
90 SELECT ts_lexize('english_stem', 'identity');
91
92 SELECT * FROM ts_token_type('default');
93
94 SELECT * FROM ts_parse('default', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/?  ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
95 /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234
96 <i <b> wow  < jqw <> qwerty');
97
98 SELECT to_tsvector('english', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/?  ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
99 /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234
100 <i <b> wow  < jqw <> qwerty');
101
102 SELECT length(to_tsvector('english', '345 qwe@efd.r '' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/?  ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
103 /usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234
104 <i <b> wow  < jqw <> qwerty'));
105
106 -- ts_debug
107
108 SELECT * from ts_debug('english', '<myns:foo-bar_baz.blurfl>abc&nm1;def&#xa9;ghi&#245;jkl</myns:foo-bar_baz.blurfl>');
109
110 -- check parsing of URLs
111 SELECT * from ts_debug('english', 'http://www.harewoodsolutions.co.uk/press.aspx</span>');
112 SELECT * from ts_debug('english', 'http://aew.wer0c.ewr/id?ad=qwe&dw<span>');
113 SELECT * from ts_debug('english', 'http://5aew.werc.ewr:8100/?');
114 SELECT * from ts_debug('english', '5aew.werc.ewr:8100/?xx');
115
116 -- to_tsquery
117
118 SELECT to_tsquery('english', 'qwe & sKies ');
119 SELECT to_tsquery('simple', 'qwe & sKies ');
120 SELECT to_tsquery('english', '''the wether'':dc & ''           sKies '':BC ');
121 SELECT to_tsquery('english', 'asd&(and|fghj)');
122 SELECT to_tsquery('english', '(asd&and)|fghj');
123 SELECT to_tsquery('english', '(asd&!and)|fghj');
124 SELECT to_tsquery('english', '(the|and&(i&1))&fghj');
125
126 SELECT plainto_tsquery('english', 'the and z 1))& fghj');
127 SELECT plainto_tsquery('english', 'foo bar') && plainto_tsquery('english', 'asd');
128 SELECT plainto_tsquery('english', 'foo bar') || plainto_tsquery('english', 'asd fg');
129 SELECT plainto_tsquery('english', 'foo bar') || !!plainto_tsquery('english', 'asd fg');
130 SELECT plainto_tsquery('english', 'foo bar') && 'asd | fg';
131
132 SELECT ts_rank_cd(to_tsvector('english', '
133 Day after day, day after day,
134   We stuck, nor breath nor motion,
135 As idle as a painted Ship
136   Upon a painted Ocean.
137 Water, water, every where
138   And all the boards did shrink;
139 Water, water, every where,
140   Nor any drop to drink.
141 S. T. Coleridge (1772-1834)
142 '), to_tsquery('english', 'paint&water'));
143
144 SELECT ts_rank_cd(to_tsvector('english', '
145 Day after day, day after day,
146   We stuck, nor breath nor motion,
147 As idle as a painted Ship
148   Upon a painted Ocean.
149 Water, water, every where
150   And all the boards did shrink;
151 Water, water, every where,
152   Nor any drop to drink.
153 S. T. Coleridge (1772-1834)
154 '), to_tsquery('english', 'breath&motion&water'));
155
156 SELECT ts_rank_cd(to_tsvector('english', '
157 Day after day, day after day,
158   We stuck, nor breath nor motion,
159 As idle as a painted Ship
160   Upon a painted Ocean.
161 Water, water, every where
162   And all the boards did shrink;
163 Water, water, every where,
164   Nor any drop to drink.
165 S. T. Coleridge (1772-1834)
166 '), to_tsquery('english', 'ocean'));
167
168 --headline tests
169 SELECT ts_headline('english', '
170 Day after day, day after day,
171   We stuck, nor breath nor motion,
172 As idle as a painted Ship
173   Upon a painted Ocean.
174 Water, water, every where
175   And all the boards did shrink;
176 Water, water, every where,
177   Nor any drop to drink.
178 S. T. Coleridge (1772-1834)
179 ', to_tsquery('english', 'paint&water'));
180
181 SELECT ts_headline('english', '
182 Day after day, day after day,
183   We stuck, nor breath nor motion,
184 As idle as a painted Ship
185   Upon a painted Ocean.
186 Water, water, every where
187   And all the boards did shrink;
188 Water, water, every where,
189   Nor any drop to drink.
190 S. T. Coleridge (1772-1834)
191 ', to_tsquery('english', 'breath&motion&water'));
192
193 SELECT ts_headline('english', '
194 Day after day, day after day,
195   We stuck, nor breath nor motion,
196 As idle as a painted Ship
197   Upon a painted Ocean.
198 Water, water, every where
199   And all the boards did shrink;
200 Water, water, every where,
201   Nor any drop to drink.
202 S. T. Coleridge (1772-1834)
203 ', to_tsquery('english', 'ocean'));
204
205 SELECT ts_headline('english', '
206 <html>
207 <!-- some comment -->
208 <body>
209 Sea view wow <u>foo bar</u> <i>qq</i>
210 <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>
211 ff-bg
212 <script>
213        document.write(15);
214 </script>
215 </body>
216 </html>',
217 to_tsquery('english', 'sea&foo'), 'HighlightAll=true');
218
219 --Check if headline fragments work
220 SELECT ts_headline('english', '
221 Day after day, day after day,
222   We stuck, nor breath nor motion,
223 As idle as a painted Ship
224   Upon a painted Ocean.
225 Water, water, every where
226   And all the boards did shrink;
227 Water, water, every where,
228   Nor any drop to drink.
229 S. T. Coleridge (1772-1834)
230 ', to_tsquery('english', 'ocean'), 'MaxFragments=1');
231
232 --Check if more than one fragments are displayed
233 SELECT ts_headline('english', '
234 Day after day, day after day,
235   We stuck, nor breath nor motion,
236 As idle as a painted Ship
237   Upon a painted Ocean.
238 Water, water, every where
239   And all the boards did shrink;
240 Water, water, every where,
241   Nor any drop to drink.
242 S. T. Coleridge (1772-1834)
243 ', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2');
244
245 --Fragments when there all query words are not in the document
246 SELECT ts_headline('english', '
247 Day after day, day after day,
248   We stuck, nor breath nor motion,
249 As idle as a painted Ship
250   Upon a painted Ocean.
251 Water, water, every where
252   And all the boards did shrink;
253 Water, water, every where,
254   Nor any drop to drink.
255 S. T. Coleridge (1772-1834)
256 ', to_tsquery('english', 'ocean & seahorse'), 'MaxFragments=1');
257
258 --FragmentDelimiter option
259 SELECT ts_headline('english', '
260 Day after day, day after day,
261   We stuck, nor breath nor motion,
262 As idle as a painted Ship
263   Upon a painted Ocean.
264 Water, water, every where
265   And all the boards did shrink;
266 Water, water, every where,
267   Nor any drop to drink.
268 S. T. Coleridge (1772-1834)
269 ', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2,FragmentDelimiter=***');
270
271 --Rewrite sub system
272
273 CREATE TABLE test_tsquery (txtkeyword TEXT, txtsample TEXT);
274 \set ECHO none
275 \copy test_tsquery from stdin
276 'New York'      new & york | big & apple | nyc
277 Moscow  moskva | moscow
278 'Sanct Peter'   Peterburg | peter | 'Sanct Peterburg'
279 'foo bar qq'    foo & (bar | qq) & city
280 \.
281 \set ECHO all
282
283 ALTER TABLE test_tsquery ADD COLUMN keyword tsquery;
284 UPDATE test_tsquery SET keyword = to_tsquery('english', txtkeyword);
285 ALTER TABLE test_tsquery ADD COLUMN sample tsquery;
286 UPDATE test_tsquery SET sample = to_tsquery('english', txtsample::text);
287
288
289 SELECT COUNT(*) FROM test_tsquery WHERE keyword <  'new & york';
290 SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new & york';
291 SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new & york';
292 SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new & york';
293 SELECT COUNT(*) FROM test_tsquery WHERE keyword >  'new & york';
294
295 CREATE UNIQUE INDEX bt_tsq ON test_tsquery (keyword);
296
297 SET enable_seqscan=OFF;
298
299 SELECT COUNT(*) FROM test_tsquery WHERE keyword <  'new & york';
300 SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new & york';
301 SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new & york';
302 SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new & york';
303 SELECT COUNT(*) FROM test_tsquery WHERE keyword >  'new & york';
304
305 RESET enable_seqscan;
306
307 SELECT ts_rewrite('foo & bar & qq & new & york',  'new & york'::tsquery, 'big & apple | nyc | new & york & city');
308
309 SELECT ts_rewrite('moscow', 'SELECT keyword, sample FROM test_tsquery'::text );
310 SELECT ts_rewrite('moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'::text );
311 SELECT ts_rewrite('bar & new & qq & foo & york', 'SELECT keyword, sample FROM test_tsquery'::text );
312
313 SELECT ts_rewrite( 'moscow', 'SELECT keyword, sample FROM test_tsquery');
314 SELECT ts_rewrite( 'moscow & hotel', 'SELECT keyword, sample FROM test_tsquery');
315 SELECT ts_rewrite( 'bar & new & qq & foo & york', 'SELECT keyword, sample FROM test_tsquery');
316
317
318 SELECT keyword FROM test_tsquery WHERE keyword @> 'new';
319 SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow';
320 SELECT keyword FROM test_tsquery WHERE keyword <@ 'new';
321 SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow';
322 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query;
323 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query;
324 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar &  new & qq & foo & york') AS query;
325 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query;
326 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query;
327 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & new & qq & foo & york') AS query;
328
329 CREATE INDEX qq ON test_tsquery USING gist (keyword tsquery_ops);
330 SET enable_seqscan=OFF;
331
332 SELECT keyword FROM test_tsquery WHERE keyword @> 'new';
333 SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow';
334 SELECT keyword FROM test_tsquery WHERE keyword <@ 'new';
335 SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow';
336 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query;
337 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query;
338 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & new & qq & foo & york') AS query;
339 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query;
340 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query;
341 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar &  new & qq & foo & york') AS query;
342
343 RESET enable_seqscan;
344
345 --test GUC
346 SET default_text_search_config=simple;
347
348 SELECT to_tsvector('SKIES My booKs');
349 SELECT plainto_tsquery('SKIES My booKs');
350 SELECT to_tsquery('SKIES & My | booKs');
351
352 SET default_text_search_config=english;
353
354 SELECT to_tsvector('SKIES My booKs');
355 SELECT plainto_tsquery('SKIES My booKs');
356 SELECT to_tsquery('SKIES & My | booKs');
357
358 --trigger
359 CREATE TRIGGER tsvectorupdate
360 BEFORE UPDATE OR INSERT ON test_tsvector
361 FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(a, 'pg_catalog.english', t);
362
363 SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
364 INSERT INTO test_tsvector (t) VALUES ('345 qwerty');
365 SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
366 UPDATE test_tsvector SET t = null WHERE t = '345 qwerty';
367 SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
368
369 INSERT INTO test_tsvector (t) VALUES ('345 qwerty');
370
371 SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
372
373 -- test finding items in GIN's pending list
374 create temp table pendtest (ts tsvector);
375 create index pendtest_idx on pendtest using gin(ts);
376 insert into pendtest values (to_tsvector('Lore ipsam'));
377 insert into pendtest values (to_tsvector('Lore ipsum'));
378 select * from pendtest where 'ipsu:*'::tsquery @@ ts;
379 select * from pendtest where 'ipsa:*'::tsquery @@ ts;
380 select * from pendtest where 'ips:*'::tsquery @@ ts;
381 select * from pendtest where 'ipt:*'::tsquery @@ ts;
382 select * from pendtest where 'ipi:*'::tsquery @@ ts;