mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
Merge mysql.com:/d2/hf/common/my41-common
into mysql.com:/d2/hf/opt/my41-opt
This commit is contained in:
commit
5b1b0a6ff4
4 changed files with 44 additions and 3 deletions
|
@ -3013,3 +3013,16 @@ t3 CREATE TABLE `t3` (
|
|||
`a` datetime default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
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;
|
|||
|
||||
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
|
||||
|
|
|
@ -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() == REF_ITEM) &&
|
||||
!join->conds && !join->having &&
|
||||
/*
|
||||
switch off this optimisation for prepare statement,
|
||||
because we do not rollback this changes
|
||||
|
@ -374,8 +375,6 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
|
|||
*/
|
||||
substitution->walk(&Item::remove_dependence_processor,
|
||||
(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_OK;
|
||||
|
@ -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
|
||||
|
||||
|
|
|
@ -301,7 +301,7 @@ public:
|
|||
enum Item_result type() { return res_type; }
|
||||
enum_field_types field_type() { return res_field_type; }
|
||||
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;
|
||||
static table_map calc_const_tables(TABLE_LIST *);
|
||||
virtual void print(String *str)= 0;
|
||||
|
@ -335,6 +335,7 @@ public:
|
|||
void print (String *str);
|
||||
int change_item(Item_subselect *si, select_subselect *result);
|
||||
bool no_tables();
|
||||
bool may_be_null();
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue