mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-23 20:07:18 +02:00
As reported in bug #18057, the extension unaccent removes in its rule file whitespace characters that are intentionally specified when building unaccent.rules from UnicodeData.txt, causing an incorrect translation for some characters like numeric symbols. This is caused by the fact that all whitespaces before and after the origin and target characters are all discarded (this limitation is documented). This commit makes possible the use of quotes around target characters, so as whitespaces can be considered part of target characters. Some target characters use a double quote, these require an extra double quote. The documentation is updated to show how to use quoted areas, generate_unaccent_rules.py is updated to generate unaccent.rules and a couple of tests are added for numeric symbols. While working on this patch, I have implemented a fake rule file to test the parsing logic implemented, which is not included here as it would just consume extra cycles in the tests, and it requires the manipulation of an installation tree to be able to work correctly. As this requires a change of format in unaccent.rules, this cannot be backpatched, unfortunately. The idea to use double quotes as escaped characters comes from Tom Lane. Reported-by: Martin Schlossarek Author: Michael Paquier Discussion: https://postgr.es/m/18057-62712cad01bd202c@postgresql.org
182 lines
2.5 KiB
Plaintext
182 lines
2.5 KiB
Plaintext
/*
|
||
* This test must be run in a database with UTF-8 encoding,
|
||
* because other encodings don't support all the characters used.
|
||
*/
|
||
SELECT getdatabaseencoding() <> 'UTF8'
|
||
AS skip_test \gset
|
||
\if :skip_test
|
||
\quit
|
||
\endif
|
||
CREATE EXTENSION unaccent;
|
||
SET client_encoding TO 'UTF8';
|
||
SELECT unaccent('foobar');
|
||
unaccent
|
||
----------
|
||
foobar
|
||
(1 row)
|
||
|
||
SELECT unaccent('ёлка');
|
||
unaccent
|
||
----------
|
||
елка
|
||
(1 row)
|
||
|
||
SELECT unaccent('ЁЖИК');
|
||
unaccent
|
||
----------
|
||
ЕЖИК
|
||
(1 row)
|
||
|
||
SELECT unaccent('˃˖˗˜');
|
||
unaccent
|
||
----------
|
||
>+-~
|
||
(1 row)
|
||
|
||
SELECT unaccent('À'); -- Remove combining diacritical 0x0300
|
||
unaccent
|
||
----------
|
||
A
|
||
(1 row)
|
||
|
||
SELECT unaccent('℃℉'); -- degree signs
|
||
unaccent
|
||
----------
|
||
°C°F
|
||
(1 row)
|
||
|
||
SELECT unaccent('℗'); -- sound recording copyright
|
||
unaccent
|
||
----------
|
||
(P)
|
||
(1 row)
|
||
|
||
SELECT unaccent('1½'); -- math expression with whitespace
|
||
unaccent
|
||
----------
|
||
1 1/2
|
||
(1 row)
|
||
|
||
SELECT unaccent('〝'); -- quote
|
||
unaccent
|
||
----------
|
||
"
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', 'foobar');
|
||
unaccent
|
||
----------
|
||
foobar
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', 'ёлка');
|
||
unaccent
|
||
----------
|
||
елка
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', 'ЁЖИК');
|
||
unaccent
|
||
----------
|
||
ЕЖИК
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', '˃˖˗˜');
|
||
unaccent
|
||
----------
|
||
>+-~
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', 'À');
|
||
unaccent
|
||
----------
|
||
A
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', '℃℉');
|
||
unaccent
|
||
----------
|
||
°C°F
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', '℗');
|
||
unaccent
|
||
----------
|
||
(P)
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', '1½');
|
||
unaccent
|
||
----------
|
||
1 1/2
|
||
(1 row)
|
||
|
||
SELECT unaccent('unaccent', '〝');
|
||
unaccent
|
||
----------
|
||
"
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', 'foobar');
|
||
ts_lexize
|
||
-----------
|
||
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', 'ёлка');
|
||
ts_lexize
|
||
-----------
|
||
{елка}
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', 'ЁЖИК');
|
||
ts_lexize
|
||
-----------
|
||
{ЕЖИК}
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', '˃˖˗˜');
|
||
ts_lexize
|
||
-----------
|
||
{>+-~}
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', 'À');
|
||
ts_lexize
|
||
-----------
|
||
{A}
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', '℃℉');
|
||
ts_lexize
|
||
-----------
|
||
{°C°F}
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', '℗');
|
||
ts_lexize
|
||
-----------
|
||
{(P)}
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', '1½');
|
||
ts_lexize
|
||
-----------
|
||
{"1 1/2"}
|
||
(1 row)
|
||
|
||
SELECT ts_lexize('unaccent', '〝');
|
||
ts_lexize
|
||
-----------
|
||
{"\""}
|
||
(1 row)
|
||
|
||
-- Controversial case. Black-Letter Capital H (U+210C) is translated by
|
||
-- Latin-ASCII.xml as 'x', but it should be 'H'.
|
||
SELECT unaccent('ℌ');
|
||
unaccent
|
||
----------
|
||
x
|
||
(1 row)
|
||
|