SELECT getdatabaseencoding() <> 'UTF8' AS skip_test \gset \if :skip_test \quit \endif SELECT U&'\0061\0308bc' <> U&'\00E4bc' COLLATE "C" AS sanity_check; sanity_check -------------- t (1 row) SELECT unicode_version() IS NOT NULL; ?column? ---------- t (1 row) SELECT unicode_assigned(U&'abc'); unicode_assigned ------------------ t (1 row) SELECT unicode_assigned(U&'abc\+10FFFF'); unicode_assigned ------------------ f (1 row) SELECT normalize(''); normalize ----------- (1 row) SELECT normalize(U&'\0061\0308\24D1c') = U&'\00E4\24D1c' COLLATE "C" AS test_default; test_default -------------- t (1 row) SELECT normalize(U&'\0061\0308\24D1c', NFC) = U&'\00E4\24D1c' COLLATE "C" AS test_nfc; test_nfc ---------- t (1 row) SELECT normalize(U&'\00E4bc', NFC) = U&'\00E4bc' COLLATE "C" AS test_nfc_idem; test_nfc_idem --------------- t (1 row) SELECT normalize(U&'\00E4\24D1c', NFD) = U&'\0061\0308\24D1c' COLLATE "C" AS test_nfd; test_nfd ---------- t (1 row) SELECT normalize(U&'\0061\0308\24D1c', NFKC) = U&'\00E4bc' COLLATE "C" AS test_nfkc; test_nfkc ----------- t (1 row) SELECT normalize(U&'\00E4\24D1c', NFKD) = U&'\0061\0308bc' COLLATE "C" AS test_nfkd; test_nfkd ----------- t (1 row) SELECT "normalize"('abc', 'def'); -- run-time error ERROR: invalid normalization form: def SELECT U&'\00E4\24D1c' IS NORMALIZED AS test_default; test_default -------------- t (1 row) SELECT U&'\00E4\24D1c' IS NFC NORMALIZED AS test_nfc; test_nfc ---------- t (1 row) SELECT num, val, val IS NFC NORMALIZED AS NFC, val IS NFD NORMALIZED AS NFD, val IS NFKC NORMALIZED AS NFKC, val IS NFKD NORMALIZED AS NFKD FROM (VALUES (1, U&'\00E4bc'), (2, U&'\0061\0308bc'), (3, U&'\00E4\24D1c'), (4, U&'\0061\0308\24D1c'), (5, '')) vals (num, val) ORDER BY num; num | val | nfc | nfd | nfkc | nfkd -----+-----+-----+-----+------+------ 1 | äbc | t | f | t | f 2 | äbc | f | t | f | t 3 | äⓑc | t | f | f | f 4 | äⓑc | f | t | f | f 5 | | t | t | t | t (5 rows) SELECT is_normalized('abc', 'def'); -- run-time error ERROR: invalid normalization form: def