OSDN Git Service

Improve test coverages for combination of pg_bigm and ludia_funcs.
authorMasaoFujii <masao.fujii@gmail.com>
Mon, 7 Sep 2015 13:39:11 +0000 (22:39 +0900)
committerMasaoFujii <masao.fujii@gmail.com>
Mon, 7 Sep 2015 14:08:35 +0000 (23:08 +0900)
Ayumi Ishii

data/abc_data.tsv [new file with mode: 0644]
data/test_tbl.txt
expected/pg_bigm.out
sql/pg_bigm.sql

diff --git a/data/abc_data.tsv b/data/abc_data.tsv
new file mode 100644 (file)
index 0000000..ed13f7d
--- /dev/null
@@ -0,0 +1,512 @@
+               
+               BBBBB
+               AAAAA
+               AAAAABBBBB
+               CCCCC
+               BBBBBCCCCC
+               AAAAACCCCC
+               AAAAABBBBBCCCCC
+       BBBBB   
+       BBBBB   BBBBB
+       BBBBB   AAAAA
+       BBBBB   AAAAABBBBB
+       BBBBB   CCCCC
+       BBBBB   BBBBBCCCCC
+       BBBBB   AAAAACCCCC
+       BBBBB   AAAAABBBBBCCCCC
+       AAAAA   
+       AAAAA   BBBBB
+       AAAAA   AAAAA
+       AAAAA   AAAAABBBBB
+       AAAAA   CCCCC
+       AAAAA   BBBBBCCCCC
+       AAAAA   AAAAACCCCC
+       AAAAA   AAAAABBBBBCCCCC
+       AAAAABBBBB      
+       AAAAABBBBB      BBBBB
+       AAAAABBBBB      AAAAA
+       AAAAABBBBB      AAAAABBBBB
+       AAAAABBBBB      CCCCC
+       AAAAABBBBB      BBBBBCCCCC
+       AAAAABBBBB      AAAAACCCCC
+       AAAAABBBBB      AAAAABBBBBCCCCC
+       CCCCC   
+       CCCCC   BBBBB
+       CCCCC   AAAAA
+       CCCCC   AAAAABBBBB
+       CCCCC   CCCCC
+       CCCCC   BBBBBCCCCC
+       CCCCC   AAAAACCCCC
+       CCCCC   AAAAABBBBBCCCCC
+       BBBBBCCCCC      
+       BBBBBCCCCC      BBBBB
+       BBBBBCCCCC      AAAAA
+       BBBBBCCCCC      AAAAABBBBB
+       BBBBBCCCCC      CCCCC
+       BBBBBCCCCC      BBBBBCCCCC
+       BBBBBCCCCC      AAAAACCCCC
+       BBBBBCCCCC      AAAAABBBBBCCCCC
+       AAAAACCCCC      
+       AAAAACCCCC      BBBBB
+       AAAAACCCCC      AAAAA
+       AAAAACCCCC      AAAAABBBBB
+       AAAAACCCCC      CCCCC
+       AAAAACCCCC      BBBBBCCCCC
+       AAAAACCCCC      AAAAACCCCC
+       AAAAACCCCC      AAAAABBBBBCCCCC
+       AAAAABBBBBCCCCC 
+       AAAAABBBBBCCCCC BBBBB
+       AAAAABBBBBCCCCC AAAAA
+       AAAAABBBBBCCCCC AAAAABBBBB
+       AAAAABBBBBCCCCC CCCCC
+       AAAAABBBBBCCCCC BBBBBCCCCC
+       AAAAABBBBBCCCCC AAAAACCCCC
+       AAAAABBBBBCCCCC AAAAABBBBBCCCCC
+BBBBB          
+BBBBB          BBBBB
+BBBBB          AAAAA
+BBBBB          AAAAABBBBB
+BBBBB          CCCCC
+BBBBB          BBBBBCCCCC
+BBBBB          AAAAACCCCC
+BBBBB          AAAAABBBBBCCCCC
+BBBBB  BBBBB   
+BBBBB  BBBBB   BBBBB
+BBBBB  BBBBB   AAAAA
+BBBBB  BBBBB   AAAAABBBBB
+BBBBB  BBBBB   CCCCC
+BBBBB  BBBBB   BBBBBCCCCC
+BBBBB  BBBBB   AAAAACCCCC
+BBBBB  BBBBB   AAAAABBBBBCCCCC
+BBBBB  AAAAA   
+BBBBB  AAAAA   BBBBB
+BBBBB  AAAAA   AAAAA
+BBBBB  AAAAA   AAAAABBBBB
+BBBBB  AAAAA   CCCCC
+BBBBB  AAAAA   BBBBBCCCCC
+BBBBB  AAAAA   AAAAACCCCC
+BBBBB  AAAAA   AAAAABBBBBCCCCC
+BBBBB  AAAAABBBBB      
+BBBBB  AAAAABBBBB      BBBBB
+BBBBB  AAAAABBBBB      AAAAA
+BBBBB  AAAAABBBBB      AAAAABBBBB
+BBBBB  AAAAABBBBB      CCCCC
+BBBBB  AAAAABBBBB      BBBBBCCCCC
+BBBBB  AAAAABBBBB      AAAAACCCCC
+BBBBB  AAAAABBBBB      AAAAABBBBBCCCCC
+BBBBB  CCCCC   
+BBBBB  CCCCC   BBBBB
+BBBBB  CCCCC   AAAAA
+BBBBB  CCCCC   AAAAABBBBB
+BBBBB  CCCCC   CCCCC
+BBBBB  CCCCC   BBBBBCCCCC
+BBBBB  CCCCC   AAAAACCCCC
+BBBBB  CCCCC   AAAAABBBBBCCCCC
+BBBBB  BBBBBCCCCC      
+BBBBB  BBBBBCCCCC      BBBBB
+BBBBB  BBBBBCCCCC      AAAAA
+BBBBB  BBBBBCCCCC      AAAAABBBBB
+BBBBB  BBBBBCCCCC      CCCCC
+BBBBB  BBBBBCCCCC      BBBBBCCCCC
+BBBBB  BBBBBCCCCC      AAAAACCCCC
+BBBBB  BBBBBCCCCC      AAAAABBBBBCCCCC
+BBBBB  AAAAACCCCC      
+BBBBB  AAAAACCCCC      BBBBB
+BBBBB  AAAAACCCCC      AAAAA
+BBBBB  AAAAACCCCC      AAAAABBBBB
+BBBBB  AAAAACCCCC      CCCCC
+BBBBB  AAAAACCCCC      BBBBBCCCCC
+BBBBB  AAAAACCCCC      AAAAACCCCC
+BBBBB  AAAAACCCCC      AAAAABBBBBCCCCC
+BBBBB  AAAAABBBBBCCCCC 
+BBBBB  AAAAABBBBBCCCCC BBBBB
+BBBBB  AAAAABBBBBCCCCC AAAAA
+BBBBB  AAAAABBBBBCCCCC AAAAABBBBB
+BBBBB  AAAAABBBBBCCCCC CCCCC
+BBBBB  AAAAABBBBBCCCCC BBBBBCCCCC
+BBBBB  AAAAABBBBBCCCCC AAAAACCCCC
+BBBBB  AAAAABBBBBCCCCC AAAAABBBBBCCCCC
+AAAAA          
+AAAAA          BBBBB
+AAAAA          AAAAA
+AAAAA          AAAAABBBBB
+AAAAA          CCCCC
+AAAAA          BBBBBCCCCC
+AAAAA          AAAAACCCCC
+AAAAA          AAAAABBBBBCCCCC
+AAAAA  BBBBB   
+AAAAA  BBBBB   BBBBB
+AAAAA  BBBBB   AAAAA
+AAAAA  BBBBB   AAAAABBBBB
+AAAAA  BBBBB   CCCCC
+AAAAA  BBBBB   BBBBBCCCCC
+AAAAA  BBBBB   AAAAACCCCC
+AAAAA  BBBBB   AAAAABBBBBCCCCC
+AAAAA  AAAAA   
+AAAAA  AAAAA   BBBBB
+AAAAA  AAAAA   AAAAA
+AAAAA  AAAAA   AAAAABBBBB
+AAAAA  AAAAA   CCCCC
+AAAAA  AAAAA   BBBBBCCCCC
+AAAAA  AAAAA   AAAAACCCCC
+AAAAA  AAAAA   AAAAABBBBBCCCCC
+AAAAA  AAAAABBBBB      
+AAAAA  AAAAABBBBB      BBBBB
+AAAAA  AAAAABBBBB      AAAAA
+AAAAA  AAAAABBBBB      AAAAABBBBB
+AAAAA  AAAAABBBBB      CCCCC
+AAAAA  AAAAABBBBB      BBBBBCCCCC
+AAAAA  AAAAABBBBB      AAAAACCCCC
+AAAAA  AAAAABBBBB      AAAAABBBBBCCCCC
+AAAAA  CCCCC   
+AAAAA  CCCCC   BBBBB
+AAAAA  CCCCC   AAAAA
+AAAAA  CCCCC   AAAAABBBBB
+AAAAA  CCCCC   CCCCC
+AAAAA  CCCCC   BBBBBCCCCC
+AAAAA  CCCCC   AAAAACCCCC
+AAAAA  CCCCC   AAAAABBBBBCCCCC
+AAAAA  BBBBBCCCCC      
+AAAAA  BBBBBCCCCC      BBBBB
+AAAAA  BBBBBCCCCC      AAAAA
+AAAAA  BBBBBCCCCC      AAAAABBBBB
+AAAAA  BBBBBCCCCC      CCCCC
+AAAAA  BBBBBCCCCC      BBBBBCCCCC
+AAAAA  BBBBBCCCCC      AAAAACCCCC
+AAAAA  BBBBBCCCCC      AAAAABBBBBCCCCC
+AAAAA  AAAAACCCCC      
+AAAAA  AAAAACCCCC      BBBBB
+AAAAA  AAAAACCCCC      AAAAA
+AAAAA  AAAAACCCCC      AAAAABBBBB
+AAAAA  AAAAACCCCC      CCCCC
+AAAAA  AAAAACCCCC      BBBBBCCCCC
+AAAAA  AAAAACCCCC      AAAAACCCCC
+AAAAA  AAAAACCCCC      AAAAABBBBBCCCCC
+AAAAA  AAAAABBBBBCCCCC 
+AAAAA  AAAAABBBBBCCCCC BBBBB
+AAAAA  AAAAABBBBBCCCCC AAAAA
+AAAAA  AAAAABBBBBCCCCC AAAAABBBBB
+AAAAA  AAAAABBBBBCCCCC CCCCC
+AAAAA  AAAAABBBBBCCCCC BBBBBCCCCC
+AAAAA  AAAAABBBBBCCCCC AAAAACCCCC
+AAAAA  AAAAABBBBBCCCCC AAAAABBBBBCCCCC
+AAAAABBBBB             
+AAAAABBBBB             BBBBB
+AAAAABBBBB             AAAAA
+AAAAABBBBB             AAAAABBBBB
+AAAAABBBBB             CCCCC
+AAAAABBBBB             BBBBBCCCCC
+AAAAABBBBB             AAAAACCCCC
+AAAAABBBBB             AAAAABBBBBCCCCC
+AAAAABBBBB     BBBBB   
+AAAAABBBBB     BBBBB   BBBBB
+AAAAABBBBB     BBBBB   AAAAA
+AAAAABBBBB     BBBBB   AAAAABBBBB
+AAAAABBBBB     BBBBB   CCCCC
+AAAAABBBBB     BBBBB   BBBBBCCCCC
+AAAAABBBBB     BBBBB   AAAAACCCCC
+AAAAABBBBB     BBBBB   AAAAABBBBBCCCCC
+AAAAABBBBB     AAAAA   
+AAAAABBBBB     AAAAA   BBBBB
+AAAAABBBBB     AAAAA   AAAAA
+AAAAABBBBB     AAAAA   AAAAABBBBB
+AAAAABBBBB     AAAAA   CCCCC
+AAAAABBBBB     AAAAA   BBBBBCCCCC
+AAAAABBBBB     AAAAA   AAAAACCCCC
+AAAAABBBBB     AAAAA   AAAAABBBBBCCCCC
+AAAAABBBBB     AAAAABBBBB      
+AAAAABBBBB     AAAAABBBBB      BBBBB
+AAAAABBBBB     AAAAABBBBB      AAAAA
+AAAAABBBBB     AAAAABBBBB      AAAAABBBBB
+AAAAABBBBB     AAAAABBBBB      CCCCC
+AAAAABBBBB     AAAAABBBBB      BBBBBCCCCC
+AAAAABBBBB     AAAAABBBBB      AAAAACCCCC
+AAAAABBBBB     AAAAABBBBB      AAAAABBBBBCCCCC
+AAAAABBBBB     CCCCC   
+AAAAABBBBB     CCCCC   BBBBB
+AAAAABBBBB     CCCCC   AAAAA
+AAAAABBBBB     CCCCC   AAAAABBBBB
+AAAAABBBBB     CCCCC   CCCCC
+AAAAABBBBB     CCCCC   BBBBBCCCCC
+AAAAABBBBB     CCCCC   AAAAACCCCC
+AAAAABBBBB     CCCCC   AAAAABBBBBCCCCC
+AAAAABBBBB     BBBBBCCCCC      
+AAAAABBBBB     BBBBBCCCCC      BBBBB
+AAAAABBBBB     BBBBBCCCCC      AAAAA
+AAAAABBBBB     BBBBBCCCCC      AAAAABBBBB
+AAAAABBBBB     BBBBBCCCCC      CCCCC
+AAAAABBBBB     BBBBBCCCCC      BBBBBCCCCC
+AAAAABBBBB     BBBBBCCCCC      AAAAACCCCC
+AAAAABBBBB     BBBBBCCCCC      AAAAABBBBBCCCCC
+AAAAABBBBB     AAAAACCCCC      
+AAAAABBBBB     AAAAACCCCC      BBBBB
+AAAAABBBBB     AAAAACCCCC      AAAAA
+AAAAABBBBB     AAAAACCCCC      AAAAABBBBB
+AAAAABBBBB     AAAAACCCCC      CCCCC
+AAAAABBBBB     AAAAACCCCC      BBBBBCCCCC
+AAAAABBBBB     AAAAACCCCC      AAAAACCCCC
+AAAAABBBBB     AAAAACCCCC      AAAAABBBBBCCCCC
+AAAAABBBBB     AAAAABBBBBCCCCC 
+AAAAABBBBB     AAAAABBBBBCCCCC BBBBB
+AAAAABBBBB     AAAAABBBBBCCCCC AAAAA
+AAAAABBBBB     AAAAABBBBBCCCCC AAAAABBBBB
+AAAAABBBBB     AAAAABBBBBCCCCC CCCCC
+AAAAABBBBB     AAAAABBBBBCCCCC BBBBBCCCCC
+AAAAABBBBB     AAAAABBBBBCCCCC AAAAACCCCC
+AAAAABBBBB     AAAAABBBBBCCCCC AAAAABBBBBCCCCC
+CCCCC          
+CCCCC          BBBBB
+CCCCC          AAAAA
+CCCCC          AAAAABBBBB
+CCCCC          CCCCC
+CCCCC          BBBBBCCCCC
+CCCCC          AAAAACCCCC
+CCCCC          AAAAABBBBBCCCCC
+CCCCC  BBBBB   
+CCCCC  BBBBB   BBBBB
+CCCCC  BBBBB   AAAAA
+CCCCC  BBBBB   AAAAABBBBB
+CCCCC  BBBBB   CCCCC
+CCCCC  BBBBB   BBBBBCCCCC
+CCCCC  BBBBB   AAAAACCCCC
+CCCCC  BBBBB   AAAAABBBBBCCCCC
+CCCCC  AAAAA   
+CCCCC  AAAAA   BBBBB
+CCCCC  AAAAA   AAAAA
+CCCCC  AAAAA   AAAAABBBBB
+CCCCC  AAAAA   CCCCC
+CCCCC  AAAAA   BBBBBCCCCC
+CCCCC  AAAAA   AAAAACCCCC
+CCCCC  AAAAA   AAAAABBBBBCCCCC
+CCCCC  AAAAABBBBB      
+CCCCC  AAAAABBBBB      BBBBB
+CCCCC  AAAAABBBBB      AAAAA
+CCCCC  AAAAABBBBB      AAAAABBBBB
+CCCCC  AAAAABBBBB      CCCCC
+CCCCC  AAAAABBBBB      BBBBBCCCCC
+CCCCC  AAAAABBBBB      AAAAACCCCC
+CCCCC  AAAAABBBBB      AAAAABBBBBCCCCC
+CCCCC  CCCCC   
+CCCCC  CCCCC   BBBBB
+CCCCC  CCCCC   AAAAA
+CCCCC  CCCCC   AAAAABBBBB
+CCCCC  CCCCC   CCCCC
+CCCCC  CCCCC   BBBBBCCCCC
+CCCCC  CCCCC   AAAAACCCCC
+CCCCC  CCCCC   AAAAABBBBBCCCCC
+CCCCC  BBBBBCCCCC      
+CCCCC  BBBBBCCCCC      BBBBB
+CCCCC  BBBBBCCCCC      AAAAA
+CCCCC  BBBBBCCCCC      AAAAABBBBB
+CCCCC  BBBBBCCCCC      CCCCC
+CCCCC  BBBBBCCCCC      BBBBBCCCCC
+CCCCC  BBBBBCCCCC      AAAAACCCCC
+CCCCC  BBBBBCCCCC      AAAAABBBBBCCCCC
+CCCCC  AAAAACCCCC      
+CCCCC  AAAAACCCCC      BBBBB
+CCCCC  AAAAACCCCC      AAAAA
+CCCCC  AAAAACCCCC      AAAAABBBBB
+CCCCC  AAAAACCCCC      CCCCC
+CCCCC  AAAAACCCCC      BBBBBCCCCC
+CCCCC  AAAAACCCCC      AAAAACCCCC
+CCCCC  AAAAACCCCC      AAAAABBBBBCCCCC
+CCCCC  AAAAABBBBBCCCCC 
+CCCCC  AAAAABBBBBCCCCC BBBBB
+CCCCC  AAAAABBBBBCCCCC AAAAA
+CCCCC  AAAAABBBBBCCCCC AAAAABBBBB
+CCCCC  AAAAABBBBBCCCCC CCCCC
+CCCCC  AAAAABBBBBCCCCC BBBBBCCCCC
+CCCCC  AAAAABBBBBCCCCC AAAAACCCCC
+CCCCC  AAAAABBBBBCCCCC AAAAABBBBBCCCCC
+BBBBBCCCCC             
+BBBBBCCCCC             BBBBB
+BBBBBCCCCC             AAAAA
+BBBBBCCCCC             AAAAABBBBB
+BBBBBCCCCC             CCCCC
+BBBBBCCCCC             BBBBBCCCCC
+BBBBBCCCCC             AAAAACCCCC
+BBBBBCCCCC             AAAAABBBBBCCCCC
+BBBBBCCCCC     BBBBB   
+BBBBBCCCCC     BBBBB   BBBBB
+BBBBBCCCCC     BBBBB   AAAAA
+BBBBBCCCCC     BBBBB   AAAAABBBBB
+BBBBBCCCCC     BBBBB   CCCCC
+BBBBBCCCCC     BBBBB   BBBBBCCCCC
+BBBBBCCCCC     BBBBB   AAAAACCCCC
+BBBBBCCCCC     BBBBB   AAAAABBBBBCCCCC
+BBBBBCCCCC     AAAAA   
+BBBBBCCCCC     AAAAA   BBBBB
+BBBBBCCCCC     AAAAA   AAAAA
+BBBBBCCCCC     AAAAA   AAAAABBBBB
+BBBBBCCCCC     AAAAA   CCCCC
+BBBBBCCCCC     AAAAA   BBBBBCCCCC
+BBBBBCCCCC     AAAAA   AAAAACCCCC
+BBBBBCCCCC     AAAAA   AAAAABBBBBCCCCC
+BBBBBCCCCC     AAAAABBBBB      
+BBBBBCCCCC     AAAAABBBBB      BBBBB
+BBBBBCCCCC     AAAAABBBBB      AAAAA
+BBBBBCCCCC     AAAAABBBBB      AAAAABBBBB
+BBBBBCCCCC     AAAAABBBBB      CCCCC
+BBBBBCCCCC     AAAAABBBBB      BBBBBCCCCC
+BBBBBCCCCC     AAAAABBBBB      AAAAACCCCC
+BBBBBCCCCC     AAAAABBBBB      AAAAABBBBBCCCCC
+BBBBBCCCCC     CCCCC   
+BBBBBCCCCC     CCCCC   BBBBB
+BBBBBCCCCC     CCCCC   AAAAA
+BBBBBCCCCC     CCCCC   AAAAABBBBB
+BBBBBCCCCC     CCCCC   CCCCC
+BBBBBCCCCC     CCCCC   BBBBBCCCCC
+BBBBBCCCCC     CCCCC   AAAAACCCCC
+BBBBBCCCCC     CCCCC   AAAAABBBBBCCCCC
+BBBBBCCCCC     BBBBBCCCCC      
+BBBBBCCCCC     BBBBBCCCCC      BBBBB
+BBBBBCCCCC     BBBBBCCCCC      AAAAA
+BBBBBCCCCC     BBBBBCCCCC      AAAAABBBBB
+BBBBBCCCCC     BBBBBCCCCC      CCCCC
+BBBBBCCCCC     BBBBBCCCCC      BBBBBCCCCC
+BBBBBCCCCC     BBBBBCCCCC      AAAAACCCCC
+BBBBBCCCCC     BBBBBCCCCC      AAAAABBBBBCCCCC
+BBBBBCCCCC     AAAAACCCCC      
+BBBBBCCCCC     AAAAACCCCC      BBBBB
+BBBBBCCCCC     AAAAACCCCC      AAAAA
+BBBBBCCCCC     AAAAACCCCC      AAAAABBBBB
+BBBBBCCCCC     AAAAACCCCC      CCCCC
+BBBBBCCCCC     AAAAACCCCC      BBBBBCCCCC
+BBBBBCCCCC     AAAAACCCCC      AAAAACCCCC
+BBBBBCCCCC     AAAAACCCCC      AAAAABBBBBCCCCC
+BBBBBCCCCC     AAAAABBBBBCCCCC 
+BBBBBCCCCC     AAAAABBBBBCCCCC BBBBB
+BBBBBCCCCC     AAAAABBBBBCCCCC AAAAA
+BBBBBCCCCC     AAAAABBBBBCCCCC AAAAABBBBB
+BBBBBCCCCC     AAAAABBBBBCCCCC CCCCC
+BBBBBCCCCC     AAAAABBBBBCCCCC BBBBBCCCCC
+BBBBBCCCCC     AAAAABBBBBCCCCC AAAAACCCCC
+BBBBBCCCCC     AAAAABBBBBCCCCC AAAAABBBBBCCCCC
+AAAAACCCCC             
+AAAAACCCCC             BBBBB
+AAAAACCCCC             AAAAA
+AAAAACCCCC             AAAAABBBBB
+AAAAACCCCC             CCCCC
+AAAAACCCCC             BBBBBCCCCC
+AAAAACCCCC             AAAAACCCCC
+AAAAACCCCC             AAAAABBBBBCCCCC
+AAAAACCCCC     BBBBB   
+AAAAACCCCC     BBBBB   BBBBB
+AAAAACCCCC     BBBBB   AAAAA
+AAAAACCCCC     BBBBB   AAAAABBBBB
+AAAAACCCCC     BBBBB   CCCCC
+AAAAACCCCC     BBBBB   BBBBBCCCCC
+AAAAACCCCC     BBBBB   AAAAACCCCC
+AAAAACCCCC     BBBBB   AAAAABBBBBCCCCC
+AAAAACCCCC     AAAAA   
+AAAAACCCCC     AAAAA   BBBBB
+AAAAACCCCC     AAAAA   AAAAA
+AAAAACCCCC     AAAAA   AAAAABBBBB
+AAAAACCCCC     AAAAA   CCCCC
+AAAAACCCCC     AAAAA   BBBBBCCCCC
+AAAAACCCCC     AAAAA   AAAAACCCCC
+AAAAACCCCC     AAAAA   AAAAABBBBBCCCCC
+AAAAACCCCC     AAAAABBBBB      
+AAAAACCCCC     AAAAABBBBB      BBBBB
+AAAAACCCCC     AAAAABBBBB      AAAAA
+AAAAACCCCC     AAAAABBBBB      AAAAABBBBB
+AAAAACCCCC     AAAAABBBBB      CCCCC
+AAAAACCCCC     AAAAABBBBB      BBBBBCCCCC
+AAAAACCCCC     AAAAABBBBB      AAAAACCCCC
+AAAAACCCCC     AAAAABBBBB      AAAAABBBBBCCCCC
+AAAAACCCCC     CCCCC   
+AAAAACCCCC     CCCCC   BBBBB
+AAAAACCCCC     CCCCC   AAAAA
+AAAAACCCCC     CCCCC   AAAAABBBBB
+AAAAACCCCC     CCCCC   CCCCC
+AAAAACCCCC     CCCCC   BBBBBCCCCC
+AAAAACCCCC     CCCCC   AAAAACCCCC
+AAAAACCCCC     CCCCC   AAAAABBBBBCCCCC
+AAAAACCCCC     BBBBBCCCCC      
+AAAAACCCCC     BBBBBCCCCC      BBBBB
+AAAAACCCCC     BBBBBCCCCC      AAAAA
+AAAAACCCCC     BBBBBCCCCC      AAAAABBBBB
+AAAAACCCCC     BBBBBCCCCC      CCCCC
+AAAAACCCCC     BBBBBCCCCC      BBBBBCCCCC
+AAAAACCCCC     BBBBBCCCCC      AAAAACCCCC
+AAAAACCCCC     BBBBBCCCCC      AAAAABBBBBCCCCC
+AAAAACCCCC     AAAAACCCCC      
+AAAAACCCCC     AAAAACCCCC      BBBBB
+AAAAACCCCC     AAAAACCCCC      AAAAA
+AAAAACCCCC     AAAAACCCCC      AAAAABBBBB
+AAAAACCCCC     AAAAACCCCC      CCCCC
+AAAAACCCCC     AAAAACCCCC      BBBBBCCCCC
+AAAAACCCCC     AAAAACCCCC      AAAAACCCCC
+AAAAACCCCC     AAAAACCCCC      AAAAABBBBBCCCCC
+AAAAACCCCC     AAAAABBBBBCCCCC 
+AAAAACCCCC     AAAAABBBBBCCCCC BBBBB
+AAAAACCCCC     AAAAABBBBBCCCCC AAAAA
+AAAAACCCCC     AAAAABBBBBCCCCC AAAAABBBBB
+AAAAACCCCC     AAAAABBBBBCCCCC CCCCC
+AAAAACCCCC     AAAAABBBBBCCCCC BBBBBCCCCC
+AAAAACCCCC     AAAAABBBBBCCCCC AAAAACCCCC
+AAAAACCCCC     AAAAABBBBBCCCCC AAAAABBBBBCCCCC
+AAAAABBBBBCCCCC                
+AAAAABBBBBCCCCC                BBBBB
+AAAAABBBBBCCCCC                AAAAA
+AAAAABBBBBCCCCC                AAAAABBBBB
+AAAAABBBBBCCCCC                CCCCC
+AAAAABBBBBCCCCC                BBBBBCCCCC
+AAAAABBBBBCCCCC                AAAAACCCCC
+AAAAABBBBBCCCCC                AAAAABBBBBCCCCC
+AAAAABBBBBCCCCC        BBBBB   
+AAAAABBBBBCCCCC        BBBBB   BBBBB
+AAAAABBBBBCCCCC        BBBBB   AAAAA
+AAAAABBBBBCCCCC        BBBBB   AAAAABBBBB
+AAAAABBBBBCCCCC        BBBBB   CCCCC
+AAAAABBBBBCCCCC        BBBBB   BBBBBCCCCC
+AAAAABBBBBCCCCC        BBBBB   AAAAACCCCC
+AAAAABBBBBCCCCC        BBBBB   AAAAABBBBBCCCCC
+AAAAABBBBBCCCCC        AAAAA   
+AAAAABBBBBCCCCC        AAAAA   BBBBB
+AAAAABBBBBCCCCC        AAAAA   AAAAA
+AAAAABBBBBCCCCC        AAAAA   AAAAABBBBB
+AAAAABBBBBCCCCC        AAAAA   CCCCC
+AAAAABBBBBCCCCC        AAAAA   BBBBBCCCCC
+AAAAABBBBBCCCCC        AAAAA   AAAAACCCCC
+AAAAABBBBBCCCCC        AAAAA   AAAAABBBBBCCCCC
+AAAAABBBBBCCCCC        AAAAABBBBB      
+AAAAABBBBBCCCCC        AAAAABBBBB      BBBBB
+AAAAABBBBBCCCCC        AAAAABBBBB      AAAAA
+AAAAABBBBBCCCCC        AAAAABBBBB      AAAAABBBBB
+AAAAABBBBBCCCCC        AAAAABBBBB      CCCCC
+AAAAABBBBBCCCCC        AAAAABBBBB      BBBBBCCCCC
+AAAAABBBBBCCCCC        AAAAABBBBB      AAAAACCCCC
+AAAAABBBBBCCCCC        AAAAABBBBB      AAAAABBBBBCCCCC
+AAAAABBBBBCCCCC        CCCCC   
+AAAAABBBBBCCCCC        CCCCC   BBBBB
+AAAAABBBBBCCCCC        CCCCC   AAAAA
+AAAAABBBBBCCCCC        CCCCC   AAAAABBBBB
+AAAAABBBBBCCCCC        CCCCC   CCCCC
+AAAAABBBBBCCCCC        CCCCC   BBBBBCCCCC
+AAAAABBBBBCCCCC        CCCCC   AAAAACCCCC
+AAAAABBBBBCCCCC        CCCCC   AAAAABBBBBCCCCC
+AAAAABBBBBCCCCC        BBBBBCCCCC      
+AAAAABBBBBCCCCC        BBBBBCCCCC      BBBBB
+AAAAABBBBBCCCCC        BBBBBCCCCC      AAAAA
+AAAAABBBBBCCCCC        BBBBBCCCCC      AAAAABBBBB
+AAAAABBBBBCCCCC        BBBBBCCCCC      CCCCC
+AAAAABBBBBCCCCC        BBBBBCCCCC      BBBBBCCCCC
+AAAAABBBBBCCCCC        BBBBBCCCCC      AAAAACCCCC
+AAAAABBBBBCCCCC        BBBBBCCCCC      AAAAABBBBBCCCCC
+AAAAABBBBBCCCCC        AAAAACCCCC      
+AAAAABBBBBCCCCC        AAAAACCCCC      BBBBB
+AAAAABBBBBCCCCC        AAAAACCCCC      AAAAA
+AAAAABBBBBCCCCC        AAAAACCCCC      AAAAABBBBB
+AAAAABBBBBCCCCC        AAAAACCCCC      CCCCC
+AAAAABBBBBCCCCC        AAAAACCCCC      BBBBBCCCCC
+AAAAABBBBBCCCCC        AAAAACCCCC      AAAAACCCCC
+AAAAABBBBBCCCCC        AAAAACCCCC      AAAAABBBBBCCCCC
+AAAAABBBBBCCCCC        AAAAABBBBBCCCCC 
+AAAAABBBBBCCCCC        AAAAABBBBBCCCCC BBBBB
+AAAAABBBBBCCCCC        AAAAABBBBBCCCCC AAAAA
+AAAAABBBBBCCCCC        AAAAABBBBBCCCCC AAAAABBBBB
+AAAAABBBBBCCCCC        AAAAABBBBBCCCCC CCCCC
+AAAAABBBBBCCCCC        AAAAABBBBBCCCCC BBBBBCCCCC
+AAAAABBBBBCCCCC        AAAAABBBBBCCCCC AAAAACCCCC
+AAAAABBBBBCCCCC        AAAAABBBBBCCCCC AAAAABBBBBCCCCC
index 300978b..3459c85 100644 (file)
@@ -66,3 +66,15 @@ ludia_funcs.norm_cache_limitは、pgs2normが確保するキャッシュの上
  pgs2snippet1   (null) (1 row)\r
 =# SET ludia_funcs.escape_snippet_keyword TO on;       "=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '""""2-gram""""', 'pg_bigmは、PostgreSQLで""2-gram""の全文検索を使えるようにするツールです。');"               pgs2snippet1\r
 " ostgreSQLで★""2-gram""★の全文検"    (1 row) "?キーワード内の先頭と末尾の""は必ずメタ文字(検索文字列の区切り文字)として解釈されます。"\r
+東京都山田太郎  東京都山田太郎   東京都山田太郎\r
+東京都 山田太郎 東京都 山田太郎  東京都 山田太郎\r
+東京都山田 太郎 東京都山田 太郎  東京都山田 太郎\r
+東京都 山田 太郎        東京都 山田 太郎 東京都 山田 太郎\r
+東京都\     山田太郎    東京都\      山田太郎    東京都\      山田太郎\r
+東京都山田 太郎       東京都山田 太郎        東京都山田 太郎\r
+東京都  山田太郎        東京都  山田太郎 東京都  山田太郎\r
+東京都      東京都       東京都\r
+山田 山田  山田\r
+ポ    ポ     ポ\r
+A      A       A\r
+東京と京都        東京と京都 東京と京都\r
index ebf673c..ae1a78a 100644 (file)
@@ -14,23 +14,27 @@ CREATE TABLE char_tbl (col1 char(256), col2 char(256), col3 char(256));
 \copy char_tbl from data/test_tbl.txt
 CREATE INDEX char_tbl_idx ON char_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
                                                                    pgs2norm(col2) gin_bigm_ops,
-                                                                   pgs2norm(col3) gin_bigm_ops);
+                                                                   pgs2norm(col3) gin_bigm_ops)
+                                                                   WITH (FASTUPDATE = off);
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM char_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
+    ORDER BY col1;
      pgs2snippet1      
 -----------------------
  ロハAbCd12③★Ⅳ㈱★');
 (1 row)
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM char_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
+    ORDER BY col1;
  pgs2snippet1  
 ---------------
  ★ 20★13.04.05
 (1 row)
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM char_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
+    ORDER BY col1;
       pgs2snippet1      
 ------------------------
  ト★アプリケーション★側
@@ -42,23 +46,27 @@ CREATE TABLE varchar_tbl (col1 varchar(256), col2 varchar(256), col3 varchar(256
 \copy varchar_tbl from data/test_tbl.txt
 CREATE INDEX varchar_tbl_idx ON varchar_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
                                                                            pgs2norm(col2) gin_bigm_ops,
-                                                                           pgs2norm(col3) gin_bigm_ops);
+                                                                           pgs2norm(col3) gin_bigm_ops)
+                                                                           WITH (FASTUPDATE = off);
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM varchar_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
+    ORDER BY col1;
      pgs2snippet1      
 -----------------------
  ロハAbCd12③★Ⅳ㈱★');
 (1 row)
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM varchar_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
+    ORDER BY col1;
  pgs2snippet1  
 ---------------
  ★ 20★13.04.05
 (1 row)
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM varchar_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
+    ORDER BY col1;
       pgs2snippet1      
 ------------------------
  ト★アプリケーション★側
@@ -70,23 +78,27 @@ CREATE TABLE text_tbl (col1 text, col2 text, col3 text);
 \copy text_tbl from data/test_tbl.txt
 CREATE INDEX text_tbl_idx ON text_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
                                                                   pgs2norm(col2) gin_bigm_ops,
-                                                                  pgs2norm(col3) gin_bigm_ops);
+                                                                  pgs2norm(col3) gin_bigm_ops)
+                                                                  WITH (FASTUPDATE = off);
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
+    ORDER BY col1;
      pgs2snippet1      
 -----------------------
  ロハAbCd12③★Ⅳ㈱★');
 (1 row)
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
+    ORDER BY col1;
  pgs2snippet1  
 ---------------
  ★ 20★13.04.05
 (1 row)
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
+    ORDER BY col1;
       pgs2snippet1      
 ------------------------
  ト★アプリケーション★側
@@ -144,7 +156,7 @@ SELECT count(*) FROM text_tbl WHERE
     pgs2norm(col2) LIKE likequery(pgs2norm('  '));
  count 
 -------
-     8
+     9
 (1 row)
 
 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
@@ -171,7 +183,7 @@ SELECT count(*) FROM text_tbl WHERE
     pgs2norm(col3) LIKE likequery(pgs2norm('  '));
  count 
 -------
-     9
+    10
 (1 row)
 
 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
@@ -244,26 +256,31 @@ UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
 UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
 UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
+    ORDER BY col1;
      pgs2snippet1      
 -----------------------
  ロハAbCd12③★Ⅳ㈱★');
 (1 row)
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
+    ORDER BY col1;
  pgs2snippet1  
 ---------------
  ★ 20★13.04.05
 (1 row)
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
+    ORDER BY col1;
       pgs2snippet1      
 ------------------------
  ト★アプリケーション★側
 (1 row)
 
+-- The text search for updated or deleted records must return no results
+-- even when recheck is skipped on the text search.
 EXPLAIN (costs off) UPDATE text_tbl SET col1 =
     (select string_agg(chr(num), '') from generate_series(ascii('㋐'), ascii('㋾')) num)
     WHERE pgs2norm(col1) LIKE likequery(pgs2norm('㊀'));
@@ -305,6 +322,707 @@ SELECT count(*) FROM text_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('⑬'
      0
 (1 row)
 
+-- Test whether both seq scan and bitmap scan return the same results
+SET enable_seqscan to on;
+SET enable_bitmapscan to off;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
+    ORDER BY col1;
+     replace     
+-----------------
+ 東京都*山田太郎
+ 東京都山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'))
+    ORDER BY col1;
+     replace     
+-----------------
+ 東京都 山田太郎
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都 山田 太郎
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
+    ORDER BY col1;
+     replace     
+-----------------
+ 東京都*山田太郎
+ 東京都山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田 太郎'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都山田 太郎
+ 東京都山田 太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都*山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(4 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都 山田'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都 山田 太郎
+ 東京都 山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都 山田 太郎
+ 東京都 山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都 山田 太郎
+ 東京都 山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('  山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都  山田太郎
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都  '))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都  山田太郎
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京と京都
+ 東京都
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(9 rows)
+
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
+ count 
+-------
+    48
+(1 row)
+
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
+ count 
+-------
+    48
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 山田
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(8 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山 '))
+    ORDER BY col1;
+ replace 
+---------
+(0 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+ replace 
+---------
+ ポ
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+ replace 
+---------
+ ポ
+(1 row)
+
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('A'));
+ count 
+-------
+    30
+(1 row)
+
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('a'));
+ count 
+-------
+    30
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('AA'))
+    ORDER BY col1;
+ replace 
+---------
+(0 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(8 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(7 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(7 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('田'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(7 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    OR pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+     replace      
+------------------
+ ポ
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(8 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
+    ORDER BY col1;
+                          QUERY PLAN                          
+--------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Seq Scan on text_tbl
+         Filter: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
+(4 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
+    ORDER BY col1;
+                           QUERY PLAN                           
+----------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Seq Scan on text_tbl
+         Filter: (pgs2norm(col1) ~~ '%東京都 山田 太郎%'::text)
+(4 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
+    ORDER BY col1;
+                          QUERY PLAN                          
+--------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Seq Scan on text_tbl
+         Filter: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
+(4 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
+    ORDER BY col1;
+                      QUERY PLAN                       
+-------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Seq Scan on text_tbl
+         Filter: (pgs2norm(col1) ~~ '%都 山田%'::text)
+(4 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('  山'))
+    ORDER BY col1;
+                     QUERY PLAN                     
+----------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Seq Scan on text_tbl
+         Filter: (pgs2norm(col1) ~~ '%  山%'::text)
+(4 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
+    ORDER BY col1;
+                    QUERY PLAN                    
+--------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Seq Scan on text_tbl
+         Filter: (pgs2norm(col1) ~~ '%都%'::text)
+(4 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '))
+    ORDER BY col1;
+                   QUERY PLAN                    
+-------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Seq Scan on text_tbl
+         Filter: (pgs2norm(col1) ~~ '% %'::text)
+(4 rows)
+
+SET enable_seqscan to off;
+SET enable_bitmapscan to on;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
+    ORDER BY col1;
+     replace     
+-----------------
+ 東京都*山田太郎
+ 東京都山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'))
+    ORDER BY col1;
+     replace     
+-----------------
+ 東京都 山田太郎
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都 山田 太郎
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
+    ORDER BY col1;
+     replace     
+-----------------
+ 東京都*山田太郎
+ 東京都山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田 太郎'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都山田 太郎
+ 東京都山田 太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都*山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(4 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都 山田'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都 山田 太郎
+ 東京都 山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都 山田 太郎
+ 東京都 山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都 山田 太郎
+ 東京都 山田太郎
+(2 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('  山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都  山田太郎
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都  '))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都  山田太郎
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京と京都
+ 東京都
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(9 rows)
+
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
+ count 
+-------
+    48
+(1 row)
+
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
+ count 
+-------
+    48
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 山田
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(8 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山 '))
+    ORDER BY col1;
+ replace 
+---------
+(0 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+ replace 
+---------
+ ポ
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+ replace 
+---------
+ ポ
+(1 row)
+
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('A'));
+ count 
+-------
+    30
+(1 row)
+
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('a'));
+ count 
+-------
+    30
+(1 row)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('AA'))
+    ORDER BY col1;
+ replace 
+---------
+(0 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(8 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(7 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(7 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('田'))
+    ORDER BY col1;
+     replace      
+------------------
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(7 rows)
+
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    OR pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+     replace      
+------------------
+ ポ
+ 東京都*山田太郎
+ 東京都  山田太郎
+ 東京都 山田 太郎
+ 東京都 山田太郎
+ 東京都山田 太郎
+ 東京都山田 太郎
+ 東京都山田太郎
+(8 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
+    ORDER BY col1;
+                               QUERY PLAN                               
+------------------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Bitmap Heap Scan on text_tbl
+         Recheck Cond: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
+         ->  Bitmap Index Scan on text_tbl_idx
+               Index Cond: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
+(6 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
+    ORDER BY col1;
+                                QUERY PLAN                                
+--------------------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Bitmap Heap Scan on text_tbl
+         Recheck Cond: (pgs2norm(col1) ~~ '%東京都 山田 太郎%'::text)
+         ->  Bitmap Index Scan on text_tbl_idx
+               Index Cond: (pgs2norm(col1) ~~ '%東京都 山田 太郎%'::text)
+(6 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
+    ORDER BY col1;
+                               QUERY PLAN                               
+------------------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Bitmap Heap Scan on text_tbl
+         Recheck Cond: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
+         ->  Bitmap Index Scan on text_tbl_idx
+               Index Cond: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
+(6 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
+    ORDER BY col1;
+                           QUERY PLAN                            
+-----------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Bitmap Heap Scan on text_tbl
+         Recheck Cond: (pgs2norm(col1) ~~ '%都 山田%'::text)
+         ->  Bitmap Index Scan on text_tbl_idx
+               Index Cond: (pgs2norm(col1) ~~ '%都 山田%'::text)
+(6 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('  山'))
+    ORDER BY col1;
+                          QUERY PLAN                          
+--------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Bitmap Heap Scan on text_tbl
+         Recheck Cond: (pgs2norm(col1) ~~ '%  山%'::text)
+         ->  Bitmap Index Scan on text_tbl_idx
+               Index Cond: (pgs2norm(col1) ~~ '%  山%'::text)
+(6 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
+    ORDER BY col1;
+                         QUERY PLAN                         
+------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Bitmap Heap Scan on text_tbl
+         Recheck Cond: (pgs2norm(col1) ~~ '%都%'::text)
+         ->  Bitmap Index Scan on text_tbl_idx
+               Index Cond: (pgs2norm(col1) ~~ '%都%'::text)
+(6 rows)
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '))
+    ORDER BY col1;
+                        QUERY PLAN                         
+-----------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Bitmap Heap Scan on text_tbl
+         Recheck Cond: (pgs2norm(col1) ~~ '% %'::text)
+         ->  Bitmap Index Scan on text_tbl_idx
+               Index Cond: (pgs2norm(col1) ~~ '% %'::text)
+(6 rows)
+
 -- Test the case where a multi-column index is created on many columns
 CREATE TABLE mc31_tbl (col1 text, col2 char(256), col3 varchar(256), col4 text,
     col5 char(256), col6 varchar(256), col7 text, col8 char(256),
@@ -329,179 +1047,208 @@ CREATE INDEX mc31_tbl_idx ON mc31_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
     pgs2norm(col24) gin_bigm_ops, pgs2norm(col25) gin_bigm_ops,
     pgs2norm(col26) gin_bigm_ops, pgs2norm(col27) gin_bigm_ops,
     pgs2norm(col28) gin_bigm_ops, pgs2norm(col29) gin_bigm_ops,
-    pgs2norm(col30) gin_bigm_ops, pgs2norm(col31) gin_bigm_ops);
+    pgs2norm(col30) gin_bigm_ops, pgs2norm(col31) gin_bigm_ops)
+    WITH (FASTUPDATE = off);
 \copy mc31_tbl from 'data/test_tbl_31.txt'
-SELECT col1 FROM mc31_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('_S'));
+SELECT col1 FROM mc31_tbl
+    WHERE pgs2norm(col1) like likequery(pgs2norm('_S'))
+    ORDER BY col1;
                      col1                     
 ----------------------------------------------
  =# SHOW ludia_funcs.escape_snippet_keyword ;
 (1 row)
 
-EXPLAIN (costs off ) SELECT col1 FROM mc31_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('_S'));
-                       QUERY PLAN                       
---------------------------------------------------------
- Bitmap Heap Scan on mc31_tbl
-   Recheck Cond: (pgs2norm(col1) ~~ '%\\_s%'::text)
-   ->  Bitmap Index Scan on mc31_tbl_idx
-         Index Cond: (pgs2norm(col1) ~~ '%\\_s%'::text)
-(4 rows)
+EXPLAIN (costs off ) SELECT col1 FROM mc31_tbl
+    WHERE pgs2norm(col1) like likequery(pgs2norm('_S'))
+    ORDER BY col1;
+                          QUERY PLAN                          
+--------------------------------------------------------------
+ Sort
+   Sort Key: col1
+   ->  Bitmap Heap Scan on mc31_tbl
+         Recheck Cond: (pgs2norm(col1) ~~ '%\\_s%'::text)
+         ->  Bitmap Index Scan on mc31_tbl_idx
+               Index Cond: (pgs2norm(col1) ~~ '%\\_s%'::text)
+(6 rows)
 
-select col15 from mc31_tbl where pgs2norm(col15) like likequery(pgs2norm('テ゛ィ'));
+SELECT col15 FROM mc31_tbl
+    WHERE pgs2norm(col15) LIKE likequery(pgs2norm('テ゛ィ'))
+    ORDER BY col15;
                                                                     col15                                                                     
 ----------------------------------------------------------------------------------------------------------------------------------------------
  •--prefix : インストール先ディレクトリを指定します。未指定時のインストール先は/usr/local/pgsqlです。このオプション指定は必須ではありません。
 (1 row)
 
-EXPLAIN (costs off ) select col15 from mc31_tbl where pgs2norm(col15) like likequery(pgs2norm('テ゛ィ'));
-                           QUERY PLAN                            
------------------------------------------------------------------
- Bitmap Heap Scan on mc31_tbl
-   Recheck Cond: (pgs2norm((col15)::text) ~~ '%ディ%'::text)
-   ->  Bitmap Index Scan on mc31_tbl_idx
-         Index Cond: (pgs2norm((col15)::text) ~~ '%ディ%'::text)
-(4 rows)
+EXPLAIN (costs off ) SELECT col15 FROM mc31_tbl
+    WHERE pgs2norm(col15) LIKE likequery(pgs2norm('テ゛ィ'))
+    ORDER BY col15;
+                              QUERY PLAN                               
+-----------------------------------------------------------------------
+ Sort
+   Sort Key: col15
+   ->  Bitmap Heap Scan on mc31_tbl
+         Recheck Cond: (pgs2norm((col15)::text) ~~ '%ディ%'::text)
+         ->  Bitmap Index Scan on mc31_tbl_idx
+               Index Cond: (pgs2norm((col15)::text) ~~ '%ディ%'::text)
+(6 rows)
 
-select col31 from mc31_tbl where pgs2norm(col31) like likequery(pgs2norm('㊔'));
+SELECT col31 FROM mc31_tbl
+    WHERE pgs2norm(col31) LIKE likequery(pgs2norm('㊔'))
+    ORDER BY col31;
            col31            
 ----------------------------
  $ psql -d <データベース名>
 (1 row)
 
-EXPLAIN (costs off) select col31 from mc31_tbl where pgs2norm(col31) like likequery(pgs2norm('㊔'));
-                      QUERY PLAN                       
--------------------------------------------------------
- Bitmap Heap Scan on mc31_tbl
-   Recheck Cond: (pgs2norm(col31) ~~ '%名%'::text)
-   ->  Bitmap Index Scan on mc31_tbl_idx
-         Index Cond: (pgs2norm(col31) ~~ '%名%'::text)
-(4 rows)
-
--- Test the case where data has a special character like "\t"
-CREATE TABLE snp_tbl (col1 text);
-CREATE INDEX snp_tbl_idx ON snp_tbl USING gin (pgs2norm(col1) gin_bigm_ops);
-INSERT INTO snp_tbl VALUES ('東京都山田太郎');
-INSERT INTO snp_tbl VALUES ('東京都 山田太郎');
-INSERT INTO snp_tbl VALUES ('東京都山田 太郎');
-INSERT INTO snp_tbl VALUES ('東京都 山田 太郎');
-INSERT INTO snp_tbl VALUES (E'東京都\t山田太郎');
--- Test whether both seq and bitmap scans return the same results
-SET enable_seqscan to on;
-SET enable_bitmapscan to off;
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'));
-       col1       
-------------------
- 東京都山田太郎
- 東京都  山田太郎
-(2 rows)
+EXPLAIN (costs off) SELECT col31 FROM mc31_tbl
+    WHERE pgs2norm(col31) LIKE likequery(pgs2norm('㊔'))
+    ORDER BY col31;
+                         QUERY PLAN                          
+-------------------------------------------------------------
+ Sort
+   Sort Key: col31
+   ->  Bitmap Heap Scan on mc31_tbl
+         Recheck Cond: (pgs2norm(col31) ~~ '%名%'::text)
+         ->  Bitmap Index Scan on mc31_tbl_idx
+               Index Cond: (pgs2norm(col31) ~~ '%名%'::text)
+(6 rows)
 
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'));
-      col1       
------------------
- 東京都 山田太郎
+-- Test the cases where various text search patterns are used.
+CREATE TABLE abc_tbl (col1 text, col2 text, col3 text);
+\copy abc_tbl from data/abc_data.tsv
+CREATE INDEX abc_idx ON abc_tbl USING gin (pgs2norm(col1) gin_bigm_ops, pgs2norm(col2) gin_bigm_ops, pgs2norm(col3) gin_bigm_ops);
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   169
 (1 row)
 
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'));
-       col1       
-------------------
- 東京都 山田 太郎
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   485
 (1 row)
 
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'));
-       col1       
-------------------
- 東京都山田太郎
- 東京都  山田太郎
-(2 rows)
-
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'));
-                       QUERY PLAN                       
---------------------------------------------------------
- Seq Scan on snp_tbl
-   Filter: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
-(2 rows)
-
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'));
-                       QUERY PLAN                        
----------------------------------------------------------
- Seq Scan on snp_tbl
-   Filter: (pgs2norm(col1) ~~ '%東京都 山田太郎%'::text)
-(2 rows)
-
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'));
-                        QUERY PLAN                        
-----------------------------------------------------------
- Seq Scan on snp_tbl
-   Filter: (pgs2norm(col1) ~~ '%東京都 山田 太郎%'::text)
-(2 rows)
-
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'));
-                       QUERY PLAN                       
---------------------------------------------------------
- Seq Scan on snp_tbl
-   Filter: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
-(2 rows)
-
-SET enable_seqscan to off;
-SET enable_bitmapscan to on;
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'));
-       col1       
-------------------
- 東京都山田太郎
- 東京都  山田太郎
-(2 rows)
-
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'));
-      col1       
------------------
- 東京都 山田太郎
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   169
 (1 row)
 
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'));
-       col1       
-------------------
- 東京都 山田 太郎
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   387
 (1 row)
 
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'));
-       col1       
-------------------
- 東京都山田太郎
- 東京都  山田太郎
-(2 rows)
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   511
+(1 row)
 
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'));
-                            QUERY PLAN                            
-------------------------------------------------------------------
- Bitmap Heap Scan on snp_tbl
-   Recheck Cond: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
-   ->  Bitmap Index Scan on snp_tbl_idx
-         Index Cond: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
-(4 rows)
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   387
+(1 row)
 
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'));
-                            QUERY PLAN                             
--------------------------------------------------------------------
- Bitmap Heap Scan on snp_tbl
-   Recheck Cond: (pgs2norm(col1) ~~ '%東京都 山田太郎%'::text)
-   ->  Bitmap Index Scan on snp_tbl_idx
-         Index Cond: (pgs2norm(col1) ~~ '%東京都 山田太郎%'::text)
-(4 rows)
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   169
+(1 row)
 
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'));
-                             QUERY PLAN                             
---------------------------------------------------------------------
- Bitmap Heap Scan on snp_tbl
-   Recheck Cond: (pgs2norm(col1) ~~ '%東京都 山田 太郎%'::text)
-   ->  Bitmap Index Scan on snp_tbl_idx
-         Index Cond: (pgs2norm(col1) ~~ '%東京都 山田 太郎%'::text)
-(4 rows)
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   485
+(1 row)
 
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'));
-                            QUERY PLAN                            
-------------------------------------------------------------------
- Bitmap Heap Scan on snp_tbl
-   Recheck Cond: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
-   ->  Bitmap Index Scan on snp_tbl_idx
-         Index Cond: (pgs2norm(col1) ~~ '%東京都山田太郎%'::text)
-(4 rows)
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+ count 
+-------
+   169
+(1 row)
 
index c01295d..89e28d5 100644 (file)
@@ -17,14 +17,18 @@ CREATE TABLE char_tbl (col1 char(256), col2 char(256), col3 char(256));
 \copy char_tbl from data/test_tbl.txt
 CREATE INDEX char_tbl_idx ON char_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
                                                                    pgs2norm(col2) gin_bigm_ops,
-                                                                   pgs2norm(col3) gin_bigm_ops);
+                                                                   pgs2norm(col3) gin_bigm_ops)
+                                                                   WITH (FASTUPDATE = off);
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM char_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
+    ORDER BY col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM char_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
+    ORDER BY col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM char_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
+    ORDER BY col1;
 
 -- Test the case where the columns with VARCHAR data type were indexed
 -- with pg_bigm and pgs2norm function.
@@ -32,14 +36,18 @@ CREATE TABLE varchar_tbl (col1 varchar(256), col2 varchar(256), col3 varchar(256
 \copy varchar_tbl from data/test_tbl.txt
 CREATE INDEX varchar_tbl_idx ON varchar_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
                                                                            pgs2norm(col2) gin_bigm_ops,
-                                                                           pgs2norm(col3) gin_bigm_ops);
+                                                                           pgs2norm(col3) gin_bigm_ops)
+                                                                           WITH (FASTUPDATE = off);
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM varchar_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
+    ORDER BY col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM varchar_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
+    ORDER BY col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM varchar_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
+    ORDER BY col1;
 
 -- Test the case where the columns with TEXT data type were indexed
 -- with pg_bigm and pgs2norm function.
@@ -47,14 +55,18 @@ CREATE TABLE text_tbl (col1 text, col2 text, col3 text);
 \copy text_tbl from data/test_tbl.txt
 CREATE INDEX text_tbl_idx ON text_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
                                                                   pgs2norm(col2) gin_bigm_ops,
-                                                                  pgs2norm(col3) gin_bigm_ops);
+                                                                  pgs2norm(col3) gin_bigm_ops)
+                                                                  WITH (FASTUPDATE = off);
 
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
+    ORDER BY col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
+    ORDER BY col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
+    ORDER BY col1;
 
 -- Test the case where condition has "AND".
 SELECT count(*) FROM text_tbl WHERE
@@ -115,12 +127,17 @@ UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
 UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
 UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
+    ORDER BY col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
+    ORDER BY col1;
 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM text_tbl
-    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'));
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
+    ORDER BY col1;
 
+-- The text search for updated or deleted records must return no results
+-- even when recheck is skipped on the text search.
 EXPLAIN (costs off) UPDATE text_tbl SET col1 =
     (select string_agg(chr(num), '') from generate_series(ascii('㋐'), ascii('㋾')) num)
     WHERE pgs2norm(col1) LIKE likequery(pgs2norm('㊀'));
@@ -132,6 +149,217 @@ EXPLAIN (costs off) DELETE FROM text_tbl WHERE pgs2norm(col1) like likequery(pgs
 DELETE FROM text_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('⑬'));
 SELECT count(*) FROM text_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('⑬'));
 
+-- Test whether both seq scan and bitmap scan return the same results
+SET enable_seqscan to on;
+SET enable_bitmapscan to off;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田 太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都 山田'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('  山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都  '))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
+    ORDER BY col1;
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山 '))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('A'));
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('a'));
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('AA'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('田'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    OR pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('  山'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '))
+    ORDER BY col1;
+
+SET enable_seqscan to off;
+SET enable_bitmapscan to on;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田 太郎'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都 山田'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('  山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都  '))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
+    ORDER BY col1;
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山 '))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('A'));
+SELECT count(*) FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('a'));
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('AA'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('田'))
+    ORDER BY col1;
+SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
+    AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
+    OR pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
+    ORDER BY col1;
+
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm('  山'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
+    ORDER BY col1;
+EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
+    WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '))
+    ORDER BY col1;
+
 -- Test the case where a multi-column index is created on many columns
 CREATE TABLE mc31_tbl (col1 text, col2 char(256), col3 varchar(256), col4 text,
     col5 char(256), col6 varchar(256), col7 text, col8 char(256),
@@ -156,46 +384,123 @@ CREATE INDEX mc31_tbl_idx ON mc31_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
     pgs2norm(col24) gin_bigm_ops, pgs2norm(col25) gin_bigm_ops,
     pgs2norm(col26) gin_bigm_ops, pgs2norm(col27) gin_bigm_ops,
     pgs2norm(col28) gin_bigm_ops, pgs2norm(col29) gin_bigm_ops,
-    pgs2norm(col30) gin_bigm_ops, pgs2norm(col31) gin_bigm_ops);
+    pgs2norm(col30) gin_bigm_ops, pgs2norm(col31) gin_bigm_ops)
+    WITH (FASTUPDATE = off);
 \copy mc31_tbl from 'data/test_tbl_31.txt'
 
-SELECT col1 FROM mc31_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('_S'));
-EXPLAIN (costs off ) SELECT col1 FROM mc31_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('_S'));
-
-select col15 from mc31_tbl where pgs2norm(col15) like likequery(pgs2norm('テ゛ィ'));
-EXPLAIN (costs off ) select col15 from mc31_tbl where pgs2norm(col15) like likequery(pgs2norm('テ゛ィ'));
+SELECT col1 FROM mc31_tbl
+    WHERE pgs2norm(col1) like likequery(pgs2norm('_S'))
+    ORDER BY col1;
+EXPLAIN (costs off ) SELECT col1 FROM mc31_tbl
+    WHERE pgs2norm(col1) like likequery(pgs2norm('_S'))
+    ORDER BY col1;
 
-select col31 from mc31_tbl where pgs2norm(col31) like likequery(pgs2norm('㊔'));
-EXPLAIN (costs off) select col31 from mc31_tbl where pgs2norm(col31) like likequery(pgs2norm('㊔'));
+SELECT col15 FROM mc31_tbl
+    WHERE pgs2norm(col15) LIKE likequery(pgs2norm('テ゛ィ'))
+    ORDER BY col15;
+EXPLAIN (costs off ) SELECT col15 FROM mc31_tbl
+    WHERE pgs2norm(col15) LIKE likequery(pgs2norm('テ゛ィ'))
+    ORDER BY col15;
 
--- Test the case where data has a special character like "\t"
-CREATE TABLE snp_tbl (col1 text);
-CREATE INDEX snp_tbl_idx ON snp_tbl USING gin (pgs2norm(col1) gin_bigm_ops);
-INSERT INTO snp_tbl VALUES ('東京都山田太郎');
-INSERT INTO snp_tbl VALUES ('東京都 山田太郎');
-INSERT INTO snp_tbl VALUES ('東京都山田 太郎');
-INSERT INTO snp_tbl VALUES ('東京都 山田 太郎');
-INSERT INTO snp_tbl VALUES (E'東京都\t山田太郎');
+SELECT col31 FROM mc31_tbl
+    WHERE pgs2norm(col31) LIKE likequery(pgs2norm('㊔'))
+    ORDER BY col31;
+EXPLAIN (costs off) SELECT col31 FROM mc31_tbl
+    WHERE pgs2norm(col31) LIKE likequery(pgs2norm('㊔'))
+    ORDER BY col31;
 
--- Test whether both seq and bitmap scans return the same results
-SET enable_seqscan to on;
-SET enable_bitmapscan to off;
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'));
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'));
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'));
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'));
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'));
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'));
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'));
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'));
+-- Test the cases where various text search patterns are used.
+CREATE TABLE abc_tbl (col1 text, col2 text, col3 text);
+\copy abc_tbl from data/abc_data.tsv
+CREATE INDEX abc_idx ON abc_tbl USING gin (pgs2norm(col1) gin_bigm_ops, pgs2norm(col2) gin_bigm_ops, pgs2norm(col3) gin_bigm_ops);
 
-SET enable_seqscan to off;
-SET enable_bitmapscan to on;
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'));
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'));
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'));
-SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'));
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'));
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'));
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'));
-EXPLAIN (costs off) SELECT * FROM snp_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
+    pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
+SELECT count(*) FROM abc_tbl WHERE
+    ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
+    ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
+    NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));