Thread

  1. Re: BUG #18632: Whether you need to consider modifying the array's handling of delimiters?

    Erik Wienhold <ewie@ewie.name> — 2024-09-25T08:31:59Z

    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