diff options
author | Vladislav Vaintroub <wlad@mariadb.com> | 2019-11-26 09:35:09 +0100 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-12-04 15:45:00 +0400 |
commit | bf3034195fc8c7cd3aa3a93c712227e97ee31ea1 (patch) | |
tree | d2f78a709cddd09faa9b46216e10ded18013fd06 | |
parent | 3f9d7072e98abd7b9315a4d75e30d55c8a35753e (diff) | |
download | mariadb-git-bf3034195fc8c7cd3aa3a93c712227e97ee31ea1.tar.gz |
Part2: MDEV-12518 Unify sql_yacc.yy and sql_yacc_ora.yy
Generate sql_yacc_ora.yy from sql_yacc.yy , by using cmake script
which does some simple string(REPLACE)
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | sql/CMakeLists.txt | 16 | ||||
-rw-r--r-- | sql/gen_sql_yacc_ora_yy.cmake | 15 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 18 | ||||
-rw-r--r-- | sql/sql_yacc_ora.yy | 19048 |
5 files changed, 40 insertions, 19058 deletions
diff --git a/.gitignore b/.gitignore index 4e74d862823..42f654b5c6d 100644 --- a/.gitignore +++ b/.gitignore @@ -173,6 +173,7 @@ sql/sql_yacc.cc sql/sql_yacc.hh sql/sql_yacc_ora.cc sql/sql_yacc_ora.hh +sql/sql_yacc_ora.yy storage/heap/hp_test1 storage/heap/hp_test2 storage/maria/aria_chk diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 83a1ea0abe7..4545bca5768 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -62,6 +62,17 @@ ADD_CUSTOM_COMMAND( DEPENDS gen_lex_token ) +ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.yy + COMMAND ${CMAKE_COMMAND} + "-DIN=${CMAKE_CURRENT_SOURCE_DIR}/sql_yacc.yy" + "-DOUT=${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.yy" + -P ${CMAKE_CURRENT_SOURCE_DIR}/gen_sql_yacc_ora_yy.cmake + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/sql_yacc.yy +) + +ADD_CUSTOM_TARGET(gen_sql_yacc_ora_yy DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.yy) + ADD_DEFINITIONS(-DMYSQL_SERVER -DHAVE_EVENT_SCHEDULER) IF(SSL_DEFINES) @@ -367,8 +378,7 @@ IF (NOT BISON_FOUND) ELSE() BISON_TARGET(gen_sql_yacc ${CMAKE_CURRENT_SOURCE_DIR}/sql_yacc.yy ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc.cc COMPILE_FLAGS "-p MYSQL") - - BISON_TARGET(gen_sql_yacc_ora ${CMAKE_CURRENT_SOURCE_DIR}/sql_yacc_ora.yy ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.cc + BISON_TARGET(gen_sql_yacc_ora ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.yy ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.cc COMPILE_FLAGS "-p ORA") ENDIF() @@ -396,6 +406,8 @@ ADD_CUSTOM_TARGET( ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.cc ) +ADD_DEPENDENCIES(GenServerSource gen_sql_yacc_ora_yy) + IF(WIN32 OR HAVE_DLOPEN AND NOT DISABLE_SHARED) ADD_LIBRARY(udf_example MODULE udf_example.c udf_example.def) SET_TARGET_PROPERTIES(udf_example PROPERTIES PREFIX "") diff --git a/sql/gen_sql_yacc_ora_yy.cmake b/sql/gen_sql_yacc_ora_yy.cmake new file mode 100644 index 00000000000..3fdd5d43f8d --- /dev/null +++ b/sql/gen_sql_yacc_ora_yy.cmake @@ -0,0 +1,15 @@ + +file(READ "${IN}" yytmp) + +# Comment out sql_mode=DEFAULT rules and directives (e.g. %expect, %type) +string(REPLACE "/* Start SQL_MODE_DEFAULT_SPECIFIC */" + "/* Start SQL_MODE_DEFAULT_SPECIFIC" yytmp "${yytmp}") +string(REPLACE "/* End SQL_MODE_DEFAULT_SPECIFIC */" + "End SQL_MODE_DEFAULT_SPECIFIC */" yytmp "${yytmp}") + +# Uncomment sql_mode=ORACLE rules and directives +string(REPLACE "/* Start SQL_MODE_ORACLE_SPECIFIC" + "/* Start SQL_MODE_ORACLE_SPECIFIC */" yytmp "${yytmp}") +string(REPLACE "End SQL_MODE_ORACLE_SPECIFIC */" + "/* End SQL_MODE_ORACLE_SPECIFIC */" yytmp "${yytmp}") +file(WRITE "${OUT}" "${yytmp}") diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 12222483c7b..2bf7295c742 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -322,14 +322,16 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); /* We should not introduce new conflicts any more. */ -//%{#ifdef SQL_MODE_DEFAULT_SPECIFIC + +/* Start SQL_MODE_DEFAULT_SPECIFIC */ %expect 37 -//#endif %} // SQL_MODE_DEFAULT_SPECIFIC +/* End SQL_MODE_DEFAULT_SPECIFIC */ -%{#ifdef SQL_MODE_ORACLE_SPECIFIC +/* Start SQL_MODE_ORACLE_SPECIFIC %expect 40 -#endif %} // SQL_MODE_ORACLE_SPECIFIC +End SQL_MODE_ORACLE_SPECIFIC */ + /* Comments for TOKENS. @@ -1721,7 +1723,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %type <vers_history_point> history_point %type <vers_column_versioning> with_or_without_system -//%{#ifdef SQL_MODE_DEFAULT_SPECIFIC +/* Start SQL_MODE_DEFAULT_SPECIFIC */ %type <NONE> sp_tail_standalone %type <NONE> sp_unlabeled_block_not_atomic %type <NONE> sp_proc_stmt_in_returns_clause @@ -1733,10 +1735,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %type <spblock> sp_decl_variable_list %type <spblock> sp_decl_variable_list_anchored %type <kwd> reserved_keyword_udt_param_type -//#endif %} // SQL_MODE_DEFAULT_SPECIFIC +/* End SQL_MODE_DEFAULT_SPECIFIC */ -%{#ifdef SQL_MODE_ORACLE_SPECIFIC +/* Start SQL_MODE_ORACLE_SPECIFIC %type <NONE> set_assign %type <spvar_mode> sp_opt_inout %type <NONE> sp_tail_standalone @@ -1771,7 +1773,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %type <lex> package_routine_lex %type <lex> package_specification_function %type <lex> package_specification_procedure -#endif %} // SQL_MODE_ORACLE_SPECIFIC +End SQL_MODE_ORACLE_SPECIFIC */ %% diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy deleted file mode 100644 index bfeb67c60d1..00000000000 --- a/sql/sql_yacc_ora.yy +++ /dev/null @@ -1,19048 +0,0 @@ -/* - Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2010, 2019, MariaDB Corporation. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ - -/* sql_yacc.yy */ - -/** - @defgroup Parser Parser - @{ -*/ - -%{ -#define YYLIP (& thd->m_parser_state->m_lip) -#define YYPS (& thd->m_parser_state->m_yacc) -#define YYCSCL (thd->variables.character_set_client) - -#define MYSQL_YACC -#define YYINITDEPTH 100 -#define YYMAXDEPTH 3200 /* Because of 64K stack */ -#define Lex (thd->lex) - -#define Select Lex->current_select -#include "mariadb.h" -#include "sql_priv.h" -#include "sql_parse.h" /* comp_*_creator */ -#include "sql_table.h" /* primary_key_name */ -#include "sql_partition.h" /* partition_info, HASH_PARTITION */ -#include "sql_acl.h" /* *_ACL */ -#include "sql_class.h" /* Key_part_spec, enum_filetype, Diag_condition_item_name */ -#include "slave.h" -#include "lex_symbol.h" -#include "item_create.h" -#include "sp_head.h" -#include "sp_rcontext.h" -#include "sp.h" -#include "sql_show.h" -#include "sql_alter.h" // Sql_cmd_alter_table* -#include "sql_truncate.h" // Sql_cmd_truncate_table -#include "sql_admin.h" // Sql_cmd_analyze/Check..._table -#include "sql_partition_admin.h" // Sql_cmd_alter_table_*_part. -#include "sql_handler.h" // Sql_cmd_handler_* -#include "sql_signal.h" -#include "sql_get_diagnostics.h" // Sql_cmd_get_diagnostics -#include "sql_cte.h" -#include "sql_window.h" -#include "item_windowfunc.h" -#include "event_parse_data.h" -#include "create_options.h" -#include <myisam.h> -#include <myisammrg.h> -#include "keycaches.h" -#include "set_var.h" -#include "rpl_mi.h" -#include "lex_token.h" -#include "sql_lex.h" -#include "sql_sequence.h" -#include "my_base.h" -#include "sql_type_json.h" - -/* this is to get the bison compilation windows warnings out */ -#ifdef _MSC_VER -/* warning C4065: switch statement contains 'default' but no 'case' labels */ -#pragma warning (disable : 4065) -#endif - -int yylex(void *yylval, void *yythd); - -#define yyoverflow(A,B,C,D,E,F) \ - { \ - size_t val= *(F); \ - if (unlikely(my_yyoverflow((B), (D), &val))) \ - { \ - yyerror(thd, (char*) (A)); \ - return 2; \ - } \ - else \ - { \ - *(F)= (YYSIZE_T)val; \ - } \ - } - -#define MYSQL_YYABORT \ - do \ - { \ - LEX::cleanup_lex_after_parse_error(thd); \ - YYABORT; \ - } while (0) - -#define MYSQL_YYABORT_UNLESS(A) \ - if (unlikely(!(A))) \ - { \ - thd->parse_error(); \ - MYSQL_YYABORT; \ - } - -#define my_yyabort_error(A) \ - do { my_error A; MYSQL_YYABORT; } while(0) - -#ifndef DBUG_OFF -#define YYDEBUG 1 -#else -#define YYDEBUG 0 -#endif - - -/** - @brief Bison callback to report a syntax/OOM error - - This function is invoked by the bison-generated parser - when a syntax error, a parse error or an out-of-memory - condition occurs. This function is not invoked when the - parser is requested to abort by semantic action code - by means of YYABORT or YYACCEPT macros. This is why these - macros should not be used (use MYSQL_YYABORT/MYSQL_YYACCEPT - instead). - - The parser will abort immediately after invoking this callback. - - This function is not for use in semantic actions and is internal to - the parser, as it performs some pre-return cleanup. - In semantic actions, please use thd->parse_error() or my_error to - push an error into the error stack and MYSQL_YYABORT - to abort from the parser. -*/ - -static void yyerror(THD *thd, const char *s) -{ - /* - Restore the original LEX if it was replaced when parsing - a stored procedure. We must ensure that a parsing error - does not leave any side effects in the THD. - */ - LEX::cleanup_lex_after_parse_error(thd); - - /* "parse error" changed into "syntax error" between bison 1.75 and 1.875 */ - if (strcmp(s,"parse error") == 0 || strcmp(s,"syntax error") == 0) - s= ER_THD(thd, ER_SYNTAX_ERROR); - thd->parse_error(s, 0); -} - - -#ifndef DBUG_OFF -#define __CONCAT_UNDERSCORED(x,y) x ## _ ## y -#define _CONCAT_UNDERSCORED(x,y) __CONCAT_UNDERSCORED(x,y) -void _CONCAT_UNDERSCORED(turn_parser_debug_on,yyparse)() -{ - /* - MYSQLdebug is in sql/sql_yacc.cc, in bison generated code. - Turning this option on is **VERY** verbose, and should be - used when investigating a syntax error problem only. - - The syntax to run with bison traces is as follows : - - Starting a server manually : - mysqld --debug-dbug="d,parser_debug" ... - - Running a test : - mysql-test-run.pl --mysqld="--debug-dbug=d,parser_debug" ... - - The result will be in the process stderr (var/log/master.err) - */ - - extern int yydebug; - yydebug= 1; -} -#endif - - -#define bincmp_collation(X,Y) \ - do \ - { \ - if (unlikely(Lex->set_bincmp(X,Y))) \ - MYSQL_YYABORT; \ - } while(0) - -%} -%union { - int num; - ulong ulong_num; - ulonglong ulonglong_number; - longlong longlong_number; - uint sp_instr_addr; - - /* structs */ - LEX_CSTRING lex_str; - Lex_ident_cli_st kwd; - Lex_ident_cli_st ident_cli; - Lex_ident_sys_st ident_sys; - Lex_string_with_metadata_st lex_string_with_metadata; - Lex_spblock_st spblock; - Lex_spblock_handlers_st spblock_handlers; - Lex_length_and_dec_st Lex_length_and_dec; - Lex_cast_type_st Lex_cast_type; - Lex_field_type_st Lex_field_type; - Lex_dyncol_type_st Lex_dyncol_type; - Lex_for_loop_st for_loop; - Lex_for_loop_bounds_st for_loop_bounds; - Lex_trim_st trim; - vers_history_point_t vers_history_point; - struct - { - enum sub_select_type unit_type; - bool distinct; - } unit_operation; - struct - { - SELECT_LEX *first; - SELECT_LEX *prev_last; - } select_list; - SQL_I_List<ORDER> *select_order; - Lex_select_lock select_lock; - Lex_select_limit select_limit; - Lex_order_limit_lock *order_limit_lock; - - /* pointers */ - Create_field *create_field; - Spvar_definition *spvar_definition; - Row_definition_list *spvar_definition_list; - const Type_handler *type_handler; - CHARSET_INFO *charset; - Condition_information_item *cond_info_item; - DYNCALL_CREATE_DEF *dyncol_def; - Diagnostics_information *diag_info; - Item *item; - Item_num *item_num; - Item_param *item_param; - Item_basic_constant *item_basic_constant; - Key_part_spec *key_part; - LEX *lex; - sp_expr_lex *expr_lex; - sp_assignment_lex *assignment_lex; - class sp_lex_cursor *sp_cursor_stmt; - LEX_CSTRING *lex_str_ptr; - LEX_USER *lex_user; - USER_AUTH *user_auth; - List<Condition_information_item> *cond_info_list; - List<DYNCALL_CREATE_DEF> *dyncol_def_list; - List<Item> *item_list; - List<sp_assignment_lex> *sp_assignment_lex_list; - List<Statement_information_item> *stmt_info_list; - List<String> *string_list; - List<LEX_CSTRING> *lex_str_list; - Statement_information_item *stmt_info_item; - String *string; - TABLE_LIST *table_list; - Table_ident *table; - Qualified_column_ident *qualified_column_ident; - char *simple_string; - const char *const_simple_string; - chooser_compare_func_creator boolfunc2creator; - class my_var *myvar; - class sp_condition_value *spcondvalue; - class sp_head *sphead; - class sp_name *spname; - class sp_variable *spvar; - class With_clause *with_clause; - class Virtual_column_info *virtual_column; - - handlerton *db_type; - st_select_lex *select_lex; - st_select_lex_unit *select_lex_unit; - struct p_elem_val *p_elem_value; - class Window_frame *window_frame; - class Window_frame_bound *window_frame_bound; - udf_func *udf; - st_trg_execution_order trg_execution_order; - - /* enums */ - enum enum_sp_suid_behaviour sp_suid; - enum enum_sp_aggregate_type sp_aggregate_type; - enum enum_view_suid view_suid; - enum Condition_information_item::Name cond_info_item_name; - enum enum_diag_condition_item_name diag_condition_item_name; - enum Diagnostics_information::Which_area diag_area; - enum enum_fk_option m_fk_option; - enum Item_udftype udf_type; - enum Key::Keytype key_type; - enum Statement_information_item::Name stmt_info_item_name; - enum enum_filetype filetype; - enum enum_tx_isolation tx_isolation; - enum enum_var_type var_type; - enum enum_yes_no_unknown m_yes_no_unk; - enum ha_choice choice; - enum ha_key_alg key_alg; - enum ha_rkey_function ha_rkey_mode; - enum index_hint_type index_hint; - enum interval_type interval, interval_time_st; - enum row_type row_type; - enum sp_variable::enum_mode spvar_mode; - enum thr_lock_type lock_type; - enum enum_mysql_timestamp_type date_time_type; - enum Window_frame_bound::Bound_precedence_type bound_precedence_type; - enum Window_frame::Frame_units frame_units; - enum Window_frame::Frame_exclusion frame_exclusion; - enum trigger_order_type trigger_action_order_type; - DDL_options_st object_ddl_options; - enum vers_kind_t vers_range_unit; - enum Column_definition::enum_column_versioning vers_column_versioning; - enum plsql_cursor_attr_t plsql_cursor_attr; -} - -%{ -/* avoid unintentional %union size increases, it's what a parser stack made of */ -static_assert(sizeof(YYSTYPE) == sizeof(void*)*2+8, "%union size check"); -bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); -%} - -%pure-parser /* We have threads */ -%parse-param { THD *thd } -%lex-param { THD *thd } -/* - We should not introduce new conflicts any more. -*/ -%{#ifdef SQL_MODE_DEFAULT_SPECIFIC -%expect 37 -#endif %} // SQL_MODE_DEFAULT_SPECIFIC - - -//%{#ifdef SQL_MODE_ORACLE_SPECIFIC -%expect 40 -//#endif %} // SQL_MODE_ORACLE_SPECIFIC - -/* - Comments for TOKENS. - For each token, please include in the same line a comment that contains - the following tags: - SQL-2011-R : Reserved keyword as per SQL-2011 - SQL-2011-N : Non Reserved keyword as per SQL-2011 - SQL-2003-R : Reserved keyword as per SQL-2003 - SQL-2003-N : Non Reserved keyword as per SQL-2003 - SQL-1999-R : Reserved keyword as per SQL-1999 - SQL-1999-N : Non Reserved keyword as per SQL-1999 - MYSQL : MySQL extention (unspecified) - MYSQL-FUNC : MySQL extention, function - INTERNAL : Not a real token, lex optimization - OPERATOR : SQL operator - FUTURE-USE : Reserved for future use - - This makes the code grep-able, and helps maintenance. -*/ - - -%token <lex_str> '@' - -/* - Special purpose tokens -*/ -%token <NONE> ABORT_SYM /* INTERNAL (used in lex) */ -%token <NONE> IMPOSSIBLE_ACTION /* To avoid warning for yyerrlab1 */ -%token <NONE> END_OF_INPUT /* INTERNAL */ -%token <kwd> COLON_ORACLE_SYM /* INTERNAL */ -%token <kwd> PARAM_MARKER /* INTERNAL */ -%token <NONE> FOR_SYSTEM_TIME_SYM /* INTERNAL */ -%token <NONE> LEFT_PAREN_ALT /* INTERNAL */ -%token <NONE> LEFT_PAREN_WITH /* INTERNAL */ -%token <NONE> LEFT_PAREN_LIKE /* INTERNAL */ -%token <NONE> ORACLE_CONCAT_SYM /* INTERNAL */ -%token <NONE> PERCENT_ORACLE_SYM /* INTERNAL */ -%token <NONE> WITH_CUBE_SYM /* INTERNAL */ -%token <NONE> WITH_ROLLUP_SYM /* INTERNAL */ -%token <NONE> WITH_SYSTEM_SYM /* INTERNAL */ - - -/* - Identifiers -*/ -%token IDENT -%token IDENT_QUOTED -%token LEX_HOSTNAME -%token UNDERSCORE_CHARSET /* _latin1 */ - - -/* - Literals -*/ -%token BIN_NUM /* LITERAL */ -%token DECIMAL_NUM /* LITERAL */ -%token FLOAT_NUM /* LITERAL */ -%token HEX_NUM /* LITERAL */ -%token HEX_STRING /* LITERAL */ -%token LONG_NUM /* LITERAL */ -%token NCHAR_STRING /* LITERAL */ -%token NUM /* LITERAL */ -%token TEXT_STRING /* LITERAL */ -%token ULONGLONG_NUM /* LITERAL */ - - -/* - Operators -*/ -%token <NONE> AND_AND_SYM /* OPERATOR */ -%token <NONE> DOT_DOT_SYM /* OPERATOR */ -%token <NONE> EQUAL_SYM /* OPERATOR */ -%token <NONE> GE /* OPERATOR */ -%token <NONE> LE /* OPERATOR */ -%token <NONE> MYSQL_CONCAT_SYM /* OPERATOR */ -%token <NONE> NE /* OPERATOR */ -%token <NONE> NOT2_SYM /* OPERATOR */ -%token <NONE> OR2_SYM /* OPERATOR */ -%token <NONE> SET_VAR /* OPERATOR */ -%token <NONE> SHIFT_LEFT /* OPERATOR */ -%token <NONE> SHIFT_RIGHT /* OPERATOR */ - - -/* - Reserved keywords -*/ -%token <kwd> ACCESSIBLE_SYM -%token <kwd> ADD /* SQL-2003-R */ -%token <kwd> ALL /* SQL-2003-R */ -%token <kwd> ALTER /* SQL-2003-R */ -%token <kwd> ANALYZE_SYM -%token <kwd> AND_SYM /* SQL-2003-R */ -%token <kwd> ASC /* SQL-2003-N */ -%token <kwd> ASENSITIVE_SYM /* FUTURE-USE */ -%token <kwd> AS /* SQL-2003-R */ -%token <kwd> BEFORE_SYM /* SQL-2003-N */ -%token <kwd> BETWEEN_SYM /* SQL-2003-R */ -%token <kwd> BIGINT /* SQL-2003-R */ -%token <kwd> BINARY /* SQL-2003-R */ -%token <kwd> BIT_AND /* MYSQL-FUNC */ -%token <kwd> BIT_OR /* MYSQL-FUNC */ -%token <kwd> BIT_XOR /* MYSQL-FUNC */ -%token <kwd> BLOB_MARIADB_SYM /* SQL-2003-R */ -%token <kwd> BLOB_ORACLE_SYM /* Oracle-R */ -%token <kwd> BODY_ORACLE_SYM /* Oracle-R */ -%token <kwd> BOTH /* SQL-2003-R */ -%token <kwd> BY /* SQL-2003-R */ -%token <kwd> CALL_SYM /* SQL-2003-R */ -%token <kwd> CASCADE /* SQL-2003-N */ -%token <kwd> CASE_SYM /* SQL-2003-R */ -%token <kwd> CAST_SYM /* SQL-2003-R */ -%token <kwd> CHANGE -%token <kwd> CHAR_SYM /* SQL-2003-R */ -%token <kwd> CHECK_SYM /* SQL-2003-R */ -%token <kwd> COLLATE_SYM /* SQL-2003-R */ -%token <kwd> CONDITION_SYM /* SQL-2003-R, SQL-2008-R */ -%token <kwd> CONSTRAINT /* SQL-2003-R */ -%token <kwd> CONTINUE_MARIADB_SYM /* SQL-2003-R, Oracle-R */ -%token <kwd> CONTINUE_ORACLE_SYM /* SQL-2003-R, Oracle-R */ -%token <kwd> CONVERT_SYM /* SQL-2003-N */ -%token <kwd> COUNT_SYM /* SQL-2003-N */ -%token <kwd> CREATE /* SQL-2003-R */ -%token <kwd> CROSS /* SQL-2003-R */ -%token <kwd> CUME_DIST_SYM -%token <kwd> CURDATE /* MYSQL-FUNC */ -%token <kwd> CURRENT_ROLE /* SQL-2003-R */ -%token <kwd> CURRENT_USER /* SQL-2003-R */ -%token <kwd> CURSOR_SYM /* SQL-2003-R */ -%token <kwd> CURTIME /* MYSQL-FUNC */ -%token <kwd> DATABASE -%token <kwd> DATABASES -%token <kwd> DATE_ADD_INTERVAL /* MYSQL-FUNC */ -%token <kwd> DATE_SUB_INTERVAL /* MYSQL-FUNC */ -%token <kwd> DAY_HOUR_SYM -%token <kwd> DAY_MICROSECOND_SYM -%token <kwd> DAY_MINUTE_SYM -%token <kwd> DAY_SECOND_SYM -%token <kwd> DECIMAL_SYM /* SQL-2003-R */ -%token <kwd> DECLARE_MARIADB_SYM /* SQL-2003-R */ -%token <kwd> DECLARE_ORACLE_SYM /* Oracle-R */ -%token <kwd> DEFAULT /* SQL-2003-R */ -%token <kwd> DELETE_DOMAIN_ID_SYM -%token <kwd> DELETE_SYM /* SQL-2003-R */ -%token <kwd> DENSE_RANK_SYM -%token <kwd> DESCRIBE /* SQL-2003-R */ -%token <kwd> DESC /* SQL-2003-N */ -%token <kwd> DETERMINISTIC_SYM /* SQL-2003-R */ -%token <kwd> DISTINCT /* SQL-2003-R */ -%token <kwd> DIV_SYM -%token <kwd> DO_DOMAIN_IDS_SYM -%token <kwd> DOUBLE_SYM /* SQL-2003-R */ -%token <kwd> DROP /* SQL-2003-R */ -%token <kwd> DUAL_SYM -%token <kwd> EACH_SYM /* SQL-2003-R */ -%token <kwd> ELSEIF_MARIADB_SYM -%token <kwd> ELSE /* SQL-2003-R */ -%token <kwd> ELSIF_ORACLE_SYM /* PLSQL-R */ -%token <kwd> ENCLOSED -%token <kwd> ESCAPED -%token <kwd> EXCEPT_SYM /* SQL-2003-R */ -%token <kwd> EXISTS /* SQL-2003-R */ -%token <kwd> EXTRACT_SYM /* SQL-2003-N */ -%token <kwd> FALSE_SYM /* SQL-2003-R */ -%token <kwd> FETCH_SYM /* SQL-2003-R */ -%token <kwd> FIRST_VALUE_SYM /* SQL-2011 */ -%token <kwd> FLOAT_SYM /* SQL-2003-R */ -%token <kwd> FOREIGN /* SQL-2003-R */ -%token <kwd> FOR_SYM /* SQL-2003-R */ -%token <kwd> FROM -%token <kwd> FULLTEXT_SYM -%token <kwd> GOTO_ORACLE_SYM /* Oracle-R */ -%token <kwd> GRANT /* SQL-2003-R */ -%token <kwd> GROUP_CONCAT_SYM -%token <rwd> JSON_ARRAYAGG_SYM -%token <rwd> JSON_OBJECTAGG_SYM -%token <kwd> GROUP_SYM /* SQL-2003-R */ -%token <kwd> HAVING /* SQL-2003-R */ -%token <kwd> HOUR_MICROSECOND_SYM -%token <kwd> HOUR_MINUTE_SYM -%token <kwd> HOUR_SECOND_SYM -%token <kwd> IF_SYM -%token <kwd> IGNORE_DOMAIN_IDS_SYM -%token <kwd> IGNORE_SYM -%token <kwd> INDEX_SYM -%token <kwd> INFILE -%token <kwd> INNER_SYM /* SQL-2003-R */ -%token <kwd> INOUT_SYM /* SQL-2003-R */ -%token <kwd> INSENSITIVE_SYM /* SQL-2003-R */ -%token <kwd> INSERT /* SQL-2003-R */ -%token <kwd> IN_SYM /* SQL-2003-R */ -%token <kwd> INTERSECT_SYM /* SQL-2003-R */ -%token <kwd> INTERVAL_SYM /* SQL-2003-R */ -%token <kwd> INTO /* SQL-2003-R */ -%token <kwd> INT_SYM /* SQL-2003-R */ -%token <kwd> IS /* SQL-2003-R */ -%token <kwd> ITERATE_SYM -%token <kwd> JOIN_SYM /* SQL-2003-R */ -%token <kwd> KEYS -%token <kwd> KEY_SYM /* SQL-2003-N */ -%token <kwd> KILL_SYM -%token <kwd> LAG_SYM /* SQL-2011 */ -%token <kwd> LEADING /* SQL-2003-R */ -%token <kwd> LEAD_SYM /* SQL-2011 */ -%token <kwd> LEAVE_SYM -%token <kwd> LEFT /* SQL-2003-R */ -%token <kwd> LIKE /* SQL-2003-R */ -%token <kwd> LIMIT -%token <kwd> LINEAR_SYM -%token <kwd> LINES -%token <kwd> LOAD -%token <kwd> LOCATOR_SYM /* SQL-2003-N */ -%token <kwd> LOCK_SYM -%token <kwd> LONGBLOB -%token <kwd> LONG_SYM -%token <kwd> LONGTEXT -%token <kwd> LOOP_SYM -%token <kwd> LOW_PRIORITY -%token <kwd> MASTER_SSL_VERIFY_SERVER_CERT_SYM -%token <kwd> MATCH /* SQL-2003-R */ -%token <kwd> MAX_SYM /* SQL-2003-N */ -%token <kwd> MAXVALUE_SYM /* SQL-2003-N */ -%token <kwd> MEDIAN_SYM -%token <kwd> MEDIUMBLOB -%token <kwd> MEDIUMINT -%token <kwd> MEDIUMTEXT -%token <kwd> MIN_SYM /* SQL-2003-N */ -%token <kwd> MINUTE_MICROSECOND_SYM -%token <kwd> MINUTE_SECOND_SYM -%token <kwd> MODIFIES_SYM /* SQL-2003-R */ -%token <kwd> MOD_SYM /* SQL-2003-N */ -%token <kwd> NATURAL /* SQL-2003-R */ -%token <kwd> NEG -%token <kwd> NOT_SYM /* SQL-2003-R */ -%token <kwd> NO_WRITE_TO_BINLOG -%token <kwd> NOW_SYM -%token <kwd> NTH_VALUE_SYM /* SQL-2011 */ -%token <kwd> NTILE_SYM -%token <kwd> NULL_SYM /* SQL-2003-R */ -%token <kwd> NUMERIC_SYM /* SQL-2003-R */ -%token <kwd> ON /* SQL-2003-R */ -%token <kwd> OPTIMIZE -%token <kwd> OPTIONALLY -%token <kwd> ORDER_SYM /* SQL-2003-R */ -%token <kwd> OR_SYM /* SQL-2003-R */ -%token <kwd> OTHERS_ORACLE_SYM /* SQL-2011-N, PLSQL-R */ -%token <kwd> OUTER -%token <kwd> OUTFILE -%token <kwd> OUT_SYM /* SQL-2003-R */ -%token <kwd> OVER_SYM -%token <kwd> PACKAGE_ORACLE_SYM /* Oracle-R */ -%token <kwd> PAGE_CHECKSUM_SYM -%token <kwd> PARSE_VCOL_EXPR_SYM -%token <kwd> PARTITION_SYM /* SQL-2003-R */ -%token <kwd> PERCENTILE_CONT_SYM -%token <kwd> PERCENTILE_DISC_SYM -%token <kwd> PERCENT_RANK_SYM -%token <kwd> PORTION_SYM /* SQL-2016-R */ -%token <kwd> POSITION_SYM /* SQL-2003-N */ -%token <kwd> PRECISION /* SQL-2003-R */ -%token <kwd> PRIMARY_SYM /* SQL-2003-R */ -%token <kwd> PROCEDURE_SYM /* SQL-2003-R */ -%token <kwd> PURGE -%token <kwd> RAISE_ORACLE_SYM /* PLSQL-R */ -%token <kwd> RANGE_SYM /* SQL-2003-R */ -%token <kwd> RANK_SYM -%token <kwd> READS_SYM /* SQL-2003-R */ -%token <kwd> READ_SYM /* SQL-2003-N */ -%token <kwd> READ_WRITE_SYM -%token <kwd> REAL /* SQL-2003-R */ -%token <kwd> RECURSIVE_SYM -%token <kwd> REFERENCES /* SQL-2003-R */ -%token <kwd> REF_SYSTEM_ID_SYM -%token <kwd> REGEXP -%token <kwd> RELEASE_SYM /* SQL-2003-R */ -%token <kwd> RENAME -%token <kwd> REPEAT_SYM /* MYSQL-FUNC */ -%token <kwd> REPLACE /* MYSQL-FUNC */ -%token <kwd> REQUIRE_SYM -%token <kwd> RESIGNAL_SYM /* SQL-2003-R */ -%token <kwd> RESTRICT -%token <kwd> RETURNING_SYM -%token <kwd> RETURN_MARIADB_SYM /* SQL-2003-R, PLSQL-R */ -%token <kwd> RETURN_ORACLE_SYM /* SQL-2003-R, PLSQL-R */ -%token <kwd> REVOKE /* SQL-2003-R */ -%token <kwd> RIGHT /* SQL-2003-R */ -%token <kwd> ROW_NUMBER_SYM -%token <kwd> ROWS_SYM /* SQL-2003-R */ -%token <kwd> ROWTYPE_ORACLE_SYM /* PLSQL-R */ -%token <kwd> SECOND_MICROSECOND_SYM -%token <kwd> SELECT_SYM /* SQL-2003-R */ -%token <kwd> SENSITIVE_SYM /* FUTURE-USE */ -%token <kwd> SEPARATOR_SYM -%token <kwd> SERVER_OPTIONS -%token <kwd> SET /* SQL-2003-R */ -%token <kwd> SHOW -%token <kwd> SIGNAL_SYM /* SQL-2003-R */ -%token <kwd> SMALLINT /* SQL-2003-R */ -%token <kwd> SPATIAL_SYM -%token <kwd> SPECIFIC_SYM /* SQL-2003-R */ -%token <kwd> SQL_BIG_RESULT -%token <kwd> SQLEXCEPTION_SYM /* SQL-2003-R */ -%token <kwd> SQL_SMALL_RESULT -%token <kwd> SQLSTATE_SYM /* SQL-2003-R */ -%token <kwd> SQL_SYM /* SQL-2003-R */ -%token <kwd> SQLWARNING_SYM /* SQL-2003-R */ -%token <kwd> SSL_SYM -%token <kwd> STARTING -%token <kwd> STATS_AUTO_RECALC_SYM -%token <kwd> STATS_PERSISTENT_SYM -%token <kwd> STATS_SAMPLE_PAGES_SYM -%token <kwd> STDDEV_SAMP_SYM /* SQL-2003-N */ -%token <kwd> STD_SYM -%token <kwd> STRAIGHT_JOIN -%token <kwd> SUBSTRING /* SQL-2003-N */ -%token <kwd> SUM_SYM /* SQL-2003-N */ -%token <kwd> SYSDATE -%token <kwd> TABLE_REF_PRIORITY -%token <kwd> TABLE_SYM /* SQL-2003-R */ -%token <kwd> TERMINATED -%token <kwd> THEN_SYM /* SQL-2003-R */ -%token <kwd> TINYBLOB -%token <kwd> TINYINT -%token <kwd> TINYTEXT -%token <kwd> TO_SYM /* SQL-2003-R */ -%token <kwd> TRAILING /* SQL-2003-R */ -%token <kwd> TRIGGER_SYM /* SQL-2003-R */ -%token <kwd> TRIM /* SQL-2003-N */ -%token <kwd> TRUE_SYM /* SQL-2003-R */ -%token <kwd> UNDO_SYM /* FUTURE-USE */ -%token <kwd> UNION_SYM /* SQL-2003-R */ -%token <kwd> UNIQUE_SYM -%token <kwd> UNLOCK_SYM -%token <kwd> UNSIGNED -%token <kwd> UPDATE_SYM /* SQL-2003-R */ -%token <kwd> USAGE /* SQL-2003-N */ -%token <kwd> USE_SYM -%token <kwd> USING /* SQL-2003-R */ -%token <kwd> UTC_DATE_SYM -%token <kwd> UTC_TIMESTAMP_SYM -%token <kwd> UTC_TIME_SYM -%token <kwd> VALUES_IN_SYM -%token <kwd> VALUES_LESS_SYM -%token <kwd> VALUES /* SQL-2003-R */ -%token <kwd> VARBINARY -%token <kwd> VARCHAR /* SQL-2003-R */ -%token <kwd> VARIANCE_SYM -%token <kwd> VAR_SAMP_SYM -%token <kwd> VARYING /* SQL-2003-R */ -%token <kwd> WHEN_SYM /* SQL-2003-R */ -%token <kwd> WHERE /* SQL-2003-R */ -%token <kwd> WHILE_SYM -%token <kwd> WITH /* SQL-2003-R */ -%token <kwd> XOR -%token <kwd> YEAR_MONTH_SYM -%token <kwd> ZEROFILL - - -/* - Keywords that have different reserved status in std/oracle modes. -*/ -%token <kwd> BODY_MARIADB_SYM // Oracle-R -%token <kwd> ELSEIF_ORACLE_SYM -%token <kwd> ELSIF_MARIADB_SYM // PLSQL-R -%token <kwd> EXCEPTION_ORACLE_SYM // SQL-2003-N, PLSQL-R -%token <kwd> GOTO_MARIADB_SYM // Oracle-R -%token <kwd> OTHERS_MARIADB_SYM // SQL-2011-N, PLSQL-R -%token <kwd> PACKAGE_MARIADB_SYM // Oracle-R -%token <kwd> RAISE_MARIADB_SYM // PLSQL-R -%token <kwd> ROWTYPE_MARIADB_SYM // PLSQL-R - -/* - Non-reserved keywords -*/ - -%token <kwd> ACCOUNT_SYM /* MYSQL */ -%token <kwd> ACTION /* SQL-2003-N */ -%token <kwd> ADMIN_SYM /* SQL-2003-N */ -%token <kwd> ADDDATE_SYM /* MYSQL-FUNC */ -%token <kwd> AFTER_SYM /* SQL-2003-N */ -%token <kwd> AGAINST -%token <kwd> AGGREGATE_SYM -%token <kwd> ALGORITHM_SYM -%token <kwd> ALWAYS_SYM -%token <kwd> ANY_SYM /* SQL-2003-R */ -%token <kwd> ASCII_SYM /* MYSQL-FUNC */ -%token <kwd> AT_SYM /* SQL-2003-R */ -%token <kwd> ATOMIC_SYM /* SQL-2003-R */ -%token <kwd> AUTHORS_SYM -%token <kwd> AUTOEXTEND_SIZE_SYM -%token <kwd> AUTO_INC -%token <kwd> AUTO_SYM -%token <kwd> AVG_ROW_LENGTH -%token <kwd> AVG_SYM /* SQL-2003-N */ -%token <kwd> BACKUP_SYM -%token <kwd> BEGIN_MARIADB_SYM /* SQL-2003-R, PLSQL-R */ -%token <kwd> BEGIN_ORACLE_SYM /* SQL-2003-R, PLSQL-R */ -%token <kwd> BINLOG_SYM -%token <kwd> BIT_SYM /* MYSQL-FUNC */ -%token <kwd> BLOCK_SYM -%token <kwd> BOOL_SYM -%token <kwd> BOOLEAN_SYM /* SQL-2003-R, PLSQL-R */ -%token <kwd> BTREE_SYM -%token <kwd> BYTE_SYM -%token <kwd> CACHE_SYM -%token <kwd> CASCADED /* SQL-2003-R */ -%token <kwd> CATALOG_NAME_SYM /* SQL-2003-N */ -%token <kwd> CHAIN_SYM /* SQL-2003-N */ -%token <kwd> CHANGED -%token <kwd> CHARSET -%token <kwd> CHECKPOINT_SYM -%token <kwd> CHECKSUM_SYM -%token <kwd> CIPHER_SYM -%token <kwd> CLASS_ORIGIN_SYM /* SQL-2003-N */ -%token <kwd> CLIENT_SYM -%token <kwd> CLOB_MARIADB_SYM /* SQL-2003-R */ -%token <kwd> CLOB_ORACLE_SYM /* Oracle-R */ -%token <kwd> CLOSE_SYM /* SQL-2003-R */ -%token <kwd> COALESCE /* SQL-2003-N */ -%token <kwd> CODE_SYM -%token <kwd> COLLATION_SYM /* SQL-2003-N */ -%token <kwd> COLUMNS -%token <kwd> COLUMN_ADD_SYM -%token <kwd> COLUMN_CHECK_SYM -%token <kwd> COLUMN_CREATE_SYM -%token <kwd> COLUMN_DELETE_SYM -%token <kwd> COLUMN_GET_SYM -%token <kwd> COLUMN_SYM /* SQL-2003-R */ -%token <kwd> COLUMN_NAME_SYM /* SQL-2003-N */ -%token <kwd> COMMENT_SYM /* Oracle-R */ -%token <kwd> COMMITTED_SYM /* SQL-2003-N */ -%token <kwd> COMMIT_SYM /* SQL-2003-R */ -%token <kwd> COMPACT_SYM -%token <kwd> COMPLETION_SYM -%token <kwd> COMPRESSED_SYM -%token <kwd> CONCURRENT -%token <kwd> CONNECTION_SYM -%token <kwd> CONSISTENT_SYM -%token <kwd> CONSTRAINT_CATALOG_SYM /* SQL-2003-N */ -%token <kwd> CONSTRAINT_NAME_SYM /* SQL-2003-N */ -%token <kwd> CONSTRAINT_SCHEMA_SYM /* SQL-2003-N */ -%token <kwd> CONTAINS_SYM /* SQL-2003-N */ -%token <kwd> CONTEXT_SYM -%token <kwd> CONTRIBUTORS_SYM -%token <kwd> CPU_SYM -%token <kwd> CUBE_SYM /* SQL-2003-R */ -%token <kwd> CURRENT_SYM /* SQL-2003-R */ -%token <kwd> CURRENT_POS_SYM -%token <kwd> CURSOR_NAME_SYM /* SQL-2003-N */ -%token <kwd> CYCLE_SYM -%token <kwd> DATAFILE_SYM -%token <kwd> DATA_SYM /* SQL-2003-N */ -%token <kwd> DATETIME -%token <kwd> DATE_FORMAT_SYM /* MYSQL-FUNC */ -%token <kwd> DATE_SYM /* SQL-2003-R, Oracle-R, PLSQL-R */ -%token <kwd> DAY_SYM /* SQL-2003-R */ -%token <kwd> DEALLOCATE_SYM /* SQL-2003-R */ -%token <kwd> DECODE_MARIADB_SYM /* Function, non-reserved */ -%token <kwd> DECODE_ORACLE_SYM /* Function, non-reserved */ -%token <kwd> DEFINER_SYM -%token <kwd> DELAYED_SYM -%token <kwd> DELAY_KEY_WRITE_SYM -%token <kwd> DES_KEY_FILE -%token <kwd> DIAGNOSTICS_SYM /* SQL-2003-N */ -%token <kwd> DIRECTORY_SYM -%token <kwd> DISABLE_SYM -%token <kwd> DISCARD -%token <kwd> DISK_SYM -%token <kwd> DO_SYM -%token <kwd> DUMPFILE -%token <kwd> DUPLICATE_SYM -%token <kwd> DYNAMIC_SYM /* SQL-2003-R */ -%token <kwd> ENABLE_SYM -%token <kwd> END /* SQL-2003-R, PLSQL-R */ -%token <kwd> ENDS_SYM -%token <kwd> ENGINES_SYM -%token <kwd> ENGINE_SYM -%token <kwd> ENUM -%token <kwd> ERROR_SYM -%token <kwd> ERRORS -%token <kwd> ESCAPE_SYM /* SQL-2003-R */ -%token <kwd> EVENTS_SYM -%token <kwd> EVENT_SYM -%token <kwd> EVERY_SYM /* SQL-2003-N */ -%token <kwd> EXCHANGE_SYM -%token <kwd> EXAMINED_SYM -%token <kwd> EXCLUDE_SYM /* SQL-2011-N */ -%token <kwd> EXECUTE_SYM /* SQL-2003-R */ -%token <kwd> EXCEPTION_MARIADB_SYM /* SQL-2003-N, PLSQL-R */ -%token <kwd> EXIT_MARIADB_SYM /* PLSQL-R */ -%token <kwd> EXIT_ORACLE_SYM /* PLSQL-R */ -%token <kwd> EXPANSION_SYM -%token <kwd> EXPIRE_SYM /* MySQL */ -%token <kwd> EXPORT_SYM -%token <kwd> EXTENDED_SYM -%token <kwd> EXTENT_SIZE_SYM -%token <kwd> FAST_SYM -%token <kwd> FAULTS_SYM -%token <kwd> FILE_SYM -%token <kwd> FIRST_SYM /* SQL-2003-N */ -%token <kwd> FIXED_SYM -%token <kwd> FLUSH_SYM -%token <kwd> FOLLOWS_SYM /* MYSQL trigger*/ -%token <kwd> FOLLOWING_SYM /* SQL-2011-N */ -%token <kwd> FORCE_SYM -%token <kwd> FORMAT_SYM -%token <kwd> FOUND_SYM /* SQL-2003-R */ -%token <kwd> FULL /* SQL-2003-R */ -%token <kwd> FUNCTION_SYM /* SQL-2003-R, Oracle-R */ -%token <kwd> GENERAL -%token <kwd> GENERATED_SYM -%token <kwd> GET_FORMAT /* MYSQL-FUNC */ -%token <kwd> GET_SYM /* SQL-2003-R */ -%token <kwd> GLOBAL_SYM /* SQL-2003-R */ -%token <kwd> GRANTS -%token <kwd> HANDLER_SYM -%token <kwd> HARD_SYM -%token <kwd> HASH_SYM -%token <kwd> HELP_SYM -%token <kwd> HIGH_PRIORITY -%token <kwd> HISTORY_SYM /* MYSQL */ -%token <kwd> HOST_SYM -%token <kwd> HOSTS_SYM -%token <kwd> HOUR_SYM /* SQL-2003-R */ -%token <kwd> ID_SYM /* MYSQL */ -%token <kwd> IDENTIFIED_SYM -%token <kwd> IGNORE_SERVER_IDS_SYM -%token <kwd> IMMEDIATE_SYM /* SQL-2003-R */ -%token <kwd> IMPORT -%token <kwd> INCREMENT_SYM -%token <kwd> INDEXES -%token <kwd> INITIAL_SIZE_SYM -%token <kwd> INSERT_METHOD -%token <kwd> INSTALL_SYM -%token <kwd> INVOKER_SYM -%token <kwd> IO_SYM -%token <kwd> IPC_SYM -%token <kwd> ISOLATION /* SQL-2003-R */ -%token <kwd> ISOPEN_SYM /* Oracle-N */ -%token <kwd> ISSUER_SYM -%token <kwd> INVISIBLE_SYM -%token <kwd> JSON_SYM -%token <kwd> KEY_BLOCK_SIZE -%token <kwd> LANGUAGE_SYM /* SQL-2003-R */ -%token <kwd> LAST_SYM /* SQL-2003-N */ -%token <kwd> LAST_VALUE -%token <kwd> LASTVAL_SYM /* PostgreSQL sequence function */ -%token <kwd> LEAVES -%token <kwd> LESS_SYM -%token <kwd> LEVEL_SYM -%token <kwd> LIST_SYM -%token <kwd> LOCAL_SYM /* SQL-2003-R */ -%token <kwd> LOCKS_SYM -%token <kwd> LOGFILE_SYM -%token <kwd> LOGS_SYM -%token <kwd> MASTER_CONNECT_RETRY_SYM -%token <kwd> MASTER_DELAY_SYM -%token <kwd> MASTER_GTID_POS_SYM -%token <kwd> MASTER_HOST_SYM -%token <kwd> MASTER_LOG_FILE_SYM -%token <kwd> MASTER_LOG_POS_SYM -%token <kwd> MASTER_PASSWORD_SYM -%token <kwd> MASTER_PORT_SYM -%token <kwd> MASTER_SERVER_ID_SYM -%token <kwd> MASTER_SSL_CAPATH_SYM -%token <kwd> MASTER_SSL_CA_SYM -%token <kwd> MASTER_SSL_CERT_SYM -%token <kwd> MASTER_SSL_CIPHER_SYM -%token <kwd> MASTER_SSL_CRL_SYM -%token <kwd> MASTER_SSL_CRLPATH_SYM -%token <kwd> MASTER_SSL_KEY_SYM -%token <kwd> MASTER_SSL_SYM -%token <kwd> MASTER_SYM -%token <kwd> MASTER_USER_SYM -%token <kwd> MASTER_USE_GTID_SYM -%token <kwd> MASTER_HEARTBEAT_PERIOD_SYM -%token <kwd> MAX_CONNECTIONS_PER_HOUR -%token <kwd> MAX_QUERIES_PER_HOUR -%token <kwd> MAX_ROWS -%token <kwd> MAX_SIZE_SYM -%token <kwd> MAX_UPDATES_PER_HOUR -%token <kwd> MAX_STATEMENT_TIME_SYM -%token <kwd> MAX_USER_CONNECTIONS_SYM -%token <kwd> MEDIUM_SYM -%token <kwd> MEMORY_SYM -%token <kwd> MERGE_SYM /* SQL-2003-R */ -%token <kwd> MESSAGE_TEXT_SYM /* SQL-2003-N */ -%token <kwd> MICROSECOND_SYM /* MYSQL-FUNC */ -%token <kwd> MIGRATE_SYM -%token <kwd> MINUTE_SYM /* SQL-2003-R */ -%token <kwd> MINVALUE_SYM -%token <kwd> MIN_ROWS -%token <kwd> MODE_SYM -%token <kwd> MODIFY_SYM -%token <kwd> MONTH_SYM /* SQL-2003-R */ -%token <kwd> MUTEX_SYM -%token <kwd> MYSQL_SYM -%token <kwd> MYSQL_ERRNO_SYM -%token <kwd> NAMES_SYM /* SQL-2003-N */ -%token <kwd> NAME_SYM /* SQL-2003-N */ -%token <kwd> NATIONAL_SYM /* SQL-2003-R */ -%token <kwd> NCHAR_SYM /* SQL-2003-R */ -%token <kwd> NEVER_SYM /* MySQL */ -%token <kwd> NEW_SYM /* SQL-2003-R */ -%token <kwd> NEXT_SYM /* SQL-2003-N */ -%token <kwd> NEXTVAL_SYM /* PostgreSQL sequence function */ -%token <kwd> NOCACHE_SYM -%token <kwd> NOCYCLE_SYM -%token <kwd> NODEGROUP_SYM -%token <kwd> NONE_SYM /* SQL-2003-R */ -%token <kwd> NOTFOUND_SYM /* Oracle-R */ -%token <kwd> NO_SYM /* SQL-2003-R */ -%token <kwd> NOMAXVALUE_SYM -%token <kwd> NOMINVALUE_SYM -%token <kwd> NO_WAIT_SYM -%token <kwd> NOWAIT_SYM -%token <kwd> NUMBER_MARIADB_SYM /* SQL-2003-N */ -%token <kwd> NUMBER_ORACLE_SYM /* Oracle-R, PLSQL-R */ -%token <kwd> NVARCHAR_SYM -%token <kwd> OF_SYM /* SQL-1992-R, Oracle-R */ -%token <kwd> OFFSET_SYM -%token <kwd> OLD_PASSWORD_SYM -%token <kwd> ONE_SYM -%token <kwd> ONLY_SYM /* SQL-2003-R */ -%token <kwd> ONLINE_SYM -%token <kwd> OPEN_SYM /* SQL-2003-R */ -%token <kwd> OPTIONS_SYM -%token <kwd> OPTION /* SQL-2003-N */ -%token <kwd> OWNER_SYM -%token <kwd> PACK_KEYS_SYM -%token <kwd> PAGE_SYM -%token <kwd> PARSER_SYM -%token <kwd> PARTIAL /* SQL-2003-N */ -%token <kwd> PARTITIONS_SYM -%token <kwd> PARTITIONING_SYM -%token <kwd> PASSWORD_SYM -%token <kwd> PERIOD_SYM /* SQL-2011-R */ -%token <kwd> PERSISTENT_SYM -%token <kwd> PHASE_SYM -%token <kwd> PLUGINS_SYM -%token <kwd> PLUGIN_SYM -%token <kwd> PORT_SYM -%token <kwd> PRECEDES_SYM /* MYSQL */ -%token <kwd> PRECEDING_SYM /* SQL-2011-N */ -%token <kwd> PREPARE_SYM /* SQL-2003-R */ -%token <kwd> PRESERVE_SYM -%token <kwd> PREV_SYM -%token <kwd> PREVIOUS_SYM -%token <kwd> PRIVILEGES /* SQL-2003-N */ -%token <kwd> PROCESS -%token <kwd> PROCESSLIST_SYM -%token <kwd> PROFILE_SYM -%token <kwd> PROFILES_SYM -%token <kwd> PROXY_SYM -%token <kwd> QUARTER_SYM -%token <kwd> QUERY_SYM -%token <kwd> QUICK -%token <kwd> RAW_MARIADB_SYM -%token <kwd> RAW_ORACLE_SYM /* Oracle-R */ -%token <kwd> READ_ONLY_SYM -%token <kwd> REBUILD_SYM -%token <kwd> RECOVER_SYM -%token <kwd> REDOFILE_SYM -%token <kwd> REDO_BUFFER_SIZE_SYM -%token <kwd> REDUNDANT_SYM -%token <kwd> RELAY -%token <kwd> RELAYLOG_SYM -%token <kwd> RELAY_LOG_FILE_SYM -%token <kwd> RELAY_LOG_POS_SYM -%token <kwd> RELAY_THREAD -%token <kwd> RELOAD -%token <kwd> REMOVE_SYM -%token <kwd> REORGANIZE_SYM -%token <kwd> REPAIR -%token <kwd> REPEATABLE_SYM /* SQL-2003-N */ -%token <kwd> REPLICATION -%token <kwd> RESET_SYM -%token <kwd> RESTART_SYM -%token <kwd> RESOURCES -%token <kwd> RESTORE_SYM -%token <kwd> RESUME_SYM -%token <kwd> RETURNED_SQLSTATE_SYM /* SQL-2003-N */ -%token <kwd> RETURNS_SYM /* SQL-2003-R */ -%token <kwd> REUSE_SYM /* Oracle-R */ -%token <kwd> REVERSE_SYM -%token <kwd> ROLE_SYM -%token <kwd> ROLLBACK_SYM /* SQL-2003-R */ -%token <kwd> ROLLUP_SYM /* SQL-2003-R */ -%token <kwd> ROUTINE_SYM /* SQL-2003-N */ -%token <kwd> ROWCOUNT_SYM /* Oracle-N */ -%token <kwd> ROW_SYM /* SQL-2003-R */ -%token <kwd> ROW_COUNT_SYM /* SQL-2003-N */ -%token <kwd> ROW_FORMAT_SYM -%token <kwd> RTREE_SYM -%token <kwd> SAVEPOINT_SYM /* SQL-2003-R */ -%token <kwd> SCHEDULE_SYM -%token <kwd> SCHEMA_NAME_SYM /* SQL-2003-N */ -%token <kwd> SECOND_SYM /* SQL-2003-R */ -%token <kwd> SECURITY_SYM /* SQL-2003-N */ -%token <kwd> SEQUENCE_SYM -%token <kwd> SERIALIZABLE_SYM /* SQL-2003-N */ -%token <kwd> SERIAL_SYM -%token <kwd> SESSION_SYM /* SQL-2003-N */ -%token <kwd> SERVER_SYM -%token <kwd> SETVAL_SYM /* PostgreSQL sequence function */ -%token <kwd> SHARE_SYM -%token <kwd> SHUTDOWN -%token <kwd> SIGNED_SYM -%token <kwd> SIMPLE_SYM /* SQL-2003-N */ -%token <kwd> SLAVE -%token <kwd> SLAVES -%token <kwd> SLAVE_POS_SYM -%token <kwd> SLOW -%token <kwd> SNAPSHOT_SYM -%token <kwd> SOCKET_SYM -%token <kwd> SOFT_SYM -%token <kwd> SONAME_SYM -%token <kwd> SOUNDS_SYM -%token <kwd> SOURCE_SYM -%token <kwd> SQL_BUFFER_RESULT -%token <kwd> SQL_CACHE_SYM -%token <kwd> SQL_CALC_FOUND_ROWS -%token <kwd> SQL_NO_CACHE_SYM -%token <kwd> SQL_THREAD -%token <kwd> STAGE_SYM -%token <kwd> STARTS_SYM -%token <kwd> START_SYM /* SQL-2003-R */ -%token <kwd> STATEMENT_SYM -%token <kwd> STATUS_SYM -%token <kwd> STOP_SYM -%token <kwd> STORAGE_SYM -%token <kwd> STORED_SYM -%token <kwd> STRING_SYM -%token <kwd> SUBCLASS_ORIGIN_SYM /* SQL-2003-N */ -%token <kwd> SUBDATE_SYM -%token <kwd> SUBJECT_SYM -%token <kwd> SUBPARTITIONS_SYM -%token <kwd> SUBPARTITION_SYM -%token <kwd> SUPER_SYM -%token <kwd> SUSPEND_SYM -%token <kwd> SWAPS_SYM -%token <kwd> SWITCHES_SYM -%token <kwd> SYSTEM /* SQL-2011-R */ -%token <kwd> SYSTEM_TIME_SYM /* SQL-2011-R */ -%token <kwd> TABLES -%token <kwd> TABLESPACE -%token <kwd> TABLE_CHECKSUM_SYM -%token <kwd> TABLE_NAME_SYM /* SQL-2003-N */ -%token <kwd> TEMPORARY /* SQL-2003-N */ -%token <kwd> TEMPTABLE_SYM -%token <kwd> TEXT_SYM -%token <kwd> THAN_SYM -%token <kwd> TIES_SYM /* SQL-2011-N */ -%token <kwd> TIMESTAMP /* SQL-2003-R */ -%token <kwd> TIMESTAMP_ADD -%token <kwd> TIMESTAMP_DIFF -%token <kwd> TIME_SYM /* SQL-2003-R, Oracle-R */ -%token <kwd> TRANSACTION_SYM -%token <kwd> TRANSACTIONAL_SYM -%token <kwd> TRIGGERS_SYM -%token <kwd> TRIM_ORACLE -%token <kwd> TRUNCATE_SYM -%token <kwd> TYPES_SYM -%token <kwd> TYPE_SYM /* SQL-2003-N */ -%token <kwd> UDF_RETURNS_SYM -%token <kwd> UNBOUNDED_SYM /* SQL-2011-N */ -%token <kwd> UNCOMMITTED_SYM /* SQL-2003-N */ -%token <kwd> UNDEFINED_SYM -%token <kwd> UNDOFILE_SYM -%token <kwd> UNDO_BUFFER_SIZE_SYM -%token <kwd> UNICODE_SYM -%token <kwd> UNINSTALL_SYM -%token <kwd> UNKNOWN_SYM /* SQL-2003-R */ -%token <kwd> UNTIL_SYM -%token <kwd> UPGRADE_SYM -%token <kwd> USER_SYM /* SQL-2003-R */ -%token <kwd> USE_FRM -%token <kwd> VALUE_SYM /* SQL-2003-R */ -%token <kwd> VARCHAR2_MARIADB_SYM -%token <kwd> VARCHAR2_ORACLE_SYM /* Oracle-R, PLSQL-R */ -%token <kwd> VARIABLES -%token <kwd> VERSIONING_SYM /* SQL-2011-R */ -%token <kwd> VIA_SYM -%token <kwd> VIEW_SYM /* SQL-2003-N */ -%token <kwd> VIRTUAL_SYM -%token <kwd> WAIT_SYM -%token <kwd> WARNINGS -%token <kwd> WEEK_SYM -%token <kwd> WEIGHT_STRING_SYM -%token <kwd> WINDOW_SYM /* SQL-2003-R */ -%token <kwd> WITHIN -%token <kwd> WITHOUT /* SQL-2003-R */ -%token <kwd> WORK_SYM /* SQL-2003-N */ -%token <kwd> WRAPPER_SYM -%token <kwd> WRITE_SYM /* SQL-2003-N */ -%token <kwd> X509_SYM -%token <kwd> XA_SYM -%token <kwd> XML_SYM -%token <kwd> YEAR_SYM /* SQL-2003-R */ - - -/* - Give ESCAPE (in LIKE) a very low precedence. - This allows the concatenation operator || to be used on the right - side of "LIKE" with sql_mode=PIPES_AS_CONCAT (without ORACLE): - SELECT 'ab' LIKE 'a'||'b'||'c'; -*/ -%left PREC_BELOW_ESCAPE -%left ESCAPE_SYM - -/* A dummy token to force the priority of table_ref production in a join. */ -%left CONDITIONLESS_JOIN -%left JOIN_SYM INNER_SYM STRAIGHT_JOIN CROSS LEFT RIGHT ON_SYM USING - -%left SET_VAR -%left OR_SYM OR2_SYM -%left XOR -%left AND_SYM AND_AND_SYM - -%left PREC_BELOW_NOT -%left NOT_SYM - -%left BETWEEN_SYM CASE_SYM WHEN_SYM THEN_SYM ELSE -%left '=' EQUAL_SYM GE '>' LE '<' NE IS LIKE SOUNDS_SYM REGEXP IN_SYM -%left '|' -%left '&' -%left SHIFT_LEFT SHIFT_RIGHT -%left '-' '+' ORACLE_CONCAT_SYM -%left '*' '/' '%' DIV_SYM MOD_SYM -%left '^' -%left MYSQL_CONCAT_SYM -%left NEG '~' NOT2_SYM BINARY -%left COLLATE_SYM -%left SUBQUERY_AS_EXPR - -/* - Tokens that can change their meaning from identifier to something else - in certain context. - - - TRANSACTION: identifier, history unit: - SELECT transaction FROM t1; - SELECT * FROM t1 FOR SYSTEM_TIME AS OF TRANSACTION @var; - - - TIMESTAMP: identifier, literal, history unit: - SELECT timestamp FROM t1; - SELECT TIMESTAMP '2001-01-01 10:20:30'; - SELECT * FROM t1 FOR SYSTEM_TIME AS OF TIMESTAMP CONCAT(@date,' ',@time); - - - PERIOD: identifier, period for system time: - SELECT period FROM t1; - ALTER TABLE DROP PERIOD FOR SYSTEM TIME; - - - SYSTEM: identifier, system versioning: - SELECT system FROM t1; - ALTER TABLE DROP SYSTEM VERSIONIONG; - - - USER: identifier, user: - SELECT user FROM t1; - KILL USER foo; - - Note, we need here only tokens that cause shift/reduce conflicts - with keyword identifiers. For example: - opt_clause1: %empty | KEYWORD ... ; - clause2: opt_clause1 ident; - KEYWORD can appear both in opt_clause1 and in "ident" through the "keyword" - rule. So the parser reports a conflict on how to interpret KEYWORD: - - as a start of non-empty branch in opt_clause1, or - - as an identifier which follows the empty branch in opt_clause1. - - Example#1: - alter_list_item: - DROP opt_column opt_if_exists_table_element field_ident - | DROP SYSTEM VERSIONING_SYM - SYSTEM can be a keyword in field_ident, or can be a start of - SYSTEM VERSIONING. - - Example#2: - system_time_expr: AS OF_SYM history_point - history_point: opt_history_unit bit_expr - opt_history_unit: | TRANSACTION_SYM - TRANSACTION can be a non-empty history unit, or can be an identifier - in bit_expr. - - In the grammar below we use %prec to explicitely tell Bison to go - through the empty branch in the optional rule only when the lookahead - token does not belong to a small set of selected tokens. - - Tokens NEXT_SYM and PREVIOUS_SYM also change their meaning from - identifiers to sequence operations when followed by VALUE_SYM: - SELECT NEXT VALUE FOR s1, PREVIOUS VALUE FOR s1; - but we don't need to list them here as they do not seem to cause - conflicts (according to bison -v), as both meanings - (as identifier, and as a sequence operation) are parts of the same target - column_default_non_parenthesized_expr, and there are no any optional - clauses between the start of column_default_non_parenthesized_expr - and until NEXT_SYM / PREVIOUS_SYM. -*/ -%left PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE -%left TRANSACTION_SYM TIMESTAMP PERIOD_SYM SYSTEM USER COMMENT_SYM - - -/* - Tokens that can appear in a token contraction on the second place - and change the meaning of the previous token. - - - TEXT_STRING: changes the meaning of TIMESTAMP/TIME/DATE - from identifier to literal: - SELECT timestamp FROM t1; - SELECT TIMESTAMP'2001-01-01 00:00:00' FROM t1; - - - Parenthesis: changes the meaning of TIMESTAMP/TIME/DATE - from identifiers to CAST-alike functions: - SELECT timestamp FROM t1; - SELECT timestamp(1) FROM t1; - - - VALUE: changes NEXT and PREVIOUS from identifier to sequence operation: - SELECT next, previous FROM t1; - SELECT NEXT VALUE FOR s1, PREVIOUS VALUE FOR s1; - - - VERSIONING: changes SYSTEM from identifier to SYSTEM VERSIONING - SELECT system FROM t1; - ALTER TABLE t1 ADD SYSTEM VERSIONING; -*/ -%left PREC_BELOW_CONTRACTION_TOKEN2 -%left TEXT_STRING '(' ')' VALUE_SYM VERSIONING_SYM -%left EMPTY_FROM_CLAUSE -%right INTO - -%type <lex_str> - DECIMAL_NUM FLOAT_NUM NUM LONG_NUM - HEX_NUM HEX_STRING - LEX_HOSTNAME ULONGLONG_NUM field_ident select_alias ident_or_text - TEXT_STRING_sys TEXT_STRING_literal - key_cache_name - sp_opt_label BIN_NUM TEXT_STRING_filesystem - opt_constraint constraint opt_ident - sp_block_label sp_control_label opt_place opt_db - -%type <ident_sys> - IDENT_sys - ident - label_ident - sp_decl_ident - ident_or_empty - ident_table_alias - ident_sysvar_name - ident_for_loop_index - -%type <lex_string_with_metadata> - TEXT_STRING - NCHAR_STRING - -%type <lex_str_ptr> - opt_table_alias_clause - table_alias_clause - -%type <ident_cli> - IDENT - IDENT_QUOTED - IDENT_cli - ident_cli - ident_cli_set_usual_case - -%type <kwd> - keyword_data_type - keyword_cast_type - keyword_ident - keyword_label - keyword_set_special_case - keyword_set_usual_case - keyword_sp_block_section - keyword_sp_decl - keyword_sp_head - keyword_sp_var_and_label - keyword_sp_var_not_label - keyword_sysvar_name - keyword_sysvar_type - keyword_table_alias - keyword_verb_clause - charset - reserved_keyword_udt - reserved_keyword_udt_not_param_type - non_reserved_keyword_udt - -%type <table> - table_ident table_ident_nodb references xid - table_ident_opt_wild create_like - -%type <qualified_column_ident> - optionally_qualified_column_ident - -%type <simple_string> - remember_name remember_end - remember_tok_start - wild_and_where - -%type <const_simple_string> - field_length opt_field_length - opt_compression_method - -%type <string> - text_string hex_or_bin_String opt_gconcat_separator - -%type <type_handler> int_type real_type - -%type <Lex_field_type> type_with_opt_collate field_type - field_type_numeric - field_type_string - field_type_lob - field_type_temporal - field_type_misc - -%type <Lex_dyncol_type> opt_dyncol_type dyncol_type - numeric_dyncol_type temporal_dyncol_type string_dyncol_type - -%type <create_field> field_spec column_def - -%type <num> - order_dir lock_option - udf_type opt_local opt_no_write_to_binlog - opt_temporary all_or_any opt_distinct opt_glimit_clause - opt_ignore_leaves fulltext_options union_option - opt_not - transaction_access_mode_types - opt_natural_language_mode opt_query_expansion - opt_ev_status opt_ev_on_completion ev_on_completion opt_ev_comment - ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_sql_stmt - optional_flush_tables_arguments - opt_time_precision kill_type kill_option int_num - opt_default_time_precision - case_stmt_body opt_bin_mod opt_for_system_time_clause - opt_if_exists_table_element opt_if_not_exists_table_element - opt_recursive opt_format_xid opt_for_portion_of_time_clause - -%type <object_ddl_options> - create_or_replace - opt_if_not_exists - opt_if_exists - -/* - Bit field of MYSQL_START_TRANS_OPT_* flags. -*/ -%type <num> opt_start_transaction_option_list -%type <num> start_transaction_option_list -%type <num> start_transaction_option - -%type <m_yes_no_unk> - opt_chain opt_release - -%type <m_fk_option> - delete_option - -%type <ulong_num> - ulong_num real_ulong_num merge_insert_types - ws_nweights - ws_level_flag_desc ws_level_flag_reverse ws_level_flags - opt_ws_levels ws_level_list ws_level_list_item ws_level_number - ws_level_range ws_level_list_or_range bool - field_options last_field_options - -%type <ulonglong_number> - ulonglong_num real_ulonglong_num size_number - -%type <longlong_number> - longlong_num - -%type <choice> choice - -%type <lock_type> - replace_lock_option opt_low_priority insert_lock_option load_data_lock - insert_replace_option - -%type <item> - literal insert_ident order_ident temporal_literal - simple_ident expr sum_expr in_sum_expr - variable variable_aux bool_pri - predicate bit_expr parenthesized_expr - table_wild simple_expr column_default_non_parenthesized_expr udf_expr - primary_expr string_factor_expr mysql_concatenation_expr - select_sublist_qualified_asterisk - expr_or_default set_expr_or_default - signed_literal expr_or_literal - opt_escape - sp_opt_default - simple_ident_nospvar - field_or_var limit_option - part_func_expr - window_func_expr - window_func - simple_window_func - inverse_distribution_function - percentile_function - inverse_distribution_function_def - explicit_cursor_attr - function_call_keyword - function_call_keyword_timestamp - function_call_nonkeyword - function_call_generic - function_call_conflict kill_expr - signal_allowed_expr - simple_target_specification - condition_number - opt_versioning_interval_start - -%type <item_param> param_marker - -%type <item_num> - NUM_literal - -%type <item_basic_constant> text_literal - -%type <item_list> - expr_list opt_udf_expr_list udf_expr_list when_list when_list_opt_else - ident_list ident_list_arg opt_expr_list - decode_when_list_oracle - execute_using - execute_params - -%type <sp_cursor_stmt> - sp_cursor_stmt_lex - sp_cursor_stmt - -%type <expr_lex> - expr_lex - -%type <assignment_lex> - assignment_source_lex - assignment_source_expr - for_loop_bound_expr - -%type <sp_assignment_lex_list> - cursor_actual_parameters - opt_parenthesized_cursor_actual_parameters - -%type <var_type> - option_type opt_var_type opt_var_ident_type - -%type <key_type> - opt_unique constraint_key_type fulltext spatial - -%type <key_alg> - btree_or_rtree opt_key_algorithm_clause opt_USING_key_algorithm - -%type <string_list> - using_list opt_use_partition use_partition - -%type <key_part> - key_part - -%type <table_list> - join_table_list join_table - table_factor table_ref esc_table_ref - table_primary_ident table_primary_ident_opt_parens - table_primary_derived table_primary_derived_opt_parens - derived_table_list table_reference_list_parens - nested_table_reference_list join_table_parens - update_table_list -%type <date_time_type> date_time_type; -%type <interval> interval - -%type <interval_time_st> interval_time_stamp - -%type <db_type> storage_engines known_storage_engines - -%type <row_type> row_types - -%type <tx_isolation> isolation_types - -%type <ha_rkey_mode> handler_rkey_mode - -%type <Lex_cast_type> cast_type cast_type_numeric cast_type_temporal - -%type <Lex_length_and_dec> precision opt_precision float_options - -%type <lex_user> user grant_user grant_role user_or_role current_role - admin_option_for_role user_maybe_role - -%type <user_auth> opt_auth_str auth_expression auth_token - -%type <charset> - opt_collate - charset_name - charset_or_alias - charset_name_or_default - old_or_new_charset_name - old_or_new_charset_name_or_default - collation_name - collation_name_or_default - opt_load_data_charset - UNDERSCORE_CHARSET - -%type <select_lex> subselect - query_specification - table_value_constructor - simple_table - query_simple - query_primary - subquery - select_into_query_specification - -%type <select_lex_unit> - query_expression - query_expression_no_with_clause - query_expression_body_ext - query_expression_body_ext_parens - query_expression_body - query_specification_start - -%type <boolfunc2creator> comp_op - -%type <dyncol_def> dyncall_create_element - -%type <dyncol_def_list> dyncall_create_list - -%type <myvar> select_outvar - -%type <virtual_column> opt_check_constraint check_constraint virtual_column_func - column_default_expr - -%type <unit_operation> unit_type_decl - -%type <select_lock> - opt_procedure_or_into - opt_select_lock_type - select_lock_type - opt_lock_wait_timeout_new - -%type <select_limit> opt_limit_clause limit_clause limit_options - -%type <order_limit_lock> - query_expression_tail - opt_query_expression_tail - order_or_limit - order_limit_lock - opt_order_limit_lock - -%type <select_order> opt_order_clause order_clause order_list - -%type <NONE> - directly_executable_statement - analyze_stmt_command backup backup_statements - query verb_clause create create_routine change select select_into - do drop drop_routine insert replace insert_start stmt_end - insert_values update delete truncate rename compound_statement - show describe load alter optimize keycache preload flush - reset purge begin_stmt_mariadb commit rollback savepoint release - slave master_def master_defs master_file_def slave_until_opts - repair analyze opt_with_admin opt_with_admin_option - analyze_table_list analyze_table_elem_spec - opt_persistent_stat_clause persistent_stat_spec - persistent_column_stat_spec persistent_index_stat_spec - table_column_list table_index_list table_index_name - check start checksum opt_returning - field_list field_list_item kill key_def constraint_def - keycache_list keycache_list_or_parts assign_to_keycache - assign_to_keycache_parts - preload_list preload_list_or_parts preload_keys preload_keys_parts - select_item_list select_item values_list no_braces - delete_limit_clause fields opt_values values - no_braces_with_names opt_values_with_names values_with_names - procedure_list procedure_list2 procedure_item - field_def handler opt_generated_always - opt_ignore opt_column opt_restrict - grant revoke set lock unlock string_list - opt_binary table_lock_list table_lock - ref_list opt_match_clause opt_on_update_delete use - opt_delete_options opt_delete_option varchar nchar nvarchar - opt_outer table_list table_name table_alias_ref_list table_alias_ref - attribute attribute_list - compressed_deprecated_data_type_attribute - compressed_deprecated_column_attribute - column_list column_list_id - opt_column_list grant_privileges grant_ident grant_list grant_option - object_privilege object_privilege_list user_list user_and_role_list - rename_list table_or_tables - clear_privileges flush_options flush_option - opt_flush_lock flush_lock flush_options_list - equal optional_braces - opt_mi_check_type opt_to mi_check_types - table_to_table_list table_to_table opt_table_list opt_as - handler_rkey_function handler_read_or_scan - single_multi table_wild_list table_wild_one opt_wild - opt_and - select_var_list select_var_list_init help - opt_extended_describe shutdown - opt_format_json - prepare execute deallocate - statement - sp_c_chistics sp_a_chistics sp_chistic sp_c_chistic xa - opt_field_or_var_spec fields_or_vars opt_load_data_set_spec - view_list_opt view_list view_select - trigger_tail event_tail - install uninstall partition_entry binlog_base64_event - normal_key_options normal_key_opts all_key_opt - spatial_key_options fulltext_key_options normal_key_opt - fulltext_key_opt spatial_key_opt fulltext_key_opts spatial_key_opts - keep_gcc_happy - key_using_alg - part_column_list - period_for_system_time - period_for_application_time - server_def server_options_list server_option - definer_opt no_definer definer get_diagnostics - parse_vcol_expr vcol_opt_specifier vcol_opt_attribute - vcol_opt_attribute_list vcol_attribute - opt_serial_attribute opt_serial_attribute_list serial_attribute - explainable_command - opt_lock_wait_timeout - opt_delete_gtid_domain - asrow_attribute - opt_constraint_no_id - -%type <NONE> call sp_proc_stmts sp_proc_stmts1 sp_proc_stmt -%type <NONE> sp_if_then_statements sp_case_then_statements -%type <NONE> sp_proc_stmt_statement sp_proc_stmt_return -%type <NONE> sp_proc_stmt_compound_ok -%type <NONE> sp_proc_stmt_if -%type <NONE> sp_labeled_control sp_unlabeled_control -%type <NONE> sp_labeled_block sp_unlabeled_block -%type <NONE> sp_proc_stmt_continue_oracle -%type <NONE> sp_proc_stmt_exit_oracle -%type <NONE> sp_proc_stmt_leave -%type <NONE> sp_proc_stmt_iterate -%type <NONE> sp_proc_stmt_goto_oracle -%type <NONE> sp_proc_stmt_with_cursor -%type <NONE> sp_proc_stmt_open sp_proc_stmt_fetch sp_proc_stmt_close -%type <NONE> case_stmt_specification -%type <NONE> loop_body while_body repeat_body -%type <NONE> for_loop_statements - -%type <num> view_algorithm view_check_option -%type <view_suid> view_suid opt_view_suid - -%type <plsql_cursor_attr> plsql_cursor_attr -%type <sp_suid> sp_suid -%type <sp_aggregate_type> opt_aggregate - -%type <num> sp_decl_idents sp_decl_idents_init_vars -%type <num> sp_handler_type sp_hcond_list -%type <spcondvalue> sp_cond sp_hcond sqlstate signal_value opt_signal_value -%type <spname> sp_name -%type <spvar> sp_param_name sp_param_name_and_type -%type <spvar> sp_param_name_and_type_anchored -%type <for_loop> sp_for_loop_index_and_bounds -%type <for_loop_bounds> sp_for_loop_bounds -%type <trim> trim_operands -%type <num> opt_sp_for_loop_direction -%type <spvar_mode> sp_parameter_type -%type <index_hint> index_hint_type -%type <num> index_hint_clause normal_join inner_join -%type <filetype> data_or_xml - -%type <NONE> signal_stmt resignal_stmt raise_stmt_oracle -%type <diag_condition_item_name> signal_condition_information_item_name - -%type <trg_execution_order> trigger_follows_precedes_clause; -%type <trigger_action_order_type> trigger_action_order; - -%type <diag_area> which_area; -%type <diag_info> diagnostics_information; -%type <stmt_info_item> statement_information_item; -%type <stmt_info_item_name> statement_information_item_name; -%type <stmt_info_list> statement_information; -%type <cond_info_item> condition_information_item; -%type <cond_info_item_name> condition_information_item_name; -%type <cond_info_list> condition_information; - -%type <spvar_definition> row_field_name row_field_definition -%type <spvar_definition_list> row_field_definition_list row_type_body - -%type <NONE> opt_window_clause window_def_list window_def window_spec -%type <lex_str_ptr> window_name -%type <NONE> opt_window_ref opt_window_frame_clause -%type <frame_units> window_frame_units; -%type <NONE> window_frame_extent; -%type <frame_exclusion> opt_window_frame_exclusion; -%type <window_frame_bound> window_frame_start window_frame_bound; - -%type <kwd> - '-' '+' '*' '/' '%' '(' ')' - ',' '!' '{' '}' '&' '|' - -%type <with_clause> with_clause - -%type <lex_str_ptr> query_name - -%type <lex_str_list> opt_with_column_list - -%type <vers_range_unit> opt_history_unit -%type <vers_history_point> history_point -%type <vers_column_versioning> with_or_without_system - -%{#ifdef SQL_MODE_DEFAULT_SPECIFIC -%type <NONE> sp_tail_standalone -%type <NONE> sp_unlabeled_block_not_atomic -%type <NONE> sp_proc_stmt_in_returns_clause -%type <lex_str> sp_label -%type <spblock> sp_decl_handler -%type <spblock> sp_decls -%type <spblock> sp_decl -%type <spblock> sp_decl_body -%type <spblock> sp_decl_variable_list -%type <spblock> sp_decl_variable_list_anchored -%type <kwd> reserved_keyword_udt_param_type -#endif %} // SQL_MODE_DEFAULT_SPECIFIC - - -//%{#ifdef SQL_MODE_ORACLE_SPECIFIC -%type <NONE> set_assign -%type <spvar_mode> sp_opt_inout -%type <NONE> sp_tail_standalone -%type <NONE> sp_labelable_stmt -%type <simple_string> remember_end_opt -%type <lex_str> opt_package_routine_end_name -%type <lex_str> label_declaration_oracle -%type <lex_str> labels_declaration_oracle -%type <kwd> keyword_directly_assignable -%type <ident_sys> ident_directly_assignable -%type <ident_cli> ident_cli_directly_assignable -%type <spname> opt_sp_name -%type <spblock> sp_decl_body_list -%type <spblock> opt_sp_decl_body_list -%type <spblock> sp_decl_variable_list -%type <spblock> sp_decl_variable_list_anchored -%type <spblock> sp_decl_non_handler -%type <spblock> sp_decl_non_handler_list -%type <spblock> sp_decl_handler -%type <spblock> sp_decl_handler_list -%type <spblock> opt_sp_decl_handler_list -%type <spblock> package_implementation_routine_definition -%type <spblock> package_implementation_item_declaration -%type <spblock> package_implementation_declare_section -%type <spblock> package_implementation_declare_section_list1 -%type <spblock> package_implementation_declare_section_list2 -%type <spblock_handlers> sp_block_statements_and_exceptions -%type <spblock_handlers> package_implementation_executable_section -%type <sp_instr_addr> sp_instr_addr -%type <num> opt_exception_clause exception_handlers -%type <lex> remember_lex -%type <lex> package_routine_lex -%type <lex> package_specification_function -%type <lex> package_specification_procedure -//#endif %} // SQL_MODE_ORACLE_SPECIFIC - -%% - - -/* - Indentation of grammar rules: - -rule: <-- starts at col 1 - rule1a rule1b rule1c <-- starts at col 11 - { <-- starts at col 11 - code <-- starts at col 13, indentation is 2 spaces - } - | rule2a rule2b - { - code - } - ; <-- on a line by itself, starts at col 9 - - Also, please do not use any <TAB>, but spaces. - Having a uniform indentation in this file helps - code reviews, patches, merges, and make maintenance easier. - Tip: grep [[:cntrl:]] sql_yacc.yy - Thanks. -*/ - -query: - END_OF_INPUT - { - if (!thd->bootstrap && - (!(thd->lex->lex_options & OPTION_LEX_FOUND_COMMENT))) - my_yyabort_error((ER_EMPTY_QUERY, MYF(0))); - - thd->lex->sql_command= SQLCOM_EMPTY_QUERY; - YYLIP->found_semicolon= NULL; - } - | directly_executable_statement - { - Lex_input_stream *lip = YYLIP; - - if ((thd->client_capabilities & CLIENT_MULTI_QUERIES) && - lip->multi_statements && - ! lip->eof()) - { - /* - We found a well formed query, and multi queries are allowed: - - force the parser to stop after the ';' - - mark the start of the next query for the next invocation - of the parser. - */ - lip->next_state= MY_LEX_END; - lip->found_semicolon= lip->get_ptr(); - } - else - { - /* Single query, terminated. */ - lip->found_semicolon= NULL; - } - } - ';' - opt_end_of_input - | directly_executable_statement END_OF_INPUT - { - /* Single query, not terminated. */ - YYLIP->found_semicolon= NULL; - } - ; - -opt_end_of_input: - /* empty */ - | END_OF_INPUT - ; - -directly_executable_statement: - statement - | begin_stmt_mariadb - | compound_statement - ; - -/* Verb clauses, except begin and compound_statement */ -verb_clause: - alter - | analyze - | analyze_stmt_command - | backup - | binlog_base64_event - | call - | change - | check - | checksum - | commit - | create - | deallocate - | delete - | describe - | do - | drop - | execute - | flush - | get_diagnostics - | grant - | handler - | help - | insert - | install - | keep_gcc_happy - | keycache - | kill - | load - | lock - | optimize - | parse_vcol_expr - | partition_entry - | preload - | prepare - | purge - | raise_stmt_oracle - | release - | rename - | repair - | replace - | reset - | resignal_stmt - | revoke - | rollback - | savepoint - | select - | select_into - | set - | signal_stmt - | show - | shutdown - | slave - | start - | truncate - | uninstall - | unlock - | update - | use - | xa - ; - -deallocate: - deallocate_or_drop PREPARE_SYM ident - { - Lex->stmt_deallocate_prepare($3); - } - ; - -deallocate_or_drop: - DEALLOCATE_SYM - | DROP - ; - -prepare: - PREPARE_SYM ident FROM - { Lex->clause_that_disallows_subselect= "PREPARE..FROM"; } - expr - { - Lex->clause_that_disallows_subselect= NULL; - if (Lex->stmt_prepare($2, $5)) - MYSQL_YYABORT; - } - ; - -execute: - EXECUTE_SYM ident execute_using - { - if (Lex->stmt_execute($2, $3)) - MYSQL_YYABORT; - } - | EXECUTE_SYM IMMEDIATE_SYM - { Lex->clause_that_disallows_subselect= "EXECUTE IMMEDIATE"; } - expr - { Lex->clause_that_disallows_subselect= NULL; } - execute_using - { - if (Lex->stmt_execute_immediate($4, $6)) - MYSQL_YYABORT; - } - ; - -execute_using: - /* nothing */ { $$= NULL; } - | USING - { Lex->clause_that_disallows_subselect= "EXECUTE..USING"; } - execute_params - { - $$= $3; - Lex->clause_that_disallows_subselect= NULL; - } - ; - -execute_params: - expr_or_default - { - if (unlikely(!($$= List<Item>::make(thd->mem_root, $1)))) - MYSQL_YYABORT; - } - | execute_params ',' expr_or_default - { - if (($$= $1)->push_back($3, thd->mem_root)) - MYSQL_YYABORT; - } - ; - - -/* help */ - -help: - HELP_SYM - { - if (unlikely(Lex->sphead)) - my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HELP")); - } - ident_or_text - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_HELP; - lex->help_arg= $3.str; - } - ; - -/* change master */ - -change: - CHANGE MASTER_SYM optional_connection_name TO_SYM - { - Lex->sql_command = SQLCOM_CHANGE_MASTER; - } - master_defs - {} - ; - -master_defs: - master_def - | master_defs ',' master_def - ; - -master_def: - MASTER_HOST_SYM '=' TEXT_STRING_sys - { - Lex->mi.host = $3.str; - } - | MASTER_USER_SYM '=' TEXT_STRING_sys - { - Lex->mi.user = $3.str; - } - | MASTER_PASSWORD_SYM '=' TEXT_STRING_sys - { - Lex->mi.password = $3.str; - } - | MASTER_PORT_SYM '=' ulong_num - { - Lex->mi.port = $3; - } - | MASTER_CONNECT_RETRY_SYM '=' ulong_num - { - Lex->mi.connect_retry = $3; - } - | MASTER_DELAY_SYM '=' ulong_num - { - if ($3 > MASTER_DELAY_MAX) - { - my_error(ER_MASTER_DELAY_VALUE_OUT_OF_RANGE, MYF(0), - (ulong) $3, (ulong) MASTER_DELAY_MAX); - } - else - Lex->mi.sql_delay = $3; - } - | MASTER_SSL_SYM '=' ulong_num - { - Lex->mi.ssl= $3 ? - LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; - } - | MASTER_SSL_CA_SYM '=' TEXT_STRING_sys - { - Lex->mi.ssl_ca= $3.str; - } - | MASTER_SSL_CAPATH_SYM '=' TEXT_STRING_sys - { - Lex->mi.ssl_capath= $3.str; - } - | MASTER_SSL_CERT_SYM '=' TEXT_STRING_sys - { - Lex->mi.ssl_cert= $3.str; - } - | MASTER_SSL_CIPHER_SYM '=' TEXT_STRING_sys - { - Lex->mi.ssl_cipher= $3.str; - } - | MASTER_SSL_KEY_SYM '=' TEXT_STRING_sys - { - Lex->mi.ssl_key= $3.str; - } - | MASTER_SSL_VERIFY_SERVER_CERT_SYM '=' ulong_num - { - Lex->mi.ssl_verify_server_cert= $3 ? - LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; - } - | MASTER_SSL_CRL_SYM '=' TEXT_STRING_sys - { - Lex->mi.ssl_crl= $3.str; - } - | MASTER_SSL_CRLPATH_SYM '=' TEXT_STRING_sys - { - Lex->mi.ssl_crlpath= $3.str; - } - - | MASTER_HEARTBEAT_PERIOD_SYM '=' NUM_literal - { - Lex->mi.heartbeat_period= (float) $3->val_real(); - if (unlikely(Lex->mi.heartbeat_period > - SLAVE_MAX_HEARTBEAT_PERIOD) || - unlikely(Lex->mi.heartbeat_period < 0.0)) - my_yyabort_error((ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, MYF(0), - SLAVE_MAX_HEARTBEAT_PERIOD)); - - if (unlikely(Lex->mi.heartbeat_period > slave_net_timeout)) - { - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, - ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); - } - if (unlikely(Lex->mi.heartbeat_period < 0.001)) - { - if (unlikely(Lex->mi.heartbeat_period != 0.0)) - { - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN, - ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN)); - Lex->mi.heartbeat_period= 0.0; - } - Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_DISABLE; - } - Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; - } - | IGNORE_SERVER_IDS_SYM '=' '(' ignore_server_id_list ')' - { - Lex->mi.repl_ignore_server_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; - } - | DO_DOMAIN_IDS_SYM '=' '(' do_domain_id_list ')' - { - Lex->mi.repl_do_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; - } - | IGNORE_DOMAIN_IDS_SYM '=' '(' ignore_domain_id_list ')' - { - Lex->mi.repl_ignore_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; - } - | - master_file_def - ; - -ignore_server_id_list: - /* Empty */ - | ignore_server_id - | ignore_server_id_list ',' ignore_server_id - ; - -ignore_server_id: - ulong_num - { - insert_dynamic(&Lex->mi.repl_ignore_server_ids, (uchar*) &($1)); - } - ; - -do_domain_id_list: - /* Empty */ - | do_domain_id - | do_domain_id_list ',' do_domain_id - ; - -do_domain_id: - ulong_num - { - insert_dynamic(&Lex->mi.repl_do_domain_ids, (uchar*) &($1)); - } - ; - -ignore_domain_id_list: - /* Empty */ - | ignore_domain_id - | ignore_domain_id_list ',' ignore_domain_id - ; - -ignore_domain_id: - ulong_num - { - insert_dynamic(&Lex->mi.repl_ignore_domain_ids, (uchar*) &($1)); - } - ; - -master_file_def: - MASTER_LOG_FILE_SYM '=' TEXT_STRING_sys - { - Lex->mi.log_file_name = $3.str; - } - | MASTER_LOG_POS_SYM '=' ulonglong_num - { - /* - If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it - instead of causing subsequent errors. - We need to do it in this file, because only there we know that - MASTER_LOG_POS has been explicitly specified. On the contrary - in change_master() (sql_repl.cc) we cannot distinguish between 0 - (MASTER_LOG_POS explicitly specified as 0) and 0 (unspecified), - whereas we want to distinguish (specified 0 means "read the binlog - from 0" (4 in fact), unspecified means "don't change the position - (keep the preceding value)"). - */ - Lex->mi.pos= MY_MAX(BIN_LOG_HEADER_SIZE, $3); - } - | RELAY_LOG_FILE_SYM '=' TEXT_STRING_sys - { - Lex->mi.relay_log_name = $3.str; - } - | RELAY_LOG_POS_SYM '=' ulong_num - { - Lex->mi.relay_log_pos = $3; - /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ - Lex->mi.relay_log_pos= MY_MAX(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos); - } - | MASTER_USE_GTID_SYM '=' CURRENT_POS_SYM - { - if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); - Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_CURRENT_POS; - } - | MASTER_USE_GTID_SYM '=' SLAVE_POS_SYM - { - if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); - Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_SLAVE_POS; - } - | MASTER_USE_GTID_SYM '=' NO_SYM - { - if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); - Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_NO; - } - ; - -optional_connection_name: - /* empty */ - { - LEX *lex= thd->lex; - lex->mi.connection_name= null_clex_str; - } - | connection_name - ; - -connection_name: - TEXT_STRING_sys - { - Lex->mi.connection_name= $1; -#ifdef HAVE_REPLICATION - if (unlikely(check_master_connection_name(&$1))) - my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); -#endif - } - ; - -/* create a table */ - -create: - create_or_replace opt_temporary TABLE_SYM opt_if_not_exists - { - LEX *lex= thd->lex; - if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_table())) - MYSQL_YYABORT; - lex->create_info.init(); - if (lex->main_select_push()) - MYSQL_YYABORT; - lex->current_select->parsing_place= BEFORE_OPT_LIST; - if (lex->set_command_with_check(SQLCOM_CREATE_TABLE, $2, $1 | $4)) - MYSQL_YYABORT; - } - table_ident - { - LEX *lex= thd->lex; - if (!lex->first_select_lex()-> - add_table_to_list(thd, $6, NULL, TL_OPTION_UPDATING, - TL_WRITE, MDL_SHARED_UPGRADABLE)) - MYSQL_YYABORT; - lex->alter_info.reset(); - /* - For CREATE TABLE we should not open the table even if it exists. - If the table exists, we should either not create it or replace it - */ - lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; - lex->create_info.default_table_charset= NULL; - lex->name= null_clex_str; - lex->create_last_non_select_table= lex->last_table(); - } - create_body - { - LEX *lex= thd->lex; - create_table_set_open_action_and_adjust_tables(lex); - Lex->pop_select(); //main select - } - | create_or_replace opt_temporary SEQUENCE_SYM opt_if_not_exists table_ident - { - LEX *lex= thd->lex; - if (lex->main_select_push()) - MYSQL_YYABORT; - if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_sequence())) - MYSQL_YYABORT; - lex->create_info.init(); - if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_SEQUENCE, $2, - $1 | $4))) - MYSQL_YYABORT; - - if (!lex->first_select_lex()-> - add_table_to_list(thd, $5, NULL, TL_OPTION_UPDATING, - TL_WRITE, MDL_EXCLUSIVE)) - MYSQL_YYABORT; - - /* - For CREATE TABLE, an non-existing table is not an error. - Instruct open_tables() to just take an MDL lock if the - table does not exist. - */ - lex->alter_info.reset(); - lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; - lex->name= null_clex_str; - lex->create_last_non_select_table= lex->last_table(); - if (unlikely(!(lex->create_info.seq_create_info= - new (thd->mem_root) sequence_definition()))) - MYSQL_YYABORT; - } - opt_sequence opt_create_table_options - { - LEX *lex= thd->lex; - - if (unlikely(lex->create_info.seq_create_info->check_and_adjust(1))) - { - my_error(ER_SEQUENCE_INVALID_DATA, MYF(0), - lex->first_select_lex()->table_list.first->db.str, - lex->first_select_lex()->table_list.first-> - table_name.str); - MYSQL_YYABORT; - } - - /* No fields specified, generate them */ - if (unlikely(prepare_sequence_fields(thd, - &lex->alter_info.create_list))) - MYSQL_YYABORT; - - /* CREATE SEQUENCE always creates a sequence */ - Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; - Lex->create_info.sequence= 1; - - create_table_set_open_action_and_adjust_tables(lex); - Lex->pop_select(); //main select - } - | create_or_replace opt_unique INDEX_SYM opt_if_not_exists - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - ident - opt_key_algorithm_clause - ON table_ident - { - if (Lex->add_create_index_prepare($9)) - MYSQL_YYABORT; - if (Lex->add_create_index($2, &$6, $7, $1 | $4)) - MYSQL_YYABORT; - } - '(' key_list ')' opt_lock_wait_timeout normal_key_options - opt_index_lock_algorithm - { - Lex->pop_select(); //main select - } - | create_or_replace fulltext INDEX_SYM - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - opt_if_not_exists ident - ON table_ident - { - if (Lex->add_create_index_prepare($8)) - MYSQL_YYABORT; - if (Lex->add_create_index($2, &$6, HA_KEY_ALG_UNDEF, $1 | $5)) - MYSQL_YYABORT; - } - '(' key_list ')' opt_lock_wait_timeout fulltext_key_options - opt_index_lock_algorithm - { - Lex->pop_select(); //main select - } - | create_or_replace spatial INDEX_SYM - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - opt_if_not_exists ident - ON table_ident - { - if (Lex->add_create_index_prepare($8)) - MYSQL_YYABORT; - if (Lex->add_create_index($2, &$6, HA_KEY_ALG_UNDEF, $1 | $5)) - MYSQL_YYABORT; - } - '(' key_list ')' opt_lock_wait_timeout spatial_key_options - opt_index_lock_algorithm - { - Lex->pop_select(); //main select - } - | create_or_replace DATABASE opt_if_not_exists ident - { - Lex->create_info.default_table_charset= NULL; - Lex->create_info.schema_comment= NULL; - Lex->create_info.used_fields= 0; - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - opt_create_database_options - { - LEX *lex=Lex; - if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_DB, 0, - $1 | $3))) - MYSQL_YYABORT; - lex->name= $4; - Lex->pop_select(); //main select - } - | create_or_replace definer_opt opt_view_suid VIEW_SYM - opt_if_not_exists table_ident - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - if (Lex->add_create_view(thd, $1 | $5, - DTYPE_ALGORITHM_UNDEFINED, $3, $6)) - MYSQL_YYABORT; - } - view_list_opt AS view_select - { - Lex->pop_select(); //main select - } - | create_or_replace view_algorithm definer_opt opt_view_suid VIEW_SYM - opt_if_not_exists table_ident - { - if (unlikely(Lex->add_create_view(thd, $1 | $6, $2, $4, $7))) - MYSQL_YYABORT; - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - view_list_opt AS view_select - { - Lex->pop_select(); //main select - } - | create_or_replace definer_opt TRIGGER_SYM - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - Lex->create_info.set($1); - } - trigger_tail - { - Lex->pop_select(); //main select - } - | create_or_replace definer_opt EVENT_SYM - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - Lex->create_info.set($1); - } - event_tail - { - Lex->pop_select(); //main select - } - | create_or_replace USER_SYM opt_if_not_exists clear_privileges - grant_list opt_require_clause opt_resource_options opt_account_locking opt_password_expiration - { - if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_USER, - $1 | $3))) - MYSQL_YYABORT; - } - | create_or_replace ROLE_SYM opt_if_not_exists - clear_privileges role_list opt_with_admin - { - if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_ROLE, - $1 | $3))) - MYSQL_YYABORT; - } - | CREATE LOGFILE_SYM GROUP_SYM logfile_group_info - { - Lex->alter_tablespace_info->ts_cmd_type= CREATE_LOGFILE_GROUP; - } - | CREATE TABLESPACE tablespace_info - { - Lex->alter_tablespace_info->ts_cmd_type= CREATE_TABLESPACE; - } - | create_or_replace { Lex->set_command(SQLCOM_CREATE_SERVER, $1); } - server_def - { } - | create_routine - ; - -opt_sequence: - /* empty */ { } - | sequence_defs - ; - -sequence_defs: - sequence_def - | sequence_defs sequence_def - ; - -sequence_def: - MINVALUE_SYM opt_equal longlong_num - { - Lex->create_info.seq_create_info->min_value= $3; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; - } - | NO_SYM MINVALUE_SYM - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); - Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; - } - | NOMINVALUE_SYM - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); - Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; - } - | MAXVALUE_SYM opt_equal longlong_num - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_max_value)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); - Lex->create_info.seq_create_info->max_value= $3; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; - } - | NO_SYM MAXVALUE_SYM - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); - Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; - } - | NOMAXVALUE_SYM - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); - Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; - } - | START_SYM opt_with longlong_num - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_start)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "START")); - Lex->create_info.seq_create_info->start= $3; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_start; - } - | INCREMENT_SYM opt_by longlong_num - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_increment)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "INCREMENT")); - Lex->create_info.seq_create_info->increment= $3; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment; - } - | CACHE_SYM opt_equal longlong_num - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_cache)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); - Lex->create_info.seq_create_info->cache= $3; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; - } - | NOCACHE_SYM - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_cache)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); - Lex->create_info.seq_create_info->cache= 0; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; - } - | CYCLE_SYM - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_cycle)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); - Lex->create_info.seq_create_info->cycle= 1; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; - } - | NOCYCLE_SYM - { - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_cycle)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); - Lex->create_info.seq_create_info->cycle= 0; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; - } - | RESTART_SYM - { - if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) - { - thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); - YYABORT; - } - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_restart)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); - Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart; - } - | RESTART_SYM opt_with longlong_num - { - if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) - { - thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); - YYABORT; - } - if (unlikely(Lex->create_info.seq_create_info->used_fields & - seq_field_used_restart)) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); - Lex->create_info.seq_create_info->restart= $3; - Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value; - } - ; - -server_def: - SERVER_SYM opt_if_not_exists ident_or_text - { - if (unlikely(Lex->add_create_options_with_check($2))) - MYSQL_YYABORT; - Lex->server_options.reset($3); - } - FOREIGN DATA_SYM WRAPPER_SYM ident_or_text - OPTIONS_SYM '(' server_options_list ')' - { Lex->server_options.scheme= $8; } - ; - -server_options_list: - server_option - | server_options_list ',' server_option - ; - -server_option: - USER_SYM TEXT_STRING_sys - { - MYSQL_YYABORT_UNLESS(Lex->server_options.username.str == 0); - Lex->server_options.username= $2; - } - | HOST_SYM TEXT_STRING_sys - { - MYSQL_YYABORT_UNLESS(Lex->server_options.host.str == 0); - Lex->server_options.host= $2; - } - | DATABASE TEXT_STRING_sys - { - MYSQL_YYABORT_UNLESS(Lex->server_options.db.str == 0); - Lex->server_options.db= $2; - } - | OWNER_SYM TEXT_STRING_sys - { - MYSQL_YYABORT_UNLESS(Lex->server_options.owner.str == 0); - Lex->server_options.owner= $2; - } - | PASSWORD_SYM TEXT_STRING_sys - { - MYSQL_YYABORT_UNLESS(Lex->server_options.password.str == 0); - Lex->server_options.password= $2; - } - | SOCKET_SYM TEXT_STRING_sys - { - MYSQL_YYABORT_UNLESS(Lex->server_options.socket.str == 0); - Lex->server_options.socket= $2; - } - | PORT_SYM ulong_num - { - Lex->server_options.port= $2; - } - ; - -event_tail: - remember_name opt_if_not_exists sp_name - { - LEX *lex=Lex; - - lex->stmt_definition_begin= $1; - if (unlikely(lex->add_create_options_with_check($2))) - MYSQL_YYABORT; - if (unlikely(!(lex->event_parse_data= - Event_parse_data::new_instance(thd)))) - MYSQL_YYABORT; - lex->event_parse_data->identifier= $3; - lex->event_parse_data->on_completion= - Event_parse_data::ON_COMPLETION_DROP; - - lex->sql_command= SQLCOM_CREATE_EVENT; - /* We need that for disallowing subqueries */ - } - ON SCHEDULE_SYM ev_schedule_time - opt_ev_on_completion - opt_ev_status - opt_ev_comment - DO_SYM ev_sql_stmt - { - /* - sql_command is set here because some rules in ev_sql_stmt - can overwrite it - */ - Lex->sql_command= SQLCOM_CREATE_EVENT; - } - ; - -ev_schedule_time: - EVERY_SYM expr interval - { - Lex->event_parse_data->item_expression= $2; - Lex->event_parse_data->interval= $3; - } - ev_starts - ev_ends - | AT_SYM expr - { - Lex->event_parse_data->item_execute_at= $2; - } - ; - -opt_ev_status: - /* empty */ { $$= 0; } - | ENABLE_SYM - { - Lex->event_parse_data->status= Event_parse_data::ENABLED; - Lex->event_parse_data->status_changed= true; - $$= 1; - } - | DISABLE_SYM ON SLAVE - { - Lex->event_parse_data->status= Event_parse_data::SLAVESIDE_DISABLED; - Lex->event_parse_data->status_changed= true; - $$= 1; - } - | DISABLE_SYM - { - Lex->event_parse_data->status= Event_parse_data::DISABLED; - Lex->event_parse_data->status_changed= true; - $$= 1; - } - ; - -ev_starts: - /* empty */ - { - Item *item= new (thd->mem_root) Item_func_now_local(thd, 0); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - Lex->event_parse_data->item_starts= item; - } - | STARTS_SYM expr - { - Lex->event_parse_data->item_starts= $2; - } - ; - -ev_ends: - /* empty */ - | ENDS_SYM expr - { - Lex->event_parse_data->item_ends= $2; - } - ; - -opt_ev_on_completion: - /* empty */ { $$= 0; } - | ev_on_completion - ; - -ev_on_completion: - ON COMPLETION_SYM opt_not PRESERVE_SYM - { - Lex->event_parse_data->on_completion= $3 - ? Event_parse_data::ON_COMPLETION_DROP - : Event_parse_data::ON_COMPLETION_PRESERVE; - $$= 1; - } - ; - -opt_ev_comment: - /* empty */ { $$= 0; } - | COMMENT_SYM TEXT_STRING_sys - { - Lex->comment= Lex->event_parse_data->comment= $2; - $$= 1; - } - ; - -ev_sql_stmt: - { - LEX *lex= thd->lex; - Lex_input_stream *lip= YYLIP; - - /* - This stops the following : - - CREATE EVENT ... DO CREATE EVENT ...; - - ALTER EVENT ... DO CREATE EVENT ...; - - CREATE EVENT ... DO ALTER EVENT DO ....; - - CREATE PROCEDURE ... BEGIN CREATE EVENT ... END| - This allows: - - CREATE EVENT ... DO DROP EVENT yyy; - - CREATE EVENT ... DO ALTER EVENT yyy; - (the nested ALTER EVENT can have anything but DO clause) - - ALTER EVENT ... DO ALTER EVENT yyy; - (the nested ALTER EVENT can have anything but DO clause) - - ALTER EVENT ... DO DROP EVENT yyy; - - CREATE PROCEDURE ... BEGIN ALTER EVENT ... END| - (the nested ALTER EVENT can have anything but DO clause) - - CREATE PROCEDURE ... BEGIN DROP EVENT ... END| - */ - if (unlikely(lex->sphead)) - my_yyabort_error((ER_EVENT_RECURSION_FORBIDDEN, MYF(0))); - - if (unlikely(!lex->make_sp_head(thd, - lex->event_parse_data->identifier, - &sp_handler_procedure, - DEFAULT_AGGREGATE))) - MYSQL_YYABORT; - - lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); - } - sp_proc_stmt - { - /* return back to the original memory root ASAP */ - if (Lex->sp_body_finalize_event(thd)) - MYSQL_YYABORT; - } - ; - -clear_privileges: - /* Nothing */ - { - LEX *lex=Lex; - lex->users_list.empty(); - lex->columns.empty(); - lex->grant= lex->grant_tot_col= 0; - lex->all_privileges= 0; - lex->first_select_lex()->db= null_clex_str; - lex->account_options.reset(); - } - ; - -opt_aggregate: - /* Empty */ { $$= NOT_AGGREGATE; } - | AGGREGATE_SYM { $$= GROUP_AGGREGATE; } - ; - -sp_name: - ident '.' ident - { - if (unlikely(!($$= Lex->make_sp_name(thd, &$1, &$3)))) - MYSQL_YYABORT; - } - | ident - { - if (unlikely(!($$= Lex->make_sp_name(thd, &$1)))) - MYSQL_YYABORT; - } - ; - -sp_a_chistics: - /* Empty */ {} - | sp_a_chistics sp_chistic {} - ; - -sp_c_chistics: - /* Empty */ {} - | sp_c_chistics sp_c_chistic {} - ; - -/* Characteristics for both create and alter */ -sp_chistic: - COMMENT_SYM TEXT_STRING_sys - { Lex->sp_chistics.comment= $2; } - | LANGUAGE_SYM SQL_SYM - { /* Just parse it, we only have one language for now. */ } - | NO_SYM SQL_SYM - { Lex->sp_chistics.daccess= SP_NO_SQL; } - | CONTAINS_SYM SQL_SYM - { Lex->sp_chistics.daccess= SP_CONTAINS_SQL; } - | READS_SYM SQL_SYM DATA_SYM - { Lex->sp_chistics.daccess= SP_READS_SQL_DATA; } - | MODIFIES_SYM SQL_SYM DATA_SYM - { Lex->sp_chistics.daccess= SP_MODIFIES_SQL_DATA; } - | sp_suid - { Lex->sp_chistics.suid= $1; } - ; - -/* Create characteristics */ -sp_c_chistic: - sp_chistic { } - | opt_not DETERMINISTIC_SYM { Lex->sp_chistics.detistic= ! $1; } - ; - -sp_suid: - SQL_SYM SECURITY_SYM DEFINER_SYM { $$= SP_IS_SUID; } - | SQL_SYM SECURITY_SYM INVOKER_SYM { $$= SP_IS_NOT_SUID; } - ; - -call: - CALL_SYM sp_name - { - if (unlikely(Lex->call_statement_start(thd, $2))) - MYSQL_YYABORT; - } - opt_sp_cparam_list {} - ; - -/* CALL parameters */ -opt_sp_cparam_list: - /* Empty */ - | '(' opt_sp_cparams ')' - ; - -opt_sp_cparams: - /* Empty */ - | sp_cparams - ; - -sp_cparams: - sp_cparams ',' expr - { - Lex->value_list.push_back($3, thd->mem_root); - } - | expr - { - Lex->value_list.push_back($1, thd->mem_root); - } - ; - -/* Stored FUNCTION parameter declaration list */ -sp_fdparam_list: - /* Empty */ - { - Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); - Lex->sphead->m_param_end= Lex->sphead->m_param_begin; - } - | - { - Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); - } - sp_fdparams - { - Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); - } - ; - -sp_fdparams: - sp_fdparams ',' sp_param_name_and_type - | sp_param_name_and_type - ; - -sp_param_name: - ident - { - if (unlikely(!($$= Lex->sp_param_init(&$1)))) - MYSQL_YYABORT; - } - ; - -sp_param_name_and_type: - sp_param_name type_with_opt_collate - { - if (unlikely(Lex->sp_param_fill_definition($$= $1, $2))) - MYSQL_YYABORT; - } - | sp_param_name ROW_SYM row_type_body - { - if (unlikely(Lex->sphead->spvar_fill_row(thd, $$= $1, $3))) - MYSQL_YYABORT; - } - | sp_param_name_and_type_anchored - ; - -/* Stored PROCEDURE parameter declaration list */ -sp_pdparam_list: - /* Empty */ - | sp_pdparams - ; - -sp_pdparams: - sp_pdparams ',' sp_pdparam - | sp_pdparam - ; - -sp_parameter_type: - IN_SYM { $$= sp_variable::MODE_IN; } - | OUT_SYM { $$= sp_variable::MODE_OUT; } - | INOUT_SYM { $$= sp_variable::MODE_INOUT; } - ; - -sp_parenthesized_pdparam_list: - '(' - { - Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start() + 1; - } - sp_pdparam_list - ')' - { - Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); - } - ; - -sp_parenthesized_fdparam_list: - '(' sp_fdparam_list ')' - ; - -sp_proc_stmts: - /* Empty */ {} - | sp_proc_stmts sp_proc_stmt ';' - ; - -sp_proc_stmts1: - sp_proc_stmt ';' {} - | sp_proc_stmts1 sp_proc_stmt ';' - ; - - -optionally_qualified_column_ident: - sp_decl_ident - { - if (unlikely(!($$= new (thd->mem_root) - Qualified_column_ident(&$1)))) - MYSQL_YYABORT; - } - | sp_decl_ident '.' ident - { - if (unlikely(!($$= new (thd->mem_root) - Qualified_column_ident(&$1, &$3)))) - MYSQL_YYABORT; - } - | sp_decl_ident '.' ident '.' ident - { - if (unlikely(!($$= new (thd->mem_root) - Qualified_column_ident(thd, &$1, &$3, &$5)))) - MYSQL_YYABORT; - } - ; - - -row_field_definition: - row_field_name type_with_opt_collate - { - Lex->last_field->set_attributes(thd, $2, Lex->charset, - COLUMN_DEFINITION_ROUTINE_LOCAL); - } - ; - -row_field_definition_list: - row_field_definition - { - if (!($$= Row_definition_list::make(thd->mem_root, $1))) - MYSQL_YYABORT; - } - | row_field_definition_list ',' row_field_definition - { - if (($$= $1)->append_uniq(thd->mem_root, $3)) - MYSQL_YYABORT; - } - ; - -row_type_body: - '(' row_field_definition_list ')' { $$= $2; } - ; - -sp_decl_idents_init_vars: - sp_decl_idents - { - Lex->sp_variable_declarations_init(thd, $1); - } - ; - -sp_decl_variable_list: - sp_decl_idents_init_vars - type_with_opt_collate - { - Lex->last_field->set_attributes(thd, $2, Lex->charset, - COLUMN_DEFINITION_ROUTINE_LOCAL); - } - sp_opt_default - { - if (unlikely(Lex->sp_variable_declarations_finalize(thd, $1, - &Lex->last_field[0], - $4))) - MYSQL_YYABORT; - $$.init_using_vars($1); - } - | sp_decl_idents_init_vars - ROW_SYM row_type_body - sp_opt_default - { - if (unlikely(Lex->sp_variable_declarations_row_finalize(thd, $1, $3, $4))) - MYSQL_YYABORT; - $$.init_using_vars($1); - } - | sp_decl_variable_list_anchored - ; - -sp_decl_handler: - sp_handler_type HANDLER_SYM FOR_SYM - { - if (unlikely(Lex->sp_handler_declaration_init(thd, $1))) - MYSQL_YYABORT; - } - sp_hcond_list sp_proc_stmt - { - if (unlikely(Lex->sp_handler_declaration_finalize(thd, $1))) - MYSQL_YYABORT; - $$.vars= $$.conds= $$.curs= 0; - $$.hndlrs= 1; - } - ; - -opt_parenthesized_cursor_formal_parameters: - /* Empty */ - | '(' sp_fdparams ')' - ; - - -sp_cursor_stmt_lex: - { - DBUG_ASSERT(thd->lex->sphead); - if (unlikely(!($$= new (thd->mem_root) - sp_lex_cursor(thd, thd->lex)))) - MYSQL_YYABORT; - } - ; - -sp_cursor_stmt: - sp_cursor_stmt_lex - { - DBUG_ASSERT(thd->free_list == NULL); - Lex->sphead->reset_lex(thd, $1); - } - select - { - DBUG_ASSERT(Lex == $1); - if (unlikely($1->stmt_finalize(thd)) || - unlikely($1->sphead->restore_lex(thd))) - MYSQL_YYABORT; - $$= $1; - } - ; - -sp_handler_type: - EXIT_MARIADB_SYM { $$= sp_handler::EXIT; } - | CONTINUE_MARIADB_SYM { $$= sp_handler::CONTINUE; } - | EXIT_ORACLE_SYM { $$= sp_handler::EXIT; } - | CONTINUE_ORACLE_SYM { $$= sp_handler::CONTINUE; } - /*| UNDO_SYM { QQ No yet } */ - ; - -sp_hcond_list: - sp_hcond_element - { $$= 1; } - | sp_hcond_list ',' sp_hcond_element - { $$+= 1; } - ; - -sp_hcond_element: - sp_hcond - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *ctx= lex->spcont->parent_context(); - - if (unlikely(ctx->check_duplicate_handler($1))) - my_yyabort_error((ER_SP_DUP_HANDLER, MYF(0))); - - sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); - i->add_condition($1); - } - ; - -sp_cond: - ulong_num - { /* mysql errno */ - if (unlikely($1 == 0)) - my_yyabort_error((ER_WRONG_VALUE, MYF(0), "CONDITION", "0")); - $$= new (thd->mem_root) sp_condition_value($1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | sqlstate - ; - -sqlstate: - SQLSTATE_SYM opt_value TEXT_STRING_literal - { /* SQLSTATE */ - - /* - An error is triggered: - - if the specified string is not a valid SQLSTATE, - - or if it represents the completion condition -- it is not - allowed to SIGNAL, or declare a handler for the completion - condition. - */ - if (unlikely(!is_sqlstate_valid(&$3) || - is_sqlstate_completion($3.str))) - my_yyabort_error((ER_SP_BAD_SQLSTATE, MYF(0), $3.str)); - $$= new (thd->mem_root) sp_condition_value($3.str); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -opt_value: - /* Empty */ {} - | VALUE_SYM {} - ; - -sp_hcond: - sp_cond - { - $$= $1; - } - | ident /* CONDITION name */ - { - $$= Lex->spcont->find_declared_or_predefined_condition(thd, &$1); - if (unlikely($$ == NULL)) - my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), $1.str)); - } - | SQLWARNING_SYM /* SQLSTATEs 01??? */ - { - $$= new (thd->mem_root) sp_condition_value(sp_condition_value::WARNING); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | not FOUND_SYM /* SQLSTATEs 02??? */ - { - $$= new (thd->mem_root) sp_condition_value(sp_condition_value::NOT_FOUND); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SQLEXCEPTION_SYM /* All other SQLSTATEs */ - { - $$= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | OTHERS_ORACLE_SYM /* All other SQLSTATEs */ - { - $$= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - - -raise_stmt_oracle: - RAISE_ORACLE_SYM opt_set_signal_information - { - if (unlikely(Lex->add_resignal_statement(thd, NULL))) - MYSQL_YYABORT; - } - | RAISE_ORACLE_SYM signal_value opt_set_signal_information - { - if (unlikely(Lex->add_signal_statement(thd, $2))) - MYSQL_YYABORT; - } - ; - -signal_stmt: - SIGNAL_SYM signal_value opt_set_signal_information - { - if (Lex->add_signal_statement(thd, $2)) - MYSQL_YYABORT; - } - ; - -signal_value: - ident - { - if (!($$= Lex->stmt_signal_value($1))) - MYSQL_YYABORT; - } - | sqlstate - { $$= $1; } - ; - -opt_signal_value: - /* empty */ - { $$= NULL; } - | signal_value - { $$= $1; } - ; - -opt_set_signal_information: - /* empty */ - { - thd->m_parser_state->m_yacc.m_set_signal_info.clear(); - } - | SET signal_information_item_list - ; - -signal_information_item_list: - signal_condition_information_item_name '=' signal_allowed_expr - { - Set_signal_information *info; - info= &thd->m_parser_state->m_yacc.m_set_signal_info; - int index= (int) $1; - info->clear(); - info->m_item[index]= $3; - } - | signal_information_item_list ',' - signal_condition_information_item_name '=' signal_allowed_expr - { - Set_signal_information *info; - info= &thd->m_parser_state->m_yacc.m_set_signal_info; - int index= (int) $3; - if (unlikely(info->m_item[index] != NULL)) - my_yyabort_error((ER_DUP_SIGNAL_SET, MYF(0), - Diag_condition_item_names[index].str)); - info->m_item[index]= $5; - } - ; - -/* - Only a limited subset of <expr> are allowed in SIGNAL/RESIGNAL. -*/ -signal_allowed_expr: - literal - { $$= $1; } - | variable - { - if ($1->type() == Item::FUNC_ITEM) - { - Item_func *item= (Item_func*) $1; - if (unlikely(item->functype() == Item_func::SUSERVAR_FUNC)) - { - /* - Don't allow the following syntax: - SIGNAL/RESIGNAL ... - SET <signal condition item name> = @foo := expr - */ - thd->parse_error(); - MYSQL_YYABORT; - } - } - $$= $1; - } - | simple_ident - { $$= $1; } - ; - -/* conditions that can be set in signal / resignal */ -signal_condition_information_item_name: - CLASS_ORIGIN_SYM - { $$= DIAG_CLASS_ORIGIN; } - | SUBCLASS_ORIGIN_SYM - { $$= DIAG_SUBCLASS_ORIGIN; } - | CONSTRAINT_CATALOG_SYM - { $$= DIAG_CONSTRAINT_CATALOG; } - | CONSTRAINT_SCHEMA_SYM - { $$= DIAG_CONSTRAINT_SCHEMA; } - | CONSTRAINT_NAME_SYM - { $$= DIAG_CONSTRAINT_NAME; } - | CATALOG_NAME_SYM - { $$= DIAG_CATALOG_NAME; } - | SCHEMA_NAME_SYM - { $$= DIAG_SCHEMA_NAME; } - | TABLE_NAME_SYM - { $$= DIAG_TABLE_NAME; } - | COLUMN_NAME_SYM - { $$= DIAG_COLUMN_NAME; } - | CURSOR_NAME_SYM - { $$= DIAG_CURSOR_NAME; } - | MESSAGE_TEXT_SYM - { $$= DIAG_MESSAGE_TEXT; } - | MYSQL_ERRNO_SYM - { $$= DIAG_MYSQL_ERRNO; } - ; - -resignal_stmt: - RESIGNAL_SYM opt_signal_value opt_set_signal_information - { - if (unlikely(Lex->add_resignal_statement(thd, $2))) - MYSQL_YYABORT; - } - ; - -get_diagnostics: - GET_SYM which_area DIAGNOSTICS_SYM diagnostics_information - { - Diagnostics_information *info= $4; - - info->set_which_da($2); - - Lex->sql_command= SQLCOM_GET_DIAGNOSTICS; - Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_get_diagnostics(info); - - if (unlikely(Lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - ; - -which_area: - /* If <which area> is not specified, then CURRENT is implicit. */ - { $$= Diagnostics_information::CURRENT_AREA; } - | CURRENT_SYM - { $$= Diagnostics_information::CURRENT_AREA; } - ; - -diagnostics_information: - statement_information - { - $$= new (thd->mem_root) Statement_information($1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | CONDITION_SYM condition_number condition_information - { - $$= new (thd->mem_root) Condition_information($2, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -statement_information: - statement_information_item - { - $$= new (thd->mem_root) List<Statement_information_item>; - if (unlikely($$ == NULL) || - unlikely($$->push_back($1, thd->mem_root))) - MYSQL_YYABORT; - } - | statement_information ',' statement_information_item - { - if (unlikely($1->push_back($3, thd->mem_root))) - MYSQL_YYABORT; - $$= $1; - } - ; - -statement_information_item: - simple_target_specification '=' statement_information_item_name - { - $$= new (thd->mem_root) Statement_information_item($3, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -simple_target_specification: - ident_cli - { - if (unlikely(!($$= thd->lex->create_item_for_sp_var(&$1, NULL)))) - MYSQL_YYABORT; - } - | '@' ident_or_text - { - $$= new (thd->mem_root) Item_func_get_user_var(thd, &$2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -statement_information_item_name: - NUMBER_MARIADB_SYM - { $$= Statement_information_item::NUMBER; } - | NUMBER_ORACLE_SYM - { $$= Statement_information_item::NUMBER; } - | ROW_COUNT_SYM - { $$= Statement_information_item::ROW_COUNT; } - ; - -/* - Only a limited subset of <expr> are allowed in GET DIAGNOSTICS - <condition number>, same subset as for SIGNAL/RESIGNAL. -*/ -condition_number: - signal_allowed_expr - { $$= $1; } - ; - -condition_information: - condition_information_item - { - $$= new (thd->mem_root) List<Condition_information_item>; - if (unlikely($$ == NULL) || - unlikely($$->push_back($1, thd->mem_root))) - MYSQL_YYABORT; - } - | condition_information ',' condition_information_item - { - if (unlikely($1->push_back($3, thd->mem_root))) - MYSQL_YYABORT; - $$= $1; - } - ; - -condition_information_item: - simple_target_specification '=' condition_information_item_name - { - $$= new (thd->mem_root) Condition_information_item($3, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -condition_information_item_name: - CLASS_ORIGIN_SYM - { $$= Condition_information_item::CLASS_ORIGIN; } - | SUBCLASS_ORIGIN_SYM - { $$= Condition_information_item::SUBCLASS_ORIGIN; } - | CONSTRAINT_CATALOG_SYM - { $$= Condition_information_item::CONSTRAINT_CATALOG; } - | CONSTRAINT_SCHEMA_SYM - { $$= Condition_information_item::CONSTRAINT_SCHEMA; } - | CONSTRAINT_NAME_SYM - { $$= Condition_information_item::CONSTRAINT_NAME; } - | CATALOG_NAME_SYM - { $$= Condition_information_item::CATALOG_NAME; } - | SCHEMA_NAME_SYM - { $$= Condition_information_item::SCHEMA_NAME; } - | TABLE_NAME_SYM - { $$= Condition_information_item::TABLE_NAME; } - | COLUMN_NAME_SYM - { $$= Condition_information_item::COLUMN_NAME; } - | CURSOR_NAME_SYM - { $$= Condition_information_item::CURSOR_NAME; } - | MESSAGE_TEXT_SYM - { $$= Condition_information_item::MESSAGE_TEXT; } - | MYSQL_ERRNO_SYM - { $$= Condition_information_item::MYSQL_ERRNO; } - | RETURNED_SQLSTATE_SYM - { $$= Condition_information_item::RETURNED_SQLSTATE; } - ; - -sp_decl_ident: - IDENT_sys - | keyword_sp_decl - { - if (unlikely($$.copy_ident_cli(thd, &$1))) - MYSQL_YYABORT; - } - ; - -sp_decl_idents: - sp_decl_ident - { - /* NOTE: field definition is filled in sp_decl section. */ - - LEX *lex= Lex; - sp_pcontext *spc= lex->spcont; - - if (unlikely(spc->find_variable(&$1, TRUE))) - my_yyabort_error((ER_SP_DUP_VAR, MYF(0), $1.str)); - spc->add_variable(thd, &$1); - $$= 1; - } - | sp_decl_idents ',' ident - { - /* NOTE: field definition is filled in sp_decl section. */ - - LEX *lex= Lex; - sp_pcontext *spc= lex->spcont; - - if (unlikely(spc->find_variable(&$3, TRUE))) - my_yyabort_error((ER_SP_DUP_VAR, MYF(0), $3.str)); - spc->add_variable(thd, &$3); - $$= $1 + 1; - } - ; - -sp_proc_stmt_if: - IF_SYM - { - if (unlikely(Lex->maybe_start_compound_statement(thd))) - MYSQL_YYABORT; - Lex->sphead->new_cont_backpatch(NULL); - } - sp_if END IF_SYM - { Lex->sphead->do_cont_backpatch(); } - ; - -sp_proc_stmt_statement: - { - LEX *lex= thd->lex; - Lex_input_stream *lip= YYLIP; - - lex->sphead->reset_lex(thd); - lex->sphead->m_tmp_query= lip->get_tok_start(); - } - sp_statement - { - if (Lex->sp_proc_stmt_statement_finalize(thd, yychar == YYEMPTY) || - Lex->sphead->restore_lex(thd)) - MYSQL_YYABORT; - } - ; - - -RETURN_ALLMODES_SYM: - RETURN_MARIADB_SYM - | RETURN_ORACLE_SYM - ; - -sp_proc_stmt_return: - RETURN_ALLMODES_SYM expr_lex - { - sp_head *sp= $2->sphead; - if (unlikely(sp->m_handler->add_instr_freturn(thd, sp, $2->spcont, - $2->get_item(), $2))) - MYSQL_YYABORT; - } - | RETURN_ORACLE_SYM - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - if (unlikely(sp->m_handler->add_instr_preturn(thd, sp, - lex->spcont))) - MYSQL_YYABORT; - } - ; - -sp_proc_stmt_exit_oracle: - EXIT_ORACLE_SYM - { - if (unlikely(Lex->sp_exit_statement(thd, NULL))) - MYSQL_YYABORT; - } - | EXIT_ORACLE_SYM label_ident - { - if (unlikely(Lex->sp_exit_statement(thd, &$2, NULL))) - MYSQL_YYABORT; - } - | EXIT_ORACLE_SYM WHEN_SYM expr_lex - { - if (unlikely($3->sp_exit_statement(thd, $3->get_item()))) - MYSQL_YYABORT; - } - | EXIT_ORACLE_SYM label_ident WHEN_SYM expr_lex - { - if (unlikely($4->sp_exit_statement(thd, &$2, $4->get_item()))) - MYSQL_YYABORT; - } - ; - -sp_proc_stmt_continue_oracle: - CONTINUE_ORACLE_SYM - { - if (unlikely(Lex->sp_continue_statement(thd))) - MYSQL_YYABORT; - } - | CONTINUE_ORACLE_SYM label_ident - { - if (unlikely(Lex->sp_continue_statement(thd, &$2))) - MYSQL_YYABORT; - } - | CONTINUE_ORACLE_SYM WHEN_SYM expr_lex - { - if (unlikely($3->sp_continue_when_statement(thd))) - MYSQL_YYABORT; - } - | CONTINUE_ORACLE_SYM label_ident WHEN_SYM expr_lex - { - if (unlikely($4->sp_continue_when_statement(thd, &$2))) - MYSQL_YYABORT; - } - ; - - -sp_proc_stmt_leave: - LEAVE_SYM label_ident - { - if (unlikely(Lex->sp_leave_statement(thd, &$2))) - MYSQL_YYABORT; - } - ; - -sp_proc_stmt_iterate: - ITERATE_SYM label_ident - { - if (unlikely(Lex->sp_iterate_statement(thd, &$2))) - MYSQL_YYABORT; - } - ; - -sp_proc_stmt_goto_oracle: - GOTO_ORACLE_SYM label_ident - { - if (unlikely(Lex->sp_goto_statement(thd, &$2))) - MYSQL_YYABORT; - } - ; - - -expr_lex: - { - DBUG_ASSERT(Lex->sphead); - if (unlikely(!($<expr_lex>$= new (thd->mem_root) - sp_expr_lex(thd, thd->lex)))) - MYSQL_YYABORT; - Lex->sphead->reset_lex(thd, $<expr_lex>$); - } - expr - { - $$= $<expr_lex>1; - $$->sp_lex_in_use= true; - $$->set_item($2); - if ($$->sphead->restore_lex(thd)) - MYSQL_YYABORT; - } - ; - - -assignment_source_lex: - { - DBUG_ASSERT(Lex->sphead); - if (unlikely(!($$= new (thd->mem_root) - sp_assignment_lex(thd, thd->lex)))) - MYSQL_YYABORT; - } - ; - -assignment_source_expr: - assignment_source_lex - { - DBUG_ASSERT(thd->free_list == NULL); - Lex->sphead->reset_lex(thd, $1); - } - expr - { - DBUG_ASSERT($1 == thd->lex); - $$= $1; - $$->sp_lex_in_use= true; - $$->set_item_and_free_list($3, thd->free_list); - thd->free_list= NULL; - if ($$->sphead->restore_lex(thd)) - MYSQL_YYABORT; - } - ; - -for_loop_bound_expr: - assignment_source_lex - { - Lex->sphead->reset_lex(thd, $1); - Lex->current_select->parsing_place= FOR_LOOP_BOUND; - } - expr - { - DBUG_ASSERT($1 == thd->lex); - $$= $1; - $$->sp_lex_in_use= true; - $$->set_item_and_free_list($3, NULL); - if (unlikely($$->sphead->restore_lex(thd))) - MYSQL_YYABORT; - Lex->current_select->parsing_place= NO_MATTER; - } - ; - -cursor_actual_parameters: - assignment_source_expr - { - if (unlikely(!($$= new (thd->mem_root) List<sp_assignment_lex>))) - MYSQL_YYABORT; - $$->push_back($1, thd->mem_root); - } - | cursor_actual_parameters ',' assignment_source_expr - { - $$= $1; - $$->push_back($3, thd->mem_root); - } - ; - -opt_parenthesized_cursor_actual_parameters: - /* Empty */ { $$= NULL; } - | '(' cursor_actual_parameters ')' { $$= $2; } - ; - -sp_proc_stmt_with_cursor: - sp_proc_stmt_open - | sp_proc_stmt_fetch - | sp_proc_stmt_close - ; - -sp_proc_stmt_open: - OPEN_SYM ident opt_parenthesized_cursor_actual_parameters - { - if (unlikely(Lex->sp_open_cursor(thd, &$2, $3))) - MYSQL_YYABORT; - } - ; - -sp_proc_stmt_fetch_head: - FETCH_SYM ident INTO - { - if (unlikely(Lex->sp_add_cfetch(thd, &$2))) - MYSQL_YYABORT; - } - | FETCH_SYM FROM ident INTO - { - if (unlikely(Lex->sp_add_cfetch(thd, &$3))) - MYSQL_YYABORT; - } - | FETCH_SYM NEXT_SYM FROM ident INTO - { - if (unlikely(Lex->sp_add_cfetch(thd, &$4))) - MYSQL_YYABORT; - } - ; - -sp_proc_stmt_fetch: - sp_proc_stmt_fetch_head sp_fetch_list { } - | FETCH_SYM GROUP_SYM NEXT_SYM ROW_SYM - { - if (unlikely(Lex->sp_add_agg_cfetch())) - MYSQL_YYABORT; - } - ; - -sp_proc_stmt_close: - CLOSE_SYM ident - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - uint offset; - sp_instr_cclose *i; - - if (unlikely(!lex->spcont->find_cursor(&$2, &offset, false))) - my_yyabort_error((ER_SP_CURSOR_MISMATCH, MYF(0), $2.str)); - i= new (thd->mem_root) - sp_instr_cclose(sp->instructions(), lex->spcont, offset); - if (unlikely(i == NULL) || - unlikely(sp->add_instr(i))) - MYSQL_YYABORT; - } - ; - -sp_fetch_list: - ident - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *spc= lex->spcont; - sp_variable *spv; - - if (unlikely(!spc || !(spv = spc->find_variable(&$1, false)))) - my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), $1.str)); - - /* An SP local variable */ - sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); - i->add_to_varlist(spv); - } - | sp_fetch_list ',' ident - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - sp_pcontext *spc= lex->spcont; - sp_variable *spv; - - if (unlikely(!spc || !(spv = spc->find_variable(&$3, false)))) - my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), $3.str)); - - /* An SP local variable */ - sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); - i->add_to_varlist(spv); - } - ; - -sp_if: - expr_lex THEN_SYM - { - if (unlikely($1->sp_if_expr(thd))) - MYSQL_YYABORT; - } - sp_if_then_statements - { - if (unlikely($1->sp_if_after_statements(thd))) - MYSQL_YYABORT; - } - sp_elseifs - { - LEX *lex= Lex; - - lex->sphead->backpatch(lex->spcont->pop_label()); - } - ; - -sp_elseifs: - /* Empty */ - | ELSEIF_MARIADB_SYM sp_if - | ELSIF_ORACLE_SYM sp_if - | ELSE sp_if_then_statements - ; - -case_stmt_specification: - CASE_SYM - { - if (unlikely(Lex->maybe_start_compound_statement(thd))) - MYSQL_YYABORT; - - /** - An example of the CASE statement in use is - <pre> - CREATE PROCEDURE proc_19194_simple(i int) - BEGIN - DECLARE str CHAR(10); - - CASE i - WHEN 1 THEN SET str="1"; - WHEN 2 THEN SET str="2"; - WHEN 3 THEN SET str="3"; - ELSE SET str="unknown"; - END CASE; - - SELECT str; - END - </pre> - The actions are used to generate the following code: - <pre> - SHOW PROCEDURE CODE proc_19194_simple; - Pos Instruction - 0 set str@1 NULL - 1 set_case_expr (12) 0 i@0 - 2 jump_if_not 5(12) (case_expr@0 = 1) - 3 set str@1 _latin1'1' - 4 jump 12 - 5 jump_if_not 8(12) (case_expr@0 = 2) - 6 set str@1 _latin1'2' - 7 jump 12 - 8 jump_if_not 11(12) (case_expr@0 = 3) - 9 set str@1 _latin1'3' - 10 jump 12 - 11 set str@1 _latin1'unknown' - 12 stmt 0 "SELECT str" - </pre> - */ - - Lex->sphead->new_cont_backpatch(NULL); - - /* - BACKPATCH: Creating target label for the jump to after END CASE - (instruction 12 in the example) - */ - Lex->spcont->push_label(thd, &empty_clex_str, Lex->sphead->instructions()); - } - case_stmt_body - else_clause_opt - END - CASE_SYM - { - /* - BACKPATCH: Resolving forward jump from - "case_stmt_action_then" to after END CASE - (jump from instruction 4 to 12, 7 to 12 ... in the example) - */ - Lex->sphead->backpatch(Lex->spcont->pop_label()); - - if ($3) - Lex->spcont->pop_case_expr_id(); - - Lex->sphead->do_cont_backpatch(); - } - ; - -case_stmt_body: - expr_lex - { - if (unlikely($1->case_stmt_action_expr())) - MYSQL_YYABORT; - } - simple_when_clause_list - { $$= 1; } - | searched_when_clause_list - { $$= 0; } - ; - -simple_when_clause_list: - simple_when_clause - | simple_when_clause_list simple_when_clause - ; - -searched_when_clause_list: - searched_when_clause - | searched_when_clause_list searched_when_clause - ; - -simple_when_clause: - WHEN_SYM expr_lex - { - /* Simple case: <caseval> = <whenval> */ - if (unlikely($2->case_stmt_action_when(true))) - MYSQL_YYABORT; - } - THEN_SYM - sp_case_then_statements - { - if (unlikely(Lex->case_stmt_action_then())) - MYSQL_YYABORT; - } - ; - -searched_when_clause: - WHEN_SYM expr_lex - { - if (unlikely($2->case_stmt_action_when(false))) - MYSQL_YYABORT; - } - THEN_SYM - sp_case_then_statements - { - if (unlikely(Lex->case_stmt_action_then())) - MYSQL_YYABORT; - } - ; - -else_clause_opt: - /* empty */ - { - LEX *lex= Lex; - sp_head *sp= lex->sphead; - uint ip= sp->instructions(); - sp_instr_error *i= new (thd->mem_root) - sp_instr_error(ip, lex->spcont, ER_SP_CASE_NOT_FOUND); - if (unlikely(i == NULL) || - unlikely(sp->add_instr(i))) - MYSQL_YYABORT; - } - | ELSE sp_case_then_statements - ; - -sp_opt_label: - /* Empty */ { $$= null_clex_str; } - | label_ident { $$= $1; } - ; - -/* This adds one shift/reduce conflict */ -opt_sp_for_loop_direction: - /* Empty */ { $$= 1; } - | REVERSE_SYM { $$= -1; } - ; - -sp_for_loop_index_and_bounds: - ident_for_loop_index sp_for_loop_bounds - { - if (unlikely(Lex->sp_for_loop_declarations(thd, &$$, &$1, $2))) - MYSQL_YYABORT; - } - ; - -sp_for_loop_bounds: - IN_SYM opt_sp_for_loop_direction for_loop_bound_expr - DOT_DOT_SYM for_loop_bound_expr - { - $$= Lex_for_loop_bounds_intrange($2, $3, $5); - } - | IN_SYM opt_sp_for_loop_direction for_loop_bound_expr - { - $$.m_direction= $2; - $$.m_index= $3; - $$.m_target_bound= NULL; - $$.m_implicit_cursor= false; - } - | IN_SYM opt_sp_for_loop_direction '(' sp_cursor_stmt ')' - { - if (unlikely(Lex->sp_for_loop_implicit_cursor_statement(thd, &$$, - $4))) - MYSQL_YYABORT; - } - ; - -loop_body: - sp_proc_stmts1 END LOOP_SYM - { - LEX *lex= Lex; - uint ip= lex->sphead->instructions(); - sp_label *lab= lex->spcont->last_label(); /* Jumping back */ - sp_instr_jump *i= new (thd->mem_root) - sp_instr_jump(ip, lex->spcont, lab->ip); - if (unlikely(i == NULL) || - unlikely(lex->sphead->add_instr(i))) - MYSQL_YYABORT; - } - ; - -repeat_body: - sp_proc_stmts1 UNTIL_SYM expr_lex END REPEAT_SYM - { - if ($3->sp_repeat_loop_finalize(thd)) - MYSQL_YYABORT; - } - ; - -pop_sp_loop_label: - sp_opt_label - { - if (unlikely(Lex->sp_pop_loop_label(thd, &$1))) - MYSQL_YYABORT; - } - ; - -sp_labeled_control: - sp_control_label LOOP_SYM - { - if (unlikely(Lex->sp_push_loop_label(thd, &$1))) - MYSQL_YYABORT; - } - loop_body pop_sp_loop_label - { } - | sp_control_label WHILE_SYM - { - if (unlikely(Lex->sp_push_loop_label(thd, &$1))) - MYSQL_YYABORT; - } - while_body pop_sp_loop_label - { } - | sp_control_label FOR_SYM - { - // See "The FOR LOOP statement" comments in sql_lex.cc - Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block - } - sp_for_loop_index_and_bounds - { - if (unlikely(Lex->sp_push_loop_label(thd, &$1))) // The inner WHILE block - MYSQL_YYABORT; - if (unlikely(Lex->sp_for_loop_condition_test(thd, $4))) - MYSQL_YYABORT; - } - for_loop_statements - { - if (unlikely(Lex->sp_for_loop_finalize(thd, $4))) - MYSQL_YYABORT; - } - pop_sp_loop_label // The inner WHILE block - { - if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, $4))) - MYSQL_YYABORT; - } - | sp_control_label REPEAT_SYM - { - if (unlikely(Lex->sp_push_loop_label(thd, &$1))) - MYSQL_YYABORT; - } - repeat_body pop_sp_loop_label - { } - ; - -sp_unlabeled_control: - LOOP_SYM - { - if (unlikely(Lex->sp_push_loop_empty_label(thd))) - MYSQL_YYABORT; - } - loop_body - { - Lex->sp_pop_loop_empty_label(thd); - } - | WHILE_SYM - { - if (unlikely(Lex->sp_push_loop_empty_label(thd))) - MYSQL_YYABORT; - } - while_body - { - Lex->sp_pop_loop_empty_label(thd); - } - | FOR_SYM - { - // See "The FOR LOOP statement" comments in sql_lex.cc - if (unlikely(Lex->maybe_start_compound_statement(thd))) - MYSQL_YYABORT; - Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block - } - sp_for_loop_index_and_bounds - { - if (unlikely(Lex->sp_push_loop_empty_label(thd))) // The inner WHILE block - MYSQL_YYABORT; - if (unlikely(Lex->sp_for_loop_condition_test(thd, $3))) - MYSQL_YYABORT; - } - for_loop_statements - { - if (unlikely(Lex->sp_for_loop_finalize(thd, $3))) - MYSQL_YYABORT; - Lex->sp_pop_loop_empty_label(thd); // The inner WHILE block - if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, $3))) - MYSQL_YYABORT; - } - | REPEAT_SYM - { - if (unlikely(Lex->sp_push_loop_empty_label(thd))) - MYSQL_YYABORT; - } - repeat_body - { - Lex->sp_pop_loop_empty_label(thd); - } - ; - -trg_action_time: - BEFORE_SYM - { Lex->trg_chistics.action_time= TRG_ACTION_BEFORE; } - | AFTER_SYM - { Lex->trg_chistics.action_time= TRG_ACTION_AFTER; } - ; - -trg_event: - INSERT - { Lex->trg_chistics.event= TRG_EVENT_INSERT; } - | UPDATE_SYM - { Lex->trg_chistics.event= TRG_EVENT_UPDATE; } - | DELETE_SYM - { Lex->trg_chistics.event= TRG_EVENT_DELETE; } - ; -/* - This part of the parser contains common code for all TABLESPACE - commands. - CREATE TABLESPACE name ... - ALTER TABLESPACE name CHANGE DATAFILE ... - ALTER TABLESPACE name ADD DATAFILE ... - ALTER TABLESPACE name access_mode - CREATE LOGFILE GROUP_SYM name ... - ALTER LOGFILE GROUP_SYM name ADD UNDOFILE .. - ALTER LOGFILE GROUP_SYM name ADD REDOFILE .. - DROP TABLESPACE name - DROP LOGFILE GROUP_SYM name -*/ -change_tablespace_access: - tablespace_name - ts_access_mode - ; - -change_tablespace_info: - tablespace_name - CHANGE ts_datafile - change_ts_option_list - ; - -tablespace_info: - tablespace_name - ADD ts_datafile - opt_logfile_group_name - tablespace_option_list - ; - -opt_logfile_group_name: - /* empty */ {} - | USE_SYM LOGFILE_SYM GROUP_SYM ident - { - LEX *lex= Lex; - lex->alter_tablespace_info->logfile_group_name= $4.str; - } - ; - -alter_tablespace_info: - tablespace_name - ADD ts_datafile - alter_tablespace_option_list - { - Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_ADD_FILE; - } - | tablespace_name - DROP ts_datafile - alter_tablespace_option_list - { - Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_DROP_FILE; - } - ; - -logfile_group_info: - logfile_group_name - add_log_file - logfile_group_option_list - ; - -alter_logfile_group_info: - logfile_group_name - add_log_file - alter_logfile_group_option_list - ; - -add_log_file: - ADD lg_undofile - | ADD lg_redofile - ; - -change_ts_option_list: - /* empty */ {} - change_ts_options - ; - -change_ts_options: - change_ts_option - | change_ts_options change_ts_option - | change_ts_options ',' change_ts_option - ; - -change_ts_option: - opt_ts_initial_size - | opt_ts_autoextend_size - | opt_ts_max_size - ; - -tablespace_option_list: - tablespace_options - ; - -tablespace_options: - tablespace_option - | tablespace_options tablespace_option - | tablespace_options ',' tablespace_option - ; - -tablespace_option: - opt_ts_initial_size - | opt_ts_autoextend_size - | opt_ts_max_size - | opt_ts_extent_size - | opt_ts_nodegroup - | opt_ts_engine - | ts_wait - | opt_ts_comment - ; - -alter_tablespace_option_list: - alter_tablespace_options - ; - -alter_tablespace_options: - alter_tablespace_option - | alter_tablespace_options alter_tablespace_option - | alter_tablespace_options ',' alter_tablespace_option - ; - -alter_tablespace_option: - opt_ts_initial_size - | opt_ts_autoextend_size - | opt_ts_max_size - | opt_ts_engine - | ts_wait - ; - -logfile_group_option_list: - logfile_group_options - ; - -logfile_group_options: - logfile_group_option - | logfile_group_options logfile_group_option - | logfile_group_options ',' logfile_group_option - ; - -logfile_group_option: - opt_ts_initial_size - | opt_ts_undo_buffer_size - | opt_ts_redo_buffer_size - | opt_ts_nodegroup - | opt_ts_engine - | ts_wait - | opt_ts_comment - ; - -alter_logfile_group_option_list: - alter_logfile_group_options - ; - -alter_logfile_group_options: - alter_logfile_group_option - | alter_logfile_group_options alter_logfile_group_option - | alter_logfile_group_options ',' alter_logfile_group_option - ; - -alter_logfile_group_option: - opt_ts_initial_size - | opt_ts_engine - | ts_wait - ; - - -ts_datafile: - DATAFILE_SYM TEXT_STRING_sys - { - LEX *lex= Lex; - lex->alter_tablespace_info->data_file_name= $2.str; - } - ; - -lg_undofile: - UNDOFILE_SYM TEXT_STRING_sys - { - LEX *lex= Lex; - lex->alter_tablespace_info->undo_file_name= $2.str; - } - ; - -lg_redofile: - REDOFILE_SYM TEXT_STRING_sys - { - LEX *lex= Lex; - lex->alter_tablespace_info->redo_file_name= $2.str; - } - ; - -tablespace_name: - ident - { - LEX *lex= Lex; - lex->alter_tablespace_info= (new (thd->mem_root) - st_alter_tablespace()); - if (unlikely(lex->alter_tablespace_info == NULL)) - MYSQL_YYABORT; - lex->alter_tablespace_info->tablespace_name= $1.str; - lex->sql_command= SQLCOM_ALTER_TABLESPACE; - } - ; - -logfile_group_name: - ident - { - LEX *lex= Lex; - lex->alter_tablespace_info= (new (thd->mem_root) - st_alter_tablespace()); - if (unlikely(lex->alter_tablespace_info == NULL)) - MYSQL_YYABORT; - lex->alter_tablespace_info->logfile_group_name= $1.str; - lex->sql_command= SQLCOM_ALTER_TABLESPACE; - } - ; - -ts_access_mode: - READ_ONLY_SYM - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_access_mode= TS_READ_ONLY; - } - | READ_WRITE_SYM - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_access_mode= TS_READ_WRITE; - } - | NOT_SYM ACCESSIBLE_SYM - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_access_mode= TS_NOT_ACCESSIBLE; - } - ; - -opt_ts_initial_size: - INITIAL_SIZE_SYM opt_equal size_number - { - LEX *lex= Lex; - lex->alter_tablespace_info->initial_size= $3; - } - ; - -opt_ts_autoextend_size: - AUTOEXTEND_SIZE_SYM opt_equal size_number - { - LEX *lex= Lex; - lex->alter_tablespace_info->autoextend_size= $3; - } - ; - -opt_ts_max_size: - MAX_SIZE_SYM opt_equal size_number - { - LEX *lex= Lex; - lex->alter_tablespace_info->max_size= $3; - } - ; - -opt_ts_extent_size: - EXTENT_SIZE_SYM opt_equal size_number - { - LEX *lex= Lex; - lex->alter_tablespace_info->extent_size= $3; - } - ; - -opt_ts_undo_buffer_size: - UNDO_BUFFER_SIZE_SYM opt_equal size_number - { - LEX *lex= Lex; - lex->alter_tablespace_info->undo_buffer_size= $3; - } - ; - -opt_ts_redo_buffer_size: - REDO_BUFFER_SIZE_SYM opt_equal size_number - { - LEX *lex= Lex; - lex->alter_tablespace_info->redo_buffer_size= $3; - } - ; - -opt_ts_nodegroup: - NODEGROUP_SYM opt_equal real_ulong_num - { - LEX *lex= Lex; - if (unlikely(lex->alter_tablespace_info->nodegroup_id != UNDEF_NODEGROUP)) - my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"NODEGROUP")); - lex->alter_tablespace_info->nodegroup_id= $3; - } - ; - -opt_ts_comment: - COMMENT_SYM opt_equal TEXT_STRING_sys - { - LEX *lex= Lex; - if (unlikely(lex->alter_tablespace_info->ts_comment != NULL)) - my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"COMMENT")); - lex->alter_tablespace_info->ts_comment= $3.str; - } - ; - -opt_ts_engine: - opt_storage ENGINE_SYM opt_equal storage_engines - { - LEX *lex= Lex; - if (unlikely(lex->alter_tablespace_info->storage_engine != NULL)) - my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE, MYF(0), - "STORAGE ENGINE")); - lex->alter_tablespace_info->storage_engine= $4; - } - ; - -opt_ts_wait: - /* empty */ - | ts_wait - ; - -ts_wait: - WAIT_SYM - { - LEX *lex= Lex; - lex->alter_tablespace_info->wait_until_completed= TRUE; - } - | NO_WAIT_SYM - { - LEX *lex= Lex; - if (unlikely(!(lex->alter_tablespace_info->wait_until_completed))) - my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"NO_WAIT")); - lex->alter_tablespace_info->wait_until_completed= FALSE; - } - ; - -size_number: - real_ulonglong_num { $$= $1;} - | IDENT_sys - { - if ($1.to_size_number(&$$)) - MYSQL_YYABORT; - } - ; - -/* - End tablespace part -*/ - -create_body: - create_field_list_parens - { Lex->create_info.option_list= NULL; } - opt_create_table_options opt_create_partitioning opt_create_select {} - | opt_create_table_options opt_create_partitioning opt_create_select {} - | create_like - { - - Lex->create_info.add(DDL_options_st::OPT_LIKE); - TABLE_LIST *src_table= Lex->first_select_lex()-> - add_table_to_list(thd, $1, NULL, 0, TL_READ, MDL_SHARED_READ); - if (unlikely(! src_table)) - MYSQL_YYABORT; - /* CREATE TABLE ... LIKE is not allowed for views. */ - src_table->required_type= TABLE_TYPE_NORMAL; - } - ; - -create_like: - LIKE table_ident { $$= $2; } - | LEFT_PAREN_LIKE LIKE table_ident ')' { $$= $3; } - ; - -opt_create_select: - /* empty */ {} - | opt_duplicate opt_as create_select_query_expression opt_versioning_option - ; - -create_select_query_expression: - query_expression - { - if (Lex->parsed_insert_select($1->first_select())) - MYSQL_YYABORT; - } - | LEFT_PAREN_WITH with_clause query_expression_no_with_clause ')' - { - SELECT_LEX *first_select= $3->first_select(); - $3->set_with_clause($2); - $2->attach_to(first_select); - if (Lex->parsed_insert_select(first_select)) - MYSQL_YYABORT; - } - ; - -opt_create_partitioning: - opt_partitioning - { - /* - Remove all tables used in PARTITION clause from the global table - list. Partitioning with subqueries is not allowed anyway. - */ - TABLE_LIST *last_non_sel_table= Lex->create_last_non_select_table; - last_non_sel_table->next_global= 0; - Lex->query_tables_last= &last_non_sel_table->next_global; - } - ; - -/* - This part of the parser is about handling of the partition information. - - Its first version was written by Mikael Ronström with lots of answers to - questions provided by Antony Curtis. - - The partition grammar can be called from three places. - 1) CREATE TABLE ... PARTITION .. - 2) ALTER TABLE table_name PARTITION ... - 3) PARTITION ... - - The first place is called when a new table is created from a MySQL client. - The second place is called when a table is altered with the ALTER TABLE - command from a MySQL client. - The third place is called when opening an frm file and finding partition - info in the .frm file. It is necessary to avoid allowing PARTITION to be - an allowed entry point for SQL client queries. This is arranged by setting - some state variables before arriving here. - - To be able to handle errors we will only set error code in this code - and handle the error condition in the function calling the parser. This - is necessary to ensure we can also handle errors when calling the parser - from the openfrm function. -*/ -opt_partitioning: - /* empty */ {} - | partitioning - ; - -partitioning: - PARTITION_SYM have_partitioning - { - LEX *lex= Lex; - lex->part_info= new (thd->mem_root) partition_info(); - if (unlikely(!lex->part_info)) - MYSQL_YYABORT; - if (lex->sql_command == SQLCOM_ALTER_TABLE) - { - lex->alter_info.partition_flags|= ALTER_PARTITION_INFO; - } - } - partition - ; - -have_partitioning: - /* empty */ - { -#ifdef WITH_PARTITION_STORAGE_ENGINE - LEX_CSTRING partition_name={STRING_WITH_LEN("partition")}; - if (unlikely(!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN))) - my_yyabort_error((ER_OPTION_PREVENTS_STATEMENT, MYF(0), - "--skip-partition")); -#else - my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), "partitioning", - "--with-plugin-partition")); -#endif - } - ; - -partition_entry: - PARTITION_SYM - { - if (unlikely(!Lex->part_info)) - { - thd->parse_error(ER_PARTITION_ENTRY_ERROR); - MYSQL_YYABORT; - } - if (Lex->main_select_push()) - MYSQL_YYABORT; - /* - We enter here when opening the frm file to translate - partition info string into part_info data structure. - */ - } - partition - { - Lex->pop_select(); //main select - } - ; - -partition: - BY - { Lex->safe_to_cache_query= 1; } - part_type_def opt_num_parts opt_sub_part part_defs - ; - -part_type_def: - opt_linear KEY_SYM opt_key_algo '(' part_field_list ')' - { - partition_info *part_info= Lex->part_info; - part_info->list_of_part_fields= TRUE; - part_info->column_list= FALSE; - part_info->part_type= HASH_PARTITION; - } - | opt_linear HASH_SYM - { Lex->part_info->part_type= HASH_PARTITION; } - part_func {} - | RANGE_SYM part_func - { Lex->part_info->part_type= RANGE_PARTITION; } - | RANGE_SYM part_column_list - { Lex->part_info->part_type= RANGE_PARTITION; } - | LIST_SYM - { - Select->parsing_place= IN_PART_FUNC; - } - part_func - { - Lex->part_info->part_type= LIST_PARTITION; - Select->parsing_place= NO_MATTER; - } - | LIST_SYM part_column_list - { Lex->part_info->part_type= LIST_PARTITION; } - | SYSTEM_TIME_SYM - { - if (unlikely(Lex->part_info->vers_init_info(thd))) - MYSQL_YYABORT; - } - opt_versioning_rotation - ; - -opt_linear: - /* empty */ {} - | LINEAR_SYM - { Lex->part_info->linear_hash_ind= TRUE;} - ; - -opt_key_algo: - /* empty */ - { Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_NONE;} - | ALGORITHM_SYM '=' real_ulong_num - { - switch ($3) { - case 1: - Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_51; - break; - case 2: - Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_55; - break; - default: - thd->parse_error(); - MYSQL_YYABORT; - } - } - ; - -part_field_list: - /* empty */ {} - | part_field_item_list {} - ; - -part_field_item_list: - part_field_item {} - | part_field_item_list ',' part_field_item {} - ; - -part_field_item: - ident - { - partition_info *part_info= Lex->part_info; - part_info->num_columns++; - if (unlikely(part_info->part_field_list.push_back($1.str, - thd->mem_root))) - MYSQL_YYABORT; - if (unlikely(part_info->num_columns > MAX_REF_PARTS)) - my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), - "list of partition fields")); - } - ; - -part_column_list: - COLUMNS '(' part_field_list ')' - { - partition_info *part_info= Lex->part_info; - part_info->column_list= TRUE; - part_info->list_of_part_fields= TRUE; - } - ; - - -part_func: - '(' part_func_expr ')' - { - partition_info *part_info= Lex->part_info; - if (unlikely(part_info->set_part_expr(thd, $2, FALSE))) - MYSQL_YYABORT; - part_info->num_columns= 1; - part_info->column_list= FALSE; - } - ; - -sub_part_func: - '(' part_func_expr ')' - { - if (unlikely(Lex->part_info->set_part_expr(thd, $2, TRUE))) - MYSQL_YYABORT; - } - ; - - -opt_num_parts: - /* empty */ {} - | PARTITIONS_SYM real_ulong_num - { - uint num_parts= $2; - partition_info *part_info= Lex->part_info; - if (unlikely(num_parts == 0)) - my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "partitions")); - - part_info->num_parts= num_parts; - part_info->use_default_num_partitions= FALSE; - } - ; - -opt_sub_part: - /* empty */ {} - | SUBPARTITION_SYM BY opt_linear HASH_SYM sub_part_func - { Lex->part_info->subpart_type= HASH_PARTITION; } - opt_num_subparts {} - | SUBPARTITION_SYM BY opt_linear KEY_SYM opt_key_algo - '(' sub_part_field_list ')' - { - partition_info *part_info= Lex->part_info; - part_info->subpart_type= HASH_PARTITION; - part_info->list_of_subpart_fields= TRUE; - } - opt_num_subparts {} - ; - -sub_part_field_list: - sub_part_field_item {} - | sub_part_field_list ',' sub_part_field_item {} - ; - -sub_part_field_item: - ident - { - partition_info *part_info= Lex->part_info; - if (unlikely(part_info->subpart_field_list.push_back($1.str, - thd->mem_root))) - MYSQL_YYABORT; - - if (unlikely(part_info->subpart_field_list.elements > MAX_REF_PARTS)) - my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), - "list of subpartition fields")); - } - ; - -part_func_expr: - bit_expr - { - if (unlikely(!Lex->safe_to_cache_query)) - { - thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); - MYSQL_YYABORT; - } - $$=$1; - } - ; - -opt_num_subparts: - /* empty */ {} - | SUBPARTITIONS_SYM real_ulong_num - { - uint num_parts= $2; - LEX *lex= Lex; - if (unlikely(num_parts == 0)) - my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "subpartitions")); - lex->part_info->num_subparts= num_parts; - lex->part_info->use_default_num_subpartitions= FALSE; - } - ; - -part_defs: - /* empty */ - { - partition_info *part_info= Lex->part_info; - if (unlikely(part_info->part_type == RANGE_PARTITION)) - my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), - "RANGE")); - if (unlikely(part_info->part_type == LIST_PARTITION)) - my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), - "LIST")); - } - | '(' part_def_list ')' - { - partition_info *part_info= Lex->part_info; - uint count_curr_parts= part_info->partitions.elements; - if (part_info->num_parts != 0) - { - if (unlikely(part_info->num_parts != - count_curr_parts)) - { - thd->parse_error(ER_PARTITION_WRONG_NO_PART_ERROR); - MYSQL_YYABORT; - } - } - else if (count_curr_parts > 0) - { - part_info->num_parts= count_curr_parts; - } - part_info->count_curr_subparts= 0; - } - ; - -part_def_list: - part_definition {} - | part_def_list ',' part_definition {} - ; - -part_definition: - PARTITION_SYM - { - partition_info *part_info= Lex->part_info; - partition_element *p_elem= new (thd->mem_root) partition_element(); - - if (unlikely(!p_elem) || - unlikely(part_info->partitions.push_back(p_elem, thd->mem_root))) - MYSQL_YYABORT; - - p_elem->part_state= PART_NORMAL; - p_elem->id= part_info->partitions.elements - 1; - part_info->curr_part_elem= p_elem; - part_info->current_partition= p_elem; - part_info->use_default_partitions= FALSE; - part_info->use_default_num_partitions= FALSE; - } - part_name - opt_part_values - opt_part_options - opt_sub_partition - {} - ; - -part_name: - ident - { - partition_info *part_info= Lex->part_info; - partition_element *p_elem= part_info->curr_part_elem; - if (unlikely(check_ident_length(&$1))) - MYSQL_YYABORT; - p_elem->partition_name= $1.str; - } - ; - -opt_part_values: - /* empty */ - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - if (! lex->is_partition_management()) - { - if (unlikely(part_info->error_if_requires_values())) - MYSQL_YYABORT; - if (unlikely(part_info->part_type == VERSIONING_PARTITION)) - my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0), - lex->create_last_non_select_table-> - table_name.str)); - } - else - part_info->part_type= HASH_PARTITION; - } - | VALUES_LESS_SYM THAN_SYM - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - if (! lex->is_partition_management()) - { - if (unlikely(part_info->part_type != RANGE_PARTITION)) - my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), - "RANGE", "LESS THAN")); - } - else - part_info->part_type= RANGE_PARTITION; - } - part_func_max {} - | VALUES_IN_SYM - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - if (! lex->is_partition_management()) - { - if (unlikely(part_info->part_type != LIST_PARTITION)) - my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), - "LIST", "IN")); - } - else - part_info->part_type= LIST_PARTITION; - } - part_values_in {} - | CURRENT_SYM - { - if (Lex->part_values_current(thd)) - MYSQL_YYABORT; - } - | HISTORY_SYM - { - if (Lex->part_values_history(thd)) - MYSQL_YYABORT; - } - | DEFAULT - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - if (! lex->is_partition_management()) - { - if (unlikely(part_info->part_type != LIST_PARTITION)) - my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), - "LIST", "DEFAULT")); - } - else - part_info->part_type= LIST_PARTITION; - if (unlikely(part_info->init_column_part(thd))) - MYSQL_YYABORT; - if (unlikely(part_info->add_max_value(thd))) - MYSQL_YYABORT; - } - ; - -part_func_max: - MAXVALUE_SYM - { - partition_info *part_info= Lex->part_info; - - if (unlikely(part_info->num_columns && - part_info->num_columns != 1U)) - { - part_info->print_debug("Kilroy II", NULL); - thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); - MYSQL_YYABORT; - } - else - part_info->num_columns= 1U; - if (unlikely(part_info->init_column_part(thd))) - MYSQL_YYABORT; - if (unlikely(part_info->add_max_value(thd))) - MYSQL_YYABORT; - } - | part_value_item {} - ; - -part_values_in: - part_value_item - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - part_info->print_debug("part_values_in: part_value_item", NULL); - - if (part_info->num_columns != 1U) - { - if (unlikely(!lex->is_partition_management() || - part_info->num_columns == 0 || - part_info->num_columns > MAX_REF_PARTS)) - { - part_info->print_debug("Kilroy III", NULL); - thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); - MYSQL_YYABORT; - } - /* - Reorganize the current large array into a list of small - arrays with one entry in each array. This can happen - in the first partition of an ALTER TABLE statement where - we ADD or REORGANIZE partitions. Also can only happen - for LIST partitions. - */ - if (unlikely(part_info->reorganize_into_single_field_col_val(thd))) - MYSQL_YYABORT; - } - } - | '(' part_value_list ')' - { - partition_info *part_info= Lex->part_info; - if (unlikely(part_info->num_columns < 2U)) - { - thd->parse_error(ER_ROW_SINGLE_PARTITION_FIELD_ERROR); - MYSQL_YYABORT; - } - } - ; - -part_value_list: - part_value_item {} - | part_value_list ',' part_value_item {} - ; - -part_value_item: - '(' - { - partition_info *part_info= Lex->part_info; - part_info->print_debug("( part_value_item", NULL); - /* Initialisation code needed for each list of value expressions */ - if (unlikely(!(part_info->part_type == LIST_PARTITION && - part_info->num_columns == 1U) && - part_info->init_column_part(thd))) - MYSQL_YYABORT; - } - part_value_item_list {} - ')' - { - partition_info *part_info= Lex->part_info; - part_info->print_debug(") part_value_item", NULL); - if (part_info->num_columns == 0) - part_info->num_columns= part_info->curr_list_object; - if (unlikely(part_info->num_columns != part_info->curr_list_object)) - { - /* - All value items lists must be of equal length, in some cases - which is covered by the above if-statement we don't know yet - how many columns is in the partition so the assignment above - ensures that we only report errors when we know we have an - error. - */ - part_info->print_debug("Kilroy I", NULL); - thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); - MYSQL_YYABORT; - } - part_info->curr_list_object= 0; - } - ; - -part_value_item_list: - part_value_expr_item {} - | part_value_item_list ',' part_value_expr_item {} - ; - -part_value_expr_item: - MAXVALUE_SYM - { - partition_info *part_info= Lex->part_info; - if (unlikely(part_info->part_type == LIST_PARTITION)) - { - thd->parse_error(ER_MAXVALUE_IN_VALUES_IN); - MYSQL_YYABORT; - } - if (unlikely(part_info->add_max_value(thd))) - MYSQL_YYABORT; - } - | bit_expr - { - LEX *lex= Lex; - partition_info *part_info= lex->part_info; - Item *part_expr= $1; - - if (unlikely(!lex->safe_to_cache_query)) - { - thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); - MYSQL_YYABORT; - } - if (unlikely(part_info->add_column_list_value(thd, part_expr))) - MYSQL_YYABORT; - } - ; - - -opt_sub_partition: - /* empty */ - { - partition_info *part_info= Lex->part_info; - if (unlikely(part_info->num_subparts != 0 && - !part_info->use_default_subpartitions)) - { - /* - We come here when we have defined subpartitions on the first - partition but not on all the subsequent partitions. - */ - thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); - MYSQL_YYABORT; - } - } - | '(' sub_part_list ')' - { - partition_info *part_info= Lex->part_info; - if (part_info->num_subparts != 0) - { - if (unlikely(part_info->num_subparts != - part_info->count_curr_subparts)) - { - thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); - MYSQL_YYABORT; - } - } - else if (part_info->count_curr_subparts > 0) - { - if (unlikely(part_info->partitions.elements > 1)) - { - thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); - MYSQL_YYABORT; - } - part_info->num_subparts= part_info->count_curr_subparts; - } - part_info->count_curr_subparts= 0; - } - ; - -sub_part_list: - sub_part_definition {} - | sub_part_list ',' sub_part_definition {} - ; - -sub_part_definition: - SUBPARTITION_SYM - { - partition_info *part_info= Lex->part_info; - partition_element *curr_part= part_info->current_partition; - partition_element *sub_p_elem= new (thd->mem_root) - partition_element(curr_part); - if (unlikely(part_info->use_default_subpartitions && - part_info->partitions.elements >= 2)) - { - /* - create table t1 (a int) - partition by list (a) subpartition by hash (a) - (partition p0 values in (1), - partition p1 values in (2) subpartition sp11); - causes use to arrive since we are on the second - partition, but still use_default_subpartitions - is set. When we come here we're processing at least - the second partition (the current partition processed - have already been put into the partitions list. - */ - thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); - MYSQL_YYABORT; - } - if (unlikely(!sub_p_elem) || - unlikely(curr_part->subpartitions.push_back(sub_p_elem, thd->mem_root))) - MYSQL_YYABORT; - - sub_p_elem->id= curr_part->subpartitions.elements - 1; - part_info->curr_part_elem= sub_p_elem; - part_info->use_default_subpartitions= FALSE; - part_info->use_default_num_subpartitions= FALSE; - part_info->count_curr_subparts++; - } - sub_name opt_part_options {} - ; - -sub_name: - ident_or_text - { - if (unlikely(check_ident_length(&$1))) - MYSQL_YYABORT; - Lex->part_info->curr_part_elem->partition_name= $1.str; - } - ; - -opt_part_options: - /* empty */ {} - | opt_part_option_list {} - ; - -opt_part_option_list: - opt_part_option_list opt_part_option {} - | opt_part_option {} - ; - -opt_part_option: - TABLESPACE opt_equal ident_or_text - { Lex->part_info->curr_part_elem->tablespace_name= $3.str; } - | opt_storage ENGINE_SYM opt_equal storage_engines - { - partition_info *part_info= Lex->part_info; - part_info->curr_part_elem->engine_type= $4; - part_info->default_engine_type= $4; - } - | CONNECTION_SYM opt_equal TEXT_STRING_sys - { - LEX *lex= Lex; - lex->part_info->curr_part_elem->connect_string.str= $3.str; - lex->part_info->curr_part_elem->connect_string.length= $3.length; - } - | NODEGROUP_SYM opt_equal real_ulong_num - { Lex->part_info->curr_part_elem->nodegroup_id= (uint16) $3; } - | MAX_ROWS opt_equal real_ulonglong_num - { Lex->part_info->curr_part_elem->part_max_rows= (ha_rows) $3; } - | MIN_ROWS opt_equal real_ulonglong_num - { Lex->part_info->curr_part_elem->part_min_rows= (ha_rows) $3; } - | DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys - { Lex->part_info->curr_part_elem->data_file_name= $4.str; } - | INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys - { Lex->part_info->curr_part_elem->index_file_name= $4.str; } - | COMMENT_SYM opt_equal TEXT_STRING_sys - { Lex->part_info->curr_part_elem->part_comment= $3.str; } - ; - -opt_versioning_rotation: - /* empty */ {} - | INTERVAL_SYM expr interval opt_versioning_interval_start - { - partition_info *part_info= Lex->part_info; - const char *table_name= Lex->create_last_non_select_table->table_name.str; - if (unlikely(part_info->vers_set_interval(thd, $2, $3, $4, table_name))) - MYSQL_YYABORT; - } - | LIMIT ulonglong_num - { - partition_info *part_info= Lex->part_info; - if (unlikely(part_info->vers_set_limit($2))) - { - my_error(ER_PART_WRONG_VALUE, MYF(0), - Lex->create_last_non_select_table->table_name.str, - "LIMIT"); - MYSQL_YYABORT; - } - } - ; - - -opt_versioning_interval_start: - /* empty */ - { - $$= NULL; - } - | STARTS_SYM literal - { - $$= $2; - } - ; - -/* - End of partition parser part -*/ - -opt_as: - /* empty */ {} - | AS {} - ; - -opt_create_database_options: - /* empty */ {} - | create_database_options {} - ; - -create_database_options: - create_database_option {} - | create_database_options create_database_option {} - ; - -create_database_option: - default_collation {} - | default_charset {} - | COMMENT_SYM opt_equal TEXT_STRING_sys - { - Lex->create_info.schema_comment= thd->make_clex_string($3); - Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; - } - ; - -opt_if_not_exists_table_element: - /* empty */ - { - Lex->check_exists= FALSE; - } - | IF_SYM not EXISTS - { - Lex->check_exists= TRUE; - } - ; - -opt_if_not_exists: - /* empty */ - { - $$.init(); - } - | IF_SYM not EXISTS - { - $$.set(DDL_options_st::OPT_IF_NOT_EXISTS); - } - ; - -create_or_replace: - CREATE /* empty */ - { - $$.init(); - } - | CREATE OR_SYM REPLACE - { - $$.set(DDL_options_st::OPT_OR_REPLACE); - } - ; - -opt_create_table_options: - /* empty */ - | create_table_options - ; - -create_table_options_space_separated: - create_table_option - | create_table_option create_table_options_space_separated - ; - -create_table_options: - create_table_option - | create_table_option create_table_options - | create_table_option ',' create_table_options - ; - -create_table_option: - ENGINE_SYM opt_equal ident_or_text - { - LEX *lex= Lex; - if (!lex->m_sql_cmd) - { - DBUG_ASSERT(lex->sql_command == SQLCOM_ALTER_TABLE); - if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table())) - MYSQL_YYABORT; - } - Storage_engine_name *opt= - lex->m_sql_cmd->option_storage_engine_name(); - DBUG_ASSERT(opt); // Expect a proper Sql_cmd - *opt= Storage_engine_name($3); - lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; - } - | MAX_ROWS opt_equal ulonglong_num - { - Lex->create_info.max_rows= $3; - Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS; - } - | MIN_ROWS opt_equal ulonglong_num - { - Lex->create_info.min_rows= $3; - Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS; - } - | AVG_ROW_LENGTH opt_equal ulong_num - { - Lex->create_info.avg_row_length=$3; - Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH; - } - | PASSWORD_SYM opt_equal TEXT_STRING_sys - { - Lex->create_info.password=$3.str; - Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; - } - | COMMENT_SYM opt_equal TEXT_STRING_sys - { - Lex->create_info.comment=$3; - Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; - } - | AUTO_INC opt_equal ulonglong_num - { - Lex->create_info.auto_increment_value=$3; - Lex->create_info.used_fields|= HA_CREATE_USED_AUTO; - } - | PACK_KEYS_SYM opt_equal ulong_num - { - switch($3) { - case 0: - Lex->create_info.table_options|= HA_OPTION_NO_PACK_KEYS; - break; - case 1: - Lex->create_info.table_options|= HA_OPTION_PACK_KEYS; - break; - default: - thd->parse_error(); - MYSQL_YYABORT; - } - Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; - } - | PACK_KEYS_SYM opt_equal DEFAULT - { - Lex->create_info.table_options&= - ~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS); - Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; - } - | STATS_AUTO_RECALC_SYM opt_equal ulong_num - { - switch($3) { - case 0: - Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_OFF; - break; - case 1: - Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_ON; - break; - default: - thd->parse_error(); - MYSQL_YYABORT; - } - Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; - } - | STATS_AUTO_RECALC_SYM opt_equal DEFAULT - { - Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_DEFAULT; - Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; - } - | STATS_PERSISTENT_SYM opt_equal ulong_num - { - switch($3) { - case 0: - Lex->create_info.table_options|= HA_OPTION_NO_STATS_PERSISTENT; - break; - case 1: - Lex->create_info.table_options|= HA_OPTION_STATS_PERSISTENT; - break; - default: - thd->parse_error(); - MYSQL_YYABORT; - } - Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; - } - | STATS_PERSISTENT_SYM opt_equal DEFAULT - { - Lex->create_info.table_options&= - ~(HA_OPTION_STATS_PERSISTENT | HA_OPTION_NO_STATS_PERSISTENT); - Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; - } - | STATS_SAMPLE_PAGES_SYM opt_equal ulong_num - { - /* From user point of view STATS_SAMPLE_PAGES can be specified as - STATS_SAMPLE_PAGES=N (where 0<N<=65535, it does not make sense to - scan 0 pages) or STATS_SAMPLE_PAGES=default. Internally we record - =default as 0. See create_frm() in sql/table.cc, we use only two - bytes for stats_sample_pages and this is why we do not allow - larger values. 65535 pages, 16kb each means to sample 1GB, which - is impractical. If at some point this needs to be extended, then - we can store the higher bits from stats_sample_pages in .frm too. */ - if (unlikely($3 == 0 || $3 > 0xffff)) - { - thd->parse_error(); - MYSQL_YYABORT; - } - Lex->create_info.stats_sample_pages=$3; - Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; - } - | STATS_SAMPLE_PAGES_SYM opt_equal DEFAULT - { - Lex->create_info.stats_sample_pages=0; - Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; - } - | CHECKSUM_SYM opt_equal ulong_num - { - Lex->create_info.table_options|= $3 ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; - Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; - } - | TABLE_CHECKSUM_SYM opt_equal ulong_num - { - Lex->create_info.table_options|= $3 ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; - Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; - } - | PAGE_CHECKSUM_SYM opt_equal choice - { - Lex->create_info.used_fields|= HA_CREATE_USED_PAGE_CHECKSUM; - Lex->create_info.page_checksum= $3; - } - | DELAY_KEY_WRITE_SYM opt_equal ulong_num - { - Lex->create_info.table_options|= $3 ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; - Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; - } - | ROW_FORMAT_SYM opt_equal row_types - { - Lex->create_info.row_type= $3; - Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; - } - | UNION_SYM opt_equal - { - Lex->first_select_lex()->table_list.save_and_clear(&Lex->save_list); - } - '(' opt_table_list ')' - { - /* - Move the union list to the merge_list and exclude its tables - from the global list. - */ - LEX *lex=Lex; - lex->create_info.merge_list= lex->first_select_lex()->table_list.first; - lex->first_select_lex()->table_list= lex->save_list; - /* - When excluding union list from the global list we assume that - elements of the former immediately follow elements which represent - table being created/altered and parent tables. - */ - TABLE_LIST *last_non_sel_table= lex->create_last_non_select_table; - DBUG_ASSERT(last_non_sel_table->next_global == - lex->create_info.merge_list); - last_non_sel_table->next_global= 0; - Lex->query_tables_last= &last_non_sel_table->next_global; - - lex->create_info.used_fields|= HA_CREATE_USED_UNION; - } - | default_charset - | default_collation - | INSERT_METHOD opt_equal merge_insert_types - { - Lex->create_info.merge_insert_method= $3; - Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD; - } - | DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys - { - Lex->create_info.data_file_name= $4.str; - Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR; - } - | INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys - { - Lex->create_info.index_file_name= $4.str; - Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR; - } - | TABLESPACE ident - {Lex->create_info.tablespace= $2.str;} - | STORAGE_SYM DISK_SYM - {Lex->create_info.storage_media= HA_SM_DISK;} - | STORAGE_SYM MEMORY_SYM - {Lex->create_info.storage_media= HA_SM_MEMORY;} - | CONNECTION_SYM opt_equal TEXT_STRING_sys - { - Lex->create_info.connect_string.str= $3.str; - Lex->create_info.connect_string.length= $3.length; - Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION; - } - | KEY_BLOCK_SIZE opt_equal ulong_num - { - Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; - Lex->create_info.key_block_size= $3; - } - | TRANSACTIONAL_SYM opt_equal choice - { - Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL; - Lex->create_info.transactional= $3; - } - | IDENT_sys equal TEXT_STRING_sys - { - if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH)) - my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str)); - (void) new (thd->mem_root) - engine_option_value($1, $3, true, - &Lex->create_info.option_list, - &Lex->option_list_last); - } - | IDENT_sys equal ident - { - if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH)) - my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str)); - (void) new (thd->mem_root) - engine_option_value($1, $3, false, - &Lex->create_info.option_list, - &Lex->option_list_last); - } - | IDENT_sys equal real_ulonglong_num - { - (void) new (thd->mem_root) - engine_option_value($1, $3, &Lex->create_info.option_list, - &Lex->option_list_last, thd->mem_root); - } - | IDENT_sys equal DEFAULT - { - (void) new (thd->mem_root) - engine_option_value($1, &Lex->create_info.option_list, - &Lex->option_list_last); - } - | SEQUENCE_SYM opt_equal choice - { - Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; - Lex->create_info.sequence= ($3 == HA_CHOICE_YES); - } - | versioning_option - ; - -opt_versioning_option: - /* empty */ - | versioning_option - ; - -versioning_option: - WITH_SYSTEM_SYM VERSIONING_SYM - { - if (unlikely(Lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) - { - if (DBUG_EVALUATE_IF("sysvers_force", 0, 1)) - { - my_error(ER_VERS_NOT_SUPPORTED, MYF(0), "CREATE TEMPORARY TABLE"); - MYSQL_YYABORT; - } - } - else - { - Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; - Lex->create_info.options|= HA_VERSIONED_TABLE; - } - } - ; - -default_charset: - opt_default charset opt_equal charset_name_or_default - { - if (unlikely(Lex->create_info.add_table_option_default_charset($4))) - MYSQL_YYABORT; - } - ; - -default_collation: - opt_default COLLATE_SYM opt_equal collation_name_or_default - { - HA_CREATE_INFO *cinfo= &Lex->create_info; - if (unlikely((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) && - cinfo->default_table_charset && $4 && - !($4= merge_charset_and_collation(cinfo->default_table_charset, - $4)))) - MYSQL_YYABORT; - - Lex->create_info.default_table_charset= $4; - Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET; - } - ; - -storage_engines: - ident_or_text - { - if (Storage_engine_name($1). - resolve_storage_engine_with_error(thd, &$$, - thd->lex->create_info.tmp_table())) - MYSQL_YYABORT; - } - ; - -known_storage_engines: - ident_or_text - { - plugin_ref plugin; - if (likely((plugin= ha_resolve_by_name(thd, &$1, false)))) - $$= plugin_hton(plugin); - else - my_yyabort_error((ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str)); - } - ; - -row_types: - DEFAULT { $$= ROW_TYPE_DEFAULT; } - | FIXED_SYM { $$= ROW_TYPE_FIXED; } - | DYNAMIC_SYM { $$= ROW_TYPE_DYNAMIC; } - | COMPRESSED_SYM { $$= ROW_TYPE_COMPRESSED; } - | REDUNDANT_SYM { $$= ROW_TYPE_REDUNDANT; } - | COMPACT_SYM { $$= ROW_TYPE_COMPACT; } - | PAGE_SYM { $$= ROW_TYPE_PAGE; } - ; - -merge_insert_types: - NO_SYM { $$= MERGE_INSERT_DISABLED; } - | FIRST_SYM { $$= MERGE_INSERT_TO_FIRST; } - | LAST_SYM { $$= MERGE_INSERT_TO_LAST; } - ; - -udf_type: - STRING_SYM {$$ = (int) STRING_RESULT; } - | REAL {$$ = (int) REAL_RESULT; } - | DECIMAL_SYM {$$ = (int) DECIMAL_RESULT; } - | INT_SYM {$$ = (int) INT_RESULT; } - ; - - -create_field_list: - field_list - { - Lex->create_last_non_select_table= Lex->last_table(); - } - ; - -create_field_list_parens: - LEFT_PAREN_ALT field_list ')' - { - Lex->create_last_non_select_table= Lex->last_table(); - } - ; - -field_list: - field_list_item - | field_list ',' field_list_item - ; - -field_list_item: - column_def { } - | key_def - | constraint_def - | period_for_system_time - | PERIOD_SYM period_for_application_time { } - ; - -column_def: - field_spec - { $$= $1; } - | field_spec opt_constraint references - { - if (unlikely(Lex->add_column_foreign_key(&($1->field_name), &$2, - $3, DDL_options()))) - MYSQL_YYABORT; - $$= $1; - } - ; - -key_def: - key_or_index opt_if_not_exists opt_ident opt_USING_key_algorithm - { - Lex->option_list= NULL; - if (unlikely(Lex->add_key(Key::MULTIPLE, &$3, $4, $2))) - MYSQL_YYABORT; - } - '(' key_list ')' normal_key_options { } - | key_or_index opt_if_not_exists ident TYPE_SYM btree_or_rtree - { - Lex->option_list= NULL; - if (unlikely(Lex->add_key(Key::MULTIPLE, &$3, $5, $2))) - MYSQL_YYABORT; - } - '(' key_list ')' normal_key_options { } - | fulltext opt_key_or_index opt_if_not_exists opt_ident - { - Lex->option_list= NULL; - if (unlikely(Lex->add_key($1, &$4, HA_KEY_ALG_UNDEF, $3))) - MYSQL_YYABORT; - } - '(' key_list ')' fulltext_key_options { } - | spatial opt_key_or_index opt_if_not_exists opt_ident - { - Lex->option_list= NULL; - if (unlikely(Lex->add_key($1, &$4, HA_KEY_ALG_UNDEF, $3))) - MYSQL_YYABORT; - } - '(' key_list ')' spatial_key_options { } - | opt_constraint constraint_key_type - opt_if_not_exists opt_ident - opt_USING_key_algorithm - { - Lex->option_list= NULL; - if (unlikely(Lex->add_key($2, $4.str ? &$4 : &$1, $5, $3))) - MYSQL_YYABORT; - } - '(' key_list ')' normal_key_options { } - | opt_constraint constraint_key_type opt_if_not_exists ident - TYPE_SYM btree_or_rtree - { - Lex->option_list= NULL; - if (unlikely(Lex->add_key($2, $4.str ? &$4 : &$1, $6, $3))) - MYSQL_YYABORT; - } - '(' key_list ')' normal_key_options { } - | opt_constraint FOREIGN KEY_SYM opt_if_not_exists opt_ident - { - if (unlikely(Lex->check_add_key($4)) || - unlikely(!(Lex->last_key= (new (thd->mem_root) - Key(Key::MULTIPLE, - $1.str ? &$1 : &$5, - HA_KEY_ALG_UNDEF, true, $4))))) - MYSQL_YYABORT; - Lex->option_list= NULL; - } - '(' key_list ')' references - { - if (unlikely(Lex->add_table_foreign_key($5.str ? &$5 : &$1, - $1.str ? &$1 : &$5, $10, $4))) - MYSQL_YYABORT; - } - ; - -constraint_def: - opt_constraint check_constraint - { - Lex->add_constraint($1, $2, FALSE); - } - ; - -period_for_system_time: - // If FOR_SYM is followed by SYSTEM_TIME_SYM then they are merged to: FOR_SYSTEM_TIME_SYM . - PERIOD_SYM FOR_SYSTEM_TIME_SYM '(' ident ',' ident ')' - { - Vers_parse_info &info= Lex->vers_get_info(); - info.set_period($4, $6); - } - ; - -period_for_application_time: - FOR_SYM ident '(' ident ',' ident ')' - { - if (Lex->add_period($2, $4, $6)) - MYSQL_YYABORT; - } - ; - -opt_check_constraint: - /* empty */ { $$= (Virtual_column_info*) 0; } - | check_constraint { $$= $1;} - ; - -check_constraint: - CHECK_SYM '(' expr ')' - { - Virtual_column_info *v= add_virtual_expression(thd, $3); - if (unlikely(!v)) - MYSQL_YYABORT; - $$= v; - } - ; - -opt_constraint_no_id: - /* Empty */ {} - | CONSTRAINT {} - ; - -opt_constraint: - /* empty */ { $$= null_clex_str; } - | constraint { $$= $1; } - ; - -constraint: - CONSTRAINT opt_ident { $$=$2; } - ; - -field_spec: - field_ident - { - LEX *lex=Lex; - Create_field *f= new (thd->mem_root) Create_field(); - - if (unlikely(check_string_char_length(&$1, 0, NAME_CHAR_LEN, - system_charset_info, 1))) - my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), $1.str)); - - if (unlikely(!f)) - MYSQL_YYABORT; - - lex->init_last_field(f, &$1, NULL); - $<create_field>$= f; - } - field_type_or_serial opt_check_constraint - { - LEX *lex=Lex; - $$= $<create_field>2; - - $$->check_constraint= $4; - - if (unlikely($$->check(thd))) - MYSQL_YYABORT; - - lex->alter_info.create_list.push_back($$, thd->mem_root); - - $$->create_if_not_exists= Lex->check_exists; - if ($$->flags & PRI_KEY_FLAG) - lex->add_key_to_list(&$1, Key::PRIMARY, lex->check_exists); - else if ($$->flags & UNIQUE_KEY_FLAG) - lex->add_key_to_list(&$1, Key::UNIQUE, lex->check_exists); - } - ; - -field_type_or_serial: - field_type - { - Lex->last_field->set_attributes(thd, $1, Lex->charset, - COLUMN_DEFINITION_TABLE_FIELD); - } - field_def - | SERIAL_SYM - { - Lex->last_field->set_handler(&type_handler_ulonglong); - Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG - | UNSIGNED_FLAG | UNIQUE_KEY_FLAG; - } - opt_serial_attribute - ; - -opt_serial_attribute: - /* empty */ {} - | opt_serial_attribute_list {} - ; - -opt_serial_attribute_list: - opt_serial_attribute_list serial_attribute {} - | serial_attribute - ; - -opt_asrow_attribute: - /* empty */ {} - | opt_asrow_attribute_list {} - ; - -opt_asrow_attribute_list: - opt_asrow_attribute_list asrow_attribute {} - | asrow_attribute - ; - -field_def: - /* empty */ { } - | attribute_list - | attribute_list compressed_deprecated_column_attribute - | attribute_list compressed_deprecated_column_attribute attribute_list - | opt_generated_always AS virtual_column_func - { - Lex->last_field->vcol_info= $3; - Lex->last_field->flags&= ~NOT_NULL_FLAG; // undo automatic NOT NULL for timestamps - } - vcol_opt_specifier vcol_opt_attribute - | opt_generated_always AS ROW_SYM START_SYM opt_asrow_attribute - { - if (Lex->last_field_generated_always_as_row_start()) - MYSQL_YYABORT; - } - | opt_generated_always AS ROW_SYM END opt_asrow_attribute - { - if (Lex->last_field_generated_always_as_row_end()) - MYSQL_YYABORT; - } - ; - -opt_generated_always: - /* empty */ {} - | GENERATED_SYM ALWAYS_SYM {} - ; - -vcol_opt_specifier: - /* empty */ - { - Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); - } - | VIRTUAL_SYM - { - Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); - } - | PERSISTENT_SYM - { - Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); - } - | STORED_SYM - { - Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); - } - ; - -vcol_opt_attribute: - /* empty */ {} - | vcol_opt_attribute_list {} - ; - -vcol_opt_attribute_list: - vcol_opt_attribute_list vcol_attribute {} - | vcol_attribute - ; - -vcol_attribute: - UNIQUE_SYM - { - LEX *lex=Lex; - lex->last_field->flags|= UNIQUE_KEY_FLAG; - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | UNIQUE_SYM KEY_SYM - { - LEX *lex=Lex; - lex->last_field->flags|= UNIQUE_KEY_FLAG; - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | COMMENT_SYM TEXT_STRING_sys { Lex->last_field->comment= $2; } - | INVISIBLE_SYM - { - Lex->last_field->invisible= INVISIBLE_USER; - } - ; - -parse_vcol_expr: - PARSE_VCOL_EXPR_SYM - { - /* - "PARSE_VCOL_EXPR" can only be used by the SQL server - when reading a '*.frm' file. - Prevent the end user from invoking this command. - */ - MYSQL_YYABORT_UNLESS(Lex->parse_vcol_expr); - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - expr - { - Virtual_column_info *v= add_virtual_expression(thd, $3); - if (unlikely(!v)) - MYSQL_YYABORT; - Lex->last_field->vcol_info= v; - Lex->pop_select(); //main select - } - ; - -parenthesized_expr: - expr - | expr ',' expr_list - { - $3->push_front($1, thd->mem_root); - $$= new (thd->mem_root) Item_row(thd, *$3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -virtual_column_func: - '(' parenthesized_expr ')' - { - Virtual_column_info *v= - add_virtual_expression(thd, $2); - if (unlikely(!v)) - MYSQL_YYABORT; - $$= v; - } - | subquery - { - Item *item; - if (!(item= new (thd->mem_root) Item_singlerow_subselect(thd, $1))) - MYSQL_YYABORT; - Virtual_column_info *v= add_virtual_expression(thd, item); - if (unlikely(!v)) - MYSQL_YYABORT; - $$= v; - } - ; - -expr_or_literal: column_default_non_parenthesized_expr | signed_literal ; - -column_default_expr: - virtual_column_func - | expr_or_literal - { - if (unlikely(!($$= add_virtual_expression(thd, $1)))) - MYSQL_YYABORT; - } - ; - -field_type: - field_type_numeric - | field_type_temporal - | field_type_string - | field_type_lob - | field_type_misc - | IDENT_sys float_options srid_option - { - if (Lex->set_field_type_udt(&$$, $1, $2)) - MYSQL_YYABORT; - } - | reserved_keyword_udt float_options srid_option - { - if (Lex->set_field_type_udt(&$$, $1, $2)) - MYSQL_YYABORT; - } - | non_reserved_keyword_udt float_options srid_option - { - if (Lex->set_field_type_udt(&$$, $1, $2)) - MYSQL_YYABORT; - } - ; - -field_type_numeric: - int_type opt_field_length last_field_options - { - $$.set_handler_length_flags($1, $2, (uint32) $3); - } - | real_type opt_precision last_field_options { $$.set($1, $2); } - | FLOAT_SYM float_options last_field_options - { - $$.set(&type_handler_float, $2); - if ($2.length() && !$2.dec()) - { - int err; - ulonglong tmp_length= my_strtoll10($2.length(), NULL, &err); - if (unlikely(err || tmp_length > PRECISION_FOR_DOUBLE)) - my_yyabort_error((ER_WRONG_FIELD_SPEC, MYF(0), - Lex->last_field->field_name.str)); - if (tmp_length > PRECISION_FOR_FLOAT) - $$.set(&type_handler_double); - else - $$.set(&type_handler_float); - } - } - | BIT_SYM opt_field_length - { - $$.set(&type_handler_bit, $2); - } - | BOOL_SYM - { - $$.set(&type_handler_stiny, "1"); - } - | BOOLEAN_SYM - { - $$.set(&type_handler_stiny, "1"); - } - | DECIMAL_SYM float_options last_field_options - { $$.set(&type_handler_newdecimal, $2);} - | NUMBER_ORACLE_SYM float_options last_field_options - { - if ($2.length() != 0) - $$.set(&type_handler_newdecimal, $2); - else - $$.set(&type_handler_double); - } - | NUMERIC_SYM float_options last_field_options - { $$.set(&type_handler_newdecimal, $2);} - | FIXED_SYM float_options last_field_options - { $$.set(&type_handler_newdecimal, $2);} - ; - - -opt_binary_and_compression: - /* empty */ - | binary - | binary compressed_deprecated_data_type_attribute - | compressed opt_binary - ; - -field_type_string: - char opt_field_length opt_binary - { - $$.set(&type_handler_string, $2); - } - | nchar opt_field_length opt_bin_mod - { - $$.set(&type_handler_string, $2); - bincmp_collation(national_charset_info, $3); - } - | BINARY opt_field_length - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_string, $2); - } - | varchar opt_field_length opt_binary_and_compression - { - $$.set(&type_handler_varchar, $2); - } - | VARCHAR2_ORACLE_SYM opt_field_length opt_binary_and_compression - { - $$.set(&type_handler_varchar, $2); - } - | nvarchar opt_field_length opt_compressed opt_bin_mod - { - $$.set(&type_handler_varchar, $2); - bincmp_collation(national_charset_info, $4); - } - | VARBINARY opt_field_length opt_compressed - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_varchar, $2); - } - | RAW_ORACLE_SYM opt_field_length opt_compressed - { - Lex->charset= &my_charset_bin; - $$.set(&type_handler_varchar, $2); - } - ; - -field_type_temporal: - YEAR_SYM opt_field_length last_field_options - { - if ($2) - { - errno= 0; - ulong length= strtoul($2, NULL, 10); - if (errno == 0 && length <= MAX_FIELD_BLOBLENGTH && length != 4) - { - char buff[sizeof("YEAR()") + MY_INT64_NUM_DECIMAL_DIGITS + 1]; - my_snprintf(buff, sizeof(buff), "YEAR(%lu)", length); - push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, - ER_WARN_DEPRECATED_SYNTAX, - ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), - buff, "YEAR(4)"); - } - } - $$.set(&type_handler_year, $2); - } - | DATE_SYM { $$.set(thd->type_handler_for_date()); } - | TIME_SYM opt_field_length - { - $$.set(opt_mysql56_temporal_format ? - static_cast<const Type_handler*>(&type_handler_time2) : - static_cast<const Type_handler*>(&type_handler_time), - $2); - } - | TIMESTAMP opt_field_length - { - if (thd->variables.sql_mode & MODE_MAXDB) - $$.set(opt_mysql56_temporal_format ? - static_cast<const Type_handler*>(&type_handler_datetime2) : - static_cast<const Type_handler*>(&type_handler_datetime), - $2); - else - { - /* - Unlike other types TIMESTAMP fields are NOT NULL by default. - Unless --explicit-defaults-for-timestamp is given. - */ - if (!opt_explicit_defaults_for_timestamp) - Lex->last_field->flags|= NOT_NULL_FLAG; - $$.set(opt_mysql56_temporal_format ? - static_cast<const Type_handler*>(&type_handler_timestamp2): - static_cast<const Type_handler*>(&type_handler_timestamp), - $2); - } - } - | DATETIME opt_field_length - { - $$.set(opt_mysql56_temporal_format ? - static_cast<const Type_handler*>(&type_handler_datetime2) : - static_cast<const Type_handler*>(&type_handler_datetime), - $2); - } - ; - - -field_type_lob: - TINYBLOB opt_compressed - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_tiny_blob); - } - | BLOB_MARIADB_SYM opt_field_length opt_compressed - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_blob, $2); - } - | BLOB_ORACLE_SYM field_length opt_compressed - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_blob, $2); - } - | BLOB_ORACLE_SYM opt_compressed - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_long_blob); - } - | MEDIUMBLOB opt_compressed - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_medium_blob); - } - | LONGBLOB opt_compressed - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_long_blob); - } - | LONG_SYM VARBINARY opt_compressed - { - Lex->charset=&my_charset_bin; - $$.set(&type_handler_medium_blob); - } - | LONG_SYM varchar opt_binary_and_compression - { $$.set(&type_handler_medium_blob); } - | TINYTEXT opt_binary_and_compression - { $$.set(&type_handler_tiny_blob); } - | TEXT_SYM opt_field_length opt_binary_and_compression - { $$.set(&type_handler_blob, $2); } - | MEDIUMTEXT opt_binary_and_compression - { $$.set(&type_handler_medium_blob); } - | LONGTEXT opt_binary_and_compression - { $$.set(&type_handler_long_blob); } - | CLOB_ORACLE_SYM opt_binary_and_compression - { $$.set(&type_handler_long_blob); } - | LONG_SYM opt_binary_and_compression - { $$.set(&type_handler_medium_blob); } - | JSON_SYM opt_compressed - { - Lex->charset= &my_charset_utf8mb4_bin; - $$.set(&type_handler_json_longtext); - } - ; - -field_type_misc: - ENUM '(' string_list ')' opt_binary - { $$.set(&type_handler_enum); } - | SET '(' string_list ')' opt_binary - { $$.set(&type_handler_set); } - ; - -char: - CHAR_SYM {} - ; - -nchar: - NCHAR_SYM {} - | NATIONAL_SYM CHAR_SYM {} - ; - -varchar: - char VARYING {} - | VARCHAR {} - ; - -nvarchar: - NATIONAL_SYM VARCHAR {} - | NVARCHAR_SYM {} - | NCHAR_SYM VARCHAR {} - | NATIONAL_SYM CHAR_SYM VARYING {} - | NCHAR_SYM VARYING {} - ; - -int_type: - INT_SYM { $$= &type_handler_slong; } - | TINYINT { $$= &type_handler_stiny; } - | SMALLINT { $$= &type_handler_sshort; } - | MEDIUMINT { $$= &type_handler_sint24; } - | BIGINT { $$= &type_handler_slonglong; } - ; - -real_type: - REAL - { - $$= thd->variables.sql_mode & MODE_REAL_AS_FLOAT ? - static_cast<const Type_handler *>(&type_handler_float) : - static_cast<const Type_handler *>(&type_handler_double); - } - | DOUBLE_SYM { $$= &type_handler_double; } - | DOUBLE_SYM PRECISION { $$= &type_handler_double; } - ; - -srid_option: - /* empty */ - { Lex->last_field->srid= 0; } - | - REF_SYSTEM_ID_SYM '=' NUM - { - Lex->last_field->srid=atoi($3.str); - } - ; - -float_options: - /* empty */ { $$.set(0, 0); } - | field_length { $$.set($1, 0); } - | precision { $$= $1; } - ; - -precision: - '(' NUM ',' NUM ')' { $$.set($2.str, $4.str); } - ; - -field_options: - /* empty */ { $$= 0; } - | SIGNED_SYM { $$= 0; } - | UNSIGNED { $$= UNSIGNED_FLAG; } - | ZEROFILL { $$= UNSIGNED_FLAG | ZEROFILL_FLAG; } - | UNSIGNED ZEROFILL { $$= UNSIGNED_FLAG | ZEROFILL_FLAG; } - | ZEROFILL UNSIGNED { $$= UNSIGNED_FLAG | ZEROFILL_FLAG; } - ; - -last_field_options: - field_options { Lex->last_field->flags|= ($$= $1); } - ; - -field_length: - '(' LONG_NUM ')' { $$= $2.str; } - | '(' ULONGLONG_NUM ')' { $$= $2.str; } - | '(' DECIMAL_NUM ')' { $$= $2.str; } - | '(' NUM ')' { $$= $2.str; } - ; - -opt_field_length: - /* empty */ { $$= (char*) 0; /* use default length */ } - | field_length { $$= $1; } - ; - -opt_precision: - /* empty */ { $$.set(0, 0); } - | precision { $$= $1; } - ; - - -attribute_list: - attribute_list attribute {} - | attribute - ; - -attribute: - NULL_SYM { Lex->last_field->flags&= ~ NOT_NULL_FLAG; } - | DEFAULT column_default_expr { Lex->last_field->default_value= $2; } - | ON UPDATE_SYM NOW_SYM opt_default_time_precision - { - Item *item= new (thd->mem_root) Item_func_now_local(thd, $4); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - Lex->last_field->on_update= item; - } - | AUTO_INC { Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; } - | SERIAL_SYM DEFAULT VALUE_SYM - { - LEX *lex=Lex; - lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_KEY_FLAG; - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | COLLATE_SYM collation_name - { - if (unlikely(Lex->charset && !my_charset_same(Lex->charset,$2))) - my_yyabort_error((ER_COLLATION_CHARSET_MISMATCH, MYF(0), - $2->name,Lex->charset->csname)); - Lex->last_field->charset= $2; - } - | serial_attribute - ; - -opt_compression_method: - /* empty */ { $$= NULL; } - | equal ident { $$= $2.str; } - ; - -opt_compressed: - /* empty */ {} - | compressed { } - ; - -compressed: - COMPRESSED_SYM opt_compression_method - { - if (unlikely(Lex->last_field->set_compressed($2))) - MYSQL_YYABORT; - } - ; - -compressed_deprecated_data_type_attribute: - COMPRESSED_SYM opt_compression_method - { - if (unlikely(Lex->last_field->set_compressed_deprecated(thd, $2))) - MYSQL_YYABORT; - } - ; - -compressed_deprecated_column_attribute: - COMPRESSED_SYM opt_compression_method - { - if (unlikely(Lex->last_field-> - set_compressed_deprecated_column_attribute(thd, $1.pos(), $2))) - MYSQL_YYABORT; - } - ; - -asrow_attribute: - not NULL_SYM - { - Lex->last_field->flags|= NOT_NULL_FLAG; - } - | opt_primary KEY_SYM - { - LEX *lex=Lex; - lex->last_field->flags|= PRI_KEY_FLAG | NOT_NULL_FLAG; - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | vcol_attribute - ; - -serial_attribute: - asrow_attribute - | IDENT_sys equal TEXT_STRING_sys - { - if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH)) - my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str)); - (void) new (thd->mem_root) - engine_option_value($1, $3, true, - &Lex->last_field->option_list, - &Lex->option_list_last); - } - | IDENT_sys equal ident - { - if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH)) - my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str)); - (void) new (thd->mem_root) - engine_option_value($1, $3, false, - &Lex->last_field->option_list, - &Lex->option_list_last); - } - | IDENT_sys equal real_ulonglong_num - { - (void) new (thd->mem_root) - engine_option_value($1, $3, &Lex->last_field->option_list, - &Lex->option_list_last, thd->mem_root); - } - | IDENT_sys equal DEFAULT - { - (void) new (thd->mem_root) - engine_option_value($1, &Lex->last_field->option_list, - &Lex->option_list_last); - } - | with_or_without_system VERSIONING_SYM - { - Lex->last_field->versioning= $1; - Lex->create_info.options|= HA_VERSIONED_TABLE; - if (Lex->alter_info.flags & ALTER_DROP_SYSTEM_VERSIONING) - { - my_yyabort_error((ER_VERS_NOT_VERSIONED, MYF(0), - Lex->create_last_non_select_table->table_name.str)); - } - } - ; - -with_or_without_system: - WITH_SYSTEM_SYM - { - Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; - Lex->create_info.vers_info.versioned_fields= true; - $$= Column_definition::WITH_VERSIONING; - } - | WITHOUT SYSTEM - { - Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; - Lex->create_info.vers_info.unversioned_fields= true; - $$= Column_definition::WITHOUT_VERSIONING; - } - ; - - -type_with_opt_collate: - field_type opt_collate - { - $$= $1; - - if ($2) - { - if (unlikely(!(Lex->charset= merge_charset_and_collation(Lex->charset, $2)))) - MYSQL_YYABORT; - } - } - ; - -charset: - CHAR_SYM SET { $$= $1; } - | CHARSET { $$= $1; } - ; - -charset_name: - ident_or_text - { - if (unlikely(!($$=get_charset_by_csname($1.str,MY_CS_PRIMARY,MYF(0))))) - my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str)); - } - | BINARY { $$= &my_charset_bin; } - ; - -charset_name_or_default: - charset_name { $$=$1; } - | DEFAULT { $$=NULL; } - ; - -opt_load_data_charset: - /* Empty */ { $$= NULL; } - | charset charset_name_or_default { $$= $2; } - ; - -old_or_new_charset_name: - ident_or_text - { - if (unlikely(!($$=get_charset_by_csname($1.str, - MY_CS_PRIMARY,MYF(0))) && - !($$=get_old_charset_by_name($1.str)))) - my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str)); - } - | BINARY { $$= &my_charset_bin; } - ; - -old_or_new_charset_name_or_default: - old_or_new_charset_name { $$=$1; } - | DEFAULT { $$=NULL; } - ; - -collation_name: - ident_or_text - { - if (unlikely(!($$= mysqld_collation_get_by_name($1.str)))) - MYSQL_YYABORT; - } - ; - -opt_collate: - /* empty */ { $$=NULL; } - | COLLATE_SYM collation_name_or_default { $$=$2; } - ; - -collation_name_or_default: - collation_name { $$=$1; } - | DEFAULT { $$=NULL; } - ; - -opt_default: - /* empty */ {} - | DEFAULT {} - ; - -charset_or_alias: - charset charset_name { $$= $2; } - | ASCII_SYM { $$= &my_charset_latin1; } - | UNICODE_SYM - { - if (unlikely(!($$= get_charset_by_csname("ucs2", MY_CS_PRIMARY,MYF(0))))) - my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2")); - } - ; - -opt_binary: - /* empty */ { bincmp_collation(NULL, false); } - | binary {} - ; - -binary: - BYTE_SYM { bincmp_collation(&my_charset_bin, false); } - | charset_or_alias opt_bin_mod { bincmp_collation($1, $2); } - | BINARY { bincmp_collation(NULL, true); } - | BINARY charset_or_alias { bincmp_collation($2, true); } - ; - -opt_bin_mod: - /* empty */ { $$= false; } - | BINARY { $$= true; } - ; - -ws_nweights: - '(' real_ulong_num - { - if (unlikely($2 == 0)) - { - thd->parse_error(); - MYSQL_YYABORT; - } - } - ')' - { $$= $2; } - ; - -ws_level_flag_desc: - ASC { $$= 0; } - | DESC { $$= 1 << MY_STRXFRM_DESC_SHIFT; } - ; - -ws_level_flag_reverse: - REVERSE_SYM { $$= 1 << MY_STRXFRM_REVERSE_SHIFT; } ; - -ws_level_flags: - /* empty */ { $$= 0; } - | ws_level_flag_desc { $$= $1; } - | ws_level_flag_desc ws_level_flag_reverse { $$= $1 | $2; } - | ws_level_flag_reverse { $$= $1 ; } - ; - -ws_level_number: - real_ulong_num - { - $$= $1 < 1 ? 1 : ($1 > MY_STRXFRM_NLEVELS ? MY_STRXFRM_NLEVELS : $1); - $$--; - } - ; - -ws_level_list_item: - ws_level_number ws_level_flags - { - $$= (1 | $2) << $1; - } - ; - -ws_level_list: - ws_level_list_item { $$= $1; } - | ws_level_list ',' ws_level_list_item { $$|= $3; } - ; - -ws_level_range: - ws_level_number '-' ws_level_number - { - uint start= $1; - uint end= $3; - for ($$= 0; start <= end; start++) - $$|= (1 << start); - } - ; - -ws_level_list_or_range: - ws_level_list { $$= $1; } - | ws_level_range { $$= $1; } - ; - -opt_ws_levels: - /* empty*/ { $$= 0; } - | LEVEL_SYM ws_level_list_or_range { $$= $2; } - ; - -opt_primary: - /* empty */ - | PRIMARY_SYM - ; - -references: - REFERENCES - table_ident - opt_ref_list - opt_match_clause - opt_on_update_delete - { - $$=$2; - } - ; - -opt_ref_list: - /* empty */ - { Lex->ref_list.empty(); } - | '(' ref_list ')' - ; - -ref_list: - ref_list ',' ident - { - Key_part_spec *key= new (thd->mem_root) Key_part_spec(&$3, 0); - if (unlikely(key == NULL)) - MYSQL_YYABORT; - Lex->ref_list.push_back(key, thd->mem_root); - } - | ident - { - Key_part_spec *key= new (thd->mem_root) Key_part_spec(&$1, 0); - if (unlikely(key == NULL)) - MYSQL_YYABORT; - LEX *lex= Lex; - lex->ref_list.empty(); - lex->ref_list.push_back(key, thd->mem_root); - } - ; - -opt_match_clause: - /* empty */ - { Lex->fk_match_option= Foreign_key::FK_MATCH_UNDEF; } - | MATCH FULL - { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } - | MATCH PARTIAL - { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } - | MATCH SIMPLE_SYM - { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; } - ; - -opt_on_update_delete: - /* empty */ - { - LEX *lex= Lex; - lex->fk_update_opt= FK_OPTION_UNDEF; - lex->fk_delete_opt= FK_OPTION_UNDEF; - } - | ON UPDATE_SYM delete_option - { - LEX *lex= Lex; - lex->fk_update_opt= $3; - lex->fk_delete_opt= FK_OPTION_UNDEF; - } - | ON DELETE_SYM delete_option - { - LEX *lex= Lex; - lex->fk_update_opt= FK_OPTION_UNDEF; - lex->fk_delete_opt= $3; - } - | ON UPDATE_SYM delete_option - ON DELETE_SYM delete_option - { - LEX *lex= Lex; - lex->fk_update_opt= $3; - lex->fk_delete_opt= $6; - } - | ON DELETE_SYM delete_option - ON UPDATE_SYM delete_option - { - LEX *lex= Lex; - lex->fk_update_opt= $6; - lex->fk_delete_opt= $3; - } - ; - -delete_option: - RESTRICT { $$= FK_OPTION_RESTRICT; } - | CASCADE { $$= FK_OPTION_CASCADE; } - | SET NULL_SYM { $$= FK_OPTION_SET_NULL; } - | NO_SYM ACTION { $$= FK_OPTION_NO_ACTION; } - | SET DEFAULT { $$= FK_OPTION_SET_DEFAULT; } - ; - -constraint_key_type: - PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; } - | UNIQUE_SYM opt_key_or_index { $$= Key::UNIQUE; } - ; - -key_or_index: - KEY_SYM {} - | INDEX_SYM {} - ; - -opt_key_or_index: - /* empty */ {} - | key_or_index - ; - -keys_or_index: - KEYS {} - | INDEX_SYM {} - | INDEXES {} - ; - -opt_unique: - /* empty */ { $$= Key::MULTIPLE; } - | UNIQUE_SYM { $$= Key::UNIQUE; } - ; - -fulltext: - FULLTEXT_SYM { $$= Key::FULLTEXT;} - ; - -spatial: - SPATIAL_SYM - { -#ifdef HAVE_SPATIAL - $$= Key::SPATIAL; -#else - my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), sym_group_geom.name, - sym_group_geom.needed_define)); -#endif - } - ; - -normal_key_options: - /* empty */ {} - | normal_key_opts { Lex->last_key->option_list= Lex->option_list; } - ; - -fulltext_key_options: - /* empty */ {} - | fulltext_key_opts { Lex->last_key->option_list= Lex->option_list; } - ; - -spatial_key_options: - /* empty */ {} - | spatial_key_opts { Lex->last_key->option_list= Lex->option_list; } - ; - -normal_key_opts: - normal_key_opt - | normal_key_opts normal_key_opt - ; - -spatial_key_opts: - spatial_key_opt - | spatial_key_opts spatial_key_opt - ; - -fulltext_key_opts: - fulltext_key_opt - | fulltext_key_opts fulltext_key_opt - ; - -opt_USING_key_algorithm: - /* Empty*/ { $$= HA_KEY_ALG_UNDEF; } - | USING btree_or_rtree { $$= $2; } - ; - -/* TYPE is a valid identifier, so it's handled differently than USING */ -opt_key_algorithm_clause: - /* Empty*/ { $$= HA_KEY_ALG_UNDEF; } - | USING btree_or_rtree { $$= $2; } - | TYPE_SYM btree_or_rtree { $$= $2; } - ; - -key_using_alg: - USING btree_or_rtree - { Lex->last_key->key_create_info.algorithm= $2; } - | TYPE_SYM btree_or_rtree - { Lex->last_key->key_create_info.algorithm= $2; } - ; - -all_key_opt: - KEY_BLOCK_SIZE opt_equal ulong_num - { - Lex->last_key->key_create_info.block_size= $3; - Lex->last_key->key_create_info.flags|= HA_USES_BLOCK_SIZE; - } - | COMMENT_SYM TEXT_STRING_sys - { Lex->last_key->key_create_info.comment= $2; } - | IDENT_sys equal TEXT_STRING_sys - { - if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH)) - my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str)); - (void) new (thd->mem_root) - engine_option_value($1, $3, true, &Lex->option_list, - &Lex->option_list_last); - } - | IDENT_sys equal ident - { - if (unlikely($3.length > ENGINE_OPTION_MAX_LENGTH)) - my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), $1.str)); - (void) new (thd->mem_root) - engine_option_value($1, $3, false, &Lex->option_list, - &Lex->option_list_last); - } - | IDENT_sys equal real_ulonglong_num - { - (void) new (thd->mem_root) - engine_option_value($1, $3, &Lex->option_list, - &Lex->option_list_last, thd->mem_root); - } - | IDENT_sys equal DEFAULT - { - (void) new (thd->mem_root) - engine_option_value($1, &Lex->option_list, - &Lex->option_list_last); - } - ; - -normal_key_opt: - all_key_opt - | key_using_alg - ; - -spatial_key_opt: - all_key_opt - ; - -fulltext_key_opt: - all_key_opt - | WITH PARSER_SYM IDENT_sys - { - if (likely(plugin_is_ready(&$3, MYSQL_FTPARSER_PLUGIN))) - Lex->last_key->key_create_info.parser_name= $3; - else - my_yyabort_error((ER_FUNCTION_NOT_DEFINED, MYF(0), $3.str)); - } - ; - -btree_or_rtree: - BTREE_SYM { $$= HA_KEY_ALG_BTREE; } - | RTREE_SYM { $$= HA_KEY_ALG_RTREE; } - | HASH_SYM { $$= HA_KEY_ALG_HASH; } - ; - -key_list: - key_list ',' key_part order_dir - { - Lex->last_key->columns.push_back($3, thd->mem_root); - } - | key_part order_dir - { - Lex->last_key->columns.push_back($1, thd->mem_root); - } - ; - -key_part: - ident - { - $$= new (thd->mem_root) Key_part_spec(&$1, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ident '(' NUM ')' - { - int key_part_len= atoi($3.str); - if (unlikely(!key_part_len)) - my_yyabort_error((ER_KEY_PART_0, MYF(0), $1.str)); - $$= new (thd->mem_root) Key_part_spec(&$1, (uint) key_part_len); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -opt_ident: - /* empty */ { $$= null_clex_str; } - | field_ident { $$= $1; } - ; - -string_list: - text_string - { Lex->last_field->interval_list.push_back($1, thd->mem_root); } - | string_list ',' text_string - { Lex->last_field->interval_list.push_back($3, thd->mem_root); } - ; - -/* -** Alter table -*/ - -alter: - ALTER - { - Lex->name= null_clex_str; - Lex->table_type= TABLE_TYPE_UNKNOWN; - Lex->sql_command= SQLCOM_ALTER_TABLE; - Lex->duplicates= DUP_ERROR; - Lex->first_select_lex()->order_list.empty(); - Lex->create_info.init(); - Lex->create_info.row_type= ROW_TYPE_NOT_USED; - Lex->alter_info.reset(); - Lex->no_write_to_binlog= 0; - Lex->create_info.storage_media= HA_SM_DEFAULT; - if (Lex->main_select_push()) - MYSQL_YYABORT; - DBUG_ASSERT(!Lex->m_sql_cmd); - } - alter_options TABLE_SYM table_ident opt_lock_wait_timeout - { - if (!Lex->first_select_lex()-> - add_table_to_list(thd, $5, NULL, TL_OPTION_UPDATING, - TL_READ_NO_INSERT, MDL_SHARED_UPGRADABLE)) - MYSQL_YYABORT; - Lex->first_select_lex()->db= - (Lex->first_select_lex()->table_list.first)->db; - Lex->create_last_non_select_table= Lex->last_table(); - Lex->mark_first_table_as_inserting(); - } - alter_commands - { - if (likely(!Lex->m_sql_cmd)) - { - /* Create a generic ALTER TABLE statment. */ - Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); - if (unlikely(Lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - Lex->pop_select(); //main select - } - | ALTER DATABASE ident_or_empty - { - Lex->create_info.default_table_charset= NULL; - Lex->create_info.schema_comment= NULL; - Lex->create_info.used_fields= 0; - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - create_database_options - { - LEX *lex=Lex; - lex->sql_command=SQLCOM_ALTER_DB; - lex->name= $3; - if (lex->name.str == NULL && - unlikely(lex->copy_db_to(&lex->name))) - MYSQL_YYABORT; - Lex->pop_select(); //main select - } - | ALTER DATABASE COMMENT_SYM opt_equal TEXT_STRING_sys - { - Lex->create_info.default_table_charset= NULL; - Lex->create_info.used_fields= 0; - Lex->create_info.schema_comment= thd->make_clex_string($5); - Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; - } - opt_create_database_options - { - LEX *lex=Lex; - lex->sql_command=SQLCOM_ALTER_DB; - lex->name= Lex_ident_sys(); - if (lex->name.str == NULL && - unlikely(lex->copy_db_to(&lex->name))) - MYSQL_YYABORT; - } - | ALTER DATABASE ident UPGRADE_SYM DATA_SYM DIRECTORY_SYM NAME_SYM - { - LEX *lex= Lex; - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "DATABASE")); - lex->sql_command= SQLCOM_ALTER_DB_UPGRADE; - lex->name= $3; - } - | ALTER PROCEDURE_SYM sp_name - { - if (Lex->stmt_alter_procedure_start($3)) - MYSQL_YYABORT; - } - sp_a_chistics - stmt_end {} - | ALTER FUNCTION_SYM sp_name - { - if (Lex->stmt_alter_function_start($3)) - MYSQL_YYABORT; - } - sp_a_chistics - stmt_end {} - | ALTER view_algorithm definer_opt opt_view_suid VIEW_SYM table_ident - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - if (Lex->add_alter_view(thd, $2, $4, $6)) - MYSQL_YYABORT; - } - view_list_opt AS view_select stmt_end {} - | ALTER definer_opt opt_view_suid VIEW_SYM table_ident - /* - We have two separate rules for ALTER VIEW rather that - optional view_algorithm above, to resolve the ambiguity - with the ALTER EVENT below. - */ - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - if (Lex->add_alter_view(thd, VIEW_ALGORITHM_INHERIT, $3, $5)) - MYSQL_YYABORT; - } - view_list_opt AS view_select stmt_end {} - | ALTER definer_opt remember_name EVENT_SYM sp_name - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - /* - It is safe to use Lex->spname because - ALTER EVENT xxx RENATE TO yyy DO ALTER EVENT RENAME TO - is not allowed. Lex->spname is used in the case of RENAME TO - If it had to be supported spname had to be added to - Event_parse_data. - */ - - if (unlikely(!(Lex->event_parse_data= Event_parse_data::new_instance(thd)))) - MYSQL_YYABORT; - Lex->event_parse_data->identifier= $5; - - Lex->sql_command= SQLCOM_ALTER_EVENT; - Lex->stmt_definition_begin= $3; - } - ev_alter_on_schedule_completion - opt_ev_rename_to - opt_ev_status - opt_ev_comment - opt_ev_sql_stmt - { - if (unlikely(!($7 || $8 || $9 || $10 || $11))) - { - thd->parse_error(); - MYSQL_YYABORT; - } - /* - sql_command is set here because some rules in ev_sql_stmt - can overwrite it - */ - Lex->sql_command= SQLCOM_ALTER_EVENT; - Lex->stmt_definition_end= (char*)YYLIP->get_cpp_ptr(); - - Lex->pop_select(); //main select - } - | ALTER TABLESPACE alter_tablespace_info - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_cmd_type= ALTER_TABLESPACE; - } - | ALTER LOGFILE_SYM GROUP_SYM alter_logfile_group_info - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_cmd_type= ALTER_LOGFILE_GROUP; - } - | ALTER TABLESPACE change_tablespace_info - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_cmd_type= CHANGE_FILE_TABLESPACE; - } - | ALTER TABLESPACE change_tablespace_access - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_cmd_type= ALTER_ACCESS_MODE_TABLESPACE; - } - | ALTER SERVER_SYM ident_or_text - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_ALTER_SERVER; - lex->server_options.reset($3); - } OPTIONS_SYM '(' server_options_list ')' { } - /* ALTER USER foo is allowed for MySQL compatibility. */ - | ALTER opt_if_exists USER_SYM clear_privileges grant_list - opt_require_clause opt_resource_options opt_account_locking opt_password_expiration - { - Lex->create_info.set($2); - Lex->sql_command= SQLCOM_ALTER_USER; - } - | ALTER SEQUENCE_SYM opt_if_exists - { - LEX *lex= Lex; - lex->name= null_clex_str; - lex->table_type= TABLE_TYPE_UNKNOWN; - lex->sql_command= SQLCOM_ALTER_SEQUENCE; - lex->create_info.init(); - lex->no_write_to_binlog= 0; - DBUG_ASSERT(!lex->m_sql_cmd); - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - table_ident - { - LEX *lex= Lex; - if (!(lex->create_info.seq_create_info= new (thd->mem_root) - sequence_definition()) || - !lex->first_select_lex()-> - add_table_to_list(thd, $5, NULL, TL_OPTION_SEQUENCE, - TL_WRITE, MDL_EXCLUSIVE)) - MYSQL_YYABORT; - } - sequence_defs - { - /* Create a generic ALTER SEQUENCE statment. */ - Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_sequence($3); - if (unlikely(Lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } stmt_end {} - ; - -opt_account_locking: - /* Nothing */ {} - | ACCOUNT_SYM LOCK_SYM - { - Lex->account_options.account_locked= ACCOUNTLOCK_LOCKED; - } - | ACCOUNT_SYM UNLOCK_SYM - { - Lex->account_options.account_locked= ACCOUNTLOCK_UNLOCKED; - } - ; -opt_password_expiration: - /* Nothing */ {} - | PASSWORD_SYM EXPIRE_SYM - { - Lex->account_options.password_expire= PASSWORD_EXPIRE_NOW; - } - | PASSWORD_SYM EXPIRE_SYM NEVER_SYM - { - Lex->account_options.password_expire= PASSWORD_EXPIRE_NEVER; - } - | PASSWORD_SYM EXPIRE_SYM DEFAULT - { - Lex->account_options.password_expire= PASSWORD_EXPIRE_DEFAULT; - } - | PASSWORD_SYM EXPIRE_SYM INTERVAL_SYM NUM DAY_SYM - { - Lex->account_options.password_expire= PASSWORD_EXPIRE_INTERVAL; - if (!(Lex->account_options.num_expiration_days= atoi($4.str))) - my_yyabort_error((ER_WRONG_VALUE, MYF(0), "DAY", $4.str)); - } - ; - -ev_alter_on_schedule_completion: - /* empty */ { $$= 0;} - | ON SCHEDULE_SYM ev_schedule_time { $$= 1; } - | ev_on_completion { $$= 1; } - | ON SCHEDULE_SYM ev_schedule_time ev_on_completion { $$= 1; } - ; - -opt_ev_rename_to: - /* empty */ { $$= 0;} - | RENAME TO_SYM sp_name - { - /* - Use lex's spname to hold the new name. - The original name is in the Event_parse_data object - */ - Lex->spname= $3; - $$= 1; - } - ; - -opt_ev_sql_stmt: - /* empty*/ { $$= 0;} - | DO_SYM ev_sql_stmt { $$= 1; } - ; - -ident_or_empty: - /* empty */ - %prec PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE { $$= Lex_ident_sys(); } - | ident - ; - -alter_commands: - /* empty */ - | DISCARD TABLESPACE - { - Lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_discard_import_tablespace( - Sql_cmd_discard_import_tablespace::DISCARD_TABLESPACE); - if (unlikely(Lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - | IMPORT TABLESPACE - { - Lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_discard_import_tablespace( - Sql_cmd_discard_import_tablespace::IMPORT_TABLESPACE); - if (unlikely(Lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - | alter_list - opt_partitioning - | alter_list - remove_partitioning - | remove_partitioning - | partitioning -/* - This part was added for release 5.1 by Mikael Ronstrm. - From here we insert a number of commands to manage the partitions of a - partitioned table such as adding partitions, dropping partitions, - reorganising partitions in various manners. In future releases the list - will be longer. -*/ - | add_partition_rule - | DROP PARTITION_SYM opt_if_exists alt_part_name_list - { - Lex->alter_info.partition_flags|= ALTER_PARTITION_DROP; - DBUG_ASSERT(!Lex->if_exists()); - Lex->create_info.add($3); - } - | REBUILD_SYM PARTITION_SYM opt_no_write_to_binlog - all_or_alt_part_name_list - { - LEX *lex= Lex; - lex->alter_info.partition_flags|= ALTER_PARTITION_REBUILD; - lex->no_write_to_binlog= $3; - } - | OPTIMIZE PARTITION_SYM opt_no_write_to_binlog - all_or_alt_part_name_list - { - LEX *lex= thd->lex; - lex->no_write_to_binlog= $3; - lex->check_opt.init(); - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_alter_table_optimize_partition(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - opt_no_write_to_binlog - | ANALYZE_SYM PARTITION_SYM opt_no_write_to_binlog - all_or_alt_part_name_list - { - LEX *lex= thd->lex; - lex->no_write_to_binlog= $3; - lex->check_opt.init(); - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_alter_table_analyze_partition(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - | CHECK_SYM PARTITION_SYM all_or_alt_part_name_list - { - LEX *lex= thd->lex; - lex->check_opt.init(); - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_alter_table_check_partition(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - opt_mi_check_type - | REPAIR PARTITION_SYM opt_no_write_to_binlog - all_or_alt_part_name_list - { - LEX *lex= thd->lex; - lex->no_write_to_binlog= $3; - lex->check_opt.init(); - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_alter_table_repair_partition(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - opt_mi_repair_type - | COALESCE PARTITION_SYM opt_no_write_to_binlog real_ulong_num - { - LEX *lex= Lex; - lex->alter_info.partition_flags|= ALTER_PARTITION_COALESCE; - lex->no_write_to_binlog= $3; - lex->alter_info.num_parts= $4; - } - | TRUNCATE_SYM PARTITION_SYM all_or_alt_part_name_list - { - LEX *lex= thd->lex; - lex->check_opt.init(); - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_alter_table_truncate_partition(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - | reorg_partition_rule - | EXCHANGE_SYM PARTITION_SYM alt_part_name_item - WITH TABLE_SYM table_ident have_partitioning - { - if (Lex->stmt_alter_table_exchange_partition($6)) - MYSQL_YYABORT; - } - ; - -remove_partitioning: - REMOVE_SYM PARTITIONING_SYM - { - Lex->alter_info.partition_flags|= ALTER_PARTITION_REMOVE; - } - ; - -all_or_alt_part_name_list: - ALL - { - Lex->alter_info.partition_flags|= ALTER_PARTITION_ALL; - } - | alt_part_name_list - ; - -add_partition_rule: - ADD PARTITION_SYM opt_if_not_exists - opt_no_write_to_binlog - { - LEX *lex= Lex; - lex->part_info= new (thd->mem_root) partition_info(); - if (unlikely(!lex->part_info)) - MYSQL_YYABORT; - - lex->alter_info.partition_flags|= ALTER_PARTITION_ADD; - DBUG_ASSERT(!Lex->create_info.if_not_exists()); - lex->create_info.set($3); - lex->no_write_to_binlog= $4; - } - add_part_extra - {} - ; - -add_part_extra: - /* empty */ - | '(' part_def_list ')' - { - LEX *lex= Lex; - lex->part_info->num_parts= lex->part_info->partitions.elements; - } - | PARTITIONS_SYM real_ulong_num - { - Lex->part_info->num_parts= $2; - } - ; - -reorg_partition_rule: - REORGANIZE_SYM PARTITION_SYM opt_no_write_to_binlog - { - LEX *lex= Lex; - lex->part_info= new (thd->mem_root) partition_info(); - if (unlikely(!lex->part_info)) - MYSQL_YYABORT; - - lex->no_write_to_binlog= $3; - } - reorg_parts_rule - ; - -reorg_parts_rule: - /* empty */ - { - Lex->alter_info.partition_flags|= ALTER_PARTITION_TABLE_REORG; - } - | alt_part_name_list - { - Lex->alter_info.partition_flags|= ALTER_PARTITION_REORGANIZE; - } - INTO '(' part_def_list ')' - { - partition_info *part_info= Lex->part_info; - part_info->num_parts= part_info->partitions.elements; - } - ; - -alt_part_name_list: - alt_part_name_item {} - | alt_part_name_list ',' alt_part_name_item {} - ; - -alt_part_name_item: - ident - { - if (unlikely(Lex->alter_info.partition_names.push_back($1.str, - thd->mem_root))) - MYSQL_YYABORT; - } - ; - -/* - End of management of partition commands -*/ - -alter_list: - alter_list_item - | alter_list ',' alter_list_item - ; - -add_column: - ADD opt_column opt_if_not_exists_table_element - ; - -alter_list_item: - add_column column_def opt_place - { - LEX *lex=Lex; - lex->create_last_non_select_table= lex->last_table(); - lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; - $2->after= $3; - } - | ADD key_def - { - Lex->create_last_non_select_table= Lex->last_table(); - Lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | ADD period_for_system_time - { - Lex->alter_info.flags|= ALTER_ADD_PERIOD; - } - | ADD - PERIOD_SYM opt_if_not_exists_table_element period_for_application_time - { - Table_period_info &period= Lex->create_info.period_info; - period.create_if_not_exists= Lex->check_exists; - Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; - } - | add_column '(' create_field_list ')' - { - LEX *lex=Lex; - lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; - if (!lex->alter_info.key_list.is_empty()) - lex->alter_info.flags|= ALTER_ADD_INDEX; - } - | ADD constraint_def - { - Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; - } - | ADD CONSTRAINT IF_SYM not EXISTS field_ident check_constraint - { - Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; - Lex->add_constraint($6, $7, TRUE); - } - | CHANGE opt_column opt_if_exists_table_element field_ident - field_spec opt_place - { - Lex->alter_info.flags|= ALTER_CHANGE_COLUMN | ALTER_RENAME_COLUMN; - Lex->create_last_non_select_table= Lex->last_table(); - $5->change= $4; - $5->after= $6; - } - | MODIFY_SYM opt_column opt_if_exists_table_element - field_spec opt_place - { - Lex->alter_info.flags|= ALTER_CHANGE_COLUMN; - Lex->create_last_non_select_table= Lex->last_table(); - $4->change= $4->field_name; - $4->after= $5; - } - | DROP opt_column opt_if_exists_table_element field_ident opt_restrict - { - LEX *lex=Lex; - Alter_drop *ad= (new (thd->mem_root) - Alter_drop(Alter_drop::COLUMN, $4.str, $3)); - if (unlikely(ad == NULL)) - MYSQL_YYABORT; - lex->alter_info.drop_list.push_back(ad, thd->mem_root); - lex->alter_info.flags|= ALTER_PARSER_DROP_COLUMN; - } - | DROP CONSTRAINT opt_if_exists_table_element field_ident - { - LEX *lex=Lex; - Alter_drop *ad= (new (thd->mem_root) - Alter_drop(Alter_drop::CHECK_CONSTRAINT, - $4.str, $3)); - if (unlikely(ad == NULL)) - MYSQL_YYABORT; - lex->alter_info.drop_list.push_back(ad, thd->mem_root); - lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; - } - | DROP FOREIGN KEY_SYM opt_if_exists_table_element field_ident - { - LEX *lex=Lex; - Alter_drop *ad= (new (thd->mem_root) - Alter_drop(Alter_drop::FOREIGN_KEY, $5.str, $4)); - if (unlikely(ad == NULL)) - MYSQL_YYABORT; - lex->alter_info.drop_list.push_back(ad, thd->mem_root); - lex->alter_info.flags|= ALTER_DROP_FOREIGN_KEY; - } - | DROP opt_constraint_no_id PRIMARY_SYM KEY_SYM - { - LEX *lex=Lex; - Alter_drop *ad= (new (thd->mem_root) - Alter_drop(Alter_drop::KEY, primary_key_name, - FALSE)); - if (unlikely(ad == NULL)) - MYSQL_YYABORT; - lex->alter_info.drop_list.push_back(ad, thd->mem_root); - lex->alter_info.flags|= ALTER_DROP_INDEX; - } - | DROP key_or_index opt_if_exists_table_element field_ident - { - LEX *lex=Lex; - Alter_drop *ad= (new (thd->mem_root) - Alter_drop(Alter_drop::KEY, $4.str, $3)); - if (unlikely(ad == NULL)) - MYSQL_YYABORT; - lex->alter_info.drop_list.push_back(ad, thd->mem_root); - lex->alter_info.flags|= ALTER_DROP_INDEX; - } - | DISABLE_SYM KEYS - { - LEX *lex=Lex; - lex->alter_info.keys_onoff= Alter_info::DISABLE; - lex->alter_info.flags|= ALTER_KEYS_ONOFF; - } - | ENABLE_SYM KEYS - { - LEX *lex=Lex; - lex->alter_info.keys_onoff= Alter_info::ENABLE; - lex->alter_info.flags|= ALTER_KEYS_ONOFF; - } - | ALTER opt_column opt_if_exists_table_element field_ident SET DEFAULT column_default_expr - { - if (unlikely(Lex->add_alter_list($4.str, $7, $3))) - MYSQL_YYABORT; - } - | ALTER opt_column opt_if_exists_table_element field_ident DROP DEFAULT - { - if (unlikely(Lex->add_alter_list($4.str, (Virtual_column_info*) 0, - $3))) - MYSQL_YYABORT; - } - | RENAME opt_to table_ident - { - LEX *lex=Lex; - lex->first_select_lex()->db= $3->db; - if (lex->first_select_lex()->db.str == NULL && - lex->copy_db_to(&lex->first_select_lex()->db)) - MYSQL_YYABORT; - if (unlikely(check_table_name($3->table.str,$3->table.length, - FALSE)) || - ($3->db.str && unlikely(check_db_name((LEX_STRING*) &$3->db)))) - my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), $3->table.str)); - lex->name= $3->table; - lex->alter_info.flags|= ALTER_RENAME; - } - | CONVERT_SYM TO_SYM charset charset_name_or_default opt_collate - { - if (!$4) - { - $4= thd->variables.collation_database; - } - $5= $5 ? $5 : $4; - if (unlikely(!my_charset_same($4,$5))) - my_yyabort_error((ER_COLLATION_CHARSET_MISMATCH, MYF(0), - $5->name, $4->csname)); - if (unlikely(Lex->create_info.add_alter_list_item_convert_to_charset($5))) - MYSQL_YYABORT; - Lex->alter_info.flags|= ALTER_CONVERT_TO; - } - | create_table_options_space_separated - { - LEX *lex=Lex; - lex->alter_info.flags|= ALTER_OPTIONS; - } - | FORCE_SYM - { - Lex->alter_info.flags|= ALTER_RECREATE; - } - | alter_order_clause - { - LEX *lex=Lex; - lex->alter_info.flags|= ALTER_ORDER; - } - | alter_algorithm_option - | alter_lock_option - | ADD SYSTEM VERSIONING_SYM - { - Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; - Lex->create_info.options|= HA_VERSIONED_TABLE; - } - | DROP SYSTEM VERSIONING_SYM - { - Lex->alter_info.flags|= ALTER_DROP_SYSTEM_VERSIONING; - Lex->create_info.options&= ~HA_VERSIONED_TABLE; - } - | DROP PERIOD_SYM FOR_SYSTEM_TIME_SYM - { - Lex->alter_info.flags|= ALTER_DROP_PERIOD; - } - | DROP PERIOD_SYM opt_if_exists_table_element FOR_SYM ident - { - Alter_drop *ad= new Alter_drop(Alter_drop::PERIOD, $5.str, $3); - if (unlikely(ad == NULL)) - MYSQL_YYABORT; - Lex->alter_info.drop_list.push_back(ad, thd->mem_root); - Lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; - } - ; - -opt_index_lock_algorithm: - /* empty */ - | alter_lock_option - | alter_algorithm_option - | alter_lock_option alter_algorithm_option - | alter_algorithm_option alter_lock_option - ; - -alter_algorithm_option: - ALGORITHM_SYM opt_equal DEFAULT - { - Lex->alter_info.requested_algorithm= - Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT; - } - | ALGORITHM_SYM opt_equal ident - { - if (unlikely(Lex->alter_info.set_requested_algorithm(&$3))) - my_yyabort_error((ER_UNKNOWN_ALTER_ALGORITHM, MYF(0), $3.str)); - } - ; - -alter_lock_option: - LOCK_SYM opt_equal DEFAULT - { - Lex->alter_info.requested_lock= - Alter_info::ALTER_TABLE_LOCK_DEFAULT; - } - | LOCK_SYM opt_equal ident - { - if (unlikely(Lex->alter_info.set_requested_lock(&$3))) - my_yyabort_error((ER_UNKNOWN_ALTER_LOCK, MYF(0), $3.str)); - } - ; - -opt_column: - /* empty */ {} %prec PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE - | COLUMN_SYM {} - ; - -opt_ignore: - /* empty */ { Lex->ignore= 0;} - | IGNORE_SYM { Lex->ignore= 1;} - ; - -alter_options: - { Lex->ignore= 0;} alter_options_part2 - ; - -alter_options_part2: - /* empty */ - | alter_option_list - ; - -alter_option_list: - alter_option_list alter_option - | alter_option - ; - -alter_option: - IGNORE_SYM { Lex->ignore= 1;} - | ONLINE_SYM - { - Lex->alter_info.requested_lock= - Alter_info::ALTER_TABLE_LOCK_NONE; - } - ; - -opt_restrict: - /* empty */ { Lex->drop_mode= DROP_DEFAULT; } - | RESTRICT { Lex->drop_mode= DROP_RESTRICT; } - | CASCADE { Lex->drop_mode= DROP_CASCADE; } - ; - -opt_place: - /* empty */ { $$= null_clex_str; } - | AFTER_SYM ident - { - $$= $2; - Lex->alter_info.flags |= ALTER_COLUMN_ORDER; - } - | FIRST_SYM - { - $$.str= first_keyword; - $$.length= 5; /* Length of "first" */ - Lex->alter_info.flags |= ALTER_COLUMN_ORDER; - } - ; - -opt_to: - /* empty */ {} - | TO_SYM {} - | '=' {} - | AS {} - ; - -slave: - START_SYM SLAVE optional_connection_name slave_thread_opts - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_SLAVE_START; - lex->type = 0; - /* If you change this code don't forget to update SLAVE START too */ - } - slave_until - {} - | START_SYM ALL SLAVES slave_thread_opts - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_SLAVE_ALL_START; - lex->type = 0; - /* If you change this code don't forget to update STOP SLAVE too */ - } - {} - | STOP_SYM SLAVE optional_connection_name slave_thread_opts - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_SLAVE_STOP; - lex->type = 0; - /* If you change this code don't forget to update SLAVE STOP too */ - } - | STOP_SYM ALL SLAVES slave_thread_opts - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_SLAVE_ALL_STOP; - lex->type = 0; - /* If you change this code don't forget to update SLAVE STOP too */ - } - ; - -start: - START_SYM TRANSACTION_SYM opt_start_transaction_option_list - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_BEGIN; - /* READ ONLY and READ WRITE are mutually exclusive. */ - if (unlikely(($3 & MYSQL_START_TRANS_OPT_READ_WRITE) && - ($3 & MYSQL_START_TRANS_OPT_READ_ONLY))) - { - thd->parse_error(); - MYSQL_YYABORT; - } - lex->start_transaction_opt= $3; - } - ; - -opt_start_transaction_option_list: - /* empty */ - { - $$= 0; - } - | start_transaction_option_list - { - $$= $1; - } - ; - -start_transaction_option_list: - start_transaction_option - { - $$= $1; - } - | start_transaction_option_list ',' start_transaction_option - { - $$= $1 | $3; - } - ; - -start_transaction_option: - WITH CONSISTENT_SYM SNAPSHOT_SYM - { - $$= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT; - } - | READ_SYM ONLY_SYM - { - $$= MYSQL_START_TRANS_OPT_READ_ONLY; - } - | READ_SYM WRITE_SYM - { - $$= MYSQL_START_TRANS_OPT_READ_WRITE; - } - ; - -slave_thread_opts: - { Lex->slave_thd_opt= 0; } - slave_thread_opt_list - {} - ; - -slave_thread_opt_list: - slave_thread_opt - | slave_thread_opt_list ',' slave_thread_opt - ; - -slave_thread_opt: - /*empty*/ {} - | SQL_THREAD { Lex->slave_thd_opt|=SLAVE_SQL; } - | RELAY_THREAD { Lex->slave_thd_opt|=SLAVE_IO; } - ; - -slave_until: - /*empty*/ {} - | UNTIL_SYM slave_until_opts - { - LEX *lex=Lex; - if (unlikely(((lex->mi.log_file_name || lex->mi.pos) && - (lex->mi.relay_log_name || lex->mi.relay_log_pos)) || - !((lex->mi.log_file_name && lex->mi.pos) || - (lex->mi.relay_log_name && lex->mi.relay_log_pos)))) - my_yyabort_error((ER_BAD_SLAVE_UNTIL_COND, MYF(0))); - } - | UNTIL_SYM MASTER_GTID_POS_SYM '=' TEXT_STRING_sys - { - Lex->mi.gtid_pos_str = $4; - } - ; - -slave_until_opts: - master_file_def - | slave_until_opts ',' master_file_def - ; - -checksum: - CHECKSUM_SYM table_or_tables - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_CHECKSUM; - /* Will be overridden during execution. */ - YYPS->m_lock_type= TL_UNLOCK; - } - table_list opt_checksum_type - {} - ; - -opt_checksum_type: - /* nothing */ { Lex->check_opt.flags= 0; } - | QUICK { Lex->check_opt.flags= T_QUICK; } - | EXTENDED_SYM { Lex->check_opt.flags= T_EXTEND; } - ; - -repair_table_or_view: - table_or_tables table_list opt_mi_repair_type - | VIEW_SYM - { Lex->table_type= TABLE_TYPE_VIEW; } - table_list opt_view_repair_type - ; - -repair: - REPAIR opt_no_write_to_binlog - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_REPAIR; - lex->no_write_to_binlog= $2; - lex->check_opt.init(); - lex->alter_info.reset(); - /* Will be overridden during execution. */ - YYPS->m_lock_type= TL_UNLOCK; - } - repair_table_or_view - { - LEX* lex= thd->lex; - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_repair_table(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - ; - -opt_mi_repair_type: - /* empty */ { Lex->check_opt.flags = T_MEDIUM; } - | mi_repair_types {} - ; - -mi_repair_types: - mi_repair_type {} - | mi_repair_type mi_repair_types {} - ; - -mi_repair_type: - QUICK { Lex->check_opt.flags|= T_QUICK; } - | EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; } - | USE_FRM { Lex->check_opt.sql_flags|= TT_USEFRM; } - ; - -opt_view_repair_type: - /* empty */ { } - | FROM MYSQL_SYM { Lex->check_opt.sql_flags|= TT_FROM_MYSQL; } - ; - -analyze: - ANALYZE_SYM opt_no_write_to_binlog table_or_tables - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_ANALYZE; - lex->no_write_to_binlog= $2; - lex->check_opt.init(); - lex->alter_info.reset(); - /* Will be overridden during execution. */ - YYPS->m_lock_type= TL_UNLOCK; - } - analyze_table_list - { - LEX* lex= thd->lex; - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_analyze_table(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - ; - -analyze_table_list: - analyze_table_elem_spec - | analyze_table_list ',' analyze_table_elem_spec - ; - -analyze_table_elem_spec: - table_name opt_persistent_stat_clause - ; - -opt_persistent_stat_clause: - /* empty */ - {} - | PERSISTENT_SYM FOR_SYM persistent_stat_spec - { - thd->lex->with_persistent_for_clause= TRUE; - } - ; - -persistent_stat_spec: - ALL - {} - | COLUMNS persistent_column_stat_spec INDEXES persistent_index_stat_spec - {} - ; - -persistent_column_stat_spec: - ALL {} - | '(' - { - LEX* lex= thd->lex; - lex->column_list= new (thd->mem_root) List<LEX_STRING>; - if (unlikely(lex->column_list == NULL)) - MYSQL_YYABORT; - } - table_column_list - ')' - { } - ; - -persistent_index_stat_spec: - ALL {} - | '(' - { - LEX* lex= thd->lex; - lex->index_list= new (thd->mem_root) List<LEX_STRING>; - if (unlikely(lex->index_list == NULL)) - MYSQL_YYABORT; - } - table_index_list - ')' - { } - ; - -table_column_list: - /* empty */ - {} - | ident - { - Lex->column_list->push_back((LEX_STRING*) - thd->memdup(&$1, sizeof(LEX_STRING)), thd->mem_root); - } - | table_column_list ',' ident - { - Lex->column_list->push_back((LEX_STRING*) - thd->memdup(&$3, sizeof(LEX_STRING)), thd->mem_root); - } - ; - -table_index_list: - /* empty */ - {} - | table_index_name - | table_index_list ',' table_index_name - ; - -table_index_name: - ident - { - Lex->index_list->push_back((LEX_STRING*) - thd->memdup(&$1, sizeof(LEX_STRING)), - thd->mem_root); - } - | - PRIMARY_SYM - { - LEX_STRING str= {(char*) "PRIMARY", 7}; - Lex->index_list->push_back((LEX_STRING*) - thd->memdup(&str, sizeof(LEX_STRING)), - thd->mem_root); - } - ; - -binlog_base64_event: - BINLOG_SYM TEXT_STRING_sys - { - Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; - Lex->comment= $2; - Lex->ident.str= NULL; - Lex->ident.length= 0; - } - | - BINLOG_SYM '@' ident_or_text ',' '@' ident_or_text - { - Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; - Lex->comment= $3; - Lex->ident= $6; - } - ; - -check_view_or_table: - table_or_tables table_list opt_mi_check_type - | VIEW_SYM - { Lex->table_type= TABLE_TYPE_VIEW; } - table_list opt_view_check_type - ; - -check: CHECK_SYM - { - LEX *lex=Lex; - - lex->sql_command = SQLCOM_CHECK; - lex->check_opt.init(); - lex->alter_info.reset(); - /* Will be overridden during execution. */ - YYPS->m_lock_type= TL_UNLOCK; - } - check_view_or_table - { - LEX* lex= thd->lex; - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "CHECK")); - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_check_table(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - ; - -opt_mi_check_type: - /* empty */ { Lex->check_opt.flags = T_MEDIUM; } - | mi_check_types {} - ; - -mi_check_types: - mi_check_type {} - | mi_check_type mi_check_types {} - ; - -mi_check_type: - QUICK { Lex->check_opt.flags|= T_QUICK; } - | FAST_SYM { Lex->check_opt.flags|= T_FAST; } - | MEDIUM_SYM { Lex->check_opt.flags|= T_MEDIUM; } - | EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; } - | CHANGED { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } - | FOR_SYM UPGRADE_SYM { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } - ; - -opt_view_check_type: - /* empty */ { } - | FOR_SYM UPGRADE_SYM { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } - ; - -optimize: - OPTIMIZE opt_no_write_to_binlog table_or_tables - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_OPTIMIZE; - lex->no_write_to_binlog= $2; - lex->check_opt.init(); - lex->alter_info.reset(); - /* Will be overridden during execution. */ - YYPS->m_lock_type= TL_UNLOCK; - } - table_list opt_lock_wait_timeout - { - LEX* lex= thd->lex; - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_optimize_table(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - ; - -opt_no_write_to_binlog: - /* empty */ { $$= 0; } - | NO_WRITE_TO_BINLOG { $$= 1; } - | LOCAL_SYM { $$= 1; } - ; - -rename: - RENAME table_or_tables - { - Lex->sql_command= SQLCOM_RENAME_TABLE; - } - table_to_table_list - {} - | RENAME USER_SYM clear_privileges rename_list - { - Lex->sql_command = SQLCOM_RENAME_USER; - } - ; - -rename_list: - user TO_SYM user - { - if (unlikely(Lex->users_list.push_back($1, thd->mem_root) || - Lex->users_list.push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - | rename_list ',' user TO_SYM user - { - if (unlikely(Lex->users_list.push_back($3, thd->mem_root) || - Lex->users_list.push_back($5, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -table_to_table_list: - table_to_table - | table_to_table_list ',' table_to_table - ; - -table_to_table: - table_ident opt_lock_wait_timeout TO_SYM table_ident - { - LEX *lex=Lex; - SELECT_LEX *sl= lex->current_select; - if (unlikely(!sl->add_table_to_list(thd, $1,NULL, - TL_OPTION_UPDATING, - TL_IGNORE, MDL_EXCLUSIVE)) || - unlikely(!sl->add_table_to_list(thd, $4, NULL, - TL_OPTION_UPDATING, - TL_IGNORE, MDL_EXCLUSIVE))) - MYSQL_YYABORT; - } - ; - -keycache: - CACHE_SYM INDEX_SYM - { - Lex->alter_info.reset(); - } - keycache_list_or_parts IN_SYM key_cache_name - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; - lex->ident= $6; - } - ; - -keycache_list_or_parts: - keycache_list - | assign_to_keycache_parts - ; - -keycache_list: - assign_to_keycache - | keycache_list ',' assign_to_keycache - ; - -assign_to_keycache: - table_ident cache_keys_spec - { - if (unlikely(!Select->add_table_to_list(thd, $1, NULL, 0, TL_READ, - MDL_SHARED_READ, - Select-> - pop_index_hints()))) - MYSQL_YYABORT; - } - ; - -assign_to_keycache_parts: - table_ident adm_partition cache_keys_spec - { - if (unlikely(!Select->add_table_to_list(thd, $1, NULL, 0, TL_READ, - MDL_SHARED_READ, - Select-> - pop_index_hints()))) - MYSQL_YYABORT; - } - ; - -key_cache_name: - ident { $$= $1; } - | DEFAULT { $$ = default_key_cache_base; } - ; - -preload: - LOAD INDEX_SYM INTO CACHE_SYM - { - LEX *lex=Lex; - lex->sql_command=SQLCOM_PRELOAD_KEYS; - lex->alter_info.reset(); - } - preload_list_or_parts - {} - ; - -preload_list_or_parts: - preload_keys_parts - | preload_list - ; - -preload_list: - preload_keys - | preload_list ',' preload_keys - ; - -preload_keys: - table_ident cache_keys_spec opt_ignore_leaves - { - if (unlikely(!Select->add_table_to_list(thd, $1, NULL, $3, TL_READ, - MDL_SHARED_READ, - Select-> - pop_index_hints()))) - MYSQL_YYABORT; - } - ; - -preload_keys_parts: - table_ident adm_partition cache_keys_spec opt_ignore_leaves - { - if (unlikely(!Select->add_table_to_list(thd, $1, NULL, $4, TL_READ, - MDL_SHARED_READ, - Select-> - pop_index_hints()))) - MYSQL_YYABORT; - } - ; - -adm_partition: - PARTITION_SYM have_partitioning - { - Lex->alter_info.partition_flags|= ALTER_PARTITION_ADMIN; - } - '(' all_or_alt_part_name_list ')' - ; - -cache_keys_spec: - { - Lex->first_select_lex()->alloc_index_hints(thd); - Select->set_index_hint_type(INDEX_HINT_USE, - INDEX_HINT_MASK_ALL); - } - cache_key_list_or_empty - ; - -cache_key_list_or_empty: - /* empty */ { } - | key_or_index '(' opt_key_usage_list ')' - ; - -opt_ignore_leaves: - /* empty */ - { $$= 0; } - | IGNORE_SYM LEAVES { $$= TL_OPTION_IGNORE_LEAVES; } - ; - -/* - Select : retrieve data from table -*/ - - -select: - query_expression_no_with_clause - { - if (Lex->push_select($1->fake_select_lex ? - $1->fake_select_lex : - $1->first_select())) - MYSQL_YYABORT; - } - opt_procedure_or_into - { - Lex->pop_select(); - $1->set_with_clause(NULL); - if (Lex->select_finalize($1, $3)) - MYSQL_YYABORT; - } - | with_clause query_expression_no_with_clause - { - if (Lex->push_select($2->fake_select_lex ? - $2->fake_select_lex : - $2->first_select())) - MYSQL_YYABORT; - } - opt_procedure_or_into - { - Lex->pop_select(); - $2->set_with_clause($1); - $1->attach_to($2->first_select()); - if (Lex->select_finalize($2, $4)) - MYSQL_YYABORT; - } - ; - -select_into: - select_into_query_specification - { - if (Lex->push_select($1)) - MYSQL_YYABORT; - } - opt_order_limit_lock - { - SELECT_LEX_UNIT *unit; - if (!(unit = Lex->create_unit($1))) - MYSQL_YYABORT; - if ($3) - unit= Lex->add_tail_to_query_expression_body(unit, $3); - if (Lex->select_finalize(unit)) - MYSQL_YYABORT; - } - | with_clause - select_into_query_specification - { - if (Lex->push_select($2)) - MYSQL_YYABORT; - } - opt_order_limit_lock - { - SELECT_LEX_UNIT *unit; - if (!(unit = Lex->create_unit($2))) - MYSQL_YYABORT; - if ($4) - unit= Lex->add_tail_to_query_expression_body(unit, $4); - unit->set_with_clause($1); - $1->attach_to($2); - if (Lex->select_finalize(unit)) - MYSQL_YYABORT; - } - ; - -simple_table: - query_specification { $$= $1; } - | table_value_constructor { $$= $1; } - ; - -table_value_constructor: - VALUES - { - if (Lex->parsed_TVC_start()) - MYSQL_YYABORT; - } - values_list - { - if (!($$= Lex->parsed_TVC_end())) - MYSQL_YYABORT; - } - ; - -query_specification_start: - SELECT_SYM - { - SELECT_LEX *sel; - LEX *lex= Lex; - if (!(sel= lex->alloc_select(TRUE)) || lex->push_select(sel)) - MYSQL_YYABORT; - sel->init_select(); - sel->braces= FALSE; - } - select_options - { - Select->parsing_place= SELECT_LIST; - } - select_item_list - { - Select->parsing_place= NO_MATTER; - } - ; - -query_specification: - query_specification_start - opt_from_clause - opt_where_clause - opt_group_clause - opt_having_clause - opt_window_clause - { - $$= Lex->pop_select(); - } - ; - -select_into_query_specification: - query_specification_start - into - opt_from_clause - opt_where_clause - opt_group_clause - opt_having_clause - opt_window_clause - { - $$= Lex->pop_select(); - } - ; - -/** - - The following grammar for query expressions conformant to - the latest SQL Standard is supported: - - <query expression> ::= - [ <with clause> ] <query expression body> - [ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ] - - <with clause> ::= - WITH [ RECURSIVE ] <with_list - - <with list> ::= - <with list element> [ { <comma> <with list element> }... ] - - <with list element> ::= - <query name> [ '(' <with column list> ')' ] - AS <table subquery> - - <with column list> ::= - <column name list> - - <query expression body> :: - <query term> - | <query expression body> UNION [ ALL | DISTINCT ] <query term> - | <query expression body> EXCEPT [ DISTINCT ] <query term> - - <query term> ::= - <query primary> - | <query term> INTERSECT [ DISTINCT ] <query primary> - - <query primary> ::= - <simple table> - | '(' <query expression body> - [ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ] - ')' - - <simple table> - <query specification> - | <table value constructor> - - <subquery> - '(' <query_expression> ')' - -*/ - -/* - query_expression produces the same expressions as - <query expression> -*/ - -query_expression: - query_expression_no_with_clause - { - $1->set_with_clause(NULL); - $$= $1; - } - | with_clause - query_expression_no_with_clause - { - $2->set_with_clause($1); - $1->attach_to($2->first_select()); - $$= $2; - } - ; - -/* - query_expression_no_with_clause produces the same expressions as - <query expression> without [ <with clause> ] -*/ - -query_expression_no_with_clause: - query_expression_body_ext { $$= $1; } - | query_expression_body_ext_parens { $$= $1; } - ; - -/* - query_expression_body_ext produces the same expressions as - <query expression body> - [ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ] - | '('... <query expression body> - [ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ] - ')'... - Note: number of ')' must be equal to the number of '(' in the rule above -*/ - -query_expression_body_ext: - query_expression_body - { - if ($1->first_select()->next_select()) - { - if (Lex->parsed_multi_operand_query_expression_body($1)) - MYSQL_YYABORT; - } - } - opt_query_expression_tail - { - if (!$3) - $$= $1; - else - $$= Lex->add_tail_to_query_expression_body($1, $3); - } - | query_expression_body_ext_parens - { - Lex->push_select(!$1->first_select()->next_select() ? - $1->first_select() : $1->fake_select_lex); - } - query_expression_tail - { - if (!($$= Lex->add_tail_to_query_expression_body_ext_parens($1, $3))) - MYSQL_YYABORT; - } - ; - -query_expression_body_ext_parens: - '(' query_expression_body_ext_parens ')' - { $$= $2; } - | '(' query_expression_body_ext ')' - { - SELECT_LEX *sel= $2->first_select()->next_select() ? - $2->fake_select_lex : $2->first_select(); - sel->braces= true; - $$= $2; - } - ; - -/* - query_expression_body produces the same expressions as - <query expression body> -*/ - -query_expression_body: - query_simple - { - Lex->push_select($1); - if (!($$= Lex->create_unit($1))) - MYSQL_YYABORT; - } - | query_expression_body - unit_type_decl - { - if (!$1->first_select()->next_select()) - { - Lex->pop_select(); - } - } - query_primary - { - if (!($$= Lex->add_primary_to_query_expression_body($1, $4, - $2.unit_type, - $2.distinct))) - MYSQL_YYABORT; - } - | query_expression_body_ext_parens - unit_type_decl - query_primary - { - if (!($$= Lex->add_primary_to_query_expression_body_ext_parens( - $1, $3, - $2.unit_type, - $2.distinct))) - MYSQL_YYABORT; - } - ; - -/* - query_primary produces the same expressions as - <query primary> -*/ - -query_primary: - query_simple - { $$= $1; } - | query_expression_body_ext_parens - { $$= $1->first_select(); } - ; - -/* - query_simple produces the same expressions as - <simple table> -*/ - -query_simple: - simple_table { $$= $1;} - ; - -subselect: - query_expression - { - if (!($$= Lex->parsed_subselect($1))) - YYABORT; - } - ; - -/* - subquery produces the same expressions as - <subquery> - - Consider the production rule of the SQL Standard - subquery: - '(' query_expression ')' - - This rule is equivalent to the rule - subquery: - '(' query_expression_no_with_clause ')' - | '(' with_clause query_expression_no_with_clause ')' - that in its turn is equivalent to - subquery: - '(' query_expression_body_ext ')' - | query_expression_body_ext_parens - | '(' with_clause query_expression_no_with_clause ')' - - The latter can be re-written into - subquery: - query_expression_body_ext_parens - | '(' with_clause query_expression_no_with_clause ')' - - The last rule allows us to resolve properly the shift/reduce conflict - when subquery is used in expressions such as in the following queries - select (select * from t1 limit 1) + t2.a from t2 - select * from t1 where t1.a [not] in (select t2.a from t2) - - In the rule below %prec SUBQUERY_AS_EXPR forces the parser to perform a shift - operation rather then a reduce operation when ')' is encountered and can be - considered as the last symbol a query expression. -*/ - -subquery: - query_expression_body_ext_parens %prec SUBQUERY_AS_EXPR - { - if (!$1->fake_select_lex) - $1->first_select()->braces= false; - else - $1->fake_select_lex->braces= false; - if (!($$= Lex->parsed_subselect($1))) - YYABORT; - } - | '(' with_clause query_expression_no_with_clause ')' - { - $3->set_with_clause($2); - $2->attach_to($3->first_select()); - if (!($$= Lex->parsed_subselect($3))) - YYABORT; - } - ; - -opt_from_clause: - /* empty */ %prec EMPTY_FROM_CLAUSE - | from_clause - ; - -from_clause: - FROM table_reference_list - ; - -table_reference_list: - join_table_list - { - Select->context.table_list= - Select->context.first_name_resolution_table= - Select->table_list.first; - } - | DUAL_SYM - /* oracle compatibility: oracle always requires FROM clause, - and DUAL is system table without fields. - Is "SELECT 1 FROM DUAL" any better than "SELECT 1" ? - Hmmm :) */ - ; - -select_options: - /* empty*/ - | select_option_list - { - if (unlikely((Select->options & SELECT_DISTINCT) && - (Select->options & SELECT_ALL))) - my_yyabort_error((ER_WRONG_USAGE, MYF(0), "ALL", "DISTINCT")); - } - ; - -opt_history_unit: - /* empty*/ %prec PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE - { - $$= VERS_TIMESTAMP; - } - | TRANSACTION_SYM - { - $$= VERS_TRX_ID; - } - | TIMESTAMP - { - $$= VERS_TIMESTAMP; - } - ; - -history_point: - TIMESTAMP TEXT_STRING - { - Item *item; - if (!(item= type_handler_datetime.create_literal_item(thd, - $2.str, $2.length, - YYCSCL, true))) - MYSQL_YYABORT; - $$= Vers_history_point(VERS_TIMESTAMP, item); - } - | function_call_keyword_timestamp - { - $$= Vers_history_point(VERS_TIMESTAMP, $1); - } - | opt_history_unit bit_expr - { - $$= Vers_history_point($1, $2); - } - ; - -for_portion_of_time_clause: - FOR_SYM PORTION_SYM OF_SYM remember_tok_start ident FROM - bit_expr TO_SYM bit_expr - { - if (unlikely(0 == strcasecmp($5.str, "SYSTEM_TIME"))) - { - thd->parse_error(ER_SYNTAX_ERROR, $4); - MYSQL_YYABORT; - } - Lex->period_conditions.init(SYSTEM_TIME_FROM_TO, - Vers_history_point(VERS_TIMESTAMP, $7), - Vers_history_point(VERS_TIMESTAMP, $9), - $5); - } - ; - -opt_for_portion_of_time_clause: - /* empty */ - { - $$= false; - } - | for_portion_of_time_clause - { - $$= true; - } - ; - -opt_for_system_time_clause: - /* empty */ - { - $$= false; - } - | FOR_SYSTEM_TIME_SYM system_time_expr - { - $$= true; - } - ; - -system_time_expr: - AS OF_SYM history_point - { - Lex->vers_conditions.init(SYSTEM_TIME_AS_OF, $3); - } - | ALL - { - Lex->vers_conditions.init(SYSTEM_TIME_ALL); - } - | FROM history_point TO_SYM history_point - { - Lex->vers_conditions.init(SYSTEM_TIME_FROM_TO, $2, $4); - } - | BETWEEN_SYM history_point AND_SYM history_point - { - Lex->vers_conditions.init(SYSTEM_TIME_BETWEEN, $2, $4); - } - ; - -select_option_list: - select_option_list select_option - | select_option - ; - -select_option: - query_expression_option - | SQL_NO_CACHE_SYM - { - /* - Allow this flag once per query. - */ - if (Select->options & OPTION_NO_QUERY_CACHE) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_NO_CACHE")); - Select->options|= OPTION_NO_QUERY_CACHE; - } - | SQL_CACHE_SYM - { - /* - Allow this flag once per query. - */ - if (Select->options & OPTION_TO_QUERY_CACHE) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_CACHE")); - Select->options|= OPTION_TO_QUERY_CACHE; - } - ; - - -select_lock_type: - FOR_SYM UPDATE_SYM opt_lock_wait_timeout_new - { - $$= $3; - $$.defined_lock= TRUE; - $$.update_lock= TRUE; - } - | LOCK_SYM IN_SYM SHARE_SYM MODE_SYM opt_lock_wait_timeout_new - { - $$= $5; - $$.defined_lock= TRUE; - $$.update_lock= FALSE; - } - ; - - -opt_select_lock_type: - /* empty */ - { - $$.empty(); - } - | select_lock_type - { - $$= $1; - } - ; - - -opt_lock_wait_timeout_new: - /* empty */ - { - $$.empty(); - } - | WAIT_SYM ulong_num - { - $$.defined_timeout= TRUE; - $$.timeout= $2; - } - | NOWAIT_SYM - { - $$.defined_timeout= TRUE; - $$.timeout= 0; - } - ; - -select_item_list: - select_item_list ',' select_item - | select_item - | '*' - { - Item *item= new (thd->mem_root) - Item_field(thd, &thd->lex->current_select->context, - star_clex_str); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - if (unlikely(add_item_to_list(thd, item))) - MYSQL_YYABORT; - (thd->lex->current_select->with_wild)++; - } - ; - -select_item: - remember_name select_sublist_qualified_asterisk remember_end - { - if (unlikely(add_item_to_list(thd, $2))) - MYSQL_YYABORT; - } - | remember_name expr remember_end select_alias - { - DBUG_ASSERT($1 < $3); - - if (unlikely(add_item_to_list(thd, $2))) - MYSQL_YYABORT; - if ($4.str) - { - if (unlikely(Lex->sql_command == SQLCOM_CREATE_VIEW && - check_column_name($4.str))) - my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), $4.str)); - $2->is_autogenerated_name= FALSE; - $2->set_name(thd, $4); - } - else if (!$2->name.str || $2->name.str == item_empty_name) - { - $2->set_name(thd, $1, (uint) ($3 - $1), thd->charset()); - } - } - ; - -remember_tok_start: - { - $$= (char*) YYLIP->get_tok_start(); - } - ; - -remember_name: - { - $$= (char*) YYLIP->get_cpp_tok_start(); - } - ; - -remember_end: - { - $$= (char*) YYLIP->get_cpp_tok_end_rtrim(); - } - ; - -select_alias: - /* empty */ { $$=null_clex_str;} - | AS ident { $$=$2; } - | AS TEXT_STRING_sys { $$=$2; } - | ident { $$=$1; } - | TEXT_STRING_sys { $$=$1; } - ; - -opt_default_time_precision: - /* empty */ { $$= NOT_FIXED_DEC; } - | '(' ')' { $$= NOT_FIXED_DEC; } - | '(' real_ulong_num ')' { $$= $2; } - ; - -opt_time_precision: - /* empty */ { $$= 0; } - | '(' ')' { $$= 0; } - | '(' real_ulong_num ')' { $$= $2; } - ; - -optional_braces: - /* empty */ {} - | '(' ')' {} - ; - -/* all possible expressions */ -expr: - expr or expr %prec OR_SYM - { - /* - Design notes: - Do not use a manually maintained stack like thd->lex->xxx_list, - but use the internal bison stack ($$, $1 and $3) instead. - Using the bison stack is: - - more robust to changes in the grammar, - - guaranteed to be in sync with the parser state, - - better for performances (no memory allocation). - */ - Item_cond_or *item1; - Item_cond_or *item3; - if (is_cond_or($1)) - { - item1= (Item_cond_or*) $1; - if (is_cond_or($3)) - { - item3= (Item_cond_or*) $3; - /* - (X1 OR X2) OR (Y1 OR Y2) ==> OR (X1, X2, Y1, Y2) - */ - item3->add_at_head(item1->argument_list()); - $$ = $3; - } - else - { - /* - (X1 OR X2) OR Y ==> OR (X1, X2, Y) - */ - item1->add($3, thd->mem_root); - $$ = $1; - } - } - else if (is_cond_or($3)) - { - item3= (Item_cond_or*) $3; - /* - X OR (Y1 OR Y2) ==> OR (X, Y1, Y2) - */ - item3->add_at_head($1, thd->mem_root); - $$ = $3; - } - else - { - /* X OR Y */ - $$= new (thd->mem_root) Item_cond_or(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - } - | expr XOR expr %prec XOR - { - /* XOR is a proprietary extension */ - $$= new (thd->mem_root) Item_func_xor(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | expr and expr %prec AND_SYM - { - /* See comments in rule expr: expr or expr */ - Item_cond_and *item1; - Item_cond_and *item3; - if (is_cond_and($1)) - { - item1= (Item_cond_and*) $1; - if (is_cond_and($3)) - { - item3= (Item_cond_and*) $3; - /* - (X1 AND X2) AND (Y1 AND Y2) ==> AND (X1, X2, Y1, Y2) - */ - item3->add_at_head(item1->argument_list()); - $$ = $3; - } - else - { - /* - (X1 AND X2) AND Y ==> AND (X1, X2, Y) - */ - item1->add($3, thd->mem_root); - $$ = $1; - } - } - else if (is_cond_and($3)) - { - item3= (Item_cond_and*) $3; - /* - X AND (Y1 AND Y2) ==> AND (X, Y1, Y2) - */ - item3->add_at_head($1, thd->mem_root); - $$ = $3; - } - else - { - /* X AND Y */ - $$= new (thd->mem_root) Item_cond_and(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - } - | NOT_SYM expr %prec NOT_SYM - { - $$= negate_expression(thd, $2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri IS TRUE_SYM %prec IS - { - $$= new (thd->mem_root) Item_func_istrue(thd, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri IS not TRUE_SYM %prec IS - { - $$= new (thd->mem_root) Item_func_isnottrue(thd, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri IS FALSE_SYM %prec IS - { - $$= new (thd->mem_root) Item_func_isfalse(thd, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri IS not FALSE_SYM %prec IS - { - $$= new (thd->mem_root) Item_func_isnotfalse(thd, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri IS UNKNOWN_SYM %prec IS - { - $$= new (thd->mem_root) Item_func_isnull(thd, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri IS not UNKNOWN_SYM %prec IS - { - $$= new (thd->mem_root) Item_func_isnotnull(thd, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri %prec PREC_BELOW_NOT - ; - -bool_pri: - bool_pri IS NULL_SYM %prec IS - { - $$= new (thd->mem_root) Item_func_isnull(thd, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri IS not NULL_SYM %prec IS - { - $$= new (thd->mem_root) Item_func_isnotnull(thd, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri EQUAL_SYM predicate %prec EQUAL_SYM - { - $$= new (thd->mem_root) Item_func_equal(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri comp_op predicate %prec '=' - { - $$= (*$2)(0)->create(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bool_pri comp_op all_or_any '(' subselect ')' %prec '=' - { - $$= all_any_subquery_creator(thd, $1, $2, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | predicate - ; - -predicate: - bit_expr IN_SYM subquery - { - $$= new (thd->mem_root) Item_in_subselect(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr not IN_SYM subquery - { - Item *item= new (thd->mem_root) Item_in_subselect(thd, $1, $4); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= negate_expression(thd, item); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr IN_SYM '(' expr ')' - { - $$= handle_sql2003_note184_exception(thd, $1, true, $4); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr IN_SYM '(' expr ',' expr_list ')' - { - $6->push_front($4, thd->mem_root); - $6->push_front($1, thd->mem_root); - $$= new (thd->mem_root) Item_func_in(thd, *$6); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr not IN_SYM '(' expr ')' - { - $$= handle_sql2003_note184_exception(thd, $1, false, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr not IN_SYM '(' expr ',' expr_list ')' - { - $7->push_front($5, thd->mem_root); - $7->push_front($1, thd->mem_root); - Item_func_in *item= new (thd->mem_root) Item_func_in(thd, *$7); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= item->neg_transformer(thd); - } - | bit_expr BETWEEN_SYM bit_expr AND_SYM predicate - { - $$= new (thd->mem_root) Item_func_between(thd, $1, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr not BETWEEN_SYM bit_expr AND_SYM predicate - { - Item_func_between *item; - item= new (thd->mem_root) Item_func_between(thd, $1, $4, $6); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= item->neg_transformer(thd); - } - | bit_expr SOUNDS_SYM LIKE bit_expr - { - Item *item1= new (thd->mem_root) Item_func_soundex(thd, $1); - Item *item4= new (thd->mem_root) Item_func_soundex(thd, $4); - if (unlikely(item1 == NULL) || unlikely(item4 == NULL)) - MYSQL_YYABORT; - $$= new (thd->mem_root) Item_func_eq(thd, item1, item4); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr LIKE bit_expr opt_escape - { - $$= new (thd->mem_root) Item_func_like(thd, $1, $3, $4, - Lex->escape_used); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr not LIKE bit_expr opt_escape - { - Item *item= new (thd->mem_root) Item_func_like(thd, $1, $4, $5, - Lex->escape_used); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= item->neg_transformer(thd); - } - | bit_expr REGEXP bit_expr - { - $$= new (thd->mem_root) Item_func_regex(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr not REGEXP bit_expr - { - Item *item= new (thd->mem_root) Item_func_regex(thd, $1, $4); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= negate_expression(thd, item); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr %prec PREC_BELOW_NOT - ; - -bit_expr: - bit_expr '|' bit_expr %prec '|' - { - $$= new (thd->mem_root) Item_func_bit_or(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '&' bit_expr %prec '&' - { - $$= new (thd->mem_root) Item_func_bit_and(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr SHIFT_LEFT bit_expr %prec SHIFT_LEFT - { - $$= new (thd->mem_root) Item_func_shift_left(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr SHIFT_RIGHT bit_expr %prec SHIFT_RIGHT - { - $$= new (thd->mem_root) Item_func_shift_right(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr ORACLE_CONCAT_SYM bit_expr - { - $$= new (thd->mem_root) Item_func_concat_operator_oracle(thd, - $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '+' bit_expr %prec '+' - { - $$= new (thd->mem_root) Item_func_plus(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '-' bit_expr %prec '-' - { - $$= new (thd->mem_root) Item_func_minus(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '+' INTERVAL_SYM expr interval %prec '+' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $1, $4, $5, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '-' INTERVAL_SYM expr interval %prec '-' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $1, $4, $5, 1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | INTERVAL_SYM expr interval '+' expr - /* we cannot put interval before - */ - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $5, $2, $3, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | '+' INTERVAL_SYM expr interval '+' expr %prec NEG - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $6, $3, $4, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | '-' INTERVAL_SYM expr interval '+' expr %prec NEG - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $6, $3, $4, 1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '*' bit_expr %prec '*' - { - $$= new (thd->mem_root) Item_func_mul(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '/' bit_expr %prec '/' - { - $$= new (thd->mem_root) Item_func_div(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '%' bit_expr %prec '%' - { - $$= new (thd->mem_root) Item_func_mod(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr DIV_SYM bit_expr %prec DIV_SYM - { - $$= new (thd->mem_root) Item_func_int_div(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr MOD_SYM bit_expr %prec MOD_SYM - { - $$= new (thd->mem_root) Item_func_mod(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | bit_expr '^' bit_expr - { - $$= new (thd->mem_root) Item_func_bit_xor(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | mysql_concatenation_expr %prec '^' - ; - -or: - OR_SYM - | OR2_SYM - ; - -and: - AND_SYM - | AND_AND_SYM - ; - -not: - NOT_SYM - | NOT2_SYM - ; - -not2: - '!' - | NOT2_SYM - ; - -comp_op: - '=' { $$ = &comp_eq_creator; } - | GE { $$ = &comp_ge_creator; } - | '>' { $$ = &comp_gt_creator; } - | LE { $$ = &comp_le_creator; } - | '<' { $$ = &comp_lt_creator; } - | NE { $$ = &comp_ne_creator; } - ; - -all_or_any: - ALL { $$ = 1; } - | ANY_SYM { $$ = 0; } - ; - -opt_dyncol_type: - /* empty */ - { - $$.set(DYN_COL_NULL); /* automatic type */ - Lex->charset= NULL; - } - | AS dyncol_type { $$= $2; } - ; - -dyncol_type: - numeric_dyncol_type { $$= $1; Lex->charset= NULL; } - | temporal_dyncol_type { $$= $1; Lex->charset= NULL; } - | string_dyncol_type { $$= $1; } - ; - -numeric_dyncol_type: - INT_SYM { $$.set(DYN_COL_INT); } - | UNSIGNED INT_SYM { $$.set(DYN_COL_UINT); } - | DOUBLE_SYM { $$.set(DYN_COL_DOUBLE); } - | REAL { $$.set(DYN_COL_DOUBLE); } - | FLOAT_SYM { $$.set(DYN_COL_DOUBLE); } - | DECIMAL_SYM float_options { $$.set(DYN_COL_DECIMAL, $2); } - ; - -temporal_dyncol_type: - DATE_SYM { $$.set(DYN_COL_DATE); } - | TIME_SYM opt_field_length { $$.set(DYN_COL_TIME, 0, $2); } - | DATETIME opt_field_length { $$.set(DYN_COL_DATETIME, 0, $2); } - ; - -string_dyncol_type: - char - { Lex->charset= thd->variables.collation_connection; } - opt_binary - { - $$.set(DYN_COL_STRING); - } - | nchar - { - $$.set(DYN_COL_STRING); - Lex->charset= national_charset_info; - } - ; - -dyncall_create_element: - expr ',' expr opt_dyncol_type - { - LEX *lex= Lex; - $$= (DYNCALL_CREATE_DEF *) - alloc_root(thd->mem_root, sizeof(DYNCALL_CREATE_DEF)); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - $$->key= $1; - $$->value= $3; - $$->type= (DYNAMIC_COLUMN_TYPE)$4.dyncol_type(); - $$->cs= lex->charset; - if ($4.length()) - $$->len= strtoul($4.length(), NULL, 10); - else - $$->len= 0; - if ($4.dec()) - $$->frac= strtoul($4.dec(), NULL, 10); - else - $$->len= 0; - } - ; - -dyncall_create_list: - dyncall_create_element - { - $$= new (thd->mem_root) List<DYNCALL_CREATE_DEF>; - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - $$->push_back($1, thd->mem_root); - } - | dyncall_create_list ',' dyncall_create_element - { - $1->push_back($3, thd->mem_root); - $$= $1; - } - ; - - -plsql_cursor_attr: - ISOPEN_SYM { $$= PLSQL_CURSOR_ATTR_ISOPEN; } - | FOUND_SYM { $$= PLSQL_CURSOR_ATTR_FOUND; } - | NOTFOUND_SYM { $$= PLSQL_CURSOR_ATTR_NOTFOUND; } - | ROWCOUNT_SYM { $$= PLSQL_CURSOR_ATTR_ROWCOUNT; } - ; - -explicit_cursor_attr: - ident PERCENT_ORACLE_SYM plsql_cursor_attr - { - if (unlikely(!($$= Lex->make_item_plsql_cursor_attr(thd, &$1, $3)))) - MYSQL_YYABORT; - } - ; - - -trim_operands: - expr { $$.set(TRIM_BOTH, $1); } - | LEADING expr FROM expr { $$.set(TRIM_LEADING, $2, $4); } - | TRAILING expr FROM expr { $$.set(TRIM_TRAILING, $2, $4); } - | BOTH expr FROM expr { $$.set(TRIM_BOTH, $2, $4); } - | LEADING FROM expr { $$.set(TRIM_LEADING, $3); } - | TRAILING FROM expr { $$.set(TRIM_TRAILING, $3); } - | BOTH FROM expr { $$.set(TRIM_BOTH, $3); } - | expr FROM expr { $$.set(TRIM_BOTH, $1, $3); } - ; - -/* - Expressions that the parser allows in a column DEFAULT clause - without parentheses. These expressions cannot end with a COLLATE clause. - - If we allowed any "expr" in DEFAULT clause, there would be a confusion - in queries like this: - CREATE TABLE t1 (a TEXT DEFAULT 'a' COLLATE latin1_bin); - It would be not clear what COLLATE stands for: - - the collation of the column `a`, or - - the collation of the string literal 'a' - - This restriction allows to parse the above query unambiguiusly: - COLLATE belongs to the column rather than the literal. - If one needs COLLATE to belong to the literal, parentheses must be used: - CREATE TABLE t1 (a TEXT DEFAULT ('a' COLLATE latin1_bin)); - Note: the COLLATE clause is rather meaningless here, but the query - is syntactically correct. - - Note, some of the expressions are not actually allowed in DEFAULT, - e.g. sum_expr, window_func_expr, ROW(...), VALUES(). - We could move them to simple_expr, but that would make - these two queries return a different error messages: - CREATE TABLE t1 (a INT DEFAULT AVG(1)); - CREATE TABLE t1 (a INT DEFAULT (AVG(1))); - The first query would return "syntax error". - Currenly both return: - Function or expression 'avg(' is not allowed for 'DEFAULT' ... -*/ -column_default_non_parenthesized_expr: - simple_ident - | function_call_keyword - | function_call_nonkeyword - | function_call_generic - | function_call_conflict - | literal - | param_marker { $$= $1; } - | variable - | sum_expr - { - if (!Lex->select_stack_top) - { - my_error(ER_INVALID_GROUP_FUNC_USE, MYF(0)); - MYSQL_YYABORT; - } - } - | window_func_expr - { - if (!Lex->select_stack_top) - { - my_error(ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION, MYF(0)); - MYSQL_YYABORT; - } - } - | inverse_distribution_function - | ROW_SYM '(' expr ',' expr_list ')' - { - $5->push_front($3, thd->mem_root); - $$= new (thd->mem_root) Item_row(thd, *$5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | EXISTS '(' subselect ')' - { - $$= new (thd->mem_root) Item_exists_subselect(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | '{' ident expr '}' - { - if (unlikely(!($$= $3->make_odbc_literal(thd, &$2)))) - MYSQL_YYABORT; - } - | MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')' - { - $2->push_front($5, thd->mem_root); - Item_func_match *i1= new (thd->mem_root) Item_func_match(thd, *$2, - $6); - if (unlikely(i1 == NULL)) - MYSQL_YYABORT; - Select->add_ftfunc_to_list(thd, i1); - $$= i1; - } - | CAST_SYM '(' expr AS cast_type ')' - { - if (unlikely(!($$= $5.create_typecast_item_or_error(thd, $3, - Lex->charset)))) - MYSQL_YYABORT; - } - | CASE_SYM when_list_opt_else END - { - if (unlikely(!($$= new(thd->mem_root) Item_func_case_searched(thd, *$2)))) - MYSQL_YYABORT; - } - | CASE_SYM expr when_list_opt_else END - { - $3->push_front($2, thd->mem_root); - if (unlikely(!($$= new (thd->mem_root) Item_func_case_simple(thd, *$3)))) - MYSQL_YYABORT; - } - | CONVERT_SYM '(' expr ',' cast_type ')' - { - if (unlikely(!($$= $5.create_typecast_item_or_error(thd, $3, - Lex->charset)))) - MYSQL_YYABORT; - } - | CONVERT_SYM '(' expr USING charset_name ')' - { - $$= new (thd->mem_root) Item_func_conv_charset(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DEFAULT '(' simple_ident ')' - { - Item_splocal *il= $3->get_item_splocal(); - if (unlikely(il)) - my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str)); - $$= new (thd->mem_root) Item_default_value(thd, Lex->current_context(), - $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->default_used= TRUE; - } - | VALUE_SYM '(' simple_ident_nospvar ')' - { - $$= new (thd->mem_root) Item_insert_value(thd, Lex->current_context(), - $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | NEXT_SYM VALUE_SYM FOR_SYM table_ident - { - if (unlikely(!($$= Lex->create_item_func_nextval(thd, $4)))) - MYSQL_YYABORT; - } - | NEXTVAL_SYM '(' table_ident ')' - { - if (unlikely(!($$= Lex->create_item_func_nextval(thd, $3)))) - MYSQL_YYABORT; - } - | PREVIOUS_SYM VALUE_SYM FOR_SYM table_ident - { - if (unlikely(!($$= Lex->create_item_func_lastval(thd, $4)))) - MYSQL_YYABORT; - } - | LASTVAL_SYM '(' table_ident ')' - { - if (unlikely(!($$= Lex->create_item_func_lastval(thd, $3)))) - MYSQL_YYABORT; - } - | SETVAL_SYM '(' table_ident ',' longlong_num ')' - { - if (unlikely(!($$= Lex->create_item_func_setval(thd, $3, $5, 0, 1)))) - MYSQL_YYABORT; - } - | SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ')' - { - if (unlikely(!($$= Lex->create_item_func_setval(thd, $3, $5, 0, $7)))) - MYSQL_YYABORT; - } - | SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ',' ulonglong_num ')' - { - if (unlikely(!($$= Lex->create_item_func_setval(thd, $3, $5, $9, $7)))) - MYSQL_YYABORT; - } - ; - -primary_expr: - column_default_non_parenthesized_expr - | explicit_cursor_attr - | '(' parenthesized_expr ')' { $$= $2; } - | subquery - { - if (!($$= Lex->create_item_query_expression(thd, $1->master_unit()))) - MYSQL_YYABORT; - } - ; - -string_factor_expr: - primary_expr - | string_factor_expr COLLATE_SYM collation_name - { - if (unlikely(!($$= new (thd->mem_root) Item_func_set_collation(thd, $1, $3)))) - MYSQL_YYABORT; - } - ; - -simple_expr: - string_factor_expr %prec NEG - | BINARY simple_expr - { - Type_cast_attributes at(&my_charset_bin); - if (unlikely(!($$= type_handler_long_blob.create_typecast_item(thd, $2, at)))) - MYSQL_YYABORT; - } - | '+' simple_expr %prec NEG - { - $$= $2; - } - | '-' simple_expr %prec NEG - { - $$= $2->neg(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | '~' simple_expr %prec NEG - { - $$= new (thd->mem_root) Item_func_bit_neg(thd, $2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | not2 simple_expr %prec NEG - { - $$= negate_expression(thd, $2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -mysql_concatenation_expr: - simple_expr - | mysql_concatenation_expr MYSQL_CONCAT_SYM simple_expr - { - $$= new (thd->mem_root) Item_func_concat(thd, $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -function_call_keyword_timestamp: - TIMESTAMP '(' expr ')' - { - $$= new (thd->mem_root) Item_datetime_typecast(thd, $3, - AUTO_SEC_PART_DIGITS); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | TIMESTAMP '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_timestamp(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; -/* - Function call syntax using official SQL 2003 keywords. - Because the function name is an official token, - a dedicated grammar rule is needed in the parser. - There is no potential for conflicts -*/ -function_call_keyword: - CHAR_SYM '(' expr_list ')' - { - $$= new (thd->mem_root) Item_func_char(thd, *$3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | CHAR_SYM '(' expr_list USING charset_name ')' - { - $$= new (thd->mem_root) Item_func_char(thd, *$3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | CURRENT_USER optional_braces - { - $$= new (thd->mem_root) Item_func_current_user(thd, - Lex->current_context()); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - Lex->safe_to_cache_query= 0; - } - | CURRENT_ROLE optional_braces - { - $$= new (thd->mem_root) Item_func_current_role(thd, - Lex->current_context()); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - Lex->safe_to_cache_query= 0; - } - | DATE_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_date_typecast(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DAY_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_dayofmonth(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | HOUR_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_hour(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | INSERT '(' expr ',' expr ',' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_insert(thd, $3, $5, $7, $9); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | INTERVAL_SYM '(' expr ',' expr ')' - { - List<Item> *list= new (thd->mem_root) List<Item>; - if (unlikely(list == NULL)) - MYSQL_YYABORT; - if (unlikely(list->push_front($5, thd->mem_root)) || - unlikely(list->push_front($3, thd->mem_root))) - MYSQL_YYABORT; - Item_row *item= new (thd->mem_root) Item_row(thd, *list); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= new (thd->mem_root) Item_func_interval(thd, item); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | INTERVAL_SYM '(' expr ',' expr ',' expr_list ')' - { - $7->push_front($5, thd->mem_root); - $7->push_front($3, thd->mem_root); - Item_row *item= new (thd->mem_root) Item_row(thd, *$7); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= new (thd->mem_root) Item_func_interval(thd, item); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | LEFT '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_left(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | MINUTE_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_minute(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | MONTH_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_month(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | RIGHT '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_right(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SECOND_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_second(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SQL_SYM PERCENT_ORACLE_SYM ROWCOUNT_SYM - { - $$= new (thd->mem_root) Item_func_oracle_sql_rowcount(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - Lex->safe_to_cache_query= 0; - } - | TIME_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_time_typecast(thd, $3, - AUTO_SEC_PART_DIGITS); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | function_call_keyword_timestamp - { - $$= $1; - } - | TRIM '(' trim_operands ')' - { - if (unlikely(!($$= $3.make_item_func_trim(thd)))) - MYSQL_YYABORT; - } - | USER_SYM '(' ')' - { - $$= new (thd->mem_root) Item_func_user(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - Lex->safe_to_cache_query=0; - } - | YEAR_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_year(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -/* - Function calls using non reserved keywords, with special syntaxic forms. - Dedicated grammar rules are needed because of the syntax, - but also have the potential to cause incompatibilities with other - parts of the language. - MAINTAINER: - The only reasons a function should be added here are: - - for compatibility reasons with another SQL syntax (CURDATE), - - for typing reasons (GET_FORMAT) - Any other 'Syntaxic sugar' enhancements should be *STRONGLY* - discouraged. -*/ -function_call_nonkeyword: - ADDDATE_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $3, $5, - INTERVAL_DAY, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $3, $6, $7, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | CURDATE optional_braces - { - $$= new (thd->mem_root) Item_func_curdate_local(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } - | CURTIME opt_time_precision - { - $$= new (thd->mem_root) Item_func_curtime_local(thd, $2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } - | DATE_ADD_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $3, $6, $7, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DATE_SUB_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $3, $6, $7, 1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DATE_FORMAT_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_date_format(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DATE_FORMAT_SYM '(' expr ',' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_date_format(thd, $3, $5, $7); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DECODE_MARIADB_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_decode(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DECODE_ORACLE_SYM '(' expr ',' decode_when_list_oracle ')' - { - $5->push_front($3, thd->mem_root); - if (unlikely(!($$= new (thd->mem_root) Item_func_decode_oracle(thd, *$5)))) - MYSQL_YYABORT; - } - | EXTRACT_SYM '(' interval FROM expr ')' - { - $$=new (thd->mem_root) Item_extract(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | GET_FORMAT '(' date_time_type ',' expr ')' - { - $$= new (thd->mem_root) Item_func_get_format(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | NOW_SYM opt_time_precision - { - $$= new (thd->mem_root) Item_func_now_local(thd, $2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } - | POSITION_SYM '(' bit_expr IN_SYM expr ')' - { - $$= new (thd->mem_root) Item_func_locate(thd, $5, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SUBDATE_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $3, $5, - INTERVAL_DAY, 1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $3, $6, $7, 1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SUBSTRING '(' expr ',' expr ',' expr ')' - { - if (unlikely(!($$= Lex->make_item_func_substr(thd, $3, $5, $7)))) - MYSQL_YYABORT; - } - | SUBSTRING '(' expr ',' expr ')' - { - if (unlikely(!($$= Lex->make_item_func_substr(thd, $3, $5)))) - MYSQL_YYABORT; - } - | SUBSTRING '(' expr FROM expr FOR_SYM expr ')' - { - if (unlikely(!($$= Lex->make_item_func_substr(thd, $3, $5, $7)))) - MYSQL_YYABORT; - } - | SUBSTRING '(' expr FROM expr ')' - { - if (unlikely(!($$= Lex->make_item_func_substr(thd, $3, $5)))) - MYSQL_YYABORT; - } - | SYSDATE opt_time_precision - { - /* - Unlike other time-related functions, SYSDATE() is - replication-unsafe because it is not affected by the - TIMESTAMP variable. It is unsafe even if - sysdate_is_now=1, because the slave may have - sysdate_is_now=0. - */ - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - if (global_system_variables.sysdate_is_now == 0) - $$= new (thd->mem_root) Item_func_sysdate_local(thd, $2); - else - $$= new (thd->mem_root) Item_func_now_local(thd, $2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } - | TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $7, $5, $3, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | TIMESTAMP_DIFF '(' interval_time_stamp ',' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_timestamp_diff(thd, $5, $7, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | TRIM_ORACLE '(' trim_operands ')' - { - if (unlikely(!($$= $3.make_item_func_trim_oracle(thd)))) - MYSQL_YYABORT; - } - | UTC_DATE_SYM optional_braces - { - $$= new (thd->mem_root) Item_func_curdate_utc(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } - | UTC_TIME_SYM opt_time_precision - { - $$= new (thd->mem_root) Item_func_curtime_utc(thd, $2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } - | UTC_TIMESTAMP_SYM opt_time_precision - { - $$= new (thd->mem_root) Item_func_now_utc(thd, $2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } - | - COLUMN_ADD_SYM '(' expr ',' dyncall_create_list ')' - { - $$= create_func_dyncol_add(thd, $3, *$5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - COLUMN_DELETE_SYM '(' expr ',' expr_list ')' - { - $$= create_func_dyncol_delete(thd, $3, *$5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - COLUMN_CHECK_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_dyncol_check(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - COLUMN_CREATE_SYM '(' dyncall_create_list ')' - { - $$= create_func_dyncol_create(thd, *$3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - COLUMN_GET_SYM '(' expr ',' expr AS cast_type ')' - { - LEX *lex= Lex; - $$= create_func_dyncol_get(thd, $3, $5, $7.type_handler(), - $7.length(), $7.dec(), - lex->charset); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -/* - Functions calls using a non reserved keyword, and using a regular syntax. - Because the non reserved keyword is used in another part of the grammar, - a dedicated rule is needed here. -*/ -function_call_conflict: - ASCII_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_ascii(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | CHARSET '(' expr ')' - { - $$= new (thd->mem_root) Item_func_charset(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | COALESCE '(' expr_list ')' - { - $$= new (thd->mem_root) Item_func_coalesce(thd, *$3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | COLLATION_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_collation(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DATABASE '(' ')' - { - $$= new (thd->mem_root) Item_func_database(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } - | IF_SYM '(' expr ',' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_if(thd, $3, $5, $7); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | FORMAT_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_format(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | FORMAT_SYM '(' expr ',' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_format(thd, $3, $5, $7); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - /* LAST_VALUE here conflicts with the definition for window functions. - We have these 2 separate rules to remove the shift/reduce conflict. - */ - | LAST_VALUE '(' expr ')' - { - List<Item> *list= new (thd->mem_root) List<Item>; - if (unlikely(list == NULL)) - MYSQL_YYABORT; - list->push_back($3, thd->mem_root); - - $$= new (thd->mem_root) Item_func_last_value(thd, *list); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | LAST_VALUE '(' expr_list ',' expr ')' - { - $3->push_back($5, thd->mem_root); - $$= new (thd->mem_root) Item_func_last_value(thd, *$3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | MICROSECOND_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_microsecond(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | MOD_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_mod(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | OLD_PASSWORD_SYM '(' expr ')' - { - $$= new (thd->mem_root) - Item_func_password(thd, $3, Item_func_password::OLD); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | PASSWORD_SYM '(' expr ')' - { - Item* i1; - i1= new (thd->mem_root) Item_func_password(thd, $3); - if (unlikely(i1 == NULL)) - MYSQL_YYABORT; - $$= i1; - } - | QUARTER_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_quarter(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | REPEAT_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_repeat(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | REPLACE '(' expr ',' expr ',' expr ')' - { - if (unlikely(!($$= Lex->make_item_func_replace(thd, $3, $5, $7)))) - MYSQL_YYABORT; - } - | REVERSE_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_reverse(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ROW_COUNT_SYM '(' ')' - { - $$= new (thd->mem_root) Item_func_row_count(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - Lex->safe_to_cache_query= 0; - } - | TRUNCATE_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_round(thd, $3, $5, 1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | WEEK_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_week(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | WEEK_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_week(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | WEIGHT_STRING_SYM '(' expr opt_ws_levels ')' - { - $$= new (thd->mem_root) Item_func_weight_string(thd, $3, 0, 0, $4); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | WEIGHT_STRING_SYM '(' expr AS CHAR_SYM ws_nweights opt_ws_levels ')' - { - $$= new (thd->mem_root) - Item_func_weight_string(thd, $3, 0, $6, - $7 | MY_STRXFRM_PAD_WITH_SPACE); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | WEIGHT_STRING_SYM '(' expr AS BINARY ws_nweights ')' - { - Item *item= new (thd->mem_root) Item_char_typecast(thd, $3, $6, - &my_charset_bin); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= new (thd->mem_root) - Item_func_weight_string(thd, item, 0, $6, - MY_STRXFRM_PAD_WITH_SPACE); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | WEIGHT_STRING_SYM '(' expr ',' ulong_num ',' ulong_num ',' ulong_num ')' - { - $$= new (thd->mem_root) Item_func_weight_string(thd, $3, $5, $7, - $9); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -/* - Regular function calls. - The function name is *not* a token, and therefore is guaranteed to not - introduce side effects to the language in general. - MAINTAINER: - All the new functions implemented for new features should fit into - this category. The place to implement the function itself is - in sql/item_create.cc -*/ -function_call_generic: - IDENT_sys '(' - { -#ifdef HAVE_DLOPEN - udf_func *udf= 0; - LEX *lex= Lex; - if (using_udf_functions && - (udf= find_udf($1.str, $1.length)) && - udf->type == UDFTYPE_AGGREGATE) - { - if (unlikely(lex->current_select->inc_in_sum_expr())) - { - thd->parse_error(); - MYSQL_YYABORT; - } - } - /* Temporary placing the result of find_udf in $3 */ - $<udf>$= udf; -#endif - } - opt_udf_expr_list ')' - { - const Type_handler *h; - Create_func *builder; - Item *item= NULL; - - if (unlikely(check_routine_name(&$1))) - MYSQL_YYABORT; - - /* - Implementation note: - names are resolved with the following order: - - MySQL native functions, - - User Defined Functions, - - Stored Functions (assuming the current <use> database) - - This will be revised with WL#2128 (SQL PATH) - */ - if ((h= Type_handler::handler_by_name(thd, $1)) && - (item= h->make_constructor_item(thd, $4))) - { - // Found a constructor with a proper argument count - } - else if ((builder= find_native_function_builder(thd, &$1))) - { - item= builder->create_func(thd, &$1, $4); - } - else - { -#ifdef HAVE_DLOPEN - /* Retrieving the result of find_udf */ - udf_func *udf= $<udf>3; - - if (udf) - { - if (udf->type == UDFTYPE_AGGREGATE) - { - Select->in_sum_expr--; - } - - item= Create_udf_func::s_singleton.create(thd, udf, $4); - } - else -#endif - { - builder= find_qualified_function_builder(thd); - DBUG_ASSERT(builder); - item= builder->create_func(thd, &$1, $4); - } - } - - if (unlikely(! ($$= item))) - MYSQL_YYABORT; - } - | CONTAINS_SYM '(' opt_expr_list ')' - { - if (!($$= Lex->make_item_func_call_native_or_parse_error(thd, - $1, $3))) - MYSQL_YYABORT; - } - | WITHIN '(' opt_expr_list ')' - { - if (!($$= Lex->make_item_func_call_native_or_parse_error(thd, - $1, $3))) - MYSQL_YYABORT; - } - | ident_cli '.' ident_cli '(' opt_expr_list ')' - { - if (unlikely(!($$= Lex->make_item_func_call_generic(thd, &$1, &$3, $5)))) - MYSQL_YYABORT; - } - ; - -fulltext_options: - opt_natural_language_mode opt_query_expansion - { $$= $1 | $2; } - | IN_SYM BOOLEAN_SYM MODE_SYM - { $$= FT_BOOL; } - ; - -opt_natural_language_mode: - /* nothing */ { $$= FT_NL; } - | IN_SYM NATURAL LANGUAGE_SYM MODE_SYM { $$= FT_NL; } - ; - -opt_query_expansion: - /* nothing */ { $$= 0; } - | WITH QUERY_SYM EXPANSION_SYM { $$= FT_EXPAND; } - ; - -opt_udf_expr_list: - /* empty */ { $$= NULL; } - | udf_expr_list { $$= $1; } - ; - -udf_expr_list: - udf_expr - { - $$= new (thd->mem_root) List<Item>; - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - $$->push_back($1, thd->mem_root); - } - | udf_expr_list ',' udf_expr - { - $1->push_back($3, thd->mem_root); - $$= $1; - } - ; - -udf_expr: - remember_name expr remember_end select_alias - { - /* - Use Item::name as a storage for the attribute value of user - defined function argument. It is safe to use Item::name - because the syntax will not allow having an explicit name here. - See WL#1017 re. udf attributes. - */ - if ($4.str) - { - $2->is_autogenerated_name= FALSE; - $2->set_name(thd, $4); - } - /* - A field has to have its proper name in order for name - resolution to work, something we are only guaranteed if we - parse it out. If we hijack the input stream with - remember_name we may get quoted or escaped names. - */ - else if ($2->type() != Item::FIELD_ITEM && - $2->type() != Item::REF_ITEM /* For HAVING */ ) - $2->set_name(thd, $1, (uint) ($3 - $1), thd->charset()); - $$= $2; - } - ; - -sum_expr: - AVG_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_avg(thd, $3, FALSE); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | AVG_SYM '(' DISTINCT in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_avg(thd, $4, TRUE); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | BIT_AND '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_and(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | BIT_OR '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_or(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | BIT_XOR '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_xor(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | COUNT_SYM '(' opt_all '*' ')' - { - Item *item= new (thd->mem_root) Item_int(thd, (int32) 0L, 1); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - $$= new (thd->mem_root) Item_sum_count(thd, item); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | COUNT_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_count(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | COUNT_SYM '(' DISTINCT - { Select->in_sum_expr++; } - expr_list - { Select->in_sum_expr--; } - ')' - { - $$= new (thd->mem_root) Item_sum_count(thd, *$5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | MIN_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_min(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - /* - According to ANSI SQL, DISTINCT is allowed and has - no sense inside MIN and MAX grouping functions; so MIN|MAX(DISTINCT ...) - is processed like an ordinary MIN | MAX() - */ - | MIN_SYM '(' DISTINCT in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_min(thd, $4); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | MAX_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_max(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | MAX_SYM '(' DISTINCT in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_max(thd, $4); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | STD_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_std(thd, $3, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | VARIANCE_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_variance(thd, $3, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | STDDEV_SAMP_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_std(thd, $3, 1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | VAR_SAMP_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_variance(thd, $3, 1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SUM_SYM '(' in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_sum(thd, $3, FALSE); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SUM_SYM '(' DISTINCT in_sum_expr ')' - { - $$= new (thd->mem_root) Item_sum_sum(thd, $4, TRUE); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | GROUP_CONCAT_SYM '(' opt_distinct - { Select->in_sum_expr++; } - expr_list opt_gorder_clause - opt_gconcat_separator opt_glimit_clause - ')' - { - SELECT_LEX *sel= Select; - sel->in_sum_expr--; - $$= new (thd->mem_root) - Item_func_group_concat(thd, Lex->current_context(), - $3, $5, - sel->gorder_list, $7, $8, - sel->select_limit, - sel->offset_limit); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - sel->select_limit= NULL; - sel->offset_limit= NULL; - sel->explicit_limit= 0; - $5->empty(); - sel->gorder_list.empty(); - } - | JSON_ARRAYAGG_SYM '(' opt_distinct - { Select->in_sum_expr++; } - expr_list opt_gorder_clause opt_glimit_clause - ')' - { - SELECT_LEX *sel= Select; - List<Item> *args= $5; - sel->in_sum_expr--; - if (args && args->elements > 1) - { - /* JSON_ARRAYAGG supports only one parameter */ - my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), "JSON_ARRAYAGG"); - MYSQL_YYABORT; - } - String* s= new (thd->mem_root) String(",", 1, &my_charset_latin1); - if (unlikely(s == NULL)) - MYSQL_YYABORT; - - $$= new (thd->mem_root) - Item_func_json_arrayagg(thd, Lex->current_context(), - $3, args, - sel->gorder_list, s, $7, - sel->select_limit, - sel->offset_limit); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - sel->select_limit= NULL; - sel->offset_limit= NULL; - sel->explicit_limit= 0; - $5->empty(); - sel->gorder_list.empty(); - } - | JSON_OBJECTAGG_SYM '(' - { Select->in_sum_expr++; } - expr ',' expr ')' - { - SELECT_LEX *sel= Select; - sel->in_sum_expr--; - - $$= new (thd->mem_root) Item_func_json_objectagg(thd, $4, $6); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -window_func_expr: - window_func OVER_SYM window_name - { - $$= new (thd->mem_root) Item_window_func(thd, (Item_sum *) $1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - if (unlikely(Select->add_window_func((Item_window_func *) $$))) - MYSQL_YYABORT; - } - | - window_func OVER_SYM window_spec - { - LEX *lex= Lex; - if (unlikely(Select->add_window_spec(thd, lex->win_ref, - Select->group_list, - Select->order_list, - lex->win_frame))) - MYSQL_YYABORT; - $$= new (thd->mem_root) Item_window_func(thd, (Item_sum *) $1, - thd->lex->win_spec); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - if (unlikely(Select->add_window_func((Item_window_func *) $$))) - MYSQL_YYABORT; - } - ; - -window_func: - simple_window_func - | - sum_expr - { - ((Item_sum *) $1)->mark_as_window_func_sum_expr(); - } - | - function_call_generic - { - Item* item = (Item*)$1; - /* Only UDF aggregate here possible */ - if ((item == NULL) || - (item->type() != Item::SUM_FUNC_ITEM) - || (((Item_sum *)item)->sum_func() != Item_sum::UDF_SUM_FUNC)) - { - thd->parse_error(); - MYSQL_YYABORT; - } - - ((Item_sum *) $1)->mark_as_window_func_sum_expr(); - } - ; - -simple_window_func: - ROW_NUMBER_SYM '(' ')' - { - $$= new (thd->mem_root) Item_sum_row_number(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - RANK_SYM '(' ')' - { - $$= new (thd->mem_root) Item_sum_rank(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - DENSE_RANK_SYM '(' ')' - { - $$= new (thd->mem_root) Item_sum_dense_rank(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - PERCENT_RANK_SYM '(' ')' - { - $$= new (thd->mem_root) Item_sum_percent_rank(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - CUME_DIST_SYM '(' ')' - { - $$= new (thd->mem_root) Item_sum_cume_dist(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - NTILE_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_sum_ntile(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - FIRST_VALUE_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_sum_first_value(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - LAST_VALUE '(' expr ')' - { - $$= new (thd->mem_root) Item_sum_last_value(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - NTH_VALUE_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_sum_nth_value(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - LEAD_SYM '(' expr ')' - { - /* No second argument defaults to 1. */ - Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); - if (unlikely(item_offset == NULL)) - MYSQL_YYABORT; - $$= new (thd->mem_root) Item_sum_lead(thd, $3, item_offset); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - LEAD_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_sum_lead(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - LAG_SYM '(' expr ')' - { - /* No second argument defaults to 1. */ - Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); - if (unlikely(item_offset == NULL)) - MYSQL_YYABORT; - $$= new (thd->mem_root) Item_sum_lag(thd, $3, item_offset); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | - LAG_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_sum_lag(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - - - -inverse_distribution_function: - percentile_function OVER_SYM - '(' opt_window_partition_clause ')' - { - LEX *lex= Lex; - if (unlikely(Select->add_window_spec(thd, lex->win_ref, - Select->group_list, - Select->order_list, - NULL))) - MYSQL_YYABORT; - $$= new (thd->mem_root) Item_window_func(thd, (Item_sum *) $1, - thd->lex->win_spec); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - if (unlikely(Select->add_window_func((Item_window_func *) $$))) - MYSQL_YYABORT; - } - ; - -percentile_function: - inverse_distribution_function_def WITHIN GROUP_SYM '(' - { Select->prepare_add_window_spec(thd); } - order_by_single_element_list ')' - { - $$= $1; - } - | MEDIAN_SYM '(' expr ')' - { - Item *args= new (thd->mem_root) Item_decimal(thd, "0.5", 3, - thd->charset()); - if (unlikely(args == NULL) || unlikely(thd->is_error())) - MYSQL_YYABORT; - Select->prepare_add_window_spec(thd); - if (unlikely(add_order_to_list(thd, $3,FALSE))) - MYSQL_YYABORT; - - $$= new (thd->mem_root) Item_sum_percentile_cont(thd, args); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -inverse_distribution_function_def: - PERCENTILE_CONT_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_sum_percentile_cont(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | PERCENTILE_DISC_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_sum_percentile_disc(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -order_by_single_element_list: - ORDER_SYM BY order_ident order_dir - { - if (unlikely(add_order_to_list(thd, $3,(bool) $4))) - MYSQL_YYABORT; - } - ; - - -window_name: - ident - { - $$= (LEX_CSTRING *) thd->memdup(&$1, sizeof(LEX_CSTRING)); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -variable: - '@' - { - if (unlikely(! Lex->parsing_options.allows_variable)) - my_yyabort_error((ER_VIEW_SELECT_VARIABLE, MYF(0))); - } - variable_aux - { - $$= $3; - } - ; - -variable_aux: - ident_or_text SET_VAR expr - { - Item_func_set_user_var *item; - $$= item= new (thd->mem_root) Item_func_set_user_var(thd, &$1, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - LEX *lex= Lex; - lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - lex->set_var_list.push_back(item, thd->mem_root); - } - | ident_or_text - { - $$= new (thd->mem_root) Item_func_get_user_var(thd, &$1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - LEX *lex= Lex; - lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - } - | '@' opt_var_ident_type ident_sysvar_name - { - if (unlikely(!($$= Lex->make_item_sysvar(thd, $2, &$3)))) - MYSQL_YYABORT; - } - | '@' opt_var_ident_type ident_sysvar_name '.' ident - { - if (unlikely(!($$= Lex->make_item_sysvar(thd, $2, &$3, &$5)))) - MYSQL_YYABORT; - } - ; - -opt_distinct: - /* empty */ { $$ = 0; } - | DISTINCT { $$ = 1; } - ; - -opt_gconcat_separator: - /* empty */ - { - $$= new (thd->mem_root) String(",", 1, &my_charset_latin1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | SEPARATOR_SYM text_string { $$ = $2; } - ; - -opt_gorder_clause: - /* empty */ - | ORDER_SYM BY gorder_list - ; - -gorder_list: - gorder_list ',' order_ident order_dir - { - if (unlikely(add_gorder_to_list(thd, $3,(bool) $4))) - MYSQL_YYABORT; - } - | order_ident order_dir - { - if (unlikely(add_gorder_to_list(thd, $1,(bool) $2))) - MYSQL_YYABORT; - } - ; - -opt_glimit_clause: - /* empty */ { $$ = 0; } - | glimit_clause { $$ = 1; } - ; - -glimit_clause_init: - LIMIT{} - ; - -glimit_clause: - glimit_clause_init glimit_options - { - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); - } - ; - -glimit_options: - limit_option - { - SELECT_LEX *sel= Select; - sel->select_limit= $1; - sel->offset_limit= 0; - sel->explicit_limit= 1; - } - | limit_option ',' limit_option - { - SELECT_LEX *sel= Select; - sel->select_limit= $3; - sel->offset_limit= $1; - sel->explicit_limit= 1; - } - | limit_option OFFSET_SYM limit_option - { - SELECT_LEX *sel= Select; - sel->select_limit= $1; - sel->offset_limit= $3; - sel->explicit_limit= 1; - } - ; - - - -in_sum_expr: - opt_all - { - LEX *lex= Lex; - if (unlikely(lex->current_select->inc_in_sum_expr())) - { - thd->parse_error(); - MYSQL_YYABORT; - } - } - expr - { - Select->in_sum_expr--; - $$= $3; - } - ; - -cast_type: - BINARY opt_field_length - { $$.set(&type_handler_long_blob, $2); Lex->charset= &my_charset_bin; } - | CHAR_SYM opt_field_length - { Lex->charset= thd->variables.collation_connection; } - opt_binary - { $$.set(&type_handler_long_blob, $2); } - | VARCHAR field_length - { Lex->charset= thd->variables.collation_connection; } - opt_binary - { $$.set(&type_handler_long_blob, $2); } - | VARCHAR2_ORACLE_SYM field_length - { Lex->charset= thd->variables.collation_connection; } - opt_binary - { $$.set(&type_handler_long_blob, $2); } - | NCHAR_SYM opt_field_length - { - Lex->charset= national_charset_info; - $$.set(&type_handler_long_blob, $2, 0); - } - | cast_type_numeric { $$= $1; Lex->charset= NULL; } - | cast_type_temporal { $$= $1; Lex->charset= NULL; } - | IDENT_sys - { - if (Lex->set_cast_type_udt(&$$, $1)) - MYSQL_YYABORT; - } - | reserved_keyword_udt - { - if (Lex->set_cast_type_udt(&$$, $1)) - MYSQL_YYABORT; - } - | non_reserved_keyword_udt - { - if (Lex->set_cast_type_udt(&$$, $1)) - MYSQL_YYABORT; - } - ; - -cast_type_numeric: - INT_SYM { $$.set(&type_handler_slonglong); } - | SIGNED_SYM { $$.set(&type_handler_slonglong); } - | SIGNED_SYM INT_SYM { $$.set(&type_handler_slonglong); } - | UNSIGNED { $$.set(&type_handler_ulonglong); } - | UNSIGNED INT_SYM { $$.set(&type_handler_ulonglong); } - | DECIMAL_SYM float_options { $$.set(&type_handler_newdecimal, $2); } - | FLOAT_SYM { $$.set(&type_handler_float); } - | DOUBLE_SYM opt_precision { $$.set(&type_handler_double, $2); } - ; - -cast_type_temporal: - DATE_SYM { $$.set(&type_handler_newdate); } - | TIME_SYM opt_field_length { $$.set(&type_handler_time2, 0, $2); } - | DATETIME opt_field_length { $$.set(&type_handler_datetime2, 0, $2); } - | INTERVAL_SYM DAY_SECOND_SYM field_length - { - $$.set(&type_handler_interval_DDhhmmssff, 0, $3); - } - ; - -opt_expr_list: - /* empty */ { $$= NULL; } - | expr_list { $$= $1;} - ; - -expr_list: - expr - { - if (unlikely(!($$= List<Item>::make(thd->mem_root, $1)))) - MYSQL_YYABORT; - } - | expr_list ',' expr - { - $1->push_back($3, thd->mem_root); - $$= $1; - } - ; - -ident_list_arg: - ident_list { $$= $1; } - | '(' ident_list ')' { $$= $2; } - ; - -ident_list: - simple_ident - { - $$= new (thd->mem_root) List<Item>; - if (unlikely($$ == NULL) || - unlikely($$->push_back($1, thd->mem_root))) - MYSQL_YYABORT; - } - | ident_list ',' simple_ident - { - $1->push_back($3, thd->mem_root); - $$= $1; - } - ; - -when_list: - WHEN_SYM expr THEN_SYM expr - { - $$= new (thd->mem_root) List<Item>; - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - if (unlikely($$->push_back($2, thd->mem_root) || - $$->push_back($4, thd->mem_root))) - MYSQL_YYABORT; - } - | when_list WHEN_SYM expr THEN_SYM expr - { - if (unlikely($1->push_back($3, thd->mem_root) || - $1->push_back($5, thd->mem_root))) - MYSQL_YYABORT; - $$= $1; - } - ; - -when_list_opt_else: - when_list - | when_list ELSE expr - { - if (unlikely($1->push_back($3, thd->mem_root))) - MYSQL_YYABORT; - $$= $1; - } - ; - -decode_when_list_oracle: - expr ',' expr - { - $$= new (thd->mem_root) List<Item>; - if (unlikely($$ == NULL) || - unlikely($$->push_back($1, thd->mem_root)) || - unlikely($$->push_back($3, thd->mem_root))) - MYSQL_YYABORT; - - } - | decode_when_list_oracle ',' expr - { - $$= $1; - if (unlikely($$->push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - ; - - -/* Equivalent to <table reference> in the SQL:2003 standard. */ -/* Warning - may return NULL in case of incomplete SELECT */ -table_ref: - table_factor { $$= $1; } - | join_table - { - LEX *lex= Lex; - if (unlikely(!($$= lex->current_select->nest_last_join(thd)))) - { - thd->parse_error(); - MYSQL_YYABORT; - } - } - ; - -join_table_list: - derived_table_list { MYSQL_YYABORT_UNLESS($$=$1); } - ; - -/* - The ODBC escape syntax for Outer Join is: '{' OJ join_table '}' - The parser does not define OJ as a token, any ident is accepted - instead in $2 (ident). Also, all productions from table_ref can - be escaped, not only join_table. Both syntax extensions are safe - and are ignored. -*/ -esc_table_ref: - table_ref { $$=$1; } - | '{' ident table_ref '}' { $$=$3; } - ; - -/* Equivalent to <table reference list> in the SQL:2003 standard. */ -/* Warning - may return NULL in case of incomplete SELECT */ -derived_table_list: - esc_table_ref - { - $$=$1; - Select->add_joined_table($1); - } - | derived_table_list ',' esc_table_ref - { - MYSQL_YYABORT_UNLESS($1 && ($$=$3)); - Select->add_joined_table($3); - } - ; - -/* - Notice that JOIN can be a left-associative operator in one context and - a right-associative operator in another context (see the comment for - st_select_lex::add_cross_joined_table). -*/ -join_table: - /* INNER JOIN variants */ - table_ref normal_join table_ref %prec CONDITIONLESS_JOIN - { - MYSQL_YYABORT_UNLESS($1 && ($$=$3)); - if (unlikely(Select->add_cross_joined_table($1, $3, $2))) - MYSQL_YYABORT; - } - | table_ref normal_join table_ref - ON - { - MYSQL_YYABORT_UNLESS($1 && $3); - Select->add_joined_table($1); - Select->add_joined_table($3); - /* Change the current name resolution context to a local context. */ - if (unlikely(push_new_name_resolution_context(thd, $1, $3))) - MYSQL_YYABORT; - Select->parsing_place= IN_ON; - } - expr - { - $3->straight=$2; - add_join_on(thd, $3, $6); - $3->on_context= Lex->pop_context(); - Select->parsing_place= NO_MATTER; - } - | table_ref normal_join table_ref - USING - { - MYSQL_YYABORT_UNLESS($1 && $3); - Select->add_joined_table($1); - Select->add_joined_table($3); - } - '(' using_list ')' - { - $3->straight=$2; - add_join_natural($1,$3,$7,Select); - $$=$3; - } - | table_ref NATURAL inner_join table_factor - { - MYSQL_YYABORT_UNLESS($1 && ($$=$4)); - Select->add_joined_table($1); - Select->add_joined_table($4); - $4->straight=$3; - add_join_natural($1,$4,NULL,Select); - } - - /* LEFT JOIN variants */ - | table_ref LEFT opt_outer JOIN_SYM table_ref - ON - { - MYSQL_YYABORT_UNLESS($1 && $5); - Select->add_joined_table($1); - Select->add_joined_table($5); - /* Change the current name resolution context to a local context. */ - if (unlikely(push_new_name_resolution_context(thd, $1, $5))) - MYSQL_YYABORT; - Select->parsing_place= IN_ON; - } - expr - { - add_join_on(thd, $5, $8); - $5->on_context= Lex->pop_context(); - $5->outer_join|=JOIN_TYPE_LEFT; - $$=$5; - Select->parsing_place= NO_MATTER; - } - | table_ref LEFT opt_outer JOIN_SYM table_factor - { - MYSQL_YYABORT_UNLESS($1 && $5); - Select->add_joined_table($1); - Select->add_joined_table($5); - } - USING '(' using_list ')' - { - add_join_natural($1,$5,$9,Select); - $5->outer_join|=JOIN_TYPE_LEFT; - $$=$5; - } - | table_ref NATURAL LEFT opt_outer JOIN_SYM table_factor - { - MYSQL_YYABORT_UNLESS($1 && $6); - Select->add_joined_table($1); - Select->add_joined_table($6); - add_join_natural($1,$6,NULL,Select); - $6->outer_join|=JOIN_TYPE_LEFT; - $$=$6; - } - - /* RIGHT JOIN variants */ - | table_ref RIGHT opt_outer JOIN_SYM table_ref - ON - { - MYSQL_YYABORT_UNLESS($1 && $5); - Select->add_joined_table($1); - Select->add_joined_table($5); - /* Change the current name resolution context to a local context. */ - if (unlikely(push_new_name_resolution_context(thd, $1, $5))) - MYSQL_YYABORT; - Select->parsing_place= IN_ON; - } - expr - { - LEX *lex= Lex; - if (unlikely(!($$= lex->current_select->convert_right_join()))) - MYSQL_YYABORT; - add_join_on(thd, $$, $8); - $1->on_context= Lex->pop_context(); - Select->parsing_place= NO_MATTER; - } - | table_ref RIGHT opt_outer JOIN_SYM table_factor - { - MYSQL_YYABORT_UNLESS($1 && $5); - Select->add_joined_table($1); - Select->add_joined_table($5); - } - USING '(' using_list ')' - { - LEX *lex= Lex; - if (unlikely(!($$= lex->current_select->convert_right_join()))) - MYSQL_YYABORT; - add_join_natural($$,$5,$9,Select); - } - | table_ref NATURAL RIGHT opt_outer JOIN_SYM table_factor - { - MYSQL_YYABORT_UNLESS($1 && $6); - Select->add_joined_table($1); - Select->add_joined_table($6); - add_join_natural($6,$1,NULL,Select); - LEX *lex= Lex; - if (unlikely(!($$= lex->current_select->convert_right_join()))) - MYSQL_YYABORT; - } - ; - - -inner_join: /* $$ set if using STRAIGHT_JOIN, false otherwise */ - JOIN_SYM { $$ = 0; } - | INNER_SYM JOIN_SYM { $$ = 0; } - | STRAIGHT_JOIN { $$ = 1; } - ; - -normal_join: - inner_join { $$ = $1; } - | CROSS JOIN_SYM { $$ = 0; } - ; - -/* - table PARTITION (list of partitions), reusing using_list instead of creating - a new rule for partition_list. -*/ -opt_use_partition: - /* empty */ { $$= 0;} - | use_partition - ; - -use_partition: - PARTITION_SYM '(' using_list ')' have_partitioning - { - $$= $3; - Select->parsing_place= Select->save_parsing_place; - Select->save_parsing_place= NO_MATTER; - } - ; - -table_factor: - table_primary_ident_opt_parens { $$= $1; } - | table_primary_derived_opt_parens { $$= $1; } - | join_table_parens - { - $1->nested_join->nest_type= 0; - $$= $1; - } - | table_reference_list_parens { $$= $1; } - ; - -table_primary_ident_opt_parens: - table_primary_ident { $$= $1; } - | '(' table_primary_ident_opt_parens ')' { $$= $2; } - ; - -table_primary_derived_opt_parens: - table_primary_derived { $$= $1; } - | '(' table_primary_derived_opt_parens ')' { $$= $2; } - ; - -table_reference_list_parens: - '(' table_reference_list_parens ')' { $$= $2; } - | '(' nested_table_reference_list ')' - { - if (!($$= Select->end_nested_join(thd))) - MYSQL_YYABORT; - } - ; - -nested_table_reference_list: - table_ref ',' table_ref - { - if (Select->init_nested_join(thd)) - MYSQL_YYABORT; - Select->add_joined_table($1); - Select->add_joined_table($3); - $$= $1->embedding; - } - | nested_table_reference_list ',' table_ref - { - Select->add_joined_table($3); - $$= $1; - } - ; - -join_table_parens: - '(' join_table_parens ')' { $$= $2; } - | '(' join_table ')' - { - LEX *lex= Lex; - if (!($$= lex->current_select->nest_last_join(thd))) - { - thd->parse_error(); - MYSQL_YYABORT; - } - } - ; - - -table_primary_ident: - table_ident opt_use_partition opt_for_system_time_clause - opt_table_alias_clause opt_key_definition - { - SELECT_LEX *sel= Select; - sel->table_join_options= 0; - if (!($$= Select->add_table_to_list(thd, $1, $4, - Select->get_table_join_options(), - YYPS->m_lock_type, - YYPS->m_mdl_type, - Select->pop_index_hints(), - $2))) - MYSQL_YYABORT; - if ($3) - $$->vers_conditions= Lex->vers_conditions; - } - ; - -table_primary_derived: - subquery - opt_for_system_time_clause table_alias_clause - { - if (!($$= Lex->parsed_derived_table($1->master_unit(), $2, $3))) - MYSQL_YYABORT; - } - ; - -opt_outer: - /* empty */ {} - | OUTER {} - ; - -index_hint_clause: - /* empty */ - { - $$= thd->variables.old_mode ? INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; - } - | FOR_SYM JOIN_SYM { $$= INDEX_HINT_MASK_JOIN; } - | FOR_SYM ORDER_SYM BY { $$= INDEX_HINT_MASK_ORDER; } - | FOR_SYM GROUP_SYM BY { $$= INDEX_HINT_MASK_GROUP; } - ; - -index_hint_type: - FORCE_SYM { $$= INDEX_HINT_FORCE; } - | IGNORE_SYM { $$= INDEX_HINT_IGNORE; } - ; - -index_hint_definition: - index_hint_type key_or_index index_hint_clause - { - Select->set_index_hint_type($1, $3); - } - '(' key_usage_list ')' - | USE_SYM key_or_index index_hint_clause - { - Select->set_index_hint_type(INDEX_HINT_USE, $3); - } - '(' opt_key_usage_list ')' - ; - -index_hints_list: - index_hint_definition - | index_hints_list index_hint_definition - ; - -opt_index_hints_list: - /* empty */ - | { Select->alloc_index_hints(thd); } index_hints_list - ; - -opt_key_definition: - { Select->clear_index_hints(); } - opt_index_hints_list - ; - -opt_key_usage_list: - /* empty */ { Select->add_index_hint(thd, NULL, 0); } - | key_usage_list {} - ; - -key_usage_element: - ident - { Select->add_index_hint(thd, $1.str, $1.length); } - | PRIMARY_SYM - { Select->add_index_hint(thd, "PRIMARY", 7); } - ; - -key_usage_list: - key_usage_element - | key_usage_list ',' key_usage_element - ; - -using_list: - ident - { - if (unlikely(!($$= new (thd->mem_root) List<String>))) - MYSQL_YYABORT; - String *s= new (thd->mem_root) String((const char *) $1.str, - $1.length, - system_charset_info); - if (unlikely(unlikely(s == NULL))) - MYSQL_YYABORT; - $$->push_back(s, thd->mem_root); - } - | using_list ',' ident - { - String *s= new (thd->mem_root) String((const char *) $3.str, - $3.length, - system_charset_info); - if (unlikely(unlikely(s == NULL))) - MYSQL_YYABORT; - if (unlikely($1->push_back(s, thd->mem_root))) - MYSQL_YYABORT; - $$= $1; - } - ; - -interval: - interval_time_stamp {} - | DAY_HOUR_SYM { $$=INTERVAL_DAY_HOUR; } - | DAY_MICROSECOND_SYM { $$=INTERVAL_DAY_MICROSECOND; } - | DAY_MINUTE_SYM { $$=INTERVAL_DAY_MINUTE; } - | DAY_SECOND_SYM { $$=INTERVAL_DAY_SECOND; } - | HOUR_MICROSECOND_SYM { $$=INTERVAL_HOUR_MICROSECOND; } - | HOUR_MINUTE_SYM { $$=INTERVAL_HOUR_MINUTE; } - | HOUR_SECOND_SYM { $$=INTERVAL_HOUR_SECOND; } - | MINUTE_MICROSECOND_SYM { $$=INTERVAL_MINUTE_MICROSECOND; } - | MINUTE_SECOND_SYM { $$=INTERVAL_MINUTE_SECOND; } - | SECOND_MICROSECOND_SYM { $$=INTERVAL_SECOND_MICROSECOND; } - | YEAR_MONTH_SYM { $$=INTERVAL_YEAR_MONTH; } - ; - -interval_time_stamp: - DAY_SYM { $$=INTERVAL_DAY; } - | WEEK_SYM { $$=INTERVAL_WEEK; } - | HOUR_SYM { $$=INTERVAL_HOUR; } - | MINUTE_SYM { $$=INTERVAL_MINUTE; } - | MONTH_SYM { $$=INTERVAL_MONTH; } - | QUARTER_SYM { $$=INTERVAL_QUARTER; } - | SECOND_SYM { $$=INTERVAL_SECOND; } - | MICROSECOND_SYM { $$=INTERVAL_MICROSECOND; } - | YEAR_SYM { $$=INTERVAL_YEAR; } - ; - -date_time_type: - DATE_SYM {$$=MYSQL_TIMESTAMP_DATE;} - | TIME_SYM {$$=MYSQL_TIMESTAMP_TIME;} - | DATETIME {$$=MYSQL_TIMESTAMP_DATETIME;} - | TIMESTAMP {$$=MYSQL_TIMESTAMP_DATETIME;} - ; - -table_alias: - /* empty */ - | AS - | '=' - ; - -opt_table_alias_clause: - /* empty */ { $$=0; } - | table_alias_clause { $$= $1; } - ; - -table_alias_clause: - table_alias ident_table_alias - { - $$= (LEX_CSTRING*) thd->memdup(&$2,sizeof(LEX_STRING)); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -opt_all: - /* empty */ - | ALL - ; - -opt_where_clause: - /* empty */ { Select->where= 0; } - | WHERE - { - Select->parsing_place= IN_WHERE; - } - expr - { - SELECT_LEX *select= Select; - select->where= normalize_cond(thd, $3); - select->parsing_place= NO_MATTER; - if ($3) - $3->top_level_item(); - } - ; - -opt_having_clause: - /* empty */ - | HAVING - { - Select->parsing_place= IN_HAVING; - } - expr - { - SELECT_LEX *sel= Select; - sel->having= normalize_cond(thd, $3); - sel->parsing_place= NO_MATTER; - if ($3) - $3->top_level_item(); - } - ; - -opt_escape: - ESCAPE_SYM simple_expr - { - Lex->escape_used= TRUE; - $$= $2; - } - | /* empty */ %prec PREC_BELOW_ESCAPE - { - Lex->escape_used= FALSE; - $$= ((thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) ? - new (thd->mem_root) Item_string_ascii(thd, "", 0) : - new (thd->mem_root) Item_string_ascii(thd, "\\", 1)); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -/* - group by statement in select -*/ - -opt_group_clause: - /* empty */ - | GROUP_SYM BY group_list olap_opt - ; - -group_list: - group_list ',' order_ident order_dir - { - if (unlikely(add_group_to_list(thd, $3,(bool) $4))) - MYSQL_YYABORT; - } - | order_ident order_dir - { - if (unlikely(add_group_to_list(thd, $1,(bool) $2))) - MYSQL_YYABORT; - } - ; - -olap_opt: - /* empty */ {} - | WITH_CUBE_SYM - { - /* - 'WITH CUBE' is reserved in the MySQL syntax, but not implemented, - and cause LALR(2) conflicts. - This syntax is not standard. - MySQL syntax: GROUP BY col1, col2, col3 WITH CUBE - SQL-2003: GROUP BY ... CUBE(col1, col2, col3) - */ - LEX *lex=Lex; - if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) - my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH CUBE", - "global union parameters")); - lex->current_select->olap= CUBE_TYPE; - - my_yyabort_error((ER_NOT_SUPPORTED_YET, MYF(0), "CUBE")); - } - | WITH_ROLLUP_SYM - { - /* - 'WITH ROLLUP' is needed for backward compatibility, - and cause LALR(2) conflicts. - This syntax is not standard. - MySQL syntax: GROUP BY col1, col2, col3 WITH ROLLUP - SQL-2003: GROUP BY ... ROLLUP(col1, col2, col3) - */ - LEX *lex= Lex; - if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) - my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH ROLLUP", - "global union parameters")); - lex->current_select->olap= ROLLUP_TYPE; - } - ; - -/* - optional window clause in select -*/ - -opt_window_clause: - /* empty */ - {} - | WINDOW_SYM - window_def_list - {} - ; - -window_def_list: - window_def_list ',' window_def - | window_def - ; - -window_def: - window_name AS window_spec - { - LEX *lex= Lex; - if (unlikely(Select->add_window_def(thd, $1, lex->win_ref, - Select->group_list, - Select->order_list, - lex->win_frame))) - MYSQL_YYABORT; - } - ; - -window_spec: - '(' - { Select->prepare_add_window_spec(thd); } - opt_window_ref opt_window_partition_clause - opt_window_order_clause opt_window_frame_clause - ')' - { } - ; - -opt_window_ref: - /* empty */ {} - | ident - { - thd->lex->win_ref= (LEX_CSTRING *) thd->memdup(&$1, sizeof(LEX_CSTRING)); - if (unlikely(thd->lex->win_ref == NULL)) - MYSQL_YYABORT; - } - ; - -opt_window_partition_clause: - /* empty */ { } - | PARTITION_SYM BY group_list - ; - -opt_window_order_clause: - /* empty */ { } - | ORDER_SYM BY order_list { Select->order_list= *($3); } - ; - -opt_window_frame_clause: - /* empty */ {} - | window_frame_units window_frame_extent opt_window_frame_exclusion - { - LEX *lex= Lex; - lex->win_frame= - new (thd->mem_root) Window_frame($1, - lex->frame_top_bound, - lex->frame_bottom_bound, - $3); - if (unlikely(lex->win_frame == NULL)) - MYSQL_YYABORT; - } - ; - -window_frame_units: - ROWS_SYM { $$= Window_frame::UNITS_ROWS; } - | RANGE_SYM { $$= Window_frame::UNITS_RANGE; } - ; - -window_frame_extent: - window_frame_start - { - LEX *lex= Lex; - lex->frame_top_bound= $1; - lex->frame_bottom_bound= - new (thd->mem_root) - Window_frame_bound(Window_frame_bound::CURRENT, NULL); - if (unlikely(lex->frame_bottom_bound == NULL)) - MYSQL_YYABORT; - } - | BETWEEN_SYM window_frame_bound AND_SYM window_frame_bound - { - LEX *lex= Lex; - lex->frame_top_bound= $2; - lex->frame_bottom_bound= $4; - } - ; - -window_frame_start: - UNBOUNDED_SYM PRECEDING_SYM - { - $$= new (thd->mem_root) - Window_frame_bound(Window_frame_bound::PRECEDING, NULL); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | CURRENT_SYM ROW_SYM - { - $$= new (thd->mem_root) - Window_frame_bound(Window_frame_bound::CURRENT, NULL); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | literal PRECEDING_SYM - { - $$= new (thd->mem_root) - Window_frame_bound(Window_frame_bound::PRECEDING, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -window_frame_bound: - window_frame_start { $$= $1; } - | UNBOUNDED_SYM FOLLOWING_SYM - { - $$= new (thd->mem_root) - Window_frame_bound(Window_frame_bound::FOLLOWING, NULL); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | literal FOLLOWING_SYM - { - $$= new (thd->mem_root) - Window_frame_bound(Window_frame_bound::FOLLOWING, $1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -opt_window_frame_exclusion: - /* empty */ { $$= Window_frame::EXCL_NONE; } - | EXCLUDE_SYM CURRENT_SYM ROW_SYM - { $$= Window_frame::EXCL_CURRENT_ROW; } - | EXCLUDE_SYM GROUP_SYM - { $$= Window_frame::EXCL_GROUP; } - | EXCLUDE_SYM TIES_SYM - { $$= Window_frame::EXCL_TIES; } - | EXCLUDE_SYM NO_SYM OTHERS_MARIADB_SYM - { $$= Window_frame::EXCL_NONE; } - | EXCLUDE_SYM NO_SYM OTHERS_ORACLE_SYM - { $$= Window_frame::EXCL_NONE; } - ; - -/* - Order by statement in ALTER TABLE -*/ - -alter_order_clause: - ORDER_SYM BY alter_order_list - ; - -alter_order_list: - alter_order_list ',' alter_order_item - | alter_order_item - ; - -alter_order_item: - simple_ident_nospvar order_dir - { - bool ascending= ($2 == 1) ? true : false; - if (unlikely(add_order_to_list(thd, $1, ascending))) - MYSQL_YYABORT; - } - ; - -/* - Order by statement in select -*/ - -opt_order_clause: - /* empty */ - { $$= NULL; } - | order_clause - { $$= $1; } - ; - -order_clause: - ORDER_SYM BY - { - thd->where= "ORDER clause"; - } - order_list - { - $$= $4; - } - ; - -order_list: - order_list ',' order_ident order_dir - { - $$= $1; - if (add_to_list(thd, *$$, $3,(bool) $4)) - MYSQL_YYABORT; - } - | order_ident order_dir - { - $$= new (thd->mem_root) SQL_I_List<ORDER>(); - if (add_to_list(thd, *$$, $1, (bool) $2)) - MYSQL_YYABORT; - } - ; - -order_dir: - /* empty */ { $$ = 1; } - | ASC { $$ =1; } - | DESC { $$ =0; } - ; - -opt_limit_clause: - /* empty */ - { $$.empty(); } - | limit_clause - { $$= $1; } - ; - -limit_clause: - LIMIT limit_options - { - $$= $2; - if (!$$.select_limit->basic_const_item() || - $$.select_limit->val_int() > 0) - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); - } - | LIMIT limit_options - ROWS_SYM EXAMINED_SYM limit_rows_option - { - $$= $2; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); - } - | LIMIT ROWS_SYM EXAMINED_SYM limit_rows_option - { - $$.select_limit= 0; - $$.offset_limit= 0; - $$.explicit_limit= 0; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); - } - ; - -opt_global_limit_clause: - opt_limit_clause - { - Select->explicit_limit= $1.explicit_limit; - Select->select_limit= $1.select_limit; - Select->offset_limit= $1.offset_limit; - } - ; - -limit_options: - limit_option - { - $$.select_limit= $1; - $$.offset_limit= 0; - $$.explicit_limit= 1; - } - | limit_option ',' limit_option - { - $$.select_limit= $3; - $$.offset_limit= $1; - $$.explicit_limit= 1; - } - | limit_option OFFSET_SYM limit_option - { - $$.select_limit= $1; - $$.offset_limit= $3; - $$.explicit_limit= 1; - } - ; - -limit_option: - ident_cli - { - if (unlikely(!($$= Lex->create_item_limit(thd, &$1)))) - MYSQL_YYABORT; - } - | ident_cli '.' ident_cli - { - if (unlikely(!($$= Lex->create_item_limit(thd, &$1, &$3)))) - MYSQL_YYABORT; - } - | param_marker - { - $1->limit_clause_param= TRUE; - } - | ULONGLONG_NUM - { - $$= new (thd->mem_root) Item_uint(thd, $1.str, $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | LONG_NUM - { - $$= new (thd->mem_root) Item_uint(thd, $1.str, $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | NUM - { - $$= new (thd->mem_root) Item_uint(thd, $1.str, $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -limit_rows_option: - limit_option - { - LEX *lex=Lex; - lex->limit_rows_examined= $1; - } - ; - -delete_limit_clause: - /* empty */ - { - LEX *lex=Lex; - lex->current_select->select_limit= 0; - } - | LIMIT limit_option - { - SELECT_LEX *sel= Select; - sel->select_limit= $2; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); - sel->explicit_limit= 1; - } - | LIMIT ROWS_SYM EXAMINED_SYM { thd->parse_error(); MYSQL_YYABORT; } - | LIMIT limit_option ROWS_SYM EXAMINED_SYM { thd->parse_error(); MYSQL_YYABORT; } - ; - -order_limit_lock: - order_or_limit - { - $$= $1; - $$->lock.empty(); - } - | order_or_limit select_lock_type - { - $$= $1; - $$->lock= $2; - } - | select_lock_type - { - $$= new(thd->mem_root) Lex_order_limit_lock; - if (!$$) - YYABORT; - $$->order_list= NULL; - $$->limit.empty(); - $$->lock= $1; - } - ; - -opt_order_limit_lock: - /* empty */ - { - Lex->pop_select(); - $$= NULL; - } - | order_limit_lock { $$= $1; } - ; - -query_expression_tail: - order_limit_lock - ; - -opt_query_expression_tail: - opt_order_limit_lock - ; - -opt_procedure_or_into: - /* empty */ - { - $$.empty(); - } - | procedure_clause opt_select_lock_type - { - $$= $2; - } - | into opt_select_lock_type - { - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_WARN_DEPRECATED_SYNTAX, - ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), - "<select expression> INTO <destination>;", - "'SELECT <select list> INTO <destination>" - " FROM...'"); - $$= $2; - } - ; - -order_or_limit: - order_clause opt_limit_clause - { - $$= new(thd->mem_root) Lex_order_limit_lock; - if (!$$) - YYABORT; - $$->order_list= $1; - $$->limit= $2; - } - | limit_clause - { - Lex_order_limit_lock *op= $$= new(thd->mem_root) Lex_order_limit_lock; - if (!$$) - YYABORT; - op->order_list= NULL; - op->limit= $1; - $$->order_list= NULL; - $$->limit= $1; - } - ; - - -opt_plus: - /* empty */ - | '+' - ; - -int_num: - opt_plus NUM { int error; $$= (int) my_strtoll10($2.str, (char**) 0, &error); } - | '-' NUM { int error; $$= -(int) my_strtoll10($2.str, (char**) 0, &error); } - ; - -ulong_num: - opt_plus NUM { int error; $$= (ulong) my_strtoll10($2.str, (char**) 0, &error); } - | HEX_NUM { $$= (ulong) strtol($1.str, (char**) 0, 16); } - | opt_plus LONG_NUM { int error; $$= (ulong) my_strtoll10($2.str, (char**) 0, &error); } - | opt_plus ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($2.str, (char**) 0, &error); } - | opt_plus DECIMAL_NUM { int error; $$= (ulong) my_strtoll10($2.str, (char**) 0, &error); } - | opt_plus FLOAT_NUM { int error; $$= (ulong) my_strtoll10($2.str, (char**) 0, &error); } - ; - -real_ulong_num: - NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | HEX_NUM { $$= (ulong) strtol($1.str, (char**) 0, 16); } - | LONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - | dec_num_error { MYSQL_YYABORT; } - ; - -longlong_num: - opt_plus NUM { int error; $$= (longlong) my_strtoll10($2.str, (char**) 0, &error); } - | LONG_NUM { int error; $$= (longlong) my_strtoll10($1.str, (char**) 0, &error); } - | '-' NUM { int error; $$= -(longlong) my_strtoll10($2.str, (char**) 0, &error); } - | '-' LONG_NUM { int error; $$= -(longlong) my_strtoll10($2.str, (char**) 0, &error); } - ; - -ulonglong_num: - opt_plus NUM { int error; $$= (ulonglong) my_strtoll10($2.str, (char**) 0, &error); } - | opt_plus ULONGLONG_NUM { int error; $$= (ulonglong) my_strtoll10($2.str, (char**) 0, &error); } - | opt_plus LONG_NUM { int error; $$= (ulonglong) my_strtoll10($2.str, (char**) 0, &error); } - | opt_plus DECIMAL_NUM { int error; $$= (ulonglong) my_strtoll10($2.str, (char**) 0, &error); } - | opt_plus FLOAT_NUM { int error; $$= (ulonglong) my_strtoll10($2.str, (char**) 0, &error); } - ; - -real_ulonglong_num: - NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | ULONGLONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | HEX_NUM { $$= strtoull($1.str, (char**) 0, 16); } - | LONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } - | dec_num_error { MYSQL_YYABORT; } - ; - -dec_num_error: - dec_num - { thd->parse_error(ER_ONLY_INTEGERS_ALLOWED); } - ; - -dec_num: - DECIMAL_NUM - | FLOAT_NUM - ; - -choice: - ulong_num { $$= $1 != 0 ? HA_CHOICE_YES : HA_CHOICE_NO; } - | DEFAULT { $$= HA_CHOICE_UNDEF; } - ; - -bool: - ulong_num { $$= $1 != 0; } - | TRUE_SYM { $$= 1; } - | FALSE_SYM { $$= 0; } - ; - -procedure_clause: - PROCEDURE_SYM ident /* Procedure name */ - { - LEX *lex=Lex; - - lex->proc_list.elements=0; - lex->proc_list.first=0; - lex->proc_list.next= &lex->proc_list.first; - Item_field *item= new (thd->mem_root) - Item_field(thd, &lex->current_select->context, - $2); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - if (unlikely(add_proc_to_list(thd, item))) - MYSQL_YYABORT; - Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - - /* - PROCEDURE CLAUSE cannot handle subquery as one of its parameter, - so disallow any subqueries further. - Alow subqueries back once the parameters are reduced. - */ - Lex->clause_that_disallows_subselect= "PROCEDURE"; - Select->options|= OPTION_PROCEDURE_CLAUSE; - } - '(' procedure_list ')' - { - /* Subqueries are allowed from now.*/ - Lex->clause_that_disallows_subselect= NULL; - } - ; - -procedure_list: - /* empty */ {} - | procedure_list2 {} - ; - -procedure_list2: - procedure_list2 ',' procedure_item - | procedure_item - ; - -procedure_item: - remember_name expr remember_end - { - if (unlikely(add_proc_to_list(thd, $2))) - MYSQL_YYABORT; - if (!$2->name.str || $2->name.str == item_empty_name) - $2->set_name(thd, $1, (uint) ($3 - $1), thd->charset()); - } - ; - -select_var_list_init: - { - LEX *lex=Lex; - if (!lex->describe && - unlikely((!(lex->result= new (thd->mem_root) - select_dumpvar(thd))))) - MYSQL_YYABORT; - } - select_var_list - {} - ; - -select_var_list: - select_var_list ',' select_var_ident - | select_var_ident {} - ; - -select_var_ident: select_outvar - { - if (Lex->result) - { - if (unlikely($1 == NULL)) - MYSQL_YYABORT; - ((select_dumpvar *)Lex->result)->var_list.push_back($1, thd->mem_root); - } - else - { - /* - The parser won't create select_result instance only - if it's an EXPLAIN. - */ - DBUG_ASSERT(Lex->describe); - } - } - ; - -select_outvar: - '@' ident_or_text - { - $$ = Lex->result ? new (thd->mem_root) my_var_user(&$2) : NULL; - } - | ident_or_text - { - if (unlikely(!($$= Lex->create_outvar(thd, &$1)) && Lex->result)) - MYSQL_YYABORT; - } - | ident '.' ident - { - if (unlikely(!($$= Lex->create_outvar(thd, &$1, &$3)) && Lex->result)) - MYSQL_YYABORT; - } - ; - -into: - INTO into_destination - {} - ; - -into_destination: - OUTFILE TEXT_STRING_filesystem - { - LEX *lex= Lex; - lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - if (unlikely(!(lex->exchange= - new (thd->mem_root) sql_exchange($2.str, 0))) || - unlikely(!(lex->result= - new (thd->mem_root) - select_export(thd, lex->exchange)))) - MYSQL_YYABORT; - } - opt_load_data_charset - { Lex->exchange->cs= $4; } - opt_field_term opt_line_term - | DUMPFILE TEXT_STRING_filesystem - { - LEX *lex=Lex; - if (!lex->describe) - { - lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - if (unlikely(!(lex->exchange= - new (thd->mem_root) sql_exchange($2.str,1)))) - MYSQL_YYABORT; - if (unlikely(!(lex->result= - new (thd->mem_root) - select_dump(thd, lex->exchange)))) - MYSQL_YYABORT; - } - } - | select_var_list_init - { - Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); - } - ; - -/* - DO statement -*/ - -do: - DO_SYM - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_DO; - mysql_init_select(lex); - } - expr_list - { - Lex->insert_list= $3; - } - ; - -/* - Drop : delete tables or index or user -*/ - -drop: - DROP opt_temporary table_or_tables opt_if_exists - { - LEX *lex=Lex; - lex->set_command(SQLCOM_DROP_TABLE, $2, $4); - YYPS->m_lock_type= TL_UNLOCK; - YYPS->m_mdl_type= MDL_EXCLUSIVE; - } - table_list opt_lock_wait_timeout opt_restrict - {} - | DROP INDEX_SYM opt_if_exists_table_element ident ON table_ident opt_lock_wait_timeout - { - LEX *lex=Lex; - Alter_drop *ad= (new (thd->mem_root) - Alter_drop(Alter_drop::KEY, $4.str, $3)); - if (unlikely(ad == NULL)) - MYSQL_YYABORT; - lex->sql_command= SQLCOM_DROP_INDEX; - lex->alter_info.reset(); - lex->alter_info.flags= ALTER_DROP_INDEX; - lex->alter_info.drop_list.push_back(ad, thd->mem_root); - if (unlikely(!lex->current_select-> - add_table_to_list(thd, $6, NULL, TL_OPTION_UPDATING, - TL_READ_NO_INSERT, - MDL_SHARED_UPGRADABLE))) - MYSQL_YYABORT; - } - | DROP DATABASE opt_if_exists ident - { - LEX *lex=Lex; - lex->set_command(SQLCOM_DROP_DB, $3); - lex->name= $4; - } - | DROP USER_SYM opt_if_exists clear_privileges user_list - { - Lex->set_command(SQLCOM_DROP_USER, $3); - } - | DROP ROLE_SYM opt_if_exists clear_privileges role_list - { - Lex->set_command(SQLCOM_DROP_ROLE, $3); - } - | DROP VIEW_SYM opt_if_exists - { - LEX *lex= Lex; - lex->set_command(SQLCOM_DROP_VIEW, $3); - YYPS->m_lock_type= TL_UNLOCK; - YYPS->m_mdl_type= MDL_EXCLUSIVE; - } - table_list opt_restrict - {} - | DROP EVENT_SYM opt_if_exists sp_name - { - Lex->spname= $4; - Lex->set_command(SQLCOM_DROP_EVENT, $3); - } - | DROP TRIGGER_SYM opt_if_exists sp_name - { - LEX *lex= Lex; - lex->set_command(SQLCOM_DROP_TRIGGER, $3); - lex->spname= $4; - } - | DROP TABLESPACE tablespace_name opt_ts_engine opt_ts_wait - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_cmd_type= DROP_TABLESPACE; - } - | DROP LOGFILE_SYM GROUP_SYM logfile_group_name opt_ts_engine opt_ts_wait - { - LEX *lex= Lex; - lex->alter_tablespace_info->ts_cmd_type= DROP_LOGFILE_GROUP; - } - | DROP SERVER_SYM opt_if_exists ident_or_text - { - Lex->set_command(SQLCOM_DROP_SERVER, $3); - Lex->server_options.reset($4); - } - | DROP opt_temporary SEQUENCE_SYM opt_if_exists - - { - LEX *lex= Lex; - lex->set_command(SQLCOM_DROP_SEQUENCE, $2, $4); - lex->table_type= TABLE_TYPE_SEQUENCE; - YYPS->m_lock_type= TL_UNLOCK; - YYPS->m_mdl_type= MDL_EXCLUSIVE; - } - table_list - {} - | drop_routine - ; - -table_list: - table_name - | table_list ',' table_name - ; - -table_name: - table_ident - { - if (!thd->lex->current_select_or_default()-> - add_table_to_list(thd, $1, NULL, - TL_OPTION_UPDATING, - YYPS->m_lock_type, - YYPS->m_mdl_type)) - MYSQL_YYABORT; - } - ; - -table_name_with_opt_use_partition: - table_ident opt_use_partition - { - if (unlikely(!Select->add_table_to_list(thd, $1, NULL, - TL_OPTION_UPDATING, - YYPS->m_lock_type, - YYPS->m_mdl_type, - NULL, - $2))) - MYSQL_YYABORT; - } - ; - -table_alias_ref_list: - table_alias_ref - | table_alias_ref_list ',' table_alias_ref - ; - -table_alias_ref: - table_ident_opt_wild - { - if (unlikely(!Select-> - add_table_to_list(thd, $1, NULL, - (TL_OPTION_UPDATING | - TL_OPTION_ALIAS), - YYPS->m_lock_type, - YYPS->m_mdl_type))) - MYSQL_YYABORT; - } - ; - -opt_if_exists_table_element: - /* empty */ - { - Lex->check_exists= FALSE; - $$= 0; - } - | IF_SYM EXISTS - { - Lex->check_exists= TRUE; - $$= 1; - } - ; - -opt_if_exists: - /* empty */ - { - $$.set(DDL_options_st::OPT_NONE); - } - | IF_SYM EXISTS - { - $$.set(DDL_options_st::OPT_IF_EXISTS); - } - ; - -opt_temporary: - /* empty */ { $$= 0; } - | TEMPORARY { $$= HA_LEX_CREATE_TMP_TABLE; } - ; -/* -** Insert : add new data to table -*/ - -insert: - INSERT - { - Lex->sql_command= SQLCOM_INSERT; - Lex->duplicates= DUP_ERROR; - } - insert_start insert_lock_option opt_ignore opt_into insert_table - { - Select->set_lock_for_tables($4, true); - } - insert_field_spec opt_insert_update opt_returning - stmt_end - { - Lex->mark_first_table_as_inserting(); - } - ; - -replace: - REPLACE - { - Lex->sql_command = SQLCOM_REPLACE; - Lex->duplicates= DUP_REPLACE; - } - insert_start replace_lock_option opt_into insert_table - { - Select->set_lock_for_tables($4, true); - } - insert_field_spec opt_returning - stmt_end - { - Lex->mark_first_table_as_inserting(); - } - ; - -insert_start: { - if (Lex->main_select_push()) - MYSQL_YYABORT; - mysql_init_select(Lex); - Lex->current_select->parsing_place= BEFORE_OPT_LIST; - } - ; - -stmt_end: { - Lex->pop_select(); //main select - if (Lex->check_main_unit_semantics()) - MYSQL_YYABORT; - } - ; - -insert_lock_option: - /* empty */ - { - /* - If it is SP we do not allow insert optimisation when result of - insert visible only after the table unlocking but everyone can - read table. - */ - $$= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); - } - | insert_replace_option - | HIGH_PRIORITY { $$= TL_WRITE; } - ; - -replace_lock_option: - /* empty */ { $$= TL_WRITE_DEFAULT; } - | insert_replace_option - ; - -insert_replace_option: - LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } - | DELAYED_SYM - { - Lex->keyword_delayed_begin_offset= (uint)($1.pos() - thd->query()); - Lex->keyword_delayed_end_offset= (uint)($1.end() - thd->query()); - $$= TL_WRITE_DELAYED; - } - ; - -opt_into: /* nothing */ | INTO ; - -insert_table: - { - Select->save_parsing_place= Select->parsing_place; - } - table_name_with_opt_use_partition - { - LEX *lex=Lex; - //lex->field_list.empty(); - lex->many_values.empty(); - lex->insert_list=0; - } - ; - -insert_field_spec: - insert_values {} - | insert_field_list insert_values {} - | SET - { - LEX *lex=Lex; - if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item)) || - unlikely(lex->many_values.push_back(lex->insert_list, - thd->mem_root))) - MYSQL_YYABORT; - lex->current_select->parsing_place= NO_MATTER; - } - ident_eq_list - ; - -insert_field_list: - LEFT_PAREN_ALT opt_fields ')' - { - Lex->current_select->parsing_place= AFTER_LIST; - } - ; - -opt_fields: - /* empty */ - | fields - ; - -fields: - fields ',' insert_ident - { Lex->field_list.push_back($3, thd->mem_root); } - | insert_ident { Lex->field_list.push_back($1, thd->mem_root); } - ; - - - -insert_values: - create_select_query_expression {} - ; - -values_list: - values_list ',' no_braces - | no_braces_with_names - ; - -ident_eq_list: - ident_eq_list ',' ident_eq_value - | ident_eq_value - ; - -ident_eq_value: - simple_ident_nospvar equal expr_or_default - { - LEX *lex=Lex; - if (unlikely(lex->field_list.push_back($1, thd->mem_root)) || - unlikely(lex->insert_list->push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -equal: - '=' {} - | SET_VAR {} - ; - -opt_equal: - /* empty */ {} - | equal {} - ; - -opt_with: - opt_equal {} - | WITH {} - ; - -opt_by: - opt_equal {} - | BY {} - ; - -no_braces: - '(' - { - if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) - MYSQL_YYABORT; - } - opt_values ')' - { - LEX *lex=Lex; - if (unlikely(lex->many_values.push_back(lex->insert_list, - thd->mem_root))) - MYSQL_YYABORT; - } - ; - -no_braces_with_names: - '(' - { - if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) - MYSQL_YYABORT; - } - opt_values_with_names ')' - { - LEX *lex=Lex; - if (unlikely(lex->many_values.push_back(lex->insert_list, - thd->mem_root))) - MYSQL_YYABORT; - } - ; - -opt_values: - /* empty */ {} - | values - ; - -opt_values_with_names: - /* empty */ {} - | values_with_names - ; - -values: - values ',' expr_or_default - { - if (unlikely(Lex->insert_list->push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - | expr_or_default - { - if (unlikely(Lex->insert_list->push_back($1, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -values_with_names: - values_with_names ',' remember_name expr_or_default remember_end - { - if (unlikely(Lex->insert_list->push_back($4, thd->mem_root))) - MYSQL_YYABORT; - // give some name in case of using in table value constuctor (TVC) - if (!$4->name.str || $4->name.str == item_empty_name) - $4->set_name(thd, $3, (uint) ($5 - $3), thd->charset()); - } - | remember_name expr_or_default remember_end - { - if (unlikely(Lex->insert_list->push_back($2, thd->mem_root))) - MYSQL_YYABORT; - // give some name in case of using in table value constuctor (TVC) - if (!$2->name.str || $2->name.str == item_empty_name) - $2->set_name(thd, $1, (uint) ($3 - $1), thd->charset()); - } - ; - -expr_or_default: - expr { $$= $1;} - | DEFAULT - { - $$= new (thd->mem_root) Item_default_value(thd, Lex->current_context()); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | IGNORE_SYM - { - $$= new (thd->mem_root) Item_ignore_value(thd, Lex->current_context()); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -opt_insert_update: - /* empty */ - | ON DUPLICATE_SYM { Lex->duplicates= DUP_UPDATE; } - KEY_SYM UPDATE_SYM - { - Select->parsing_place= IN_UPDATE_ON_DUP_KEY; - } - insert_update_list - { - Select->parsing_place= NO_MATTER; - } - ; - -update_table_list: - table_ident opt_use_partition for_portion_of_time_clause - opt_table_alias_clause opt_key_definition - { - SELECT_LEX *sel= Select; - sel->table_join_options= 0; - if (!($$= Select->add_table_to_list(thd, $1, $4, - Select->get_table_join_options(), - YYPS->m_lock_type, - YYPS->m_mdl_type, - Select->pop_index_hints(), - $2))) - MYSQL_YYABORT; - $$->period_conditions= Lex->period_conditions; - } - | join_table_list { $$= $1; } - ; - -/* Update rows in a table */ - -update: - UPDATE_SYM - { - LEX *lex= Lex; - if (Lex->main_select_push()) - MYSQL_YYABORT; - mysql_init_select(lex); - lex->sql_command= SQLCOM_UPDATE; - lex->duplicates= DUP_ERROR; - } - opt_low_priority opt_ignore update_table_list - SET update_list - { - SELECT_LEX *slex= Lex->first_select_lex(); - if (slex->table_list.elements > 1) - Lex->sql_command= SQLCOM_UPDATE_MULTI; - else if (slex->get_table_list()->derived) - { - /* it is single table update and it is update of derived table */ - my_error(ER_NON_UPDATABLE_TABLE, MYF(0), - slex->get_table_list()->alias.str, "UPDATE"); - MYSQL_YYABORT; - } - /* - In case of multi-update setting write lock for all tables may - be too pessimistic. We will decrease lock level if possible in - mysql_multi_update(). - */ - slex->set_lock_for_tables($3, slex->table_list.elements == 1); - } - opt_where_clause opt_order_clause delete_limit_clause - { - if ($10) - Select->order_list= *($10); - } stmt_end {} - ; - -update_list: - update_list ',' update_elem - | update_elem - ; - -update_elem: - simple_ident_nospvar equal expr_or_default - { - if (unlikely(add_item_to_list(thd, $1)) || - unlikely(add_value_to_list(thd, $3))) - MYSQL_YYABORT; - } - ; - -insert_update_list: - insert_update_list ',' insert_update_elem - | insert_update_elem - ; - -insert_update_elem: - simple_ident_nospvar equal expr_or_default - { - LEX *lex= Lex; - if (unlikely(lex->update_list.push_back($1, thd->mem_root)) || - unlikely(lex->value_list.push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -opt_low_priority: - /* empty */ { $$= TL_WRITE_DEFAULT; } - | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } - ; - -/* Delete rows from a table */ - -delete: - DELETE_SYM - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_DELETE; - YYPS->m_lock_type= TL_WRITE_DEFAULT; - YYPS->m_mdl_type= MDL_SHARED_WRITE; - if (Lex->main_select_push()) - MYSQL_YYABORT; - mysql_init_select(lex); - lex->ignore= 0; - lex->first_select_lex()->order_list.empty(); - } - delete_part2 - { } - ; - -opt_delete_system_time: - /* empty */ - { - Lex->vers_conditions.init(SYSTEM_TIME_ALL); - } - | BEFORE_SYM SYSTEM_TIME_SYM history_point - { - Lex->vers_conditions.init(SYSTEM_TIME_BEFORE, $3); - } - ; - -delete_part2: - opt_delete_options single_multi {} - | HISTORY_SYM delete_single_table opt_delete_system_time - { - Lex->last_table()->vers_conditions= Lex->vers_conditions; - Lex->pop_select(); //main select - } - ; - -delete_single_table: - FROM table_ident opt_use_partition - { - if (unlikely(!Select-> - add_table_to_list(thd, $2, NULL, TL_OPTION_UPDATING, - YYPS->m_lock_type, - YYPS->m_mdl_type, - NULL, - $3))) - MYSQL_YYABORT; - YYPS->m_lock_type= TL_READ_DEFAULT; - YYPS->m_mdl_type= MDL_SHARED_READ; - } - ; - -delete_single_table_for_period: - delete_single_table opt_for_portion_of_time_clause - { - if ($2) - Lex->last_table()->period_conditions= Lex->period_conditions; - } - ; - -single_multi: - delete_single_table_for_period - opt_where_clause - opt_order_clause - delete_limit_clause - opt_returning - { - if ($3) - Select->order_list= *($3); - Lex->pop_select(); //main select - } - | table_wild_list - { - mysql_init_multi_delete(Lex); - YYPS->m_lock_type= TL_READ_DEFAULT; - YYPS->m_mdl_type= MDL_SHARED_READ; - } - FROM join_table_list opt_where_clause - { - if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) - MYSQL_YYABORT; - } stmt_end {} - | FROM table_alias_ref_list - { - mysql_init_multi_delete(Lex); - YYPS->m_lock_type= TL_READ_DEFAULT; - YYPS->m_mdl_type= MDL_SHARED_READ; - } - USING join_table_list opt_where_clause - { - if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) - MYSQL_YYABORT; - } stmt_end {} - ; - -opt_returning: - /* empty */ - { - DBUG_ASSERT(!Lex->has_returning()); - } - | RETURNING_SYM - { - DBUG_ASSERT(!Lex->has_returning()); - if (($<num>$= (Select != Lex->returning()))) - { - SELECT_LEX *sl= Lex->returning(); - sl->set_master_unit(0); - Select->add_slave(Lex->create_unit(sl)); - sl->include_global((st_select_lex_node**)&Lex->all_selects_list); - Lex->push_select(sl); - } - } - select_item_list - { - if ($<num>2) - Lex->pop_select(); - } - ; - -table_wild_list: - table_wild_one - | table_wild_list ',' table_wild_one - ; - -table_wild_one: - ident opt_wild - { - Table_ident *ti= new (thd->mem_root) Table_ident(&$1); - if (unlikely(ti == NULL)) - MYSQL_YYABORT; - if (unlikely(!Select-> - add_table_to_list(thd, - ti, - NULL, - (TL_OPTION_UPDATING | - TL_OPTION_ALIAS), - YYPS->m_lock_type, - YYPS->m_mdl_type))) - MYSQL_YYABORT; - } - | ident '.' ident opt_wild - { - Table_ident *ti= new (thd->mem_root) Table_ident(thd, &$1, &$3, 0); - if (unlikely(ti == NULL)) - MYSQL_YYABORT; - if (unlikely(!Select-> - add_table_to_list(thd, - ti, - NULL, - (TL_OPTION_UPDATING | - TL_OPTION_ALIAS), - YYPS->m_lock_type, - YYPS->m_mdl_type))) - MYSQL_YYABORT; - } - ; - -opt_wild: - /* empty */ {} - | '.' '*' {} - ; - -opt_delete_options: - /* empty */ {} - | opt_delete_option opt_delete_options {} - ; - -opt_delete_option: - QUICK { Select->options|= OPTION_QUICK; } - | LOW_PRIORITY { YYPS->m_lock_type= TL_WRITE_LOW_PRIORITY; } - | IGNORE_SYM { Lex->ignore= 1; } - ; - -truncate: - TRUNCATE_SYM - { - LEX* lex= Lex; - lex->sql_command= SQLCOM_TRUNCATE; - lex->alter_info.reset(); - lex->first_select_lex()->options= 0; - lex->sql_cache= LEX::SQL_CACHE_UNSPECIFIED; - lex->first_select_lex()->order_list.empty(); - YYPS->m_lock_type= TL_WRITE; - YYPS->m_mdl_type= MDL_EXCLUSIVE; - } - opt_table_sym table_name opt_lock_wait_timeout - { - LEX* lex= thd->lex; - DBUG_ASSERT(!lex->m_sql_cmd); - lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_truncate_table(); - if (unlikely(lex->m_sql_cmd == NULL)) - MYSQL_YYABORT; - } - opt_truncate_table_storage_clause { } - ; - -opt_table_sym: - /* empty */ - | TABLE_SYM - ; - -opt_profile_defs: - /* empty */ - | profile_defs; - -profile_defs: - profile_def - | profile_defs ',' profile_def; - -profile_def: - CPU_SYM - { - Lex->profile_options|= PROFILE_CPU; - } - | MEMORY_SYM - { - Lex->profile_options|= PROFILE_MEMORY; - } - | BLOCK_SYM IO_SYM - { - Lex->profile_options|= PROFILE_BLOCK_IO; - } - | CONTEXT_SYM SWITCHES_SYM - { - Lex->profile_options|= PROFILE_CONTEXT; - } - | PAGE_SYM FAULTS_SYM - { - Lex->profile_options|= PROFILE_PAGE_FAULTS; - } - | IPC_SYM - { - Lex->profile_options|= PROFILE_IPC; - } - | SWAPS_SYM - { - Lex->profile_options|= PROFILE_SWAPS; - } - | SOURCE_SYM - { - Lex->profile_options|= PROFILE_SOURCE; - } - | ALL - { - Lex->profile_options|= PROFILE_ALL; - } - ; - -opt_profile_args: - /* empty */ - { - Lex->profile_query_id= 0; - } - | FOR_SYM QUERY_SYM NUM - { - Lex->profile_query_id= atoi($3.str); - } - ; - -/* Show things */ - -show: - SHOW - { - LEX *lex=Lex; - lex->wild=0; - lex->ident= null_clex_str; - if (Lex->main_select_push()) - MYSQL_YYABORT; - mysql_init_select(lex); - lex->current_select->parsing_place= SELECT_LIST; - lex->create_info.init(); - } - show_param - { - Select->parsing_place= NO_MATTER; - Lex->pop_select(); //main select - } - ; - -show_param: - DATABASES wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_DATABASES; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SCHEMATA))) - MYSQL_YYABORT; - } - | opt_full TABLES opt_db wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_TABLES; - lex->first_select_lex()->db= $3; - if (prepare_schema_table(thd, lex, 0, SCH_TABLE_NAMES)) - MYSQL_YYABORT; - } - | opt_full TRIGGERS_SYM opt_db wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_TRIGGERS; - lex->first_select_lex()->db= $3; - if (prepare_schema_table(thd, lex, 0, SCH_TRIGGERS)) - MYSQL_YYABORT; - } - | EVENTS_SYM opt_db wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_EVENTS; - lex->first_select_lex()->db= $2; - if (prepare_schema_table(thd, lex, 0, SCH_EVENTS)) - MYSQL_YYABORT; - } - | TABLE_SYM STATUS_SYM opt_db wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_TABLE_STATUS; - lex->first_select_lex()->db= $3; - if (prepare_schema_table(thd, lex, 0, SCH_TABLES)) - MYSQL_YYABORT; - } - | OPEN_SYM TABLES opt_db wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; - lex->first_select_lex()->db= $3; - if (prepare_schema_table(thd, lex, 0, SCH_OPEN_TABLES)) - MYSQL_YYABORT; - } - | PLUGINS_SYM - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_PLUGINS; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PLUGINS))) - MYSQL_YYABORT; - } - | PLUGINS_SYM SONAME_SYM TEXT_STRING_sys - { - Lex->ident= $3; - Lex->sql_command= SQLCOM_SHOW_PLUGINS; - if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) - MYSQL_YYABORT; - } - | PLUGINS_SYM SONAME_SYM wild_and_where - { - Lex->sql_command= SQLCOM_SHOW_PLUGINS; - if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) - MYSQL_YYABORT; - } - | ENGINE_SYM known_storage_engines show_engine_param - { Lex->create_info.db_type= $2; } - | ENGINE_SYM ALL show_engine_param - { Lex->create_info.db_type= NULL; } - | opt_full COLUMNS from_or_in table_ident opt_db wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_FIELDS; - if ($5.str) - $4->change_db(&$5); - if (unlikely(prepare_schema_table(thd, lex, $4, SCH_COLUMNS))) - MYSQL_YYABORT; - } - | master_or_binary LOGS_SYM - { - Lex->sql_command = SQLCOM_SHOW_BINLOGS; - } - | SLAVE HOSTS_SYM - { - Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; - } - | BINLOG_SYM EVENTS_SYM binlog_in binlog_from - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; - } - opt_global_limit_clause - | RELAYLOG_SYM optional_connection_name EVENTS_SYM binlog_in binlog_from - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS; - } - opt_global_limit_clause - | keys_or_index from_or_in table_ident opt_db opt_where_clause - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_KEYS; - if ($4.str) - $3->change_db(&$4); - if (unlikely(prepare_schema_table(thd, lex, $3, SCH_STATISTICS))) - MYSQL_YYABORT; - } - | opt_storage ENGINES_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_ENGINES))) - MYSQL_YYABORT; - } - | AUTHORS_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_AUTHORS; - } - | CONTRIBUTORS_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; - } - | PRIVILEGES - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_PRIVILEGES; - } - | COUNT_SYM '(' '*' ')' WARNINGS - { - LEX_CSTRING var= {STRING_WITH_LEN("warning_count")}; - (void) create_select_for_variable(thd, &var); - } - | COUNT_SYM '(' '*' ')' ERRORS - { - LEX_CSTRING var= {STRING_WITH_LEN("error_count")}; - (void) create_select_for_variable(thd, &var); - } - | WARNINGS opt_global_limit_clause - { Lex->sql_command = SQLCOM_SHOW_WARNS;} - | ERRORS opt_global_limit_clause - { Lex->sql_command = SQLCOM_SHOW_ERRORS;} - | PROFILES_SYM - { Lex->sql_command = SQLCOM_SHOW_PROFILES; } - | PROFILE_SYM opt_profile_defs opt_profile_args opt_global_limit_clause - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_PROFILE; - if (unlikely(prepare_schema_table(thd, lex, NULL, SCH_PROFILES))) - MYSQL_YYABORT; - } - | opt_var_type STATUS_SYM wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_STATUS; - lex->option_type= $1; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_STATUS))) - MYSQL_YYABORT; - } - | opt_full PROCESSLIST_SYM - { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} - | opt_var_type VARIABLES wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_VARIABLES; - lex->option_type= $1; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_VARIABLES))) - MYSQL_YYABORT; - } - | charset wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_CHARSETS; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_CHARSETS))) - MYSQL_YYABORT; - } - | COLLATION_SYM wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_COLLATIONS; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_COLLATIONS))) - MYSQL_YYABORT; - } - | GRANTS - { - Lex->sql_command= SQLCOM_SHOW_GRANTS; - if (unlikely(!(Lex->grant_user= - (LEX_USER*)thd->alloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - Lex->grant_user->user= current_user_and_current_role; - } - | GRANTS FOR_SYM user_or_role clear_privileges - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SHOW_GRANTS; - lex->grant_user=$3; - } - | CREATE DATABASE opt_if_not_exists ident - { - Lex->set_command(SQLCOM_SHOW_CREATE_DB, $3); - Lex->name= $4; - } - | CREATE TABLE_SYM table_ident - { - LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE; - if (!lex->first_select_lex()->add_table_to_list(thd, $3, NULL,0)) - MYSQL_YYABORT; - lex->create_info.storage_media= HA_SM_DEFAULT; - } - | CREATE VIEW_SYM table_ident - { - LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE; - if (!lex->first_select_lex()->add_table_to_list(thd, $3, NULL, 0)) - MYSQL_YYABORT; - lex->table_type= TABLE_TYPE_VIEW; - } - | CREATE SEQUENCE_SYM table_ident - { - LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE; - if (!lex->first_select_lex()->add_table_to_list(thd, $3, NULL, 0)) - MYSQL_YYABORT; - lex->table_type= TABLE_TYPE_SEQUENCE; - } - | MASTER_SYM STATUS_SYM - { - Lex->sql_command = SQLCOM_SHOW_MASTER_STAT; - } - | ALL SLAVES STATUS_SYM - { - if (!(Lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_show_slave_status(true))) - MYSQL_YYABORT; - Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; - } - | SLAVE STATUS_SYM - { - LEX *lex= thd->lex; - lex->mi.connection_name= null_clex_str; - if (!(lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_show_slave_status())) - MYSQL_YYABORT; - lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; - } - | SLAVE connection_name STATUS_SYM - { - if (!(Lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_show_slave_status())) - MYSQL_YYABORT; - Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; - } - | CREATE PROCEDURE_SYM sp_name - { - LEX *lex= Lex; - - lex->sql_command = SQLCOM_SHOW_CREATE_PROC; - lex->spname= $3; - } - | CREATE FUNCTION_SYM sp_name - { - LEX *lex= Lex; - - lex->sql_command = SQLCOM_SHOW_CREATE_FUNC; - lex->spname= $3; - } - | CREATE PACKAGE_MARIADB_SYM sp_name - { - LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; - lex->spname= $3; - } - | CREATE PACKAGE_ORACLE_SYM sp_name - { - LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; - lex->spname= $3; - } - | CREATE PACKAGE_MARIADB_SYM BODY_MARIADB_SYM sp_name - { - LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; - lex->spname= $4; - } - | CREATE PACKAGE_ORACLE_SYM BODY_ORACLE_SYM sp_name - { - LEX *lex= Lex; - lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; - lex->spname= $4; - } - | CREATE TRIGGER_SYM sp_name - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; - lex->spname= $3; - } - | CREATE USER_SYM - { - Lex->sql_command= SQLCOM_SHOW_CREATE_USER; - if (unlikely(!(Lex->grant_user= - (LEX_USER*)thd->alloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - Lex->grant_user->user= current_user; - } - | CREATE USER_SYM user - { - Lex->sql_command= SQLCOM_SHOW_CREATE_USER; - Lex->grant_user= $3; - } - | PROCEDURE_SYM STATUS_SYM wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_STATUS_PROC; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) - MYSQL_YYABORT; - } - | FUNCTION_SYM STATUS_SYM wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_STATUS_FUNC; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) - MYSQL_YYABORT; - } - | PACKAGE_MARIADB_SYM STATUS_SYM wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) - MYSQL_YYABORT; - } - | PACKAGE_ORACLE_SYM STATUS_SYM wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) - MYSQL_YYABORT; - } - | PACKAGE_MARIADB_SYM BODY_MARIADB_SYM STATUS_SYM wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) - MYSQL_YYABORT; - } - | PACKAGE_ORACLE_SYM BODY_ORACLE_SYM STATUS_SYM wild_and_where - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; - if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) - MYSQL_YYABORT; - } - | PROCEDURE_SYM CODE_SYM sp_name - { - Lex->sql_command= SQLCOM_SHOW_PROC_CODE; - Lex->spname= $3; - } - | FUNCTION_SYM CODE_SYM sp_name - { - Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; - Lex->spname= $3; - } - | PACKAGE_MARIADB_SYM BODY_MARIADB_SYM CODE_SYM sp_name - { - Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; - Lex->spname= $4; - } - | PACKAGE_ORACLE_SYM BODY_ORACLE_SYM CODE_SYM sp_name - { - Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; - Lex->spname= $4; - } - | CREATE EVENT_SYM sp_name - { - Lex->spname= $3; - Lex->sql_command = SQLCOM_SHOW_CREATE_EVENT; - } - | describe_command FOR_SYM expr - { - Lex->sql_command= SQLCOM_SHOW_EXPLAIN; - if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_EXPLAIN))) - MYSQL_YYABORT; - add_value_to_list(thd, $3); - } - | IDENT_sys remember_tok_start wild_and_where - { - LEX *lex= Lex; - bool in_plugin; - lex->sql_command= SQLCOM_SHOW_GENERIC; - ST_SCHEMA_TABLE *table= find_schema_table(thd, &$1, &in_plugin); - if (unlikely(!table || !table->old_format || !in_plugin)) - { - thd->parse_error(ER_SYNTAX_ERROR, $2); - MYSQL_YYABORT; - } - if (unlikely(lex->wild && table->idx_field1 < 0)) - { - thd->parse_error(ER_SYNTAX_ERROR, $3); - MYSQL_YYABORT; - } - if (unlikely(make_schema_select(thd, Lex->current_select, table))) - MYSQL_YYABORT; - } - ; - -show_engine_param: - STATUS_SYM - { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } - | MUTEX_SYM - { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } - | LOGS_SYM - { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; } - ; - -master_or_binary: - MASTER_SYM - | BINARY - ; - -opt_storage: - /* empty */ - | STORAGE_SYM - ; - -opt_db: - /* empty */ { $$= null_clex_str; } - | from_or_in ident { $$= $2; } - ; - -opt_full: - /* empty */ { Lex->verbose=0; } - | FULL { Lex->verbose=1; } - ; - -from_or_in: - FROM - | IN_SYM - ; - -binlog_in: - /* empty */ { Lex->mi.log_file_name = 0; } - | IN_SYM TEXT_STRING_sys { Lex->mi.log_file_name = $2.str; } - ; - -binlog_from: - /* empty */ { Lex->mi.pos = 4; /* skip magic number */ } - | FROM ulonglong_num { Lex->mi.pos = $2; } - ; - -wild_and_where: - /* empty */ { $$= 0; } - | LIKE remember_tok_start TEXT_STRING_sys - { - Lex->wild= new (thd->mem_root) String($3.str, $3.length, - system_charset_info); - if (unlikely(Lex->wild == NULL)) - MYSQL_YYABORT; - $$= $2; - } - | WHERE remember_tok_start expr - { - Select->where= normalize_cond(thd, $3); - if ($3) - $3->top_level_item(); - $$= $2; - } - ; - -/* A Oracle compatible synonym for show */ -describe: - describe_command table_ident - { - LEX *lex= Lex; - mysql_init_select(lex); - lex->current_select->parsing_place= SELECT_LIST; - lex->sql_command= SQLCOM_SHOW_FIELDS; - lex->first_select_lex()->db= null_clex_str; - lex->verbose= 0; - if (unlikely(prepare_schema_table(thd, lex, $2, SCH_COLUMNS))) - MYSQL_YYABORT; - } - opt_describe_column - { - Select->parsing_place= NO_MATTER; - } - | describe_command opt_extended_describe - { Lex->describe|= DESCRIBE_NORMAL; } - explainable_command - { - LEX *lex=Lex; - lex->first_select_lex()->options|= SELECT_DESCRIBE; - } - ; - -explainable_command: - select - | select_into - | insert - | replace - | update - | delete - ; - -describe_command: - DESC - | DESCRIBE - ; - -analyze_stmt_command: - ANALYZE_SYM opt_format_json explainable_command - { - Lex->analyze_stmt= true; - } - ; - -opt_extended_describe: - EXTENDED_SYM { Lex->describe|= DESCRIBE_EXTENDED; } - | EXTENDED_SYM ALL - { Lex->describe|= DESCRIBE_EXTENDED | DESCRIBE_EXTENDED2; } - | PARTITIONS_SYM { Lex->describe|= DESCRIBE_PARTITIONS; } - | opt_format_json {} - ; - -opt_format_json: - /* empty */ {} - | FORMAT_SYM '=' ident_or_text - { - if (lex_string_eq(&$3, STRING_WITH_LEN("JSON"))) - Lex->explain_json= true; - else if (lex_string_eq(&$3, STRING_WITH_LEN("TRADITIONAL"))) - DBUG_ASSERT(Lex->explain_json==false); - else - my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), "EXPLAIN", - $3.str)); - } - ; - -opt_describe_column: - /* empty */ {} - | text_string { Lex->wild= $1; } - | ident - { - Lex->wild= new (thd->mem_root) String((const char*) $1.str, - $1.length, - system_charset_info); - if (unlikely(Lex->wild == NULL)) - MYSQL_YYABORT; - } - ; - - -/* flush things */ - -flush: - FLUSH_SYM opt_no_write_to_binlog - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_FLUSH; - lex->type= 0; - lex->no_write_to_binlog= $2; - } - flush_options {} - ; - -flush_options: - table_or_tables - { - Lex->type|= REFRESH_TABLES; - /* - Set type of metadata and table locks for - FLUSH TABLES table_list [WITH READ LOCK]. - */ - YYPS->m_lock_type= TL_READ_NO_INSERT; - YYPS->m_mdl_type= MDL_SHARED_HIGH_PRIO; - } - opt_table_list opt_flush_lock - {} - | flush_options_list - {} - ; - -opt_flush_lock: - /* empty */ {} - | flush_lock - { - TABLE_LIST *tables= Lex->query_tables; - for (; tables; tables= tables->next_global) - { - tables->mdl_request.set_type(MDL_SHARED_NO_WRITE); - /* Don't try to flush views. */ - tables->required_type= TABLE_TYPE_NORMAL; - /* Ignore temporary tables. */ - tables->open_type= OT_BASE_ONLY; - } - } - ; - -flush_lock: - WITH READ_SYM LOCK_SYM optional_flush_tables_arguments - { Lex->type|= REFRESH_READ_LOCK | $4; } - | FOR_SYM - { - if (unlikely(Lex->query_tables == NULL)) - { - // Table list can't be empty - thd->parse_error(ER_NO_TABLES_USED); - MYSQL_YYABORT; - } - Lex->type|= REFRESH_FOR_EXPORT; - } EXPORT_SYM {} - ; - -flush_options_list: - flush_options_list ',' flush_option - | flush_option - {} - ; - -flush_option: - ERROR_SYM LOGS_SYM - { Lex->type|= REFRESH_ERROR_LOG; } - | ENGINE_SYM LOGS_SYM - { Lex->type|= REFRESH_ENGINE_LOG; } - | GENERAL LOGS_SYM - { Lex->type|= REFRESH_GENERAL_LOG; } - | SLOW LOGS_SYM - { Lex->type|= REFRESH_SLOW_LOG; } - | BINARY LOGS_SYM opt_delete_gtid_domain - { Lex->type|= REFRESH_BINARY_LOG; } - | RELAY LOGS_SYM optional_connection_name - { - LEX *lex= Lex; - if (unlikely(lex->type & REFRESH_RELAY_LOG)) - my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH", "RELAY LOGS")); - lex->type|= REFRESH_RELAY_LOG; - lex->relay_log_connection_name= lex->mi.connection_name; - } - | QUERY_SYM CACHE_SYM - { Lex->type|= REFRESH_QUERY_CACHE_FREE; } - | HOSTS_SYM - { Lex->type|= REFRESH_HOSTS; } - | PRIVILEGES - { Lex->type|= REFRESH_GRANT; } - | LOGS_SYM - { - Lex->type|= REFRESH_LOG; - Lex->relay_log_connection_name= empty_clex_str; - } - | STATUS_SYM - { Lex->type|= REFRESH_STATUS; } - | SLAVE optional_connection_name - { - LEX *lex= Lex; - if (unlikely(lex->type & REFRESH_SLAVE)) - my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH","SLAVE")); - lex->type|= REFRESH_SLAVE; - lex->reset_slave_info.all= false; - } - | MASTER_SYM - { Lex->type|= REFRESH_MASTER; } - | DES_KEY_FILE - { Lex->type|= REFRESH_DES_KEY_FILE; } - | RESOURCES - { Lex->type|= REFRESH_USER_RESOURCES; } - | SSL_SYM - { Lex->type|= REFRESH_SSL;} - | IDENT_sys remember_tok_start - { - Lex->type|= REFRESH_GENERIC; - ST_SCHEMA_TABLE *table= find_schema_table(thd, &$1); - if (unlikely(!table || !table->reset_table)) - { - thd->parse_error(ER_SYNTAX_ERROR, $2); - MYSQL_YYABORT; - } - if (unlikely(Lex->view_list.push_back((LEX_CSTRING*) - thd->memdup(&$1, sizeof(LEX_CSTRING)), - thd->mem_root))) - MYSQL_YYABORT; - } - ; - -opt_table_list: - /* empty */ {} - | table_list {} - ; - -backup: - BACKUP_SYM backup_statements {} - ; - -backup_statements: - STAGE_SYM ident - { - int type; - if (unlikely(Lex->sphead)) - my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP STAGE")); - if ((type= find_type($2.str, &backup_stage_names, - FIND_TYPE_NO_PREFIX)) <= 0) - my_yyabort_error((ER_BACKUP_UNKNOWN_STAGE, MYF(0), $2.str)); - Lex->sql_command= SQLCOM_BACKUP; - Lex->backup_stage= (backup_stages) (type-1); - break; - } - | LOCK_SYM table_ident - { - if (unlikely(!Select->add_table_to_list(thd, $2, NULL, 0, - TL_READ, MDL_SHARED_HIGH_PRIO))) - MYSQL_YYABORT; - Lex->sql_command= SQLCOM_BACKUP_LOCK; - } - | UNLOCK_SYM - { - /* Table list is empty for unlock */ - Lex->sql_command= SQLCOM_BACKUP_LOCK; - } - ; - -opt_delete_gtid_domain: - /* empty */ {} - | DELETE_DOMAIN_ID_SYM '=' '(' delete_domain_id_list ')' - {} - ; -delete_domain_id_list: - /* Empty */ - | delete_domain_id - | delete_domain_id_list ',' delete_domain_id - ; - -delete_domain_id: - ulonglong_num - { - uint32 value= (uint32) $1; - if ($1 > UINT_MAX32) - { - my_printf_error(ER_BINLOG_CANT_DELETE_GTID_DOMAIN, - "The value of gtid domain being deleted ('%llu') " - "exceeds its maximum size " - "of 32 bit unsigned integer", MYF(0), $1); - MYSQL_YYABORT; - } - insert_dynamic(&Lex->delete_gtid_domain, (uchar*) &value); - } - ; - -optional_flush_tables_arguments: - /* empty */ {$$= 0;} - | AND_SYM DISABLE_SYM CHECKPOINT_SYM {$$= REFRESH_CHECKPOINT; } - ; - -reset: - RESET_SYM - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_RESET; lex->type=0; - } - reset_options - {} - ; - -reset_options: - reset_options ',' reset_option - | reset_option - ; - -reset_option: - SLAVE { Lex->type|= REFRESH_SLAVE; } - optional_connection_name - slave_reset_options { } - | MASTER_SYM - { - Lex->type|= REFRESH_MASTER; - Lex->next_binlog_file_number= 0; - } - master_reset_options - | QUERY_SYM CACHE_SYM { Lex->type|= REFRESH_QUERY_CACHE;} - ; - -slave_reset_options: - /* empty */ { Lex->reset_slave_info.all= false; } - | ALL { Lex->reset_slave_info.all= true; } - ; - -master_reset_options: - /* empty */ {} - | TO_SYM ulong_num - { - Lex->next_binlog_file_number = $2; - } - ; - -purge: - PURGE master_or_binary LOGS_SYM TO_SYM TEXT_STRING_sys - { - Lex->stmt_purge_to($5); - } - | PURGE master_or_binary LOGS_SYM BEFORE_SYM - { Lex->clause_that_disallows_subselect= "PURGE..BEFORE"; } - expr - { - Lex->clause_that_disallows_subselect= NULL; - if (Lex->stmt_purge_before($6)) - MYSQL_YYABORT; - } - ; - - -/* kill threads */ - -kill: - KILL_SYM - { - LEX *lex=Lex; - lex->value_list.empty(); - lex->users_list.empty(); - lex->sql_command= SQLCOM_KILL; - lex->kill_type= KILL_TYPE_ID; - } - kill_type kill_option kill_expr - { - Lex->kill_signal= (killed_state) ($3 | $4); - } - ; - -kill_type: - /* Empty */ { $$= (int) KILL_HARD_BIT; } - | HARD_SYM { $$= (int) KILL_HARD_BIT; } - | SOFT_SYM { $$= 0; } - ; - -kill_option: - /* empty */ { $$= (int) KILL_CONNECTION; } - | CONNECTION_SYM { $$= (int) KILL_CONNECTION; } - | QUERY_SYM { $$= (int) KILL_QUERY; } - | QUERY_SYM ID_SYM - { - $$= (int) KILL_QUERY; - Lex->kill_type= KILL_TYPE_QUERY; - } - ; - -kill_expr: - expr - { - Lex->value_list.push_front($$, thd->mem_root); - } - | USER_SYM user - { - Lex->users_list.push_back($2, thd->mem_root); - Lex->kill_type= KILL_TYPE_USER; - } - ; - - -shutdown: - SHUTDOWN { Lex->sql_command= SQLCOM_SHUTDOWN; } - shutdown_option {} - ; - -shutdown_option: - /* Empty */ { Lex->is_shutdown_wait_for_slaves= false; } - | WAIT_SYM FOR_SYM ALL SLAVES - { - Lex->is_shutdown_wait_for_slaves= true; - } - ; - -/* change database */ - -use: - USE_SYM ident - { - LEX *lex=Lex; - lex->sql_command=SQLCOM_CHANGE_DB; - lex->first_select_lex()->db= $2; - } - ; - -/* import, export of files */ - -load: - LOAD data_or_xml - { - LEX *lex= thd->lex; - - if (unlikely(lex->sphead)) - { - my_error(ER_SP_BADSTATEMENT, MYF(0), - $2 == FILETYPE_CSV ? "LOAD DATA" : "LOAD XML"); - MYSQL_YYABORT; - } - if (lex->main_select_push()) - MYSQL_YYABORT; - mysql_init_select(lex); - } - load_data_lock opt_local INFILE TEXT_STRING_filesystem - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_LOAD; - lex->local_file= $5; - lex->duplicates= DUP_ERROR; - lex->ignore= 0; - if (unlikely(!(lex->exchange= new (thd->mem_root) - sql_exchange($7.str, 0, $2)))) - MYSQL_YYABORT; - } - opt_duplicate INTO TABLE_SYM table_ident opt_use_partition - { - LEX *lex=Lex; - if (unlikely(!Select->add_table_to_list(thd, $12, NULL, - TL_OPTION_UPDATING, - $4, MDL_SHARED_WRITE, - NULL, $13))) - MYSQL_YYABORT; - lex->field_list.empty(); - lex->update_list.empty(); - lex->value_list.empty(); - lex->many_values.empty(); - } - opt_load_data_charset - { Lex->exchange->cs= $15; } - opt_xml_rows_identified_by - opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec - opt_load_data_set_spec - stmt_end - { - Lex->mark_first_table_as_inserting(); - } - ; - -data_or_xml: - DATA_SYM { $$= FILETYPE_CSV; } - | XML_SYM { $$= FILETYPE_XML; } - ; - -opt_local: - /* empty */ { $$=0;} - | LOCAL_SYM { $$=1;} - ; - -load_data_lock: - /* empty */ { $$= TL_WRITE_DEFAULT; } - | CONCURRENT - { - /* - Ignore this option in SP to avoid problem with query cache and - triggers with non default priority locks - */ - $$= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); - } - | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } - ; - -opt_duplicate: - /* empty */ { Lex->duplicates=DUP_ERROR; } - | REPLACE { Lex->duplicates=DUP_REPLACE; } - | IGNORE_SYM { Lex->ignore= 1; } - ; - -opt_field_term: - /* empty */ - | COLUMNS field_term_list - ; - -field_term_list: - field_term_list field_term - | field_term - ; - -field_term: - TERMINATED BY text_string - { - DBUG_ASSERT(Lex->exchange != 0); - Lex->exchange->field_term= $3; - } - | OPTIONALLY ENCLOSED BY text_string - { - LEX *lex= Lex; - DBUG_ASSERT(lex->exchange != 0); - lex->exchange->enclosed= $4; - lex->exchange->opt_enclosed= 1; - } - | ENCLOSED BY text_string - { - DBUG_ASSERT(Lex->exchange != 0); - Lex->exchange->enclosed= $3; - } - | ESCAPED BY text_string - { - DBUG_ASSERT(Lex->exchange != 0); - Lex->exchange->escaped= $3; - } - ; - -opt_line_term: - /* empty */ - | LINES line_term_list - ; - -line_term_list: - line_term_list line_term - | line_term - ; - -line_term: - TERMINATED BY text_string - { - DBUG_ASSERT(Lex->exchange != 0); - Lex->exchange->line_term= $3; - } - | STARTING BY text_string - { - DBUG_ASSERT(Lex->exchange != 0); - Lex->exchange->line_start= $3; - } - ; - -opt_xml_rows_identified_by: - /* empty */ { } - | ROWS_SYM IDENTIFIED_SYM BY text_string - { Lex->exchange->line_term = $4; } - ; - -opt_ignore_lines: - /* empty */ - | IGNORE_SYM NUM lines_or_rows - { - DBUG_ASSERT(Lex->exchange != 0); - Lex->exchange->skip_lines= atol($2.str); - } - ; - -lines_or_rows: - LINES { } - | ROWS_SYM { } - ; - -opt_field_or_var_spec: - /* empty */ {} - | '(' fields_or_vars ')' {} - | '(' ')' {} - ; - -fields_or_vars: - fields_or_vars ',' field_or_var - { Lex->field_list.push_back($3, thd->mem_root); } - | field_or_var - { Lex->field_list.push_back($1, thd->mem_root); } - ; - -field_or_var: - simple_ident_nospvar {$$= $1;} - | '@' ident_or_text - { - $$= new (thd->mem_root) Item_user_var_as_out_param(thd, &$2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -opt_load_data_set_spec: - /* empty */ {} - | SET load_data_set_list {} - ; - -load_data_set_list: - load_data_set_list ',' load_data_set_elem - | load_data_set_elem - ; - -load_data_set_elem: - simple_ident_nospvar equal remember_name expr_or_default remember_end - { - LEX *lex= Lex; - if (unlikely(lex->update_list.push_back($1, thd->mem_root)) || - unlikely(lex->value_list.push_back($4, thd->mem_root))) - MYSQL_YYABORT; - $4->set_name_no_truncate(thd, $3, (uint) ($5 - $3), thd->charset()); - } - ; - -/* Common definitions */ - -text_literal: - TEXT_STRING - { - if (unlikely(!($$= thd->make_string_literal($1)))) - MYSQL_YYABORT; - } - | NCHAR_STRING - { - if (unlikely(!($$= thd->make_string_literal_nchar($1)))) - MYSQL_YYABORT; - } - | UNDERSCORE_CHARSET TEXT_STRING - { - if (unlikely(!($$= thd->make_string_literal_charset($2, $1)))) - MYSQL_YYABORT; - } - | text_literal TEXT_STRING_literal - { - if (unlikely(!($$= $1->make_string_literal_concat(thd, &$2)))) - MYSQL_YYABORT; - } - ; - -text_string: - TEXT_STRING_literal - { - $$= new (thd->mem_root) String($1.str, - $1.length, - thd->variables.collation_connection); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | hex_or_bin_String { $$= $1; } - ; - - -hex_or_bin_String: - HEX_NUM - { - Item *tmp= new (thd->mem_root) Item_hex_hybrid(thd, $1.str, - $1.length); - if (unlikely(tmp == NULL)) - MYSQL_YYABORT; - $$= tmp->val_str((String*) 0); - } - | HEX_STRING - { - Item *tmp= new (thd->mem_root) Item_hex_string(thd, $1.str, - $1.length); - if (unlikely(tmp == NULL)) - MYSQL_YYABORT; - $$= tmp->val_str((String*) 0); - } - | BIN_NUM - { - Item *tmp= new (thd->mem_root) Item_bin_string(thd, $1.str, - $1.length); - if (unlikely(tmp == NULL)) - MYSQL_YYABORT; - /* - it is OK only emulate fix_fields, because we need only - value of constant - */ - $$= tmp->val_str((String*) 0); - } - ; - -param_marker: - PARAM_MARKER - { - if (unlikely(!($$= Lex->add_placeholder(thd, ¶m_clex_str, - YYLIP->get_tok_start(), - YYLIP->get_tok_start() + 1)))) - MYSQL_YYABORT; - } - | COLON_ORACLE_SYM ident_cli - { - if (unlikely(!($$= Lex->add_placeholder(thd, &null_clex_str, - $1.pos(), $2.end())))) - MYSQL_YYABORT; - } - | COLON_ORACLE_SYM NUM - { - if (unlikely(!($$= Lex->add_placeholder(thd, &null_clex_str, - $1.pos(), - YYLIP->get_ptr())))) - MYSQL_YYABORT; - } - ; - -signed_literal: - '+' NUM_literal { $$ = $2; } - | '-' NUM_literal - { - $2->max_length++; - $$= $2->neg(thd); - } - ; - -literal: - text_literal { $$ = $1; } - | NUM_literal { $$ = $1; } - | temporal_literal { $$= $1; } - | NULL_SYM - { - /* - For the digest computation, in this context only, - NULL is considered a literal, hence reduced to '?' - REDUCE: - TOK_GENERIC_VALUE := NULL_SYM - */ - YYLIP->reduce_digest_token(TOK_GENERIC_VALUE, NULL_SYM); - $$= new (thd->mem_root) Item_null(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - YYLIP->next_state= MY_LEX_OPERATOR_OR_IDENT; - } - | FALSE_SYM - { - $$= new (thd->mem_root) Item_bool(thd, (char*) "FALSE",0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | TRUE_SYM - { - $$= new (thd->mem_root) Item_bool(thd, (char*) "TRUE",1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | HEX_NUM - { - $$= new (thd->mem_root) Item_hex_hybrid(thd, $1.str, $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | HEX_STRING - { - $$= new (thd->mem_root) Item_hex_string(thd, $1.str, $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | BIN_NUM - { - $$= new (thd->mem_root) Item_bin_string(thd, $1.str, $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | UNDERSCORE_CHARSET hex_or_bin_String - { - Item_string_with_introducer *item_str; - /* - Pass NULL as name. Name will be set in the "select_item" rule and - will include the introducer and the original hex/bin notation. - */ - item_str= new (thd->mem_root) - Item_string_with_introducer(thd, null_clex_str, - $2->lex_cstring(), $1); - if (unlikely(!item_str || - !item_str->check_well_formed_result(true))) - MYSQL_YYABORT; - - $$= item_str; - } - ; - -NUM_literal: - NUM - { - int error; - $$= new (thd->mem_root) - Item_int(thd, $1.str, - (longlong) my_strtoll10($1.str, NULL, &error), - $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | LONG_NUM - { - int error; - $$= new (thd->mem_root) - Item_int(thd, $1.str, - (longlong) my_strtoll10($1.str, NULL, &error), - $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ULONGLONG_NUM - { - $$= new (thd->mem_root) Item_uint(thd, $1.str, $1.length); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DECIMAL_NUM - { - $$= new (thd->mem_root) Item_decimal(thd, $1.str, $1.length, - thd->charset()); - if (unlikely($$ == NULL) || unlikely(thd->is_error())) - MYSQL_YYABORT; - } - | FLOAT_NUM - { - $$= new (thd->mem_root) Item_float(thd, $1.str, $1.length); - if (unlikely($$ == NULL) || unlikely(thd->is_error())) - MYSQL_YYABORT; - } - ; - - -temporal_literal: - DATE_SYM TEXT_STRING - { - if (unlikely(!($$= type_handler_newdate.create_literal_item(thd, - $2.str, $2.length, - YYCSCL, true)))) - MYSQL_YYABORT; - } - | TIME_SYM TEXT_STRING - { - if (unlikely(!($$= type_handler_time2.create_literal_item(thd, - $2.str, $2.length, - YYCSCL, true)))) - MYSQL_YYABORT; - } - | TIMESTAMP TEXT_STRING - { - if (unlikely(!($$= type_handler_datetime.create_literal_item(thd, - $2.str, $2.length, - YYCSCL, true)))) - MYSQL_YYABORT; - } - ; - -with_clause: - WITH opt_recursive - { - LEX *lex= Lex; - With_clause *with_clause= - new With_clause($2, Lex->curr_with_clause); - if (unlikely(with_clause == NULL)) - MYSQL_YYABORT; - lex->derived_tables|= DERIVED_WITH; - lex->curr_with_clause= with_clause; - with_clause->add_to_list(Lex->with_clauses_list_last_next); - if (lex->current_select && - lex->current_select->parsing_place == BEFORE_OPT_LIST) - lex->current_select->parsing_place= NO_MATTER; - } - with_list - { - $$= Lex->curr_with_clause; - Lex->curr_with_clause= Lex->curr_with_clause->pop(); - } - ; - - -opt_recursive: - /*empty*/ { $$= 0; } - | RECURSIVE_SYM { $$= 1; } - ; - - -with_list: - with_list_element - | with_list ',' with_list_element - ; - - -with_list_element: - query_name - opt_with_column_list - { - $2= new List<LEX_CSTRING> (Lex->with_column_list); - if (unlikely($2 == NULL)) - MYSQL_YYABORT; - Lex->with_column_list.empty(); - } - AS '(' query_expression ')' - { - LEX *lex= thd->lex; - const char *query_start= lex->sphead ? lex->sphead->m_tmp_query - : thd->query(); - const char *spec_start= $5.pos() + 1; - With_element *elem= new With_element($1, *$2, $6); - if (elem == NULL || Lex->curr_with_clause->add_with_element(elem)) - MYSQL_YYABORT; - if (elem->set_unparsed_spec(thd, spec_start, $7.pos(), - spec_start - query_start)) - MYSQL_YYABORT; - } - ; - - -opt_with_column_list: - /* empty */ - { $$= NULL; } - | '(' with_column_list ')' - { $$= NULL; } - ; - - -with_column_list: - ident - { - Lex->with_column_list.push_back((LEX_CSTRING*) - thd->memdup(&$1, sizeof(LEX_CSTRING))); - } - | with_column_list ',' ident - { - Lex->with_column_list.push_back((LEX_CSTRING*) - thd->memdup(&$3, sizeof(LEX_CSTRING))); - } - ; - - -query_name: - ident - { - $$= (LEX_CSTRING *) thd->memdup(&$1, sizeof(LEX_CSTRING)); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - - - -/********************************************************************** -** Creating different items. -**********************************************************************/ - -insert_ident: - simple_ident_nospvar { $$=$1; } - | table_wild { $$=$1; } - ; - -table_wild: - ident '.' '*' - { - if (unlikely(!($$= Lex->create_item_qualified_asterisk(thd, &$1)))) - MYSQL_YYABORT; - } - | ident '.' ident '.' '*' - { - if (unlikely(!($$= Lex->create_item_qualified_asterisk(thd, &$1, &$3)))) - MYSQL_YYABORT; - } - ; - -select_sublist_qualified_asterisk: - ident_cli '.' '*' - { - if (unlikely(!($$= Lex->create_item_qualified_asterisk(thd, &$1)))) - MYSQL_YYABORT; - } - | ident_cli '.' ident_cli '.' '*' - { - if (unlikely(!($$= Lex->create_item_qualified_asterisk(thd, &$1, &$3)))) - MYSQL_YYABORT; - } - ; - -order_ident: - expr { $$=$1; } - ; - - -simple_ident: - ident_cli - { - if (unlikely(!($$= Lex->create_item_ident(thd, &$1)))) - MYSQL_YYABORT; - } - | ident_cli '.' ident_cli - { - if (unlikely(!($$= Lex->create_item_ident(thd, &$1, &$3)))) - MYSQL_YYABORT; - } - | '.' ident_cli '.' ident_cli - { - Lex_ident_cli empty($2.pos(), 0); - if (unlikely(!($$= Lex->create_item_ident(thd, &empty, &$2, &$4)))) - MYSQL_YYABORT; - } - | ident_cli '.' ident_cli '.' ident_cli - { - if (unlikely(!($$= Lex->create_item_ident(thd, &$1, &$3, &$5)))) - MYSQL_YYABORT; - } - | COLON_ORACLE_SYM ident_cli '.' ident_cli - { - if (unlikely(!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4)))) - MYSQL_YYABORT; - } - ; - -simple_ident_nospvar: - ident - { - if (unlikely(!($$= Lex->create_item_ident_nosp(thd, &$1)))) - MYSQL_YYABORT; - } - | ident '.' ident - { - if (unlikely(!($$= Lex->create_item_ident_nospvar(thd, &$1, &$3)))) - MYSQL_YYABORT; - } - | COLON_ORACLE_SYM ident_cli '.' ident_cli - { - if (unlikely(!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4)))) - MYSQL_YYABORT; - } - | '.' ident '.' ident - { - Lex_ident_sys none; - if (unlikely(!($$= Lex->create_item_ident(thd, &none, &$2, &$4)))) - MYSQL_YYABORT; - } - | ident '.' ident '.' ident - { - if (unlikely(!($$= Lex->create_item_ident(thd, &$1, &$3, &$5)))) - MYSQL_YYABORT; - } - ; - -field_ident: - ident { $$=$1;} - | ident '.' ident '.' ident - { - TABLE_LIST *table= Select->table_list.first; - if (unlikely(my_strcasecmp(table_alias_charset, $1.str, - table->db.str))) - my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), $1.str)); - if (unlikely(my_strcasecmp(table_alias_charset, $3.str, - table->table_name.str))) - my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), $3.str)); - $$=$5; - } - | ident '.' ident - { - TABLE_LIST *table= Select->table_list.first; - if (unlikely(my_strcasecmp(table_alias_charset, $1.str, - table->alias.str))) - my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), $1.str)); - $$=$3; - } - | '.' ident { $$=$2;} /* For Delphi */ - ; - -table_ident: - ident - { - $$= new (thd->mem_root) Table_ident(&$1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ident '.' ident - { - $$= new (thd->mem_root) Table_ident(thd, &$1, &$3, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | '.' ident - { - /* For Delphi */ - $$= new (thd->mem_root) Table_ident(&$2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -table_ident_opt_wild: - ident opt_wild - { - $$= new (thd->mem_root) Table_ident(&$1); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ident '.' ident opt_wild - { - $$= new (thd->mem_root) Table_ident(thd, &$1, &$3, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -table_ident_nodb: - ident - { - LEX_CSTRING db={(char*) any_db,3}; - $$= new (thd->mem_root) Table_ident(thd, &db, &$1, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -IDENT_cli: - IDENT - | IDENT_QUOTED - ; - -ident_cli: - IDENT - | IDENT_QUOTED - | keyword_ident { $$= $1; } - ; - -IDENT_sys: - IDENT_cli - { - if (unlikely(thd->to_ident_sys_alloc(&$$, &$1))) - MYSQL_YYABORT; - } - ; - -TEXT_STRING_sys: - TEXT_STRING - { - if (thd->make_text_string_sys(&$$, &$1)) - MYSQL_YYABORT; - } - ; - -TEXT_STRING_literal: - TEXT_STRING - { - if (thd->make_text_string_connection(&$$, &$1)) - MYSQL_YYABORT; - } - ; - -TEXT_STRING_filesystem: - TEXT_STRING - { - if (thd->make_text_string_filesystem(&$$, &$1)) - MYSQL_YYABORT; - } - ; - -ident_table_alias: - IDENT_sys - | keyword_table_alias - { - if (unlikely($$.copy_keyword(thd, &$1))) - MYSQL_YYABORT; - } - ; - -ident_cli_set_usual_case: - IDENT_cli { $$= $1; } - | keyword_set_usual_case { $$= $1; } - ; - -ident_sysvar_name: - IDENT_sys - | keyword_sysvar_name - { - if (unlikely($$.copy_keyword(thd, &$1))) - MYSQL_YYABORT; - } - | TEXT_STRING_sys - { - if (unlikely($$.copy_sys(thd, &$1))) - MYSQL_YYABORT; - } - ; - - -ident: - IDENT_sys - | keyword_ident - { - if (unlikely($$.copy_keyword(thd, &$1))) - MYSQL_YYABORT; - } - ; - -label_ident: - IDENT_sys - | keyword_label - { - if (unlikely($$.copy_keyword(thd, &$1))) - MYSQL_YYABORT; - } - ; - -ident_or_text: - ident { $$=$1;} - | TEXT_STRING_sys { $$=$1;} - | LEX_HOSTNAME { $$=$1;} - ; - -user_maybe_role: - ident_or_text - { - if (unlikely(!($$=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - $$->user = $1; - - if (unlikely(check_string_char_length(&$$->user, ER_USERNAME, - username_char_length, - system_charset_info, 0))) - MYSQL_YYABORT; - } - | ident_or_text '@' ident_or_text - { - if (unlikely(!($$=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - $$->user = $1; $$->host=$3; - - if (unlikely(check_string_char_length(&$$->user, ER_USERNAME, - username_char_length, - system_charset_info, 0)) || - unlikely(check_host_name(&$$->host))) - MYSQL_YYABORT; - if ($$->host.str[0]) - { - /* - Convert hostname part of username to lowercase. - It's OK to use in-place lowercase as long as - the character set is utf8. - */ - my_casedn_str(system_charset_info, (char*) $$->host.str); - } - else - { - /* - fix historical undocumented convention that empty host is the - same as '%' - */ - $$->host= host_not_specified; - } - } - | CURRENT_USER optional_braces - { - if (unlikely(!($$=(LEX_USER*)thd->calloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - $$->user= current_user; - $$->auth= new (thd->mem_root) USER_AUTH(); - } - ; - -user_or_role: user_maybe_role | current_role; - -user: user_maybe_role - { - if ($1->user.str != current_user.str && $1->host.str == 0) - $1->host= host_not_specified; - $$= $1; - } - ; - -/* Keywords which we allow as table aliases. */ -keyword_table_alias: - keyword_data_type - | keyword_cast_type - | keyword_set_special_case - | keyword_sp_block_section - | keyword_sp_head - | keyword_sp_var_and_label - | keyword_sp_var_not_label - | keyword_sysvar_type - | keyword_verb_clause - | FUNCTION_SYM - | EXCEPTION_ORACLE_SYM - ; - -/* Keyword that we allow for identifiers (except SP labels) */ -keyword_ident: - keyword_data_type - | keyword_cast_type - | keyword_set_special_case - | keyword_sp_block_section - | keyword_sp_head - | keyword_sp_var_and_label - | keyword_sp_var_not_label - | keyword_sysvar_type - | keyword_verb_clause - | FUNCTION_SYM - | WINDOW_SYM - | EXCEPTION_ORACLE_SYM - ; - -keyword_sysvar_name: - keyword_data_type - | keyword_cast_type - | keyword_set_special_case - | keyword_sp_block_section - | keyword_sp_head - | keyword_sp_var_and_label - | keyword_sp_var_not_label - | keyword_verb_clause - | FUNCTION_SYM - | WINDOW_SYM - | EXCEPTION_ORACLE_SYM - ; - -keyword_set_usual_case: - keyword_data_type - | keyword_cast_type - | keyword_sp_block_section - | keyword_sp_head - | keyword_sp_var_and_label - | keyword_sp_var_not_label - | keyword_sysvar_type - | keyword_verb_clause - | FUNCTION_SYM - | WINDOW_SYM - | EXCEPTION_ORACLE_SYM - ; - -non_reserved_keyword_udt: - keyword_sp_var_not_label - | keyword_sp_head - | keyword_verb_clause - | keyword_set_special_case - | keyword_sp_block_section - | keyword_sysvar_type - | keyword_sp_var_and_label - ; - -/* - Keywords that we allow in Oracle-style direct assignments: - xxx := 10; - but do not allow in labels in the default sql_mode: - label: - stmt1; - stmt2; - TODO: check if some of them can migrate to keyword_sp_var_and_label. -*/ -keyword_sp_var_not_label: - ASCII_SYM - | BACKUP_SYM - | BINLOG_SYM - | BYTE_SYM - | CACHE_SYM - | CHECKSUM_SYM - | CHECKPOINT_SYM - | COLUMN_ADD_SYM - | COLUMN_CHECK_SYM - | COLUMN_CREATE_SYM - | COLUMN_DELETE_SYM - | COLUMN_GET_SYM - | COMMENT_SYM - | COMPRESSED_SYM - | DEALLOCATE_SYM - | EXAMINED_SYM - | EXCLUDE_SYM - | EXECUTE_SYM - | FLUSH_SYM - | FOLLOWING_SYM - | FORMAT_SYM - | GET_SYM - | HELP_SYM - | HOST_SYM - | INSTALL_SYM - | OPTION - | OPTIONS_SYM - | OTHERS_MARIADB_SYM - | OWNER_SYM - | PARSER_SYM - | PERIOD_SYM - | PORT_SYM - | PRECEDING_SYM - | PREPARE_SYM - | REMOVE_SYM - | RESET_SYM - | RESTORE_SYM - | SECURITY_SYM - | SERVER_SYM - | SOCKET_SYM - | SLAVE - | SLAVES - | SONAME_SYM - | START_SYM - | STOP_SYM - | STORED_SYM - | TIES_SYM - | UNICODE_SYM - | UNINSTALL_SYM - | UNBOUNDED_SYM - | WITHIN - | WRAPPER_SYM - | XA_SYM - | UPGRADE_SYM - ; - -/* - Keywords that can start optional clauses in SP or trigger declarations - Allowed as identifiers (e.g. table, column names), - but: - - not allowed as SP label names - - not allowed as variable names in Oracle-style assignments: - xxx := 10; - - If we allowed these variables in assignments, there would be conflicts - with SP characteristics, or verb clauses, or compound statements, e.g.: - CREATE PROCEDURE p1 LANGUAGE ... - would be either: - CREATE PROCEDURE p1 LANGUAGE SQL BEGIN END; - or - CREATE PROCEDURE p1 LANGUAGE:=10; - - Note, these variables can still be assigned using quoted identifiers: - `do`:= 10; - "do":= 10; (when ANSI_QUOTES) - or using a SET statement: - SET do= 10; - - Note, some of these keywords are reserved keywords in Oracle. - In case if heavy grammar conflicts are found in the future, - we'll possibly need to make them reserved for sql_mode=ORACLE. - - TODO: Allow these variables as SP lables when sql_mode=ORACLE. - TODO: Allow assigning of "SP characteristics" marked variables - inside compound blocks. - TODO: Allow "follows" and "precedes" as variables in compound blocks: - BEGIN - follows := 10; - END; - as they conflict only with non-block FOR EACH ROW statement: - CREATE TRIGGER .. FOR EACH ROW follows:= 10; - CREATE TRIGGER .. FOR EACH ROW FOLLOWS tr1 a:= 10; -*/ -keyword_sp_head: - CONTAINS_SYM /* SP characteristic */ - | LANGUAGE_SYM /* SP characteristic */ - | NO_SYM /* SP characteristic */ - | CHARSET /* SET CHARSET utf8; */ - | FOLLOWS_SYM /* Conflicts with assignment in FOR EACH */ - | PRECEDES_SYM /* Conflicts with assignment in FOR EACH */ - ; - -/* - Keywords that start a statement. - Generally allowed as identifiers (e.g. table, column names) - - not allowed as SP label names - - not allowed as variable names in Oracle-style assignments: - xxx:=10 -*/ -keyword_verb_clause: - CLOSE_SYM /* Verb clause. Reserved in Oracle */ - | COMMIT_SYM /* Verb clause. Reserved in Oracle */ - | DO_SYM /* Verb clause */ - | HANDLER_SYM /* Verb clause */ - | OPEN_SYM /* Verb clause. Reserved in Oracle */ - | REPAIR /* Verb clause */ - | ROLLBACK_SYM /* Verb clause. Reserved in Oracle */ - | SAVEPOINT_SYM /* Verb clause. Reserved in Oracle */ - | SHUTDOWN /* Verb clause */ - | TRUNCATE_SYM /* Verb clause. Reserved in Oracle */ - ; - -keyword_set_special_case: - NAMES_SYM - | ROLE_SYM - | PASSWORD_SYM - ; - -keyword_sysvar_type: - GLOBAL_SYM - | LOCAL_SYM - | SESSION_SYM - ; - - -/* - These keywords are generally allowed as identifiers, - but not allowed as non-delimited SP variable names in sql_mode=ORACLE. -*/ -keyword_data_type: - BIT_SYM - | BOOLEAN_SYM - | BOOL_SYM - | CLOB_MARIADB_SYM - | CLOB_ORACLE_SYM - | DATE_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 - | DATETIME - | ENUM - | FIXED_SYM - | JSON_SYM - | MEDIUM_SYM - | NATIONAL_SYM - | NCHAR_SYM - | NUMBER_MARIADB_SYM - | NUMBER_ORACLE_SYM - | NVARCHAR_SYM - | RAW_MARIADB_SYM - | RAW_ORACLE_SYM - | ROW_SYM - | SERIAL_SYM - | TEXT_SYM - | TIMESTAMP %prec PREC_BELOW_CONTRACTION_TOKEN2 - | TIME_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 - | VARCHAR2_MARIADB_SYM - | VARCHAR2_ORACLE_SYM - | YEAR_SYM - ; - - -keyword_cast_type: - SIGNED_SYM - ; - - -/* - These keywords are fine for both SP variable names and SP labels. -*/ -keyword_sp_var_and_label: - ACTION - | ACCOUNT_SYM - | ADDDATE_SYM - | ADMIN_SYM - | AFTER_SYM - | AGAINST - | AGGREGATE_SYM - | ALGORITHM_SYM - | ALWAYS_SYM - | ANY_SYM - | AT_SYM - | ATOMIC_SYM - | AUTHORS_SYM - | AUTO_INC - | AUTOEXTEND_SIZE_SYM - | AUTO_SYM - | AVG_ROW_LENGTH - | AVG_SYM - | BLOCK_SYM - | BODY_MARIADB_SYM - | BTREE_SYM - | CASCADED - | CATALOG_NAME_SYM - | CHAIN_SYM - | CHANGED - | CIPHER_SYM - | CLIENT_SYM - | CLASS_ORIGIN_SYM - | COALESCE - | CODE_SYM - | COLLATION_SYM - | COLUMN_NAME_SYM - | COLUMNS - | COMMITTED_SYM - | COMPACT_SYM - | COMPLETION_SYM - | CONCURRENT - | CONNECTION_SYM - | CONSISTENT_SYM - | CONSTRAINT_CATALOG_SYM - | CONSTRAINT_SCHEMA_SYM - | CONSTRAINT_NAME_SYM - | CONTEXT_SYM - | CONTRIBUTORS_SYM - | CURRENT_POS_SYM - | CPU_SYM - | CUBE_SYM - /* - Although a reserved keyword in SQL:2003 (and :2008), - not reserved in MySQL per WL#2111 specification. - */ - | CURRENT_SYM - | CURSOR_NAME_SYM - | CYCLE_SYM - | DATA_SYM - | DATAFILE_SYM - | DATE_FORMAT_SYM - | DAY_SYM - | DECODE_MARIADB_SYM - | DECODE_ORACLE_SYM - | DEFINER_SYM - | DELAY_KEY_WRITE_SYM - | DES_KEY_FILE - | DIAGNOSTICS_SYM - | DIRECTORY_SYM - | DISABLE_SYM - | DISCARD - | DISK_SYM - | DUMPFILE - | DUPLICATE_SYM - | DYNAMIC_SYM - | ELSEIF_ORACLE_SYM - | ELSIF_MARIADB_SYM - | ENDS_SYM - | ENGINE_SYM - | ENGINES_SYM - | ERROR_SYM - | ERRORS - | ESCAPE_SYM - | EVENT_SYM - | EVENTS_SYM - | EVERY_SYM - | EXCEPTION_MARIADB_SYM - | EXCHANGE_SYM - | EXPANSION_SYM - | EXPIRE_SYM - | EXPORT_SYM - | EXTENDED_SYM - | EXTENT_SIZE_SYM - | FAULTS_SYM - | FAST_SYM - | FOUND_SYM - | ENABLE_SYM - | FULL - | FILE_SYM - | FIRST_SYM - | GENERAL - | GENERATED_SYM - | GET_FORMAT - | GRANTS - | GOTO_MARIADB_SYM - | HASH_SYM - | HARD_SYM - | HISTORY_SYM - | HOSTS_SYM - | HOUR_SYM - | ID_SYM - | IDENTIFIED_SYM - | IGNORE_SERVER_IDS_SYM - | INCREMENT_SYM - | IMMEDIATE_SYM - | INVOKER_SYM - | IMPORT - | INDEXES - | INITIAL_SIZE_SYM - | IO_SYM - | IPC_SYM - | ISOLATION - | ISOPEN_SYM - | ISSUER_SYM - | INSERT_METHOD - | INVISIBLE_SYM - | KEY_BLOCK_SIZE - | LAST_VALUE - | LAST_SYM - | LASTVAL_SYM - | LEAVES - | LESS_SYM - | LEVEL_SYM - | LIST_SYM - | LOCKS_SYM - | LOGFILE_SYM - | LOGS_SYM - | MAX_ROWS - | MASTER_SYM - | MASTER_HEARTBEAT_PERIOD_SYM - | MASTER_GTID_POS_SYM - | MASTER_HOST_SYM - | MASTER_PORT_SYM - | MASTER_LOG_FILE_SYM - | MASTER_LOG_POS_SYM - | MASTER_USER_SYM - | MASTER_USE_GTID_SYM - | MASTER_PASSWORD_SYM - | MASTER_SERVER_ID_SYM - | MASTER_CONNECT_RETRY_SYM - | MASTER_DELAY_SYM - | MASTER_SSL_SYM - | MASTER_SSL_CA_SYM - | MASTER_SSL_CAPATH_SYM - | MASTER_SSL_CERT_SYM - | MASTER_SSL_CIPHER_SYM - | MASTER_SSL_CRL_SYM - | MASTER_SSL_CRLPATH_SYM - | MASTER_SSL_KEY_SYM - | MAX_CONNECTIONS_PER_HOUR - | MAX_QUERIES_PER_HOUR - | MAX_SIZE_SYM - | MAX_STATEMENT_TIME_SYM - | MAX_UPDATES_PER_HOUR - | MAX_USER_CONNECTIONS_SYM - | MEMORY_SYM - | MERGE_SYM - | MESSAGE_TEXT_SYM - | MICROSECOND_SYM - | MIGRATE_SYM - | MINUTE_SYM - | MINVALUE_SYM - | MIN_ROWS - | MODIFY_SYM - | MODE_SYM - | MONTH_SYM - | MUTEX_SYM - | MYSQL_SYM - | MYSQL_ERRNO_SYM - | NAME_SYM - | NEVER_SYM - | NEXT_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 - | NEXTVAL_SYM - | NEW_SYM - | NOCACHE_SYM - | NOCYCLE_SYM - | NOMINVALUE_SYM - | NOMAXVALUE_SYM - | NO_WAIT_SYM - | NOWAIT_SYM - | NODEGROUP_SYM - | NONE_SYM - | NOTFOUND_SYM - | OF_SYM - | OFFSET_SYM - | OLD_PASSWORD_SYM - | ONE_SYM - | ONLINE_SYM - | ONLY_SYM - | PACKAGE_MARIADB_SYM - | PACK_KEYS_SYM - | PAGE_SYM - | PARTIAL - | PARTITIONING_SYM - | PARTITIONS_SYM - | PERSISTENT_SYM - | PHASE_SYM - | PLUGIN_SYM - | PLUGINS_SYM - | PRESERVE_SYM - | PREV_SYM - | PREVIOUS_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 - | PRIVILEGES - | PROCESS - | PROCESSLIST_SYM - | PROFILE_SYM - | PROFILES_SYM - | PROXY_SYM - | QUARTER_SYM - | QUERY_SYM - | QUICK - | RAISE_MARIADB_SYM - | READ_ONLY_SYM - | REBUILD_SYM - | RECOVER_SYM - | REDO_BUFFER_SIZE_SYM - | REDOFILE_SYM - | REDUNDANT_SYM - | RELAY - | RELAYLOG_SYM - | RELAY_LOG_FILE_SYM - | RELAY_LOG_POS_SYM - | RELAY_THREAD - | RELOAD - | REORGANIZE_SYM - | REPEATABLE_SYM - | REPLICATION - | RESOURCES - | RESTART_SYM - | RESUME_SYM - | RETURNED_SQLSTATE_SYM - | RETURNS_SYM - | REUSE_SYM - | REVERSE_SYM - | ROLLUP_SYM - | ROUTINE_SYM - | ROWCOUNT_SYM - | ROWTYPE_MARIADB_SYM - | ROW_COUNT_SYM - | ROW_FORMAT_SYM - | RTREE_SYM - | SCHEDULE_SYM - | SCHEMA_NAME_SYM - | SECOND_SYM - | SEQUENCE_SYM - | SERIALIZABLE_SYM - | SETVAL_SYM - | SIMPLE_SYM - | SHARE_SYM - | SLAVE_POS_SYM - | SLOW - | SNAPSHOT_SYM - | SOFT_SYM - | SOUNDS_SYM - | SOURCE_SYM - | SQL_CACHE_SYM - | SQL_BUFFER_RESULT - | SQL_NO_CACHE_SYM - | SQL_THREAD - | STAGE_SYM - | STARTS_SYM - | STATEMENT_SYM - | STATUS_SYM - | STORAGE_SYM - | STRING_SYM - | SUBCLASS_ORIGIN_SYM - | SUBDATE_SYM - | SUBJECT_SYM - | SUBPARTITION_SYM - | SUBPARTITIONS_SYM - | SUPER_SYM - | SUSPEND_SYM - | SWAPS_SYM - | SWITCHES_SYM - | SYSTEM - | SYSTEM_TIME_SYM - | TABLE_NAME_SYM - | TABLES - | TABLE_CHECKSUM_SYM - | TABLESPACE - | TEMPORARY - | TEMPTABLE_SYM - | THAN_SYM - | TRANSACTION_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 - | TRANSACTIONAL_SYM - | TRIGGERS_SYM - | TRIM_ORACLE - | TIMESTAMP_ADD - | TIMESTAMP_DIFF - | TYPES_SYM - | TYPE_SYM - | UDF_RETURNS_SYM - | UNCOMMITTED_SYM - | UNDEFINED_SYM - | UNDO_BUFFER_SIZE_SYM - | UNDOFILE_SYM - | UNKNOWN_SYM - | UNTIL_SYM - | USER_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 - | USE_FRM - | VARIABLES - | VERSIONING_SYM - | VIEW_SYM - | VIRTUAL_SYM - | VALUE_SYM - | WARNINGS - | WAIT_SYM - | WEEK_SYM - | WEIGHT_STRING_SYM - | WITHOUT - | WORK_SYM - | X509_SYM - | XML_SYM - | VIA_SYM - ; - - -reserved_keyword_udt_not_param_type: - ACCESSIBLE_SYM - | ADD - | ALL - | ALTER - | ANALYZE_SYM - | AND_SYM - | AS - | ASC - | ASENSITIVE_SYM - | BEFORE_SYM - | BETWEEN_SYM - | BIT_AND - | BIT_OR - | BIT_XOR - | BODY_ORACLE_SYM - | BOTH - | BY - | CALL_SYM - | CASCADE - | CASE_SYM - | CAST_SYM - | CHANGE - | CHECK_SYM - | COLLATE_SYM - | CONSTRAINT - | CONTINUE_MARIADB_SYM - | CONTINUE_ORACLE_SYM - | CONVERT_SYM - | COUNT_SYM - | CREATE - | CROSS - | CUME_DIST_SYM - | CURDATE - | CURRENT_USER - | CURRENT_ROLE - | CURTIME - | DATABASE - | DATABASES - | DATE_ADD_INTERVAL - | DATE_SUB_INTERVAL - | DAY_HOUR_SYM - | DAY_MICROSECOND_SYM - | DAY_MINUTE_SYM - | DAY_SECOND_SYM - | DECLARE_MARIADB_SYM - | DECLARE_ORACLE_SYM - | DEFAULT - | DELETE_DOMAIN_ID_SYM - | DELETE_SYM - | DENSE_RANK_SYM - | DESC - | DESCRIBE - | DETERMINISTIC_SYM - | DISTINCT - | DIV_SYM - | DO_DOMAIN_IDS_SYM - | DROP - | DUAL_SYM - | EACH_SYM - | ELSE - | ELSEIF_MARIADB_SYM - | ELSIF_ORACLE_SYM - | ENCLOSED - | ESCAPED - | EXCEPT_SYM - | EXISTS - | EXTRACT_SYM - | FALSE_SYM - | FETCH_SYM - | FIRST_VALUE_SYM - | FOREIGN - | FROM - | FULLTEXT_SYM - | GOTO_ORACLE_SYM - | GRANT - | GROUP_SYM - | GROUP_CONCAT_SYM - | LAG_SYM - | LEAD_SYM - | HAVING - | HOUR_MICROSECOND_SYM - | HOUR_MINUTE_SYM - | HOUR_SECOND_SYM - | IF_SYM - | IGNORE_DOMAIN_IDS_SYM - | IGNORE_SYM - | INDEX_SYM - | INFILE - | INNER_SYM - | INSENSITIVE_SYM - | INSERT - | INTERSECT_SYM - | INTERVAL_SYM - | INTO - | IS - | ITERATE_SYM - | JOIN_SYM - | KEYS - | KEY_SYM - | KILL_SYM - | LEADING - | LEAVE_SYM - | LEFT - | LIKE - | LIMIT - | LINEAR_SYM - | LINES - | LOAD - | LOCATOR_SYM - | LOCK_SYM - | LOOP_SYM - | LOW_PRIORITY - | MASTER_SSL_VERIFY_SERVER_CERT_SYM - | MATCH - | MAX_SYM - | MAXVALUE_SYM - | MEDIAN_SYM - | MINUTE_MICROSECOND_SYM - | MINUTE_SECOND_SYM - | MIN_SYM - | MODIFIES_SYM - | MOD_SYM - | NATURAL - | NEG - | NOT_SYM - | NOW_SYM - | NO_WRITE_TO_BINLOG - | NTILE_SYM - | NULL_SYM - | NTH_VALUE_SYM - | ON - | OPTIMIZE - | OPTIONALLY - | ORDER_SYM - | OR_SYM - | OTHERS_ORACLE_SYM - | OUTER - | OUTFILE - | OVER_SYM - | PACKAGE_ORACLE_SYM - | PAGE_CHECKSUM_SYM - | PARSE_VCOL_EXPR_SYM - | PARTITION_SYM - | PERCENT_RANK_SYM - | PERCENTILE_CONT_SYM - | PERCENTILE_DISC_SYM - | PORTION_SYM - | POSITION_SYM - | PRECISION - | PRIMARY_SYM - | PROCEDURE_SYM - | PURGE - | RAISE_ORACLE_SYM - | RANGE_SYM - | RANK_SYM - | READS_SYM - | READ_SYM - | READ_WRITE_SYM - | RECURSIVE_SYM - | REF_SYSTEM_ID_SYM - | REFERENCES - | REGEXP - | RELEASE_SYM - | RENAME - | REPEAT_SYM - | REPLACE - | REQUIRE_SYM - | RESIGNAL_SYM - | RESTRICT - | RETURNING_SYM - | RETURN_MARIADB_SYM - | RETURN_ORACLE_SYM - | REVOKE - | RIGHT - | ROWS_SYM - | ROWTYPE_ORACLE_SYM - | ROW_NUMBER_SYM - | SECOND_MICROSECOND_SYM - | SELECT_SYM - | SENSITIVE_SYM - | SEPARATOR_SYM - | SERVER_OPTIONS - | SHOW - | SIGNAL_SYM - | SPATIAL_SYM - | SPECIFIC_SYM - | SQLEXCEPTION_SYM - | SQLSTATE_SYM - | SQLWARNING_SYM - | SQL_BIG_RESULT - | SQL_SMALL_RESULT - | SQL_SYM - | SSL_SYM - | STARTING - | STATS_AUTO_RECALC_SYM - | STATS_PERSISTENT_SYM - | STATS_SAMPLE_PAGES_SYM - | STDDEV_SAMP_SYM - | STD_SYM - | STRAIGHT_JOIN - | SUBSTRING - | SUM_SYM - | SYSDATE - | TABLE_REF_PRIORITY - | TABLE_SYM - | TERMINATED - | THEN_SYM - | TO_SYM - | TRAILING - | TRIGGER_SYM - | TRIM - | TRUE_SYM - | UNDO_SYM - | UNION_SYM - | UNIQUE_SYM - | UNLOCK_SYM - | UPDATE_SYM - | USAGE - | USE_SYM - | USING - | UTC_DATE_SYM - | UTC_TIMESTAMP_SYM - | UTC_TIME_SYM - | VALUES - | VALUES_IN_SYM - | VALUES_LESS_SYM - | VARIANCE_SYM - | VARYING - | VAR_SAMP_SYM - | WHEN_SYM - | WHERE - | WHILE_SYM - | WITH - | XOR - | YEAR_MONTH_SYM - | ZEROFILL - ; - -/* - SQLCOM_SET_OPTION statement. - - Note that to avoid shift/reduce conflicts, we have separate rules for the - first option listed in the statement. -*/ - -set: - SET - { - LEX *lex=Lex; - if (lex->main_select_push()) - MYSQL_YYABORT; - lex->set_stmt_init(); - } - set_param - stmt_end {} - ; - -set_param: - option_value_no_option_type - | option_value_no_option_type ',' option_value_list - | TRANSACTION_SYM - { - Lex->option_type= OPT_DEFAULT; - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - transaction_characteristics - { - if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | option_type - { - Lex->option_type= $1; - } - start_option_value_list_following_option_type - | STATEMENT_SYM - set_stmt_option_list - { - LEX *lex= Lex; - if (unlikely(lex->table_or_sp_used())) - my_yyabort_error((ER_SUBQUERIES_NOT_SUPPORTED, MYF(0), "SET STATEMENT")); - lex->stmt_var_list= lex->var_list; - lex->var_list.empty(); - if (Lex->check_main_unit_semantics()) - MYSQL_YYABORT; - } - FOR_SYM directly_executable_statement - ; - -set_stmt_option_list: - /* - Only system variables can be used here. If this condition is changed - please check careful code under lex->option_type == OPT_STATEMENT - condition on wrong type casts. - */ - set_stmt_option - | set_stmt_option_list ',' set_stmt_option - ; - -/* Start of option value list, option_type was given */ -start_option_value_list_following_option_type: - option_value_following_option_type - | option_value_following_option_type ',' option_value_list - | TRANSACTION_SYM - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - transaction_characteristics - { - if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - ; - -/* Repeating list of option values after first option value. */ -option_value_list: - option_value - | option_value_list ',' option_value - ; - -/* Wrapper around option values following the first option value in the stmt. */ -option_value: - option_type - { - Lex->option_type= $1; - } - option_value_following_option_type - | option_value_no_option_type - ; - -option_type: - GLOBAL_SYM { $$=OPT_GLOBAL; } - | LOCAL_SYM { $$=OPT_SESSION; } - | SESSION_SYM { $$=OPT_SESSION; } - ; - -opt_var_type: - /* empty */ { $$=OPT_SESSION; } - | GLOBAL_SYM { $$=OPT_GLOBAL; } - | LOCAL_SYM { $$=OPT_SESSION; } - | SESSION_SYM { $$=OPT_SESSION; } - ; - -opt_var_ident_type: - /* empty */ { $$=OPT_DEFAULT; } - | GLOBAL_SYM '.' { $$=OPT_GLOBAL; } - | LOCAL_SYM '.' { $$=OPT_SESSION; } - | SESSION_SYM '.' { $$=OPT_SESSION; } - ; - -/* - SET STATEMENT options do not need their own LEX or Query_arena. - Let's put them to the main ones. -*/ -set_stmt_option: - ident_cli equal set_expr_or_default - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->set_system_variable(Lex->option_type, &tmp, $3))) - MYSQL_YYABORT; - } - | ident_cli '.' ident equal set_expr_or_default - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->set_system_variable(thd, Lex->option_type, &tmp, &$3, $5))) - MYSQL_YYABORT; - } - | DEFAULT '.' ident equal set_expr_or_default - { - if (unlikely(Lex->set_default_system_variable(Lex->option_type, &$3, $5))) - MYSQL_YYABORT; - } - ; - - -/* Option values with preceding option_type. */ -option_value_following_option_type: - ident_cli equal - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->set_system_variable(Lex->option_type, &tmp, $4)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | ident_cli '.' ident equal - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->set_system_variable(thd, Lex->option_type, &tmp, &$3, $6)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | DEFAULT '.' ident equal - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - if (unlikely(Lex->set_default_system_variable(Lex->option_type, &$3, $6)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - ; - -/* Option values without preceding option_type. */ -option_value_no_option_type: - ident_cli_set_usual_case equal - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->set_variable(&tmp, $4)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | ident_cli_set_usual_case '.' ident equal - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->set_variable(&tmp, &$3, $6)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | DEFAULT '.' ident equal - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - if (unlikely(Lex->set_default_system_variable(Lex->option_type, &$3, $6))) - MYSQL_YYABORT; - if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | '@' ident_or_text equal - { - if (sp_create_assignment_lex(thd, $1.str)) - MYSQL_YYABORT; - } - expr - { - if (unlikely(Lex->set_user_variable(thd, &$2, $5)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | '@' '@' opt_var_ident_type ident_sysvar_name equal - { - if (sp_create_assignment_lex(thd, $1.str)) - MYSQL_YYABORT; - } - set_expr_or_default - { - if (unlikely(Lex->set_system_variable($3, &$4, $7)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | '@' '@' opt_var_ident_type ident_sysvar_name '.' ident equal - { - if (sp_create_assignment_lex(thd, $1.str)) - MYSQL_YYABORT; - } - set_expr_or_default - { - if (unlikely(Lex->set_system_variable(thd, $3, &$4, &$6, $9)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | '@' '@' opt_var_ident_type DEFAULT '.' ident equal - { - if (sp_create_assignment_lex(thd, $1.str)) - MYSQL_YYABORT; - } - set_expr_or_default - { - if (unlikely(Lex->set_default_system_variable($3, &$6, $9)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | charset old_or_new_charset_name_or_default - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - LEX *lex= thd->lex; - CHARSET_INFO *cs2; - cs2= $2 ? $2: global_system_variables.character_set_client; - set_var_collation_client *var; - var= (new (thd->mem_root) - set_var_collation_client(cs2, - thd->variables.collation_database, - cs2)); - if (unlikely(var == NULL)) - MYSQL_YYABORT; - lex->var_list.push_back(var, thd->mem_root); - if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | NAMES_SYM equal expr - { - LEX *lex= Lex; - sp_pcontext *spc= lex->spcont; - LEX_CSTRING names= { STRING_WITH_LEN("names") }; - if (unlikely(spc && spc->find_variable(&names, false))) - my_error(ER_SP_BAD_VAR_SHADOW, MYF(0), names.str); - else - thd->parse_error(); - MYSQL_YYABORT; - } - | NAMES_SYM charset_name_or_default opt_collate - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - LEX *lex= Lex; - CHARSET_INFO *cs2; - CHARSET_INFO *cs3; - cs2= $2 ? $2 : global_system_variables.character_set_client; - cs3= $3 ? $3 : cs2; - if (unlikely(!my_charset_same(cs2, cs3))) - { - my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), - cs3->name, cs2->csname); - MYSQL_YYABORT; - } - set_var_collation_client *var; - var= new (thd->mem_root) set_var_collation_client(cs3, cs3, cs3); - if (unlikely(var == NULL) || - unlikely(lex->var_list.push_back(var, thd->mem_root)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | DEFAULT ROLE_SYM grant_role - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - LEX *lex = Lex; - LEX_USER *user; - if (unlikely(!(user=(LEX_USER *) thd->calloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - user->user= current_user; - set_var_default_role *var= (new (thd->mem_root) - set_var_default_role(user, - $3->user)); - if (unlikely(var == NULL) || - unlikely(lex->var_list.push_back(var, thd->mem_root))) - MYSQL_YYABORT; - - thd->lex->autocommit= TRUE; - if (lex->sphead) - lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; - if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | DEFAULT ROLE_SYM grant_role FOR_SYM user - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - LEX *lex = Lex; - set_var_default_role *var= (new (thd->mem_root) - set_var_default_role($5, $3->user)); - if (unlikely(var == NULL) || - unlikely(lex->var_list.push_back(var, thd->mem_root))) - MYSQL_YYABORT; - thd->lex->autocommit= TRUE; - if (lex->sphead) - lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; - if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | ROLE_SYM ident_or_text - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - LEX *lex = Lex; - set_var_role *var= new (thd->mem_root) set_var_role($2); - if (unlikely(var == NULL) || - unlikely(lex->var_list.push_back(var, thd->mem_root)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | ROLE_SYM equal - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->set_variable(&tmp, $4)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - | PASSWORD_SYM opt_for_user text_or_password - { - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - LEX *lex = Lex; - set_var_password *var= (new (thd->mem_root) - set_var_password(lex->definer)); - if (unlikely(var == NULL) || - unlikely(lex->var_list.push_back(var, thd->mem_root))) - MYSQL_YYABORT; - lex->autocommit= TRUE; - if (lex->sphead) - lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; - if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) - MYSQL_YYABORT; - } - ; - - -transaction_characteristics: - transaction_access_mode - | isolation_level - | transaction_access_mode ',' isolation_level - | isolation_level ',' transaction_access_mode - ; - -transaction_access_mode: - transaction_access_mode_types - { - LEX *lex=Lex; - Item *item= new (thd->mem_root) Item_int(thd, (int32) $1); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - set_var *var= (new (thd->mem_root) - set_var(thd, lex->option_type, - find_sys_var(thd, "tx_read_only"), - &null_clex_str, - item)); - if (unlikely(var == NULL)) - MYSQL_YYABORT; - if (unlikely(lex->var_list.push_back(var, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -isolation_level: - ISOLATION LEVEL_SYM isolation_types - { - LEX *lex=Lex; - Item *item= new (thd->mem_root) Item_int(thd, (int32) $3); - if (unlikely(item == NULL)) - MYSQL_YYABORT; - set_var *var= (new (thd->mem_root) - set_var(thd, lex->option_type, - find_sys_var(thd, "tx_isolation"), - &null_clex_str, - item)); - if (unlikely(var == NULL) || - unlikely(lex->var_list.push_back(var, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -transaction_access_mode_types: - READ_SYM ONLY_SYM { $$= true; } - | READ_SYM WRITE_SYM { $$= false; } - ; - -isolation_types: - READ_SYM UNCOMMITTED_SYM { $$= ISO_READ_UNCOMMITTED; } - | READ_SYM COMMITTED_SYM { $$= ISO_READ_COMMITTED; } - | REPEATABLE_SYM READ_SYM { $$= ISO_REPEATABLE_READ; } - | SERIALIZABLE_SYM { $$= ISO_SERIALIZABLE; } - ; - -opt_for_user: - equal - { - LEX *lex= thd->lex; - sp_pcontext *spc= lex->spcont; - LEX_CSTRING pw= { STRING_WITH_LEN("password") }; - - if (unlikely(spc && spc->find_variable(&pw, false))) - my_yyabort_error((ER_SP_BAD_VAR_SHADOW, MYF(0), pw.str)); - if (unlikely(!(lex->definer= (LEX_USER*) - thd->calloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - lex->definer->user= current_user; - lex->definer->auth= new (thd->mem_root) USER_AUTH(); - } - | FOR_SYM user equal { Lex->definer= $2; } - ; - -text_or_password: - TEXT_STRING - { - Lex->definer->auth= new (thd->mem_root) USER_AUTH(); - Lex->definer->auth->auth_str= $1; - } - | PASSWORD_SYM '(' TEXT_STRING ')' - { - Lex->definer->auth= new (thd->mem_root) USER_AUTH(); - Lex->definer->auth->pwtext= $3; - } - | OLD_PASSWORD_SYM '(' TEXT_STRING ')' - { - Lex->definer->auth= new (thd->mem_root) USER_AUTH(); - Lex->definer->auth->pwtext= $3; - Lex->definer->auth->auth_str.str= Item_func_password::alloc(thd, - $3.str, $3.length, Item_func_password::OLD); - Lex->definer->auth->auth_str.length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; - } - ; - -set_expr_or_default: - expr { $$=$1; } - | DEFAULT { $$=0; } - | ON - { - $$=new (thd->mem_root) Item_string_sys(thd, "ON", 2); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ALL - { - $$=new (thd->mem_root) Item_string_sys(thd, "ALL", 3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | BINARY - { - $$=new (thd->mem_root) Item_string_sys(thd, "binary", 6); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - ; - -/* Lock function */ - -lock: - LOCK_SYM table_or_tables - { - LEX *lex= Lex; - - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "LOCK")); - lex->sql_command= SQLCOM_LOCK_TABLES; - } - table_lock_list opt_lock_wait_timeout - {} - ; - -opt_lock_wait_timeout: - /* empty */ - {} - | WAIT_SYM ulong_num - { - if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), $2)) || - unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), $2))) - MYSQL_YYABORT; - } - | NOWAIT_SYM - { - if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), 0)) || - unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), 0))) - MYSQL_YYABORT; - } - ; - -table_or_tables: - TABLE_SYM { } - | TABLES { } - ; - -table_lock_list: - table_lock - | table_lock_list ',' table_lock - ; - -table_lock: - table_ident opt_table_alias_clause lock_option - { - thr_lock_type lock_type= (thr_lock_type) $3; - bool lock_for_write= (lock_type >= TL_WRITE_ALLOW_WRITE); - ulong table_options= lock_for_write ? TL_OPTION_UPDATING : 0; - enum_mdl_type mdl_type= !lock_for_write - ? MDL_SHARED_READ - : lock_type == TL_WRITE_CONCURRENT_INSERT - ? MDL_SHARED_WRITE - : MDL_SHARED_NO_READ_WRITE; - - if (unlikely(!Lex->current_select_or_default()-> - add_table_to_list(thd, $1, $2, table_options, - lock_type, mdl_type))) - MYSQL_YYABORT; - } - ; - -lock_option: - READ_SYM { $$= TL_READ_NO_INSERT; } - | WRITE_SYM { $$= TL_WRITE_DEFAULT; } - | WRITE_SYM CONCURRENT - { - $$= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); - } - - | LOW_PRIORITY WRITE_SYM { $$= TL_WRITE_LOW_PRIORITY; } - | READ_SYM LOCAL_SYM { $$= TL_READ; } - ; - -unlock: - UNLOCK_SYM - { - LEX *lex= Lex; - - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "UNLOCK")); - lex->sql_command= SQLCOM_UNLOCK_TABLES; - } - table_or_tables - {} - ; - -/* -** Handler: direct access to ISAM functions -*/ - -handler: - HANDLER_SYM - { - if (Lex->main_select_push()) - MYSQL_YYABORT; - } - handler_tail - { - Lex->pop_select(); //main select - } - ; - -handler_tail: - table_ident OPEN_SYM opt_table_alias_clause - { - LEX *lex= Lex; - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); - lex->sql_command = SQLCOM_HA_OPEN; - if (!lex->current_select->add_table_to_list(thd, $1, $3, 0)) - MYSQL_YYABORT; - } - | table_ident_nodb CLOSE_SYM - { - LEX *lex= Lex; - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); - lex->sql_command = SQLCOM_HA_CLOSE; - if (!lex->current_select->add_table_to_list(thd, $1, 0, 0)) - MYSQL_YYABORT; - } - | table_ident_nodb READ_SYM - { - LEX *lex=Lex; - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); - lex->clause_that_disallows_subselect= "HANDLER..READ"; - lex->sql_command = SQLCOM_HA_READ; - lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ - Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); - if (unlikely(one == NULL)) - MYSQL_YYABORT; - lex->current_select->select_limit= one; - lex->current_select->offset_limit= 0; - lex->limit_rows_examined= 0; - if (!lex->current_select->add_table_to_list(thd, $1, 0, 0)) - MYSQL_YYABORT; - } - handler_read_or_scan opt_where_clause opt_global_limit_clause - { - LEX *lex=Lex; - lex->clause_that_disallows_subselect= NULL; - if (!lex->current_select->explicit_limit) - { - Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); - if (one == NULL) - MYSQL_YYABORT; - lex->current_select->select_limit= one; - lex->current_select->offset_limit= 0; - lex->limit_rows_examined= 0; - } - /* Stored functions are not supported for HANDLER READ. */ - if (lex->uses_stored_routines()) - { - my_error(ER_NOT_SUPPORTED_YET, MYF(0), - "stored functions in HANDLER ... READ"); - MYSQL_YYABORT; - } - } - ; - -handler_read_or_scan: - handler_scan_function { Lex->ident= null_clex_str; } - | ident handler_rkey_function { Lex->ident= $1; } - ; - -handler_scan_function: - FIRST_SYM { Lex->ha_read_mode = RFIRST; } - | NEXT_SYM { Lex->ha_read_mode = RNEXT; } - ; - -handler_rkey_function: - FIRST_SYM { Lex->ha_read_mode = RFIRST; } - | NEXT_SYM { Lex->ha_read_mode = RNEXT; } - | PREV_SYM { Lex->ha_read_mode = RPREV; } - | LAST_SYM { Lex->ha_read_mode = RLAST; } - | handler_rkey_mode - { - LEX *lex=Lex; - lex->ha_read_mode = RKEY; - lex->ha_rkey_mode=$1; - if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item))) - MYSQL_YYABORT; - } - '(' values ')' - {} - ; - -handler_rkey_mode: - '=' { $$=HA_READ_KEY_EXACT; } - | GE { $$=HA_READ_KEY_OR_NEXT; } - | LE { $$=HA_READ_KEY_OR_PREV; } - | '>' { $$=HA_READ_AFTER_KEY; } - | '<' { $$=HA_READ_BEFORE_KEY; } - ; - -/* GRANT / REVOKE */ - -revoke: - REVOKE clear_privileges revoke_command - {} - ; - -revoke_command: - grant_privileges ON opt_table grant_ident FROM user_and_role_list - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_REVOKE; - lex->type= 0; - } - | grant_privileges ON FUNCTION_SYM grant_ident FROM user_and_role_list - { - if (unlikely(Lex->add_grant_command(thd, SQLCOM_REVOKE, - TYPE_ENUM_FUNCTION))) - MYSQL_YYABORT; - } - | grant_privileges ON PROCEDURE_SYM grant_ident FROM user_and_role_list - { - if (unlikely(Lex->add_grant_command(thd, SQLCOM_REVOKE, - TYPE_ENUM_PROCEDURE))) - MYSQL_YYABORT; - } - | grant_privileges ON PACKAGE_ORACLE_SYM grant_ident - FROM user_and_role_list - { - if (unlikely(Lex->add_grant_command(thd, SQLCOM_REVOKE, - TYPE_ENUM_PACKAGE))) - MYSQL_YYABORT; - } - | grant_privileges ON PACKAGE_ORACLE_SYM BODY_ORACLE_SYM grant_ident - FROM user_and_role_list - { - if (unlikely(Lex->add_grant_command(thd, SQLCOM_REVOKE, - TYPE_ENUM_PACKAGE_BODY))) - MYSQL_YYABORT; - } - | ALL opt_privileges ',' GRANT OPTION FROM user_and_role_list - { - Lex->sql_command = SQLCOM_REVOKE_ALL; - } - | PROXY_SYM ON user FROM user_list - { - LEX *lex= Lex; - lex->users_list.push_front ($3); - lex->sql_command= SQLCOM_REVOKE; - lex->type= TYPE_ENUM_PROXY; - } - | admin_option_for_role FROM user_and_role_list - { - Lex->sql_command= SQLCOM_REVOKE_ROLE; - if (unlikely(Lex->users_list.push_front($1, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -admin_option_for_role: - ADMIN_SYM OPTION FOR_SYM grant_role - { Lex->with_admin_option= true; $$= $4; } - | grant_role - { Lex->with_admin_option= false; $$= $1; } - ; - -grant: - GRANT clear_privileges grant_command - {} - ; - -grant_command: - grant_privileges ON opt_table grant_ident TO_SYM grant_list - opt_require_clause opt_grant_options - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_GRANT; - lex->type= 0; - } - | grant_privileges ON FUNCTION_SYM grant_ident TO_SYM grant_list - opt_require_clause opt_grant_options - { - if (unlikely(Lex->add_grant_command(thd, SQLCOM_GRANT, - TYPE_ENUM_FUNCTION))) - MYSQL_YYABORT; - } - | grant_privileges ON PROCEDURE_SYM grant_ident TO_SYM grant_list - opt_require_clause opt_grant_options - { - if (unlikely(Lex->add_grant_command(thd, SQLCOM_GRANT, - TYPE_ENUM_PROCEDURE))) - MYSQL_YYABORT; - } - | grant_privileges ON PACKAGE_ORACLE_SYM grant_ident TO_SYM grant_list - opt_require_clause opt_grant_options - { - if (unlikely(Lex->add_grant_command(thd, SQLCOM_GRANT, - TYPE_ENUM_PACKAGE))) - MYSQL_YYABORT; - } - | grant_privileges ON PACKAGE_ORACLE_SYM BODY_ORACLE_SYM grant_ident TO_SYM grant_list - opt_require_clause opt_grant_options - { - if (unlikely(Lex->add_grant_command(thd, SQLCOM_GRANT, - TYPE_ENUM_PACKAGE_BODY))) - MYSQL_YYABORT; - } - | PROXY_SYM ON user TO_SYM grant_list opt_grant_option - { - LEX *lex= Lex; - lex->users_list.push_front ($3); - lex->sql_command= SQLCOM_GRANT; - lex->type= TYPE_ENUM_PROXY; - } - | grant_role TO_SYM grant_list opt_with_admin_option - { - LEX *lex= Lex; - lex->sql_command= SQLCOM_GRANT_ROLE; - /* The first role is the one that is granted */ - if (unlikely(Lex->users_list.push_front($1, thd->mem_root))) - MYSQL_YYABORT; - } - - ; - -opt_with_admin: - /* nothing */ { Lex->definer = 0; } - | WITH ADMIN_SYM user_or_role { Lex->definer = $3; } - ; - -opt_with_admin_option: - /* nothing */ { Lex->with_admin_option= false; } - | WITH ADMIN_SYM OPTION { Lex->with_admin_option= true; } - ; - -role_list: - grant_role - { - if (unlikely(Lex->users_list.push_back($1, thd->mem_root))) - MYSQL_YYABORT; - } - | role_list ',' grant_role - { - if (unlikely(Lex->users_list.push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -current_role: - CURRENT_ROLE optional_braces - { - if (unlikely(!($$=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - $$->user= current_role; - $$->auth= NULL; - } - ; - -grant_role: - ident_or_text - { - CHARSET_INFO *cs= system_charset_info; - /* trim end spaces (as they'll be lost in mysql.user anyway) */ - $1.length= cs->cset->lengthsp(cs, $1.str, $1.length); - ((char*) $1.str)[$1.length] = '\0'; - if (unlikely($1.length == 0)) - my_yyabort_error((ER_INVALID_ROLE, MYF(0), "")); - if (unlikely(!($$=(LEX_USER*) thd->alloc(sizeof(LEX_USER))))) - MYSQL_YYABORT; - $$->user= $1; - $$->host= empty_clex_str; - $$->auth= NULL; - - if (unlikely(check_string_char_length(&$$->user, ER_USERNAME, - username_char_length, - cs, 0))) - MYSQL_YYABORT; - } - | current_role - ; - -opt_table: - /* Empty */ - | TABLE_SYM - ; - -grant_privileges: - object_privilege_list {} - | ALL opt_privileges - { - Lex->all_privileges= 1; - Lex->grant= GLOBAL_ACLS; - } - ; - -opt_privileges: - /* empty */ - | PRIVILEGES - ; - -object_privilege_list: - object_privilege - | object_privilege_list ',' object_privilege - ; - -object_privilege: - SELECT_SYM - { Lex->which_columns = SELECT_ACL;} - opt_column_list {} - | INSERT - { Lex->which_columns = INSERT_ACL;} - opt_column_list {} - | UPDATE_SYM - { Lex->which_columns = UPDATE_ACL; } - opt_column_list {} - | REFERENCES - { Lex->which_columns = REFERENCES_ACL;} - opt_column_list {} - | DELETE_SYM { Lex->grant |= DELETE_ACL;} - | USAGE {} - | INDEX_SYM { Lex->grant |= INDEX_ACL;} - | ALTER { Lex->grant |= ALTER_ACL;} - | CREATE { Lex->grant |= CREATE_ACL;} - | DROP { Lex->grant |= DROP_ACL;} - | EXECUTE_SYM { Lex->grant |= EXECUTE_ACL;} - | RELOAD { Lex->grant |= RELOAD_ACL;} - | SHUTDOWN { Lex->grant |= SHUTDOWN_ACL;} - | PROCESS { Lex->grant |= PROCESS_ACL;} - | FILE_SYM { Lex->grant |= FILE_ACL;} - | GRANT OPTION { Lex->grant |= GRANT_ACL;} - | SHOW DATABASES { Lex->grant |= SHOW_DB_ACL;} - | SUPER_SYM { Lex->grant |= SUPER_ACL;} - | CREATE TEMPORARY TABLES { Lex->grant |= CREATE_TMP_ACL;} - | LOCK_SYM TABLES { Lex->grant |= LOCK_TABLES_ACL; } - | REPLICATION SLAVE { Lex->grant |= REPL_SLAVE_ACL; } - | REPLICATION CLIENT_SYM { Lex->grant |= REPL_CLIENT_ACL; } - | CREATE VIEW_SYM { Lex->grant |= CREATE_VIEW_ACL; } - | SHOW VIEW_SYM { Lex->grant |= SHOW_VIEW_ACL; } - | CREATE ROUTINE_SYM { Lex->grant |= CREATE_PROC_ACL; } - | ALTER ROUTINE_SYM { Lex->grant |= ALTER_PROC_ACL; } - | CREATE USER_SYM { Lex->grant |= CREATE_USER_ACL; } - | EVENT_SYM { Lex->grant |= EVENT_ACL;} - | TRIGGER_SYM { Lex->grant |= TRIGGER_ACL; } - | CREATE TABLESPACE { Lex->grant |= CREATE_TABLESPACE_ACL; } - | DELETE_SYM HISTORY_SYM { Lex->grant |= DELETE_HISTORY_ACL; } - ; - -opt_and: - /* empty */ {} - | AND_SYM {} - ; - -require_list: - require_list_element opt_and require_list - | require_list_element - ; - -require_list_element: - SUBJECT_SYM TEXT_STRING - { - LEX *lex=Lex; - if (lex->account_options.x509_subject.str) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SUBJECT")); - lex->account_options.x509_subject= $2; - } - | ISSUER_SYM TEXT_STRING - { - LEX *lex=Lex; - if (lex->account_options.x509_issuer.str) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "ISSUER")); - lex->account_options.x509_issuer= $2; - } - | CIPHER_SYM TEXT_STRING - { - LEX *lex=Lex; - if (lex->account_options.ssl_cipher.str) - my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CIPHER")); - lex->account_options.ssl_cipher= $2; - } - ; - -grant_ident: - '*' - { - LEX *lex= Lex; - if (unlikely(lex->copy_db_to(&lex->current_select->db))) - MYSQL_YYABORT; - if (lex->grant == GLOBAL_ACLS) - lex->grant = DB_ACLS & ~GRANT_ACL; - else if (unlikely(lex->columns.elements)) - my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); - } - | ident '.' '*' - { - LEX *lex= Lex; - lex->current_select->db= $1; - if (lex->grant == GLOBAL_ACLS) - lex->grant = DB_ACLS & ~GRANT_ACL; - else if (unlikely(lex->columns.elements)) - my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); - } - | '*' '.' '*' - { - LEX *lex= Lex; - lex->current_select->db= null_clex_str; - if (lex->grant == GLOBAL_ACLS) - lex->grant= GLOBAL_ACLS & ~GRANT_ACL; - else if (unlikely(lex->columns.elements)) - my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); - } - | table_ident - { - LEX *lex=Lex; - if (unlikely(!lex->current_select-> - add_table_to_list(thd, $1,NULL, - TL_OPTION_UPDATING))) - MYSQL_YYABORT; - if (lex->grant == GLOBAL_ACLS) - lex->grant = TABLE_ACLS & ~GRANT_ACL; - } - ; - -user_list: - user - { - if (unlikely(Lex->users_list.push_back($1, thd->mem_root))) - MYSQL_YYABORT; - } - | user_list ',' user - { - if (unlikely(Lex->users_list.push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -grant_list: - grant_user - { - if (unlikely(Lex->users_list.push_back($1, thd->mem_root))) - MYSQL_YYABORT; - } - | grant_list ',' grant_user - { - if (unlikely(Lex->users_list.push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -user_and_role_list: - user_or_role - { - if (unlikely(Lex->users_list.push_back($1, thd->mem_root))) - MYSQL_YYABORT; - } - | user_and_role_list ',' user_or_role - { - if (unlikely(Lex->users_list.push_back($3, thd->mem_root))) - MYSQL_YYABORT; - } - ; - -via_or_with: VIA_SYM | WITH ; -using_or_as: USING | AS ; - -grant_user: - user IDENTIFIED_SYM BY TEXT_STRING - { - $$= $1; - $1->auth= new (thd->mem_root) USER_AUTH(); - $1->auth->pwtext= $4; - } - | user IDENTIFIED_SYM BY PASSWORD_SYM TEXT_STRING - { - $$= $1; - $1->auth= new (thd->mem_root) USER_AUTH(); - $1->auth->auth_str= $5; - } - | user IDENTIFIED_SYM via_or_with auth_expression - { - $$= $1; - $1->auth= $4; - } - | user_or_role - { - $$= $1; - } - ; - -auth_expression: - auth_token OR_SYM auth_expression - { - $$= $1; - DBUG_ASSERT($$->next == NULL); - $$->next= $3; - } - | auth_token - { - $$= $1; - } - ; - -auth_token: - ident_or_text opt_auth_str - { - $$= $2; - $$->plugin= $1; - } - ; - -opt_auth_str: - /* empty */ - { - if (!($$=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) - MYSQL_YYABORT; - } - | using_or_as TEXT_STRING_sys - { - if (!($$=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) - MYSQL_YYABORT; - $$->auth_str= $2; - } - | using_or_as PASSWORD_SYM '(' TEXT_STRING ')' - { - if (!($$=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) - MYSQL_YYABORT; - $$->pwtext= $4; - } - ; - -opt_column_list: - /* empty */ - { - LEX *lex=Lex; - lex->grant |= lex->which_columns; - } - | '(' column_list ')' { } - ; - -column_list: - column_list ',' column_list_id - | column_list_id - ; - -column_list_id: - ident - { - String *new_str= new (thd->mem_root) String((const char*) $1.str,$1.length,system_charset_info); - if (unlikely(new_str == NULL)) - MYSQL_YYABORT; - List_iterator <LEX_COLUMN> iter(Lex->columns); - class LEX_COLUMN *point; - LEX *lex=Lex; - while ((point=iter++)) - { - if (!my_strcasecmp(system_charset_info, - point->column.c_ptr(), new_str->c_ptr())) - break; - } - lex->grant_tot_col|= lex->which_columns; - if (point) - point->rights |= lex->which_columns; - else - { - LEX_COLUMN *col= (new (thd->mem_root) - LEX_COLUMN(*new_str,lex->which_columns)); - if (unlikely(col == NULL)) - MYSQL_YYABORT; - lex->columns.push_back(col, thd->mem_root); - } - } - ; - -opt_require_clause: - /* empty */ - | REQUIRE_SYM require_list - { - Lex->account_options.ssl_type= SSL_TYPE_SPECIFIED; - } - | REQUIRE_SYM SSL_SYM - { - Lex->account_options.ssl_type= SSL_TYPE_ANY; - } - | REQUIRE_SYM X509_SYM - { - Lex->account_options.ssl_type= SSL_TYPE_X509; - } - | REQUIRE_SYM NONE_SYM - { - Lex->account_options.ssl_type= SSL_TYPE_NONE; - } - ; - -resource_option: - MAX_QUERIES_PER_HOUR ulong_num - { - Lex->account_options.questions=$2; - Lex->account_options.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; - } - | MAX_UPDATES_PER_HOUR ulong_num - { - Lex->account_options.updates=$2; - Lex->account_options.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; - } - | MAX_CONNECTIONS_PER_HOUR ulong_num - { - Lex->account_options.conn_per_hour= $2; - Lex->account_options.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; - } - | MAX_USER_CONNECTIONS_SYM int_num - { - Lex->account_options.user_conn= $2; - Lex->account_options.specified_limits|= USER_RESOURCES::USER_CONNECTIONS; - } - | MAX_STATEMENT_TIME_SYM NUM_literal - { - Lex->account_options.max_statement_time= $2->val_real(); - Lex->account_options.specified_limits|= USER_RESOURCES::MAX_STATEMENT_TIME; - } - ; - -resource_option_list: - resource_option_list resource_option {} - | resource_option {} - ; - -opt_resource_options: - /* empty */ {} - | WITH resource_option_list - ; - - -opt_grant_options: - /* empty */ {} - | WITH grant_option_list {} - ; - -opt_grant_option: - /* empty */ {} - | WITH GRANT OPTION { Lex->grant |= GRANT_ACL;} - ; - -grant_option_list: - grant_option_list grant_option {} - | grant_option {} - ; - -grant_option: - GRANT OPTION { Lex->grant |= GRANT_ACL;} - | resource_option {} - ; - -begin_stmt_mariadb: - BEGIN_MARIADB_SYM - { - LEX *lex=Lex; - lex->sql_command = SQLCOM_BEGIN; - lex->start_transaction_opt= 0; - } - opt_work {} - ; - -compound_statement: - sp_proc_stmt_compound_ok - { - Lex->sql_command= SQLCOM_COMPOUND; - if (Lex->sp_body_finalize_procedure(thd)) - MYSQL_YYABORT; - } - ; - -opt_not: - /* nothing */ { $$= 0; } - | not { $$= 1; } - ; - -opt_work: - /* empty */ {} - | WORK_SYM {} - ; - -opt_chain: - /* empty */ - { $$= TVL_UNKNOWN; } - | AND_SYM NO_SYM CHAIN_SYM { $$= TVL_NO; } - | AND_SYM CHAIN_SYM { $$= TVL_YES; } - ; - -opt_release: - /* empty */ - { $$= TVL_UNKNOWN; } - | RELEASE_SYM { $$= TVL_YES; } - | NO_SYM RELEASE_SYM { $$= TVL_NO; } - ; - -commit: - COMMIT_SYM opt_work opt_chain opt_release - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_COMMIT; - /* Don't allow AND CHAIN RELEASE. */ - MYSQL_YYABORT_UNLESS($3 != TVL_YES || $4 != TVL_YES); - lex->tx_chain= $3; - lex->tx_release= $4; - } - ; - -rollback: - ROLLBACK_SYM opt_work opt_chain opt_release - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_ROLLBACK; - /* Don't allow AND CHAIN RELEASE. */ - MYSQL_YYABORT_UNLESS($3 != TVL_YES || $4 != TVL_YES); - lex->tx_chain= $3; - lex->tx_release= $4; - } - | ROLLBACK_SYM opt_work TO_SYM SAVEPOINT_SYM ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; - lex->ident= $5; - } - | ROLLBACK_SYM opt_work TO_SYM ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; - lex->ident= $4; - } - ; - -savepoint: - SAVEPOINT_SYM ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_SAVEPOINT; - lex->ident= $2; - } - ; - -release: - RELEASE_SYM SAVEPOINT_SYM ident - { - LEX *lex=Lex; - lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; - lex->ident= $3; - } - ; - -/* - UNIONS : glue selects together -*/ - -unit_type_decl: - UNION_SYM union_option - { $$.unit_type= UNION_TYPE; $$.distinct= $2; } - | INTERSECT_SYM union_option - { $$.unit_type= INTERSECT_TYPE; $$.distinct= $2; } - | EXCEPT_SYM union_option - { $$.unit_type= EXCEPT_TYPE; $$.distinct= $2; } - ; - -/* - Start a UNION, for non-top level query expressions. -*/ -union_option: - /* empty */ { $$=1; } - | DISTINCT { $$=1; } - | ALL { $$=0; } - ; - -query_expression_option: - STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } - | HIGH_PRIORITY - { - YYPS->m_lock_type= TL_READ_HIGH_PRIORITY; - YYPS->m_mdl_type= MDL_SHARED_READ; - Select->options|= SELECT_HIGH_PRIORITY; - } - | DISTINCT { Select->options|= SELECT_DISTINCT; } - | UNIQUE_SYM { Select->options|= SELECT_DISTINCT; } - | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; } - | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } - | SQL_BUFFER_RESULT { Select->options|= OPTION_BUFFER_RESULT; } - | SQL_CALC_FOUND_ROWS { Select->options|= OPTION_FOUND_ROWS; } - | ALL { Select->options|= SELECT_ALL; } - ; - -/************************************************************************** - - DEFINER clause support. - -**************************************************************************/ - -definer_opt: - no_definer - | definer - ; - -no_definer: - /* empty */ - { - /* - We have to distinguish missing DEFINER-clause from case when - CURRENT_USER specified as definer explicitly in order to properly - handle CREATE TRIGGER statements which come to replication thread - from older master servers (i.e. to create non-suid trigger in this - case). - */ - thd->lex->definer= 0; - } - ; - -definer: - DEFINER_SYM '=' user_or_role - { - Lex->definer= $3; - Lex->account_options.reset(); - } - ; - -/************************************************************************** - - CREATE VIEW statement parts. - -**************************************************************************/ - -view_algorithm: - ALGORITHM_SYM '=' UNDEFINED_SYM { $$= DTYPE_ALGORITHM_UNDEFINED; } - | ALGORITHM_SYM '=' MERGE_SYM { $$= VIEW_ALGORITHM_MERGE; } - | ALGORITHM_SYM '=' TEMPTABLE_SYM { $$= VIEW_ALGORITHM_TMPTABLE; } - ; - -opt_view_suid: - /* empty */ { $$= VIEW_SUID_DEFAULT; } - | view_suid { $$= $1; } - ; - -view_suid: - SQL_SYM SECURITY_SYM DEFINER_SYM { $$= VIEW_SUID_DEFINER; } - | SQL_SYM SECURITY_SYM INVOKER_SYM { $$= VIEW_SUID_INVOKER; } - ; - -view_list_opt: - /* empty */ - {} - | '(' view_list ')' { } - ; - -view_list: - ident - { - Lex->view_list.push_back((LEX_CSTRING*) - thd->memdup(&$1, sizeof(LEX_CSTRING)), - thd->mem_root); - } - | view_list ',' ident - { - Lex->view_list.push_back((LEX_CSTRING*) - thd->memdup(&$3, sizeof(LEX_CSTRING)), - thd->mem_root); - } - ; - -view_select: - { - LEX *lex= Lex; - lex->parsing_options.allows_variable= FALSE; - lex->create_view->select.str= (char *) YYLIP->get_cpp_ptr(); - } - query_expression - view_check_option - { - if (Lex->parsed_create_view($2, $3)) - MYSQL_YYABORT; - } - ; - -view_check_option: - /* empty */ { $$= VIEW_CHECK_NONE; } - | WITH CHECK_SYM OPTION { $$= VIEW_CHECK_CASCADED; } - | WITH CASCADED CHECK_SYM OPTION { $$= VIEW_CHECK_CASCADED; } - | WITH LOCAL_SYM CHECK_SYM OPTION { $$= VIEW_CHECK_LOCAL; } - ; - -/************************************************************************** - - CREATE TRIGGER statement parts. - -**************************************************************************/ - -trigger_action_order: - FOLLOWS_SYM - { $$= TRG_ORDER_FOLLOWS; } - | PRECEDES_SYM - { $$= TRG_ORDER_PRECEDES; } - ; - -trigger_follows_precedes_clause: - /* empty */ - { - $$.ordering_clause= TRG_ORDER_NONE; - $$.anchor_trigger_name.str= NULL; - $$.anchor_trigger_name.length= 0; - } - | - trigger_action_order ident_or_text - { - $$.ordering_clause= $1; - $$.anchor_trigger_name= $2; - } - ; - -trigger_tail: - remember_name - opt_if_not_exists - { - if (unlikely(Lex->add_create_options_with_check($2))) - MYSQL_YYABORT; - } - sp_name - trg_action_time - trg_event - ON - remember_name /* $8 */ - { /* $9 */ - Lex->raw_trg_on_table_name_begin= YYLIP->get_tok_start(); - } - table_ident /* $10 */ - FOR_SYM - remember_name /* $12 */ - { /* $13 */ - Lex->raw_trg_on_table_name_end= YYLIP->get_tok_start(); - } - EACH_SYM - ROW_SYM - { - Lex->trg_chistics.ordering_clause_begin= YYLIP->get_cpp_ptr(); - } - trigger_follows_precedes_clause /* $17 */ - { /* $18 */ - LEX *lex= thd->lex; - Lex_input_stream *lip= YYLIP; - - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_NO_RECURSIVE_CREATE, MYF(0), "TRIGGER")); - - lex->stmt_definition_begin= $1; - lex->ident.str= $8; - lex->ident.length= $12 - $8; - lex->spname= $4; - (*static_cast<st_trg_execution_order*>(&lex->trg_chistics))= ($17); - lex->trg_chistics.ordering_clause_end= lip->get_cpp_ptr(); - - if (unlikely(!lex->make_sp_head(thd, $4, &sp_handler_trigger, - DEFAULT_AGGREGATE))) - MYSQL_YYABORT; - - lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); - } - sp_proc_stmt /* $19 */ - { /* $20 */ - LEX *lex= Lex; - - lex->sql_command= SQLCOM_CREATE_TRIGGER; - if (lex->sp_body_finalize_trigger(thd)) - MYSQL_YYABORT; - - /* - We have to do it after parsing trigger body, because some of - sp_proc_stmt alternatives are not saving/restoring LEX, so - lex->query_tables can be wiped out. - */ - if (!lex->first_select_lex()-> - add_table_to_list(thd, $10, (LEX_CSTRING*) 0, - TL_OPTION_UPDATING, TL_READ_NO_INSERT, - MDL_SHARED_NO_WRITE)) - MYSQL_YYABORT; - } - ; - -/************************************************************************** - - CREATE FUNCTION | PROCEDURE statements parts. - -**************************************************************************/ - - -sf_return_type: - { - LEX *lex= Lex; - lex->init_last_field(&lex->sphead->m_return_field_def, - &empty_clex_str, - thd->variables.collation_database); - } - type_with_opt_collate - { - if (unlikely(Lex->sf_return_fill_definition($2))) - MYSQL_YYABORT; - } - ; - - -/*************************************************************************/ - -xa: - XA_SYM begin_or_start xid opt_join_or_resume - { - Lex->sql_command = SQLCOM_XA_START; - } - | XA_SYM END xid opt_suspend - { - Lex->sql_command = SQLCOM_XA_END; - } - | XA_SYM PREPARE_SYM xid - { - Lex->sql_command = SQLCOM_XA_PREPARE; - } - | XA_SYM COMMIT_SYM xid opt_one_phase - { - Lex->sql_command = SQLCOM_XA_COMMIT; - } - | XA_SYM ROLLBACK_SYM xid - { - Lex->sql_command = SQLCOM_XA_ROLLBACK; - } - | XA_SYM RECOVER_SYM opt_format_xid - { - Lex->sql_command = SQLCOM_XA_RECOVER; - Lex->verbose= $3; - } - ; - -opt_format_xid: - /* empty */ { $$= false; } - | FORMAT_SYM '=' ident_or_text - { - if (lex_string_eq(&$3, STRING_WITH_LEN("SQL"))) - $$= true; - else if (lex_string_eq(&$3, STRING_WITH_LEN("RAW"))) - $$= false; - else - { - my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), - "XA RECOVER", $3.str)); - $$= false; - } - } - ; - -xid: - text_string - { - MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE); - if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) - MYSQL_YYABORT; - Lex->xid->set(1L, $1->ptr(), $1->length(), 0, 0); - } - | text_string ',' text_string - { - MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE); - if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) - MYSQL_YYABORT; - Lex->xid->set(1L, $1->ptr(), $1->length(), $3->ptr(), $3->length()); - } - | text_string ',' text_string ',' ulong_num - { - MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE); - if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) - MYSQL_YYABORT; - Lex->xid->set($5, $1->ptr(), $1->length(), $3->ptr(), $3->length()); - } - ; - -begin_or_start: - BEGIN_MARIADB_SYM {} - | BEGIN_ORACLE_SYM {} - | START_SYM {} - ; - -opt_join_or_resume: - /* nothing */ { Lex->xa_opt=XA_NONE; } - | JOIN_SYM { Lex->xa_opt=XA_JOIN; } - | RESUME_SYM { Lex->xa_opt=XA_RESUME; } - ; - -opt_one_phase: - /* nothing */ { Lex->xa_opt=XA_NONE; } - | ONE_SYM PHASE_SYM { Lex->xa_opt=XA_ONE_PHASE; } - ; - -opt_suspend: - /* nothing */ - { Lex->xa_opt=XA_NONE; } - | SUSPEND_SYM - { Lex->xa_opt=XA_SUSPEND; } - opt_migrate - ; - -opt_migrate: - /* nothing */ {} - | FOR_SYM MIGRATE_SYM { Lex->xa_opt=XA_FOR_MIGRATE; } - ; - -install: - INSTALL_SYM PLUGIN_SYM opt_if_not_exists ident SONAME_SYM TEXT_STRING_sys - { - if (Lex->stmt_install_plugin($3, $4, $6)) - MYSQL_YYABORT; - } - | INSTALL_SYM SONAME_SYM TEXT_STRING_sys - { - Lex->stmt_install_plugin($3); - } - ; - -uninstall: - UNINSTALL_SYM PLUGIN_SYM opt_if_exists ident - { - if (Lex->stmt_uninstall_plugin_by_name($3, $4)) - MYSQL_YYABORT; - } - | UNINSTALL_SYM SONAME_SYM opt_if_exists TEXT_STRING_sys - { - if (Lex->stmt_uninstall_plugin_by_soname($3, $4)) - MYSQL_YYABORT; - } - ; - -/* Avoid compiler warning from sql_yacc.cc where yyerrlab1 is not used */ -keep_gcc_happy: - IMPOSSIBLE_ACTION - { - YYERROR; - } - ; - -_empty: - /* Empty */ - ; - -/* Start SQL_MODE_DEFAULT_SPECIFIC - - -statement: - verb_clause - ; - -sp_statement: - statement - ; - -sp_if_then_statements: - sp_proc_stmts1 - ; - -sp_case_then_statements: - sp_proc_stmts1 - ; - -reserved_keyword_udt_param_type: - INOUT_SYM - | IN_SYM - | OUT_SYM - ; - -reserved_keyword_udt: - reserved_keyword_udt_not_param_type - | reserved_keyword_udt_param_type - ; - -// Keywords that start an SP block section -keyword_sp_block_section: - BEGIN_MARIADB_SYM - | END - ; - -// Keywords that we allow for labels in SPs. -// Should not include keywords that start a statement or SP characteristics. -keyword_label: - keyword_data_type - | keyword_set_special_case - | keyword_sp_var_and_label - | keyword_sysvar_type - | FUNCTION_SYM - | EXCEPTION_ORACLE_SYM - ; - -keyword_sp_decl: - keyword_data_type - | keyword_cast_type - | keyword_set_special_case - | keyword_sp_block_section - | keyword_sp_head - | keyword_sp_var_and_label - | keyword_sp_var_not_label - | keyword_sysvar_type - | keyword_verb_clause - | FUNCTION_SYM - | WINDOW_SYM - ; - -opt_truncate_table_storage_clause: - _empty - ; - - -ident_for_loop_index: - ident - ; - -row_field_name: - ident - { - if (!($$= Lex->row_field_name(thd, $1))) - MYSQL_YYABORT; - } - ; - -while_body: - expr_lex DO_SYM - { - if (unlikely($1->sp_while_loop_expression(thd))) - MYSQL_YYABORT; - } - sp_proc_stmts1 END WHILE_SYM - { - if (unlikely(Lex->sp_while_loop_finalize(thd))) - MYSQL_YYABORT; - } - ; - -for_loop_statements: - DO_SYM sp_proc_stmts1 END FOR_SYM - { } - ; - -sp_label: - label_ident ':' { $$= $1; } - ; - -sp_control_label: - sp_label - ; - -sp_block_label: - sp_label - { - if (unlikely(Lex->spcont->block_label_declare(&$1))) - MYSQL_YYABORT; - $$= $1; - } - ; - -sp_opt_default: - _empty { $$ = NULL; } - | DEFAULT expr { $$ = $2; } - ; - -sp_pdparam: - sp_parameter_type sp_param_name_and_type { $2->mode=$1; } - | sp_param_name_and_type { $1->mode= sp_variable::MODE_IN; } - ; - -sp_decl_variable_list_anchored: - sp_decl_idents_init_vars - TYPE_SYM OF_SYM optionally_qualified_column_ident - sp_opt_default - { - if (unlikely(Lex->sp_variable_declarations_with_ref_finalize(thd, $1, $4, $5))) - MYSQL_YYABORT; - $$.init_using_vars($1); - } - | sp_decl_idents_init_vars - ROW_SYM TYPE_SYM OF_SYM optionally_qualified_column_ident - sp_opt_default - { - if (unlikely(Lex->sp_variable_declarations_rowtype_finalize(thd, $1, $5, $6))) - MYSQL_YYABORT; - $$.init_using_vars($1); - } - ; - -sp_param_name_and_type_anchored: - sp_param_name TYPE_SYM OF_SYM ident '.' ident - { - if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, - $$= $1, $4, - $6))) - MYSQL_YYABORT; - } - | sp_param_name TYPE_SYM OF_SYM ident '.' ident '.' ident - { - if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, - $4, $6, $8))) - MYSQL_YYABORT; - } - | sp_param_name ROW_SYM TYPE_SYM OF_SYM ident - { - if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $5))) - MYSQL_YYABORT; - } - | sp_param_name ROW_SYM TYPE_SYM OF_SYM ident '.' ident - { - if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $5, $7))) - MYSQL_YYABORT; - } - ; - - -sf_c_chistics_and_body_standalone: - sp_c_chistics - { - LEX *lex= thd->lex; - lex->sphead->set_c_chistics(lex->sp_chistics); - lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); - } - sp_proc_stmt_in_returns_clause - { - if (unlikely(Lex->sp_body_finalize_function(thd))) - MYSQL_YYABORT; - } - ; - -sp_tail_standalone: - sp_name - { - if (unlikely(!Lex->make_sp_head_no_recursive(thd, $1, - &sp_handler_procedure, - DEFAULT_AGGREGATE))) - MYSQL_YYABORT; - } - sp_parenthesized_pdparam_list - sp_c_chistics - { - Lex->sphead->set_c_chistics(Lex->sp_chistics); - Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); - } - sp_proc_stmt - { - if (unlikely(Lex->sp_body_finalize_procedure(thd))) - MYSQL_YYABORT; - } - ; - -drop_routine: - DROP FUNCTION_SYM opt_if_exists ident '.' ident - { - if (Lex->stmt_drop_function($3, $4, $6)) - MYSQL_YYABORT; - } - | DROP FUNCTION_SYM opt_if_exists ident - { - if (Lex->stmt_drop_function($3, $4)) - MYSQL_YYABORT; - } - | DROP PROCEDURE_SYM opt_if_exists sp_name - { - if (Lex->stmt_drop_procedure($3, $4)) - MYSQL_YYABORT; - } - ; - - -create_routine: - create_or_replace definer_opt PROCEDURE_SYM opt_if_not_exists - { - if (Lex->stmt_create_procedure_start($1 | $4)) - MYSQL_YYABORT; - } - sp_tail_standalone - { - Lex->stmt_create_routine_finalize(); - } - | create_or_replace definer opt_aggregate FUNCTION_SYM opt_if_not_exists - sp_name - { - if (Lex->stmt_create_stored_function_start($1 | $5, $3, $6)) - MYSQL_YYABORT; - } - sp_parenthesized_fdparam_list - RETURNS_SYM sf_return_type - sf_c_chistics_and_body_standalone - { - Lex->stmt_create_routine_finalize(); - } - | create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists - sp_name - { - if (Lex->stmt_create_stored_function_start($1 | $5, $3, $6)) - MYSQL_YYABORT; - } - sp_parenthesized_fdparam_list - RETURNS_SYM sf_return_type - sf_c_chistics_and_body_standalone - { - Lex->stmt_create_routine_finalize(); - } - | create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists - ident RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys - { - if (Lex->stmt_create_udf_function($1 | $5, $3, $6, - (Item_result) $8, $10)) - MYSQL_YYABORT; - } - ; - - -sp_decls: - _empty - { - $$.init(); - } - | sp_decls sp_decl ';' - { - // We check for declarations out of (standard) order this way - // because letting the grammar rules reflect it caused tricky - // shift/reduce conflicts with the wrong result. (And we get - // better error handling this way.) - if (unlikely(Lex->sp_declarations_join(&$$, $1, $2))) - MYSQL_YYABORT; - } - ; - -sp_decl: - DECLARE_MARIADB_SYM sp_decl_body { $$= $2; } - ; - - -sp_decl_body: - sp_decl_variable_list - | sp_decl_ident CONDITION_SYM FOR_SYM sp_cond - { - if (unlikely(Lex->spcont->declare_condition(thd, &$1, $4))) - MYSQL_YYABORT; - $$.vars= $$.hndlrs= $$.curs= 0; - $$.conds= 1; - } - | sp_decl_handler - | sp_decl_ident CURSOR_SYM - { - Lex->sp_block_init(thd); - } - opt_parenthesized_cursor_formal_parameters - FOR_SYM sp_cursor_stmt - { - sp_pcontext *param_ctx= Lex->spcont; - if (unlikely(Lex->sp_block_finalize(thd))) - MYSQL_YYABORT; - if (unlikely(Lex->sp_declare_cursor(thd, &$1, $6, param_ctx, true))) - MYSQL_YYABORT; - $$.vars= $$.conds= $$.hndlrs= 0; - $$.curs= 1; - } - ; - - - -// ps_proc_stmt_in_returns_clause is a statement that is allowed -// in the RETURNS clause of a stored function definition directly, -// without the BEGIN..END block. -// It should not include any syntax structures starting with '(', to avoid -// shift/reduce conflicts with the rule "field_type" and its sub-rules -// that scan an optional length, like CHAR(1) or YEAR(4). -// See MDEV-9166. - -sp_proc_stmt_in_returns_clause: - sp_proc_stmt_return - | sp_labeled_block - | sp_unlabeled_block - | sp_labeled_control - | sp_proc_stmt_compound_ok - ; - -sp_proc_stmt: - sp_proc_stmt_in_returns_clause - | sp_proc_stmt_statement - | sp_proc_stmt_continue_oracle - | sp_proc_stmt_exit_oracle - | sp_proc_stmt_leave - | sp_proc_stmt_iterate - | sp_proc_stmt_goto_oracle - | sp_proc_stmt_with_cursor - ; - -sp_proc_stmt_compound_ok: - sp_proc_stmt_if - | case_stmt_specification - | sp_unlabeled_block_not_atomic - | sp_unlabeled_control - ; - - -sp_labeled_block: - sp_block_label - BEGIN_MARIADB_SYM - { - Lex->sp_block_init(thd, &$1); - } - sp_decls - sp_proc_stmts - END - sp_opt_label - { - if (unlikely(Lex->sp_block_finalize(thd, $4, &$7))) - MYSQL_YYABORT; - } - ; - -sp_unlabeled_block: - BEGIN_MARIADB_SYM - { - Lex->sp_block_init(thd); - } - sp_decls - sp_proc_stmts - END - { - if (unlikely(Lex->sp_block_finalize(thd, $3))) - MYSQL_YYABORT; - } - ; - -sp_unlabeled_block_not_atomic: - BEGIN_MARIADB_SYM not ATOMIC_SYM // TODO: BEGIN ATOMIC (not -> opt_not) - { - if (unlikely(Lex->maybe_start_compound_statement(thd))) - MYSQL_YYABORT; - Lex->sp_block_init(thd); - } - sp_decls - sp_proc_stmts - END - { - if (unlikely(Lex->sp_block_finalize(thd, $5))) - MYSQL_YYABORT; - } - ; - - -End SQL_MODE_DEFAULT_SPECIFIC */ - - -/* Start SQL_MODE_ORACLE_SPECIFIC */ - -statement: - verb_clause - | set_assign - ; - -sp_statement: - statement - | ident_cli_directly_assignable - { - // Direct procedure call (without the CALL keyword) - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->call_statement_start(thd, &tmp))) - MYSQL_YYABORT; - } - opt_sp_cparam_list - | ident_cli_directly_assignable '.' ident - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->call_statement_start(thd, &tmp, &$3))) - MYSQL_YYABORT; - } - opt_sp_cparam_list - ; - -sp_if_then_statements: - sp_proc_stmts1_implicit_block { } - ; - -sp_case_then_statements: - sp_proc_stmts1_implicit_block { } - ; - -reserved_keyword_udt: - reserved_keyword_udt_not_param_type - ; - -// Keywords that start an SP block section. -keyword_sp_block_section: - BEGIN_ORACLE_SYM - | END - ; - -// Keywords that we allow for labels in SPs. -// Should not include keywords that start a statement or SP characteristics. -keyword_label: - keyword_data_type - | keyword_set_special_case - | keyword_sp_var_and_label - | keyword_sysvar_type - | FUNCTION_SYM - | COMPRESSED_SYM - | EXCEPTION_ORACLE_SYM - ; - -keyword_sp_decl: - keyword_sp_head - | keyword_set_special_case - | keyword_sp_var_and_label - | keyword_sp_var_not_label - | keyword_sysvar_type - | keyword_verb_clause - | WINDOW_SYM - ; - -opt_truncate_table_storage_clause: - _empty - | DROP STORAGE_SYM - | REUSE_SYM STORAGE_SYM - ; - - -ident_for_loop_index: - ident_directly_assignable - ; - -row_field_name: - ident_directly_assignable - { - if (!($$= Lex->row_field_name(thd, $1))) - MYSQL_YYABORT; - } - ; - -while_body: - expr_lex LOOP_SYM - { - if (unlikely($1->sp_while_loop_expression(thd))) - MYSQL_YYABORT; - } - sp_proc_stmts1 END LOOP_SYM - { - if (unlikely(Lex->sp_while_loop_finalize(thd))) - MYSQL_YYABORT; - } - ; - -for_loop_statements: - LOOP_SYM sp_proc_stmts1 END LOOP_SYM - { } - ; - - -sp_control_label: - labels_declaration_oracle - ; - -sp_block_label: - labels_declaration_oracle - { - if (unlikely(Lex->spcont->block_label_declare(&$1))) - MYSQL_YYABORT; - $$= $1; - } - ; - - -remember_end_opt: - { - if (yychar == YYEMPTY) - $$= (char*) YYLIP->get_cpp_ptr_rtrim(); - else - $$= (char*) YYLIP->get_cpp_tok_end_rtrim(); - } - ; - -sp_opt_default: - _empty { $$ = NULL; } - | DEFAULT expr { $$ = $2; } - | SET_VAR expr { $$ = $2; } - ; - -sp_opt_inout: - _empty { $$= sp_variable::MODE_IN; } - | sp_parameter_type - | IN_SYM OUT_SYM { $$= sp_variable::MODE_INOUT; } - ; - -sp_pdparam: - sp_param_name sp_opt_inout type_with_opt_collate - { - $1->mode= $2; - if (unlikely(Lex->sp_param_fill_definition($1, $3))) - MYSQL_YYABORT; - } - | sp_param_name sp_opt_inout sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM - { - $1->mode= $2; - if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $1, $3, $5))) - MYSQL_YYABORT; - } - | sp_param_name sp_opt_inout sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM - { - $1->mode= $2; - if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $1, $3, $5, $7))) - MYSQL_YYABORT; - } - | sp_param_name sp_opt_inout sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM - { - $1->mode= $2; - if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $1, $3))) - MYSQL_YYABORT; - } - | sp_param_name sp_opt_inout sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM - { - $1->mode= $2; - if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $1, $3, $5))) - MYSQL_YYABORT; - } - | sp_param_name sp_opt_inout ROW_SYM row_type_body - { - $1->mode= $2; - if (unlikely(Lex->sphead->spvar_fill_row(thd, $1, $4))) - MYSQL_YYABORT; - } - ; - - -sp_proc_stmts1_implicit_block: - { - Lex->sp_block_init(thd); - } - sp_proc_stmts1 - { - if (unlikely(Lex->sp_block_finalize(thd))) - MYSQL_YYABORT; - } - ; - - -remember_lex: - { - $$= thd->lex; - } - ; - -keyword_directly_assignable: - keyword_data_type - | keyword_cast_type - | keyword_set_special_case - | keyword_sp_var_and_label - | keyword_sp_var_not_label - | keyword_sysvar_type - | FUNCTION_SYM - | WINDOW_SYM - ; - -ident_directly_assignable: - IDENT_sys - | keyword_directly_assignable - { - if (unlikely($$.copy_keyword(thd, &$1))) - MYSQL_YYABORT; - } - ; - -ident_cli_directly_assignable: - IDENT_cli - | keyword_directly_assignable { $$= $1; } - ; - - -set_assign: - ident_cli_directly_assignable SET_VAR - { - LEX *lex=Lex; - lex->set_stmt_init(); - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - Lex_ident_sys tmp(thd, &$1); - if (unlikely(Lex->set_variable(&tmp, $4)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, - false))) - MYSQL_YYABORT; - } - | ident_cli_directly_assignable '.' ident SET_VAR - { - LEX *lex=Lex; - lex->set_stmt_init(); - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - LEX *lex= Lex; - DBUG_ASSERT(lex->var_list.is_empty()); - Lex_ident_sys tmp(thd, &$1); - if (unlikely(lex->set_variable(&tmp, &$3, $6)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, - false))) - MYSQL_YYABORT; - } - | COLON_ORACLE_SYM ident '.' ident SET_VAR - { - LEX *lex= Lex; - if (unlikely(!lex->is_trigger_new_or_old_reference(&$2))) - { - thd->parse_error(ER_SYNTAX_ERROR, $1.pos()); - MYSQL_YYABORT; - } - lex->set_stmt_init(); - if (sp_create_assignment_lex(thd, $1.pos())) - MYSQL_YYABORT; - } - set_expr_or_default - { - LEX_CSTRING tmp= { $2.str, $2.length }; - if (unlikely(Lex->set_trigger_field(&tmp, &$4, $7)) || - unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, - false))) - MYSQL_YYABORT; - } - ; - - -labels_declaration_oracle: - label_declaration_oracle { $$= $1; } - | labels_declaration_oracle label_declaration_oracle { $$= $2; } - ; - -label_declaration_oracle: - SHIFT_LEFT label_ident SHIFT_RIGHT - { - if (unlikely(Lex->sp_push_goto_label(thd, &$2))) - MYSQL_YYABORT; - $$= $2; - } - ; - -opt_exception_clause: - _empty { $$= 0; } - | EXCEPTION_ORACLE_SYM exception_handlers { $$= $2; } - ; - -exception_handlers: - exception_handler { $$= 1; } - | exception_handlers exception_handler { $$= $1 + 1; } - ; - -exception_handler: - WHEN_SYM - { - if (unlikely(Lex->sp_handler_declaration_init(thd, sp_handler::EXIT))) - MYSQL_YYABORT; - } - sp_hcond_list - THEN_SYM - sp_proc_stmts1_implicit_block - { - if (unlikely(Lex->sp_handler_declaration_finalize(thd, sp_handler::EXIT))) - MYSQL_YYABORT; - } - ; - -sp_no_param: - _empty - { - Lex->sphead->m_param_begin= Lex->sphead->m_param_end= - YYLIP->get_cpp_tok_start() + 1; - } - ; - -opt_sp_parenthesized_fdparam_list: - sp_no_param - | sp_parenthesized_fdparam_list - ; - -opt_sp_parenthesized_pdparam_list: - sp_no_param - | sp_parenthesized_pdparam_list - ; - - -opt_sp_name: - _empty { $$= NULL; } - | sp_name { $$= $1; } - ; - - -opt_package_routine_end_name: - _empty { $$= null_clex_str; } - | ident { $$= $1; } - ; - -sp_tail_is: - IS - | AS - ; - -sp_instr_addr: - { $$= Lex->sphead->instructions(); } - ; - -sp_body: - { - Lex->sp_block_init(thd); - } - opt_sp_decl_body_list - { - if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) - MYSQL_YYABORT; - } - BEGIN_ORACLE_SYM - sp_block_statements_and_exceptions - { - $2.hndlrs+= $5.hndlrs; - if (unlikely(Lex->sp_block_finalize(thd, $2))) - MYSQL_YYABORT; - } - END - ; - -create_package_chistic: - COMMENT_SYM TEXT_STRING_sys - { Lex->sp_chistics.comment= $2; } - | sp_suid - { Lex->sp_chistics.suid= $1; } - ; - -create_package_chistics: - create_package_chistic {} - | create_package_chistics create_package_chistic { } - ; - -opt_create_package_chistics: - _empty - | create_package_chistics { } - ; - -opt_create_package_chistics_init: - { Lex->sp_chistics.init(); } - opt_create_package_chistics - ; - - -package_implementation_executable_section: - END - { - if (unlikely(Lex->sp_block_with_exceptions_add_empty(thd))) - MYSQL_YYABORT; - $$.init(0); - } - | BEGIN_ORACLE_SYM sp_block_statements_and_exceptions END { $$= $2; } - ; - - -// Inside CREATE PACKAGE BODY, package-wide items (e.g. variables) -// must be declared before routine definitions. - -package_implementation_declare_section: - package_implementation_declare_section_list1 - | package_implementation_declare_section_list2 - | package_implementation_declare_section_list1 - package_implementation_declare_section_list2 - { $$.join($1, $2); } - ; - -package_implementation_declare_section_list1: - package_implementation_item_declaration - | package_implementation_declare_section_list1 - package_implementation_item_declaration - { $$.join($1, $2); } - ; - -package_implementation_declare_section_list2: - package_implementation_routine_definition - | package_implementation_declare_section_list2 - package_implementation_routine_definition - { $$.join($1, $2); } - ; - -package_routine_lex: - { - if (unlikely(!($$= new (thd->mem_root) - sp_lex_local(thd, thd->lex)))) - MYSQL_YYABORT; - thd->m_parser_state->m_yacc.reset_before_substatement(); - } - ; - - -package_specification_function: - remember_lex package_routine_lex ident - { - DBUG_ASSERT($1->sphead->get_package()); - $2->sql_command= SQLCOM_CREATE_FUNCTION; - sp_name *spname= $1->make_sp_name_package_routine(thd, &$3); - if (unlikely(!spname)) - MYSQL_YYABORT; - thd->lex= $2; - if (unlikely(!$2->make_sp_head_no_recursive(thd, spname, - &sp_handler_package_function, - NOT_AGGREGATE))) - MYSQL_YYABORT; - $1->sphead->get_package()->m_current_routine= $2; - (void) is_native_function_with_warn(thd, &$3); - } - opt_sp_parenthesized_fdparam_list - RETURN_ORACLE_SYM sf_return_type - sp_c_chistics - { - sp_head *sp= thd->lex->sphead; - sp->restore_thd_mem_root(thd); - thd->lex= $1; - $$= $2; - } - ; - -package_specification_procedure: - remember_lex package_routine_lex ident - { - DBUG_ASSERT($1->sphead->get_package()); - $2->sql_command= SQLCOM_CREATE_PROCEDURE; - sp_name *spname= $1->make_sp_name_package_routine(thd, &$3); - if (unlikely(!spname)) - MYSQL_YYABORT; - thd->lex= $2; - if (unlikely(!$2->make_sp_head_no_recursive(thd, spname, - &sp_handler_package_procedure, - DEFAULT_AGGREGATE))) - MYSQL_YYABORT; - $1->sphead->get_package()->m_current_routine= $2; - } - opt_sp_parenthesized_pdparam_list - sp_c_chistics - { - sp_head *sp= thd->lex->sphead; - sp->restore_thd_mem_root(thd); - thd->lex= $1; - $$= $2; - } - ; - - -package_implementation_routine_definition: - FUNCTION_SYM package_specification_function - package_implementation_function_body ';' - { - sp_package *pkg= Lex->get_sp_package(); - if (unlikely(pkg->add_routine_implementation($2))) - MYSQL_YYABORT; - pkg->m_current_routine= NULL; - $$.init(); - } - | PROCEDURE_SYM package_specification_procedure - package_implementation_procedure_body ';' - { - sp_package *pkg= Lex->get_sp_package(); - if (unlikely(pkg->add_routine_implementation($2))) - MYSQL_YYABORT; - pkg->m_current_routine= NULL; - $$.init(); - } - | package_specification_element { $$.init(); } - ; - - -package_implementation_function_body: - sp_tail_is remember_lex - { - sp_package *pkg= Lex->get_sp_package(); - sp_head *sp= pkg->m_current_routine->sphead; - thd->lex= pkg->m_current_routine; - sp->reset_thd_mem_root(thd); - sp->set_body_start(thd, YYLIP->get_cpp_tok_start()); - } - sp_body opt_package_routine_end_name - { - if (unlikely(thd->lex->sp_body_finalize_function(thd) || - thd->lex->sphead->check_package_routine_end_name($5))) - MYSQL_YYABORT; - thd->lex= $2; - } - ; - -package_implementation_procedure_body: - sp_tail_is remember_lex - { - sp_package *pkg= Lex->get_sp_package(); - sp_head *sp= pkg->m_current_routine->sphead; - thd->lex= pkg->m_current_routine; - sp->reset_thd_mem_root(thd); - sp->set_body_start(thd, YYLIP->get_cpp_tok_start()); - } - sp_body opt_package_routine_end_name - { - if (unlikely(thd->lex->sp_body_finalize_procedure(thd) || - thd->lex->sphead->check_package_routine_end_name($5))) - MYSQL_YYABORT; - thd->lex= $2; - } - ; - - -package_implementation_item_declaration: - sp_decl_variable_list ';' - ; - -opt_package_specification_element_list: - _empty - | package_specification_element_list - ; - -package_specification_element_list: - package_specification_element - | package_specification_element_list package_specification_element - ; - -package_specification_element: - FUNCTION_SYM package_specification_function ';' - { - sp_package *pkg= Lex->get_sp_package(); - if (unlikely(pkg->add_routine_declaration($2))) - MYSQL_YYABORT; - pkg->m_current_routine= NULL; - } - | PROCEDURE_SYM package_specification_procedure ';' - { - sp_package *pkg= Lex->get_sp_package(); - if (unlikely(pkg->add_routine_declaration($2))) - MYSQL_YYABORT; - pkg->m_current_routine= NULL; - } - ; - -sp_decl_variable_list_anchored: - sp_decl_idents_init_vars - optionally_qualified_column_ident PERCENT_ORACLE_SYM TYPE_SYM - sp_opt_default - { - if (unlikely(Lex->sp_variable_declarations_with_ref_finalize(thd, $1, $2, $5))) - MYSQL_YYABORT; - $$.init_using_vars($1); - } - | sp_decl_idents_init_vars - optionally_qualified_column_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM - sp_opt_default - { - if (unlikely(Lex->sp_variable_declarations_rowtype_finalize(thd, $1, $2, $5))) - MYSQL_YYABORT; - $$.init_using_vars($1); - } - ; - -sp_param_name_and_type_anchored: - sp_param_name sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM - { - if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, $2, $4))) - MYSQL_YYABORT; - } - | sp_param_name sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM - { - if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, $2, $4, $6))) - MYSQL_YYABORT; - } - | sp_param_name sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM - { - if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $2))) - MYSQL_YYABORT; - } - | sp_param_name sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM - { - if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $2, $4))) - MYSQL_YYABORT; - } - ; - - -sf_c_chistics_and_body_standalone: - sp_c_chistics - { - LEX *lex= thd->lex; - lex->sphead->set_c_chistics(lex->sp_chistics); - lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); - } - sp_tail_is - sp_body - { - if (unlikely(Lex->sp_body_finalize_function(thd))) - MYSQL_YYABORT; - } - ; - -sp_tail_standalone: - sp_name - { - if (unlikely(!Lex->make_sp_head_no_recursive(thd, $1, - &sp_handler_procedure, - DEFAULT_AGGREGATE))) - MYSQL_YYABORT; - } - opt_sp_parenthesized_pdparam_list - sp_c_chistics - { - Lex->sphead->set_c_chistics(Lex->sp_chistics); - Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); - } - sp_tail_is - sp_body - opt_sp_name - { - if (unlikely(Lex->sp_body_finalize_procedure_standalone(thd, $8))) - MYSQL_YYABORT; - } - ; - -drop_routine: - DROP FUNCTION_SYM opt_if_exists ident '.' ident - { - if (Lex->stmt_drop_function($3, $4, $6)) - MYSQL_YYABORT; - } - | DROP FUNCTION_SYM opt_if_exists ident - { - if (Lex->stmt_drop_function($3, $4)) - MYSQL_YYABORT; - } - | DROP PROCEDURE_SYM opt_if_exists sp_name - { - if (Lex->stmt_drop_procedure($3, $4)) - MYSQL_YYABORT; - } - | DROP PACKAGE_ORACLE_SYM opt_if_exists sp_name - { - LEX *lex= Lex; - lex->set_command(SQLCOM_DROP_PACKAGE, $3); - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "PACKAGE")); - lex->spname= $4; - } - | DROP PACKAGE_ORACLE_SYM BODY_ORACLE_SYM opt_if_exists sp_name - { - LEX *lex= Lex; - lex->set_command(SQLCOM_DROP_PACKAGE_BODY, $4); - if (unlikely(lex->sphead)) - my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "PACKAGE BODY")); - lex->spname= $5; - } - ; - - -create_routine: - create_or_replace definer_opt PROCEDURE_SYM opt_if_not_exists - { - if (Lex->stmt_create_procedure_start($1 | $4)) - MYSQL_YYABORT; - } - sp_tail_standalone - { - Lex->stmt_create_routine_finalize(); - } - | create_or_replace definer opt_aggregate FUNCTION_SYM opt_if_not_exists - sp_name - { - if (Lex->stmt_create_stored_function_start($1 | $5, $3, $6)) - MYSQL_YYABORT; - } - opt_sp_parenthesized_fdparam_list - RETURN_ORACLE_SYM sf_return_type - sf_c_chistics_and_body_standalone - opt_sp_name - { - if (Lex->stmt_create_stored_function_finalize_standalone($12)) - MYSQL_YYABORT; - } - | create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists - sp_name - { - if (Lex->stmt_create_stored_function_start($1 | $5, $3, $6)) - MYSQL_YYABORT; - } - opt_sp_parenthesized_fdparam_list - RETURN_ORACLE_SYM sf_return_type - sf_c_chistics_and_body_standalone - opt_sp_name - { - if (Lex->stmt_create_stored_function_finalize_standalone($12)) - MYSQL_YYABORT; - } - | create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists - ident RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys - { - if (Lex->stmt_create_udf_function($1 | $5, $3, $6, - (Item_result) $8, $10)) - MYSQL_YYABORT; - } - | create_or_replace definer_opt PACKAGE_ORACLE_SYM - opt_if_not_exists sp_name opt_create_package_chistics_init - sp_tail_is - remember_name - { - sp_package *pkg; - if (unlikely(!(pkg= Lex-> - create_package_start(thd, - SQLCOM_CREATE_PACKAGE, - &sp_handler_package_spec, - $5, $1 | $4)))) - MYSQL_YYABORT; - pkg->set_c_chistics(Lex->sp_chistics); - } - opt_package_specification_element_list END - remember_end_opt opt_sp_name - { - if (unlikely(Lex->create_package_finalize(thd, $5, $13, $8, $12))) - MYSQL_YYABORT; - } - | create_or_replace definer_opt PACKAGE_ORACLE_SYM BODY_ORACLE_SYM - opt_if_not_exists sp_name opt_create_package_chistics_init - sp_tail_is - remember_name - { - sp_package *pkg; - if (unlikely(!(pkg= Lex-> - create_package_start(thd, - SQLCOM_CREATE_PACKAGE_BODY, - &sp_handler_package_body, - $6, $1 | $5)))) - MYSQL_YYABORT; - pkg->set_c_chistics(Lex->sp_chistics); - Lex->sp_block_init(thd); - } - package_implementation_declare_section - { - if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) - MYSQL_YYABORT; - } - package_implementation_executable_section - { - $11.hndlrs+= $13.hndlrs; - if (unlikely(Lex->sp_block_finalize(thd, $11))) - MYSQL_YYABORT; - } - remember_end_opt opt_sp_name - { - if (unlikely(Lex->create_package_finalize(thd, $6, $16, $9, $15))) - MYSQL_YYABORT; - } - ; - -opt_sp_decl_body_list: - _empty - { - $$.init(); - } - | sp_decl_body_list { $$= $1; } - ; - -sp_decl_body_list: - sp_decl_non_handler_list - { - if (unlikely(Lex->sphead->sp_add_instr_cpush_for_cursors(thd, Lex->spcont))) - MYSQL_YYABORT; - } - opt_sp_decl_handler_list - { - $$.join($1, $3); - } - | sp_decl_handler_list - ; - -sp_decl_non_handler_list: - sp_decl_non_handler ';' { $$= $1; } - | sp_decl_non_handler_list sp_decl_non_handler ';' - { - $$.join($1, $2); - } - ; - -sp_decl_handler_list: - sp_decl_handler ';' { $$= $1; } - | sp_decl_handler_list sp_decl_handler ';' - { - $$.join($1, $2); - } - ; - -opt_sp_decl_handler_list: - _empty { $$.init(); } - | sp_decl_handler_list - ; - -sp_decl_non_handler: - sp_decl_variable_list - | ident_directly_assignable CONDITION_SYM FOR_SYM sp_cond - { - if (unlikely(Lex->spcont->declare_condition(thd, &$1, $4))) - MYSQL_YYABORT; - $$.vars= $$.hndlrs= $$.curs= 0; - $$.conds= 1; - } - | ident_directly_assignable EXCEPTION_ORACLE_SYM - { - sp_condition_value *spcond= new (thd->mem_root) - sp_condition_value_user_defined(); - if (unlikely(!spcond) || - unlikely(Lex->spcont->declare_condition(thd, &$1, spcond))) - MYSQL_YYABORT; - $$.vars= $$.hndlrs= $$.curs= 0; - $$.conds= 1; - } - | CURSOR_SYM ident_directly_assignable - { - Lex->sp_block_init(thd); - } - opt_parenthesized_cursor_formal_parameters - IS sp_cursor_stmt - { - sp_pcontext *param_ctx= Lex->spcont; - if (unlikely(Lex->sp_block_finalize(thd))) - MYSQL_YYABORT; - if (unlikely(Lex->sp_declare_cursor(thd, &$2, $6, param_ctx, false))) - MYSQL_YYABORT; - $$.vars= $$.conds= $$.hndlrs= 0; - $$.curs= 1; - } - ; - - -sp_proc_stmt: - sp_labeled_block - | sp_unlabeled_block - | sp_labeled_control - | sp_unlabeled_control - | sp_labelable_stmt - | labels_declaration_oracle sp_labelable_stmt {} - ; - -sp_labelable_stmt: - sp_proc_stmt_statement - | sp_proc_stmt_continue_oracle - | sp_proc_stmt_exit_oracle - | sp_proc_stmt_leave - | sp_proc_stmt_iterate - | sp_proc_stmt_goto_oracle - | sp_proc_stmt_with_cursor - | sp_proc_stmt_return - | sp_proc_stmt_if - | case_stmt_specification - | NULL_SYM { } - ; - -sp_proc_stmt_compound_ok: - sp_proc_stmt_if - | case_stmt_specification - | sp_unlabeled_block - | sp_unlabeled_control - ; - - -sp_labeled_block: - sp_block_label - BEGIN_ORACLE_SYM - { - Lex->sp_block_init(thd, &$1); - if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) - MYSQL_YYABORT; - } - sp_block_statements_and_exceptions - END - sp_opt_label - { - if (unlikely(Lex->sp_block_finalize(thd, Lex_spblock($4), &$6))) - MYSQL_YYABORT; - } - | sp_block_label - DECLARE_ORACLE_SYM - { - Lex->sp_block_init(thd, &$1); - } - sp_decl_body_list - { - if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) - MYSQL_YYABORT; - } - BEGIN_ORACLE_SYM - sp_block_statements_and_exceptions - END - sp_opt_label - { - $4.hndlrs+= $7.hndlrs; - if (unlikely(Lex->sp_block_finalize(thd, $4, &$9))) - MYSQL_YYABORT; - } - ; - -opt_not_atomic: - _empty - | not ATOMIC_SYM // TODO: BEGIN ATOMIC (not -> opt_not) - ; - -sp_unlabeled_block: - BEGIN_ORACLE_SYM opt_not_atomic - { - if (unlikely(Lex->maybe_start_compound_statement(thd))) - MYSQL_YYABORT; - Lex->sp_block_init(thd); - if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) - MYSQL_YYABORT; - } - sp_block_statements_and_exceptions - END - { - if (unlikely(Lex->sp_block_finalize(thd, Lex_spblock($4)))) - MYSQL_YYABORT; - } - | DECLARE_ORACLE_SYM - { - if (unlikely(Lex->maybe_start_compound_statement(thd))) - MYSQL_YYABORT; - Lex->sp_block_init(thd); - } - sp_decl_body_list - { - if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) - MYSQL_YYABORT; - } - BEGIN_ORACLE_SYM - sp_block_statements_and_exceptions - END - { - $3.hndlrs+= $6.hndlrs; - if (unlikely(Lex->sp_block_finalize(thd, $3))) - MYSQL_YYABORT; - } - ; - -sp_block_statements_and_exceptions: - sp_instr_addr - sp_proc_stmts - { - if (unlikely(Lex->sp_block_with_exceptions_finalize_executable_section(thd, $1))) - MYSQL_YYABORT; - } - opt_exception_clause - { - if (unlikely(Lex->sp_block_with_exceptions_finalize_exceptions(thd, $1, $4))) - MYSQL_YYABORT; - $$.init($4); - } - ; - -/* End SQL_MODE_ORACLE_SPECIFIC */ - -/** - @} (end of group Parser) -*/ |