BUG #3037: strange behave of CHECK constraint

Started by Pavel Stehuleabout 19 years ago3 messagesbugs
Jump to latest
#1Pavel Stehule
pavel.stehule@gmail.com

The following bug has been logged online:

Bug reference: 3037
Logged by: Pavel Stehule
Email address: pavel.stehule@hotmail.com
PostgreSQL version: 8.3
Operating system: Linux
Description: strange behave of CHECK constraint
Details:

check constraint is incorect for operator SIMILAR

root=# create table products(
barcode char(13) NOT NULL
check (barcode NOT similar to '%[^0-9]%')
);

root=# insert into products values('22');
ERROR: new row for relation "products" violates check constraint
"products_barcode_check"
root=# insert into products values('aa');
ERROR: new row for relation "products" violates check constraint
"products_barcode_check"

root=# select '22' NOT similar to '%[^0-9]%';
?column?
----------
t
(1 řádka)

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Pavel Stehule (#1)
Re: BUG #3037: strange behave of CHECK constraint

"Pavel Stehule" <pavel.stehule@hotmail.com> writes:

root=# create table products(
barcode char(13) NOT NULL
check (barcode NOT similar to '%[^0-9]%')
);

root=# insert into products values('22');
ERROR: new row for relation "products" violates check constraint
"products_barcode_check"

root=# select '22' NOT similar to '%[^0-9]%';
?column?
----------
t

That isn't a counterexample, because you forgot about the trailing
spaces, which can match [^0-9].

regression=# select '22' NOT similar to '%[^0-9]%';
?column?
----------
t
(1 row)

regression=# select '22'::char(13) NOT similar to '%[^0-9]%';
?column?
----------
f
(1 row)

regards, tom lane

#3Pavel Stehule
pavel.stehule@gmail.com
In reply to: Tom Lane (#2)
Re: BUG #3037: strange behave of CHECK constraint

"Pavel Stehule" <pavel.stehule@hotmail.com> writes:

root=# create table products(
barcode char(13) NOT NULL
check (barcode NOT similar to '%[^0-9]%')
);

root=# insert into products values('22');
ERROR: new row for relation "products" violates check constraint
"products_barcode_check"

root=# select '22' NOT similar to '%[^0-9]%';
?column?
----------
t

That isn't a counterexample, because you forgot about the trailing
spaces, which can match [^0-9].

regression=# select '22' NOT similar to '%[^0-9]%';
?column?
----------
t
(1 row)

regression=# select '22'::char(13) NOT similar to '%[^0-9]%';
?column?
----------
f
(1 row)

I see it now. Thank You. It's one trick from Joe Celko and I too late
understand it.

Nice day
Pavel Stehule

_________________________________________________________________
Emotikony a pozadi programu MSN Messenger ozivi vasi konverzaci.
http://messenger.msn.cz/