Use caller's memory context for radix tree iteration state
[pgsql.git] / src / test / regress / expected / collate.out
blobbf72908fbd39b2e67415dfeb7551263b4179079b
1 /*
2  * This test is intended to pass on all platforms supported by Postgres.
3  * We can therefore only assume that the default, C, and POSIX collations
4  * are available --- and since the regression tests are often run in a
5  * C-locale database, these may well all have the same behavior.  But
6  * fortunately, the system doesn't know that and will treat them as
7  * incompatible collations.  It is therefore at least possible to test
8  * parser behaviors such as collation conflict resolution.  This test will,
9  * however, be more revealing when run in a database with non-C locale,
10  * since any departure from C sorting behavior will show as a failure.
11  */
12 CREATE SCHEMA collate_tests;
13 SET search_path = collate_tests;
14 CREATE TABLE collate_test1 (
15     a int,
16     b text COLLATE "C" NOT NULL
18 \d collate_test1
19         Table "collate_tests.collate_test1"
20  Column |  Type   | Collation | Nullable | Default 
21 --------+---------+-----------+----------+---------
22  a      | integer |           |          | 
23  b      | text    | C         | not null | 
25 CREATE TABLE collate_test_fail (
26     a int COLLATE "C",
27     b text
29 ERROR:  collations are not supported by type integer
30 LINE 2:     a int COLLATE "C",
31                   ^
32 CREATE TABLE collate_test_like (
33     LIKE collate_test1
35 \d collate_test_like
36       Table "collate_tests.collate_test_like"
37  Column |  Type   | Collation | Nullable | Default 
38 --------+---------+-----------+----------+---------
39  a      | integer |           |          | 
40  b      | text    | C         | not null | 
42 CREATE TABLE collate_test2 (
43     a int,
44     b text COLLATE "POSIX"
46 INSERT INTO collate_test1 VALUES (1, 'abc'), (2, 'Abc'), (3, 'bbc'), (4, 'ABD');
47 INSERT INTO collate_test2 SELECT * FROM collate_test1;
48 SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'abc';
49  a |  b  
50 ---+-----
51  1 | abc
52  3 | bbc
53 (2 rows)
55 SELECT * FROM collate_test1 WHERE b >= 'abc' COLLATE "C";
56  a |  b  
57 ---+-----
58  1 | abc
59  3 | bbc
60 (2 rows)
62 SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'abc' COLLATE "C";
63  a |  b  
64 ---+-----
65  1 | abc
66  3 | bbc
67 (2 rows)
69 SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "POSIX"; -- fail
70 ERROR:  collation mismatch between explicit collations "C" and "POSIX"
71 LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "P...
72                                                              ^
73 CREATE DOMAIN testdomain_p AS text COLLATE "POSIX";
74 CREATE DOMAIN testdomain_i AS int COLLATE "POSIX"; -- fail
75 ERROR:  collations are not supported by type integer
76 LINE 1: CREATE DOMAIN testdomain_i AS int COLLATE "POSIX";
77                                       ^
78 CREATE TABLE collate_test4 (
79     a int,
80     b testdomain_p
82 INSERT INTO collate_test4 SELECT * FROM collate_test1;
83 SELECT a, b FROM collate_test4 ORDER BY b;
84  a |  b  
85 ---+-----
86  4 | ABD
87  2 | Abc
88  1 | abc
89  3 | bbc
90 (4 rows)
92 CREATE TABLE collate_test5 (
93     a int,
94     b testdomain_p COLLATE "C"
96 INSERT INTO collate_test5 SELECT * FROM collate_test1;
97 SELECT a, b FROM collate_test5 ORDER BY b;
98  a |  b  
99 ---+-----
100  4 | ABD
101  2 | Abc
102  1 | abc
103  3 | bbc
104 (4 rows)
106 SELECT a, b FROM collate_test1 ORDER BY b;
107  a |  b  
108 ---+-----
109  4 | ABD
110  2 | Abc
111  1 | abc
112  3 | bbc
113 (4 rows)
115 SELECT a, b FROM collate_test2 ORDER BY b;
116  a |  b  
117 ---+-----
118  4 | ABD
119  2 | Abc
120  1 | abc
121  3 | bbc
122 (4 rows)
124 SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
125  a |  b  
126 ---+-----
127  4 | ABD
128  2 | Abc
129  1 | abc
130  3 | bbc
131 (4 rows)
133 -- star expansion
134 SELECT * FROM collate_test1 ORDER BY b;
135  a |  b  
136 ---+-----
137  4 | ABD
138  2 | Abc
139  1 | abc
140  3 | bbc
141 (4 rows)
143 SELECT * FROM collate_test2 ORDER BY b;
144  a |  b  
145 ---+-----
146  4 | ABD
147  2 | Abc
148  1 | abc
149  3 | bbc
150 (4 rows)
152 -- constant expression folding
153 SELECT 'bbc' COLLATE "C" > 'Abc' COLLATE "C" AS "true";
154  true 
155 ------
157 (1 row)
159 SELECT 'bbc' COLLATE "POSIX" < 'Abc' COLLATE "POSIX" AS "false";
160  false 
161 -------
163 (1 row)
165 -- upper/lower
166 CREATE TABLE collate_test10 (
167     a int,
168     x text COLLATE "C",
169     y text COLLATE "POSIX"
171 INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ');
172 SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10;
173  a | lower | lower | upper | upper | initcap | initcap 
174 ---+-------+-------+-------+-------+---------+---------
175  1 | hij   | hij   | HIJ   | HIJ   | Hij     | Hij
176  2 | hij   | hij   | HIJ   | HIJ   | Hij     | Hij
177 (2 rows)
179 SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10;
180  a | lower | lower 
181 ---+-------+-------
182  1 | hij   | hij
183  2 | hij   | hij
184 (2 rows)
186 SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a;
187  a |  x  |  y  
188 ---+-----+-----
189  1 | hij | hij
190  2 | HIJ | HIJ
191 (2 rows)
193 -- backwards parsing
194 CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc';
195 CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
196 CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10;
197 SELECT table_name, view_definition FROM information_schema.views
198   WHERE table_name LIKE 'collview%' ORDER BY 1;
199  table_name |                view_definition                 
200 ------------+------------------------------------------------
201  collview1  |  SELECT a,                                    +
202             |     b                                         +
203             |    FROM collate_test1                         +
204             |   WHERE ((b COLLATE "C") >= 'bbc'::text);
205  collview2  |  SELECT a,                                    +
206             |     b                                         +
207             |    FROM collate_test1                         +
208             |   ORDER BY (b COLLATE "C");
209  collview3  |  SELECT a,                                    +
210             |     lower(((x || x) COLLATE "POSIX")) AS lower+
211             |    FROM collate_test10;
212 (3 rows)
214 -- collation propagation in various expression types
215 SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2;
216  a | coalesce 
217 ---+----------
218  4 | ABD
219  2 | Abc
220  1 | abc
221  3 | bbc
222 (4 rows)
224 SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2;
225  a | coalesce 
226 ---+----------
227  4 | ABD
228  2 | Abc
229  1 | abc
230  3 | bbc
231 (4 rows)
233 SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10;
234  a | lower | lower 
235 ---+-------+-------
236  1 | hij   | hij
237  2 | hij   | hij
238 (2 rows)
240 SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3;
241  a |  b  | greatest 
242 ---+-----+----------
243  2 | Abc | CCC
244  4 | ABD | CCC
245  1 | abc | abc
246  3 | bbc | bbc
247 (4 rows)
249 SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3;
250  a |  b  | greatest 
251 ---+-----+----------
252  2 | Abc | CCC
253  4 | ABD | CCC
254  1 | abc | abc
255  3 | bbc | bbc
256 (4 rows)
258 SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10;
259  a |  x  |  y  | lower | lower 
260 ---+-----+-----+-------+-------
261  1 | hij | hij | hij   | hij
262  2 | HIJ | HIJ | foo   | foo
263 (2 rows)
265 SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2;
266  a | nullif 
267 ---+--------
268  4 | ABD
269  2 | Abc
270  3 | bbc
271  1 | 
272 (4 rows)
274 SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2;
275  a | nullif 
276 ---+--------
277  4 | ABD
278  2 | Abc
279  3 | bbc
280  1 | 
281 (4 rows)
283 SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10;
284  a | lower | lower 
285 ---+-------+-------
286  1 | hij   | hij
287  2 | hij   | hij
288 (2 rows)
290 SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2;
291  a |  b   
292 ---+------
293  4 | ABD
294  2 | Abc
295  1 | abcd
296  3 | bbc
297 (4 rows)
299 SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2;
300  a |  b   
301 ---+------
302  4 | ABD
303  2 | Abc
304  1 | abcd
305  3 | bbc
306 (4 rows)
308 CREATE DOMAIN testdomain AS text;
309 SELECT a, b::testdomain FROM collate_test1 ORDER BY 2;
310  a |  b  
311 ---+-----
312  4 | ABD
313  2 | Abc
314  1 | abc
315  3 | bbc
316 (4 rows)
318 SELECT a, b::testdomain FROM collate_test2 ORDER BY 2;
319  a |  b  
320 ---+-----
321  4 | ABD
322  2 | Abc
323  1 | abc
324  3 | bbc
325 (4 rows)
327 SELECT a, b::testdomain_p FROM collate_test2 ORDER BY 2;
328  a |  b  
329 ---+-----
330  4 | ABD
331  2 | Abc
332  1 | abc
333  3 | bbc
334 (4 rows)
336 SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10;
337  a | lower | lower 
338 ---+-------+-------
339  1 | hij   | hij
340  2 | hij   | hij
341 (2 rows)
343 SELECT min(b), max(b) FROM collate_test1;
344  min | max 
345 -----+-----
346  ABD | bbc
347 (1 row)
349 SELECT min(b), max(b) FROM collate_test2;
350  min | max 
351 -----+-----
352  ABD | bbc
353 (1 row)
355 SELECT array_agg(b ORDER BY b) FROM collate_test1;
356      array_agg     
357 -------------------
358  {ABD,Abc,abc,bbc}
359 (1 row)
361 SELECT array_agg(b ORDER BY b) FROM collate_test2;
362      array_agg     
363 -------------------
364  {ABD,Abc,abc,bbc}
365 (1 row)
367 -- In aggregates, ORDER BY expressions don't affect aggregate's collation
368 SELECT string_agg(x COLLATE "C", y COLLATE "POSIX") FROM collate_test10;  -- fail
369 ERROR:  collation mismatch between explicit collations "C" and "POSIX"
370 LINE 1: SELECT string_agg(x COLLATE "C", y COLLATE "POSIX") FROM col...
371                                            ^
372 SELECT array_agg(x COLLATE "C" ORDER BY y COLLATE "POSIX") FROM collate_test10;
373  array_agg 
374 -----------
375  {HIJ,hij}
376 (1 row)
378 SELECT array_agg(a ORDER BY x COLLATE "C", y COLLATE "POSIX") FROM collate_test10;
379  array_agg 
380 -----------
381  {2,1}
382 (1 row)
384 SELECT array_agg(a ORDER BY x||y) FROM collate_test10;  -- fail
385 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
386 LINE 1: SELECT array_agg(a ORDER BY x||y) FROM collate_test10;
387                                        ^
388 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
389 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2;
390  a |  b  
391 ---+-----
392  4 | ABD
393  4 | ABD
394  2 | Abc
395  2 | Abc
396  1 | abc
397  1 | abc
398  3 | bbc
399  3 | bbc
400 (8 rows)
402 SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2;
403  a |  b  
404 ---+-----
405  4 | ABD
406  2 | Abc
407  1 | abc
408  3 | bbc
409 (4 rows)
411 SELECT a, b FROM collate_test2 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test2 WHERE a > 1 ORDER BY 2;
412  a |  b  
413 ---+-----
414  2 | Abc
415  3 | bbc
416 (2 rows)
418 SELECT a, b FROM collate_test2 EXCEPT SELECT a, b FROM collate_test2 WHERE a < 2 ORDER BY 2;
419  a |  b  
420 ---+-----
421  4 | ABD
422  2 | Abc
423  3 | bbc
424 (3 rows)
426 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2 ORDER BY 2; -- fail
427 ERROR:  could not determine which collation to use for string comparison
428 HINT:  Use the COLLATE clause to set the collation explicitly.
429 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2; -- ok
430  a |  b  
431 ---+-----
432  1 | abc
433  2 | Abc
434  3 | bbc
435  4 | ABD
436  1 | abc
437  2 | Abc
438  3 | bbc
439  4 | ABD
440 (8 rows)
442 SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- fail
443 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
444 LINE 1: SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collat...
445                                                        ^
446 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
447 SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- ok
448  a |  b  
449 ---+-----
450  4 | ABD
451  2 | Abc
452  1 | abc
453  3 | bbc
454 (4 rows)
456 SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test2 ORDER BY 2; -- fail
457 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
458 LINE 1: ...ELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM col...
459                                                              ^
460 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
461 SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test2 ORDER BY 2; -- fail
462 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
463 LINE 1: SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM colla...
464                                                         ^
465 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
466 CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2; -- fail
467 ERROR:  no collation was derived for column "b" with collatable type text
468 HINT:  Use the COLLATE clause to set the collation explicitly.
469 -- ideally this would be a parse-time error, but for now it must be run-time:
470 select x < y from collate_test10; -- fail
471 ERROR:  could not determine which collation to use for string comparison
472 HINT:  Use the COLLATE clause to set the collation explicitly.
473 select x || y from collate_test10; -- ok, because || is not collation aware
474  ?column? 
475 ----------
476  hijhij
477  HIJHIJ
478 (2 rows)
480 select x, y from collate_test10 order by x || y; -- not so ok
481 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
482 LINE 1: select x, y from collate_test10 order by x || y;
483                                                       ^
484 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
485 -- collation mismatch between recursive and non-recursive term
486 WITH RECURSIVE foo(x) AS
487    (SELECT x FROM (VALUES('a' COLLATE "C"),('b')) t(x)
488    UNION ALL
489    SELECT (x || 'c') COLLATE "POSIX" FROM foo WHERE length(x) < 10)
490 SELECT * FROM foo;
491 ERROR:  recursive query "foo" column 1 has collation "C" in non-recursive term but collation "POSIX" overall
492 LINE 2:    (SELECT x FROM (VALUES('a' COLLATE "C"),('b')) t(x)
493                    ^
494 HINT:  Use the COLLATE clause to set the collation of the non-recursive term.
495 SELECT a, b, a < b as lt FROM
496   (VALUES ('a', 'B'), ('A', 'b' COLLATE "C")) v(a,b);
497  a | b | lt 
498 ---+---+----
499  a | B | f
500  A | b | t
501 (2 rows)
503 -- collation mismatch in subselects
504 SELECT * FROM collate_test10 WHERE (x, y) NOT IN (SELECT y, x FROM collate_test10);
505 ERROR:  could not determine which collation to use for string hashing
506 HINT:  Use the COLLATE clause to set the collation explicitly.
507 -- now it works with overrides
508 SELECT * FROM collate_test10 WHERE (x COLLATE "POSIX", y COLLATE "C") NOT IN (SELECT y, x FROM collate_test10);
509  a | x | y 
510 ---+---+---
511 (0 rows)
513 SELECT * FROM collate_test10 WHERE (x, y) NOT IN (SELECT y COLLATE "C", x COLLATE "POSIX" FROM collate_test10);
514  a | x | y 
515 ---+---+---
516 (0 rows)
518 -- casting
519 SELECT CAST('42' AS text COLLATE "C");
520 ERROR:  syntax error at or near "COLLATE"
521 LINE 1: SELECT CAST('42' AS text COLLATE "C");
522                                  ^
523 SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2;
524  a |  b  
525 ---+-----
526  4 | ABD
527  2 | Abc
528  1 | abc
529  3 | bbc
530 (4 rows)
532 SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2;
533  a |  b  
534 ---+-----
535  4 | ABD
536  2 | Abc
537  1 | abc
538  3 | bbc
539 (4 rows)
541 -- result of a SQL function
542 CREATE FUNCTION vc (text) RETURNS text LANGUAGE sql
543     AS 'select $1::varchar';
544 SELECT a, b FROM collate_test1 ORDER BY a, vc(b);
545  a |  b  
546 ---+-----
547  1 | abc
548  2 | Abc
549  3 | bbc
550  4 | ABD
551 (4 rows)
553 -- polymorphism
554 SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1;
555  unnest 
556 --------
557  ABD
558  Abc
559  abc
560  bbc
561 (4 rows)
563 SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1;
564  unnest 
565 --------
566  ABD
567  Abc
568  abc
569  bbc
570 (4 rows)
572 CREATE FUNCTION dup (anyelement) RETURNS anyelement
573     AS 'select $1' LANGUAGE sql;
574 SELECT a, dup(b) FROM collate_test1 ORDER BY 2;
575  a | dup 
576 ---+-----
577  4 | ABD
578  2 | Abc
579  1 | abc
580  3 | bbc
581 (4 rows)
583 SELECT a, dup(b) FROM collate_test2 ORDER BY 2;
584  a | dup 
585 ---+-----
586  4 | ABD
587  2 | Abc
588  1 | abc
589  3 | bbc
590 (4 rows)
592 -- indexes
593 CREATE INDEX collate_test1_idx1 ON collate_test1 (b);
594 CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "POSIX");
595 CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "POSIX")); -- this is different grammatically
596 CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX"));
597 CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "POSIX"); -- fail
598 ERROR:  collations are not supported by type integer
599 CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "POSIX")); -- fail
600 ERROR:  collations are not supported by type integer
601 LINE 1: ...ATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "P...
602                                                              ^
603 SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1;
604       relname       |                                                  pg_get_indexdef                                                  
605 --------------------+-------------------------------------------------------------------------------------------------------------------
606  collate_test1_idx1 | CREATE INDEX collate_test1_idx1 ON collate_tests.collate_test1 USING btree (b)
607  collate_test1_idx2 | CREATE INDEX collate_test1_idx2 ON collate_tests.collate_test1 USING btree (b COLLATE "POSIX")
608  collate_test1_idx3 | CREATE INDEX collate_test1_idx3 ON collate_tests.collate_test1 USING btree (b COLLATE "POSIX")
609  collate_test1_idx4 | CREATE INDEX collate_test1_idx4 ON collate_tests.collate_test1 USING btree (((b || 'foo'::text)) COLLATE "POSIX")
610 (4 rows)
612 -- foreign keys
613 -- force indexes and mergejoins to be used for FK checking queries,
614 -- else they might not exercise collation-dependent operators
615 SET enable_seqscan TO 0;
616 SET enable_hashjoin TO 0;
617 SET enable_nestloop TO 0;
618 CREATE TABLE collate_test20 (f1 text COLLATE "C" PRIMARY KEY);
619 INSERT INTO collate_test20 VALUES ('foo'), ('bar');
620 CREATE TABLE collate_test21 (f2 text COLLATE "POSIX" REFERENCES collate_test20);
621 INSERT INTO collate_test21 VALUES ('foo'), ('bar');
622 INSERT INTO collate_test21 VALUES ('baz'); -- fail
623 ERROR:  insert or update on table "collate_test21" violates foreign key constraint "collate_test21_f2_fkey"
624 DETAIL:  Key (f2)=(baz) is not present in table "collate_test20".
625 CREATE TABLE collate_test22 (f2 text COLLATE "POSIX");
626 INSERT INTO collate_test22 VALUES ('foo'), ('bar'), ('baz');
627 ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20; -- fail
628 ERROR:  insert or update on table "collate_test22" violates foreign key constraint "collate_test22_f2_fkey"
629 DETAIL:  Key (f2)=(baz) is not present in table "collate_test20".
630 DELETE FROM collate_test22 WHERE f2 = 'baz';
631 ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20;
632 RESET enable_seqscan;
633 RESET enable_hashjoin;
634 RESET enable_nestloop;
635 -- EXPLAIN
636 EXPLAIN (COSTS OFF)
637   SELECT * FROM collate_test10 ORDER BY x, y;
638                   QUERY PLAN                  
639 ----------------------------------------------
640  Sort
641    Sort Key: x COLLATE "C", y COLLATE "POSIX"
642    ->  Seq Scan on collate_test10
643 (3 rows)
645 EXPLAIN (COSTS OFF)
646   SELECT * FROM collate_test10 ORDER BY x DESC, y COLLATE "C" ASC NULLS FIRST;
647                         QUERY PLAN                         
648 -----------------------------------------------------------
649  Sort
650    Sort Key: x COLLATE "C" DESC, y COLLATE "C" NULLS FIRST
651    ->  Seq Scan on collate_test10
652 (3 rows)
654 -- CREATE/DROP COLLATION
655 CREATE COLLATION builtin_c ( PROVIDER = builtin, LOCALE = "C" );
656 SELECT b FROM collate_test1 ORDER BY b COLLATE builtin_c;
657   b  
658 -----
659  ABD
660  Abc
661  abc
662  bbc
663 (4 rows)
665 CREATE COLLATION builtin2 ( PROVIDER = builtin ); -- fails
666 ERROR:  parameter "locale" must be specified
667 CREATE COLLATION builtin2 ( PROVIDER = builtin, LOCALE = "en_US" ); -- fails
668 ERROR:  invalid locale name "en_US" for builtin provider
669 CREATE COLLATION builtin2 ( PROVIDER = builtin, LC_CTYPE = "C", LC_COLLATE = "C" ); -- fails
670 ERROR:  parameter "locale" must be specified
671 CREATE COLLATION mycoll1 FROM "C";
672 CREATE COLLATION mycoll2 ( LC_COLLATE = "POSIX", LC_CTYPE = "POSIX" );
673 CREATE COLLATION mycoll3 FROM "default";  -- intentionally unsupported
674 ERROR:  collation "default" cannot be copied
675 DROP COLLATION mycoll1;
676 CREATE TABLE collate_test23 (f1 text collate mycoll2);
677 DROP COLLATION mycoll2;  -- fail
678 ERROR:  cannot drop collation mycoll2 because other objects depend on it
679 DETAIL:  column f1 of table collate_test23 depends on collation mycoll2
680 HINT:  Use DROP ... CASCADE to drop the dependent objects too.
681 -- invalid: non-lowercase quoted identifiers
682 CREATE COLLATION case_coll ("Lc_Collate" = "POSIX", "Lc_Ctype" = "POSIX");
683 ERROR:  collation attribute "Lc_Collate" not recognized
684 LINE 1: CREATE COLLATION case_coll ("Lc_Collate" = "POSIX", "Lc_Ctyp...
685                                     ^
686 -- 9.1 bug with useless COLLATE in an expression subject to length coercion
687 CREATE TEMP TABLE vctable (f1 varchar(25));
688 INSERT INTO vctable VALUES ('foo' COLLATE "C");
689 SELECT collation for ('foo'); -- unknown type - null
690  pg_collation_for 
691 ------------------
693 (1 row)
695 SELECT collation for ('foo'::text);
696  pg_collation_for 
697 ------------------
698  "default"
699 (1 row)
701 SELECT collation for ((SELECT a FROM collate_test1 LIMIT 1)); -- non-collatable type - error
702 ERROR:  collations are not supported by type integer
703 SELECT collation for ((SELECT b FROM collate_test1 LIMIT 1));
704  pg_collation_for 
705 ------------------
706  "C"
707 (1 row)
709 -- old bug with not dropping COLLATE when coercing to non-collatable type
710 CREATE VIEW collate_on_int AS
711 SELECT c1+1 AS c1p FROM
712   (SELECT ('4' COLLATE "C")::INT AS c1) ss;
713 \d+ collate_on_int
714                     View "collate_tests.collate_on_int"
715  Column |  Type   | Collation | Nullable | Default | Storage | Description 
716 --------+---------+-----------+----------+---------+---------+-------------
717  c1p    | integer |           |          |         | plain   | 
718 View definition:
719  SELECT c1 + 1 AS c1p
720    FROM ( SELECT 4 AS c1) ss;
722 -- Check conflicting or redundant options in CREATE COLLATION
723 -- LC_COLLATE
724 CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_COLLATE = "NONSENSE", LC_CTYPE = "POSIX");
725 ERROR:  conflicting or redundant options
726 LINE 1: ...ATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_COLLATE...
727                                                              ^
728 -- LC_CTYPE
729 CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LC_CTYPE = "NONSENSE", LC_COLLATE = "POSIX");
730 ERROR:  conflicting or redundant options
731 LINE 1: ...REATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LC_CTYPE =...
732                                                              ^
733 -- PROVIDER
734 CREATE COLLATION coll_dup_chk (PROVIDER = icu, PROVIDER = NONSENSE, LC_COLLATE = "POSIX", LC_CTYPE = "POSIX");
735 ERROR:  conflicting or redundant options
736 LINE 1: CREATE COLLATION coll_dup_chk (PROVIDER = icu, PROVIDER = NO...
737                                                        ^
738 -- LOCALE
739 CREATE COLLATION case_sensitive (LOCALE = '', LOCALE = "NONSENSE");
740 ERROR:  conflicting or redundant options
741 LINE 1: CREATE COLLATION case_sensitive (LOCALE = '', LOCALE = "NONS...
742                                                       ^
743 -- DETERMINISTIC
744 CREATE COLLATION coll_dup_chk (DETERMINISTIC = TRUE, DETERMINISTIC = NONSENSE, LOCALE = '');
745 ERROR:  conflicting or redundant options
746 LINE 1: ...ATE COLLATION coll_dup_chk (DETERMINISTIC = TRUE, DETERMINIS...
747                                                              ^
748 -- VERSION
749 CREATE COLLATION coll_dup_chk (VERSION = '1', VERSION = "NONSENSE", LOCALE = '');
750 ERROR:  conflicting or redundant options
751 LINE 1: CREATE COLLATION coll_dup_chk (VERSION = '1', VERSION = "NON...
752                                                       ^
753 -- LOCALE conflicts with LC_COLLATE and LC_CTYPE
754 CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_CTYPE = "POSIX", LOCALE = '');
755 ERROR:  conflicting or redundant options
756 DETAIL:  LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE.
757 -- LOCALE conflicts with LC_COLLATE
758 CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LOCALE = '');
759 ERROR:  conflicting or redundant options
760 DETAIL:  LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE.
761 -- LOCALE conflicts with LC_CTYPE
762 CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LOCALE = '');
763 ERROR:  conflicting or redundant options
764 DETAIL:  LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE.
765 -- FROM conflicts with any other option
766 CREATE COLLATION coll_dup_chk (FROM = "C", VERSION = "1");
767 ERROR:  conflicting or redundant options
768 DETAIL:  FROM cannot be specified together with any other options.
770 -- Clean up.  Many of these table names will be re-used if the user is
771 -- trying to run any platform-specific collation tests later, so we
772 -- must get rid of them.
774 DROP SCHEMA collate_tests CASCADE;
775 NOTICE:  drop cascades to 20 other objects
776 DETAIL:  drop cascades to table collate_test1
777 drop cascades to table collate_test_like
778 drop cascades to table collate_test2
779 drop cascades to type testdomain_p
780 drop cascades to table collate_test4
781 drop cascades to table collate_test5
782 drop cascades to table collate_test10
783 drop cascades to view collview1
784 drop cascades to view collview2
785 drop cascades to view collview3
786 drop cascades to type testdomain
787 drop cascades to function vc(text)
788 drop cascades to function dup(anyelement)
789 drop cascades to table collate_test20
790 drop cascades to table collate_test21
791 drop cascades to table collate_test22
792 drop cascades to collation builtin_c
793 drop cascades to collation mycoll2
794 drop cascades to table collate_test23
795 drop cascades to view collate_on_int