[MDEV-13454] Improper error in ONLY_FULL_GROUP_BY sql_mode with condition_pushdown_for_derived=on Created: 2017-08-04  Updated: 2018-01-05  Resolved: 2018-01-05

Status: Closed
Project: MariaDB Server
Component/s: Data Manipulation - Subquery, Parser
Affects Version/s: 10.2.2, 10.2
Fix Version/s: 10.2.12

Type: Bug Priority: Major
Reporter: Alice Sherepa Assignee: Igor Babaev
Resolution: Fixed Votes: 6
Labels: None
Environment:

Ubuntu 16.04


Sprint: 10.2.11

 Description   

Based on StackOverflow question posted by Joyce Babu
https://stackoverflow.com/questions/45146830/non-grouping-field-used-in-having-clause-with-sub-query

With condition_pushdown_for_derived=on (which is default in 10.2) and sql_mode=ONLY_FULL_GROUP_BY, the query from the test case below returns an error:

Non-grouping field 'ct' is used in HAVING clause

The query appears to be valid, and without ONLY_FULL_GROUP_BY and/or with condition_pushdown_for_derived=off it works.

The error message is also incorrect, as there was no HAVING clause in query.

SET  sql_mode = 'ONLY_FULL_GROUP_BY';
 
create table t1 (id int,id2 int);
insert into t1 values (1,1), (2,3),(3,4), (7,2);
 
create table t2(id2 int);
insert  t2 values (1),(2),(3);
 
SELECT * FROM t1 
  LEFT OUTER JOIN 
  (SELECT id2, COUNT(*) as ct FROM t2 GROUP BY id2) vc USING (id2)
WHERE (vc.ct>0);



 Comments   
Comment by Alice Sherepa [ 2017-11-11 ]

 
MariaDB [test]> select version();
+----------------+
| version()      |
+----------------+
| 10.2.2-MariaDB |
+----------------+
1 row in set (0.00 sec)
 
MariaDB [test]> SET  sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [test]> explain extended SELECT * FROM t1 
    ->   LEFT OUTER JOIN 
    ->   (SELECT id2, COUNT(*) as ct FROM t2 GROUP BY id2) vc USING (id2)
    -> WHERE (vc.ct>0);
ERROR 1463 (42000): Non-grouping field 'ct' is used in HAVING clause
 
MariaDB [test]> SET optimizer_switch='condition_pushdown_for_derived=off';
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [test]> explain extended SELECT * FROM t1 
    ->   LEFT OUTER JOIN 
    ->   (SELECT id2, COUNT(*) as ct FROM t2 GROUP BY id2) vc USING (id2)
    -> WHERE (vc.ct>0);
+------+-------------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------+
| id   | select_type | table      | type | possible_keys | key  | key_len | ref         | rows | filtered | Extra                           |
+------+-------------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------+
|    1 | PRIMARY     | t1         | ALL  | NULL          | NULL | NULL    | NULL        |    8 |   100.00 | Using where                     |
|    1 | PRIMARY     | <derived2> | ref  | key0          | key0 | 5       | test.t1.id2 |    2 |   100.00 | Using where                     |
|    2 | DERIVED     | t2         | ALL  | NULL          | NULL | NULL    | NULL        |    6 |   100.00 | Using temporary; Using filesort |
+------+-------------+------------+------+---------------+------+---------+-------------+------+----------+---------------------------------+
3 rows in set, 1 warning (0.00 sec)

Comment by Igor Babaev [ 2017-11-14 ]

The patch for bug mdev-14368 that was pushed into 5.5 fixes the problem.
I've checked this when applying the patch to to 10.2.

Comment by Igor Babaev [ 2018-01-05 ]

This bug is a consequence of the bug mdev-14368 fixed in 5.5.59.

Comment by Igor Babaev [ 2018-01-05 ]

Fixed after a upstream merge from 5.5 where the cause of the bug was removed.

Generated at Thu Feb 08 08:05:43 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.