Merge mysql.com:/d2/hf/common/my41-common

into  mysql.com:/d2/hf/opt/my41-opt
parents 12cd7c7b 24a4d9d3
...@@ -3013,3 +3013,16 @@ t3 CREATE TABLE `t3` ( ...@@ -3013,3 +3013,16 @@ t3 CREATE TABLE `t3` (
`a` datetime default NULL `a` datetime default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1,t2,t3; DROP TABLE t1,t2,t3;
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (1), (2);
SELECT a FROM t1 WHERE (SELECT 1 FROM DUAL WHERE 1=0) > 0;
a
SELECT a FROM t1 WHERE (SELECT 1 FROM DUAL WHERE 1=0) IS NULL;
a
1
2
EXPLAIN SELECT a FROM t1 WHERE (SELECT 1 FROM DUAL WHERE 1=0) IS NULL;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
DROP TABLE t1;
...@@ -1981,4 +1981,16 @@ SHOW CREATE TABLE t3; ...@@ -1981,4 +1981,16 @@ SHOW CREATE TABLE t3;
DROP TABLE t1,t2,t3; DROP TABLE t1,t2,t3;
#
# Bug 24670: subquery witout tables but with a WHERE clause
#
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (1), (2);
SELECT a FROM t1 WHERE (SELECT 1 FROM DUAL WHERE 1=0) > 0;
SELECT a FROM t1 WHERE (SELECT 1 FROM DUAL WHERE 1=0) IS NULL;
EXPLAIN SELECT a FROM t1 WHERE (SELECT 1 FROM DUAL WHERE 1=0) IS NULL;
DROP TABLE t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -350,6 +350,7 @@ Item_singlerow_subselect::select_transformer(JOIN *join) ...@@ -350,6 +350,7 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
*/ */
!(select_lex->item_list.head()->type() == FIELD_ITEM || !(select_lex->item_list.head()->type() == FIELD_ITEM ||
select_lex->item_list.head()->type() == REF_ITEM) && select_lex->item_list.head()->type() == REF_ITEM) &&
!join->conds && !join->having &&
/* /*
switch off this optimisation for prepare statement, switch off this optimisation for prepare statement,
because we do not rollback this changes because we do not rollback this changes
...@@ -374,8 +375,6 @@ Item_singlerow_subselect::select_transformer(JOIN *join) ...@@ -374,8 +375,6 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
*/ */
substitution->walk(&Item::remove_dependence_processor, substitution->walk(&Item::remove_dependence_processor,
(byte *) select_lex->outer_select()); (byte *) select_lex->outer_select());
/* SELECT without FROM clause can't have WHERE or HAVING clause */
DBUG_ASSERT(join->conds == 0 && join->having == 0);
return RES_REDUCE; return RES_REDUCE;
} }
return RES_OK; return RES_OK;
...@@ -1795,6 +1794,22 @@ bool subselect_single_select_engine::no_tables() ...@@ -1795,6 +1794,22 @@ bool subselect_single_select_engine::no_tables()
} }
/*
Check statically whether the subquery can return NULL
SINOPSYS
subselect_single_select_engine::may_be_null()
RETURN
FALSE can guarantee that the subquery never return NULL
TRUE otherwise
*/
bool subselect_single_select_engine::may_be_null()
{
return ((no_tables() && !join->conds && !join->having) ? maybe_null : 1);
}
/* /*
Report about presence of tables in subquery Report about presence of tables in subquery
......
...@@ -301,7 +301,7 @@ class subselect_engine: public Sql_alloc ...@@ -301,7 +301,7 @@ class subselect_engine: public Sql_alloc
enum Item_result type() { return res_type; } enum Item_result type() { return res_type; }
enum_field_types field_type() { return res_field_type; } enum_field_types field_type() { return res_field_type; }
virtual void exclude()= 0; virtual void exclude()= 0;
bool may_be_null() { return maybe_null; }; virtual bool may_be_null() { return maybe_null; };
virtual table_map upper_select_const_tables()= 0; virtual table_map upper_select_const_tables()= 0;
static table_map calc_const_tables(TABLE_LIST *); static table_map calc_const_tables(TABLE_LIST *);
virtual void print(String *str)= 0; virtual void print(String *str)= 0;
...@@ -335,6 +335,7 @@ class subselect_single_select_engine: public subselect_engine ...@@ -335,6 +335,7 @@ class subselect_single_select_engine: public subselect_engine
void print (String *str); void print (String *str);
int change_item(Item_subselect *si, select_subselect *result); int change_item(Item_subselect *si, select_subselect *result);
bool no_tables(); bool no_tables();
bool may_be_null();
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment