/* *ThistestisintendedtopassonallplatformssupportedbyPostgres. *Wecanthereforeonlyassumethatthedefault,C,andPOSIXcollations *areavailable--- and since the regression tests are often run in a *C-localedatabase,thesemaywellallhavethesamebehavior.But *fortunately,thesystemdoesn'tknowthatandwilltreatthemas *incompatiblecollations.Itisthereforeatleastpossibletotest *parserbehaviorssuchascollationconflictresolution.Thistestwill, *however,bemorerevealingwhenruninadatabasewithnon-Clocale, *sinceanydeparturefromCsortingbehaviorwillshowasafailure.
*/
CREATESCHEMA collate_tests; SET search_path = collate_tests;
CREATETABLE collate_test1 (
a int,
b text COLLATE"C"NOTNULL
);
\d collate_test1
CREATETABLE collate_test_fail (
a intCOLLATE"C",
b text
);
CREATETABLE collate_test_like ( LIKE collate_test1
);
\d collate_test_like
CREATETABLE collate_test2 (
a int,
b text COLLATE"POSIX"
);
SELECT * FROM collate_test1 WHERE b COLLATE"C" >= 'abc'; SELECT * FROM collate_test1 WHERE b >= 'abc'COLLATE"C"; SELECT * FROM collate_test1 WHERE b COLLATE"C" >= 'abc'COLLATE"C"; SELECT * FROM collate_test1 WHERE b COLLATE"C" >= 'bbc'COLLATE"POSIX"; -- fail
CREATE DOMAIN testdomain_p AS text COLLATE"POSIX"; CREATE DOMAIN testdomain_i ASintCOLLATE"POSIX"; -- fail CREATETABLE collate_test4 (
a int,
b testdomain_p
); INSERTINTO collate_test4 SELECT * FROM collate_test1; SELECT a, b FROM collate_test4 ORDERBY b;
CREATETABLE collate_test5 (
a int,
b testdomain_p COLLATE"C"
); 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_test1 ORDERBY b COLLATE"C";
-- star expansion SELECT * FROM collate_test1 ORDERBY b; SELECT * FROM collate_test2 ORDERBY b;
SELECT a, lower(x), lower(y), upper(x), upper(y), initcap(x), initcap(y) FROM collate_test10; SELECT a, lower(x COLLATE"C"), lower(y COLLATE"C") FROM collate_test10;
SELECT a, x, y FROM collate_test10 ORDERBY lower(y), a;
-- 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"; CREATE VIEW collview3 ASSELECT a, lower((x || x) COLLATE"POSIX") FROM collate_test10;
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, lower(coalesce(x, 'foo')), lower(coalesce(y, 'foo')) FROM collate_test10;
SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDERBY3; SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDERBY3; SELECT a, x, y, lower(greatest(x, 'foo')), lower(greatest(y, 'foo')) FROM collate_test10;
SELECT a, nullif(b, 'abc') FROM collate_test1 ORDERBY2; SELECT a, nullif(b, 'abc') FROM collate_test2 ORDERBY2; SELECT a, lower(nullif(x, 'foo')), lower(nullif(y, 'foo')) FROM collate_test10;
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;
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_p FROM collate_test2 ORDERBY2; SELECT a, lower(x::testdomain), lower(y::testdomain) FROM collate_test10;
SELECT min(b), max(b) FROM collate_test1; SELECT min(b), max(b) FROM collate_test2;
SELECT array_agg(b ORDERBY b) FROM collate_test1; SELECT array_agg(b ORDERBY b) FROM collate_test2;
-- In aggregates, ORDER BY expressions don't affect aggregate's collation SELECT string_agg(x COLLATE"C", y COLLATE"POSIX") FROM collate_test10; -- fail SELECT array_agg(x COLLATE"C"ORDERBY y COLLATE"POSIX") FROM collate_test10; SELECT array_agg(a ORDERBY x COLLATE"C", y COLLATE"POSIX") FROM collate_test10; SELECT array_agg(a ORDERBY x||y) FROM collate_test10; -- fail
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_test2 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test2 WHERE a > 1ORDERBY2; SELECT a, b FROM collate_test2 EXCEPT SELECT a, b FROM collate_test2 WHERE a < 2ORDERBY2;
SELECT a, b FROM collate_test1 UNIONALLSELECT a, b FROM collate_test2 ORDERBY2; -- fail SELECT a, b FROM collate_test1 UNIONALLSELECT a, b FROM collate_test2; -- ok SELECT a, b FROM collate_test1 UNIONSELECT a, b FROM collate_test2 ORDERBY2; -- fail SELECT a, b COLLATE"C"FROM collate_test1 UNIONSELECT a, b FROM collate_test2 ORDERBY2; -- ok SELECT a, b FROM collate_test1 INTERSECT SELECT a, b FROM collate_test2 ORDERBY2; -- fail SELECT a, b FROM collate_test1 EXCEPT SELECT a, b FROM collate_test2 ORDERBY2; -- fail
CREATETABLE test_u ASSELECT a, b FROM collate_test1 UNIONALLSELECT a, b FROM collate_test2; -- fail
-- ideally this would be a parse-time error, but for now it must be run-time: select x < y from collate_test10; -- fail select x || y from collate_test10; -- ok, because || is not collation aware select x, y from collate_test10 orderby x || y; -- not so ok
-- collation mismatch between recursive and non-recursive term WITH RECURSIVE foo(x) AS
(SELECT x FROM (VALUES('a'COLLATE"C"),('b')) t(x) UNIONALL SELECT (x || 'c') COLLATE"POSIX"FROM foo WHERE length(x) < 10) SELECT * FROM foo;
SELECT a, b, a < b as lt FROM
(VALUES ('a', 'B'), ('A', 'b'COLLATE"C")) v(a,b);
-- collation mismatch in subselects SELECT * FROM collate_test10 WHERE (x, y) NOTIN (SELECT y, x FROM collate_test10); -- now it works with overrides SELECT * FROM collate_test10 WHERE (x COLLATE"POSIX", y COLLATE"C") NOTIN (SELECT y, x FROM collate_test10); SELECT * FROM collate_test10 WHERE (x, y) NOTIN (SELECT y COLLATE"C", x COLLATE"POSIX"FROM collate_test10);
-- casting
SELECT CAST('42'AS text COLLATE"C");
SELECT a, CAST(b ASvarchar) FROM collate_test1 ORDERBY2; SELECT a, CAST(b ASvarchar) FROM collate_test2 ORDERBY2;
-- result of a SQL function
CREATE FUNCTION vc (text) RETURNS text LANGUAGE sql AS'select $1::varchar';
SELECT a, b FROM collate_test1 ORDERBY a, vc(b);
-- 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;
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;
-- indexes
CREATEINDEX collate_test1_idx1 ON collate_test1 (b); CREATEINDEX collate_test1_idx2 ON collate_test1 (b COLLATE"POSIX"); CREATEINDEX collate_test1_idx3 ON collate_test1 ((b COLLATE"POSIX")); -- this is different grammatically CREATEINDEX collate_test1_idx4 ON collate_test1 (((b||'foo') COLLATE"POSIX"));
CREATEINDEX collate_test1_idx5 ON collate_test1 (a COLLATE"POSIX"); -- fail CREATEINDEX collate_test1_idx6 ON collate_test1 ((a COLLATE"POSIX")); -- fail
SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE'collate_test%_idx%'ORDERBY1;
-- foreign keys
-- force indexes and mergejoins to be used for FK checking queries, -- else they might not exercise collation-dependent operators SET enable_seqscan TO0; SET enable_hashjoin TO0; SET enable_nestloop TO0;
SELECT collation for ('foo'); -- unknown type - null SELECT collation for ('foo'::text); SELECT collation for ((SELECT a FROM collate_test1 LIMIT1)); -- non-collatable type - error SELECT collation for ((SELECT b FROM collate_test1 LIMIT1));
-- old bug with not dropping COLLATE when coercing to non-collatable type CREATE VIEW collate_on_int AS SELECT c1+1AS c1p FROM
(SELECT ('4'COLLATE"C")::INTAS c1) ss;
\d+ collate_on_int
-- -- Clean up. Many of these table names will be re-used if the user is -- trying to run any platform-specific collation tests later, so we -- must get rid of them. -- DROPSCHEMA collate_tests CASCADE;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-08-08)
¤
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.