diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-05-21 12:30:21 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-05-21 12:30:21 +0400 |
commit | ed39181a27ed95e1de63661bdeb6cfc21c3c6c03 (patch) | |
tree | 669f83585b6b8ef3133ba4c27b17a692c890e57a | |
parent | fae1319450eea47e9bb6d33cf5134671931b5fdc (diff) | |
download | mariadb-git-ed39181a27ed95e1de63661bdeb6cfc21c3c6c03.tar.gz |
MDEV-19533 Add methods make() and append_uniq() to Row_definition_list
-rw-r--r-- | sql/field.h | 8 | ||||
-rw-r--r-- | sql/sp_rcontext.cc | 13 | ||||
-rw-r--r-- | sql/sql_lex.cc | 16 | ||||
-rw-r--r-- | sql/sql_lex.h | 1 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 15 | ||||
-rw-r--r-- | sql/sql_yacc_ora.yy | 15 |
6 files changed, 44 insertions, 24 deletions
diff --git a/sql/field.h b/sql/field.h index 5b924e3e86e..ceb4a8bb93f 100644 --- a/sql/field.h +++ b/sql/field.h @@ -4852,6 +4852,14 @@ public: } return 0; } + static Row_definition_list *make(MEM_ROOT *mem_root, Spvar_definition *var) + { + Row_definition_list *list; + if (!(list= new (mem_root) Row_definition_list())) + return NULL; + return list->push_back(var, mem_root) ? NULL : list; + } + bool append_uniq(MEM_ROOT *thd, Spvar_definition *var); bool adjust_formal_params_to_actual_params(THD *thd, List<Item> *args); bool adjust_formal_params_to_actual_params(THD *thd, Item **args, uint arg_count); diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index 961862d2b18..17b4c83b7bc 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -119,6 +119,19 @@ sp_rcontext *sp_rcontext::create(THD *thd, } +bool Row_definition_list::append_uniq(MEM_ROOT *mem_root, Spvar_definition *var) +{ + DBUG_ASSERT(elements); + uint unused; + if (unlikely(find_row_field_by_name(&var->field_name, &unused))) + { + my_error(ER_DUP_FIELDNAME, MYF(0), var->field_name.str); + return true; + } + return push_back(var, mem_root); +} + + bool Row_definition_list:: adjust_formal_params_to_actual_params(THD *thd, List<Item> *args) { diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 5550306877a..adc9c6c752b 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -10416,3 +10416,19 @@ bool LEX::stmt_create_stored_function_start(const DDL_options_st &options, return true; return false; } + + +Spvar_definition *LEX::row_field_name(THD *thd, const Lex_ident_sys_st &name) +{ + Spvar_definition *res; + if (unlikely(check_string_char_length(&name, 0, NAME_CHAR_LEN, + system_charset_info, 1))) + { + my_error(ER_TOO_LONG_IDENT, MYF(0), name.str); + return NULL; + } + if (unlikely(!(res= new (thd->mem_root) Spvar_definition()))) + return NULL; + init_last_field(res, &name, thd->variables.collation_database); + return res; +} diff --git a/sql/sql_lex.h b/sql/sql_lex.h index c53fa1b1fd4..7a56ce55297 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -4506,6 +4506,7 @@ public: const Lex_ident_sys_st &name, Item_result return_type, const LEX_CSTRING &soname); + Spvar_definition *row_field_name(THD *thd, const Lex_ident_sys_st &name); }; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index fd461ad05aa..08f9c4b4117 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3508,12 +3508,8 @@ optionally_qualified_column_ident: row_field_name: ident { - 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(!($$= new (thd->mem_root) Spvar_definition()))) + if (!($$= Lex->row_field_name(thd, $1))) MYSQL_YYABORT; - Lex->init_last_field($$, &$1, thd->variables.collation_database); } ; @@ -3524,17 +3520,12 @@ row_field_definition: row_field_definition_list: row_field_definition { - if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) || - unlikely($$->push_back($1, thd->mem_root))) + if (!($$= Row_definition_list::make(thd->mem_root, $1))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { - uint unused; - if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused))) - my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str)); - $$= $1; - if (unlikely($$->push_back($3, thd->mem_root))) + if (($$= $1)->append_uniq(thd->mem_root, $3)) MYSQL_YYABORT; } ; diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index f6fd27bc183..1537adaaaf3 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -3411,12 +3411,8 @@ optionally_qualified_column_ident: row_field_name: ident_directly_assignable { - 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(!($$= new (thd->mem_root) Spvar_definition()))) + if (!($$= Lex->row_field_name(thd, $1))) MYSQL_YYABORT; - Lex->init_last_field($$, &$1, thd->variables.collation_database); } ; @@ -3427,17 +3423,12 @@ row_field_definition: row_field_definition_list: row_field_definition { - if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) || - unlikely($$->push_back($1, thd->mem_root))) + if (!($$= Row_definition_list::make(thd->mem_root, $1))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { - uint unused; - if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused))) - my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str)); - $$= $1; - if (unlikely($$->push_back($3, thd->mem_root))) + if (($$= $1)->append_uniq(thd->mem_root, $3)) MYSQL_YYABORT; } ; |