Loading mysql-test/r/having.result +17 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,23 @@ SUM(a) 6 4 DROP TABLE t1; 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; a 2 3 SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1; a SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1; x a EXPLAIN SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING EXPLAIN SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING DROP table t1; create table t1 (col1 int, col2 varchar(5), col_t1 int); create table t2 (col1 int, col2 varchar(5), col_t2 int); create table t3 (col1 int, col2 varchar(5), col_t3 int); Loading mysql-test/t/having.test +16 −0 Original line number Diff line number Diff line Loading @@ -135,6 +135,22 @@ 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; # End of 4.1 tests # Loading sql/sql_lex.cc +1 −1 Original line number Diff line number Diff line Loading @@ -1122,7 +1122,7 @@ void st_select_lex::init_query() embedding= leaf_tables= 0; item_list.empty(); join= 0; having= where= prep_where= 0; having= prep_having= where= prep_where= 0; olap= UNSPECIFIED_OLAP_TYPE; having_fix_field= 0; context.select_lex= this; Loading sql/sql_lex.h +1 −0 Original line number Diff line number Diff line Loading @@ -474,6 +474,7 @@ class st_select_lex: public st_select_lex_node char *db; Item *where, *having; /* WHERE & HAVING clauses */ Item *prep_where; /* saved WHERE clause for prepared statement processing */ Item *prep_having;/* saved HAVING clause for prepared statement processing */ /* point on lex in which it was created, used in view subquery detection */ st_lex *parent_lex; enum olap_type olap; Loading sql/sql_prepare.cc +12 −7 Original line number Diff line number Diff line Loading @@ -2066,13 +2066,18 @@ void reinit_stmt_before_use(THD *thd, LEX *lex) sl->exclude_from_table_unique_test= FALSE; /* Copy WHERE clause pointers to avoid damaging they by optimisation Copy WHERE, HAVING clause pointers to avoid damaging them by optimisation */ if (sl->prep_where) { sl->where= sl->prep_where->copy_andor_structure(thd); sl->where->cleanup(); } if (sl->prep_having) { sl->having= sl->prep_having->copy_andor_structure(thd); sl->having->cleanup(); } DBUG_ASSERT(sl->join == 0); ORDER *order; /* Fix GROUP list */ Loading Loading
mysql-test/r/having.result +17 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,23 @@ SUM(a) 6 4 DROP TABLE t1; 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; a 2 3 SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1; a SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1; x a EXPLAIN SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING EXPLAIN SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING DROP table t1; create table t1 (col1 int, col2 varchar(5), col_t1 int); create table t2 (col1 int, col2 varchar(5), col_t2 int); create table t3 (col1 int, col2 varchar(5), col_t3 int); Loading
mysql-test/t/having.test +16 −0 Original line number Diff line number Diff line Loading @@ -135,6 +135,22 @@ 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; # End of 4.1 tests # Loading
sql/sql_lex.cc +1 −1 Original line number Diff line number Diff line Loading @@ -1122,7 +1122,7 @@ void st_select_lex::init_query() embedding= leaf_tables= 0; item_list.empty(); join= 0; having= where= prep_where= 0; having= prep_having= where= prep_where= 0; olap= UNSPECIFIED_OLAP_TYPE; having_fix_field= 0; context.select_lex= this; Loading
sql/sql_lex.h +1 −0 Original line number Diff line number Diff line Loading @@ -474,6 +474,7 @@ class st_select_lex: public st_select_lex_node char *db; Item *where, *having; /* WHERE & HAVING clauses */ Item *prep_where; /* saved WHERE clause for prepared statement processing */ Item *prep_having;/* saved HAVING clause for prepared statement processing */ /* point on lex in which it was created, used in view subquery detection */ st_lex *parent_lex; enum olap_type olap; Loading
sql/sql_prepare.cc +12 −7 Original line number Diff line number Diff line Loading @@ -2066,13 +2066,18 @@ void reinit_stmt_before_use(THD *thd, LEX *lex) sl->exclude_from_table_unique_test= FALSE; /* Copy WHERE clause pointers to avoid damaging they by optimisation Copy WHERE, HAVING clause pointers to avoid damaging them by optimisation */ if (sl->prep_where) { sl->where= sl->prep_where->copy_andor_structure(thd); sl->where->cleanup(); } if (sl->prep_having) { sl->having= sl->prep_having->copy_andor_structure(thd); sl->having->cleanup(); } DBUG_ASSERT(sl->join == 0); ORDER *order; /* Fix GROUP list */ Loading