From what I've read, it looks like 8.1 will introduce the E'' escape
string, and eventually postgresql will change the normal '' strings to
be more SQL-compliant.
If I wanted to start being forwards-compatible right now, and I have
existing databases in 7.4 and 8.0, my idea was to create a type E. Any
string using that type would work in 7.4/8.0 as normal, and then when I
upgrade to 8.1 I will drop the type and the applications will still work.
To do that is relatively simple, I'd just use the textin/out functions
that already exist to create the type (which in 7.4/8.0 will give the
desired behavior of escaping). Like so:
CREATE FUNCTION ein(CSTRING) RETURNS E AS 'textin' LANGUAGE internal;
CREATE FUNCTION eout(E) RETURNS CSTRING AS 'textout' LANGUAGE internal;
CREATE TYPE E (input=ein,output=eout);
CREATE CAST (E AS TEXT) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (TEXT AS E) WITHOUT FUNCTION AS IMPLICIT;
Then, when I upgrade a system to 8.1, I can just remove the type, and
all the applications will still work. Eventually when the '' strings are
changed, I can start using those again, but in a SQL-compliant way.
Does this migration path make sense? Will creating the type possibly
cause casting problems of some kind? I read something about possibly
"backpatching" the E'' string to 8.0. If someone did that, what would be
the difference between applying a backpatch and what I did above?
One thing that has me concerned about the idea is that there are some
string constants, like B'' and X'' that aren't really types. Does that
mean that E'' won't be a type? Why are B'' and X'' not types, and are
there any other notations like that that are not types?
Regards,
Jeff Davis