Обсуждение: Handling of \ in array data display
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
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
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
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
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