diff options
author | Konstantin Osipov <kostja@sun.com> | 2010-02-02 16:58:15 +0300 |
---|---|---|
committer | Konstantin Osipov <kostja@sun.com> | 2010-02-02 16:58:15 +0300 |
commit | c2fe19883e624ddd0e37768f860fa0853848adb3 (patch) | |
tree | 0aec0b83266060d9cc4c9c65ee047b5fd7a83d96 /sql/sql_yacc.yy | |
parent | 3147bdd0ac34a5c62158b8c28da6ca77e0901f08 (diff) | |
parent | ece5ad57e9b2505732be4b043440d9e5a5dc3b9a (diff) | |
download | mariadb-git-c2fe19883e624ddd0e37768f860fa0853848adb3.tar.gz |
Merge next-mr -> next-4284.
Fix Bug#50555 "handler commands crash server in my_hash_first()"
as a post-merge fix (the new handler tests are not passing
otherwise).
- in hash.c, don't call calc_hash if ! my_hash_inited().
- add tests and results for the test case for Bug#50555
Diffstat (limited to 'sql/sql_yacc.yy')
-rw-r--r-- | sql/sql_yacc.yy | 118 |
1 files changed, 84 insertions, 34 deletions
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index b1a740db9a5..e5a07a1ad1b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -764,10 +764,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %pure_parser /* We have threads */ /* - Currently there are 173 shift/reduce conflicts. + Currently there are 172 shift/reduce conflicts. We should not introduce new conflicts any more. */ -%expect 173 +%expect 172 /* Comments for TOKENS. @@ -7198,50 +7198,63 @@ select_option_list: ; select_option: - STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } - | HIGH_PRIORITY + query_expression_option + | SQL_NO_CACHE_SYM { - if (check_simple_select()) + /* + Allow this flag only on the first top-level SELECT statement, if + SQL_CACHE wasn't specified, and only once per query. + */ + if (Lex->current_select != &Lex->select_lex) + { + my_error(ER_CANT_USE_OPTION_HERE, MYF(0), "SQL_NO_CACHE"); MYSQL_YYABORT; - Lex->lock_option= TL_READ_HIGH_PRIORITY; - Lex->current_select->lock_option= TL_READ_HIGH_PRIORITY; - } - | DISTINCT { Select->options|= SELECT_DISTINCT; } - | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; } - | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } - | SQL_BUFFER_RESULT - { - if (check_simple_select()) + } + else if (Lex->select_lex.sql_cache == SELECT_LEX::SQL_CACHE) + { + my_error(ER_WRONG_USAGE, MYF(0), "SQL_CACHE", "SQL_NO_CACHE"); MYSQL_YYABORT; - Select->options|= OPTION_BUFFER_RESULT; - } - | SQL_CALC_FOUND_ROWS - { - if (check_simple_select()) + } + else if (Lex->select_lex.sql_cache == SELECT_LEX::SQL_NO_CACHE) + { + my_error(ER_DUP_ARGUMENT, MYF(0), "SQL_NO_CACHE"); MYSQL_YYABORT; - Select->options|= OPTION_FOUND_ROWS; - } - | SQL_NO_CACHE_SYM - { - Lex->safe_to_cache_query=0; - Lex->select_lex.options&= ~OPTION_TO_QUERY_CACHE; - Lex->select_lex.sql_cache= SELECT_LEX::SQL_NO_CACHE; + } + else + { + Lex->safe_to_cache_query=0; + Lex->select_lex.options&= ~OPTION_TO_QUERY_CACHE; + Lex->select_lex.sql_cache= SELECT_LEX::SQL_NO_CACHE; + } } | SQL_CACHE_SYM { - /* - Honor this flag only if SQL_NO_CACHE wasn't specified AND - we are parsing the outermost SELECT in the query. - */ - if (Lex->select_lex.sql_cache != SELECT_LEX::SQL_NO_CACHE && - Lex->current_select == &Lex->select_lex) + /* + Allow this flag only on the first top-level SELECT statement, if + SQL_NO_CACHE wasn't specified, and only once per query. + */ + if (Lex->current_select != &Lex->select_lex) + { + my_error(ER_CANT_USE_OPTION_HERE, MYF(0), "SQL_CACHE"); + MYSQL_YYABORT; + } + else if (Lex->select_lex.sql_cache == SELECT_LEX::SQL_NO_CACHE) + { + my_error(ER_WRONG_USAGE, MYF(0), "SQL_NO_CACHE", "SQL_CACHE"); + MYSQL_YYABORT; + } + else if (Lex->select_lex.sql_cache == SELECT_LEX::SQL_CACHE) + { + my_error(ER_DUP_ARGUMENT, MYF(0), "SQL_CACHE"); + MYSQL_YYABORT; + } + else { Lex->safe_to_cache_query=1; Lex->select_lex.options|= OPTION_TO_QUERY_CACHE; Lex->select_lex.sql_cache= SELECT_LEX::SQL_CACHE; } } - | ALL { Select->options|= SELECT_ALL; } ; select_lock_type: @@ -9313,7 +9326,7 @@ select_part2_derived: mysql_init_select(lex); lex->current_select->parsing_place= SELECT_LIST; } - select_options select_item_list + opt_query_expression_options select_item_list { Select->parsing_place= NO_MATTER; } @@ -13662,6 +13675,43 @@ subselect_end: } ; +opt_query_expression_options: + /* empty */ + | query_expression_option_list + ; + +query_expression_option_list: + query_expression_option_list query_expression_option + | query_expression_option + ; + +query_expression_option: + STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } + | HIGH_PRIORITY + { + if (check_simple_select()) + MYSQL_YYABORT; + Lex->lock_option= TL_READ_HIGH_PRIORITY; + Lex->current_select->lock_option= TL_READ_HIGH_PRIORITY; + } + | DISTINCT { Select->options|= SELECT_DISTINCT; } + | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; } + | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } + | SQL_BUFFER_RESULT + { + if (check_simple_select()) + MYSQL_YYABORT; + Select->options|= OPTION_BUFFER_RESULT; + } + | SQL_CALC_FOUND_ROWS + { + if (check_simple_select()) + MYSQL_YYABORT; + Select->options|= OPTION_FOUND_ROWS; + } + | ALL { Select->options|= SELECT_ALL; } + ; + /************************************************************************** CREATE VIEW | TRIGGER | PROCEDURE statements. |