| Bug #106063 | Condition on aggregared expr in HAVING clause produces bad result in some cases | ||
|---|---|---|---|
| Submitted: | 5 Jan 2022 12:42 | Modified: | 6 Jan 2022 14:12 |
| Reporter: | Michal Vorisek | Email Updates: | |
| Status: | Duplicate | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
| Version: | 8.0, 8.0.27 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | aggregate, having, regression, wrong result | ||
[5 Jan 2022 12:42]
Michal Vorisek
[5 Jan 2022 13:22]
MySQL Verification Team
Hello Michal Vorisek, Thank you for the report and feedback. regards, Umesh
[5 Jan 2022 13:24]
MySQL Verification Team
- 8.0.27 affected
rm -rf 106063/
bin/mysqld --initialize-insecure --basedir=$PWD --datadir=$PWD/106063 --log-error-verbosity=3
bin/mysqld --no-defaults --basedir=$PWD --datadir=$PWD/106063 --core-file --socket=/tmp/mysql_ushastry.sock --port=3306 --log-error=$PWD/106063/log.err --mysqlx-port=33330 --mysqlx-socket=/tmp/mysql_x_ushastry.sock --log-error-verbosity=3 --secure-file-priv=/tmp/ 2>&1 &
bin/mysql -uroot -S /tmp/mysql_ushastry.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> use test
Database changed
mysql> CREATE TABLE `client` (
-> `id` INT UNSIGNED AUTO_INCREMENT NOT NULL,
-> `name` VARCHAR(255) DEFAULT NULL,
-> `surname` VARCHAR(255) DEFAULT NULL,
-> `order` INT DEFAULT NULL,
-> PRIMARY KEY(`id`)
-> ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql>
mysql> insert into `client` (`name`, `surname`, `order`)
-> values
-> ('Vinny', 'Rad', 2);
Query OK, 1 row affected (0.01 sec)
mysql>
mysql>
mysql> insert into `client` (`name`, `surname`, `order`)
-> values
-> ('Zoe', 'Hansen', 1);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql>
mysql> CREATE TABLE `invoice` (
-> `id` INT UNSIGNED AUTO_INCREMENT NOT NULL,
-> `client_id` INT DEFAULT NULL,
-> `name` VARCHAR(255) DEFAULT NULL,
-> `amount` DOUBLE PRECISION DEFAULT NULL,
-> PRIMARY KEY(`id`)
-> ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql>
mysql> insert into `invoice` (`client_id`, `name`, `amount`)
-> values
-> (1, 'chair purchase', 4);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql>
mysql> insert into `invoice` (`client_id`, `name`, `amount`)
-> values
-> (1, 'table purchase', 15);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql>
mysql> insert into `invoice` (`client_id`, `name`, `amount`)
-> values
-> (2, 'chair purchase', 4);
Query OK, 1 row affected (0.00 sec)
mysql> select
-> (
-> select
-> `name`
-> from
-> (
-> select
-> `id`,
-> `name`,
-> `surname`,
-> `order`
-> from
-> `client`
-> ) `_c_2bfe9d72a4aa`
-> where
-> `id` = `__inner__`.`client_id`
-> ) `client`,
-> `client_id`,
-> sum(`amount`) `amount`
-> from
-> (
-> select
-> `id`,
-> `name`,
-> `client_id`,
-> `amount`
-> from
-> `invoice`
-> ) `__inner__`
-> group by
-> `client_id`
-> having
-> (
-> `client_id` = 2
-> and sum(`amount`) > 3.9
-> and sum(`amount`) < 4.1
-> );
Empty set (0.00 sec)
[5 Jan 2022 13:27]
MySQL Verification Team
-- Looks like regression
-- Lowest checked version 8.0.11 - not affected
bin/mysql -uroot -S /tmp/mysql_ushastry.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database test;
Query OK, 1 row affected (0.03 sec)
mysql> use test
Database changed
mysql> CREATE TABLE `client` (
-> `id` INT UNSIGNED AUTO_INCREMENT NOT NULL,
-> `name` VARCHAR(255) DEFAULT NULL,
-> `surname` VARCHAR(255) DEFAULT NULL,
-> `order` INT DEFAULT NULL,
-> PRIMARY KEY(`id`)
-> ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;
Query OK, 0 rows affected (0.06 sec)
mysql>
mysql>
mysql> insert into `client` (`name`, `surname`, `order`)
-> values
-> ('Vinny', 'Rad', 2);
Query OK, 1 row affected (0.01 sec)
mysql>
mysql>
mysql> insert into `client` (`name`, `surname`, `order`)
-> values
-> ('Zoe', 'Hansen', 1);
Query OK, 1 row affected (0.01 sec)
mysql>
mysql>
mysql> CREATE TABLE `invoice` (
-> `id` INT UNSIGNED AUTO_INCREMENT NOT NULL,
-> `client_id` INT DEFAULT NULL,
-> `name` VARCHAR(255) DEFAULT NULL,
-> `amount` DOUBLE PRECISION DEFAULT NULL,
-> PRIMARY KEY(`id`)
-> ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB;
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql>
mysql> insert into `invoice` (`client_id`, `name`, `amount`)
-> values
-> (1, 'chair purchase', 4);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql>
mysql> insert into `invoice` (`client_id`, `name`, `amount`)
-> values
-> (1, 'table purchase', 15);
Query OK, 1 row affected (0.01 sec)
mysql>
mysql>
mysql> insert into `invoice` (`client_id`, `name`, `amount`)
-> values
-> (2, 'chair purchase', 4);
Query OK, 1 row affected (0.00 sec)
mysql> select
-> (
-> select
-> `name`
-> from
-> (
-> select
-> `id`,
-> `name`,
-> `surname`,
-> `order`
-> from
-> `client`
-> ) `_c_2bfe9d72a4aa`
-> where
-> `id` = `__inner__`.`client_id`
-> ) `client`,
-> `client_id`,
-> sum(`amount`) `amount`
-> from
-> (
-> select
-> `id`,
-> `name`,
-> `client_id`,
-> `amount`
-> from
-> `invoice`
-> ) `__inner__`
-> group by
-> `client_id`
-> having
-> (
-> `client_id` = 2
-> and sum(`amount`) > 3.9
-> and sum(`amount`) < 4.1
-> );
+--------+-----------+--------+
| client | client_id | amount |
+--------+-----------+--------+
| Zoe | 2 | 4 |
+--------+-----------+--------+
1 row in set (0.01 sec)
[6 Jan 2022 14:12]
Erlend Dahl
Duplicate of Bug#105692 Incorrect result with aggregation by temporary table which has been fixed in the upcoming 8.0.28.
