3 -- Load pg_bigm and ludia_funcs
4 CREATE EXTENSION pg_bigm;
5 CREATE EXTENSION ludia_funcs;
7 -- Set parameters for the tests
8 SET client_min_messages TO LOG;
9 SET standard_conforming_strings TO off;
10 SET escape_string_warning TO off;
12 SET maintenance_work_mem TO '512MB';
13 SET enable_seqscan TO off;
14 SET enable_bitmapscan TO on;
16 -- Test the case where the columns with CHAR data type were indexed
17 -- with pg_bigm and pgs2norm function.
18 CREATE TABLE char_tbl (col1 char(256), col2 char(256), col3 char(256));
19 \copy char_tbl from data/test_tbl.txt
20 CREATE INDEX char_tbl_idx ON char_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
21 pgs2norm(col2) gin_bigm_ops,
22 pgs2norm(col3) gin_bigm_ops)
23 WITH (FASTUPDATE = off);
25 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM char_tbl
26 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
28 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM char_tbl
29 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
31 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM char_tbl
32 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
35 -- Test the case where the columns with VARCHAR data type were indexed
36 -- with pg_bigm and pgs2norm function.
37 CREATE TABLE varchar_tbl (col1 varchar(256), col2 varchar(256), col3 varchar(256));
38 \copy varchar_tbl from data/test_tbl.txt
39 CREATE INDEX varchar_tbl_idx ON varchar_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
40 pgs2norm(col2) gin_bigm_ops,
41 pgs2norm(col3) gin_bigm_ops)
42 WITH (FASTUPDATE = off);
44 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM varchar_tbl
45 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
47 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM varchar_tbl
48 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
50 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM varchar_tbl
51 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
54 -- Test the case where the columns with TEXT data type were indexed
55 -- with pg_bigm and pgs2norm function.
56 CREATE TABLE text_tbl (col1 text, col2 text, col3 text);
57 \copy text_tbl from data/test_tbl.txt
58 CREATE INDEX text_tbl_idx ON text_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
59 pgs2norm(col2) gin_bigm_ops,
60 pgs2norm(col3) gin_bigm_ops)
61 WITH (FASTUPDATE = off);
63 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM text_tbl
64 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
66 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM text_tbl
67 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
69 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM text_tbl
70 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
73 -- Test the case where condition has "AND".
74 SELECT count(*) FROM text_tbl WHERE
75 pgs2norm(col1) LIKE likequery(pgs2norm('解釈')) AND
76 pgs2norm(col1) LIKE likequery(pgs2norm('実装')) AND
77 pgs2norm(col1) LIKE likequery(pgs2norm('場合'));
78 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
79 pgs2norm(col1) LIKE likequery(pgs2norm('解釈')) AND
80 pgs2norm(col1) LIKE likequery(pgs2norm('実装')) AND
81 pgs2norm(col1) LIKE likequery(pgs2norm('場合'));
82 SELECT count(*) FROM text_tbl WHERE
83 pgs2norm(col1) LIKE likequery(pgs2norm('解釈')) AND
84 pgs2norm(col2) LIKE likequery(pgs2norm('ユーサ゛')) AND
85 pgs2norm(col3) LIKE likequery(pgs2norm('SqL'));
86 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
87 pgs2norm(col1) LIKE likequery(pgs2norm('解釈')) AND
88 pgs2norm(col2) LIKE likequery(pgs2norm('ユーサ゛')) AND
89 pgs2norm(col3) LIKE likequery(pgs2norm('SqL'));
91 -- Test the case where condition has "OR".
92 SELECT count(*) FROM text_tbl WHERE
93 pgs2norm(col2) LIKE likequery(pgs2norm('ハ゜ラメータ')) OR
94 pgs2norm(col2) LIKE likequery(pgs2norm('㉜')) OR
95 pgs2norm(col2) LIKE likequery(pgs2norm(' '));
96 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
97 pgs2norm(col2) LIKE likequery(pgs2norm('ハ゜ラメータ')) OR
98 pgs2norm(col2) LIKE likequery(pgs2norm('㉜')) OR
99 pgs2norm(col2) LIKE likequery(pgs2norm(' '));
100 SELECT count(*) FROM text_tbl WHERE
101 pgs2norm(col1) LIKE likequery(pgs2norm('ハ゜ラメータ')) OR
102 pgs2norm(col2) LIKE likequery(pgs2norm('㉜')) OR
103 pgs2norm(col3) LIKE likequery(pgs2norm(' '));
104 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
105 pgs2norm(col1) LIKE likequery(pgs2norm('ハ゜ラメータ')) OR
106 pgs2norm(col2) LIKE likequery(pgs2norm('㉜')) OR
107 pgs2norm(col3) LIKE likequery(pgs2norm(' '));
109 -- Test the case where condition has "NOT".
110 SELECT count(*) FROM text_tbl WHERE
111 pgs2norm(col3) LIKE likequery(pgs2norm('ludia')) AND
112 NOT pgs2norm(col3) LIKE likequery(pgs2norm('㊐')) AND
113 NOT pgs2norm(col3) LIKE likequery(pgs2norm('Ⓟ'));
114 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
115 pgs2norm(col3) LIKE likequery(pgs2norm('ludia')) AND
116 NOT pgs2norm(col3) LIKE likequery(pgs2norm('㊐')) AND
117 NOT pgs2norm(col3) LIKE likequery(pgs2norm('Ⓟ'));
118 SELECT count(*) FROM text_tbl WHERE
119 pgs2norm(col2) LIKE likequery(pgs2norm('ludia')) AND
120 NOT pgs2norm(col3) LIKE likequery(pgs2norm('㊐')) AND
121 NOT pgs2norm(col1) LIKE likequery(pgs2norm('Ⓟ'));
122 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
123 pgs2norm(col2) LIKE likequery(pgs2norm('ludia')) AND
124 NOT pgs2norm(col3) LIKE likequery(pgs2norm('㊐')) AND
125 NOT pgs2norm(col1) LIKE likequery(pgs2norm('Ⓟ'));
127 -- Test for text search with many conditions
128 SELECT count(*) FROM text_tbl WHERE
129 (pgs2norm(col1) LIKE likequery(pgs2norm('文字')) AND
130 pgs2norm(col1) LIKE likequery(pgs2norm('無効')) AND
131 pgs2norm(col1) NOT LIKE likequery(pgs2norm('設定'))) OR
132 (pgs2norm(col2) LIKE likequery(pgs2norm('文字')) AND
133 pgs2norm(col2) LIKE likequery(pgs2norm('無効')) AND
134 pgs2norm(col2) NOT LIKE likequery(pgs2norm('設定'))) OR
135 (pgs2norm(col3) LIKE likequery(pgs2norm('文字')) AND
136 pgs2norm(col3) LIKE likequery(pgs2norm('無効')) AND
137 pgs2norm(col3) NOT LIKE likequery(pgs2norm('設定')));
138 EXPLAIN (costs off) SELECT count(*) FROM text_tbl WHERE
139 (pgs2norm(col1) LIKE likequery(pgs2norm('文字')) AND
140 pgs2norm(col1) LIKE likequery(pgs2norm('無効')) AND
141 pgs2norm(col1) NOT LIKE likequery(pgs2norm('設定'))) OR
142 (pgs2norm(col2) LIKE likequery(pgs2norm('文字')) AND
143 pgs2norm(col2) LIKE likequery(pgs2norm('無効')) AND
144 pgs2norm(col2) NOT LIKE likequery(pgs2norm('設定'))) OR
145 (pgs2norm(col3) LIKE likequery(pgs2norm('文字')) AND
146 pgs2norm(col3) LIKE likequery(pgs2norm('無効')) AND
147 pgs2norm(col3) NOT LIKE likequery(pgs2norm('設定')));
149 -- Test for UPDATE and DELETE
150 UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
151 UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
152 UPDATE text_tbl SET col1 = col2, col2 = col3, col3 = col1;
153 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'v(株)', col1) FROM text_tbl
154 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('v(株)'))
156 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '②⓪', col1) FROM text_tbl
157 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('②⓪'))
159 SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'アプリケーション', col1) FROM text_tbl
160 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アプリケーション'))
163 -- The text search for updated or deleted records must return no results
164 -- even when recheck is skipped on the text search.
165 EXPLAIN (costs off) UPDATE text_tbl SET col1 =
166 (select string_agg(chr(num), '') from generate_series(ascii('㋐'), ascii('㋾')) num)
167 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('㊀'));
168 UPDATE text_tbl SET col1 =
169 (select string_agg(chr(num), '') from generate_series(ascii('㋐'), ascii('㋾')) num)
170 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('㊀'));
171 SELECT count(*) FROM text_tbl WHERE pgs2norm(col1) LIKE likequery(pgs2norm('㊀'));
172 EXPLAIN (costs off) DELETE FROM text_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('⑬'));
173 DELETE FROM text_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('⑬'));
174 SELECT count(*) FROM text_tbl WHERE pgs2norm(col1) like likequery(pgs2norm('⑬'));
176 -- Test whether both seq scan and bitmap scan return the same results
177 SET enable_seqscan to on;
178 SET enable_bitmapscan to off;
179 SELECT replace(col1, E'\t', '*') FROM text_tbl
180 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
182 SELECT replace(col1, E'\t', '*') FROM text_tbl
183 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'))
185 SELECT replace(col1, E'\t', '*') FROM text_tbl
186 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
188 SELECT replace(col1, E'\t', '*') FROM text_tbl
189 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
191 SELECT replace(col1, E'\t', '*') FROM text_tbl
192 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田 太郎'))
194 SELECT replace(col1, E'\t', '*') FROM text_tbl
195 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都山'))
197 SELECT replace(col1, E'\t', '*') FROM text_tbl
198 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都 山田'))
200 SELECT replace(col1, E'\t', '*') FROM text_tbl
201 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
203 SELECT replace(col1, E'\t', '*') FROM text_tbl
204 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山'))
206 SELECT replace(col1, E'\t', '*') FROM text_tbl
207 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山'))
209 SELECT replace(col1, E'\t', '*') FROM text_tbl
210 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都 '))
212 SELECT replace(col1, E'\t', '*') FROM text_tbl
213 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
215 SELECT count(*) FROM text_tbl
216 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
217 SELECT count(*) FROM text_tbl
218 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
219 SELECT replace(col1, E'\t', '*') FROM text_tbl
220 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
222 SELECT replace(col1, E'\t', '*') FROM text_tbl
223 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山 '))
225 SELECT replace(col1, E'\t', '*') FROM text_tbl
226 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
228 SELECT replace(col1, E'\t', '*') FROM text_tbl
229 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
231 SELECT count(*) FROM text_tbl
232 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('A'));
233 SELECT count(*) FROM text_tbl
234 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('a'));
235 SELECT replace(col1, E'\t', '*') FROM text_tbl
236 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('AA'))
238 SELECT replace(col1, E'\t', '*') FROM text_tbl
239 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
241 SELECT replace(col1, E'\t', '*') FROM text_tbl
242 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
243 AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
245 SELECT replace(col1, E'\t', '*') FROM text_tbl
246 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
247 AND pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
249 SELECT replace(col1, E'\t', '*') FROM text_tbl
250 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
251 AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
252 AND pgs2norm(col1) LIKE likequery(pgs2norm('田'))
254 SELECT replace(col1, E'\t', '*') FROM text_tbl
255 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
256 AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
257 OR pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
260 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
261 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
263 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
264 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
266 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
267 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
269 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
270 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
272 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
273 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山'))
275 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
276 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
278 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
279 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '))
282 SET enable_seqscan to off;
283 SET enable_bitmapscan to on;
284 SELECT replace(col1, E'\t', '*') FROM text_tbl
285 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
287 SELECT replace(col1, E'\t', '*') FROM text_tbl
288 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田太郎'))
290 SELECT replace(col1, E'\t', '*') FROM text_tbl
291 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
293 SELECT replace(col1, E'\t', '*') FROM text_tbl
294 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
296 SELECT replace(col1, E'\t', '*') FROM text_tbl
297 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田 太郎'))
299 SELECT replace(col1, E'\t', '*') FROM text_tbl
300 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都山'))
302 SELECT replace(col1, E'\t', '*') FROM text_tbl
303 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都 山田'))
305 SELECT replace(col1, E'\t', '*') FROM text_tbl
306 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
308 SELECT replace(col1, E'\t', '*') FROM text_tbl
309 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山'))
311 SELECT replace(col1, E'\t', '*') FROM text_tbl
312 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山'))
314 SELECT replace(col1, E'\t', '*') FROM text_tbl
315 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都 '))
317 SELECT replace(col1, E'\t', '*') FROM text_tbl
318 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
320 SELECT count(*) FROM text_tbl
321 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
322 SELECT count(*) FROM text_tbl
323 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '));
324 SELECT replace(col1, E'\t', '*') FROM text_tbl
325 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
327 SELECT replace(col1, E'\t', '*') FROM text_tbl
328 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山 '))
330 SELECT replace(col1, E'\t', '*') FROM text_tbl
331 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
333 SELECT replace(col1, E'\t', '*') FROM text_tbl
334 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
336 SELECT count(*) FROM text_tbl
337 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('A'));
338 SELECT count(*) FROM text_tbl
339 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('a'));
340 SELECT replace(col1, E'\t', '*') FROM text_tbl
341 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('AA'))
343 SELECT replace(col1, E'\t', '*') FROM text_tbl
344 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
346 SELECT replace(col1, E'\t', '*') FROM text_tbl
347 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
348 AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
350 SELECT replace(col1, E'\t', '*') FROM text_tbl
351 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
352 AND pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
354 SELECT replace(col1, E'\t', '*') FROM text_tbl
355 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
356 AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
357 AND pgs2norm(col1) LIKE likequery(pgs2norm('田'))
359 SELECT replace(col1, E'\t', '*') FROM text_tbl
360 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
361 AND pgs2norm(col1) LIKE likequery(pgs2norm('山'))
362 OR pgs2norm(col1) LIKE likequery(pgs2norm('ポ'))
365 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
366 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都山田太郎'))
368 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
369 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都 山田 太郎'))
371 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
372 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'東京都\t山田太郎'))
374 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
375 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('都 山田'))
377 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
378 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' 山'))
380 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
381 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(E'都\t'))
383 EXPLAIN (costs off) SELECT replace(col1, E'\t', '*') FROM text_tbl
384 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(' '))
387 -- Test whether recheck is skipped expectedly when keyword length is 1 or 2.
388 -- We can judge that recheck is skipped successfully if the debug messages
389 -- indicating the calls to pgs2norm() and pgs2malloc() are logged only once
390 -- respectively. So this test must run with enable_debug enabled.
391 -- Note that enable_debug must be set to 'terse' in order to stabilize the
392 -- result of this regression test. Otherwise, i.e., when enable_debug is set to
393 -- 'on', the contents dealt in function pgs2malloc() and pgs2norm() are logged,
394 -- and the order of those debug messages varies depending on the block size
395 -- in PostgreSQL server. Those detailed information are not necessary to
396 -- judge whether the recheck is skipped or not.
397 SET ludia_funcs.enable_debug TO terse;
398 SELECT col1 FROM text_tbl
399 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都')) ORDER BY col1;
400 SELECT col1 FROM text_tbl
401 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京都')) ORDER BY col1;
402 SELECT col1 FROM text_tbl
403 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('京')) ORDER BY col1;
404 SELECT pgs2snippet1(1, 50, 1, '*', '*', 0, '東', col1) FROM text_tbl
405 WHERE pgs2norm(col2) LIKE likequery(pgs2norm('東')) ORDER BY col1;
406 SELECT col1 FROM text_tbl
407 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山'))
408 AND pgs2norm(col1) LIKE likequery(pgs2norm('京'));
409 SELECT col1 FROM text_tbl
410 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('山田'))
411 AND pgs2norm(col1) LIKE likequery(pgs2norm('京都'));
412 SELECT col1 FROM text_tbl
413 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('東京都'))
414 AND pgs2norm(col1) LIKE likequery(pgs2norm('太'));
415 SET ludia_funcs.enable_debug TO off;
417 -- Test the case where a multi-column index is created on many columns
418 CREATE TABLE mc31_tbl (col1 text, col2 char(256), col3 varchar(256), col4 text,
419 col5 char(256), col6 varchar(256), col7 text, col8 char(256),
420 col9 varchar(256), col10 text, col11 char(256), col12 varchar(256),
421 col13 text, col14 char(256), col15 varchar(256), col16 text,
422 col17 char(256), col18 varchar(256), col19 text, col20 char(256),
423 col21 varchar(256), col22 text, col23 char(256), col24 varchar(256),
424 col25 text, col26 char(256), col27 varchar(256), col28 text,
425 col29 char(256), col30 varchar(256), col31 text);
426 CREATE INDEX mc31_tbl_idx ON mc31_tbl USING gin (pgs2norm(col1) gin_bigm_ops,
427 pgs2norm(col2) gin_bigm_ops, pgs2norm(col3) gin_bigm_ops,
428 pgs2norm(col4) gin_bigm_ops, pgs2norm(col5) gin_bigm_ops,
429 pgs2norm(col6) gin_bigm_ops, pgs2norm(col7) gin_bigm_ops,
430 pgs2norm(col8) gin_bigm_ops, pgs2norm(col9) gin_bigm_ops,
431 pgs2norm(col10) gin_bigm_ops, pgs2norm(col11) gin_bigm_ops,
432 pgs2norm(col12) gin_bigm_ops, pgs2norm(col13) gin_bigm_ops,
433 pgs2norm(col14) gin_bigm_ops, pgs2norm(col15) gin_bigm_ops,
434 pgs2norm(col16) gin_bigm_ops, pgs2norm(col17) gin_bigm_ops,
435 pgs2norm(col18) gin_bigm_ops, pgs2norm(col19) gin_bigm_ops,
436 pgs2norm(col20) gin_bigm_ops, pgs2norm(col21) gin_bigm_ops,
437 pgs2norm(col22) gin_bigm_ops, pgs2norm(col23) gin_bigm_ops,
438 pgs2norm(col24) gin_bigm_ops, pgs2norm(col25) gin_bigm_ops,
439 pgs2norm(col26) gin_bigm_ops, pgs2norm(col27) gin_bigm_ops,
440 pgs2norm(col28) gin_bigm_ops, pgs2norm(col29) gin_bigm_ops,
441 pgs2norm(col30) gin_bigm_ops, pgs2norm(col31) gin_bigm_ops)
442 WITH (FASTUPDATE = off);
443 \copy mc31_tbl from 'data/test_tbl_31.txt'
445 SELECT col1 FROM mc31_tbl
446 WHERE pgs2norm(col1) like likequery(pgs2norm('_S'))
448 EXPLAIN (costs off ) SELECT col1 FROM mc31_tbl
449 WHERE pgs2norm(col1) like likequery(pgs2norm('_S'))
452 SELECT col15 FROM mc31_tbl
453 WHERE pgs2norm(col15) LIKE likequery(pgs2norm('テ゛ィ'))
455 EXPLAIN (costs off ) SELECT col15 FROM mc31_tbl
456 WHERE pgs2norm(col15) LIKE likequery(pgs2norm('テ゛ィ'))
459 SELECT col31 FROM mc31_tbl
460 WHERE pgs2norm(col31) LIKE likequery(pgs2norm('㊔'))
462 EXPLAIN (costs off) SELECT col31 FROM mc31_tbl
463 WHERE pgs2norm(col31) LIKE likequery(pgs2norm('㊔'))
466 -- Test the cases where various text search patterns are used.
467 CREATE TABLE abc_tbl (col1 text, col2 text, col3 text);
468 \copy abc_tbl from data/abc_data.tsv
469 CREATE INDEX abc_idx ON abc_tbl USING gin
470 (pgs2norm(col1) gin_bigm_ops, pgs2norm(col2) gin_bigm_ops, pgs2norm(col3) gin_bigm_ops)
471 WITH (FASTUPDATE = off);
473 SELECT count(*) FROM abc_tbl WHERE
474 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
475 pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
476 pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
477 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
478 pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
479 pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
480 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
481 pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
482 pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
483 SELECT count(*) FROM abc_tbl WHERE
484 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
485 pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
486 pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
487 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
488 pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
489 pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
490 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
491 pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
492 pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
493 SELECT count(*) FROM abc_tbl WHERE
494 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
495 pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
496 NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
497 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
498 pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
499 NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
500 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
501 pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
502 NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
503 SELECT count(*) FROM abc_tbl WHERE
504 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
505 pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
506 pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
507 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
508 pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
509 pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
510 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
511 pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
512 pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
513 SELECT count(*) FROM abc_tbl WHERE
514 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
515 pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
516 pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
517 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
518 pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
519 pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
520 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
521 pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
522 pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
523 SELECT count(*) FROM abc_tbl WHERE
524 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) OR
525 pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
526 NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
527 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) OR
528 pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
529 NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
530 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) OR
531 pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
532 NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
533 SELECT count(*) FROM abc_tbl WHERE
534 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
535 NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
536 pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
537 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
538 NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
539 pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
540 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
541 NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
542 pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
543 SELECT count(*) FROM abc_tbl WHERE
544 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
545 NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) OR
546 pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
547 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
548 NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) OR
549 pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
550 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
551 NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) OR
552 pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
553 SELECT count(*) FROM abc_tbl WHERE
554 ((pgs2norm(col1) LIKE likequery(pgs2norm('AAA')) AND
555 NOT pgs2norm(col1) LIKE likequery(pgs2norm('BBB'))) AND
556 NOT pgs2norm(col1) LIKE likequery(pgs2norm('CCC'))) OR
557 ((pgs2norm(col2) LIKE likequery(pgs2norm('AAA')) AND
558 NOT pgs2norm(col2) LIKE likequery(pgs2norm('BBB'))) AND
559 NOT pgs2norm(col2) LIKE likequery(pgs2norm('CCC'))) OR
560 ((pgs2norm(col3) LIKE likequery(pgs2norm('AAA')) AND
561 NOT pgs2norm(col3) LIKE likequery(pgs2norm('BBB'))) AND
562 NOT pgs2norm(col3) LIKE likequery(pgs2norm('CCC')));
564 -- Test whether pg_bigm and pgs2norm can handle all the UTF8 characters
565 CREATE UNLOGGED TABLE utf8_tbl (code int, col1 text);
566 INSERT INTO utf8_tbl VALUES (-1, NULL);
567 INSERT INTO utf8_tbl VALUES (0, '');
568 INSERT INTO utf8_tbl SELECT code, repeat(chr(code), 3) FROM generate_series(1, 55295) code;
569 INSERT INTO utf8_tbl SELECT code, repeat(chr(code), 3) FROM generate_series(57344, 1114111) code;
570 CREATE INDEX utf8_tbl_idx ON utf8_tbl USING gin (pgs2norm(col1) gin_bigm_ops)
571 WITH (FASTUPDATE = off);
573 -- Test for multi-byte, single-byte, upper-case and lower-case alphabet characters
574 SELECT * FROM utf8_tbl
575 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('aa')) ORDER BY code;
576 SELECT * FROM utf8_tbl
577 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('BB')) ORDER BY code;
578 SELECT * FROM utf8_tbl
579 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('cc')) ORDER BY code;
580 SELECT * FROM utf8_tbl
581 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('DD')) ORDER BY code;
582 EXPLAIN (costs off) SELECT * FROM utf8_tbl
583 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('aa')) ORDER BY code;
584 EXPLAIN (costs off) SELECT * FROM utf8_tbl
585 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('BB')) ORDER BY code;
586 EXPLAIN (costs off) SELECT * FROM utf8_tbl
587 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('cc')) ORDER BY code;
588 EXPLAIN (costs off) SELECT * FROM utf8_tbl
589 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('DD')) ORDER BY code;
591 -- Test for multi-byte, single-byte numbers
592 SELECT * FROM utf8_tbl
593 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('11')) ORDER BY code;
594 SELECT * FROM utf8_tbl
595 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('22')) ORDER BY code;
596 SELECT * FROM utf8_tbl
597 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('③③')) ORDER BY code;
598 EXPLAIN (costs off) SELECT * FROM utf8_tbl
599 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('11')) ORDER BY code;
600 EXPLAIN (costs off) SELECT * FROM utf8_tbl
601 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('22')) ORDER BY code;
602 EXPLAIN (costs off) SELECT * FROM utf8_tbl
603 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('③③')) ORDER BY code;
605 -- Test for Japanese katakana
606 SELECT * FROM utf8_tbl
607 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アア')) ORDER BY code;
608 SELECT * FROM utf8_tbl
609 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('イイ')) ORDER BY code;
610 EXPLAIN (costs off) SELECT * FROM utf8_tbl
611 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('アア')) ORDER BY code;
612 EXPLAIN (costs off) SELECT * FROM utf8_tbl
613 WHERE pgs2norm(col1) LIKE likequery(pgs2norm('イイ')) ORDER BY code;
616 SELECT * FROM utf8_tbl
617 WHERE pgs2norm(col1) LIKE likequery(pgs2norm(NULL)) ORDER BY code;
619 -- Drop utf8_tbl to reduce the impact on subsequent CHECKPOINT