mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 22:12:30 +01:00
07e0cd2f4e
This bug manifested itself for join queries with GROUP BY and HAVING clauses whose SELECT lists contained DISTINCT. It occurred when the optimizer could deduce that the result set would have not more than one row. The bug could lead to wrong result sets for queries of this type because HAVING conditions were erroneously ignored in some cases in the function remove_duplicates.
180 lines
5.3 KiB
Text
180 lines
5.3 KiB
Text
# test of problems with having (Reported by Mark Rogers)
|
|
#
|
|
|
|
--disable_warnings
|
|
drop table if exists t1,t2;
|
|
--enable_warnings
|
|
|
|
create table t1 (a int);
|
|
select count(a) as b from t1 where a=0 having b > 0;
|
|
insert into t1 values (null);
|
|
select count(a) as b from t1 where a=0 having b > 0;
|
|
select count(a) as b from t1 where a=0 having b >=0;
|
|
explain extended select count(a) as b from t1 where a=0 having b >=0;
|
|
drop table t1;
|
|
|
|
#
|
|
# Test of problem with HAVING and AVG()
|
|
#
|
|
|
|
CREATE TABLE t1 (
|
|
raw_id int(10) NOT NULL default '0',
|
|
chr_start int(10) NOT NULL default '0',
|
|
chr_end int(10) NOT NULL default '0',
|
|
raw_start int(10) NOT NULL default '0',
|
|
raw_end int(10) NOT NULL default '0',
|
|
raw_ori int(2) NOT NULL default '0'
|
|
);
|
|
|
|
INSERT INTO t1 VALUES (469713,1,164123,1,164123,1),(317330,164124,317193,101,153170,1),(469434,317194,375620,101,58527,1),(591816,375621,484273,1,108653,1),(591807,484274,534671,91,50488,1),(318885,534672,649362,101,114791,1),(318728,649363,775520,102,126259,1),(336829,775521,813997,101,38577,1),(317740,813998,953227,101,139330,1),(1,813998,953227,101,139330,1);
|
|
|
|
CREATE TABLE t2 (
|
|
id int(10) unsigned NOT NULL default '0',
|
|
contig_id int(10) unsigned NOT NULL default '0',
|
|
seq_start int(10) NOT NULL default '0',
|
|
seq_end int(10) NOT NULL default '0',
|
|
strand tinyint(2) NOT NULL default '0',
|
|
KEY id (id)
|
|
);
|
|
INSERT INTO t2 VALUES (133195,469713,61327,61384,1),(133196,469713,64113,64387,1),(133197,1,1,1,0),(133197,1,1,1,-2);
|
|
SELECT e.id,
|
|
MIN( IF(sgp.raw_ori=1,
|
|
(e.seq_start+sgp.chr_start-sgp.raw_start),
|
|
(sgp.chr_start+sgp.raw_end-e.seq_end))) as start,
|
|
MAX( IF(sgp.raw_ori=1,
|
|
(e.seq_end+sgp.chr_start-sgp.raw_start),
|
|
(sgp.chr_start+sgp.raw_end-e.seq_start))) as end,
|
|
AVG(IF (sgp.raw_ori=1,e.strand,(-e.strand))) as chr_strand
|
|
FROM t1 sgp,
|
|
t2 e
|
|
WHERE sgp.raw_id=e.contig_id
|
|
GROUP BY e.id
|
|
HAVING chr_strand= -1 and end >= 0
|
|
AND start <= 999660;
|
|
drop table t1,t2;
|
|
|
|
#
|
|
# Test problem with having and MAX() IS NOT NULL
|
|
#
|
|
|
|
CREATE TABLE t1 (Fld1 int(11) default NULL,Fld2 int(11) default NULL);
|
|
INSERT INTO t1 VALUES (1,10),(1,20),(2,NULL),(2,NULL),(3,50);
|
|
select Fld1, max(Fld2) as q from t1 group by Fld1 having q is not null;
|
|
select Fld1, max(Fld2) from t1 group by Fld1 having max(Fld2) is not null;
|
|
select Fld1, max(Fld2) from t1 group by Fld1 having avg(Fld2) is not null;
|
|
select Fld1, max(Fld2) from t1 group by Fld1 having std(Fld2) is not null;
|
|
select Fld1, max(Fld2) from t1 group by Fld1 having variance(Fld2) is not null;
|
|
drop table t1;
|
|
|
|
#
|
|
# Test problem with count(distinct) in having
|
|
#
|
|
create table t1 (id int not null, qty int not null);
|
|
insert into t1 values (1,2),(1,3),(2,4),(2,5);
|
|
select id, sum(qty) as sqty from t1 group by id having sqty>2;
|
|
select sum(qty) as sqty from t1 group by id having count(id) > 0;
|
|
select sum(qty) as sqty from t1 group by id having count(distinct id) > 0;
|
|
drop table t1;
|
|
|
|
#
|
|
# Test case for Bug #4358 Problem with HAVING clause that uses alias from the
|
|
# select list and TEXT field
|
|
#
|
|
|
|
CREATE TABLE t1 (
|
|
`id` bigint(20) NOT NULL default '0',
|
|
`description` text
|
|
) ENGINE=MyISAM;
|
|
|
|
CREATE TABLE t2 (
|
|
`id` bigint(20) NOT NULL default '0',
|
|
`description` varchar(20)
|
|
) ENGINE=MyISAM;
|
|
|
|
INSERT INTO t1 VALUES (1, 'test');
|
|
INSERT INTO t2 VALUES (1, 'test');
|
|
|
|
CREATE TABLE t3 (
|
|
`id` bigint(20) NOT NULL default '0',
|
|
`order_id` bigint(20) NOT NULL default '0'
|
|
) ENGINE=MyISAM;
|
|
|
|
select
|
|
a.id, a.description,
|
|
count(b.id) as c
|
|
from t1 a left join t3 b on a.id=b.order_id
|
|
group by a.id, a.description
|
|
having (a.description is not null) and (c=0);
|
|
|
|
select
|
|
a.*,
|
|
count(b.id) as c
|
|
from t2 a left join t3 b on a.id=b.order_id
|
|
group by a.id, a.description
|
|
having (a.description is not null) and (c=0);
|
|
|
|
INSERT INTO t1 VALUES (2, 'test2');
|
|
|
|
select
|
|
a.id, a.description,
|
|
count(b.id) as c
|
|
from t1 a left join t3 b on a.id=b.order_id
|
|
group by a.id, a.description
|
|
having (a.description is not null) and (c=0);
|
|
drop table t1,t2,t3;
|
|
|
|
#
|
|
# Bug #14274: HAVING clause containing only set function
|
|
#
|
|
|
|
CREATE TABLE t1 (a int);
|
|
INSERT INTO t1 VALUES (3), (4), (1), (3), (1);
|
|
|
|
SELECT SUM(a) FROM t1 GROUP BY a HAVING SUM(a)>0;
|
|
SELECT SUM(a) FROM t1 GROUP BY a HAVING SUM(a);
|
|
|
|
DROP TABLE t1;
|
|
|
|
#
|
|
# Bug #14927: HAVING clause containing constant false conjunct
|
|
#
|
|
|
|
CREATE TABLE t1 (a int);
|
|
INSERT INTO t1 VALUES (1), (2), (1), (3), (2), (1);
|
|
|
|
SELECT a FROM t1 GROUP BY a HAVING a > 1;
|
|
SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
|
|
SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;
|
|
|
|
EXPLAIN SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
|
|
EXPLAIN SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;
|
|
|
|
DROP table t1;
|
|
|
|
#
|
|
# Bug #29911: HAVING clause depending on constant table and evaluated to false
|
|
#
|
|
|
|
CREATE TABLE t1 (a int PRIMARY KEY);
|
|
CREATE TABLE t2 (b int PRIMARY KEY, a int);
|
|
CREATE TABLE t3 (b int, flag int);
|
|
|
|
INSERT INTO t1 VALUES (1);
|
|
INSERT INTO t2 VALUES (1,1), (2,1), (3,1);
|
|
INSERT INTO t3(b,flag) VALUES (2, 1);
|
|
|
|
SELECT t1.a
|
|
FROM t1 INNER JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.b=t3.b
|
|
GROUP BY t1.a, t2.b HAVING MAX(t3.flag)=0;
|
|
|
|
SELECT DISTINCT t1.a, MAX(t3.flag)
|
|
FROM t1 INNER JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.b=t3.b
|
|
GROUP BY t1.a, t2.b HAVING MAX(t3.flag)=0;
|
|
|
|
SELECT DISTINCT t1.a
|
|
FROM t1 INNER JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.b=t3.b
|
|
GROUP BY t1.a, t2.b HAVING MAX(t3.flag)=0;
|
|
|
|
DROP TABLE t1,t2,t3;
|
|
|
|
# End of 4.1 tests
|