diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-03-06 17:36:30 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-03-07 18:48:15 +0400 |
commit | 5f34513c2a2dd5f8431cf03f6ba083c42f233dca (patch) | |
tree | a4314e0b0762a0401de604a5e23fa20d3a8551b8 /sql/sql_lex.h | |
parent | a71d185a9a84c4c5f5d251e43aaaaf6efa0aa8d9 (diff) | |
download | mariadb-git-5f34513c2a2dd5f8431cf03f6ba083c42f233dca.tar.gz |
MDEV-18813 PROCEDURE and anonymous blocks silently ignore FETCH GROUP NEXT ROW
Part#2 (final): rewritting the code to pass the correct enum_sp_aggregate_type
to the sp_head constructor, so sp_head never changes its aggregation type
later on. The grammar has been simplified and defragmented.
This allowed to check aggregate specific instructions right after
a routine body has been scanned, by calling new LEX methods:
sp_body_finalize_{procedure|function|trigger|event}()
Moving some C++ code from *.yy to a few new helper methods in LEX.
Diffstat (limited to 'sql/sql_lex.h')
-rw-r--r-- | sql/sql_lex.h | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 70272e83e08..b78a010d4b7 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -241,6 +241,14 @@ enum enum_sp_suid_behaviour }; +enum enum_sp_aggregate_type +{ + DEFAULT_AGGREGATE= 0, + NOT_AGGREGATE, + GROUP_AGGREGATE +}; + + /* These may not be declared yet */ class Table_ident; class sql_exchange; @@ -371,13 +379,6 @@ enum enum_sp_data_access SP_MODIFIES_SQL_DATA }; -enum enum_sp_aggregate_type -{ - DEFAULT_AGGREGATE= 0, - NOT_AGGREGATE, - GROUP_AGGREGATE -}; - const LEX_CSTRING sp_data_access_name[]= { { STRING_WITH_LEN("") }, @@ -3734,12 +3735,16 @@ public: sp_name *make_sp_name(THD *thd, const LEX_CSTRING *name1, const LEX_CSTRING *name2); sp_name *make_sp_name_package_routine(THD *thd, const LEX_CSTRING *name); - sp_head *make_sp_head(THD *thd, const sp_name *name, const Sp_handler *sph); + sp_head *make_sp_head(THD *thd, const sp_name *name, const Sp_handler *sph, + enum_sp_aggregate_type agg_type); sp_head *make_sp_head_no_recursive(THD *thd, const sp_name *name, - const Sp_handler *sph); + const Sp_handler *sph, + enum_sp_aggregate_type agg_type); + bool sp_body_finalize_routine(THD *); + bool sp_body_finalize_trigger(THD *); + bool sp_body_finalize_event(THD *); bool sp_body_finalize_function(THD *); bool sp_body_finalize_procedure(THD *); - bool sp_body_finalize_function_standalone(THD *, const sp_name *end_name); bool sp_body_finalize_procedure_standalone(THD *, const sp_name *end_name); sp_package *create_package_start(THD *thd, enum_sql_command command, @@ -4502,6 +4507,17 @@ public: { pop_select(); // main select } + + bool stmt_create_stored_function_start(const DDL_options_st &options, + enum_sp_aggregate_type, + const sp_name *name); + bool stmt_create_stored_function_finalize_standalone(const sp_name *end_name); + + bool stmt_create_udf_function(const DDL_options_st &options, + enum_sp_aggregate_type agg_type, + const Lex_ident_sys_st &name, + Item_result return_type, + const LEX_CSTRING &soname); }; |