Обсуждение: Handling of \ in array data display

Поиск
Список
Период
Сортировка

Handling of \ in array data display

От
Josh Berkus
Дата:
Issue: \ is escaped oddly when displaying the contents of array fields.
Severity: annoyance
Affects: 8.1.3, 8.1.4, 8.0.3, possibly others.
Demonstration of bug:

When saving \ escaped values into text array fields, the \ is escaped when
displaying the contents of the array, leading to an appearance that the
correct data was not saved:

scratch=# create table test_arr ( tarr text[] );
CREATE TABLE
scratch=# insert into test_arr values ( array['x\y','x\\y','x y'] );
INSERT 5695623 1
scratch=# select * from test_arr;
       tarr
-------------------
 {xy,"x\\y","x y"}
(1 row)

scratch=# select tarr[1] from test_arr;
 tarr
------
 xy
(1 row)

scratch=# select tarr[2] from test_arr;
 tarr
------
 x\y
(1 row)

--
--Josh

Josh Berkus
PostgreSQL @ Sun
San Francisco

Re: Handling of \ in array data display

От
Alvaro Herrera
Дата:
Josh Berkus wrote:

> When saving \ escaped values into text array fields, the \ is escaped when
> displaying the contents of the array, leading to an appearance that the
> correct data was not saved:
>
> scratch=# create table test_arr ( tarr text[] );
> CREATE TABLE
> scratch=# insert into test_arr values ( array['x\y','x\\y','x y'] );
> INSERT 5695623 1
> scratch=# select * from test_arr;
>        tarr
> -------------------
>  {xy,"x\\y","x y"}
> (1 row)

> scratch=# select tarr[2] from test_arr;
>  tarr
> ------
>  x\y
> (1 row)

tarr[1] does not have a \, because it was eaten by the parser (so \y is
the same as a plain y).  tarr[2] does have a single backslash, which for
output purposes is shown escaped with another backslash when part of an
array, but unescaped when not.  I'm not sure if this qualifies as a bug
or not.

You can pass the array back and it will be valid, but amusingly you must
escape tarr[2] before passing it back.

--
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

Re: Handling of \ in array data display

От
Josh Berkus
Дата:
Alvaro,

> tarr[1] does not have a \, because it was eaten by the parser (so \y is
> the same as a plain y).  tarr[2] does have a single backslash, which for
> output purposes is shown escaped with another backslash when part of an
> array, but unescaped when not.  I'm not sure if this qualifies as a bug
> or not.

I think it does.   It's not consistent with how text values not in an array
are displayed.   The whole reason I reported it was because of a user
thinking their data wasn't being saved correctly, so it's causing
confusion.

FWIW, I personaly think we should be using the ARRAY[] format for display
anyway, but that would break some backwards compatibility ...

--
--Josh

Josh Berkus
PostgreSQL @ Sun
San Francisco

Re: Handling of \ in array data display

От
Tom Lane
Дата:
Josh Berkus <josh@agliodbs.com> writes:
>> tarr[1] does not have a \, because it was eaten by the parser (so \y is
>> the same as a plain y).  tarr[2] does have a single backslash, which for
>> output purposes is shown escaped with another backslash when part of an
>> array, but unescaped when not.  I'm not sure if this qualifies as a bug
>> or not.

> I think it does.

This is documented behavior for arrays:
http://developer.postgresql.org/docs/postgres/arrays.html#AEN5764
and has been that way for a very long time.  If we change it we will
break every array-using application on the planet, because it will
in fact be impossible to parse an array value unambiguously.

I don't think "one user was confused" justifies fooling with this.

            regards, tom lane

Re: Handling of \ in array data display

От
Josh Berkus
Дата:
Tom,

> This is documented behavior for arrays:
> http://developer.postgresql.org/docs/postgres/arrays.html#AEN5764
> and has been that way for a very long time.  If we change it we will
> break every array-using application on the planet, because it will
> in fact be impossible to parse an array value unambiguously.

Ok, so "yes, it's inconsistent, but we don't want to break backwards
compatibility."  I can buy that ...

--
--Josh

Josh Berkus
PostgreSQL @ Sun
San Francisco