[MDEV-26821] Wrong result: HAVING evaluates NULL = NULL as true, SELECT from view returns extra rows Created: 2021-10-13  Updated: 2023-11-28

Status: Confirmed
Project: MariaDB Server
Component/s: Optimizer, Views
Affects Version/s: 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 10.10
Fix Version/s: 10.4, 10.5, 10.6

Type: Bug Priority: Minor
Reporter: Elena Stepanova Assignee: Sergei Petrunia
Resolution: Unresolved Votes: 0
Labels: 11.0-sel


 Description   

Priority is set to minor due to the artificiality of the query

create or replace table t (a int);
insert into t values (1),(2);
create or replace view v as select if(a = 1,'Y','N') AS b from t;
select v2.b AS f from v v1 left join v v2 ON (false) having (f = f);
 
# With ORDER BY, result set is empty as expected
select v2.b AS f from v v1 left join v v2 ON (false) having (f = f) order by f;
 
# Cleanup
drop view v;
drop table t;

10.4 dc6bc85cd2

MariaDB [test]> select v2.b AS f from v v1 left join v v2 ON (false) having (f = f);
+------+
| f    |
+------+
| NULL |
| NULL |
+------+
2 rows in set (0.006 sec)
 
MariaDB [test]> select v2.b AS f from v v1 left join v v2 ON (false) having (f = f) order by f;
Empty set (0.002 sec)

MariaDB [test]> explain extended select v2.b AS f from v v1 left join v v2 ON (false) having (f = f);
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------------------------------------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                           |
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------------------------------------------+
|    1 | SIMPLE      | t     | ALL  | NULL          | NULL | NULL    | NULL | 2    |   100.00 |                                                 |
|    1 | SIMPLE      | t     | ALL  | NULL          | NULL | NULL    | NULL | 2    |   100.00 | Using where; Using join buffer (flat, BNL join) |
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------------------------------------------+
2 rows in set, 1 warning (0.001 sec)
 
MariaDB [test]> show warnings;
+-------+------+--------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                            |
+-------+------+--------------------------------------------------------------------------------------------------------------------+
| Note  | 1003 | select if(`test`.`t`.`a` = 1,'Y','N') AS `f` from `test`.`t` left join (`test`.`t`) on(0) where 1 having `b` = `b` |
+-------+------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)

Reproducible on 10.2-10.7, with at least InnoDB and MyISAM.


Generated at Thu Feb 08 09:48:12 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.