mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 21:12:26 +01:00
Merge rurik.mysql.com:/home/igor/mysql-4.1
into rurik.mysql.com:/home/igor/dev/mysql-4.1-0
This commit is contained in:
commit
cc2fae5244
6 changed files with 57 additions and 11 deletions
|
@ -141,3 +141,20 @@ 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;
|
||||
|
|
|
@ -135,4 +135,20 @@ 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
|
||||
|
|
|
@ -1074,6 +1074,7 @@ void st_select_lex::init_query()
|
|||
item_list.empty();
|
||||
join= 0;
|
||||
where= 0;
|
||||
having= 0;
|
||||
olap= UNSPECIFIED_OLAP_TYPE;
|
||||
having_fix_field= 0;
|
||||
resolve_mode= NOMATTER_MODE;
|
||||
|
@ -1081,6 +1082,7 @@ void st_select_lex::init_query()
|
|||
ref_pointer_array= 0;
|
||||
select_n_having_items= 0;
|
||||
prep_where= 0;
|
||||
prep_having= 0;
|
||||
subquery_in_having= explicit_limit= 0;
|
||||
parsing_place= NO_MATTER;
|
||||
is_item_list_lookup= 0;
|
||||
|
|
|
@ -421,6 +421,7 @@ public:
|
|||
char *db, *db1, *table1, *db2, *table2; /* For outer join using .. */
|
||||
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 */
|
||||
enum olap_type olap;
|
||||
SQL_LIST table_list, group_list; /* FROM & GROUP BY clauses */
|
||||
List<Item> item_list; /* list of fields & expressions */
|
||||
|
|
|
@ -1665,10 +1665,11 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
|
|||
for (; sl; sl= sl->next_select_in_list())
|
||||
{
|
||||
/*
|
||||
Save WHERE clause pointers, because they may be changed
|
||||
Save WHERE, HAVING clause pointers, because they may be changed
|
||||
during query optimisation.
|
||||
*/
|
||||
sl->prep_where= sl->where;
|
||||
sl->prep_having= sl->having;
|
||||
/*
|
||||
Switch off a temporary flag that prevents evaluation of
|
||||
subqueries in statement prepare.
|
||||
|
@ -1694,13 +1695,18 @@ static void reset_stmt_for_execute(Prepared_statement *stmt)
|
|||
/* remove option which was put by mysql_explain_union() */
|
||||
sl->options&= ~SELECT_DESCRIBE;
|
||||
/*
|
||||
Copy WHERE clause pointers to avoid damaging they by optimisation
|
||||
Copy WHERE, HAVING clause pointers to avoid damaging they 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 */
|
||||
|
|
|
@ -501,12 +501,18 @@ JOIN::optimize()
|
|||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (cond_value == Item::COND_FALSE ||
|
||||
(!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
|
||||
{ /* Impossible cond */
|
||||
zero_result_cause= "Impossible WHERE";
|
||||
error= 0;
|
||||
DBUG_RETURN(0);
|
||||
{
|
||||
Item::cond_result having_value;
|
||||
having= optimize_cond(thd, having, &having_value);
|
||||
|
||||
if (cond_value == Item::COND_FALSE || having_value == Item::COND_FALSE ||
|
||||
(!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
|
||||
{ /* Impossible cond */
|
||||
zero_result_cause= having_value == Item::COND_FALSE ?
|
||||
"Impossible HAVING" : "Impossible WHERE";
|
||||
error= 0;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Optimize count(*), min() and max() */
|
||||
|
@ -4611,10 +4617,8 @@ optimize_cond(THD *thd, COND *conds, Item::cond_result *cond_value)
|
|||
DBUG_EXECUTE("info", print_where(conds, "after remove"););
|
||||
}
|
||||
else
|
||||
{
|
||||
*cond_value= Item::COND_TRUE;
|
||||
select->prep_where= 0;
|
||||
}
|
||||
|
||||
DBUG_RETURN(conds);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue