Fix parsing of ignored operators in websearch_to_tsquery().
[pgsql.git] / src / test / regress / expected / tsearch.out
blob9fad6c8b04b1eb0310482ddfccfe42ebeadce562
1 -- directory paths are passed to us in environment variables
2 \getenv abs_srcdir PG_ABS_SRCDIR
3 --
4 -- Sanity checks for text search catalogs
5 --
6 -- NB: we assume the oidjoins test will have caught any dangling links,
7 -- that is OID or REGPROC fields that are not zero and do not match some
8 -- row in the linked-to table.  However, if we want to enforce that a link
9 -- field can't be 0, we have to check it here.
10 -- Find unexpected zero link entries
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  oid | prsname 
17 -----+---------
18 (0 rows)
20 SELECT oid, dictname
21 FROM pg_ts_dict
22 WHERE dictnamespace = 0 OR dictowner = 0 OR dicttemplate = 0;
23  oid | dictname 
24 -----+----------
25 (0 rows)
27 SELECT oid, tmplname
28 FROM pg_ts_template
29 WHERE tmplnamespace = 0 OR tmpllexize = 0;  -- tmplinit is optional
30  oid | tmplname 
31 -----+----------
32 (0 rows)
34 SELECT oid, cfgname
35 FROM pg_ts_config
36 WHERE cfgnamespace = 0 OR cfgowner = 0 OR cfgparser = 0;
37  oid | cfgname 
38 -----+---------
39 (0 rows)
41 SELECT mapcfg, maptokentype, mapseqno
42 FROM pg_ts_config_map
43 WHERE mapcfg = 0 OR mapdict = 0;
44  mapcfg | maptokentype | mapseqno 
45 --------+--------------+----------
46 (0 rows)
48 -- Look for pg_ts_config_map entries that aren't one of parser's token types
49 SELECT * FROM
50   ( SELECT oid AS cfgid, (ts_token_type(cfgparser)).tokid AS tokid
51     FROM pg_ts_config ) AS tt
52 RIGHT JOIN pg_ts_config_map AS m
53     ON (tt.cfgid=m.mapcfg AND tt.tokid=m.maptokentype)
54 WHERE
55     tt.cfgid IS NULL OR tt.tokid IS NULL;
56  cfgid | tokid | mapcfg | maptokentype | mapseqno | mapdict 
57 -------+-------+--------+--------------+----------+---------
58 (0 rows)
60 -- Load some test data
61 CREATE TABLE test_tsvector(
62         t text,
63         a tsvector
65 \set filename :abs_srcdir '/data/tsearch.data'
66 COPY test_tsvector FROM :'filename';
67 ANALYZE test_tsvector;
68 -- test basic text search behavior without indexes, then with
69 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
70  count 
71 -------
72    158
73 (1 row)
75 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
76  count 
77 -------
78     17
79 (1 row)
81 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
82  count 
83 -------
84      6
85 (1 row)
87 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
88  count 
89 -------
90     98
91 (1 row)
93 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
94  count 
95 -------
96     23
97 (1 row)
99 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
100  count 
101 -------
102     39
103 (1 row)
105 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
106  count 
107 -------
108    494
109 (1 row)
111 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
112  count 
113 -------
114    158
115 (1 row)
117 SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme';
118  count 
119 -------
120      0
121 (1 row)
123 SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme';
124  count 
125 -------
126    508
127 (1 row)
129 SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh';
130  count 
131 -------
132      1
133 (1 row)
135 SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl';
136  count 
137 -------
138      0
139 (1 row)
141 SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt';
142  count 
143 -------
144      1
145 (1 row)
147 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh';
148  count 
149 -------
150      3
151 (1 row)
153 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh';
154  count 
155 -------
156    432
157 (1 row)
159 SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl';
160  count 
161 -------
162      1
163 (1 row)
165 SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt';
166  count 
167 -------
168      6
169 (1 row)
171 SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)';
172  count 
173 -------
174    507
175 (1 row)
177 SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)';
178  count 
179 -------
180    508
181 (1 row)
183 SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)';
184  count 
185 -------
186    507
187 (1 row)
189 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A';
190  count 
191 -------
192     56
193 (1 row)
195 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D';
196  count 
197 -------
198     58
199 (1 row)
201 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A';
202  count 
203 -------
204    452
205 (1 row)
207 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
208  count 
209 -------
210    450
211 (1 row)
213 create index wowidx on test_tsvector using gist (a);
214 SET enable_seqscan=OFF;
215 SET enable_indexscan=ON;
216 SET enable_bitmapscan=OFF;
217 explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
218                       QUERY PLAN                       
219 -------------------------------------------------------
220  Aggregate
221    ->  Index Scan using wowidx on test_tsvector
222          Index Cond: (a @@ '''wr'' | ''qh'''::tsquery)
223 (3 rows)
225 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
226  count 
227 -------
228    158
229 (1 row)
231 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
232  count 
233 -------
234     17
235 (1 row)
237 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
238  count 
239 -------
240      6
241 (1 row)
243 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
244  count 
245 -------
246     98
247 (1 row)
249 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
250  count 
251 -------
252     23
253 (1 row)
255 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
256  count 
257 -------
258     39
259 (1 row)
261 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
262  count 
263 -------
264    494
265 (1 row)
267 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
268  count 
269 -------
270    158
271 (1 row)
273 SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme';
274  count 
275 -------
276      0
277 (1 row)
279 SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme';
280  count 
281 -------
282    508
283 (1 row)
285 SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh';
286  count 
287 -------
288      1
289 (1 row)
291 SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl';
292  count 
293 -------
294      0
295 (1 row)
297 SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt';
298  count 
299 -------
300      1
301 (1 row)
303 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh';
304  count 
305 -------
306      3
307 (1 row)
309 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh';
310  count 
311 -------
312    432
313 (1 row)
315 SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl';
316  count 
317 -------
318      1
319 (1 row)
321 SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt';
322  count 
323 -------
324      6
325 (1 row)
327 SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)';
328  count 
329 -------
330    507
331 (1 row)
333 SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)';
334  count 
335 -------
336    508
337 (1 row)
339 SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)';
340  count 
341 -------
342    507
343 (1 row)
345 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A';
346  count 
347 -------
348     56
349 (1 row)
351 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D';
352  count 
353 -------
354     58
355 (1 row)
357 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A';
358  count 
359 -------
360    452
361 (1 row)
363 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
364  count 
365 -------
366    450
367 (1 row)
369 SET enable_indexscan=OFF;
370 SET enable_bitmapscan=ON;
371 explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
372                          QUERY PLAN                          
373 -------------------------------------------------------------
374  Aggregate
375    ->  Bitmap Heap Scan on test_tsvector
376          Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery)
377          ->  Bitmap Index Scan on wowidx
378                Index Cond: (a @@ '''wr'' | ''qh'''::tsquery)
379 (5 rows)
381 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
382  count 
383 -------
384    158
385 (1 row)
387 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
388  count 
389 -------
390     17
391 (1 row)
393 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
394  count 
395 -------
396      6
397 (1 row)
399 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
400  count 
401 -------
402     98
403 (1 row)
405 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
406  count 
407 -------
408     23
409 (1 row)
411 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
412  count 
413 -------
414     39
415 (1 row)
417 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
418  count 
419 -------
420    494
421 (1 row)
423 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
424  count 
425 -------
426    158
427 (1 row)
429 SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme';
430  count 
431 -------
432      0
433 (1 row)
435 SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme';
436  count 
437 -------
438    508
439 (1 row)
441 SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh';
442  count 
443 -------
444      1
445 (1 row)
447 SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl';
448  count 
449 -------
450      0
451 (1 row)
453 SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt';
454  count 
455 -------
456      1
457 (1 row)
459 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh';
460  count 
461 -------
462      3
463 (1 row)
465 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh';
466  count 
467 -------
468    432
469 (1 row)
471 SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl';
472  count 
473 -------
474      1
475 (1 row)
477 SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt';
478  count 
479 -------
480      6
481 (1 row)
483 SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)';
484  count 
485 -------
486    507
487 (1 row)
489 SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)';
490  count 
491 -------
492    508
493 (1 row)
495 SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)';
496  count 
497 -------
498    507
499 (1 row)
501 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A';
502  count 
503 -------
504     56
505 (1 row)
507 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D';
508  count 
509 -------
510     58
511 (1 row)
513 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A';
514  count 
515 -------
516    452
517 (1 row)
519 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
520  count 
521 -------
522    450
523 (1 row)
525 -- Test siglen parameter of GiST tsvector_ops
526 CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(foo=1));
527 ERROR:  unrecognized parameter "foo"
528 CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=0));
529 ERROR:  value 0 out of bounds for option "siglen"
530 DETAIL:  Valid values are between "1" and "2024".
531 CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=2048));
532 ERROR:  value 2048 out of bounds for option "siglen"
533 DETAIL:  Valid values are between "1" and "2024".
534 CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=100,foo='bar'));
535 ERROR:  unrecognized parameter "foo"
536 CREATE INDEX wowidx1 ON test_tsvector USING gist (a tsvector_ops(siglen=100, siglen = 200));
537 ERROR:  parameter "siglen" specified more than once
538 CREATE INDEX wowidx2 ON test_tsvector USING gist (a tsvector_ops(siglen=1));
539 \d test_tsvector
540             Table "public.test_tsvector"
541  Column |   Type   | Collation | Nullable | Default 
542 --------+----------+-----------+----------+---------
543  t      | text     |           |          | 
544  a      | tsvector |           |          | 
545 Indexes:
546     "wowidx" gist (a)
547     "wowidx2" gist (a tsvector_ops (siglen='1'))
549 DROP INDEX wowidx;
550 EXPLAIN (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
551                          QUERY PLAN                          
552 -------------------------------------------------------------
553  Aggregate
554    ->  Bitmap Heap Scan on test_tsvector
555          Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery)
556          ->  Bitmap Index Scan on wowidx2
557                Index Cond: (a @@ '''wr'' | ''qh'''::tsquery)
558 (5 rows)
560 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
561  count 
562 -------
563    158
564 (1 row)
566 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
567  count 
568 -------
569     17
570 (1 row)
572 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
573  count 
574 -------
575      6
576 (1 row)
578 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
579  count 
580 -------
581     98
582 (1 row)
584 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
585  count 
586 -------
587     23
588 (1 row)
590 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
591  count 
592 -------
593     39
594 (1 row)
596 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
597  count 
598 -------
599    494
600 (1 row)
602 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
603  count 
604 -------
605    158
606 (1 row)
608 SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme';
609  count 
610 -------
611      0
612 (1 row)
614 SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme';
615  count 
616 -------
617    508
618 (1 row)
620 SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh';
621  count 
622 -------
623      1
624 (1 row)
626 SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl';
627  count 
628 -------
629      0
630 (1 row)
632 SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt';
633  count 
634 -------
635      1
636 (1 row)
638 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh';
639  count 
640 -------
641      3
642 (1 row)
644 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh';
645  count 
646 -------
647    432
648 (1 row)
650 SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl';
651  count 
652 -------
653      1
654 (1 row)
656 SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt';
657  count 
658 -------
659      6
660 (1 row)
662 SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)';
663  count 
664 -------
665    507
666 (1 row)
668 SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)';
669  count 
670 -------
671    508
672 (1 row)
674 SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)';
675  count 
676 -------
677    507
678 (1 row)
680 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A';
681  count 
682 -------
683     56
684 (1 row)
686 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D';
687  count 
688 -------
689     58
690 (1 row)
692 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A';
693  count 
694 -------
695    452
696 (1 row)
698 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
699  count 
700 -------
701    450
702 (1 row)
704 DROP INDEX wowidx2;
705 CREATE INDEX wowidx ON test_tsvector USING gist (a tsvector_ops(siglen=484));
706 \d test_tsvector
707             Table "public.test_tsvector"
708  Column |   Type   | Collation | Nullable | Default 
709 --------+----------+-----------+----------+---------
710  t      | text     |           |          | 
711  a      | tsvector |           |          | 
712 Indexes:
713     "wowidx" gist (a tsvector_ops (siglen='484'))
715 EXPLAIN (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
716                          QUERY PLAN                          
717 -------------------------------------------------------------
718  Aggregate
719    ->  Bitmap Heap Scan on test_tsvector
720          Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery)
721          ->  Bitmap Index Scan on wowidx
722                Index Cond: (a @@ '''wr'' | ''qh'''::tsquery)
723 (5 rows)
725 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
726  count 
727 -------
728    158
729 (1 row)
731 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
732  count 
733 -------
734     17
735 (1 row)
737 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
738  count 
739 -------
740      6
741 (1 row)
743 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
744  count 
745 -------
746     98
747 (1 row)
749 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
750  count 
751 -------
752     23
753 (1 row)
755 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
756  count 
757 -------
758     39
759 (1 row)
761 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
762  count 
763 -------
764    494
765 (1 row)
767 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
768  count 
769 -------
770    158
771 (1 row)
773 SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme';
774  count 
775 -------
776      0
777 (1 row)
779 SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme';
780  count 
781 -------
782    508
783 (1 row)
785 SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh';
786  count 
787 -------
788      1
789 (1 row)
791 SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl';
792  count 
793 -------
794      0
795 (1 row)
797 SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt';
798  count 
799 -------
800      1
801 (1 row)
803 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh';
804  count 
805 -------
806      3
807 (1 row)
809 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh';
810  count 
811 -------
812    432
813 (1 row)
815 SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl';
816  count 
817 -------
818      1
819 (1 row)
821 SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt';
822  count 
823 -------
824      6
825 (1 row)
827 SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)';
828  count 
829 -------
830    507
831 (1 row)
833 SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)';
834  count 
835 -------
836    508
837 (1 row)
839 SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)';
840  count 
841 -------
842    507
843 (1 row)
845 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A';
846  count 
847 -------
848     56
849 (1 row)
851 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D';
852  count 
853 -------
854     58
855 (1 row)
857 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A';
858  count 
859 -------
860    452
861 (1 row)
863 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
864  count 
865 -------
866    450
867 (1 row)
869 RESET enable_seqscan;
870 RESET enable_indexscan;
871 RESET enable_bitmapscan;
872 DROP INDEX wowidx;
873 CREATE INDEX wowidx ON test_tsvector USING gin (a);
874 SET enable_seqscan=OFF;
875 -- GIN only supports bitmapscan, so no need to test plain indexscan
876 explain (costs off) SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
877                          QUERY PLAN                          
878 -------------------------------------------------------------
879  Aggregate
880    ->  Bitmap Heap Scan on test_tsvector
881          Recheck Cond: (a @@ '''wr'' | ''qh'''::tsquery)
882          ->  Bitmap Index Scan on wowidx
883                Index Cond: (a @@ '''wr'' | ''qh'''::tsquery)
884 (5 rows)
886 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh';
887  count 
888 -------
889    158
890 (1 row)
892 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr&qh';
893  count 
894 -------
895     17
896 (1 row)
898 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq&yt';
899  count 
900 -------
901      6
902 (1 row)
904 SELECT count(*) FROM test_tsvector WHERE a @@ 'eq|yt';
905  count 
906 -------
907     98
908 (1 row)
910 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq&yt)|(wr&qh)';
911  count 
912 -------
913     23
914 (1 row)
916 SELECT count(*) FROM test_tsvector WHERE a @@ '(eq|yt)&(wr|qh)';
917  count 
918 -------
919     39
920 (1 row)
922 SELECT count(*) FROM test_tsvector WHERE a @@ 'w:*|q:*';
923  count 
924 -------
925    494
926 (1 row)
928 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
929  count 
930 -------
931    158
932 (1 row)
934 SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme';
935  count 
936 -------
937      0
938 (1 row)
940 SELECT count(*) FROM test_tsvector WHERE a @@ '!no_such_lexeme';
941  count 
942 -------
943    508
944 (1 row)
946 SELECT count(*) FROM test_tsvector WHERE a @@ 'pl <-> yh';
947  count 
948 -------
949      1
950 (1 row)
952 SELECT count(*) FROM test_tsvector WHERE a @@ 'yh <-> pl';
953  count 
954 -------
955      0
956 (1 row)
958 SELECT count(*) FROM test_tsvector WHERE a @@ 'qe <2> qt';
959  count 
960 -------
961      1
962 (1 row)
964 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> yh';
965  count 
966 -------
967      3
968 (1 row)
970 SELECT count(*) FROM test_tsvector WHERE a @@ '!pl <-> !yh';
971  count 
972 -------
973    432
974 (1 row)
976 SELECT count(*) FROM test_tsvector WHERE a @@ '!yh <-> pl';
977  count 
978 -------
979      1
980 (1 row)
982 SELECT count(*) FROM test_tsvector WHERE a @@ '!qe <2> qt';
983  count 
984 -------
985      6
986 (1 row)
988 SELECT count(*) FROM test_tsvector WHERE a @@ '!(pl <-> yh)';
989  count 
990 -------
991    507
992 (1 row)
994 SELECT count(*) FROM test_tsvector WHERE a @@ '!(yh <-> pl)';
995  count 
996 -------
997    508
998 (1 row)
1000 SELECT count(*) FROM test_tsvector WHERE a @@ '!(qe <2> qt)';
1001  count 
1002 -------
1003    507
1004 (1 row)
1006 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:A';
1007  count 
1008 -------
1009     56
1010 (1 row)
1012 SELECT count(*) FROM test_tsvector WHERE a @@ 'wd:D';
1013  count 
1014 -------
1015     58
1016 (1 row)
1018 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:A';
1019  count 
1020 -------
1021    452
1022 (1 row)
1024 SELECT count(*) FROM test_tsvector WHERE a @@ '!wd:D';
1025  count 
1026 -------
1027    450
1028 (1 row)
1030 -- Test optimization of non-empty GIN_SEARCH_MODE_ALL queries
1031 EXPLAIN (COSTS OFF)
1032 SELECT count(*) FROM test_tsvector WHERE a @@ '!qh';
1033                      QUERY PLAN                      
1034 -----------------------------------------------------
1035  Aggregate
1036    ->  Bitmap Heap Scan on test_tsvector
1037          Recheck Cond: (a @@ '!''qh'''::tsquery)
1038          ->  Bitmap Index Scan on wowidx
1039                Index Cond: (a @@ '!''qh'''::tsquery)
1040 (5 rows)
1042 SELECT count(*) FROM test_tsvector WHERE a @@ '!qh';
1043  count 
1044 -------
1045    410
1046 (1 row)
1048 EXPLAIN (COSTS OFF)
1049 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr' AND a @@ '!qh';
1050                                      QUERY PLAN                                     
1051 ------------------------------------------------------------------------------------
1052  Aggregate
1053    ->  Bitmap Heap Scan on test_tsvector
1054          Recheck Cond: ((a @@ '''wr'''::tsquery) AND (a @@ '!''qh'''::tsquery))
1055          ->  Bitmap Index Scan on wowidx
1056                Index Cond: ((a @@ '''wr'''::tsquery) AND (a @@ '!''qh'''::tsquery))
1057 (5 rows)
1059 SELECT count(*) FROM test_tsvector WHERE a @@ 'wr' AND a @@ '!qh';
1060  count 
1061 -------
1062     60
1063 (1 row)
1065 RESET enable_seqscan;
1066 INSERT INTO test_tsvector VALUES ('???', 'DFG:1A,2B,6C,10 FGH');
1067 SELECT * FROM ts_stat('SELECT a FROM test_tsvector') ORDER BY ndoc DESC, nentry DESC, word LIMIT 10;
1068  word | ndoc | nentry 
1069 ------+------+--------
1070  qq   |  108 |    108
1071  qt   |  102 |    102
1072  qe   |  100 |    101
1073  qh   |   98 |     99
1074  qw   |   98 |     98
1075  qa   |   97 |     97
1076  ql   |   94 |     94
1077  qs   |   94 |     94
1078  qr   |   92 |     93
1079  qi   |   92 |     92
1080 (10 rows)
1082 SELECT * FROM ts_stat('SELECT a FROM test_tsvector', 'AB') ORDER BY ndoc DESC, nentry DESC, word;
1083  word | ndoc | nentry 
1084 ------+------+--------
1085  DFG  |    1 |      2
1086 (1 row)
1088 --dictionaries and to_tsvector
1089 SELECT ts_lexize('english_stem', 'skies');
1090  ts_lexize 
1091 -----------
1092  {sky}
1093 (1 row)
1095 SELECT ts_lexize('english_stem', 'identity');
1096  ts_lexize 
1097 -----------
1098  {ident}
1099 (1 row)
1101 SELECT * FROM ts_token_type('default');
1102  tokid |      alias      |               description                
1103 -------+-----------------+------------------------------------------
1104      1 | asciiword       | Word, all ASCII
1105      2 | word            | Word, all letters
1106      3 | numword         | Word, letters and digits
1107      4 | email           | Email address
1108      5 | url             | URL
1109      6 | host            | Host
1110      7 | sfloat          | Scientific notation
1111      8 | version         | Version number
1112      9 | hword_numpart   | Hyphenated word part, letters and digits
1113     10 | hword_part      | Hyphenated word part, all letters
1114     11 | hword_asciipart | Hyphenated word part, all ASCII
1115     12 | blank           | Space symbols
1116     13 | tag             | XML tag
1117     14 | protocol        | Protocol head
1118     15 | numhword        | Hyphenated word, letters and digits
1119     16 | asciihword      | Hyphenated word, all ASCII
1120     17 | hword           | Hyphenated word, all letters
1121     18 | url_path        | URL path
1122     19 | file            | File or path name
1123     20 | float           | Decimal notation
1124     21 | int             | Signed integer
1125     22 | uint            | Unsigned integer
1126     23 | entity          | XML entity
1127 (23 rows)
1129 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 teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
1130 /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
1131 <i <b> wow  < jqw <> qwerty');
1132  tokid |                token                 
1133 -------+--------------------------------------
1134     22 | 345
1135     12 |  
1136      1 | qwe
1137     12 | @
1138     19 | efd.r
1139     12 |  ' 
1140     14 | http://
1141      6 | www.com
1142     12 | / 
1143     14 | http://
1144      5 | aew.werc.ewr/?ad=qwe&dw
1145      6 | aew.werc.ewr
1146     18 | /?ad=qwe&dw
1147     12 |  
1148      5 | 1aew.werc.ewr/?ad=qwe&dw
1149      6 | 1aew.werc.ewr
1150     18 | /?ad=qwe&dw
1151     12 |  
1152      6 | 2aew.werc.ewr
1153     12 |  
1154     14 | http://
1155      5 | 3aew.werc.ewr/?ad=qwe&dw
1156      6 | 3aew.werc.ewr
1157     18 | /?ad=qwe&dw
1158     12 |  
1159     14 | http://
1160      6 | 4aew.werc.ewr
1161     12 |  
1162     14 | http://
1163      5 | 5aew.werc.ewr:8100/?
1164      6 | 5aew.werc.ewr:8100
1165     18 | /?
1166     12 |   
1167      1 | ad
1168     12 | =
1169      1 | qwe
1170     12 | &
1171      1 | dw
1172     12 |  
1173      5 | 6aew.werc.ewr:8100/?ad=qwe&dw
1174      6 | 6aew.werc.ewr:8100
1175     18 | /?ad=qwe&dw
1176     12 |  
1177      5 | 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32
1178      6 | 7aew.werc.ewr:8100
1179     18 | /?ad=qwe&dw=%20%32
1180     12 |  
1181      7 | +4.0e-10
1182     12 |  
1183      1 | qwe
1184     12 |  
1185      1 | qwe
1186     12 |  
1187      1 | qwqwe
1188     12 |  
1189     20 | 234.435
1190     12 |  
1191     22 | 455
1192     12 |  
1193     20 | 5.005
1194     12 |  
1195      4 | teodor@stack.net
1196     12 |  
1197      4 | teodor@123-stack.net
1198     12 |  
1199      4 | 123_teodor@stack.net
1200     12 |  
1201      4 | 123-teodor@stack.net
1202     12 |  
1203     16 | qwe-wer
1204     11 | qwe
1205     12 | -
1206     11 | wer
1207     12 |  
1208      1 | asdf
1209     12 |  
1210     13 | <fr>
1211      1 | qwer
1212     12 |  
1213      1 | jf
1214     12 |  
1215      1 | sdjk
1216     12 | <
1217      1 | we
1218     12 |  
1219      1 | hjwer
1220     12 |  
1221     13 | <werrwe>
1222     12 |  
1223      3 | ewr1
1224     12 | > 
1225      3 | ewri2
1226     12 |  
1227     13 | <a href="qwe<qwe>">
1228     12 |                                     +
1229        | 
1230     19 | /usr/local/fff
1231     12 |  
1232     19 | /awdf/dwqe/4325
1233     12 |  
1234     19 | rewt/ewr
1235     12 |  
1236      1 | wefjn
1237     12 |  
1238     19 | /wqe-324/ewr
1239     12 |  
1240     19 | gist.h
1241     12 |  
1242     19 | gist.h.c
1243     12 |  
1244     19 | gist.c
1245     12 | . 
1246      1 | readline
1247     12 |  
1248     20 | 4.2
1249     12 |  
1250     20 | 4.2
1251     12 | . 
1252     20 | 4.2
1253     12 | , 
1254      1 | readline
1255     20 | -4.2
1256     12 |  
1257      1 | readline
1258     20 | -4.2
1259     12 | . 
1260     22 | 234
1261     12 |                                     +
1262        | 
1263     12 | <
1264      1 | i
1265     12 |  
1266     13 | <b>
1267     12 |  
1268      1 | wow
1269     12 |   
1270     12 | < 
1271      1 | jqw
1272     12 |  
1273     12 | <> 
1274      1 | qwerty
1275 (139 rows)
1277 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 teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
1278 /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
1279 <i <b> wow  < jqw <> qwerty');
1280                                                                                                                                                                                                                                                                                                                                                                                                                                                                               to_tsvector                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
1281 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1282  '+4.0e-10':28 '-4.2':63,65 '/?':18 '/?ad=qwe&dw':7,10,14,24 '/?ad=qwe&dw=%20%32':27 '/awdf/dwqe/4325':51 '/usr/local/fff':50 '/wqe-324/ewr':54 '123-teodor@stack.net':38 '123_teodor@stack.net':37 '1aew.werc.ewr':9 '1aew.werc.ewr/?ad=qwe&dw':8 '234':66 '234.435':32 '2aew.werc.ewr':11 '345':1 '3aew.werc.ewr':13 '3aew.werc.ewr/?ad=qwe&dw':12 '4.2':59,60,61 '455':33 '4aew.werc.ewr':15 '5.005':34 '5aew.werc.ewr:8100':17 '5aew.werc.ewr:8100/?':16 '6aew.werc.ewr:8100':23 '6aew.werc.ewr:8100/?ad=qwe&dw':22 '7aew.werc.ewr:8100':26 '7aew.werc.ewr:8100/?ad=qwe&dw=%20%32':25 'ad':19 'aew.werc.ewr':6 'aew.werc.ewr/?ad=qwe&dw':5 'asdf':42 'dw':21 'efd.r':3 'ewr1':48 'ewri2':49 'gist.c':57 'gist.h':55 'gist.h.c':56 'hjwer':47 'jf':44 'jqw':69 'qwe':2,20,29,30,40 'qwe-wer':39 'qwer':43 'qwerti':70 'qwqwe':31 'readlin':58,62,64 'rewt/ewr':52 'sdjk':45 'teodor@123-stack.net':36 'teodor@stack.net':35 'wefjn':53 'wer':41 'wow':68 'www.com':4
1283 (1 row)
1285 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 teodor@123-stack.net 123_teodor@stack.net 123-teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
1286 /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
1287 <i <b> wow  < jqw <> qwerty'));
1288  length 
1289 --------
1290      56
1291 (1 row)
1293 -- ts_debug
1294 SELECT * from ts_debug('english', '<myns:foo-bar_baz.blurfl>abc&nm1;def&#xa9;ghi&#245;jkl</myns:foo-bar_baz.blurfl>');
1295    alias   |   description   |           token            |  dictionaries  |  dictionary  | lexemes 
1296 -----------+-----------------+----------------------------+----------------+--------------+---------
1297  tag       | XML tag         | <myns:foo-bar_baz.blurfl>  | {}             |              | 
1298  asciiword | Word, all ASCII | abc                        | {english_stem} | english_stem | {abc}
1299  entity    | XML entity      | &nm1;                      | {}             |              | 
1300  asciiword | Word, all ASCII | def                        | {english_stem} | english_stem | {def}
1301  entity    | XML entity      | &#xa9;                     | {}             |              | 
1302  asciiword | Word, all ASCII | ghi                        | {english_stem} | english_stem | {ghi}
1303  entity    | XML entity      | &#245;                     | {}             |              | 
1304  asciiword | Word, all ASCII | jkl                        | {english_stem} | english_stem | {jkl}
1305  tag       | XML tag         | </myns:foo-bar_baz.blurfl> | {}             |              | 
1306 (9 rows)
1308 -- check parsing of URLs
1309 SELECT * from ts_debug('english', 'http://www.harewoodsolutions.co.uk/press.aspx</span>');
1310   alias   |  description  |                 token                  | dictionaries | dictionary |                 lexemes                  
1311 ----------+---------------+----------------------------------------+--------------+------------+------------------------------------------
1312  protocol | Protocol head | http://                                | {}           |            | 
1313  url      | URL           | www.harewoodsolutions.co.uk/press.aspx | {simple}     | simple     | {www.harewoodsolutions.co.uk/press.aspx}
1314  host     | Host          | www.harewoodsolutions.co.uk            | {simple}     | simple     | {www.harewoodsolutions.co.uk}
1315  url_path | URL path      | /press.aspx                            | {simple}     | simple     | {/press.aspx}
1316  tag      | XML tag       | </span>                                | {}           |            | 
1317 (5 rows)
1319 SELECT * from ts_debug('english', 'http://aew.wer0c.ewr/id?ad=qwe&dw<span>');
1320   alias   |  description  |           token            | dictionaries | dictionary |           lexemes            
1321 ----------+---------------+----------------------------+--------------+------------+------------------------------
1322  protocol | Protocol head | http://                    | {}           |            | 
1323  url      | URL           | aew.wer0c.ewr/id?ad=qwe&dw | {simple}     | simple     | {aew.wer0c.ewr/id?ad=qwe&dw}
1324  host     | Host          | aew.wer0c.ewr              | {simple}     | simple     | {aew.wer0c.ewr}
1325  url_path | URL path      | /id?ad=qwe&dw              | {simple}     | simple     | {/id?ad=qwe&dw}
1326  tag      | XML tag       | <span>                     | {}           |            | 
1327 (5 rows)
1329 SELECT * from ts_debug('english', 'http://5aew.werc.ewr:8100/?');
1330   alias   |  description  |        token         | dictionaries | dictionary |        lexemes         
1331 ----------+---------------+----------------------+--------------+------------+------------------------
1332  protocol | Protocol head | http://              | {}           |            | 
1333  url      | URL           | 5aew.werc.ewr:8100/? | {simple}     | simple     | {5aew.werc.ewr:8100/?}
1334  host     | Host          | 5aew.werc.ewr:8100   | {simple}     | simple     | {5aew.werc.ewr:8100}
1335  url_path | URL path      | /?                   | {simple}     | simple     | {/?}
1336 (4 rows)
1338 SELECT * from ts_debug('english', '5aew.werc.ewr:8100/?xx');
1339   alias   | description |         token          | dictionaries | dictionary |         lexemes          
1340 ----------+-------------+------------------------+--------------+------------+--------------------------
1341  url      | URL         | 5aew.werc.ewr:8100/?xx | {simple}     | simple     | {5aew.werc.ewr:8100/?xx}
1342  host     | Host        | 5aew.werc.ewr:8100     | {simple}     | simple     | {5aew.werc.ewr:8100}
1343  url_path | URL path    | /?xx                   | {simple}     | simple     | {/?xx}
1344 (3 rows)
1346 SELECT token, alias,
1347   dictionaries, dictionaries is null as dnull, array_dims(dictionaries) as ddims,
1348   lexemes, lexemes is null as lnull, array_dims(lexemes) as ldims
1349 from ts_debug('english', 'a title');
1350  token |   alias   |  dictionaries  | dnull | ddims | lexemes | lnull | ldims 
1351 -------+-----------+----------------+-------+-------+---------+-------+-------
1352  a     | asciiword | {english_stem} | f     | [1:1] | {}      | f     | 
1353        | blank     | {}             | f     |       |         | t     | 
1354  title | asciiword | {english_stem} | f     | [1:1] | {titl}  | f     | [1:1]
1355 (3 rows)
1357 -- to_tsquery
1358 SELECT to_tsquery('english', 'qwe & sKies ');
1359   to_tsquery   
1360 ---------------
1361  'qwe' & 'sky'
1362 (1 row)
1364 SELECT to_tsquery('simple', 'qwe & sKies ');
1365    to_tsquery    
1366 -----------------
1367  'qwe' & 'skies'
1368 (1 row)
1370 SELECT to_tsquery('english', '''the wether'':dc & ''           sKies '':BC ');
1371        to_tsquery       
1372 ------------------------
1373  'wether':CD & 'sky':BC
1374 (1 row)
1376 SELECT to_tsquery('english', 'asd&(and|fghj)');
1377    to_tsquery   
1378 ----------------
1379  'asd' & 'fghj'
1380 (1 row)
1382 SELECT to_tsquery('english', '(asd&and)|fghj');
1383    to_tsquery   
1384 ----------------
1385  'asd' | 'fghj'
1386 (1 row)
1388 SELECT to_tsquery('english', '(asd&!and)|fghj');
1389    to_tsquery   
1390 ----------------
1391  'asd' | 'fghj'
1392 (1 row)
1394 SELECT to_tsquery('english', '(the|and&(i&1))&fghj');
1395   to_tsquery  
1396 --------------
1397  '1' & 'fghj'
1398 (1 row)
1400 SELECT plainto_tsquery('english', 'the and z 1))& fghj');
1401   plainto_tsquery   
1402 --------------------
1403  'z' & '1' & 'fghj'
1404 (1 row)
1406 SELECT plainto_tsquery('english', 'foo bar') && plainto_tsquery('english', 'asd');
1407        ?column?        
1408 -----------------------
1409  'foo' & 'bar' & 'asd'
1410 (1 row)
1412 SELECT plainto_tsquery('english', 'foo bar') || plainto_tsquery('english', 'asd fg');
1413            ?column?           
1414 ------------------------------
1415  'foo' & 'bar' | 'asd' & 'fg'
1416 (1 row)
1418 SELECT plainto_tsquery('english', 'foo bar') || !!plainto_tsquery('english', 'asd fg');
1419              ?column?              
1420 -----------------------------------
1421  'foo' & 'bar' | !( 'asd' & 'fg' )
1422 (1 row)
1424 SELECT plainto_tsquery('english', 'foo bar') && 'asd | fg';
1425              ?column?             
1426 ----------------------------------
1427  'foo' & 'bar' & ( 'asd' | 'fg' )
1428 (1 row)
1430 -- Check stop word deletion, a and s are stop-words
1431 SELECT to_tsquery('english', '!(a & !b) & c');
1432  to_tsquery  
1433 -------------
1434  !!'b' & 'c'
1435 (1 row)
1437 SELECT to_tsquery('english', '!(a & !b)');
1438  to_tsquery 
1439 ------------
1440  !!'b'
1441 (1 row)
1443 SELECT to_tsquery('english', '(1 <-> 2) <-> a');
1444  to_tsquery  
1445 -------------
1446  '1' <-> '2'
1447 (1 row)
1449 SELECT to_tsquery('english', '(1 <-> a) <-> 2');
1450  to_tsquery  
1451 -------------
1452  '1' <2> '2'
1453 (1 row)
1455 SELECT to_tsquery('english', '(a <-> 1) <-> 2');
1456  to_tsquery  
1457 -------------
1458  '1' <-> '2'
1459 (1 row)
1461 SELECT to_tsquery('english', 'a <-> (1 <-> 2)');
1462  to_tsquery  
1463 -------------
1464  '1' <-> '2'
1465 (1 row)
1467 SELECT to_tsquery('english', '1 <-> (a <-> 2)');
1468  to_tsquery  
1469 -------------
1470  '1' <2> '2'
1471 (1 row)
1473 SELECT to_tsquery('english', '1 <-> (2 <-> a)');
1474  to_tsquery  
1475 -------------
1476  '1' <-> '2'
1477 (1 row)
1479 SELECT to_tsquery('english', '(1 <-> 2) <3> a');
1480  to_tsquery  
1481 -------------
1482  '1' <-> '2'
1483 (1 row)
1485 SELECT to_tsquery('english', '(1 <-> a) <3> 2');
1486  to_tsquery  
1487 -------------
1488  '1' <4> '2'
1489 (1 row)
1491 SELECT to_tsquery('english', '(a <-> 1) <3> 2');
1492  to_tsquery  
1493 -------------
1494  '1' <3> '2'
1495 (1 row)
1497 SELECT to_tsquery('english', 'a <3> (1 <-> 2)');
1498  to_tsquery  
1499 -------------
1500  '1' <-> '2'
1501 (1 row)
1503 SELECT to_tsquery('english', '1 <3> (a <-> 2)');
1504  to_tsquery  
1505 -------------
1506  '1' <4> '2'
1507 (1 row)
1509 SELECT to_tsquery('english', '1 <3> (2 <-> a)');
1510  to_tsquery  
1511 -------------
1512  '1' <3> '2'
1513 (1 row)
1515 SELECT to_tsquery('english', '(1 <3> 2) <-> a');
1516  to_tsquery  
1517 -------------
1518  '1' <3> '2'
1519 (1 row)
1521 SELECT to_tsquery('english', '(1 <3> a) <-> 2');
1522  to_tsquery  
1523 -------------
1524  '1' <4> '2'
1525 (1 row)
1527 SELECT to_tsquery('english', '(a <3> 1) <-> 2');
1528  to_tsquery  
1529 -------------
1530  '1' <-> '2'
1531 (1 row)
1533 SELECT to_tsquery('english', 'a <-> (1 <3> 2)');
1534  to_tsquery  
1535 -------------
1536  '1' <3> '2'
1537 (1 row)
1539 SELECT to_tsquery('english', '1 <-> (a <3> 2)');
1540  to_tsquery  
1541 -------------
1542  '1' <4> '2'
1543 (1 row)
1545 SELECT to_tsquery('english', '1 <-> (2 <3> a)');
1546  to_tsquery  
1547 -------------
1548  '1' <-> '2'
1549 (1 row)
1551 SELECT to_tsquery('english', '((a <-> 1) <-> 2) <-> s');
1552  to_tsquery  
1553 -------------
1554  '1' <-> '2'
1555 (1 row)
1557 SELECT to_tsquery('english', '(2 <-> (a <-> 1)) <-> s');
1558  to_tsquery  
1559 -------------
1560  '2' <2> '1'
1561 (1 row)
1563 SELECT to_tsquery('english', '((1 <-> a) <-> 2) <-> s');
1564  to_tsquery  
1565 -------------
1566  '1' <2> '2'
1567 (1 row)
1569 SELECT to_tsquery('english', '(2 <-> (1 <-> a)) <-> s');
1570  to_tsquery  
1571 -------------
1572  '2' <-> '1'
1573 (1 row)
1575 SELECT to_tsquery('english', 's <-> ((a <-> 1) <-> 2)');
1576  to_tsquery  
1577 -------------
1578  '1' <-> '2'
1579 (1 row)
1581 SELECT to_tsquery('english', 's <-> (2 <-> (a <-> 1))');
1582  to_tsquery  
1583 -------------
1584  '2' <2> '1'
1585 (1 row)
1587 SELECT to_tsquery('english', 's <-> ((1 <-> a) <-> 2)');
1588  to_tsquery  
1589 -------------
1590  '1' <2> '2'
1591 (1 row)
1593 SELECT to_tsquery('english', 's <-> (2 <-> (1 <-> a))');
1594  to_tsquery  
1595 -------------
1596  '2' <-> '1'
1597 (1 row)
1599 SELECT to_tsquery('english', '((a <-> 1) <-> s) <-> 2');
1600  to_tsquery  
1601 -------------
1602  '1' <2> '2'
1603 (1 row)
1605 SELECT to_tsquery('english', '(s <-> (a <-> 1)) <-> 2');
1606  to_tsquery  
1607 -------------
1608  '1' <-> '2'
1609 (1 row)
1611 SELECT to_tsquery('english', '((1 <-> a) <-> s) <-> 2');
1612  to_tsquery  
1613 -------------
1614  '1' <3> '2'
1615 (1 row)
1617 SELECT to_tsquery('english', '(s <-> (1 <-> a)) <-> 2');
1618  to_tsquery  
1619 -------------
1620  '1' <2> '2'
1621 (1 row)
1623 SELECT to_tsquery('english', '2 <-> ((a <-> 1) <-> s)');
1624  to_tsquery  
1625 -------------
1626  '2' <2> '1'
1627 (1 row)
1629 SELECT to_tsquery('english', '2 <-> (s <-> (a <-> 1))');
1630  to_tsquery  
1631 -------------
1632  '2' <3> '1'
1633 (1 row)
1635 SELECT to_tsquery('english', '2 <-> ((1 <-> a) <-> s)');
1636  to_tsquery  
1637 -------------
1638  '2' <-> '1'
1639 (1 row)
1641 SELECT to_tsquery('english', '2 <-> (s <-> (1 <-> a))');
1642  to_tsquery  
1643 -------------
1644  '2' <2> '1'
1645 (1 row)
1647 SELECT to_tsquery('english', 'foo <-> (a <-> (the <-> bar))');
1648    to_tsquery    
1649 -----------------
1650  'foo' <3> 'bar'
1651 (1 row)
1653 SELECT to_tsquery('english', '((foo <-> a) <-> the) <-> bar');
1654    to_tsquery    
1655 -----------------
1656  'foo' <3> 'bar'
1657 (1 row)
1659 SELECT to_tsquery('english', 'foo <-> a <-> the <-> bar');
1660    to_tsquery    
1661 -----------------
1662  'foo' <3> 'bar'
1663 (1 row)
1665 SELECT phraseto_tsquery('english', 'PostgreSQL can be extended by the user in many ways');
1666                      phraseto_tsquery                      
1667 -----------------------------------------------------------
1668  'postgresql' <3> 'extend' <3> 'user' <2> 'mani' <-> 'way'
1669 (1 row)
1671 SELECT ts_rank_cd(to_tsvector('english', '
1672 Day after day, day after day,
1673   We stuck, nor breath nor motion,
1674 As idle as a painted Ship
1675   Upon a painted Ocean.
1676 Water, water, every where
1677   And all the boards did shrink;
1678 Water, water, every where,
1679   Nor any drop to drink.
1680 S. T. Coleridge (1772-1834)
1681 '), to_tsquery('english', 'paint&water'));
1682  ts_rank_cd 
1683 ------------
1684        0.05
1685 (1 row)
1687 SELECT ts_rank_cd(to_tsvector('english', '
1688 Day after day, day after day,
1689   We stuck, nor breath nor motion,
1690 As idle as a painted Ship
1691   Upon a painted Ocean.
1692 Water, water, every where
1693   And all the boards did shrink;
1694 Water, water, every where,
1695   Nor any drop to drink.
1696 S. T. Coleridge (1772-1834)
1697 '), to_tsquery('english', 'breath&motion&water'));
1698  ts_rank_cd  
1699 -------------
1700  0.008333334
1701 (1 row)
1703 SELECT ts_rank_cd(to_tsvector('english', '
1704 Day after day, day after day,
1705   We stuck, nor breath nor motion,
1706 As idle as a painted Ship
1707   Upon a painted Ocean.
1708 Water, water, every where
1709   And all the boards did shrink;
1710 Water, water, every where,
1711   Nor any drop to drink.
1712 S. T. Coleridge (1772-1834)
1713 '), to_tsquery('english', 'ocean'));
1714  ts_rank_cd 
1715 ------------
1716         0.1
1717 (1 row)
1719 SELECT ts_rank_cd(to_tsvector('english', '
1720 Day after day, day after day,
1721   We stuck, nor breath nor motion,
1722 As idle as a painted Ship
1723   Upon a painted Ocean.
1724 Water, water, every where
1725   And all the boards did shrink;
1726 Water, water, every where,
1727   Nor any drop to drink.
1728 S. T. Coleridge (1772-1834)
1729 '), to_tsquery('english', 'painted <-> Ship'));
1730  ts_rank_cd 
1731 ------------
1732         0.1
1733 (1 row)
1735 SELECT ts_rank_cd(strip(to_tsvector('both stripped')),
1736                   to_tsquery('both & stripped'));
1737  ts_rank_cd 
1738 ------------
1739           0
1740 (1 row)
1742 SELECT ts_rank_cd(to_tsvector('unstripped') || strip(to_tsvector('stripped')),
1743                   to_tsquery('unstripped & stripped'));
1744  ts_rank_cd 
1745 ------------
1746           0
1747 (1 row)
1749 --headline tests
1750 SELECT ts_headline('english', '
1751 Day after day, day after day,
1752   We stuck, nor breath nor motion,
1753 As idle as a painted Ship
1754   Upon a painted Ocean.
1755 Water, water, every where
1756   And all the boards did shrink;
1757 Water, water, every where,
1758   Nor any drop to drink.
1759 S. T. Coleridge (1772-1834)
1760 ', to_tsquery('english', 'paint&water'));
1761                ts_headline               
1762 -----------------------------------------
1763  <b>painted</b> Ocean.                  +
1764  <b>Water</b>, <b>water</b>, every where+
1765    And all the boards did shrink;       +
1766  <b>Water</b>, <b>water</b>, every
1767 (1 row)
1769 SELECT ts_headline('english', '
1770 Day after day, day after day,
1771   We stuck, nor breath nor motion,
1772 As idle as a painted Ship
1773   Upon a painted Ocean.
1774 Water, water, every where
1775   And all the boards did shrink;
1776 Water, water, every where,
1777   Nor any drop to drink.
1778 S. T. Coleridge (1772-1834)
1779 ', to_tsquery('english', 'breath&motion&water'));
1780            ts_headline            
1781 ----------------------------------
1782  <b>breath</b> nor <b>motion</b>,+
1783  As idle as a painted Ship       +
1784    Upon a painted Ocean.         +
1785  <b>Water</b>, <b>water</b>
1786 (1 row)
1788 SELECT ts_headline('english', '
1789 Day after day, day after day,
1790   We stuck, nor breath nor motion,
1791 As idle as a painted Ship
1792   Upon a painted Ocean.
1793 Water, water, every where
1794   And all the boards did shrink;
1795 Water, water, every where,
1796   Nor any drop to drink.
1797 S. T. Coleridge (1772-1834)
1798 ', to_tsquery('english', 'ocean'));
1799            ts_headline            
1800 ----------------------------------
1801  <b>Ocean</b>.                   +
1802  Water, water, every where       +
1803    And all the boards did shrink;+
1804  Water, water, every where
1805 (1 row)
1807 SELECT ts_headline('english', '
1808 Day after day, day after day,
1809   We stuck, nor breath nor motion,
1810 As idle as a painted Ship
1811   Upon a painted Ocean.
1812 Water, water, every where
1813   And all the boards did shrink;
1814 Water, water, every where,
1815   Nor any drop to drink.
1816 S. T. Coleridge (1772-1834)
1817 ', to_tsquery('english', 'day & drink'));
1818             ts_headline             
1819 ------------------------------------
1820  <b>day</b>,                       +
1821    We stuck, nor breath nor motion,+
1822  As idle as a painted Ship         +
1823    Upon a painted Ocean.           +
1824  Water, water, every where         +
1825    And all the boards did shrink;  +
1826  Water, water, every where,        +
1827    Nor any drop
1828 (1 row)
1830 SELECT ts_headline('english', '
1831 Day after day, day after day,
1832   We stuck, nor breath nor motion,
1833 As idle as a painted Ship
1834   Upon a painted Ocean.
1835 Water, water, every where
1836   And all the boards did shrink;
1837 Water, water, every where,
1838   Nor any drop to drink.
1839 S. T. Coleridge (1772-1834)
1840 ', to_tsquery('english', 'day | drink'));
1841                         ts_headline                        
1842 -----------------------------------------------------------
1843  <b>Day</b> after <b>day</b>, <b>day</b> after <b>day</b>,+
1844    We stuck, nor breath nor motion,                       +
1845  As idle as a painted
1846 (1 row)
1848 SELECT ts_headline('english', '
1849 Day after day, day after day,
1850   We stuck, nor breath nor motion,
1851 As idle as a painted Ship
1852   Upon a painted Ocean.
1853 Water, water, every where
1854   And all the boards did shrink;
1855 Water, water, every where,
1856   Nor any drop to drink.
1857 S. T. Coleridge (1772-1834)
1858 ', to_tsquery('english', 'day | !drink'));
1859                         ts_headline                        
1860 -----------------------------------------------------------
1861  <b>Day</b> after <b>day</b>, <b>day</b> after <b>day</b>,+
1862    We stuck, nor breath nor motion,                       +
1863  As idle as a painted
1864 (1 row)
1866 SELECT ts_headline('english', '
1867 Day after day, day after day,
1868   We stuck, nor breath nor motion,
1869 As idle as a painted Ship
1870   Upon a painted Ocean.
1871 Water, water, every where
1872   And all the boards did shrink;
1873 Water, water, every where,
1874   Nor any drop to drink.
1875 S. T. Coleridge (1772-1834)
1876 ', to_tsquery('english', 'painted <-> Ship & drink'));
1877            ts_headline            
1878 ----------------------------------
1879  <b>painted</b> <b>Ship</b>      +
1880    Upon a <b>painted</b> Ocean.  +
1881  Water, water, every where       +
1882    And all the boards did shrink;+
1883  Water, water, every where,      +
1884    Nor any drop to <b>drink</b>
1885 (1 row)
1887 SELECT ts_headline('english', '
1888 Day after day, day after day,
1889   We stuck, nor breath nor motion,
1890 As idle as a painted Ship
1891   Upon a painted Ocean.
1892 Water, water, every where
1893   And all the boards did shrink;
1894 Water, water, every where,
1895   Nor any drop to drink.
1896 S. T. Coleridge (1772-1834)
1897 ', to_tsquery('english', 'painted <-> Ship | drink'));
1898            ts_headline           
1899 ---------------------------------
1900  <b>painted</b> <b>Ship</b>     +
1901    Upon a <b>painted</b> Ocean. +
1902  Water, water, every where      +
1903    And all the boards did shrink
1904 (1 row)
1906 SELECT ts_headline('english', '
1907 Day after day, day after day,
1908   We stuck, nor breath nor motion,
1909 As idle as a painted Ship
1910   Upon a painted Ocean.
1911 Water, water, every where
1912   And all the boards did shrink;
1913 Water, water, every where,
1914   Nor any drop to drink.
1915 S. T. Coleridge (1772-1834)
1916 ', to_tsquery('english', 'painted <-> Ship | !drink'));
1917            ts_headline           
1918 ---------------------------------
1919  <b>painted</b> <b>Ship</b>     +
1920    Upon a <b>painted</b> Ocean. +
1921  Water, water, every where      +
1922    And all the boards did shrink
1923 (1 row)
1925 SELECT ts_headline('english', '
1926 Day after day, day after day,
1927   We stuck, nor breath nor motion,
1928 As idle as a painted Ship
1929   Upon a painted Ocean.
1930 Water, water, every where
1931   And all the boards did shrink;
1932 Water, water, every where,
1933   Nor any drop to drink.
1934 S. T. Coleridge (1772-1834)
1935 ', phraseto_tsquery('english', 'painted Ocean'));
1936            ts_headline            
1937 ----------------------------------
1938  <b>painted</b> <b>Ocean</b>.    +
1939  Water, water, every where       +
1940    And all the boards did shrink;+
1941  Water, water, every
1942 (1 row)
1944 SELECT ts_headline('english', '
1945 Day after day, day after day,
1946   We stuck, nor breath nor motion,
1947 As idle as a painted Ship
1948   Upon a painted Ocean.
1949 Water, water, every where
1950   And all the boards did shrink;
1951 Water, water, every where,
1952   Nor any drop to drink.
1953 S. T. Coleridge (1772-1834)
1954 ', phraseto_tsquery('english', 'idle as a painted Ship'));
1955                  ts_headline                 
1956 ---------------------------------------------
1957  <b>idle</b> as a <b>painted</b> <b>Ship</b>+
1958    Upon a <b>painted</b> Ocean.             +
1959  Water, water, every where                  +
1960    And all the boards
1961 (1 row)
1963 SELECT ts_headline('english',
1964 'Lorem ipsum urna.  Nullam nullam ullamcorper urna.',
1965 to_tsquery('english','Lorem') && phraseto_tsquery('english','ullamcorper urna'),
1966 'MaxWords=100, MinWords=1');
1967                                   ts_headline                                  
1968 -------------------------------------------------------------------------------
1969  <b>Lorem</b> ipsum <b>urna</b>.  Nullam nullam <b>ullamcorper</b> <b>urna</b>
1970 (1 row)
1972 SELECT ts_headline('english',
1973 'Lorem ipsum urna.  Nullam nullam ullamcorper urna.',
1974 phraseto_tsquery('english','ullamcorper urna'),
1975 'MaxWords=100, MinWords=5');
1976                          ts_headline                         
1977 -------------------------------------------------------------
1978  <b>urna</b>.  Nullam nullam <b>ullamcorper</b> <b>urna</b>.
1979 (1 row)
1981 SELECT ts_headline('english', '
1982 <html>
1983 <!-- some comment -->
1984 <body>
1985 Sea view wow <u>foo bar</u> <i>qq</i>
1986 <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>
1987 ff-bg
1988 <script>
1989        document.write(15);
1990 </script>
1991 </body>
1992 </html>',
1993 to_tsquery('english', 'sea&foo'), 'HighlightAll=true');
1994                                  ts_headline                                 
1995 -----------------------------------------------------------------------------
1996                                                                             +
1997  <html>                                                                     +
1998  <!-- some comment -->                                                      +
1999  <body>                                                                     +
2000  <b>Sea</b> view wow <u><b>foo</b> bar</u> <i>qq</i>                        +
2001  <a href="http://www.google.com/foo.bar.html" target="_blank">YES &nbsp;</a>+
2002  ff-bg                                                                      +
2003  <script>                                                                   +
2004         document.write(15);                                                 +
2005  </script>                                                                  +
2006  </body>                                                                    +
2007  </html>
2008 (1 row)
2010 SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 <-> 3', 'MaxWords=2, MinWords=1');
2011     ts_headline    
2012 -------------------
2013  <b>1</b> <b>3</b>
2014 (1 row)
2016 SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 & 3', 'MaxWords=4, MinWords=1');
2017      ts_headline     
2018 ---------------------
2019  <b>1</b> 2 <b>3</b>
2020 (1 row)
2022 SELECT ts_headline('simple', '1 2 3 1 3'::text, '1 <-> 3', 'MaxWords=4, MinWords=1');
2023     ts_headline    
2024 -------------------
2025  <b>1</b> <b>3</b>
2026 (1 row)
2028 --Check if headline fragments work
2029 SELECT ts_headline('english', '
2030 Day after day, day after day,
2031   We stuck, nor breath nor motion,
2032 As idle as a painted Ship
2033   Upon a painted Ocean.
2034 Water, water, every where
2035   And all the boards did shrink;
2036 Water, water, every where,
2037   Nor any drop to drink.
2038 S. T. Coleridge (1772-1834)
2039 ', to_tsquery('english', 'ocean'), 'MaxFragments=1');
2040             ts_headline             
2041 ------------------------------------
2042  after day,                        +
2043    We stuck, nor breath nor motion,+
2044  As idle as a painted Ship         +
2045    Upon a painted <b>Ocean</b>.    +
2046  Water, water, every where         +
2047    And all the boards did shrink;  +
2048  Water, water, every where,        +
2049    Nor any drop
2050 (1 row)
2052 --Check if more than one fragments are displayed
2053 SELECT ts_headline('english', '
2054 Day after day, day after day,
2055   We stuck, nor breath nor motion,
2056 As idle as a painted Ship
2057   Upon a painted Ocean.
2058 Water, water, every where
2059   And all the boards did shrink;
2060 Water, water, every where,
2061   Nor any drop to drink.
2062 S. T. Coleridge (1772-1834)
2063 ', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2');
2064                  ts_headline                  
2065 ----------------------------------------------
2066  after day, day after day,                   +
2067    We <b>stuck</b>, nor breath nor motion,   +
2068  As idle as a painted Ship                   +
2069    Upon a painted Ocean.                     +
2070  Water, water, every where                   +
2071    And all the boards did shrink;            +
2072  Water, water, every where ... drop to drink.+
2073  S. T. <b>Coleridge</b>
2074 (1 row)
2076 --Fragments when there all query words are not in the document
2077 SELECT ts_headline('english', '
2078 Day after day, day after day,
2079   We stuck, nor breath nor motion,
2080 As idle as a painted Ship
2081   Upon a painted Ocean.
2082 Water, water, every where
2083   And all the boards did shrink;
2084 Water, water, every where,
2085   Nor any drop to drink.
2086 S. T. Coleridge (1772-1834)
2087 ', to_tsquery('english', 'ocean & seahorse'), 'MaxFragments=1');
2088             ts_headline             
2089 ------------------------------------
2090                                    +
2091  Day after day, day after day,     +
2092    We stuck, nor breath nor motion,+
2093  As idle as
2094 (1 row)
2096 --FragmentDelimiter option
2097 SELECT ts_headline('english', '
2098 Day after day, day after day,
2099   We stuck, nor breath nor motion,
2100 As idle as a painted Ship
2101   Upon a painted Ocean.
2102 Water, water, every where
2103   And all the boards did shrink;
2104 Water, water, every where,
2105   Nor any drop to drink.
2106 S. T. Coleridge (1772-1834)
2107 ', to_tsquery('english', 'Coleridge & stuck'), 'MaxFragments=2,FragmentDelimiter=***');
2108                 ts_headline                 
2109 --------------------------------------------
2110  after day, day after day,                 +
2111    We <b>stuck</b>, nor breath nor motion, +
2112  As idle as a painted Ship                 +
2113    Upon a painted Ocean.                   +
2114  Water, water, every where                 +
2115    And all the boards did shrink;          +
2116  Water, water, every where***drop to drink.+
2117  S. T. <b>Coleridge</b>
2118 (1 row)
2120 --Fragments with phrase search
2121 SELECT ts_headline('english',
2122 'Lorem ipsum urna.  Nullam nullam ullamcorper urna.',
2123 to_tsquery('english','Lorem') && phraseto_tsquery('english','ullamcorper urna'),
2124 'MaxFragments=100, MaxWords=100, MinWords=1');
2125                                   ts_headline                                  
2126 -------------------------------------------------------------------------------
2127  <b>Lorem</b> ipsum <b>urna</b>.  Nullam nullam <b>ullamcorper</b> <b>urna</b>
2128 (1 row)
2130 -- Edge cases with empty query
2131 SELECT ts_headline('english',
2132 '', to_tsquery('english', ''));
2133 NOTICE:  text-search query doesn't contain lexemes: ""
2134  ts_headline 
2135 -------------
2137 (1 row)
2139 SELECT ts_headline('english',
2140 'foo bar', to_tsquery('english', ''));
2141 NOTICE:  text-search query doesn't contain lexemes: ""
2142  ts_headline 
2143 -------------
2144  foo bar
2145 (1 row)
2147 --Rewrite sub system
2148 CREATE TABLE test_tsquery (txtkeyword TEXT, txtsample TEXT);
2149 \set ECHO none
2150 ALTER TABLE test_tsquery ADD COLUMN keyword tsquery;
2151 UPDATE test_tsquery SET keyword = to_tsquery('english', txtkeyword);
2152 ALTER TABLE test_tsquery ADD COLUMN sample tsquery;
2153 UPDATE test_tsquery SET sample = to_tsquery('english', txtsample::text);
2154 SELECT COUNT(*) FROM test_tsquery WHERE keyword <  'new <-> york';
2155  count 
2156 -------
2157      2
2158 (1 row)
2160 SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new <-> york';
2161  count 
2162 -------
2163      3
2164 (1 row)
2166 SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new <-> york';
2167  count 
2168 -------
2169      1
2170 (1 row)
2172 SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new <-> york';
2173  count 
2174 -------
2175      4
2176 (1 row)
2178 SELECT COUNT(*) FROM test_tsquery WHERE keyword >  'new <-> york';
2179  count 
2180 -------
2181      3
2182 (1 row)
2184 CREATE UNIQUE INDEX bt_tsq ON test_tsquery (keyword);
2185 SET enable_seqscan=OFF;
2186 SELECT COUNT(*) FROM test_tsquery WHERE keyword <  'new <-> york';
2187  count 
2188 -------
2189      2
2190 (1 row)
2192 SELECT COUNT(*) FROM test_tsquery WHERE keyword <= 'new <-> york';
2193  count 
2194 -------
2195      3
2196 (1 row)
2198 SELECT COUNT(*) FROM test_tsquery WHERE keyword = 'new <-> york';
2199  count 
2200 -------
2201      1
2202 (1 row)
2204 SELECT COUNT(*) FROM test_tsquery WHERE keyword >= 'new <-> york';
2205  count 
2206 -------
2207      4
2208 (1 row)
2210 SELECT COUNT(*) FROM test_tsquery WHERE keyword >  'new <-> york';
2211  count 
2212 -------
2213      3
2214 (1 row)
2216 RESET enable_seqscan;
2217 SELECT ts_rewrite('foo & bar & qq & new & york',  'new & york'::tsquery, 'big & apple | nyc | new & york & city');
2218                                   ts_rewrite                                  
2219 ------------------------------------------------------------------------------
2220  'foo' & 'bar' & 'qq' & ( 'city' & 'new' & 'york' | 'nyc' | 'big' & 'apple' )
2221 (1 row)
2223 SELECT ts_rewrite(ts_rewrite('new & !york ', 'york', '!jersey'),
2224                   'jersey', 'mexico');
2225      ts_rewrite     
2226 --------------------
2227  'new' & !!'mexico'
2228 (1 row)
2230 SELECT ts_rewrite('moscow', 'SELECT keyword, sample FROM test_tsquery'::text );
2231      ts_rewrite      
2232 ---------------------
2233  'moskva' | 'moscow'
2234 (1 row)
2236 SELECT ts_rewrite('moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'::text );
2237             ts_rewrite             
2238 -----------------------------------
2239  'hotel' & ( 'moskva' | 'moscow' )
2240 (1 row)
2242 SELECT ts_rewrite('bar & qq & foo & (new <-> york)', 'SELECT keyword, sample FROM test_tsquery'::text );
2243                                      ts_rewrite                                      
2244 -------------------------------------------------------------------------------------
2245  'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' )
2246 (1 row)
2248 SELECT ts_rewrite( 'moscow', 'SELECT keyword, sample FROM test_tsquery');
2249      ts_rewrite      
2250 ---------------------
2251  'moskva' | 'moscow'
2252 (1 row)
2254 SELECT ts_rewrite( 'moscow & hotel', 'SELECT keyword, sample FROM test_tsquery');
2255             ts_rewrite             
2256 -----------------------------------
2257  'hotel' & ( 'moskva' | 'moscow' )
2258 (1 row)
2260 SELECT ts_rewrite( 'bar & qq & foo & (new <-> york)', 'SELECT keyword, sample FROM test_tsquery');
2261                                      ts_rewrite                                      
2262 -------------------------------------------------------------------------------------
2263  'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' )
2264 (1 row)
2266 SELECT ts_rewrite('1 & (2 <-> 3)', 'SELECT keyword, sample FROM test_tsquery'::text );
2267  ts_rewrite  
2268 -------------
2269  '2' <-> '4'
2270 (1 row)
2272 SELECT ts_rewrite('1 & (2 <2> 3)', 'SELECT keyword, sample FROM test_tsquery'::text );
2273     ts_rewrite     
2274 -------------------
2275  '1' & '2' <2> '3'
2276 (1 row)
2278 SELECT ts_rewrite('5 <-> (1 & (2 <-> 3))', 'SELECT keyword, sample FROM test_tsquery'::text );
2279        ts_rewrite        
2280 -------------------------
2281  '5' <-> ( '2' <-> '4' )
2282 (1 row)
2284 SELECT ts_rewrite('5 <-> (6 | 8)', 'SELECT keyword, sample FROM test_tsquery'::text );
2285       ts_rewrite       
2286 -----------------------
2287  '5' <-> ( '6' | '8' )
2288 (1 row)
2290 -- Check empty substitution
2291 SELECT ts_rewrite(to_tsquery('5 & (6 | 5)'), to_tsquery('5'), to_tsquery(''));
2292 NOTICE:  text-search query doesn't contain lexemes: ""
2293  ts_rewrite 
2294 ------------
2295  '6'
2296 (1 row)
2298 SELECT ts_rewrite(to_tsquery('!5'), to_tsquery('5'), to_tsquery(''));
2299 NOTICE:  text-search query doesn't contain lexemes: ""
2300  ts_rewrite 
2301 ------------
2303 (1 row)
2305 SELECT keyword FROM test_tsquery WHERE keyword @> 'new';
2306      keyword      
2307 ------------------
2308  'new' <-> 'york'
2309 (1 row)
2311 SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow';
2312  keyword  
2313 ----------
2314  'moscow'
2315 (1 row)
2317 SELECT keyword FROM test_tsquery WHERE keyword <@ 'new';
2318  keyword 
2319 ---------
2320 (0 rows)
2322 SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow';
2323  keyword  
2324 ----------
2325  'moscow'
2326 (1 row)
2328 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query;
2329      ts_rewrite      
2330 ---------------------
2331  'moskva' | 'moscow'
2332 (1 row)
2334 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query;
2335             ts_rewrite             
2336 -----------------------------------
2337  'hotel' & ( 'moskva' | 'moscow' )
2338 (1 row)
2340 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query;
2341                                      ts_rewrite                                      
2342 -------------------------------------------------------------------------------------
2343  'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' )
2344 (1 row)
2346 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query;
2347      ts_rewrite      
2348 ---------------------
2349  'moskva' | 'moscow'
2350 (1 row)
2352 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query;
2353             ts_rewrite             
2354 -----------------------------------
2355  'hotel' & ( 'moskva' | 'moscow' )
2356 (1 row)
2358 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query;
2359                                      ts_rewrite                                      
2360 -------------------------------------------------------------------------------------
2361  'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' )
2362 (1 row)
2364 CREATE INDEX qq ON test_tsquery USING gist (keyword tsquery_ops);
2365 SET enable_seqscan=OFF;
2366 SELECT keyword FROM test_tsquery WHERE keyword @> 'new';
2367      keyword      
2368 ------------------
2369  'new' <-> 'york'
2370 (1 row)
2372 SELECT keyword FROM test_tsquery WHERE keyword @> 'moscow';
2373  keyword  
2374 ----------
2375  'moscow'
2376 (1 row)
2378 SELECT keyword FROM test_tsquery WHERE keyword <@ 'new';
2379  keyword 
2380 ---------
2381 (0 rows)
2383 SELECT keyword FROM test_tsquery WHERE keyword <@ 'moscow';
2384  keyword  
2385 ----------
2386  'moscow'
2387 (1 row)
2389 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query;
2390      ts_rewrite      
2391 ---------------------
2392  'moskva' | 'moscow'
2393 (1 row)
2395 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query;
2396             ts_rewrite             
2397 -----------------------------------
2398  'hotel' & ( 'moskva' | 'moscow' )
2399 (1 row)
2401 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query;
2402                                      ts_rewrite                                      
2403 -------------------------------------------------------------------------------------
2404  'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' )
2405 (1 row)
2407 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow') AS query;
2408      ts_rewrite      
2409 ---------------------
2410  'moskva' | 'moscow'
2411 (1 row)
2413 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'moscow & hotel') AS query;
2414             ts_rewrite             
2415 -----------------------------------
2416  'hotel' & ( 'moskva' | 'moscow' )
2417 (1 row)
2419 SELECT ts_rewrite( query, 'SELECT keyword, sample FROM test_tsquery' ) FROM to_tsquery('english', 'bar & qq & foo & (new <-> york)') AS query;
2420                                      ts_rewrite                                      
2421 -------------------------------------------------------------------------------------
2422  'citi' & 'foo' & ( 'bar' | 'qq' ) & ( 'nyc' | 'big' <-> 'appl' | 'new' <-> 'york' )
2423 (1 row)
2425 SELECT ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz');
2426                ts_rewrite                
2427 -----------------------------------------
2428  ( 'bar' | 'baz' ) <-> ( 'bar' | 'baz' )
2429 (1 row)
2431 SELECT to_tsvector('foo bar') @@
2432   ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz');
2433  ?column? 
2434 ----------
2436 (1 row)
2438 SELECT to_tsvector('bar baz') @@
2439   ts_rewrite(tsquery_phrase('foo', 'foo'), 'foo', 'bar | baz');
2440  ?column? 
2441 ----------
2443 (1 row)
2445 RESET enable_seqscan;
2446 --test GUC
2447 SET default_text_search_config=simple;
2448 SELECT to_tsvector('SKIES My booKs');
2449         to_tsvector         
2450 ----------------------------
2451  'books':3 'my':2 'skies':1
2452 (1 row)
2454 SELECT plainto_tsquery('SKIES My booKs');
2455      plainto_tsquery      
2456 --------------------------
2457  'skies' & 'my' & 'books'
2458 (1 row)
2460 SELECT to_tsquery('SKIES & My | booKs');
2461         to_tsquery        
2462 --------------------------
2463  'skies' & 'my' | 'books'
2464 (1 row)
2466 SET default_text_search_config=english;
2467 SELECT to_tsvector('SKIES My booKs');
2468    to_tsvector    
2469 ------------------
2470  'book':3 'sky':1
2471 (1 row)
2473 SELECT plainto_tsquery('SKIES My booKs');
2474  plainto_tsquery 
2475 -----------------
2476  'sky' & 'book'
2477 (1 row)
2479 SELECT to_tsquery('SKIES & My | booKs');
2480    to_tsquery   
2481 ----------------
2482  'sky' | 'book'
2483 (1 row)
2485 --trigger
2486 CREATE TRIGGER tsvectorupdate
2487 BEFORE UPDATE OR INSERT ON test_tsvector
2488 FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(a, 'pg_catalog.english', t);
2489 SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
2490  count 
2491 -------
2492      0
2493 (1 row)
2495 INSERT INTO test_tsvector (t) VALUES ('345 qwerty');
2496 SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
2497  count 
2498 -------
2499      1
2500 (1 row)
2502 UPDATE test_tsvector SET t = null WHERE t = '345 qwerty';
2503 SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
2504  count 
2505 -------
2506      0
2507 (1 row)
2509 INSERT INTO test_tsvector (t) VALUES ('345 qwerty');
2510 SELECT count(*) FROM test_tsvector WHERE a @@ to_tsquery('345&qwerty');
2511  count 
2512 -------
2513      1
2514 (1 row)
2516 -- Test inlining of immutable constant functions
2517 -- to_tsquery(text) is not immutable, so it won't be inlined
2518 explain (costs off)
2519 select * from test_tsquery, to_tsquery('new') q where txtsample @@ q;
2520                    QUERY PLAN                   
2521 ------------------------------------------------
2522  Nested Loop
2523    Join Filter: (test_tsquery.txtsample @@ q.q)
2524    ->  Function Scan on to_tsquery q
2525    ->  Seq Scan on test_tsquery
2526 (4 rows)
2528 -- to_tsquery(regconfig, text) is an immutable function.
2529 -- That allows us to get rid of using function scan and join at all.
2530 explain (costs off)
2531 select * from test_tsquery, to_tsquery('english', 'new') q where txtsample @@ q;
2532                  QUERY PLAN                  
2533 ---------------------------------------------
2534  Seq Scan on test_tsquery
2535    Filter: (txtsample @@ '''new'''::tsquery)
2536 (2 rows)
2538 -- test finding items in GIN's pending list
2539 create temp table pendtest (ts tsvector);
2540 create index pendtest_idx on pendtest using gin(ts);
2541 insert into pendtest values (to_tsvector('Lore ipsam'));
2542 insert into pendtest values (to_tsvector('Lore ipsum'));
2543 select * from pendtest where 'ipsu:*'::tsquery @@ ts;
2544          ts         
2545 --------------------
2546  'ipsum':2 'lore':1
2547 (1 row)
2549 select * from pendtest where 'ipsa:*'::tsquery @@ ts;
2550          ts         
2551 --------------------
2552  'ipsam':2 'lore':1
2553 (1 row)
2555 select * from pendtest where 'ips:*'::tsquery @@ ts;
2556          ts         
2557 --------------------
2558  'ipsam':2 'lore':1
2559  'ipsum':2 'lore':1
2560 (2 rows)
2562 select * from pendtest where 'ipt:*'::tsquery @@ ts;
2563  ts 
2564 ----
2565 (0 rows)
2567 select * from pendtest where 'ipi:*'::tsquery @@ ts;
2568  ts 
2569 ----
2570 (0 rows)
2572 --check OP_PHRASE on index
2573 create temp table phrase_index_test(fts tsvector);
2574 insert into phrase_index_test values ('A fat cat has just eaten a rat.');
2575 insert into phrase_index_test values (to_tsvector('english', 'A fat cat has just eaten a rat.'));
2576 create index phrase_index_test_idx on phrase_index_test using gin(fts);
2577 set enable_seqscan = off;
2578 select * from phrase_index_test where fts @@ phraseto_tsquery('english', 'fat cat');
2579                 fts                
2580 -----------------------------------
2581  'cat':3 'eaten':6 'fat':2 'rat':8
2582 (1 row)
2584 set enable_seqscan = on;
2585 -- test websearch_to_tsquery function
2586 select websearch_to_tsquery('simple', 'I have a fat:*ABCD cat');
2587             websearch_to_tsquery             
2588 ---------------------------------------------
2589  'i' & 'have' & 'a' & 'fat' & 'abcd' & 'cat'
2590 (1 row)
2592 select websearch_to_tsquery('simple', 'orange:**AABBCCDD');
2593  websearch_to_tsquery  
2594 -----------------------
2595  'orange' & 'aabbccdd'
2596 (1 row)
2598 select websearch_to_tsquery('simple', 'fat:A!cat:B|rat:C<');
2599           websearch_to_tsquery           
2600 -----------------------------------------
2601  'fat' & 'a' & 'cat' & 'b' & 'rat' & 'c'
2602 (1 row)
2604 select websearch_to_tsquery('simple', 'fat:A : cat:B');
2605    websearch_to_tsquery    
2606 ---------------------------
2607  'fat' & 'a' & 'cat' & 'b'
2608 (1 row)
2610 select websearch_to_tsquery('simple', 'fat*rat');
2611  websearch_to_tsquery 
2612 ----------------------
2613  'fat' <-> 'rat'
2614 (1 row)
2616 select websearch_to_tsquery('simple', 'fat-rat');
2617      websearch_to_tsquery      
2618 -------------------------------
2619  'fat-rat' <-> 'fat' <-> 'rat'
2620 (1 row)
2622 select websearch_to_tsquery('simple', 'fat_rat');
2623  websearch_to_tsquery 
2624 ----------------------
2625  'fat' <-> 'rat'
2626 (1 row)
2628 -- weights are completely ignored
2629 select websearch_to_tsquery('simple', 'abc : def');
2630  websearch_to_tsquery 
2631 ----------------------
2632  'abc' & 'def'
2633 (1 row)
2635 select websearch_to_tsquery('simple', 'abc:def');
2636  websearch_to_tsquery 
2637 ----------------------
2638  'abc' & 'def'
2639 (1 row)
2641 select websearch_to_tsquery('simple', 'a:::b');
2642  websearch_to_tsquery 
2643 ----------------------
2644  'a' & 'b'
2645 (1 row)
2647 select websearch_to_tsquery('simple', 'abc:d');
2648  websearch_to_tsquery 
2649 ----------------------
2650  'abc' & 'd'
2651 (1 row)
2653 select websearch_to_tsquery('simple', ':');
2654 NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
2655  websearch_to_tsquery 
2656 ----------------------
2658 (1 row)
2660 -- these operators are ignored
2661 select websearch_to_tsquery('simple', 'abc & def');
2662  websearch_to_tsquery 
2663 ----------------------
2664  'abc' & 'def'
2665 (1 row)
2667 select websearch_to_tsquery('simple', 'abc | def');
2668  websearch_to_tsquery 
2669 ----------------------
2670  'abc' & 'def'
2671 (1 row)
2673 select websearch_to_tsquery('simple', 'abc <-> def');
2674  websearch_to_tsquery 
2675 ----------------------
2676  'abc' & 'def'
2677 (1 row)
2679 -- parens are ignored, too
2680 select websearch_to_tsquery('simple', 'abc (pg or class)');
2681   websearch_to_tsquery  
2682 ------------------------
2683  'abc' & 'pg' | 'class'
2684 (1 row)
2686 select websearch_to_tsquery('simple', '(foo bar) or (ding dong)');
2687       websearch_to_tsquery       
2688 ---------------------------------
2689  'foo' & 'bar' | 'ding' & 'dong'
2690 (1 row)
2692 -- NOT is ignored in quotes
2693 select websearch_to_tsquery('english', 'My brand new smartphone');
2694      websearch_to_tsquery      
2695 -------------------------------
2696  'brand' & 'new' & 'smartphon'
2697 (1 row)
2699 select websearch_to_tsquery('english', 'My brand "new smartphone"');
2700       websearch_to_tsquery       
2701 ---------------------------------
2702  'brand' & 'new' <-> 'smartphon'
2703 (1 row)
2705 select websearch_to_tsquery('english', 'My brand "new -smartphone"');
2706       websearch_to_tsquery       
2707 ---------------------------------
2708  'brand' & 'new' <-> 'smartphon'
2709 (1 row)
2711 -- test OR operator
2712 select websearch_to_tsquery('simple', 'cat or rat');
2713  websearch_to_tsquery 
2714 ----------------------
2715  'cat' | 'rat'
2716 (1 row)
2718 select websearch_to_tsquery('simple', 'cat OR rat');
2719  websearch_to_tsquery 
2720 ----------------------
2721  'cat' | 'rat'
2722 (1 row)
2724 select websearch_to_tsquery('simple', 'cat "OR" rat');
2725  websearch_to_tsquery 
2726 ----------------------
2727  'cat' & 'or' & 'rat'
2728 (1 row)
2730 select websearch_to_tsquery('simple', 'cat OR');
2731  websearch_to_tsquery 
2732 ----------------------
2733  'cat' & 'or'
2734 (1 row)
2736 select websearch_to_tsquery('simple', 'OR rat');
2737  websearch_to_tsquery 
2738 ----------------------
2739  'or' & 'rat'
2740 (1 row)
2742 select websearch_to_tsquery('simple', '"fat cat OR rat"');
2743         websearch_to_tsquery        
2744 ------------------------------------
2745  'fat' <-> 'cat' <-> 'or' <-> 'rat'
2746 (1 row)
2748 select websearch_to_tsquery('simple', 'fat (cat OR rat');
2749  websearch_to_tsquery  
2750 -----------------------
2751  'fat' & 'cat' | 'rat'
2752 (1 row)
2754 select websearch_to_tsquery('simple', 'or OR or');
2755  websearch_to_tsquery 
2756 ----------------------
2757  'or' | 'or'
2758 (1 row)
2760 -- OR is an operator here ...
2761 select websearch_to_tsquery('simple', '"fat cat"or"fat rat"');
2762        websearch_to_tsquery        
2763 -----------------------------------
2764  'fat' <-> 'cat' | 'fat' <-> 'rat'
2765 (1 row)
2767 select websearch_to_tsquery('simple', 'fat or(rat');
2768  websearch_to_tsquery 
2769 ----------------------
2770  'fat' | 'rat'
2771 (1 row)
2773 select websearch_to_tsquery('simple', 'fat or)rat');
2774  websearch_to_tsquery 
2775 ----------------------
2776  'fat' | 'rat'
2777 (1 row)
2779 select websearch_to_tsquery('simple', 'fat or&rat');
2780  websearch_to_tsquery 
2781 ----------------------
2782  'fat' | 'rat'
2783 (1 row)
2785 select websearch_to_tsquery('simple', 'fat or|rat');
2786  websearch_to_tsquery 
2787 ----------------------
2788  'fat' | 'rat'
2789 (1 row)
2791 select websearch_to_tsquery('simple', 'fat or!rat');
2792  websearch_to_tsquery 
2793 ----------------------
2794  'fat' | 'rat'
2795 (1 row)
2797 select websearch_to_tsquery('simple', 'fat or<rat');
2798  websearch_to_tsquery 
2799 ----------------------
2800  'fat' | 'rat'
2801 (1 row)
2803 select websearch_to_tsquery('simple', 'fat or>rat');
2804  websearch_to_tsquery 
2805 ----------------------
2806  'fat' | 'rat'
2807 (1 row)
2809 select websearch_to_tsquery('simple', 'fat or ');
2810  websearch_to_tsquery 
2811 ----------------------
2812  'fat' & 'or'
2813 (1 row)
2815 -- ... but not here
2816 select websearch_to_tsquery('simple', 'abc orange');
2817  websearch_to_tsquery 
2818 ----------------------
2819  'abc' & 'orange'
2820 (1 row)
2822 select websearch_to_tsquery('simple', 'abc OR1234');
2823  websearch_to_tsquery 
2824 ----------------------
2825  'abc' & 'or1234'
2826 (1 row)
2828 select websearch_to_tsquery('simple', 'abc or-abc');
2829         websearch_to_tsquery         
2830 -------------------------------------
2831  'abc' & 'or-abc' <-> 'or' <-> 'abc'
2832 (1 row)
2834 select websearch_to_tsquery('simple', 'abc OR_abc');
2835   websearch_to_tsquery  
2836 ------------------------
2837  'abc' & 'or' <-> 'abc'
2838 (1 row)
2840 -- test quotes
2841 select websearch_to_tsquery('english', '"pg_class pg');
2842    websearch_to_tsquery    
2843 ---------------------------
2844  'pg' <-> 'class' <-> 'pg'
2845 (1 row)
2847 select websearch_to_tsquery('english', 'pg_class pg"');
2848   websearch_to_tsquery   
2849 -------------------------
2850  'pg' <-> 'class' & 'pg'
2851 (1 row)
2853 select websearch_to_tsquery('english', '"pg_class pg"');
2854    websearch_to_tsquery    
2855 ---------------------------
2856  'pg' <-> 'class' <-> 'pg'
2857 (1 row)
2859 select websearch_to_tsquery('english', '"pg_class : pg"');
2860    websearch_to_tsquery    
2861 ---------------------------
2862  'pg' <-> 'class' <-> 'pg'
2863 (1 row)
2865 select websearch_to_tsquery('english', 'abc "pg_class pg"');
2866        websearch_to_tsquery        
2867 -----------------------------------
2868  'abc' & 'pg' <-> 'class' <-> 'pg'
2869 (1 row)
2871 select websearch_to_tsquery('english', '"pg_class pg" def');
2872        websearch_to_tsquery        
2873 -----------------------------------
2874  'pg' <-> 'class' <-> 'pg' & 'def'
2875 (1 row)
2877 select websearch_to_tsquery('english', 'abc "pg pg_class pg" def');
2878                 websearch_to_tsquery                
2879 ----------------------------------------------------
2880  'abc' & 'pg' <-> 'pg' <-> 'class' <-> 'pg' & 'def'
2881 (1 row)
2883 select websearch_to_tsquery('english', ' or "pg pg_class pg" or ');
2884         websearch_to_tsquery        
2885 ------------------------------------
2886  'pg' <-> 'pg' <-> 'class' <-> 'pg'
2887 (1 row)
2889 select websearch_to_tsquery('english', '""pg pg_class pg""');
2890       websearch_to_tsquery      
2891 --------------------------------
2892  'pg' & 'pg' <-> 'class' & 'pg'
2893 (1 row)
2895 select websearch_to_tsquery('english', 'abc """"" def');
2896  websearch_to_tsquery 
2897 ----------------------
2898  'abc' & 'def'
2899 (1 row)
2901 select websearch_to_tsquery('english', 'cat -"fat rat"');
2902      websearch_to_tsquery     
2903 ------------------------------
2904  'cat' & !( 'fat' <-> 'rat' )
2905 (1 row)
2907 select websearch_to_tsquery('english', 'cat -"fat rat" cheese');
2908           websearch_to_tsquery          
2909 ----------------------------------------
2910  'cat' & !( 'fat' <-> 'rat' ) & 'chees'
2911 (1 row)
2913 select websearch_to_tsquery('english', 'abc "def -"');
2914  websearch_to_tsquery 
2915 ----------------------
2916  'abc' & 'def'
2917 (1 row)
2919 select websearch_to_tsquery('english', 'abc "def :"');
2920  websearch_to_tsquery 
2921 ----------------------
2922  'abc' & 'def'
2923 (1 row)
2925 select websearch_to_tsquery('english', '"A fat cat" has just eaten a -rat.');
2926         websearch_to_tsquery        
2927 ------------------------------------
2928  'fat' <-> 'cat' & 'eaten' & !'rat'
2929 (1 row)
2931 select websearch_to_tsquery('english', '"A fat cat" has just eaten OR !rat.');
2932        websearch_to_tsquery        
2933 -----------------------------------
2934  'fat' <-> 'cat' & 'eaten' | 'rat'
2935 (1 row)
2937 select websearch_to_tsquery('english', '"A fat cat" has just (+eaten OR -rat)');
2938         websearch_to_tsquery        
2939 ------------------------------------
2940  'fat' <-> 'cat' & 'eaten' | !'rat'
2941 (1 row)
2943 select websearch_to_tsquery('english', 'this is ----fine');
2944  websearch_to_tsquery 
2945 ----------------------
2946  !!!!'fine'
2947 (1 row)
2949 select websearch_to_tsquery('english', '(()) )))) this ||| is && -fine, "dear friend" OR good');
2950           websearch_to_tsquery          
2951 ----------------------------------------
2952  !'fine' & 'dear' <-> 'friend' | 'good'
2953 (1 row)
2955 select websearch_to_tsquery('english', 'an old <-> cat " is fine &&& too');
2956   websearch_to_tsquery  
2957 ------------------------
2958  'old' & 'cat' & 'fine'
2959 (1 row)
2961 select websearch_to_tsquery('english', '"A the" OR just on');
2962 NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
2963  websearch_to_tsquery 
2964 ----------------------
2966 (1 row)
2968 select websearch_to_tsquery('english', '"a fat cat" ate a rat');
2969       websearch_to_tsquery       
2970 ---------------------------------
2971  'fat' <-> 'cat' & 'ate' & 'rat'
2972 (1 row)
2974 select to_tsvector('english', 'A fat cat ate a rat') @@
2975         websearch_to_tsquery('english', '"a fat cat" ate a rat');
2976  ?column? 
2977 ----------
2979 (1 row)
2981 select to_tsvector('english', 'A fat grey cat ate a rat') @@
2982         websearch_to_tsquery('english', '"a fat cat" ate a rat');
2983  ?column? 
2984 ----------
2986 (1 row)
2988 -- cases handled by gettoken_tsvector()
2989 select websearch_to_tsquery('''');
2990 NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
2991  websearch_to_tsquery 
2992 ----------------------
2994 (1 row)
2996 select websearch_to_tsquery('''abc''''def''');
2997  websearch_to_tsquery 
2998 ----------------------
2999  'abc' <-> 'def'
3000 (1 row)
3002 select websearch_to_tsquery('\abc');
3003  websearch_to_tsquery 
3004 ----------------------
3005  'abc'
3006 (1 row)
3008 select websearch_to_tsquery('\');
3009 NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
3010  websearch_to_tsquery 
3011 ----------------------
3013 (1 row)