SELECT * FROM collate_test1 WHERE b >= 'bbc'; SELECT * FROM collate_test2 WHERE b >= 'bbc'; SELECT * FROM collate_test3 WHERE b >= 'bbc'; SELECT * FROM collate_test3 WHERE b >= 'BBC';
SELECT * FROM collate_test1 WHERE b COLLATE"C" >= 'bbc'; SELECT * FROM collate_test1 WHERE b >= 'bbc'COLLATE"C"; SELECT * FROM collate_test1 WHERE b COLLATE"C" >= 'bbc'COLLATE"C"; SELECT * FROM collate_test1 WHERE b COLLATE"C" >= 'bbc'COLLATE"en_US";
CREATE DOMAIN testdomain_sv AS text COLLATE"sv_SE"; CREATE DOMAIN testdomain_i AS int COLLATE"sv_SE"; -- fails CREATETABLE collate_test4 (
a int,
b testdomain_sv
); INSERTINTO collate_test4 SELECT * FROM collate_test1; SELECT a, b FROM collate_test4 ORDERBY b;
CREATETABLE collate_test5 (
a int,
b testdomain_sv COLLATE"en_US"
); INSERTINTO collate_test5 SELECT * FROM collate_test1; SELECT a, b FROM collate_test5 ORDERBY b;
SELECT a, b FROM collate_test1 ORDERBY b; SELECT a, b FROM collate_test2 ORDERBY b; SELECT a, b FROM collate_test3 ORDERBY b;
SELECT a, b FROM collate_test1 ORDERBY b COLLATE"C";
-- star expansion SELECT * FROM collate_test1 ORDERBY b; SELECT * FROM collate_test2 ORDERBY b; SELECT * FROM collate_test3 ORDERBY b;
SELECT * FROM collate_test1 WHERE b LIKE'abc'; SELECT * FROM collate_test1 WHERE b LIKE'abc%'; SELECT * FROM collate_test1 WHERE b LIKE'%bc%'; SELECT * FROM collate_test1 WHERE b ILIKE 'abc'; SELECT * FROM collate_test1 WHERE b ILIKE 'abc%'; SELECT * FROM collate_test1 WHERE b ILIKE '%bc%';
-- The following actually exercises the selectivity estimation for ILIKE. SELECT relname FROM pg_class WHERE relname ILIKE 'abc%';
-- regular expressions
SELECT * FROM collate_test1 WHERE b ~ '^abc$'; SELECT * FROM collate_test1 WHERE b ~ '^abc'; SELECT * FROM collate_test1 WHERE b ~ 'bc'; SELECT * FROM collate_test1 WHERE b ~* '^abc$'; SELECT * FROM collate_test1 WHERE b ~* '^abc'; SELECT * FROM collate_test1 WHERE b ~* 'bc';
CREATETABLE collate_test6 (
a int,
b text COLLATE"en_US"
); INSERTINTO collate_test6 VALUES (1, 'abc'), (2, 'ABC'), (3, '123'), (4, 'ab1'),
(5, 'a1!'), (6, 'a c'), (7, '!.;'), (8, ' '),
(9, 'äbç'), (10, 'ÄBÇ'); SELECT b,
b ~ '^[[:alpha:]]+$'AS is_alpha,
b ~ '^[[:upper:]]+$'AS is_upper,
b ~ '^[[:lower:]]+$'AS is_lower,
b ~ '^[[:digit:]]+$'AS is_digit,
b ~ '^[[:alnum:]]+$'AS is_alnum,
b ~ '^[[:graph:]]+$'AS is_graph,
b ~ '^[[:print:]]+$'AS is_print,
b ~ '^[[:punct:]]+$'AS is_punct,
b ~ '^[[:space:]]+$'AS is_space FROM collate_test6;
-- The following actually exercises the selectivity estimation for ~*. SELECT relname FROM pg_class WHERE relname ~* '^abc';
-- backwards parsing
CREATE VIEW collview1 ASSELECT * FROM collate_test1 WHERE b COLLATE"C" >= 'bbc'; CREATE VIEW collview2 ASSELECT a, b FROM collate_test1 ORDERBY b COLLATE"C";
SELECT table_name, view_definition FROM information_schema.views WHERE table_name LIKE'collview%'ORDERBY1;
-- collation propagation in various expression types
SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDERBY2; SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDERBY2; SELECT a, coalesce(b, 'foo') FROM collate_test3 ORDERBY2;
SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDERBY3; SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDERBY3; SELECT a, b, greatest(b, 'CCC') FROM collate_test3 ORDERBY3;
SELECT a, nullif(b, 'abc') FROM collate_test1 ORDERBY2; SELECT a, nullif(b, 'abc') FROM collate_test2 ORDERBY2; SELECT a, nullif(b, 'abc') FROM collate_test3 ORDERBY2;
SELECT a, CASE b WHEN'abc'THEN'abcd'ELSE b END FROM collate_test1 ORDERBY2; SELECT a, CASE b WHEN'abc'THEN'abcd'ELSE b END FROM collate_test2 ORDERBY2; SELECT a, CASE b WHEN'abc'THEN'abcd'ELSE b END FROM collate_test3 ORDERBY2;
CREATE DOMAIN testdomain AS text; SELECT a, b::testdomain FROM collate_test1 ORDERBY2; SELECT a, b::testdomain FROM collate_test2 ORDERBY2; SELECT a, b::testdomain FROM collate_test3 ORDERBY2; SELECT a, b::testdomain_sv FROM collate_test3 ORDERBY2;
SELECT min(b), max(b) FROM collate_test1; SELECT min(b), max(b) FROM collate_test2; SELECT min(b), max(b) FROM collate_test3;
SELECT array_agg(b ORDERBY b) FROM collate_test1; SELECT array_agg(b ORDERBY b) FROM collate_test2; SELECT array_agg(b ORDERBY b) FROM collate_test3;
SELECT a, b FROM collate_test1 UNIONALLSELECT a, b FROM collate_test1 ORDERBY2; SELECT a, b FROM collate_test2 UNIONSELECT a, b FROM collate_test2 ORDERBY2; SELECT a, b FROM collate_test3 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test3 WHERE a > 1ORDERBY2; SELECT a, b FROM collate_test3 EXCEPT SELECT a, b FROM collate_test3 WHERE a < 2ORDERBY2;
SELECT a, b FROM collate_test1 UNIONALLSELECT a, b FROM collate_test3 ORDERBY2; -- fail SELECT a, b FROM collate_test1 UNIONALLSELECT a, b FROM collate_test3; -- ok SELECT a, b FROM collate_test1 UNIONSELECT a, b FROM collate_test3 ORDERBY2; -- fail SELECT a, b COLLATE"C"FROM collate_test1 UNIONSELECT a, b FROM collate_test3 ORDERBY2; -- ok SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test3 ORDERBY2; -- fail SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test3 ORDERBY2; -- fail
CREATETABLE test_u ASSELECT a, b FROM collate_test1 UNIONALLSELECT a, b FROM collate_test3; -- fail
-- collation mismatch between recursive and non-recursive term WITH RECURSIVE foo(x) AS
(SELECT x FROM (VALUES('a'COLLATE"en_US"),('b')) t(x) UNIONALL SELECT (x || 'c') COLLATE"de_DE"FROM foo WHERE length(x) < 10) SELECT * FROM foo;
-- casting
SELECT CAST('42'AS text COLLATE"C");
SELECT a, CAST(b AS varchar) FROM collate_test1 ORDERBY2; SELECT a, CAST(b AS varchar) FROM collate_test2 ORDERBY2; SELECT a, CAST(b AS varchar) FROM collate_test3 ORDERBY2;
-- propagation of collation in SQL functions (inlined and non-inlined cases) -- and plpgsql functions too
CREATE FUNCTION mylt (text, text) RETURNS boolean LANGUAGE sql AS $$ select $1 < $2 $$;
CREATE FUNCTION mylt_noninline (text, text) RETURNS boolean LANGUAGE sql AS $$ select $1 < $2 limit 1 $$;
CREATE FUNCTION mylt_plpgsql (text, text) RETURNS boolean LANGUAGE plpgsql AS $$ begin return $1 < $2; end $$;
SELECT a.b AS a, b.b AS b, a.b < b.b AS lt,
mylt(a.b, b.b), mylt_noninline(a.b, b.b), mylt_plpgsql(a.b, b.b) FROM collate_test1 a, collate_test1 b ORDERBY a.b, b.b;
SELECT a.b AS a, b.b AS b, a.b < b.b COLLATE"C"AS lt,
mylt(a.b, b.b COLLATE"C"), mylt_noninline(a.b, b.b COLLATE"C"),
mylt_plpgsql(a.b, b.b COLLATE"C") FROM collate_test1 a, collate_test1 b ORDERBY a.b, b.b;
-- collation override in plpgsql
CREATE FUNCTION mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$
declare
xx text := x;
yy text := y;
begin
return xx < yy;
end
$$;
SELECT mylt2('a', 'B' collate "en_US") as t, mylt2('a', 'B' collate "C") as f;
CREATEORREPLACE FUNCTION
mylt2 (x text, y text) RETURNS boolean LANGUAGE plpgsql AS $$
declare
xx text COLLATE"POSIX" := x;
yy text := y;
begin
return xx < yy;
end
$$;
SELECT mylt2('a', 'B') as f; SELECT mylt2('a', 'B' collate "C") as fail; -- conflicting collations SELECT mylt2('a', 'B' collate "POSIX") as f;
-- polymorphism
SELECT * FROM unnest((SELECT array_agg(b ORDERBY b) FROM collate_test1)) ORDERBY1; SELECT * FROM unnest((SELECT array_agg(b ORDERBY b) FROM collate_test2)) ORDERBY1; SELECT * FROM unnest((SELECT array_agg(b ORDERBY b) FROM collate_test3)) ORDERBY1;
CREATE FUNCTION dup (anyelement) RETURNS anyelement AS'select $1' LANGUAGE sql;
SELECT a, dup(b) FROM collate_test1 ORDERBY2; SELECT a, dup(b) FROM collate_test2 ORDERBY2; SELECT a, dup(b) FROM collate_test3 ORDERBY2;
-- indexes
CREATEINDEX collate_test1_idx1 ON collate_test1 (b); CREATEINDEX collate_test1_idx2 ON collate_test1 (b COLLATE"C"); CREATEINDEX collate_test1_idx3 ON collate_test1 ((b COLLATE"C")); -- this is different grammatically CREATEINDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE"POSIX"));
CREATEINDEX collate_test1_idx5 ON collate_test1 (a COLLATE"C"); -- fail CREATEINDEX collate_test1_idx6 ON collate_test1 ((a COLLATE"C")); -- fail
SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE'collate_test%_idx%'ORDERBY1;
-- schema manipulation commands
CREATE ROLE regress_test_role; CREATESCHEMA test_schema;
-- We need to do this this way to cope with varying names for encodings:
do $$
BEGIN
EXECUTE 'CREATE COLLATION test0 (locale = ' ||
quote_literal((SELECT datcollate FROM pg_database WHERE datname = current_database())) || ');';
END
$$; CREATE COLLATION test0 FROM"C"; -- fail, duplicate name CREATE COLLATION IFNOTEXISTS test0 FROM"C"; -- ok, skipped CREATE COLLATION IFNOTEXISTS test0 (locale = 'foo'); -- ok, skipped
do $$
BEGIN
EXECUTE 'CREATE COLLATION test1 (lc_collate = ' ||
quote_literal((SELECT datcollate FROM pg_database WHERE datname = current_database())) || ', lc_ctype = ' ||
quote_literal((SELECT datctype FROM pg_database WHERE datname = current_database())) || ');';
END
$$; CREATE COLLATION test3 (lc_collate = 'en_US.utf8'); -- fail, need lc_ctype CREATE COLLATION testx (locale = 'nonsense'); -- fail
CREATE COLLATION test4 FROM nonsense; CREATE COLLATION test5 FROM test0;
SELECT collname FROM pg_collation WHERE collname LIKE'test%'ORDERBY1;
ALTER COLLATION test1 RENAMETO test11; ALTER COLLATION test0 RENAMETO test11; -- fail ALTER COLLATION test1 RENAMETO test22; -- fail
ALTER COLLATION test11 OWNER TO regress_test_role; ALTER COLLATION test11 OWNER TO nonsense; ALTER COLLATION test11 SETSCHEMA test_schema;
COMMENT ON COLLATION test0 IS'US English';
SELECT collname, nspname, obj_description(pg_collation.oid, 'pg_collation') FROM pg_collation JOIN pg_namespace ON (collnamespace = pg_namespace.oid) WHERE collname LIKE'test%' ORDERBY1;
DROP COLLATION test0, test_schema.test11, test5; DROP COLLATION test0; -- fail DROP COLLATION IFEXISTS test0;
SELECT collname FROM pg_collation WHERE collname LIKE'test%';
DROPSCHEMA test_schema; DROP ROLE regress_test_role;
-- ALTER
ALTER COLLATION "en_US" REFRESH VERSION;
-- also test for database while we are here SELECT current_database() AS datname \gset ALTERDATABASE :"datname" REFRESH COLLATION VERSION;
-- dependencies
CREATE COLLATION test0 FROM"C";
CREATETABLE collate_dep_test1 (a int, b text COLLATE test0); CREATE DOMAIN collate_dep_dom1 AS text COLLATE test0; CREATE TYPE collate_dep_test2 AS (x int, y text COLLATE test0); CREATE VIEW collate_dep_test3 ASSELECT text 'foo'COLLATE test0 AS foo; CREATETABLE collate_dep_test4t (a int, b text); CREATEINDEX collate_dep_test4i ON collate_dep_test4t (b COLLATE test0);
DROP COLLATION test0 RESTRICT; -- fail DROP COLLATION test0 CASCADE;
\d collate_dep_test1
\d collate_dep_test2
DROPTABLE collate_dep_test1, collate_dep_test4t; DROP TYPE collate_dep_test2;
-- test range types and collations
create type textrange_c as range(subtype=text, collation="C");
create type textrange_en_us as range(subtype=text, collation="en_US");
-- nondeterministic collations -- (not supported with libc provider)
do $$
BEGIN
EXECUTE 'CREATE COLLATION ctest_det (locale = ' ||
quote_literal((SELECT collcollate FROM pg_collation WHERE
collname = 'en_US')) || ', deterministic = true);';
END
$$; CREATE COLLATION ctest_nondet (locale = 'en_US', deterministic = false);
-- cleanup SET client_min_messages TO warning; DROPSCHEMA collate_tests CASCADE;
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.14Bemerkung:
(vorverarbeitet am 2026-08-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.