IN predicate and quantified comparison predicates behave incorrectly with NULL ------------------------------------------------------------------------------
Key: CORE-6322 URL: http://tracker.firebirdsql.org/browse/CORE-6322 Project: Firebird Core Issue Type: Bug Components: Engine Affects Versions: 4.0 Beta 2, 3.0.5 Reporter: Mark Rotteveel The IN predicate and quantified comparison predicates behave incorrectly with NULL. According to SQL:2016-2, the result of `null in (non-empty list or query)`, `null = any (non-empty query)`, `null = some (non-empty query)` and `(null = any (non-empty query))` should be `null` (see SQL:2016-2, 8.4 <in predicate> and 8.9 <quantified comparison predicate>). However the actual behaviour is a combination of NULL and FALSE: For example in ISQL: SET LIST; select (null in (select 'a' from RDB$DATABASE)) "IN", (null in (select 'a' from RDB$DATABASE)) is null "IN_ISNULL", (null in (select 'a' from RDB$DATABASE)) is false "IN_ISFALSE", not (null in (select 'a' from RDB$DATABASE)) "NOT_IN", not (not (null in (select 'a' from RDB$DATABASE))) "NOT_NOT_IN", (null = any (select 'a' from RDB$DATABASE)) "ANY", (null = any (select 'a' from RDB$DATABASE)) is null "ANY_ISNULL", (null = any (select 'a' from RDB$DATABASE)) is false "ANY_ISFALSE", not (null = any (select 'a' from RDB$DATABASE)) "NOT_ANY", not (not (null = any (select 'a' from RDB$DATABASE))) "NOT_NOT_ANY", (null = all (select 'a' from RDB$DATABASE)) "ALL", (null = all (select 'a' from RDB$DATABASE)) is null "ALL_ISNULL", (null = all (select 'a' from RDB$DATABASE)) is false "ALL_ISFALSE", not (null = all (select 'a' from RDB$DATABASE)) "NOT_ALL", not (not (null = all (select 'a' from RDB$DATABASE))) "NOT_NOT_ALL" from RDB$DATABASE; results in: IN <false> IN_ISNULL <false> IN_ISFALSE <true> NOT_IN <false> NOT_NOT_IN <false> ANY <false> ANY_ISNULL <false> ANY_ISFALSE <true> NOT_ANY <false> NOT_NOT_ANY <false> ALL <false> ALL_ISNULL <false> ALL_ISFALSE <true> NOT_ALL <false> NOT_NOT_ALL <false> The *_ISNULL columns should be TRUE, and the *_ISFALSE should be FALSE, all other columns should be NULL. On firebird-devel, Vlad suggested that possibly the result is NULL, but not marked as nullable. However with XSQLDA_DISPLAY ON, all columns are marked as nullable. This effect is also visible for: 'a' in (select 'b' from RDB$DATABASE union all select null from RDB$DATABASE) => false (should be null) not ('a' in (select 'b' from RDB$DATABASE union all select null from RDB$DATABASE)) => false (should be null) Interestingly enough, IN with an actual list behaves correctly: null in ('a') => null not(null in ('a')) => null 'a' in ('b', null) => null not('a' in ('b', null)) => null -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://tracker.firebirdsql.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira Firebird-Devel mailing list, web interface at https://lists.sourceforge.net/lists/listinfo/firebird-devel