summaryrefslogtreecommitdiff
path: root/sql/sql_lex.cc
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-12-09 16:33:48 +0100
committerSergei Golubchik <serg@mariadb.org>2016-12-09 16:33:48 +0100
commit3e8155c637096da8fd019c42b78746be2bf89944 (patch)
tree7df7880c789de7c32fdd76e862170322afe6117c /sql/sql_lex.cc
parent106664f8e86d694a9898c3e564bb72290f221bd6 (diff)
parent03dabfa84d6bc9a8197c8d9fbe80f2a7f6a5b6ac (diff)
downloadmariadb-git-3e8155c637096da8fd019c42b78746be2bf89944.tar.gz
Merge branch '5.5' into 10.0
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r--sql/sql_lex.cc22
1 files changed, 19 insertions, 3 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index db54dd6a8b0..9d5f4cfcb5b 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1101,7 +1101,7 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd)
state= (enum my_lex_states) state_map[c];
break;
case MY_LEX_ESCAPE:
- if (lip->yyGet() == 'N')
+ if (!lip->eof() && lip->yyGet() == 'N')
{ // Allow \N as shortcut for NULL
yylval->lex_str.str=(char*) "\\N";
yylval->lex_str.length=2;
@@ -3482,12 +3482,28 @@ bool st_select_lex::add_index_hint (THD *thd, char *str, uint length)
bool st_select_lex::optimize_unflattened_subqueries(bool const_only)
{
- for (SELECT_LEX_UNIT *un= first_inner_unit(); un; un= un->next_unit())
+ SELECT_LEX_UNIT *next_unit= NULL;
+ for (SELECT_LEX_UNIT *un= first_inner_unit();
+ un;
+ un= next_unit ? next_unit : un->next_unit())
{
Item_subselect *subquery_predicate= un->item;
-
+ next_unit= NULL;
+
if (subquery_predicate)
{
+ if (!subquery_predicate->fixed)
+ {
+ /*
+ This subquery was excluded as part of some expression so it is
+ invisible from all prepared expression.
+ */
+ next_unit= un->next_unit();
+ un->exclude_level();
+ if (next_unit)
+ continue;
+ break;
+ }
if (subquery_predicate->substype() == Item_subselect::IN_SUBS)
{
Item_in_subselect *in_subs= (Item_in_subselect*) subquery_predicate;