--
-- first, define the datatype.  Turn off echoing so that expected file
-- does not depend on contents of seg.sql.
--
\set ECHO none
psql:tsearch.sql:11: NOTICE:  ProcedureCreate: type txtidx is not yet defined
psql:tsearch.sql:16: NOTICE:  Argument type "txtidx" is only a shell
psql:tsearch.sql:40: NOTICE:  ProcedureCreate: type query_txt is not yet defined
psql:tsearch.sql:45: NOTICE:  Argument type "query_txt" is only a shell
psql:tsearch.sql:57: NOTICE:  ProcedureCreate: type mquery_txt is not yet defined
psql:tsearch.sql:63: NOTICE:  Argument type "mquery_txt" is only a shell
psql:tsearch.sql:158: NOTICE:  ProcedureCreate: type gtxtidx is not yet defined
psql:tsearch.sql:163: NOTICE:  Argument type "gtxtidx" is only a shell
--txtidx
SELECT '1'::txtidx;
 txtidx 
--------
 '1'
(1 row)

SELECT '1 '::txtidx;
 txtidx 
--------
 '1'
(1 row)

SELECT ' 1'::txtidx;
 txtidx 
--------
 '1'
(1 row)

SELECT ' 1 '::txtidx;
 txtidx 
--------
 '1'
(1 row)

SELECT '1 2'::txtidx;
 txtidx  
---------
 '1' '2'
(1 row)

SELECT '\'1 2\''::txtidx;
 txtidx 
--------
 '1 2'
(1 row)

SELECT '\'1 \\\'2\''::txtidx;
 txtidx  
---------
 '1 \'2'
(1 row)

SELECT '\'1 \\\'2\'3'::txtidx;
   txtidx    
-------------
 '3' '1 \'2'
(1 row)

SELECT '\'1 \\\'2\' 3'::txtidx;
   txtidx    
-------------
 '3' '1 \'2'
(1 row)

SELECT '\'1 \\\'2\' \' 3\' 4 '::txtidx;
      txtidx      
------------------
 '4' ' 3' '1 \'2'
(1 row)

--query_txt
SELECT '1'::query_txt;
 query_txt 
-----------
 '1'
(1 row)

SELECT '1 '::query_txt;
 query_txt 
-----------
 '1'
(1 row)

SELECT ' 1'::query_txt;
 query_txt 
-----------
 '1'
(1 row)

SELECT ' 1 '::query_txt;
 query_txt 
-----------
 '1'
(1 row)

SELECT '\'1 2\''::query_txt;
 query_txt 
-----------
 '1 2'
(1 row)

SELECT '\'1 \\\'2\''::query_txt;
 query_txt 
-----------
 '1 \'2'
(1 row)

SELECT '!1'::query_txt;
 query_txt 
-----------
 !'1'
(1 row)

SELECT '1|2'::query_txt;
 query_txt 
-----------
 '1' | '2'
(1 row)

SELECT '1|!2'::query_txt;
 query_txt  
------------
 '1' | !'2'
(1 row)

SELECT '!1|2'::query_txt;
 query_txt  
------------
 !'1' | '2'
(1 row)

SELECT '!1|!2'::query_txt;
  query_txt  
-------------
 !'1' | !'2'
(1 row)

SELECT '!(!1|!2)'::query_txt;
    query_txt     
------------------
 !( !'1' | !'2' )
(1 row)

SELECT '!(!1|2)'::query_txt;
    query_txt    
-----------------
 !( !'1' | '2' )
(1 row)

SELECT '!(1|!2)'::query_txt;
    query_txt    
-----------------
 !( '1' | !'2' )
(1 row)

SELECT '!(1|2)'::query_txt;
   query_txt    
----------------
 !( '1' | '2' )
(1 row)

SELECT '1&2'::query_txt;
 query_txt 
-----------
 '1' & '2'
(1 row)

SELECT '!1&2'::query_txt;
 query_txt  
------------
 !'1' & '2'
(1 row)

SELECT '1&!2'::query_txt;
 query_txt  
------------
 '1' & !'2'
(1 row)

SELECT '!1&!2'::query_txt;
  query_txt  
-------------
 !'1' & !'2'
(1 row)

SELECT '(1&2)'::query_txt;
 query_txt 
-----------
 '1' & '2'
(1 row)

SELECT '1&(2)'::query_txt;
 query_txt 
-----------
 '1' & '2'
(1 row)

SELECT '!(1)&2'::query_txt;
 query_txt  
------------
 !'1' & '2'
(1 row)

SELECT '!(1&2)'::query_txt;
   query_txt    
----------------
 !( '1' & '2' )
(1 row)

SELECT '1|2&3'::query_txt;
    query_txt    
-----------------
 '1' | '2' & '3'
(1 row)

SELECT '1|(2&3)'::query_txt;
    query_txt    
-----------------
 '1' | '2' & '3'
(1 row)

SELECT '(1|2)&3'::query_txt;
      query_txt      
---------------------
 ( '1' | '2' ) & '3'
(1 row)

SELECT '1|2&!3'::query_txt;
    query_txt     
------------------
 '1' | '2' & !'3'
(1 row)

SELECT '1|!2&3'::query_txt;
    query_txt     
------------------
 '1' | !'2' & '3'
(1 row)

SELECT '!1|2&3'::query_txt;
    query_txt     
------------------
 !'1' | '2' & '3'
(1 row)

SELECT '!1|(2&3)'::query_txt;
    query_txt     
------------------
 !'1' | '2' & '3'
(1 row)

SELECT '!(1|2)&3'::query_txt;
      query_txt       
----------------------
 !( '1' | '2' ) & '3'
(1 row)

SELECT '(!1|2)&3'::query_txt;
      query_txt       
----------------------
 ( !'1' | '2' ) & '3'
(1 row)

SELECT '1|(2|(4|(5|6)))'::query_txt;
                query_txt                
-----------------------------------------
 '1' | ( '2' | ( '4' | ( '5' | '6' ) ) )
(1 row)

SELECT '1|2|4|5|6'::query_txt;
                query_txt                
-----------------------------------------
 ( ( ( '1' | '2' ) | '4' ) | '5' ) | '6'
(1 row)

SELECT '1&(2&(4&(5&6)))'::query_txt;
          query_txt          
-----------------------------
 '1' & '2' & '4' & '5' & '6'
(1 row)

SELECT '1&2&4&5&6'::query_txt;
          query_txt          
-----------------------------
 '1' & '2' & '4' & '5' & '6'
(1 row)

SELECT '1&(2&(4&(5|6)))'::query_txt;
            query_txt            
---------------------------------
 '1' & '2' & '4' & ( '5' | '6' )
(1 row)

SELECT '1&(2&(4&(5|!6)))'::query_txt;
            query_txt             
----------------------------------
 '1' & '2' & '4' & ( '5' | !'6' )
(1 row)

SELECT '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::query_txt;
                query_txt                 
------------------------------------------
 '1' & '2' & ' 4' & ( '|5' | '6 \' !|&' )
(1 row)

SELECT '1'::mquery_txt;
 mquery_txt 
------------
 '1'
(1 row)

SELECT '1 '::mquery_txt;
 mquery_txt 
------------
 '1'
(1 row)

SELECT ' 1'::mquery_txt;
 mquery_txt 
------------
 '1'
(1 row)

SELECT ' 1 '::mquery_txt;
 mquery_txt 
------------
 '1'
(1 row)

SELECT '\'1 2\''::mquery_txt;
 mquery_txt 
------------
 '1' & '2'
(1 row)

SELECT '\'1 \\\'2\''::mquery_txt;
 mquery_txt 
------------
 '1' & '2'
(1 row)

SELECT '!1'::mquery_txt;
 mquery_txt 
------------
 !'1'
(1 row)

SELECT '1|2'::mquery_txt;
 mquery_txt 
------------
 '1' | '2'
(1 row)

SELECT '1|!2'::mquery_txt;
 mquery_txt 
------------
 '1' | !'2'
(1 row)

SELECT '!1|2'::mquery_txt;
 mquery_txt 
------------
 !'1' | '2'
(1 row)

SELECT '!1|!2'::mquery_txt;
 mquery_txt  
-------------
 !'1' | !'2'
(1 row)

SELECT '!(!1|!2)'::mquery_txt;
    mquery_txt    
------------------
 !( !'1' | !'2' )
(1 row)

SELECT '!(!1|2)'::mquery_txt;
   mquery_txt    
-----------------
 !( !'1' | '2' )
(1 row)

SELECT '!(1|!2)'::mquery_txt;
   mquery_txt    
-----------------
 !( '1' | !'2' )
(1 row)

SELECT '!(1|2)'::mquery_txt;
   mquery_txt   
----------------
 !( '1' | '2' )
(1 row)

SELECT '1&2'::mquery_txt;
 mquery_txt 
------------
 '1' & '2'
(1 row)

SELECT '!1&2'::mquery_txt;
 mquery_txt 
------------
 !'1' & '2'
(1 row)

SELECT '1&!2'::mquery_txt;
 mquery_txt 
------------
 '1' & !'2'
(1 row)

SELECT '!1&!2'::mquery_txt;
 mquery_txt  
-------------
 !'1' & !'2'
(1 row)

SELECT '(1&2)'::mquery_txt;
 mquery_txt 
------------
 '1' & '2'
(1 row)

SELECT '1&(2)'::mquery_txt;
 mquery_txt 
------------
 '1' & '2'
(1 row)

SELECT '!(1)&2'::mquery_txt;
 mquery_txt 
------------
 !'1' & '2'
(1 row)

SELECT '!(1&2)'::mquery_txt;
   mquery_txt   
----------------
 !( '1' & '2' )
(1 row)

SELECT '1|2&3'::mquery_txt;
   mquery_txt    
-----------------
 '1' | '2' & '3'
(1 row)

SELECT '1|(2&3)'::mquery_txt;
   mquery_txt    
-----------------
 '1' | '2' & '3'
(1 row)

SELECT '(1|2)&3'::mquery_txt;
     mquery_txt      
---------------------
 ( '1' | '2' ) & '3'
(1 row)

SELECT '1|2&!3'::mquery_txt;
    mquery_txt    
------------------
 '1' | '2' & !'3'
(1 row)

SELECT '1|!2&3'::mquery_txt;
    mquery_txt    
------------------
 '1' | !'2' & '3'
(1 row)

SELECT '!1|2&3'::mquery_txt;
    mquery_txt    
------------------
 !'1' | '2' & '3'
(1 row)

SELECT '!1|(2&3)'::mquery_txt;
    mquery_txt    
------------------
 !'1' | '2' & '3'
(1 row)

SELECT '!(1|2)&3'::mquery_txt;
      mquery_txt      
----------------------
 !( '1' | '2' ) & '3'
(1 row)

SELECT '(!1|2)&3'::mquery_txt;
      mquery_txt      
----------------------
 ( !'1' | '2' ) & '3'
(1 row)

SELECT '1|(2|(4|(5|6)))'::mquery_txt;
               mquery_txt                
-----------------------------------------
 '1' | ( '2' | ( '4' | ( '5' | '6' ) ) )
(1 row)

SELECT '1|2|4|5|6'::mquery_txt;
               mquery_txt                
-----------------------------------------
 ( ( ( '1' | '2' ) | '4' ) | '5' ) | '6'
(1 row)

SELECT '1&(2&(4&(5&6)))'::mquery_txt;
         mquery_txt          
-----------------------------
 '1' & '2' & '4' & '5' & '6'
(1 row)

SELECT '1&2&4&5&6'::mquery_txt;
         mquery_txt          
-----------------------------
 '1' & '2' & '4' & '5' & '6'
(1 row)

SELECT '1&(2&(4&(5|6)))'::mquery_txt;
           mquery_txt            
---------------------------------
 '1' & '2' & '4' & ( '5' | '6' )
(1 row)

SELECT '1&(2&(4&(5|!6)))'::mquery_txt;
            mquery_txt            
----------------------------------
 '1' & '2' & '4' & ( '5' | !'6' )
(1 row)

SELECT '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::mquery_txt;
           mquery_txt            
---------------------------------
 '1' & '2' & '4' & ( '5' | '6' )
(1 row)

SELECT 'querty-fgries | http://www.google.com/index.html | www.rambler.ru/index.shtml'::mquery_txt;
                                                                                mquery_txt                                                                                 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ( 'querty-fgri' & 'querti' & 'fgri' | 'www.google.com/index.html' & 'www.google.com' & '/index.html' ) | 'www.rambler.ru/index.shtml' & 'www.rambler.ru' & '/index.shtml'
(1 row)

CREATE TABLE test_txtidx( t text, a txtidx );
\copy test_txtidx from 'data/test_tsearch.data'
SELECT count(*) FROM test_txtidx WHERE a @@ 'wr|qh';
 count 
-------
    80
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ 'wr&qh';
 count 
-------
     6
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ 'eq&yt';
 count 
-------
     1
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ 'eq|yt';
 count 
-------
    47
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ '(eq&yt)|(wr&qh)';
 count 
-------
     7
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ '(eq|yt)&(wr|qh)';
 count 
-------
    11
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## 'wR|qh';
 count 
-------
    80
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## 'wR&qh';
 count 
-------
     6
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## 'eq&yt';
 count 
-------
     1
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## 'eq|yt';
 count 
-------
    47
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## '(eq&yt)|(wR&qh)';
 count 
-------
     7
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## '(eq|yt)&(wR|qh)';
 count 
-------
    11
(1 row)

create index wowidx on test_txtidx using gist (a);
SELECT count(*) FROM test_txtidx WHERE a @@ 'wr|qh';
 count 
-------
    80
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ 'wr&qh';
 count 
-------
     6
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ 'eq&yt';
 count 
-------
     1
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ 'eq|yt';
 count 
-------
    47
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ '(eq&yt)|(wr&qh)';
 count 
-------
     7
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ '(eq|yt)&(wr|qh)';
 count 
-------
    11
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## 'wR|qh';
 count 
-------
    80
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## 'wR&qh';
 count 
-------
     6
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## 'eq&yt';
 count 
-------
     1
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## 'eq|yt';
 count 
-------
    47
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## '(eq&yt)|(wR&qh)';
 count 
-------
     7
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## '(eq|yt)&(wR|qh)';
 count 
-------
    11
(1 row)

SELECT txt2txtidx('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>">
/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 
<i <b> wow  < jqw <> qwerty');
                                                                                                                                                                                                                                                                                                                                                   txt2txtidx                                                                                                                                                                                                                                                                                                                                                   
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 'ad' 'dw' 'jf' '234' '345' '4.2' '455' 'jqw' 'qwe' 'wer' 'wow' 'asdf' 'ewr1' 'qwer' 'sdjk' '5.005' 'ewri2' 'qwqwe' 'wefjn' 'gist.c' 'gist.h' 'qwerti' '234.435' ':8100/?' 'qwe-wer' 'readlin' 'www.com' '+4.0e-10' 'gist.h.c' 'rewt/ewr' 'qwe@efd.r' 'readline-4' '/?ad=qwe&dw' '/wqe-324/ewr' 'aew.werc.ewr' '1aew.werc.ewr' '2aew.werc.ewr' '3aew.werc.ewr' '4aew.werc.ewr' '5aew.werc.ewr' '6aew.werc.ewr' '7aew.werc.ewr' '/usr/local/fff' '/awdf/dwqe/4325' ':8100/?ad=qwe&dw' 'teodor@stack.net' '5aew.werc.ewr:8100/?' ':8100/?ad=qwe&dw=%20%32' 'aew.werc.ewr/?ad=qwe&dw' '1aew.werc.ewr/?ad=qwe&dw' '3aew.werc.ewr/?ad=qwe&dw' '6aew.werc.ewr:8100/?ad=qwe&dw' '7aew.werc.ewr:8100/?ad=qwe&dw=%20%32'
(1 row)

SELECT txtidxsize(txt2txtidx('345 qw'));
 txtidxsize 
------------
          2
(1 row)

SELECT txtidxsize(txt2txtidx('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>">
/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 
<i <b> wow  < jqw <> qwerty'));
 txtidxsize 
------------
         53
(1 row)

INSERT INTO test_txtidx (a) VALUES ('345 qwerty');
CREATE TRIGGER txtidxupdate
BEFORE UPDATE OR INSERT ON test_txtidx
FOR EACH ROW EXECUTE PROCEDURE tsearch(a, t);
INSERT INTO test_txtidx (t) VALUES ('345 qwerty');
SELECT count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
 count 
-------
     1
(1 row)

SELECT count(*) FROM test_txtidx WHERE a ## '345&qwerty';
 count 
-------
     1
(1 row)

UPDATE test_txtidx SET t = null WHERE t = '345 qwerty';
SELECT count(*) FROM test_txtidx WHERE a ## '345&qwerty';
 count 
-------
     0
(1 row)

SELECT count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
 count 
-------
     1
(1 row)