Insert von backslashs in Text-Arrays

Hallo zusammen,

ich habe ein Verständnisproblem, was das Escapen in Text-Arrays in Postgres 8.3.7 angeht.

Folgende Tabellen :

create table t_text ( txt   text   );  
create table t_strs ( words text[] );

Dazu folgende Inserts:

insert into t_text values ($$BS \X$$);
insert into t_text values ($$BS \\X$$);
insert into t_text values ($$BS \\\X$$);
insert into t_text values ($$BS \\\\X$$);
insert into t_text values ($$BS \\\\\X$$);

insert into t_strs (words) values ($${BS \X}$$);
insert into t_strs (words) values ($${BS \\X}$$);
insert into t_strs (words) values ($${BS \\\X}$$);
insert into t_strs (words) values ($${BS \\\\X}$$);
insert into t_strs (words) values ($${BS \\\\\X}$$);

Select auf beide Tabellen liefert :

txt

BS \X
BS \X
BS \\X
BS \\X
BS \\\X
(5 rows)

words

{“BS X”}
{“BS \X”}
{“BS \X”}
{“BS \\X”}
{“BS \\X”}
(5 rows)

Die Doku sagt dazu, dass das Dollarquoting verhindert , dass die Backslashs vom Escape string processor interpretiert werden. Das heisst, die Strings erreichen unangetastet den Eingang zu den Array-Elementen (Select auf t_text bestätigt das auch).

Vor dem Speichern in einem Array-Element werden die Strings noch mal geparst ( warum eigentlich ? ). Ich würde jetzt erwarten, dass aus

\X -> X
\X -> \X
\\X -> \X
\\X -> \X
\\\X -> \X

wird. So wie’s auschaut bleibt aber eine geradzahlige Anzahl von Backslashs erhalten. Bei einer ungeradzahligen Anzahl ‘verschwindet’ das Letzte, der Rest bleibt.

Gibt’s dafür eine Erklärung ?

Könnte einer der Erfahrenen ein ganz kurzes Feedback zur Frage geben ?
Irgendwas von ‘dumme Frage’ über ‘weiß auch nicht’ bis ‘könnte Bug sein’. Bin leidensfähig, beratungsoffen und vertrag’ was :-).

Von mir nicht. Aber vielleicht hilft Dir dies:

test=# select array['BS \X'];
   array
------------
 {"BS \\X"}
(1 row)

test=*# select array['BS \\X'];
    array
--------------
 {"BS \\\\X"}
(1 row)

test=*# select array['BS \\\X'];
     array
----------------
 {"BS \\\\\\X"}
(1 row)

Damit kannst Du zumindest erst einmal ohne großes Rätselraten Deine Strings in ein ARRAY bekommen.

Andreas

Danke für die Antwort - hat geholfen ;-).

Für die, die vielleicht auch Gefahr laufen, sich verwirren zu lassen, die Erklärung :

Die Ausgabe für words war :

words

{“BS X”}
{“BS \X”}
{“BS \X”}
{“BS \\X”}
{“BS \\X”}
(5 rows)

Dies Ausgabe zeigt Strings die escaped sind !! Also
“BS \X” <-> BS \X
“BS \\X” <-> BS \X

So wie’s sein soll !

Kann man psql anweisen, Strings nicht escaped auszugeben ?