Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vqq7E-001ZG2-37 for pgsql-bugs@arkaria.postgresql.org; Fri, 13 Feb 2026 10:09:38 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vqq7E-00DZMy-10 for pgsql-bugs@arkaria.postgresql.org; Fri, 13 Feb 2026 10:09:37 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vqntL-00D3Ck-33 for pgsql-bugs@lists.postgresql.org; Fri, 13 Feb 2026 07:47:08 +0000 Received: from mahout.postgresql.org ([2001:4800:3e1:1::227]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vqntK-00000000S2d-15Z7 for pgsql-bugs@lists.postgresql.org; Fri, 13 Feb 2026 07:47:08 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=postgresql.org; s=20171124; h=Message-ID:Date:Reply-To:Cc:From:To:Subject: Content-Transfer-Encoding:MIME-Version:Content-Type:Sender:Content-ID: Content-Description:In-Reply-To:References; bh=Niqk/Ayt1QBzpXVk6cvse72UHKUiff80YfKMBUskXLU=; b=UcSGX/YD/TWnKO/kpucONjJgu4 RsMadyGGto4vcgPB2phCxl9o6BoB8sFEpVwEuCNSD3IbFA+B0Z28+/m+Sp60IK3SC4X72OYd7U4+I jKnMxVUU7E0rhray0zTgsz7Na6oZOAwx5LaAe2C1kCjT/zNwal4XUrCGsrr7SyTfZe4MBFB+TW0J9 59G84aZBm5eUxPNQmByl1fIlx0Ij548HfYkPBM8i2cQ1rRWtOpMKkuRJNQdse8f2vB7Ejx/ju6UUi RjTcCElwofLwzow12FN9z46KxQ1u0fHVaJYMjuPzJWVANh4ZCvQspNwyXG03GjDzS0p9Z+BMRN368 sNvVDDbg==; Received: from wrigleys.postgresql.org ([2a02:16a8:dc51::60]) by mahout.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vqntI-001FAc-1T for pgsql-bugs@lists.postgresql.org; Fri, 13 Feb 2026 07:47:05 +0000 Received: from localhost ([127.0.0.1] helo=wrigleys.postgresql.org) by wrigleys.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vqntG-002rcS-27 for pgsql-bugs@lists.postgresql.org; Fri, 13 Feb 2026 07:47:03 +0000 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Subject: BUG #19406: substring(text) fails on valid UTF-8 toasted value in PostgreSQL 15.16 To: pgsql-bugs@lists.postgresql.org From: PG Bug reporting form Cc: ranvis@gmail.com Reply-To: ranvis@gmail.com, pgsql-bugs@lists.postgresql.org Date: Fri, 13 Feb 2026 07:46:22 +0000 Message-ID: <19406-9867fddddd724fca@postgresql.org> X-Auto-Response-Suppress: All Auto-Submitted: auto-generated List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk The following bug has been logged on the website: Bug reference: 19406 Logged by: SAT=C5=8C Kentar=C5=8D Email address: ranvis@gmail.com PostgreSQL version: 15.16 Operating system: Linux 5.14.0-611.27.1.el9_7.x86_64 Description: =20 After upgrading from PostgreSQL 15.15 to 15.16, substring(text) raises: >ERROR: invalid byte sequence for encoding "UTF8": 0xe6 0x97 on valid UTF-8 text stored in a TOAST-compressed column. The same SQL works on PostgreSQL 15.15. The data is valid UTF-8. The problem occurs only when operating on a TOAST-compressed value. Steps to Reproduce: $ psql psql (15.16) Type "help" for help. user=3D> \x Expanded display is on. user=3D> \set VERBOSITY verbose user=3D> create table toast_repro (data text); CREATE TABLE user=3D> insert into toast_repro select repeat('=E6=97=A5=E5=90=91', 2000);= -- e6 97 a5 e5 90 91 INSERT 0 1 user=3D> select pg_column_size(data), octet_length(data) from toast_repro; -[ RECORD 1 ]--+------ pg_column_size | 153 octet_length | 12000 user=3D> select substring(data from 1 for 2) from toast_repro; -[ RECORD 1 ]--- substring | =E6=97=A5=E5=90=91 user=3D> select substring(data from 1 for 1) from toast_repro; ERROR: 22021: invalid byte sequence for encoding "UTF8": 0xe6 0x97 LOCATION: report_invalid_encoding_int, mbutils.c:1796 user=3D> select substring('=E6=97=A5=E5=90=91' from 1 for 1); -[ RECORD 1 ]- substring | =E6=97=A5 user=3D> select substring(data::varchar(100) from 1 for 1) from toast_repro; -[ RECORD 1 ]- substring | =E6=97=A5 user=3D> select substring(data from 1 for 1) from ( select data || '' as da= ta from toast_repro) t; -[ RECORD 1 ]- substring | =E6=97=A5 Environment: version | PostgreSQL 15.16 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-11), 64-bit server_encoding | UTF8 client_encoding | UTF8 lc_collate | ja_JP.UTF-8 lc_ctype | ja_JP.UTF-8