From 1deb657299d45307a3cac14ae5f60a2a60ac8f4d Mon Sep 17 00:00:00 2001
From: SungJun Jang <sjjang112233@gmail.com>
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 <sjjang112233@gmail.com>
Reviewed-by: Henson Choi <assam258@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Reviewed-by: John Naylor <johncnaylorls@gmail.com>
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

