summaryrefslogtreecommitdiff
path: root/sql/sp_rcontext.cc
diff options
context:
space:
mode:
authorhalfspawn <j.brauge@qualiac.com>2017-09-27 16:49:40 +0200
committerhalfspawn <j.brauge@qualiac.com>2017-09-27 16:49:40 +0200
commitf44d5de689cb62fc96676571f72df050a1760b20 (patch)
tree503363893180b8e67b0ce33c8ce7f1b8e1cc0c88 /sql/sp_rcontext.cc
parentd387bc89ede0adf00d5940ee89004a412aebdf46 (diff)
downloadmariadb-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.cc25
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)
{
{