Operator precedence is probably why, although I can't say for sure since I don't know which DBMS you're using.
You have this:
foo IS NULL OR foo >= 1 AND bar = 'foobar'
which is usually the same as saying this:
foo is NULL OR (foo >= 1 AND bar = 'foobar')
except I think you meant to say this:
(foo is NULL or foo >= 1) AND bar = 'foobar'