--- /dev/null
+
+ 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
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
\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
------------------------
ト★アプリケーション★側
\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
------------------------
ト★アプリケーション★側
\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
------------------------
ト★アプリケーション★側
pgs2norm(col2) LIKE likequery(pgs2norm(' '));
count
-------
- 8
+ 9
(1 row)
EXPLAIN (costs off) 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
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('㊀'));
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),
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)
\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.
\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.
\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
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('㊀'));
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),
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')));