Consistently use "superuser" instead of "super user"
[pgsql.git] / src / test / regress / expected / collate.out
blob246832575c432813e90925298158585cfc5d3d76
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 CREATE TABLE collate_test4 (
77     a int,
78     b testdomain_p
80 INSERT INTO collate_test4 SELECT * FROM collate_test1;
81 SELECT a, b FROM collate_test4 ORDER BY b;
82  a |  b  
83 ---+-----
84  4 | ABD
85  2 | Abc
86  1 | abc
87  3 | bbc
88 (4 rows)
90 CREATE TABLE collate_test5 (
91     a int,
92     b testdomain_p COLLATE "C"
94 INSERT INTO collate_test5 SELECT * FROM collate_test1;
95 SELECT a, b FROM collate_test5 ORDER BY b;
96  a |  b  
97 ---+-----
98  4 | ABD
99  2 | Abc
100  1 | abc
101  3 | bbc
102 (4 rows)
104 SELECT a, b FROM collate_test1 ORDER BY b;
105  a |  b  
106 ---+-----
107  4 | ABD
108  2 | Abc
109  1 | abc
110  3 | bbc
111 (4 rows)
113 SELECT a, b FROM collate_test2 ORDER BY b;
114  a |  b  
115 ---+-----
116  4 | ABD
117  2 | Abc
118  1 | abc
119  3 | bbc
120 (4 rows)
122 SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
123  a |  b  
124 ---+-----
125  4 | ABD
126  2 | Abc
127  1 | abc
128  3 | bbc
129 (4 rows)
131 -- star expansion
132 SELECT * FROM collate_test1 ORDER BY b;
133  a |  b  
134 ---+-----
135  4 | ABD
136  2 | Abc
137  1 | abc
138  3 | bbc
139 (4 rows)
141 SELECT * FROM collate_test2 ORDER BY b;
142  a |  b  
143 ---+-----
144  4 | ABD
145  2 | Abc
146  1 | abc
147  3 | bbc
148 (4 rows)
150 -- constant expression folding
151 SELECT 'bbc' COLLATE "C" > 'Abc' COLLATE "C" AS "true";
152  true 
153 ------
155 (1 row)
157 SELECT 'bbc' COLLATE "POSIX" < 'Abc' COLLATE "POSIX" AS "false";
158  false 
159 -------
161 (1 row)
163 -- upper/lower
164 CREATE TABLE collate_test10 (
165     a int,
166     x text COLLATE "C",
167     y text COLLATE "POSIX"
169 INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ');
170 SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10;
171  a | lower | lower | upper | upper | initcap | initcap 
172 ---+-------+-------+-------+-------+---------+---------
173  1 | hij   | hij   | HIJ   | HIJ   | Hij     | Hij
174  2 | hij   | hij   | HIJ   | HIJ   | Hij     | Hij
175 (2 rows)
177 SELECT a, lower(x COLLATE "C"), lower(y COLLATE "C") FROM collate_test10;
178  a | lower | lower 
179 ---+-------+-------
180  1 | hij   | hij
181  2 | hij   | hij
182 (2 rows)
184 SELECT a, x, y FROM collate_test10 ORDER BY lower(y), a;
185  a |  x  |  y  
186 ---+-----+-----
187  1 | hij | hij
188  2 | HIJ | HIJ
189 (2 rows)
191 -- backwards parsing
192 CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc';
193 CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
194 CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10;
195 SELECT table_name, view_definition FROM information_schema.views
196   WHERE table_name LIKE 'collview%' ORDER BY 1;
197  table_name |                               view_definition                                
198 ------------+------------------------------------------------------------------------------
199  collview1  |  SELECT collate_test1.a,                                                    +
200             |     collate_test1.b                                                         +
201             |    FROM collate_test1                                                       +
202             |   WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text);
203  collview2  |  SELECT collate_test1.a,                                                    +
204             |     collate_test1.b                                                         +
205             |    FROM collate_test1                                                       +
206             |   ORDER BY (collate_test1.b COLLATE "C");
207  collview3  |  SELECT collate_test10.a,                                                   +
208             |     lower(((collate_test10.x || collate_test10.x) COLLATE "POSIX")) AS lower+
209             |    FROM collate_test10;
210 (3 rows)
212 -- collation propagation in various expression types
213 SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2;
214  a | coalesce 
215 ---+----------
216  4 | ABD
217  2 | Abc
218  1 | abc
219  3 | bbc
220 (4 rows)
222 SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2;
223  a | coalesce 
224 ---+----------
225  4 | ABD
226  2 | Abc
227  1 | abc
228  3 | bbc
229 (4 rows)
231 SELECT a, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10;
232  a | lower | lower 
233 ---+-------+-------
234  1 | hij   | hij
235  2 | hij   | hij
236 (2 rows)
238 SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3;
239  a |  b  | greatest 
240 ---+-----+----------
241  2 | Abc | CCC
242  4 | ABD | CCC
243  1 | abc | abc
244  3 | bbc | bbc
245 (4 rows)
247 SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3;
248  a |  b  | greatest 
249 ---+-----+----------
250  2 | Abc | CCC
251  4 | ABD | CCC
252  1 | abc | abc
253  3 | bbc | bbc
254 (4 rows)
256 SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10;
257  a |  x  |  y  | lower | lower 
258 ---+-----+-----+-------+-------
259  1 | hij | hij | hij   | hij
260  2 | HIJ | HIJ | foo   | foo
261 (2 rows)
263 SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2;
264  a | nullif 
265 ---+--------
266  4 | ABD
267  2 | Abc
268  3 | bbc
269  1 | 
270 (4 rows)
272 SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2;
273  a | nullif 
274 ---+--------
275  4 | ABD
276  2 | Abc
277  3 | bbc
278  1 | 
279 (4 rows)
281 SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10;
282  a | lower | lower 
283 ---+-------+-------
284  1 | hij   | hij
285  2 | hij   | hij
286 (2 rows)
288 SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2;
289  a |  b   
290 ---+------
291  4 | ABD
292  2 | Abc
293  1 | abcd
294  3 | bbc
295 (4 rows)
297 SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2;
298  a |  b   
299 ---+------
300  4 | ABD
301  2 | Abc
302  1 | abcd
303  3 | bbc
304 (4 rows)
306 CREATE DOMAIN testdomain AS text;
307 SELECT a, b::testdomain FROM collate_test1 ORDER BY 2;
308  a |  b  
309 ---+-----
310  4 | ABD
311  2 | Abc
312  1 | abc
313  3 | bbc
314 (4 rows)
316 SELECT a, b::testdomain FROM collate_test2 ORDER BY 2;
317  a |  b  
318 ---+-----
319  4 | ABD
320  2 | Abc
321  1 | abc
322  3 | bbc
323 (4 rows)
325 SELECT a, b::testdomain_p FROM collate_test2 ORDER BY 2;
326  a |  b  
327 ---+-----
328  4 | ABD
329  2 | Abc
330  1 | abc
331  3 | bbc
332 (4 rows)
334 SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10;
335  a | lower | lower 
336 ---+-------+-------
337  1 | hij   | hij
338  2 | hij   | hij
339 (2 rows)
341 SELECT min(b), max(b) FROM collate_test1;
342  min | max 
343 -----+-----
344  ABD | bbc
345 (1 row)
347 SELECT min(b), max(b) FROM collate_test2;
348  min | max 
349 -----+-----
350  ABD | bbc
351 (1 row)
353 SELECT array_agg(b ORDER BY b) FROM collate_test1;
354      array_agg     
355 -------------------
356  {ABD,Abc,abc,bbc}
357 (1 row)
359 SELECT array_agg(b ORDER BY b) FROM collate_test2;
360      array_agg     
361 -------------------
362  {ABD,Abc,abc,bbc}
363 (1 row)
365 -- In aggregates, ORDER BY expressions don't affect aggregate's collation
366 SELECT string_agg(x COLLATE "C", y COLLATE "POSIX") FROM collate_test10;  -- fail
367 ERROR:  collation mismatch between explicit collations "C" and "POSIX"
368 LINE 1: SELECT string_agg(x COLLATE "C", y COLLATE "POSIX") FROM col...
369                                            ^
370 SELECT array_agg(x COLLATE "C" ORDER BY y COLLATE "POSIX") FROM collate_test10;
371  array_agg 
372 -----------
373  {HIJ,hij}
374 (1 row)
376 SELECT array_agg(a ORDER BY x COLLATE "C", y COLLATE "POSIX") FROM collate_test10;
377  array_agg 
378 -----------
379  {2,1}
380 (1 row)
382 SELECT array_agg(a ORDER BY x||y) FROM collate_test10;  -- fail
383 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
384 LINE 1: SELECT array_agg(a ORDER BY x||y) FROM collate_test10;
385                                        ^
386 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
387 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2;
388  a |  b  
389 ---+-----
390  4 | ABD
391  4 | ABD
392  2 | Abc
393  2 | Abc
394  1 | abc
395  1 | abc
396  3 | bbc
397  3 | bbc
398 (8 rows)
400 SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2;
401  a |  b  
402 ---+-----
403  4 | ABD
404  2 | Abc
405  1 | abc
406  3 | bbc
407 (4 rows)
409 SELECT a, b FROM collate_test2 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test2 WHERE a > 1 ORDER BY 2;
410  a |  b  
411 ---+-----
412  2 | Abc
413  3 | bbc
414 (2 rows)
416 SELECT a, b FROM collate_test2 EXCEPT SELECT a, b FROM collate_test2 WHERE a < 2 ORDER BY 2;
417  a |  b  
418 ---+-----
419  4 | ABD
420  2 | Abc
421  3 | bbc
422 (3 rows)
424 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2 ORDER BY 2; -- fail
425 ERROR:  could not determine which collation to use for string comparison
426 HINT:  Use the COLLATE clause to set the collation explicitly.
427 SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2; -- ok
428  a |  b  
429 ---+-----
430  1 | abc
431  2 | Abc
432  3 | bbc
433  4 | ABD
434  1 | abc
435  2 | Abc
436  3 | bbc
437  4 | ABD
438 (8 rows)
440 SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- fail
441 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
442 LINE 1: SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collat...
443                                                        ^
444 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
445 SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test2 ORDER BY 2; -- ok
446  a |  b  
447 ---+-----
448  4 | ABD
449  2 | Abc
450  1 | abc
451  3 | bbc
452 (4 rows)
454 SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test2 ORDER BY 2; -- fail
455 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
456 LINE 1: ...ELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM col...
457                                                              ^
458 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
459 SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test2 ORDER BY 2; -- fail
460 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
461 LINE 1: SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM colla...
462                                                         ^
463 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
464 CREATE TABLE test_u AS SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test2; -- fail
465 ERROR:  no collation was derived for column "b" with collatable type text
466 HINT:  Use the COLLATE clause to set the collation explicitly.
467 -- ideally this would be a parse-time error, but for now it must be run-time:
468 select x < y from collate_test10; -- fail
469 ERROR:  could not determine which collation to use for string comparison
470 HINT:  Use the COLLATE clause to set the collation explicitly.
471 select x || y from collate_test10; -- ok, because || is not collation aware
472  ?column? 
473 ----------
474  hijhij
475  HIJHIJ
476 (2 rows)
478 select x, y from collate_test10 order by x || y; -- not so ok
479 ERROR:  collation mismatch between implicit collations "C" and "POSIX"
480 LINE 1: select x, y from collate_test10 order by x || y;
481                                                       ^
482 HINT:  You can choose the collation by applying the COLLATE clause to one or both expressions.
483 -- collation mismatch between recursive and non-recursive term
484 WITH RECURSIVE foo(x) AS
485    (SELECT x FROM (VALUES('a' COLLATE "C"),('b')) t(x)
486    UNION ALL
487    SELECT (x || 'c') COLLATE "POSIX" FROM foo WHERE length(x) < 10)
488 SELECT * FROM foo;
489 ERROR:  recursive query "foo" column 1 has collation "C" in non-recursive term but collation "POSIX" overall
490 LINE 2:    (SELECT x FROM (VALUES('a' COLLATE "C"),('b')) t(x)
491                    ^
492 HINT:  Use the COLLATE clause to set the collation of the non-recursive term.
493 SELECT a, b, a < b as lt FROM
494   (VALUES ('a', 'B'), ('A', 'b' COLLATE "C")) v(a,b);
495  a | b | lt 
496 ---+---+----
497  a | B | f
498  A | b | t
499 (2 rows)
501 -- collation mismatch in subselects
502 SELECT * FROM collate_test10 WHERE (x, y) NOT IN (SELECT y, x FROM collate_test10);
503 ERROR:  could not determine which collation to use for string hashing
504 HINT:  Use the COLLATE clause to set the collation explicitly.
505 -- now it works with overrides
506 SELECT * FROM collate_test10 WHERE (x COLLATE "POSIX", y COLLATE "C") NOT IN (SELECT y, x FROM collate_test10);
507  a | x | y 
508 ---+---+---
509 (0 rows)
511 SELECT * FROM collate_test10 WHERE (x, y) NOT IN (SELECT y COLLATE "C", x COLLATE "POSIX" FROM collate_test10);
512  a | x | y 
513 ---+---+---
514 (0 rows)
516 -- casting
517 SELECT CAST('42' AS text COLLATE "C");
518 ERROR:  syntax error at or near "COLLATE"
519 LINE 1: SELECT CAST('42' AS text COLLATE "C");
520                                  ^
521 SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2;
522  a |  b  
523 ---+-----
524  4 | ABD
525  2 | Abc
526  1 | abc
527  3 | bbc
528 (4 rows)
530 SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2;
531  a |  b  
532 ---+-----
533  4 | ABD
534  2 | Abc
535  1 | abc
536  3 | bbc
537 (4 rows)
539 -- result of a SQL function
540 CREATE FUNCTION vc (text) RETURNS text LANGUAGE sql
541     AS 'select $1::varchar';
542 SELECT a, b FROM collate_test1 ORDER BY a, vc(b);
543  a |  b  
544 ---+-----
545  1 | abc
546  2 | Abc
547  3 | bbc
548  4 | ABD
549 (4 rows)
551 -- polymorphism
552 SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1;
553  unnest 
554 --------
555  ABD
556  Abc
557  abc
558  bbc
559 (4 rows)
561 SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1;
562  unnest 
563 --------
564  ABD
565  Abc
566  abc
567  bbc
568 (4 rows)
570 CREATE FUNCTION dup (anyelement) RETURNS anyelement
571     AS 'select $1' LANGUAGE sql;
572 SELECT a, dup(b) FROM collate_test1 ORDER BY 2;
573  a | dup 
574 ---+-----
575  4 | ABD
576  2 | Abc
577  1 | abc
578  3 | bbc
579 (4 rows)
581 SELECT a, dup(b) FROM collate_test2 ORDER BY 2;
582  a | dup 
583 ---+-----
584  4 | ABD
585  2 | Abc
586  1 | abc
587  3 | bbc
588 (4 rows)
590 -- indexes
591 CREATE INDEX collate_test1_idx1 ON collate_test1 (b);
592 CREATE INDEX collate_test1_idx2 ON collate_test1 (b COLLATE "POSIX");
593 CREATE INDEX collate_test1_idx3 ON collate_test1 ((b COLLATE "POSIX")); -- this is different grammatically
594 CREATE INDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE "POSIX"));
595 CREATE INDEX collate_test1_idx5 ON collate_test1 (a COLLATE "POSIX"); -- fail
596 ERROR:  collations are not supported by type integer
597 CREATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "POSIX")); -- fail
598 ERROR:  collations are not supported by type integer
599 LINE 1: ...ATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "P...
600                                                              ^
601 SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1;
602       relname       |                                                  pg_get_indexdef                                                  
603 --------------------+-------------------------------------------------------------------------------------------------------------------
604  collate_test1_idx1 | CREATE INDEX collate_test1_idx1 ON collate_tests.collate_test1 USING btree (b)
605  collate_test1_idx2 | CREATE INDEX collate_test1_idx2 ON collate_tests.collate_test1 USING btree (b COLLATE "POSIX")
606  collate_test1_idx3 | CREATE INDEX collate_test1_idx3 ON collate_tests.collate_test1 USING btree (b COLLATE "POSIX")
607  collate_test1_idx4 | CREATE INDEX collate_test1_idx4 ON collate_tests.collate_test1 USING btree (((b || 'foo'::text)) COLLATE "POSIX")
608 (4 rows)
610 -- foreign keys
611 -- force indexes and mergejoins to be used for FK checking queries,
612 -- else they might not exercise collation-dependent operators
613 SET enable_seqscan TO 0;
614 SET enable_hashjoin TO 0;
615 SET enable_nestloop TO 0;
616 CREATE TABLE collate_test20 (f1 text COLLATE "C" PRIMARY KEY);
617 INSERT INTO collate_test20 VALUES ('foo'), ('bar');
618 CREATE TABLE collate_test21 (f2 text COLLATE "POSIX" REFERENCES collate_test20);
619 INSERT INTO collate_test21 VALUES ('foo'), ('bar');
620 INSERT INTO collate_test21 VALUES ('baz'); -- fail
621 ERROR:  insert or update on table "collate_test21" violates foreign key constraint "collate_test21_f2_fkey"
622 DETAIL:  Key (f2)=(baz) is not present in table "collate_test20".
623 CREATE TABLE collate_test22 (f2 text COLLATE "POSIX");
624 INSERT INTO collate_test22 VALUES ('foo'), ('bar'), ('baz');
625 ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20; -- fail
626 ERROR:  insert or update on table "collate_test22" violates foreign key constraint "collate_test22_f2_fkey"
627 DETAIL:  Key (f2)=(baz) is not present in table "collate_test20".
628 DELETE FROM collate_test22 WHERE f2 = 'baz';
629 ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20;
630 RESET enable_seqscan;
631 RESET enable_hashjoin;
632 RESET enable_nestloop;
633 -- EXPLAIN
634 EXPLAIN (COSTS OFF)
635   SELECT * FROM collate_test10 ORDER BY x, y;
636                   QUERY PLAN                  
637 ----------------------------------------------
638  Sort
639    Sort Key: x COLLATE "C", y COLLATE "POSIX"
640    ->  Seq Scan on collate_test10
641 (3 rows)
643 EXPLAIN (COSTS OFF)
644   SELECT * FROM collate_test10 ORDER BY x DESC, y COLLATE "C" ASC NULLS FIRST;
645                         QUERY PLAN                         
646 -----------------------------------------------------------
647  Sort
648    Sort Key: x COLLATE "C" DESC, y COLLATE "C" NULLS FIRST
649    ->  Seq Scan on collate_test10
650 (3 rows)
652 -- CREATE/DROP COLLATION
653 CREATE COLLATION mycoll1 FROM "C";
654 CREATE COLLATION mycoll2 ( LC_COLLATE = "POSIX", LC_CTYPE = "POSIX" );
655 CREATE COLLATION mycoll3 FROM "default";  -- intentionally unsupported
656 ERROR:  collation "default" cannot be copied
657 DROP COLLATION mycoll1;
658 CREATE TABLE collate_test23 (f1 text collate mycoll2);
659 DROP COLLATION mycoll2;  -- fail
660 ERROR:  cannot drop collation mycoll2 because other objects depend on it
661 DETAIL:  column f1 of table collate_test23 depends on collation mycoll2
662 HINT:  Use DROP ... CASCADE to drop the dependent objects too.
663 -- invalid: non-lowercase quoted identifiers
664 CREATE COLLATION case_coll ("Lc_Collate" = "POSIX", "Lc_Ctype" = "POSIX");
665 ERROR:  collation attribute "Lc_Collate" not recognized
666 LINE 1: CREATE COLLATION case_coll ("Lc_Collate" = "POSIX", "Lc_Ctyp...
667                                     ^
668 -- 9.1 bug with useless COLLATE in an expression subject to length coercion
669 CREATE TEMP TABLE vctable (f1 varchar(25));
670 INSERT INTO vctable VALUES ('foo' COLLATE "C");
671 SELECT collation for ('foo'); -- unknown type - null
672  pg_collation_for 
673 ------------------
675 (1 row)
677 SELECT collation for ('foo'::text);
678  pg_collation_for 
679 ------------------
680  "default"
681 (1 row)
683 SELECT collation for ((SELECT a FROM collate_test1 LIMIT 1)); -- non-collatable type - error
684 ERROR:  collations are not supported by type integer
685 SELECT collation for ((SELECT b FROM collate_test1 LIMIT 1));
686  pg_collation_for 
687 ------------------
688  "C"
689 (1 row)
691 -- old bug with not dropping COLLATE when coercing to non-collatable type
692 CREATE VIEW collate_on_int AS
693 SELECT c1+1 AS c1p FROM
694   (SELECT ('4' COLLATE "C")::INT AS c1) ss;
695 \d+ collate_on_int
696                     View "collate_tests.collate_on_int"
697  Column |  Type   | Collation | Nullable | Default | Storage | Description 
698 --------+---------+-----------+----------+---------+---------+-------------
699  c1p    | integer |           |          |         | plain   | 
700 View definition:
701  SELECT ss.c1 + 1 AS c1p
702    FROM ( SELECT 4 AS c1) ss;
704 -- Check conflicting or redundant options in CREATE COLLATION
705 -- LC_COLLATE
706 CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_COLLATE = "NONSENSE", LC_CTYPE = "POSIX");
707 ERROR:  conflicting or redundant options
708 LINE 1: ...ATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_COLLATE...
709                                                              ^
710 -- LC_CTYPE
711 CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LC_CTYPE = "NONSENSE", LC_COLLATE = "POSIX");
712 ERROR:  conflicting or redundant options
713 LINE 1: ...REATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LC_CTYPE =...
714                                                              ^
715 -- PROVIDER
716 CREATE COLLATION coll_dup_chk (PROVIDER = icu, PROVIDER = NONSENSE, LC_COLLATE = "POSIX", LC_CTYPE = "POSIX");
717 ERROR:  conflicting or redundant options
718 LINE 1: CREATE COLLATION coll_dup_chk (PROVIDER = icu, PROVIDER = NO...
719                                                        ^
720 -- LOCALE
721 CREATE COLLATION case_sensitive (LOCALE = '', LOCALE = "NONSENSE");
722 ERROR:  conflicting or redundant options
723 LINE 1: CREATE COLLATION case_sensitive (LOCALE = '', LOCALE = "NONS...
724                                                       ^
725 -- DETERMINISTIC
726 CREATE COLLATION coll_dup_chk (DETERMINISTIC = TRUE, DETERMINISTIC = NONSENSE, LOCALE = '');
727 ERROR:  conflicting or redundant options
728 LINE 1: ...ATE COLLATION coll_dup_chk (DETERMINISTIC = TRUE, DETERMINIS...
729                                                              ^
730 -- VERSION
731 CREATE COLLATION coll_dup_chk (VERSION = '1', VERSION = "NONSENSE", LOCALE = '');
732 ERROR:  conflicting or redundant options
733 LINE 1: CREATE COLLATION coll_dup_chk (VERSION = '1', VERSION = "NON...
734                                                       ^
735 -- LOCALE conflicts with LC_COLLATE and LC_CTYPE
736 CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_CTYPE = "POSIX", LOCALE = '');
737 ERROR:  conflicting or redundant options
738 DETAIL:  LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE.
739 -- LOCALE conflicts with LC_COLLATE
740 CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LOCALE = '');
741 ERROR:  conflicting or redundant options
742 DETAIL:  LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE.
743 -- LOCALE conflicts with LC_CTYPE
744 CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LOCALE = '');
745 ERROR:  conflicting or redundant options
746 DETAIL:  LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE.
747 -- FROM conflicts with any other option
748 CREATE COLLATION coll_dup_chk (FROM = "C", VERSION = "1");
749 ERROR:  conflicting or redundant options
750 DETAIL:  FROM cannot be specified together with any other options.
752 -- Clean up.  Many of these table names will be re-used if the user is
753 -- trying to run any platform-specific collation tests later, so we
754 -- must get rid of them.
756 DROP SCHEMA collate_tests CASCADE;
757 NOTICE:  drop cascades to 19 other objects
758 DETAIL:  drop cascades to table collate_test1
759 drop cascades to table collate_test_like
760 drop cascades to table collate_test2
761 drop cascades to type testdomain_p
762 drop cascades to table collate_test4
763 drop cascades to table collate_test5
764 drop cascades to table collate_test10
765 drop cascades to view collview1
766 drop cascades to view collview2
767 drop cascades to view collview3
768 drop cascades to type testdomain
769 drop cascades to function vc(text)
770 drop cascades to function dup(anyelement)
771 drop cascades to table collate_test20
772 drop cascades to table collate_test21
773 drop cascades to table collate_test22
774 drop cascades to collation mycoll2
775 drop cascades to table collate_test23
776 drop cascades to view collate_on_int