diff options
author | Sergei Golubchik <serg@mariadb.org> | 2016-12-09 16:33:48 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2016-12-09 16:33:48 +0100 |
commit | 3e8155c637096da8fd019c42b78746be2bf89944 (patch) | |
tree | 7df7880c789de7c32fdd76e862170322afe6117c /sql/sql_lex.cc | |
parent | 106664f8e86d694a9898c3e564bb72290f221bd6 (diff) | |
parent | 03dabfa84d6bc9a8197c8d9fbe80f2a7f6a5b6ac (diff) | |
download | mariadb-git-3e8155c637096da8fd019c42b78746be2bf89944.tar.gz |
Merge branch '5.5' into 10.0
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r-- | sql/sql_lex.cc | 22 |
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; |