\ escapes in check constraint strings?

Started by Bruno Wolff IIIalmost 22 years ago3 messagesbugs
Jump to latest
#1Bruno Wolff III
bruno@wolff.to

I see the following behaivor on 7.4.3 and 7.4 stable from about a week ago:
bruno=> create table test ();
CREATE TABLE
bruno=> alter table test add constraint test2 check('\\' = '');
ALTER TABLE
bruno=> \d test
Table "public.test"
Column | Type | Modifiers
--------+------+-----------
Check constraints:
"test2" CHECK ('\\'::text = ''::text)

bruno=> select '\\';
?column?
----------
\
(1 row)

I didn't see \\ left as \\ in at least some 7.3 versions.

I think this is a bug, but maybe there are different escape rules for
strings in check constraints.

In the real case that this derives from I was getting a different number
of backslashes than I expected in a regular expression.

#2Bruno Wolff III
bruno@wolff.to
In reply to: Bruno Wolff III (#1)
Re: \ escapes in check constraint strings?

On Fri, Jul 16, 2004 at 16:49:25 -0500,
Bruno Wolff III <bruno@wolff.to> wrote:

I see the following behaivor on 7.4.3 and 7.4 stable from about a week ago:
bruno=> create table test ();
CREATE TABLE
bruno=> alter table test add constraint test2 check('\\' = '');
ALTER TABLE
bruno=> \d test
Table "public.test"
Column | Type | Modifiers
--------+------+-----------
Check constraints:
"test2" CHECK ('\\'::text = ''::text)

bruno=> select '\\';
?column?
----------
\
(1 row)

I didn't see \\ left as \\ in at least some 7.3 versions.

I think this is a bug, but maybe there are different escape rules for
strings in check constraints.

In the real case that this derives from I was getting a different number
of backslashes than I expected in a regular expression.

I think I have figured out what was going on. It looks like [\] in 7.3
regular expressions would try to match a \, but in 7.4 the ] was escaped
resulting in an invalid regular expression. So the real problem was
that in 7.3 I was using something like '[\\]' when I should have been
using '[\\\\]'.
While I was trying to figure out what was going on I was confused by
the \d output putting 2 \s where there was only one. Presumably this
is so the output could be used to recreate the constraint. This seems
reasonable, but it this particular case confused me.

#3Peter Eisentraut
peter_e@gmx.net
In reply to: Bruno Wolff III (#1)
Re: \ escapes in check constraint strings?

Bruno Wolff III wrote:

I see the following behaivor on 7.4.3 and 7.4 stable from about a
week ago: bruno=> create table test ();
CREATE TABLE
bruno=> alter table test add constraint test2 check('\\' = '');
ALTER TABLE
bruno=> \d test
Table "public.test"
Column | Type | Modifiers
--------+------+-----------
Check constraints:
"test2" CHECK ('\\'::text = ''::text)

It prints the SQL source code for the check constraint. There is no
bug, AFAICS.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/