diff options
author | halfspawn <j.brauge@qualiac.com> | 2017-09-27 16:49:40 +0200 |
---|---|---|
committer | halfspawn <j.brauge@qualiac.com> | 2017-09-27 16:49:40 +0200 |
commit | f44d5de689cb62fc96676571f72df050a1760b20 (patch) | |
tree | 503363893180b8e67b0ce33c8ce7f1b8e1cc0c88 /sql/sp_rcontext.cc | |
parent | d387bc89ede0adf00d5940ee89004a412aebdf46 (diff) | |
download | mariadb-git-f44d5de689cb62fc96676571f72df050a1760b20.tar.gz |
MDEV-13919 sql_mode=ORACLE: Derive length of VARCHAR SP parameters with no length from actual parameters
Diffstat (limited to 'sql/sp_rcontext.cc')
-rw-r--r-- | sql/sp_rcontext.cc | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index a684265ee66..3413a76e8c7 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -63,7 +63,8 @@ sp_rcontext::~sp_rcontext() sp_rcontext *sp_rcontext::create(THD *thd, const sp_pcontext *root_parsing_ctx, Field *return_value_fld, - bool resolve_type_refs) + bool resolve_type_refs, + List<Item> *args) { sp_rcontext *ctx= new (thd->mem_root) sp_rcontext(root_parsing_ctx, return_value_fld, @@ -75,6 +76,10 @@ sp_rcontext *sp_rcontext::create(THD *thd, List<Spvar_definition> field_def_lst; ctx->m_root_parsing_ctx->retrieve_field_definitions(&field_def_lst); + if (args && + ctx->adjust_formal_params_to_actual_params(thd, field_def_lst, args)) + return NULL; + if (ctx->alloc_arrays(thd) || (resolve_type_refs && ctx->resolve_type_refs(thd, field_def_lst)) || ctx->init_var_table(thd, field_def_lst) || @@ -88,6 +93,24 @@ sp_rcontext *sp_rcontext::create(THD *thd, } +bool sp_rcontext::adjust_formal_params_to_actual_params(THD *thd, + List<Spvar_definition> &field_def_lst, + List<Item> *args) +{ + List_iterator<Spvar_definition> it(field_def_lst); + List_iterator<Item> it_args(*args); + DBUG_ASSERT(field_def_lst.elements >= args->elements ); + Spvar_definition *def; + Item *arg; + while ((def= it++) && (arg= it_args++)) + { + if (def->type_handler()->adjust_spparam_type(def, arg)) + true; + } + return false; +} + + bool sp_rcontext::alloc_arrays(THD *thd) { { |