From: Erik Wienhold <ewie@ewie.name>
To: zengman@halodbtech.com
To: pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #18632: Whether you need to consider modifying the array's handling of delimiters?
Date: Wed, 25 Sep 2024 10:31:59 +0200
Message-ID: <44d2a0a2-17ed-4ff9-9076-b05996f2d5a8@ewie.name> (raw)
In-Reply-To: <18632-15cedd7d4154ea2a@postgresql.org>
References: <18632-15cedd7d4154ea2a@postgresql.org>
On 2024-09-25 09:57 +0200, PG Bug reporting form wrote:
> The following bug has been logged on the website:
>
> Bug reference: 18632
> Logged by: Man Zeng
> Email address: zengman@halodbtech.com
> PostgreSQL version: 14.10
> Operating system: centos-8
> Description:
>
> Hi, I found a problem with array separator handling.
> The current handling of delimiters is not quite as expected (not very
> flexible).
> The test SQL and results are shown below.
>
> [postgres@halo-centos-8-release ~]$ psql
> psql (14.10)
> Type "help" for help.
>
> postgres=# CREATE OR REPLACE FUNCTION arrayfunc()
> postgres-# RETURNS _varchar
> postgres-# AS $$
> postgres$# SELECT '{''a,3'',''b'',''c''}'::_varchar;
> postgres$# $$ LANGUAGE SQL;
> CREATE FUNCTION
> postgres=# -- array cstring
> postgres=# SELECT arrayfunc();
> arrayfunc
> -----------------
> {'a,3','b','c'}
> (1 row)
>
> postgres=# -- length is 4
> postgres=# SELECT array_length(arrayfunc(), 1);
> array_length
> --------------
> 4
> (1 row)
>
> postgres=# -- first element
> postgres=# SELECT (arrayfunc())[1];
> arrayfunc
> -----------
> 'a
> (1 row)
>
> postgres=# -- second element
> postgres=# SELECT (arrayfunc())[2];
> arrayfunc
> -----------
> 3'
> (1 row)
You need to double-quote elements that contain the separator:
SELECT '{"''a,3''",''b'',''c''}'::varchar[];
That's also documented in the first paragraph of
https://www.postgresql.org/docs/current/arrays.html#ARRAYS-INPUT
So, not a bug.
> postgres=# -- other
> postgres=# SELECT (arrayfunc())[3];
> arrayfunc
> -----------
> 'b'
> (1 row)
>
> postgres=# SELECT (arrayfunc())[4];
> arrayfunc
> -----------
> 'c'
> (1 row)
>
> postgres=# -- The following SQL tests are as expected
> postgres=# CREATE OR REPLACE FUNCTION arrayfunc2()
> postgres-# RETURNS _varchar
> postgres-# AS $$
> postgres$# SELECT '{''a-3'',''b'',''c''}'::_varchar;
> postgres$# $$ LANGUAGE SQL;
> CREATE FUNCTION
> postgres=# -- array cstring
> postgres=# SELECT arrayfunc2();
> arrayfunc2
> -----------------
> {'a-3','b','c'}
> (1 row)
>
> postgres=# -- length is 3
> postgres=# SELECT array_length(arrayfunc2(), 1);
> array_length
> --------------
> 3
> (1 row)
>
> postgres=# -- first element
> postgres=# SELECT (arrayfunc2())[1];
> arrayfunc2
> ------------
> 'a-3'
> (1 row)
>
> So should we consider modifying "array_in" to enhance the handling of
> separators to be more consistent with people's expectations?
>
--
Erik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: ewie@ewie.name, zengman@halodbtech.com, pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #18632: Whether you need to consider modifying the array's handling of delimiters?
In-Reply-To: <44d2a0a2-17ed-4ff9-9076-b05996f2d5a8@ewie.name>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox