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