Commit 9bf2ed95 authored by unknown's avatar unknown
Browse files

Fixed bug #21853: assert failure for a grouping query with

an ALL/ANY quantified subquery in HAVING.
The Item::split_sum_func2 method should not create Item_ref
for objects of any class derived from Item_subselect.


mysql-test/r/subselect.result:
  Added a test case for bug #21853.
mysql-test/t/subselect.test:
  Added a test case for bug #21853.
parent 0f50a8a7
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -2946,3 +2946,39 @@ ORDER BY t2.c, t2.b LIMIT 1) WHERE t1.a = 10;
a	a	b
10	1	359
drop table t1,t2;
CREATE TABLE t1 (                  
field1 int NOT NULL,                 
field2 int NOT NULL,                 
field3 int NOT NULL,                 
PRIMARY KEY  (field1,field2,field3)  
);
CREATE TABLE t2 (             
fieldA int NOT NULL,            
fieldB int NOT NULL,            
PRIMARY KEY  (fieldA,fieldB)     
);
INSERT INTO t1 VALUES
(1,1,1), (1,1,2), (1,2,1), (1,2,2), (1,2,3), (1,3,1);
INSERT INTO t2 VALUES (1,1), (1,2), (1,3);
SELECT field1, field2, COUNT(*)
FROM t1 GROUP BY field1, field2;
field1	field2	COUNT(*)
1	1	2
1	2	3
1	3	1
SELECT field1, field2
FROM  t1
GROUP BY field1, field2
HAVING COUNT(*) >= ALL (SELECT fieldB 
FROM t2 WHERE fieldA = field1);
field1	field2
1	2
SELECT field1, field2
FROM  t1
GROUP BY field1, field2
HAVING COUNT(*) < ANY (SELECT fieldB 
FROM t2 WHERE fieldA = field1);
field1	field2
1	1
1	3
DROP TABLE t1, t2;
+37 −0
Original line number Diff line number Diff line
@@ -1911,4 +1911,41 @@ SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r

drop table t1,t2;

#
# Bug #21853: assert failure for a grouping query with
#             an ALL/ANY quantified subquery in HAVING 
#

CREATE TABLE t1 (                  
  field1 int NOT NULL,                 
  field2 int NOT NULL,                 
  field3 int NOT NULL,                 
  PRIMARY KEY  (field1,field2,field3)  
);
CREATE TABLE t2 (             
  fieldA int NOT NULL,            
  fieldB int NOT NULL,            
  PRIMARY KEY  (fieldA,fieldB)     
); 

INSERT INTO t1 VALUES
  (1,1,1), (1,1,2), (1,2,1), (1,2,2), (1,2,3), (1,3,1);
INSERT INTO t2 VALUES (1,1), (1,2), (1,3);

SELECT field1, field2, COUNT(*)
  FROM t1 GROUP BY field1, field2;

SELECT field1, field2
  FROM  t1
    GROUP BY field1, field2
      HAVING COUNT(*) >= ALL (SELECT fieldB 
                                FROM t2 WHERE fieldA = field1);
SELECT field1, field2
  FROM  t1
    GROUP BY field1, field2
      HAVING COUNT(*) < ANY (SELECT fieldB 
                               FROM t2 WHERE fieldA = field1);

DROP TABLE t1, t2;

# End of 4.1 tests
+1 −0
Original line number Diff line number Diff line
@@ -387,6 +387,7 @@ void Item::split_sum_func2(THD *thd, Item **ref_pointer_array,
  }
  else if ((type() == SUM_FUNC_ITEM ||
            (used_tables() & ~PARAM_TABLE_BIT)) &&
           type() != SUBSELECT_ITEM &&
           type() != REF_ITEM)
  {
    /*