Thread: BUG #9820: Parentheses removed in chech constraint

BUG #9820: Parentheses removed in chech constraint

From
ilussier@accovia.com
Date:
The following bug has been logged on the website:

Bug reference:      9820
Logged by:          Isabelle Lussier
Email address:      ilussier@accovia.com
PostgreSQL version: 9.3.2
Operating system:   Windows  (PgAdmin)
Description:

Hi, I'am want to add a check constraint that checks if the first condition
is true OR the second condition is true.  If one of the two conditions is
true, then the check is true.

Example:
alter table table_name add constraint c1 CHECK ( (type = 0 AND field1 IS NOT
NULL AND field2 IS NOT NULL AND field3 IS NOT NULL) OR (type_id = 1 AND
field1 IS NULL AND field2 IS NULL AND field3 IS NULL) )

At the execution of the query, the parentheses that defines condition 1 and
condition 2 are removed.  By removing the parentheses, the expression does
not means the same thing. Why postgresql removes the parentheses or how can
I do the constraint differently?

Re: BUG #9820: Parentheses removed in chech constraint

From
Tom Lane
Date:
ilussier@accovia.com writes:
> alter table table_name add constraint c1 CHECK ( (type = 0 AND field1 IS NOT
> NULL AND field2 IS NOT NULL AND field3 IS NOT NULL) OR (type_id = 1 AND
> field1 IS NULL AND field2 IS NULL AND field3 IS NULL) )

> At the execution of the query, the parentheses that defines condition 1 and
> condition 2 are removed.  By removing the parentheses, the expression does
> not means the same thing.

Sure it does.  AND binds more tightly than OR.

You did not state what your actual problem is, but whether or not the
constraint-printer adds logically redundant parentheses isn't it...

            regards, tom lane