diff options
Diffstat (limited to 'sql/sql_class.h')
-rw-r--r-- | sql/sql_class.h | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h index 7e06dcc7d39..a43f4dec0c9 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3166,6 +3166,8 @@ public: sp_rcontext *spcont; // SP runtime context sp_cache *sp_proc_cache; sp_cache *sp_func_cache; + sp_cache *sp_package_spec_cache; + sp_cache *sp_package_body_cache; /** number of name_const() substitutions, see sp_head.cc:subst_spvars() */ uint query_name_consts; @@ -5902,6 +5904,7 @@ public: }; class my_var_sp: public my_var { + const Sp_rcontext_handler *m_rcontext_handler; const Type_handler *m_type_handler; public: uint offset; @@ -5910,13 +5913,17 @@ public: runtime context is used for variable handling. */ sp_head *sp; - my_var_sp(const LEX_CSTRING *j, uint o, const Type_handler *type_handler, + my_var_sp(const Sp_rcontext_handler *rcontext_handler, + const LEX_CSTRING *j, uint o, const Type_handler *type_handler, sp_head *s) - : my_var(j, LOCAL_VAR), m_type_handler(type_handler), offset(o), sp(s) { } + : my_var(j, LOCAL_VAR), + m_rcontext_handler(rcontext_handler), + m_type_handler(type_handler), offset(o), sp(s) { } ~my_var_sp() { } bool set(THD *thd, Item *val); my_var_sp *get_my_var_sp() { return this; } const Type_handler *type_handler() const { return m_type_handler; } + sp_rcontext *get_rcontext(sp_rcontext *local_ctx) const; }; /* @@ -5927,9 +5934,11 @@ class my_var_sp_row_field: public my_var_sp { uint m_field_offset; public: - my_var_sp_row_field(const LEX_CSTRING *varname, const LEX_CSTRING *fieldname, + my_var_sp_row_field(const Sp_rcontext_handler *rcontext_handler, + const LEX_CSTRING *varname, const LEX_CSTRING *fieldname, uint var_idx, uint field_idx, sp_head *s) - :my_var_sp(varname, var_idx, &type_handler_double/*Not really used*/, s), + :my_var_sp(rcontext_handler, varname, var_idx, + &type_handler_double/*Not really used*/, s), m_field_offset(field_idx) { } bool set(THD *thd, Item *val); @@ -6304,6 +6313,9 @@ public: Database_qualified_name(const LEX_CSTRING *db, const LEX_CSTRING *name) :m_db(*db), m_name(*name) { } + Database_qualified_name(const LEX_CSTRING &db, const LEX_CSTRING &name) + :m_db(db), m_name(name) + { } Database_qualified_name(const char *db, size_t db_length, const char *name, size_t name_length) { @@ -6353,6 +6365,34 @@ public: DBUG_SLOW_ASSERT(ok_for_lower_case_names(m_db.str)); return false; } + + bool make_package_routine_name(MEM_ROOT *mem_root, + const LEX_CSTRING &package, + const LEX_CSTRING &routine) + { + char *tmp; + size_t length= package.length + 1 + routine.length + 1; + if (!(tmp= (char *) alloc_root(mem_root, length))) + return true; + m_name.length= my_snprintf(tmp, length, "%.*s.%.*s", + (int) package.length, package.str, + (int) routine.length, routine.str); + m_name.str= tmp; + return false; + } + + bool make_package_routine_name(MEM_ROOT *mem_root, + const LEX_CSTRING &db, + const LEX_CSTRING &package, + const LEX_CSTRING &routine) + { + if (make_package_routine_name(mem_root, package, routine)) + return true; + if (!(m_db.str= strmake_root(mem_root, db.str, db.length))) + return true; + m_db.length= db.length; + return false; + } }; |