From 1deb657299d45307a3cac14ae5f60a2a60ac8f4d Mon Sep 17 00:00:00 2001 From: SungJun Jang Date: Thu, 1 Oct 2026 11:20:08 +0900 Subject: [PATCH v4 1/2] Add tests for EUC_KR encoding properties Check the maximum character length reported for EUC_KR, the handling of strings that mix one-byte (ASCII) and two-byte (KS X 1001) characters, and the rejection of SS2 (0x8E) and SS3 (0x8F) as lead bytes. This records the current behavior, in preparation for a follow-up commit that stops the EUC_KR routines from treating SS2 and SS3 specially. Author: SungJun Jang Reviewed-by: Henson Choi Reviewed-by: Michael Paquier Reviewed-by: John Naylor Discussion: https://postgr.es/m/CAE+cgNgTWvCT2+HZYRzQA8-wSQrj-FjPQQNffn=_3DOpz0pKgA@mail.gmail.com --- src/test/regress/expected/euc_kr.out | 35 ++++++++++++++++++++++++++++ src/test/regress/sql/euc_kr.sql | 16 +++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/test/regress/expected/euc_kr.out b/src/test/regress/expected/euc_kr.out index 7a61c89a43a..9ddf9f85cb0 100644 --- a/src/test/regress/expected/euc_kr.out +++ b/src/test/regress/expected/euc_kr.out @@ -14,3 +14,38 @@ SELECT POSITION( 5 (1 row) +-- Maximum number of bytes per character. +SELECT pg_encoding_max_length(pg_char_to_encoding('EUC_KR')); + pg_encoding_max_length +------------------------ + 3 +(1 row) + +-- Code set 0 (ASCII) characters take one byte and code set 1 (KS X 1001) +-- characters take two. Count, search and match a string mixing both. +SELECT char_length(convert_from('\x41b0fac7d0', 'EUC_KR')); + char_length +------------- + 3 +(1 row) + +SELECT POSITION( + convert_from('\xc7d0', 'EUC_KR') IN + convert_from('\x41b0fac7d0', 'EUC_KR')); + position +---------- + 3 +(1 row) + +SELECT regexp_replace(convert_from('\x41b0fac7d0', 'EUC_KR'), '[^A]', 'x', 'g'); + regexp_replace +---------------- + Axx +(1 row) + +-- Code sets 2 and 3 are not defined for EUC_KR, so SS2 (0x8e) and SS3 (0x8f) +-- are not valid lead bytes. +SELECT convert_from('\x8ea1', 'EUC_KR'); +ERROR: invalid byte sequence for encoding "EUC_KR": 0x8e 0xa1 +SELECT convert_from('\x8fa1a1', 'EUC_KR'); +ERROR: invalid byte sequence for encoding "EUC_KR": 0x8f 0xa1 0xa1 diff --git a/src/test/regress/sql/euc_kr.sql b/src/test/regress/sql/euc_kr.sql index 1851b2a8c14..203a80c4320 100644 --- a/src/test/regress/sql/euc_kr.sql +++ b/src/test/regress/sql/euc_kr.sql @@ -10,3 +10,19 @@ SELECT getdatabaseencoding() NOT IN ('EUC_KR', 'UTF8') AS skip_test \gset SELECT POSITION( convert_from('\xbcf6c7d0', 'EUC_KR') IN convert_from('\xb0fac7d02c20bcf6c7d02c20b1e2bcfa2c20bbee', 'EUC_KR')); + +-- Maximum number of bytes per character. +SELECT pg_encoding_max_length(pg_char_to_encoding('EUC_KR')); + +-- Code set 0 (ASCII) characters take one byte and code set 1 (KS X 1001) +-- characters take two. Count, search and match a string mixing both. +SELECT char_length(convert_from('\x41b0fac7d0', 'EUC_KR')); +SELECT POSITION( + convert_from('\xc7d0', 'EUC_KR') IN + convert_from('\x41b0fac7d0', 'EUC_KR')); +SELECT regexp_replace(convert_from('\x41b0fac7d0', 'EUC_KR'), '[^A]', 'x', 'g'); + +-- Code sets 2 and 3 are not defined for EUC_KR, so SS2 (0x8e) and SS3 (0x8f) +-- are not valid lead bytes. +SELECT convert_from('\x8ea1', 'EUC_KR'); +SELECT convert_from('\x8fa1a1', 'EUC_KR'); -- 2.48.1.windows.1