Consistently use "superuser" instead of "super user"
[pgsql.git] / src / test / regress / expected / regex.out
blobae0de7307db738c5446e24fc7106b523aec78bf3
1 --
2 -- Regular expression tests
3 --
4 -- Don't want to have to double backslashes in regexes
5 set standard_conforming_strings = on;
6 -- Test simple quantified backrefs
7 select 'bbbbb' ~ '^([bc])\1*$' as t;
8  t 
9 ---
10  t
11 (1 row)
13 select 'ccc' ~ '^([bc])\1*$' as t;
14  t 
15 ---
16  t
17 (1 row)
19 select 'xxx' ~ '^([bc])\1*$' as f;
20  f 
21 ---
22  f
23 (1 row)
25 select 'bbc' ~ '^([bc])\1*$' as f;
26  f 
27 ---
28  f
29 (1 row)
31 select 'b' ~ '^([bc])\1*$' as t;
32  t 
33 ---
34  t
35 (1 row)
37 -- Test quantified backref within a larger expression
38 select 'abc abc abc' ~ '^(\w+)( \1)+$' as t;
39  t 
40 ---
41  t
42 (1 row)
44 select 'abc abd abc' ~ '^(\w+)( \1)+$' as f;
45  f 
46 ---
47  f
48 (1 row)
50 select 'abc abc abd' ~ '^(\w+)( \1)+$' as f;
51  f 
52 ---
53  f
54 (1 row)
56 select 'abc abc abc' ~ '^(.+)( \1)+$' as t;
57  t 
58 ---
59  t
60 (1 row)
62 select 'abc abd abc' ~ '^(.+)( \1)+$' as f;
63  f 
64 ---
65  f
66 (1 row)
68 select 'abc abc abd' ~ '^(.+)( \1)+$' as f;
69  f 
70 ---
71  f
72 (1 row)
74 -- Test some cases that crashed in 9.2beta1 due to pmatch[] array overrun
75 select substring('asd TO foo' from ' TO (([a-z0-9._]+|"([^"]+|"")+")+)');
76  substring 
77 -----------
78  foo
79 (1 row)
81 select substring('a' from '((a))+');
82  substring 
83 -----------
84  a
85 (1 row)
87 select substring('a' from '((a)+)');
88  substring 
89 -----------
90  a
91 (1 row)
93 -- Test regexp_match()
94 select regexp_match('abc', '');
95  regexp_match 
96 --------------
97  {""}
98 (1 row)
100 select regexp_match('abc', 'bc');
101  regexp_match 
102 --------------
103  {bc}
104 (1 row)
106 select regexp_match('abc', 'd') is null;
107  ?column? 
108 ----------
110 (1 row)
112 select regexp_match('abc', '(B)(c)', 'i');
113  regexp_match 
114 --------------
115  {b,c}
116 (1 row)
118 select regexp_match('abc', 'Bd', 'ig'); -- error
119 ERROR:  regexp_match() does not support the "global" option
120 HINT:  Use the regexp_matches function instead.
121 -- Test lookahead constraints
122 select regexp_matches('ab', 'a(?=b)b*');
123  regexp_matches 
124 ----------------
125  {ab}
126 (1 row)
128 select regexp_matches('a', 'a(?=b)b*');
129  regexp_matches 
130 ----------------
131 (0 rows)
133 select regexp_matches('abc', 'a(?=b)b*(?=c)c*');
134  regexp_matches 
135 ----------------
136  {abc}
137 (1 row)
139 select regexp_matches('ab', 'a(?=b)b*(?=c)c*');
140  regexp_matches 
141 ----------------
142 (0 rows)
144 select regexp_matches('ab', 'a(?!b)b*');
145  regexp_matches 
146 ----------------
147 (0 rows)
149 select regexp_matches('a', 'a(?!b)b*');
150  regexp_matches 
151 ----------------
152  {a}
153 (1 row)
155 select regexp_matches('b', '(?=b)b');
156  regexp_matches 
157 ----------------
158  {b}
159 (1 row)
161 select regexp_matches('a', '(?=b)b');
162  regexp_matches 
163 ----------------
164 (0 rows)
166 -- Test lookbehind constraints
167 select regexp_matches('abb', '(?<=a)b*');
168  regexp_matches 
169 ----------------
170  {bb}
171 (1 row)
173 select regexp_matches('a', 'a(?<=a)b*');
174  regexp_matches 
175 ----------------
176  {a}
177 (1 row)
179 select regexp_matches('abc', 'a(?<=a)b*(?<=b)c*');
180  regexp_matches 
181 ----------------
182  {abc}
183 (1 row)
185 select regexp_matches('ab', 'a(?<=a)b*(?<=b)c*');
186  regexp_matches 
187 ----------------
188  {ab}
189 (1 row)
191 select regexp_matches('ab', 'a*(?<!a)b*');
192  regexp_matches 
193 ----------------
194  {""}
195 (1 row)
197 select regexp_matches('ab', 'a*(?<!a)b+');
198  regexp_matches 
199 ----------------
200 (0 rows)
202 select regexp_matches('b', 'a*(?<!a)b+');
203  regexp_matches 
204 ----------------
205  {b}
206 (1 row)
208 select regexp_matches('a', 'a(?<!a)b*');
209  regexp_matches 
210 ----------------
211 (0 rows)
213 select regexp_matches('b', '(?<=b)b');
214  regexp_matches 
215 ----------------
216 (0 rows)
218 select regexp_matches('foobar', '(?<=f)b+');
219  regexp_matches 
220 ----------------
221 (0 rows)
223 select regexp_matches('foobar', '(?<=foo)b+');
224  regexp_matches 
225 ----------------
226  {b}
227 (1 row)
229 select regexp_matches('foobar', '(?<=oo)b+');
230  regexp_matches 
231 ----------------
232  {b}
233 (1 row)
235 -- Test optimization of single-chr-or-bracket-expression lookaround constraints
236 select 'xz' ~ 'x(?=[xy])';
237  ?column? 
238 ----------
240 (1 row)
242 select 'xy' ~ 'x(?=[xy])';
243  ?column? 
244 ----------
246 (1 row)
248 select 'xz' ~ 'x(?![xy])';
249  ?column? 
250 ----------
252 (1 row)
254 select 'xy' ~ 'x(?![xy])';
255  ?column? 
256 ----------
258 (1 row)
260 select 'x'  ~ 'x(?![xy])';
261  ?column? 
262 ----------
264 (1 row)
266 select 'xyy' ~ '(?<=[xy])yy+';
267  ?column? 
268 ----------
270 (1 row)
272 select 'zyy' ~ '(?<=[xy])yy+';
273  ?column? 
274 ----------
276 (1 row)
278 select 'xyy' ~ '(?<![xy])yy+';
279  ?column? 
280 ----------
282 (1 row)
284 select 'zyy' ~ '(?<![xy])yy+';
285  ?column? 
286 ----------
288 (1 row)
290 -- Test conversion of regex patterns to indexable conditions
291 explain (costs off) select * from pg_proc where proname ~ 'abc';
292             QUERY PLAN             
293 -----------------------------------
294  Seq Scan on pg_proc
295    Filter: (proname ~ 'abc'::text)
296 (2 rows)
298 explain (costs off) select * from pg_proc where proname ~ '^abc';
299                               QUERY PLAN                              
300 ----------------------------------------------------------------------
301  Index Scan using pg_proc_proname_args_nsp_index on pg_proc
302    Index Cond: ((proname >= 'abc'::text) AND (proname < 'abd'::text))
303    Filter: (proname ~ '^abc'::text)
304 (3 rows)
306 explain (costs off) select * from pg_proc where proname ~ '^abc$';
307                          QUERY PLAN                         
308 ------------------------------------------------------------
309  Index Scan using pg_proc_proname_args_nsp_index on pg_proc
310    Index Cond: (proname = 'abc'::text)
311    Filter: (proname ~ '^abc$'::text)
312 (3 rows)
314 explain (costs off) select * from pg_proc where proname ~ '^abcd*e';
315                               QUERY PLAN                              
316 ----------------------------------------------------------------------
317  Index Scan using pg_proc_proname_args_nsp_index on pg_proc
318    Index Cond: ((proname >= 'abc'::text) AND (proname < 'abd'::text))
319    Filter: (proname ~ '^abcd*e'::text)
320 (3 rows)
322 explain (costs off) select * from pg_proc where proname ~ '^abc+d';
323                               QUERY PLAN                              
324 ----------------------------------------------------------------------
325  Index Scan using pg_proc_proname_args_nsp_index on pg_proc
326    Index Cond: ((proname >= 'abc'::text) AND (proname < 'abd'::text))
327    Filter: (proname ~ '^abc+d'::text)
328 (3 rows)
330 explain (costs off) select * from pg_proc where proname ~ '^(abc)(def)';
331                                  QUERY PLAN                                 
332 ----------------------------------------------------------------------------
333  Index Scan using pg_proc_proname_args_nsp_index on pg_proc
334    Index Cond: ((proname >= 'abcdef'::text) AND (proname < 'abcdeg'::text))
335    Filter: (proname ~ '^(abc)(def)'::text)
336 (3 rows)
338 explain (costs off) select * from pg_proc where proname ~ '^(abc)$';
339                          QUERY PLAN                         
340 ------------------------------------------------------------
341  Index Scan using pg_proc_proname_args_nsp_index on pg_proc
342    Index Cond: (proname = 'abc'::text)
343    Filter: (proname ~ '^(abc)$'::text)
344 (3 rows)
346 explain (costs off) select * from pg_proc where proname ~ '^(abc)?d';
347                QUERY PLAN               
348 ----------------------------------------
349  Seq Scan on pg_proc
350    Filter: (proname ~ '^(abc)?d'::text)
351 (2 rows)
353 explain (costs off) select * from pg_proc where proname ~ '^abcd(x|(?=\w\w)q)';
354                                QUERY PLAN                               
355 ------------------------------------------------------------------------
356  Index Scan using pg_proc_proname_args_nsp_index on pg_proc
357    Index Cond: ((proname >= 'abcd'::text) AND (proname < 'abce'::text))
358    Filter: (proname ~ '^abcd(x|(?=\w\w)q)'::text)
359 (3 rows)
361 -- Test for infinite loop in pullback() (CVE-2007-4772)
362 select 'a' ~ '($|^)*';
363  ?column? 
364 ----------
366 (1 row)
368 -- These cases expose a bug in the original fix for CVE-2007-4772
369 select 'a' ~ '(^)+^';
370  ?column? 
371 ----------
373 (1 row)
375 select 'a' ~ '$($$)+';
376  ?column? 
377 ----------
379 (1 row)
381 -- More cases of infinite loop in pullback(), not fixed by CVE-2007-4772 fix
382 select 'a' ~ '($^)+';
383  ?column? 
384 ----------
386 (1 row)
388 select 'a' ~ '(^$)*';
389  ?column? 
390 ----------
392 (1 row)
394 select 'aa bb cc' ~ '(^(?!aa))+';
395  ?column? 
396 ----------
398 (1 row)
400 select 'aa x' ~ '(^(?!aa)(?!bb)(?!cc))+';
401  ?column? 
402 ----------
404 (1 row)
406 select 'bb x' ~ '(^(?!aa)(?!bb)(?!cc))+';
407  ?column? 
408 ----------
410 (1 row)
412 select 'cc x' ~ '(^(?!aa)(?!bb)(?!cc))+';
413  ?column? 
414 ----------
416 (1 row)
418 select 'dd x' ~ '(^(?!aa)(?!bb)(?!cc))+';
419  ?column? 
420 ----------
422 (1 row)
424 -- Test for infinite loop in fixempties() (Tcl bugs 3604074, 3606683)
425 select 'a' ~ '((((((a)*)*)*)*)*)*';
426  ?column? 
427 ----------
429 (1 row)
431 select 'a' ~ '((((((a+|)+|)+|)+|)+|)+|)';
432  ?column? 
433 ----------
435 (1 row)
437 -- These cases used to give too-many-states failures
438 select 'x' ~ 'abcd(\m)+xyz';
439  ?column? 
440 ----------
442 (1 row)
444 select 'a' ~ '^abcd*(((((^(a c(e?d)a+|)+|)+|)+|)+|a)+|)';
445  ?column? 
446 ----------
448 (1 row)
450 select 'x' ~ 'a^(^)bcd*xy(((((($a+|)+|)+|)+$|)+|)+|)^$';
451  ?column? 
452 ----------
454 (1 row)
456 select 'x' ~ 'xyz(\Y\Y)+';
457  ?column? 
458 ----------
460 (1 row)
462 select 'x' ~ 'x|(?:\M)+';
463  ?column? 
464 ----------
466 (1 row)
468 -- This generates O(N) states but O(N^2) arcs, so it causes problems
469 -- if arc count is not constrained
470 select 'x' ~ repeat('x*y*z*', 1000);
471 ERROR:  invalid regular expression: regular expression is too complex
472 -- Test backref in combination with non-greedy quantifier
473 -- https://core.tcl.tk/tcl/tktview/6585b21ca8fa6f3678d442b97241fdd43dba2ec0
474 select 'Programmer' ~ '(\w).*?\1' as t;
475  t 
478 (1 row)
480 select regexp_matches('Programmer', '(\w)(.*?\1)', 'g');
481  regexp_matches 
482 ----------------
483  {r,ogr}
484  {m,m}
485 (2 rows)
487 -- Test for proper matching of non-greedy iteration (bug #11478)
488 select regexp_matches('foo/bar/baz',
489                       '^([^/]+?)(?:/([^/]+?))(?:/([^/]+?))?$', '');
490  regexp_matches 
491 ----------------
492  {foo,bar,baz}
493 (1 row)
495 -- Test that greediness can be overridden by outer quantifier
496 select regexp_matches('llmmmfff', '^(l*)(.*)(f*)$');
497  regexp_matches 
498 ----------------
499  {ll,mmmfff,""}
500 (1 row)
502 select regexp_matches('llmmmfff', '^(l*){1,1}(.*)(f*)$');
503  regexp_matches 
504 ----------------
505  {ll,mmmfff,""}
506 (1 row)
508 select regexp_matches('llmmmfff', '^(l*){1,1}?(.*)(f*)$');
509   regexp_matches  
510 ------------------
511  {"",llmmmfff,""}
512 (1 row)
514 select regexp_matches('llmmmfff', '^(l*){1,1}?(.*){1,1}?(f*)$');
515  regexp_matches 
516 ----------------
517  {"",llmmm,fff}
518 (1 row)
520 select regexp_matches('llmmmfff', '^(l*?)(.*)(f*)$');
521   regexp_matches  
522 ------------------
523  {"",llmmmfff,""}
524 (1 row)
526 select regexp_matches('llmmmfff', '^(l*?){1,1}(.*)(f*)$');
527  regexp_matches 
528 ----------------
529  {ll,mmmfff,""}
530 (1 row)
532 select regexp_matches('llmmmfff', '^(l*?){1,1}?(.*)(f*)$');
533   regexp_matches  
534 ------------------
535  {"",llmmmfff,""}
536 (1 row)
538 select regexp_matches('llmmmfff', '^(l*?){1,1}?(.*){1,1}?(f*)$');
539  regexp_matches 
540 ----------------
541  {"",llmmm,fff}
542 (1 row)
544 -- Test for infinite loop in cfindloop with zero-length possible match
545 -- but no actual match (can only happen in the presence of backrefs)
546 select 'a' ~ '$()|^\1';
547  ?column? 
548 ----------
550 (1 row)
552 select 'a' ~ '.. ()|\1';
553  ?column? 
554 ----------
556 (1 row)
558 select 'a' ~ '()*\1';
559  ?column? 
560 ----------
562 (1 row)
564 select 'a' ~ '()+\1';
565  ?column? 
566 ----------
568 (1 row)
570 -- Test incorrect removal of capture groups within {0}
571 select 'xxx' ~ '(.){0}(\1)' as f;
572  f 
575 (1 row)
577 select 'xxx' ~ '((.)){0}(\2)' as f;
578  f 
581 (1 row)
583 select 'xyz' ~ '((.)){0}(\2){0}' as t;
584  t 
587 (1 row)
589 -- Test ancient oversight in when to apply zaptreesubs
590 select 'abcdef' ~ '^(.)\1|\1.' as f;
591  f 
594 (1 row)
596 select 'abadef' ~ '^((.)\2|..)\2' as f;
597  f 
600 (1 row)
602 -- Add coverage for some cases in checkmatchall
603 select regexp_match('xy', '.|...');
604  regexp_match 
605 --------------
606  {x}
607 (1 row)
609 select regexp_match('xyz', '.|...');
610  regexp_match 
611 --------------
612  {xyz}
613 (1 row)
615 select regexp_match('xy', '.*');
616  regexp_match 
617 --------------
618  {xy}
619 (1 row)
621 select regexp_match('fooba', '(?:..)*');
622  regexp_match 
623 --------------
624  {foob}
625 (1 row)
627 select regexp_match('xyz', repeat('.', 260));
628  regexp_match 
629 --------------
631 (1 row)
633 select regexp_match('foo', '(?:.|){99}');
634  regexp_match 
635 --------------
636  {foo}
637 (1 row)
639 -- Error conditions
640 select 'xyz' ~ 'x(\w)(?=\1)';  -- no backrefs in LACONs
641 ERROR:  invalid regular expression: invalid backreference number
642 select 'xyz' ~ 'x(\w)(?=(\1))';
643 ERROR:  invalid regular expression: invalid backreference number
644 select 'a' ~ '\x7fffffff';  -- invalid chr code
645 ERROR:  invalid regular expression: invalid escape \ sequence