5
5
SET client_encoding TO UTF8;
6
6
CREATE TABLE collate_test1 (
7
7
a int,
8
- b text COLLATE "en_US.utf8 " NOT NULL
8
+ b text COLLATE "en_US" NOT NULL
9
9
);
10
10
\d collate_test1
11
- Table "public.collate_test1"
12
- Column | Type | Modifiers
13
- --------+---------+-----------------------------
11
+ Table "public.collate_test1"
12
+ Column | Type | Modifiers
13
+ --------+---------+------------------------
14
14
a | integer |
15
- b | text | collate en_US.utf8 not null
15
+ b | text | collate en_US not null
16
16
17
17
CREATE TABLE collate_test_fail (
18
18
a int,
@@ -29,25 +29,25 @@ ERROR: collation "foo" for encoding "UTF8" does not exist
29
29
LINE 3: b text COLLATE "foo"
30
30
^
31
31
CREATE TABLE collate_test_fail (
32
- a int COLLATE "en_US.utf8 ",
32
+ a int COLLATE "en_US",
33
33
b text
34
34
);
35
35
ERROR: collations are not supported by type integer
36
- LINE 2: a int COLLATE "en_US.utf8 ",
36
+ LINE 2: a int COLLATE "en_US",
37
37
^
38
38
CREATE TABLE collate_test_like (
39
39
LIKE collate_test1
40
40
);
41
41
\d collate_test_like
42
- Table "public.collate_test_like"
43
- Column | Type | Modifiers
44
- --------+---------+-----------------------------
42
+ Table "public.collate_test_like"
43
+ Column | Type | Modifiers
44
+ --------+---------+------------------------
45
45
a | integer |
46
- b | text | collate en_US.utf8 not null
46
+ b | text | collate en_US not null
47
47
48
48
CREATE TABLE collate_test2 (
49
49
a int,
50
- b text COLLATE "sv_SE.utf8 "
50
+ b text COLLATE "sv_SE"
51
51
);
52
52
CREATE TABLE collate_test3 (
53
53
a int,
@@ -105,16 +105,12 @@ SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "C";
105
105
3 | bbc
106
106
(2 rows)
107
107
108
- SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "en_US.utf8";
109
- ERROR: collation mismatch between explicit collations "C" and "en_US.utf8"
110
- LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "e...
111
- ^
112
108
SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "en_US";
113
109
ERROR: collation mismatch between explicit collations "C" and "en_US"
114
110
LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "e...
115
111
^
116
- CREATE DOMAIN testdomain_sv AS text COLLATE "sv_SE.utf8 ";
117
- CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE.utf8 "; -- fails
112
+ CREATE DOMAIN testdomain_sv AS text COLLATE "sv_SE";
113
+ CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; -- fails
118
114
ERROR: collations are not supported by type integer
119
115
CREATE TABLE collate_test4 (
120
116
a int,
@@ -132,7 +128,7 @@ SELECT a, b FROM collate_test4 ORDER BY b;
132
128
133
129
CREATE TABLE collate_test5 (
134
130
a int,
135
- b testdomain_sv COLLATE "en_US.utf8 "
131
+ b testdomain_sv COLLATE "en_US"
136
132
);
137
133
INSERT INTO collate_test5 SELECT * FROM collate_test1;
138
134
SELECT a, b FROM collate_test5 ORDER BY b;
@@ -209,13 +205,13 @@ SELECT * FROM collate_test3 ORDER BY b;
209
205
(4 rows)
210
206
211
207
-- constant expression folding
212
- SELECT 'bbc' COLLATE "en_US.utf8 " > 'äbc' COLLATE "en_US.utf8 " AS "true";
208
+ SELECT 'bbc' COLLATE "en_US" > 'äbc' COLLATE "en_US" AS "true";
213
209
true
214
210
------
215
211
t
216
212
(1 row)
217
213
218
- SELECT 'bbc' COLLATE "sv_SE.utf8 " > 'äbc' COLLATE "sv_SE.utf8 " AS "false";
214
+ SELECT 'bbc' COLLATE "sv_SE" > 'äbc' COLLATE "sv_SE" AS "false";
219
215
false
220
216
-------
221
217
f
@@ -224,8 +220,8 @@ SELECT 'bbc' COLLATE "sv_SE.utf8" > 'äbc' COLLATE "sv_SE.utf8" AS "false";
224
220
-- upper/lower
225
221
CREATE TABLE collate_test10 (
226
222
a int,
227
- x text COLLATE "en_US.utf8 ",
228
- y text COLLATE "tr_TR.utf8 "
223
+ x text COLLATE "en_US",
224
+ y text COLLATE "tr_TR"
229
225
);
230
226
INSERT INTO collate_test10 VALUES (1, 'hij', 'hij'), (2, 'HIJ', 'HIJ');
231
227
SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10;
@@ -293,33 +289,45 @@ SELECT * FROM collate_test1 WHERE b ILIKE '%bc%';
293
289
4 | ABC
294
290
(4 rows)
295
291
296
- SELECT 'Türkiye' COLLATE "en_US.utf8 " ILIKE '%KI%' AS "true";
292
+ SELECT 'Türkiye' COLLATE "en_US" ILIKE '%KI%' AS "true";
297
293
true
298
294
------
299
295
t
300
296
(1 row)
301
297
302
- SELECT 'Türkiye' COLLATE "tr_TR.utf8" ILIKE '%KI%' AS "false";
298
+ SELECT 'Türkiye' COLLATE "tr_TR" ILIKE '%KI%' AS "false";
299
+ false
300
+ -------
301
+ f
302
+ (1 row)
303
+
304
+ SELECT 'bıt' ILIKE 'BIT' COLLATE "en_US" AS "false";
303
305
false
304
306
-------
305
307
f
306
308
(1 row)
307
309
310
+ SELECT 'bıt' ILIKE 'BIT' COLLATE "tr_TR" AS "true";
311
+ true
312
+ ------
313
+ t
314
+ (1 row)
315
+
308
316
-- The following actually exercises the selectivity estimation for ILIKE.
309
317
SELECT relname FROM pg_class WHERE relname ILIKE 'abc%';
310
318
relname
311
319
---------
312
320
(0 rows)
313
321
314
322
-- to_char
315
- SET lc_time TO 'tr_TR.utf8 ';
323
+ SET lc_time TO 'tr_TR';
316
324
SELECT to_char(date '2010-04-01', 'DD TMMON YYYY');
317
325
to_char
318
326
-------------
319
327
01 NIS 2010
320
328
(1 row)
321
329
322
- SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR.utf8 ");
330
+ SELECT to_char(date '2010-04-01', 'DD TMMON YYYY' COLLATE "tr_TR");
323
331
to_char
324
332
-------------
325
333
01 NİS 2010
@@ -602,7 +610,7 @@ SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- ok
602
610
(8 rows)
603
611
604
612
SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- fail
605
- ERROR: collation mismatch between implicit collations "en_US.utf8 " and "C"
613
+ ERROR: collation mismatch between implicit collations "en_US" and "C"
606
614
LINE 1: SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collat...
607
615
^
608
616
HINT: You can choose the collation by applying the COLLATE clause to one or both expressions.
@@ -616,12 +624,12 @@ SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test3
616
624
(4 rows)
617
625
618
626
SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail
619
- ERROR: collation mismatch between implicit collations "en_US.utf8 " and "C"
627
+ ERROR: collation mismatch between implicit collations "en_US" and "C"
620
628
LINE 1: ...ELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM col...
621
629
^
622
630
HINT: You can choose the collation by applying the COLLATE clause to one or both expressions.
623
631
SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test3 ORDER BY 2; -- fail
624
- ERROR: collation mismatch between implicit collations "en_US.utf8 " and "C"
632
+ ERROR: collation mismatch between implicit collations "en_US" and "C"
625
633
LINE 1: SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM colla...
626
634
^
627
635
HINT: You can choose the collation by applying the COLLATE clause to one or both expressions.
@@ -640,7 +648,7 @@ select x || y from collate_test10; -- ok, because || is not collation aware
640
648
(2 rows)
641
649
642
650
select x, y from collate_test10 order by x || y; -- not so ok
643
- ERROR: collation mismatch between implicit collations "en_US.utf8 " and "tr_TR.utf8 "
651
+ ERROR: collation mismatch between implicit collations "en_US" and "tr_TR"
644
652
LINE 1: select x, y from collate_test10 order by x || y;
645
653
^
646
654
HINT: You can choose the collation by applying the COLLATE clause to one or both expressions.
@@ -823,26 +831,36 @@ SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_t
823
831
-- schema manipulation commands
824
832
CREATE ROLE regress_test_role;
825
833
CREATE SCHEMA test_schema;
826
- CREATE COLLATION test0 (locale = 'en_US.utf8');
827
- CREATE COLLATION test0 (locale = 'en_US.utf8'); -- fail
834
+ -- We need to do this this way to cope with varying names for encodings:
835
+ do $$
836
+ BEGIN
837
+ EXECUTE 'CREATE COLLATION test0 (locale = ' ||
838
+ quote_literal(current_setting('lc_collate')) || ');';
839
+ END
840
+ $$;
841
+ CREATE COLLATION test0 FROM "C"; -- fail, duplicate name
828
842
ERROR: collation "test0" for encoding "UTF8" already exists
829
- CREATE COLLATION test1 (lc_collate = 'en_US.utf8', lc_ctype = 'de_DE.utf8');
830
- CREATE COLLATION test2 (locale = 'en_US'); -- fail
831
- ERROR: encoding UTF8 does not match locale en_US
832
- DETAIL: The chosen LC_CTYPE setting requires encoding LATIN1.
833
- CREATE COLLATION test3 (lc_collate = 'en_US.utf8'); -- fail
843
+ do $$
844
+ BEGIN
845
+ EXECUTE 'CREATE COLLATION test1 (lc_collate = ' ||
846
+ quote_literal(current_setting('lc_collate')) ||
847
+ ', lc_ctype = ' ||
848
+ quote_literal(current_setting('lc_ctype')) || ');';
849
+ END
850
+ $$;
851
+ CREATE COLLATION test3 (lc_collate = 'en_US.utf8'); -- fail, need lc_ctype
834
852
ERROR: parameter "lc_ctype" must be specified
835
853
CREATE COLLATION testx (locale = 'nonsense'); -- fail
836
854
ERROR: could not create locale "nonsense": No such file or directory
837
855
CREATE COLLATION test4 FROM nonsense;
838
856
ERROR: collation "nonsense" for encoding "UTF8" does not exist
839
857
CREATE COLLATION test5 FROM test0;
840
- SELECT collname, collencoding, collcollate, collctype FROM pg_collation WHERE collname LIKE 'test%' ORDER BY 1;
841
- collname | collencoding | collcollate | collctype
842
- ----------+--------------+-------------+------------
843
- test0 | 6 | en_US.utf8 | en_US.utf8
844
- test1 | 6 | en_US.utf8 | de_DE.utf8
845
- test5 | 6 | en_US.utf8 | en_US.utf8
858
+ SELECT collname FROM pg_collation WHERE collname LIKE 'test%' ORDER BY 1;
859
+ collname
860
+ ----------
861
+ test0
862
+ test1
863
+ test5
846
864
(3 rows)
847
865
848
866
ALTER COLLATION test1 RENAME TO test11;
@@ -879,7 +897,7 @@ SELECT collname FROM pg_collation WHERE collname LIKE 'test%';
879
897
DROP SCHEMA test_schema;
880
898
DROP ROLE regress_test_role;
881
899
-- dependencies
882
- CREATE COLLATION test0 (locale = 'en_US.utf8') ;
900
+ CREATE COLLATION test0 FROM "C" ;
883
901
CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0);
884
902
CREATE DOMAIN collate_dep_dom1 AS text COLLATE test0;
885
903
CREATE TYPE collate_dep_test2 AS (x int, y text COLLATE test0);
0 commit comments