Just take a look, please:
WITH toks AS (
SELECT tok
FROM
unnest('{ь, а, чь, ча, чль, чла}'::text[]) AS tok
ORDER BY tok COLLATE "uk_UA"
)
SELECT ROW_NUMBER() OVER() AS "#", tok FROM toks
ORDER BY tok COLLATE "uk_UA"
PostgreSQL 9.3 (ubuntu) gives me this result:
# | tok
---+-----
1 | а
2 | ча
3 | чль
4 | чла
5 | чь
6 | ь
(6 rows)
Here rows 1, 2, 5 and 6 are sorted properly ("ь" goes after "а") while rows 3 and 4 are sorted wrongly ("а" goes after "ь").
All letters are Cyrillic, I've checked so many times.
Please, what's wrong and how to workaround .(
UPDATE: this is a bug which was fixed in mainstream recently: https://sourceware.org/bugzilla/show_bug.cgi?id=17293
UPDATE2: Please note my own answer below.