]> granicus.if.org Git - postgresql/blob - src/test/regress/expected/collate.icu.utf8.out
Hide cascade messages in collate tests
[postgresql] / src / test / regress / expected / collate.icu.utf8.out
1 /*
2  * This test is for ICU collations.
3  */
4 SET client_encoding TO UTF8;
5 CREATE SCHEMA collate_tests;
6 SET search_path = collate_tests;
7 CREATE TABLE collate_test1 (
8     a int,
9     b text COLLATE "en-x-icu" NOT NULL
10 );
11 \d collate_test1
12         Table "collate_tests.collate_test1"
13  Column |  Type   | Collation | Nullable | Default 
14 --------+---------+-----------+----------+---------
15  a      | integer |           |          | 
16  b      | text    | en-x-icu  | not null | 
17
18 CREATE TABLE collate_test_fail (
19     a int,
20     b text COLLATE "ja_JP.eucjp-x-icu"
21 );
22 ERROR:  collation "ja_JP.eucjp-x-icu" for encoding "UTF8" does not exist
23 LINE 3:     b text COLLATE "ja_JP.eucjp-x-icu"
24                    ^
25 CREATE TABLE collate_test_fail (
26     a int,
27     b text COLLATE "foo-x-icu"
28 );
29 ERROR:  collation "foo-x-icu" for encoding "UTF8" does not exist
30 LINE 3:     b text COLLATE "foo-x-icu"
31                    ^
32 CREATE TABLE collate_test_fail (
33     a int COLLATE "en-x-icu",
34     b text
35 );
36 ERROR:  collations are not supported by type integer
37 LINE 2:     a int COLLATE "en-x-icu",
38                   ^
39 CREATE TABLE collate_test_like (
40     LIKE collate_test1
41 );
42 \d collate_test_like
43       Table "collate_tests.collate_test_like"
44  Column |  Type   | Collation | Nullable | Default 
45 --------+---------+-----------+----------+---------
46  a      | integer |           |          | 
47  b      | text    | en-x-icu  | not null | 
48
49 CREATE TABLE collate_test2 (
50     a int,
51     b text COLLATE "sv-x-icu"
52 );
53 CREATE TABLE collate_test3 (
54     a int,
55     b text COLLATE "C"
56 );
57 INSERT INTO collate_test1 VALUES (1, 'abc'), (2, 'äbc'), (3, 'bbc'), (4, 'ABC');
58 INSERT INTO collate_test2 SELECT * FROM collate_test1;
59 INSERT INTO collate_test3 SELECT * FROM collate_test1;
60 SELECT * FROM collate_test1 WHERE b >= 'bbc';
61  a |  b  
62 ---+-----
63  3 | bbc
64 (1 row)
65
66 SELECT * FROM collate_test2 WHERE b >= 'bbc';
67  a |  b  
68 ---+-----
69  2 | äbc
70  3 | bbc
71 (2 rows)
72
73 SELECT * FROM collate_test3 WHERE b >= 'bbc';
74  a |  b  
75 ---+-----
76  2 | äbc
77  3 | bbc
78 (2 rows)
79
80 SELECT * FROM collate_test3 WHERE b >= 'BBC';
81  a |  b  
82 ---+-----
83  1 | abc
84  2 | äbc
85  3 | bbc
86 (3 rows)
87
88 SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc';
89  a |  b  
90 ---+-----
91  2 | äbc
92  3 | bbc
93 (2 rows)
94
95 SELECT * FROM collate_test1 WHERE b >= 'bbc' COLLATE "C";
96  a |  b  
97 ---+-----
98  2 | äbc
99  3 | bbc
100 (2 rows)
101
102 SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "C";
103  a |  b  
104 ---+-----
105  2 | äbc
106  3 | bbc
107 (2 rows)
108
109 SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "en-x-icu";
110 ERROR:  collation mismatch between explicit collations "C" and "en-x-icu"
111 LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "e...
112                                                              ^
113 CREATE DOMAIN testdomain_sv AS text COLLATE "sv-x-icu";
114 CREATE DOMAIN testdomain_i AS int COLLATE "sv-x-icu"; -- fails
115 ERROR:  collations are not supported by type integer
116 CREATE TABLE collate_test4 (
117     a int,
118     b testdomain_sv
119 );
120 INSERT INTO collate_test4 SELECT * FROM collate_test1;
121 SELECT a, b FROM collate_test4 ORDER BY b;
122  a |  b  
123 ---+-----
124  1 | abc
125  4 | ABC
126  3 | bbc
127  2 | äbc
128 (4 rows)
129
130 CREATE TABLE collate_test5 (
131     a int,
132     b testdomain_sv COLLATE "en-x-icu"
133 );
134 INSERT INTO collate_test5 SELECT * FROM collate_test1;
135 SELECT a, b FROM collate_test5 ORDER BY b;
136  a |  b  
137 ---+-----
138  1 | abc
139  4 | ABC
140  2 | äbc
141  3 | bbc
142 (4 rows)
143
144 SELECT a, b FROM collate_test1 ORDER BY b;
145  a |  b  
146 ---+-----
147  1 | abc
148  4 | ABC
149  2 | äbc
150  3 | bbc
151 (4 rows)
152
153 SELECT a, b FROM collate_test2 ORDER BY b;
154  a |  b  
155 ---+-----
156  1 | abc
157  4 | ABC
158  3 | bbc
159  2 | äbc
160 (4 rows)
161
162 SELECT a, b FROM collate_test3 ORDER BY b;
163  a |  b  
164 ---+-----
165  4 | ABC
166  1 | abc
167  3 | bbc
168  2 | äbc
169 (4 rows)
170
171 SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
172  a |  b  
173 ---+-----
174  4 | ABC
175  1 | abc
176  3 | bbc
177  2 | äbc
178 (4 rows)
179
180 -- star expansion
181 SELECT * FROM collate_test1 ORDER BY b;
182  a |  b  
183 ---+-----
184  1 | abc
185  4 | ABC
186  2 | äbc
187  3 | bbc
188 (4 rows)
189
190 SELECT * FROM collate_test2 ORDER BY b;
191  a |  b  
192 ---+-----
193  1 | abc
194  4 | ABC
195  3 | bbc
196  2 | äbc
197 (4 rows)
198
199 SELECT * FROM collate_test3 ORDER BY b;
200  a |  b  
201 ---+-----
202  4 | ABC
203  1 | abc
204  3 | bbc
205  2 | äbc
206 (4 rows)
207
208 -- constant expression folding
209 SELECT 'bbc' COLLATE "en-x-icu" > 'äbc' COLLATE "en-x-icu" AS "true";
210  true 
211 ------
212  t
213 (1 row)
214
215 SELECT 'bbc' COLLATE "sv-x-icu" > 'äbc' COLLATE "sv-x-icu" AS "false";
216  false 
217 -------
218  f
219 (1 row)
220
221 -- upper/lower
222 CREATE TABLE collate_test10 (
223     a int,
224     x text COLLATE "en-x-icu",
225     y text COLLATE "tr-x-icu"
226 );
227 INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ');
228 SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10;
229  a | lower | lower | upper | upper | initcap | initcap 
230 ---+-------+-------+-------+-------+---------+---------
231  1 | hij   | hij   | HIJ   | HİJ   | Hij     | Hij
232  2 | hij   | hıj   | HIJ   | HIJ   | Hij     | Hıj
233 (2 rows)
234
235 SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10;
236  a | lower | lower 
237 ---+-------+-------
238  1 | hij   | hij
239  2 | hij   | hij
240 (2 rows)
241
242 SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a;
243  a |  x  |  y  
244 ---+-----+-----
245  2 | HIJ | HIJ
246  1 | hij | hij
247 (2 rows)
248
249 -- LIKE/ILIKE
250 SELECT * FROM collate_test1 WHERE b LIKE 'abc';
251  a |  b  
252 ---+-----
253  1 | abc
254 (1 row)
255
256 SELECT * FROM collate_test1 WHERE b LIKE 'abc%';
257  a |  b  
258 ---+-----
259  1 | abc
260 (1 row)
261
262 SELECT * FROM collate_test1 WHERE b LIKE '%bc%';
263  a |  b  
264 ---+-----
265  1 | abc
266  2 | äbc
267  3 | bbc
268 (3 rows)
269
270 SELECT * FROM collate_test1 WHERE b ILIKE 'abc';
271  a |  b  
272 ---+-----
273  1 | abc
274  4 | ABC
275 (2 rows)
276
277 SELECT * FROM collate_test1 WHERE b ILIKE 'abc%';
278  a |  b  
279 ---+-----
280  1 | abc
281  4 | ABC
282 (2 rows)
283
284 SELECT * FROM collate_test1 WHERE b ILIKE '%bc%';
285  a |  b  
286 ---+-----
287  1 | abc
288  2 | äbc
289  3 | bbc
290  4 | ABC
291 (4 rows)
292
293 SELECT 'Türkiye' COLLATE "en-x-icu" ILIKE '%KI%' AS "true";
294  true 
295 ------
296  t
297 (1 row)
298
299 SELECT 'Türkiye' COLLATE "tr-x-icu" ILIKE '%KI%' AS "false";
300  false 
301 -------
302  f
303 (1 row)
304
305 SELECT 'bıt' ILIKE 'BIT' COLLATE "en-x-icu" AS "false";
306  false 
307 -------
308  f
309 (1 row)
310
311 SELECT 'bıt' ILIKE 'BIT' COLLATE "tr-x-icu" AS "true";
312  true 
313 ------
314  t
315 (1 row)
316
317 -- The following actually exercises the selectivity estimation for ILIKE.
318 SELECT relname FROM pg_class WHERE relname ILIKE 'abc%';
319  relname 
320 ---------
321 (0 rows)
322
323 -- regular expressions
324 SELECT * FROM collate_test1 WHERE b ~ '^abc$';
325  a |  b  
326 ---+-----
327  1 | abc
328 (1 row)
329
330 SELECT * FROM collate_test1 WHERE b ~ '^abc';
331  a |  b  
332 ---+-----
333  1 | abc
334 (1 row)
335
336 SELECT * FROM collate_test1 WHERE b ~ 'bc';
337  a |  b  
338 ---+-----
339  1 | abc
340  2 | äbc
341  3 | bbc
342 (3 rows)
343
344 SELECT * FROM collate_test1 WHERE b ~* '^abc$';
345  a |  b  
346 ---+-----
347  1 | abc
348  4 | ABC
349 (2 rows)
350
351 SELECT * FROM collate_test1 WHERE b ~* '^abc';
352  a |  b  
353 ---+-----
354  1 | abc
355  4 | ABC
356 (2 rows)
357
358 SELECT * FROM collate_test1 WHERE b ~* 'bc';
359  a |  b  
360 ---+-----
361  1 | abc
362  2 | äbc
363  3 | bbc
364  4 | ABC
365 (4 rows)
366
367 CREATE TABLE collate_test6 (
368     a int,
369     b text COLLATE "en-x-icu"
370 );
371 INSERT INTO collate_test6 VALUES (1, 'abc'), (2, 'ABC'), (3, '123'), (4, 'ab1'),
372                                  (5, 'a1!'), (6, 'a c'), (7, '!.;'), (8, '   '),
373                                  (9, 'äbç'), (10, 'ÄBÇ');
374 SELECT b,
375        b ~ '^[[:alpha:]]+$' AS is_alpha,
376        b ~ '^[[:upper:]]+$' AS is_upper,
377        b ~ '^[[:lower:]]+$' AS is_lower,
378        b ~ '^[[:digit:]]+$' AS is_digit,
379        b ~ '^[[:alnum:]]+$' AS is_alnum,
380        b ~ '^[[:graph:]]+$' AS is_graph,
381        b ~ '^[[:print:]]+$' AS is_print,
382        b ~ '^[[:punct:]]+$' AS is_punct,
383        b ~ '^[[:space:]]+$' AS is_space
384 FROM collate_test6;
385   b  | is_alpha | is_upper | is_lower | is_digit | is_alnum | is_graph | is_print | is_punct | is_space 
386 -----+----------+----------+----------+----------+----------+----------+----------+----------+----------
387  abc | t        | f        | t        | f        | t        | t        | t        | f        | f
388  ABC | t        | t        | f        | f        | t        | t        | t        | f        | f
389  123 | f        | f        | f        | t        | t        | t        | t        | f        | f
390  ab1 | f        | f        | f        | f        | t        | t        | t        | f        | f
391  a1! | f        | f        | f        | f        | f        | t        | t        | f        | f
392  a c | f        | f        | f        | f        | f        | f        | t        | f        | f
393  !.; | f        | f        | f        | f        | f        | t        | t        | t        | f
394      | f        | f        | f        | f        | f        | f        | t        | f        | t
395  äbç | t        | f        | t        | f        | t        | t        | t        | f        | f
396  ÄBÇ | t        | t        | f        | f        | t        | t        | t        | f        | f
397 (10 rows)
398
399 SELECT 'Türkiye' COLLATE "en-x-icu" ~* 'KI' AS "true";
400  true 
401 ------
402  t
403 (1 row)
404
405 SELECT 'Türkiye' COLLATE "tr-x-icu" ~* 'KI' AS "true";  -- true with ICU
406  true 
407 ------
408  t
409 (1 row)
410
411 SELECT 'bıt' ~* 'BIT' COLLATE "en-x-icu" AS "false";
412  false 
413 -------
414  f
415 (1 row)
416
417 SELECT 'bıt' ~* 'BIT' COLLATE "tr-x-icu" AS "false";  -- false with ICU
418  false 
419 -------
420  f
421 (1 row)
422
423 -- The following actually exercises the selectivity estimation for ~*.
424 SELECT relname FROM pg_class WHERE relname ~* '^abc';
425  relname 
426 ---------
427 (0 rows)
428
429 /* not run by default because it requires tr_TR system locale
430 -- to_char
431
432 SET lc_time TO 'tr_TR';
433 SELECT to_char(date '2010-04-01', 'DD TMMON YYYY');
434 SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr-x-icu");
435 */
436 -- backwards parsing
437 CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc';
438 CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
439 CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "C") FROM collate_test10;
440 SELECT table_name, view_definition FROM information_schema.views
441   WHERE table_name LIKE 'collview%' ORDER BY 1;
442  table_name |                             view_definition                              
443 ------------+--------------------------------------------------------------------------
444  collview1  |  SELECT collate_test1.a,                                                +
445             |     collate_test1.b                                                     +
446             |    FROM collate_test1                                                   +
447             |   WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text);
448  collview2  |  SELECT collate_test1.a,                                                +
449             |     collate_test1.b                                                     +
450             |    FROM collate_test1                                                   +
451             |   ORDER BY (collate_test1.b COLLATE "C");
452  collview3  |  SELECT collate_test10.a,                                               +
453             |     lower(((collate_test10.x || collate_test10.x) COLLATE "C")) AS lower+
454             |    FROM collate_test10;
455 (3 rows)
456
457 -- collation propagation in various expression types
458 SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2;
459  a | coalesce 
460 ---+----------
461  1 | abc
462  4 | ABC
463  2 | äbc
464  3 | bbc
465 (4 rows)
466
467 SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2;
468  a | coalesce 
469 ---+----------
470  1 | abc
471  4 | ABC
472  3 | bbc
473  2 | äbc
474 (4 rows)
475
476 SELECT a, coalesce(b, 'foo') FROM collate_test3 ORDER BY 2;
477  a | coalesce 
478 ---+----------
479  4 | ABC
480  1 | abc
481  3 | bbc
482  2 | äbc
483 (4 rows)
484
485 SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10;
486  a | lower | lower 
487 ---+-------+-------
488  1 | hij   | hij
489  2 | hij   | hıj
490 (2 rows)
491
492 SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3;
493  a |  b  | greatest 
494 ---+-----+----------
495  1 | abc | CCC
496  2 | äbc | CCC
497  3 | bbc | CCC
498  4 | ABC | CCC
499 (4 rows)
500
501 SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3;
502  a |  b  | greatest 
503 ---+-----+----------
504  1 | abc | CCC
505  3 | bbc | CCC
506  4 | ABC | CCC
507  2 | äbc | äbc
508 (4 rows)
509
510 SELECT a, b, greatest(b, 'CCC') FROM collate_test3 ORDER BY 3;
511  a |  b  | greatest 
512 ---+-----+----------
513  4 | ABC | CCC
514  1 | abc | abc
515  3 | bbc | bbc
516  2 | äbc | äbc
517 (4 rows)
518
519 SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10;
520  a |  x  |  y  | lower | lower 
521 ---+-----+-----+-------+-------
522  1 | hij | hij | hij   | hij
523  2 | HIJ | HIJ | hij   | hıj
524 (2 rows)
525
526 SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2;
527  a | nullif 
528 ---+--------
529  4 | ABC
530  2 | äbc
531  3 | bbc
532  1 | 
533 (4 rows)
534
535 SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2;
536  a | nullif 
537 ---+--------
538  4 | ABC
539  3 | bbc
540  2 | äbc
541  1 | 
542 (4 rows)
543
544 SELECT a, nullif(b, 'abc') FROM collate_test3 ORDER BY 2;
545  a | nullif 
546 ---+--------
547  4 | ABC
548  3 | bbc
549  2 | äbc
550  1 | 
551 (4 rows)
552
553 SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10;
554  a | lower | lower 
555 ---+-------+-------
556  1 | hij   | hij
557  2 | hij   | hıj
558 (2 rows)
559
560 SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2;
561  a |  b   
562 ---+------
563  4 | ABC
564  2 | äbc
565  1 | abcd
566  3 | bbc
567 (4 rows)
568
569 SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2;
570  a |  b   
571 ---+------
572  4 | ABC
573  1 | abcd
574  3 | bbc
575  2 | äbc
576 (4 rows)
577
578 SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test3 ORDER BY 2;
579  a |  b   
580 ---+------
581  4 | ABC
582  1 | abcd
583  3 | bbc
584  2 | äbc
585 (4 rows)
586
587 CREATE DOMAIN testdomain AS text;
588 SELECT a, b::testdomain FROM collate_test1 ORDER BY 2;
589  a |  b  
590 ---+-----
591  1 | abc
592  4 | ABC
593  2 | äbc
594  3 | bbc
595 (4 rows)
596
597 SELECT a, b::testdomain FROM collate_test2 ORDER BY 2;
598  a |  b  
599 ---+-----
600  1 | abc
601  4 | ABC
602  3 | bbc
603  2 | äbc
604 (4 rows)
605
606 SELECT a, b::testdomain FROM collate_test3 ORDER BY 2;
607  a |  b  
608 ---+-----
609  4 | ABC
610  1 | abc
611  3 | bbc
612  2 | äbc
613 (4 rows)
614
615 SELECT a, b::testdomain_sv FROM collate_test3 ORDER BY 2;
616  a |  b  
617 ---+-----
618  1 | abc
619  4 | ABC
620  3 | bbc
621  2 | äbc
622 (4 rows)
623
624 SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10;
625  a | lower | lower 
626 ---+-------+-------
627  1 | hij   | hij
628  2 | hij   | hıj
629 (2 rows)
630
631 SELECT min(b), max(b) FROM collate_test1;
632  min | max 
633 -----+-----
634  abc | bbc
635 (1 row)
636
637 SELECT min(b), max(b) FROM collate_test2;
638  min | max 
639 -----+-----
640  abc | äbc
641 (1 row)
642
643 SELECT min(b), max(b) FROM collate_test3;
644  min | max 
645 -----+-----
646  ABC | äbc
647 (1 row)
648
649 SELECT array_agg(b ORDER BY b) FROM collate_test1;
650      array_agg     
651 -------------------
652  {abc,ABC,äbc,bbc}
653 (1 row)
654
655 SELECT array_agg(b ORDER BY b) FROM collate_test2;
656      array_agg     
657 -------------------
658  {abc,ABC,bbc,äbc}
659 (1 row)
660
661 SELECT array_agg(b ORDER BY b) FROM collate_test3;
662      array_agg     
663 -------------------
664  {ABC,abc,bbc,äbc}
665 (1 row)
666
667 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2;
668  a |  b  
669 ---+-----
670  1 | abc
671  1 | abc
672  4 | ABC
673  4 | ABC
674  2 | äbc
675  2 | äbc
676  3 | bbc
677  3 | bbc
678 (8 rows)
679
680 SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2;
681  a |  b  
682 ---+-----
683  1 | abc
684  4 | ABC
685  3 | bbc
686  2 | äbc
687 (4 rows)
688
689 SELECT a, b FROM collate_test3 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test3 WHERE a > 1 ORDER BY 2;
690  a |  b  
691 ---+-----
692  3 | bbc
693  2 | äbc
694 (2 rows)
695
696 SELECT a, b FROM collate_test3 EXCEPT SELECT a, b FROM collate_test3 WHERE a < 2 ORDER BY 2;
697  a |  b  
698 ---+-----
699  4 | ABC
700  3 | bbc
701  2 | äbc
702 (3 rows)
703
704 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3 ORDER BY 2; -- fail
705 ERROR:  could not determine which collation to use for string comparison
706 HINT:  Use the COLLATE clause to set the collation explicitly.
707 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- ok
708  a |  b  
709 ---+-----
710  1 | abc
711  2 | äbc
712  3 | bbc
713  4 | ABC
714  1 | abc
715  2 | äbc
716  3 | bbc
717  4 | ABC
718 (8 rows)
719
720 SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- fail
721 ERROR:  collation mismatch between implicit collations "en-x-icu" and "C"
722 LINE 1: SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collat...
723                                                        ^
724 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
725 SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- ok
726  a |  b  
727 ---+-----
728  4 | ABC
729  1 | abc
730  3 | bbc
731  2 | äbc
732 (4 rows)
733
734 SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail
735 ERROR:  collation mismatch between implicit collations "en-x-icu" and "C"
736 LINE 1: ...ELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM col...
737                                                              ^
738 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
739 SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail
740 ERROR:  collation mismatch between implicit collations "en-x-icu" and "C"
741 LINE 1: SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM colla...
742                                                         ^
743 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
744 CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- fail
745 ERROR:  no collation was derived for column "b" with collatable type text
746 HINT:  Use the COLLATE clause to set the collation explicitly.
747 -- ideally this would be a parse-time error, but for now it must be run-time:
748 select x < y from collate_test10; -- fail
749 ERROR:  could not determine which collation to use for string comparison
750 HINT:  Use the COLLATE clause to set the collation explicitly.
751 select x || y from collate_test10; -- ok, because || is not collation aware
752  ?column? 
753 ----------
754  hijhij
755  HIJHIJ
756 (2 rows)
757
758 select x, y from collate_test10 order by x || y; -- not so ok
759 ERROR:  collation mismatch between implicit collations "en-x-icu" and "tr-x-icu"
760 LINE 1: select x, y from collate_test10 order by x || y;
761                                                       ^
762 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
763 -- collation mismatch between recursive and non-recursive term
764 WITH RECURSIVE foo(x) AS
765    (SELECT x FROM (VALUES('a' COLLATE "en-x-icu"),('b')) t(x)
766    UNION ALL
767    SELECT (x || 'c') COLLATE "de-x-icu" FROM foo WHERE length(x) < 10)
768 SELECT * FROM foo;
769 ERROR:  recursive query "foo" column 1 has collation "en-x-icu" in non-recursive term but collation "de-x-icu" overall
770 LINE 2:    (SELECT x FROM (VALUES('a' COLLATE "en-x-icu"),('b')) t(x...
771                    ^
772 HINT:  Use the COLLATE clause to set the collation of the non-recursive term.
773 -- casting
774 SELECT CAST('42' AS text COLLATE "C");
775 ERROR:  syntax error at or near "COLLATE"
776 LINE 1: SELECT CAST('42' AS text COLLATE "C");
777                                  ^
778 SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2;
779  a |  b  
780 ---+-----
781  1 | abc
782  4 | ABC
783  2 | äbc
784  3 | bbc
785 (4 rows)
786
787 SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2;
788  a |  b  
789 ---+-----
790  1 | abc
791  4 | ABC
792  3 | bbc
793  2 | äbc
794 (4 rows)
795
796 SELECT a, CAST(b AS varchar) FROM collate_test3 ORDER BY 2;
797  a |  b  
798 ---+-----
799  4 | ABC
800  1 | abc
801  3 | bbc
802  2 | äbc
803 (4 rows)
804
805 -- propagation of collation in SQL functions (inlined and non-inlined cases)
806 -- and plpgsql functions too
807 CREATE FUNCTION mylt (text, text) RETURNS boolean LANGUAGE sql
808     AS $$ select $1 < $2 $$;
809 CREATE FUNCTION mylt_noninline (text, text) RETURNS boolean LANGUAGE sql
810     AS $$ select $1 < $2 limit 1 $$;
811 CREATE FUNCTION mylt_plpgsql (text, text) RETURNS boolean LANGUAGE plpgsql
812     AS $$ begin return $1 < $2; end $$;
813 SELECT a.b AS a, b.b AS b, a.b < b.b AS lt,
814        mylt(a.b, b.b), mylt_noninline(a.b, b.b), mylt_plpgsql(a.b, b.b)
815 FROM collate_test1 a, collate_test1 b
816 ORDER BY a.b, b.b;
817   a  |  b  | lt | mylt | mylt_noninline | mylt_plpgsql 
818 -----+-----+----+------+----------------+--------------
819  abc | abc | f  | f    | f              | f
820  abc | ABC | t  | t    | t              | t
821  abc | äbc | t  | t    | t              | t
822  abc | bbc | t  | t    | t              | t
823  ABC | abc | f  | f    | f              | f
824  ABC | ABC | f  | f    | f              | f
825  ABC | äbc | t  | t    | t              | t
826  ABC | bbc | t  | t    | t              | t
827  äbc | abc | f  | f    | f              | f
828  äbc | ABC | f  | f    | f              | f
829  äbc | äbc | f  | f    | f              | f
830  äbc | bbc | t  | t    | t              | t
831  bbc | abc | f  | f    | f              | f
832  bbc | ABC | f  | f    | f              | f
833  bbc | äbc | f  | f    | f              | f
834  bbc | bbc | f  | f    | f              | f
835 (16 rows)
836
837 SELECT a.b AS a, b.b AS b, a.b < b.b COLLATE "C" AS lt,
838        mylt(a.b, b.b COLLATE "C"), mylt_noninline(a.b, b.b COLLATE "C"),
839        mylt_plpgsql(a.b, b.b COLLATE "C")
840 FROM collate_test1 a, collate_test1 b
841 ORDER BY a.b, b.b;
842   a  |  b  | lt | mylt | mylt_noninline | mylt_plpgsql 
843 -----+-----+----+------+----------------+--------------
844  abc | abc | f  | f    | f              | f
845  abc | ABC | f  | f    | f              | f
846  abc | äbc | t  | t    | t              | t
847  abc | bbc | t  | t    | t              | t
848  ABC | abc | t  | t    | t              | t
849  ABC | ABC | f  | f    | f              | f
850  ABC | äbc | t  | t    | t              | t
851  ABC | bbc | t  | t    | t              | t
852  äbc | abc | f  | f    | f              | f
853  äbc | ABC | f  | f    | f              | f
854  äbc | äbc | f  | f    | f              | f
855  äbc | bbc | f  | f    | f              | f
856  bbc | abc | f  | f    | f              | f
857  bbc | ABC | f  | f    | f              | f
858  bbc | äbc | t  | t    | t              | t
859  bbc | bbc | f  | f    | f              | f
860 (16 rows)
861
862 -- collation override in plpgsql
863 CREATE FUNCTION mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$
864 declare
865   xx text := x;
866   yy text := y;
867 begin
868   return xx < yy;
869 end
870 $$;
871 SELECT mylt2('a', 'B' collate "en-x-icu") as t, mylt2('a', 'B' collate "C") as f;
872  t | f 
873 ---+---
874  t | f
875 (1 row)
876
877 CREATE OR REPLACE FUNCTION
878   mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$
879 declare
880   xx text COLLATE "POSIX" := x;
881   yy text := y;
882 begin
883   return xx < yy;
884 end
885 $$;
886 SELECT mylt2('a', 'B') as f;
887  f 
888 ---
889  f
890 (1 row)
891
892 SELECT mylt2('a', 'B' collate "C") as fail; -- conflicting collations
893 ERROR:  could not determine which collation to use for string comparison
894 HINT:  Use the COLLATE clause to set the collation explicitly.
895 CONTEXT:  PL/pgSQL function mylt2(text,text) line 6 at RETURN
896 SELECT mylt2('a', 'B' collate "POSIX") as f;
897  f 
898 ---
899  f
900 (1 row)
901
902 -- polymorphism
903 SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1;
904  unnest 
905 --------
906  abc
907  ABC
908  äbc
909  bbc
910 (4 rows)
911
912 SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1;
913  unnest 
914 --------
915  abc
916  ABC
917  bbc
918  äbc
919 (4 rows)
920
921 SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test3)) ORDER BY 1;
922  unnest 
923 --------
924  ABC
925  abc
926  bbc
927  äbc
928 (4 rows)
929
930 CREATE FUNCTION dup (anyelement) RETURNS anyelement
931     AS 'select $1' LANGUAGE sql;
932 SELECT a, dup(b) FROM collate_test1 ORDER BY 2;
933  a | dup 
934 ---+-----
935  1 | abc
936  4 | ABC
937  2 | äbc
938  3 | bbc
939 (4 rows)
940
941 SELECT a, dup(b) FROM collate_test2 ORDER BY 2;
942  a | dup 
943 ---+-----
944  1 | abc
945  4 | ABC
946  3 | bbc
947  2 | äbc
948 (4 rows)
949
950 SELECT a, dup(b) FROM collate_test3 ORDER BY 2;
951  a | dup 
952 ---+-----
953  4 | ABC
954  1 | abc
955  3 | bbc
956  2 | äbc
957 (4 rows)
958
959 -- indexes
960 CREATE INDEX collate_test1_idx1 ON collate_test1 (b);
961 CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "C");
962 CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "C")); -- this is different grammatically
963 CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX"));
964 CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "C"); -- fail
965 ERROR:  collations are not supported by type integer
966 CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C")); -- fail
967 ERROR:  collations are not supported by type integer
968 LINE 1: ...ATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C...
969                                                              ^
970 SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1;
971       relname       |                                                  pg_get_indexdef                                                  
972 --------------------+-------------------------------------------------------------------------------------------------------------------
973  collate_test1_idx1 | CREATE INDEX collate_test1_idx1 ON collate_tests.collate_test1 USING btree (b)
974  collate_test1_idx2 | CREATE INDEX collate_test1_idx2 ON collate_tests.collate_test1 USING btree (b COLLATE "C")
975  collate_test1_idx3 | CREATE INDEX collate_test1_idx3 ON collate_tests.collate_test1 USING btree (b COLLATE "C")
976  collate_test1_idx4 | CREATE INDEX collate_test1_idx4 ON collate_tests.collate_test1 USING btree (((b || 'foo'::text)) COLLATE "POSIX")
977 (4 rows)
978
979 -- schema manipulation commands
980 CREATE ROLE regress_test_role;
981 CREATE SCHEMA test_schema;
982 -- We need to do this this way to cope with varying names for encodings:
983 do $$
984 BEGIN
985   EXECUTE 'CREATE COLLATION test0 (provider = icu, locale = ' ||
986           quote_literal(current_setting('lc_collate')) || ');';
987 END
988 $$;
989 CREATE COLLATION test0 FROM "C"; -- fail, duplicate name
990 ERROR:  collation "test0" already exists
991 do $$
992 BEGIN
993   EXECUTE 'CREATE COLLATION test1 (provider = icu, lc_collate = ' ||
994           quote_literal(current_setting('lc_collate')) ||
995           ', lc_ctype = ' ||
996           quote_literal(current_setting('lc_ctype')) || ');';
997 END
998 $$;
999 CREATE COLLATION test3 (provider = icu, lc_collate = 'en_US.utf8'); -- fail, need lc_ctype
1000 ERROR:  parameter "lc_ctype" must be specified
1001 CREATE COLLATION testx (provider = icu, locale = 'nonsense'); /* never fails with ICU */  DROP COLLATION testx;
1002 CREATE COLLATION test4 FROM nonsense;
1003 ERROR:  collation "nonsense" for encoding "UTF8" does not exist
1004 CREATE COLLATION test5 FROM test0;
1005 SELECT collname FROM pg_collation WHERE collname LIKE 'test%' ORDER BY 1;
1006  collname 
1007 ----------
1008  test0
1009  test1
1010  test5
1011 (3 rows)
1012
1013 ALTER COLLATION test1 RENAME TO test11;
1014 ALTER COLLATION test0 RENAME TO test11; -- fail
1015 ERROR:  collation "test11" already exists in schema "collate_tests"
1016 ALTER COLLATION test1 RENAME TO test22; -- fail
1017 ERROR:  collation "test1" for encoding "UTF8" does not exist
1018 ALTER COLLATION test11 OWNER TO regress_test_role;
1019 ALTER COLLATION test11 OWNER TO nonsense;
1020 ERROR:  role "nonsense" does not exist
1021 ALTER COLLATION test11 SET SCHEMA test_schema;
1022 COMMENT ON COLLATION test0 IS 'US English';
1023 SELECT collname, nspname, obj_description(pg_collation.oid, 'pg_collation')
1024     FROM pg_collation JOIN pg_namespace ON (collnamespace = pg_namespace.oid)
1025     WHERE collname LIKE 'test%'
1026     ORDER BY 1;
1027  collname |    nspname    | obj_description 
1028 ----------+---------------+-----------------
1029  test0    | collate_tests | US English
1030  test11   | test_schema   | 
1031  test5    | collate_tests | 
1032 (3 rows)
1033
1034 DROP COLLATION test0, test_schema.test11, test5;
1035 DROP COLLATION test0; -- fail
1036 ERROR:  collation "test0" for encoding "UTF8" does not exist
1037 DROP COLLATION IF EXISTS test0;
1038 NOTICE:  collation "test0" does not exist, skipping
1039 SELECT collname FROM pg_collation WHERE collname LIKE 'test%';
1040  collname 
1041 ----------
1042 (0 rows)
1043
1044 DROP SCHEMA test_schema;
1045 DROP ROLE regress_test_role;
1046 -- ALTER
1047 ALTER COLLATION "en-x-icu" REFRESH VERSION;
1048 NOTICE:  version has not changed
1049 -- dependencies
1050 CREATE COLLATION test0 FROM "C";
1051 CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0);
1052 CREATE DOMAIN collate_dep_dom1 AS text COLLATE test0;
1053 CREATE TYPE collate_dep_test2 AS (x int, y text COLLATE test0);
1054 CREATE VIEW collate_dep_test3 AS SELECT text 'foo' COLLATE test0 AS foo;
1055 CREATE TABLE collate_dep_test4t (a int, b text);
1056 CREATE INDEX collate_dep_test4i ON collate_dep_test4t (b COLLATE test0);
1057 DROP COLLATION test0 RESTRICT; -- fail
1058 ERROR:  cannot drop collation test0 because other objects depend on it
1059 DETAIL:  column b of table collate_dep_test1 depends on collation test0
1060 type collate_dep_dom1 depends on collation test0
1061 column y of composite type collate_dep_test2 depends on collation test0
1062 view collate_dep_test3 depends on collation test0
1063 index collate_dep_test4i depends on collation test0
1064 HINT:  Use DROP ... CASCADE to drop the dependent objects too.
1065 DROP COLLATION test0 CASCADE;
1066 NOTICE:  drop cascades to 5 other objects
1067 DETAIL:  drop cascades to column b of table collate_dep_test1
1068 drop cascades to type collate_dep_dom1
1069 drop cascades to column y of composite type collate_dep_test2
1070 drop cascades to view collate_dep_test3
1071 drop cascades to index collate_dep_test4i
1072 \d collate_dep_test1
1073       Table "collate_tests.collate_dep_test1"
1074  Column |  Type   | Collation | Nullable | Default 
1075 --------+---------+-----------+----------+---------
1076  a      | integer |           |          | 
1077
1078 \d collate_dep_test2
1079  Composite type "collate_tests.collate_dep_test2"
1080  Column |  Type   | Collation | Nullable | Default 
1081 --------+---------+-----------+----------+---------
1082  x      | integer |           |          | 
1083
1084 DROP TABLE collate_dep_test1, collate_dep_test4t;
1085 DROP TYPE collate_dep_test2;
1086 -- test range types and collations
1087 create type textrange_c as range(subtype=text, collation="C");
1088 create type textrange_en_us as range(subtype=text, collation="en-x-icu");
1089 select textrange_c('A','Z') @> 'b'::text;
1090  ?column? 
1091 ----------
1092  f
1093 (1 row)
1094
1095 select textrange_en_us('A','Z') @> 'b'::text;
1096  ?column? 
1097 ----------
1098  t
1099 (1 row)
1100
1101 drop type textrange_c;
1102 drop type textrange_en_us;
1103 -- cleanup
1104 SET client_min_messages TO warning;
1105 DROP SCHEMA collate_tests CASCADE;
1106 RESET search_path;
1107 -- leave a collation for pg_upgrade test
1108 CREATE COLLATION coll_icu_upgrade FROM "und-x-icu";