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 ?