Consider this table definition: create table t ( i serial, b bool, c bool, constraint b_c check ( (b = true and c is not null ) or (b is distinct from true and c is null) ) constraint b_c check ( (b = true and c is not null ) or (b = false and c is null) or (b is null and c is null) ) ); Despite the above two constraints, the following rows get into the table: insert into t (b , c) values (null, true), (null, false);
(b = TRUE AND c IS NOT NULL) evaluates to null when b is null
yes, constraint is violated only when result is false, no when it is null.