Commit 596baeb1 authored by Alexander Barkov's avatar Alexander Barkov

A cleanup for MDEV-10577 and MDEV-13919: moving a few sp_rcontext methods

Moving a few methods from sp_rcontext to different classes:

- Table_ident::resolve_table_rowtype_ref
- Qualified_column_ident::resolve_type_ref
- Row_definition_list::resolve_table_rowtype_ref
- Row_definition_list::adjust_formal_params_to_actual_params

It easier to reuse these methods this way in the future.
parent 3a6d9442
...@@ -4095,6 +4095,8 @@ class Row_definition_list: public List<class Spvar_definition> ...@@ -4095,6 +4095,8 @@ class Row_definition_list: public List<class Spvar_definition>
} }
return 0; return 0;
} }
bool adjust_formal_params_to_actual_params(THD *thd, List<Item> *args);
bool resolve_type_refs(THD *);
}; };
......
...@@ -73,15 +73,15 @@ sp_rcontext *sp_rcontext::create(THD *thd, ...@@ -73,15 +73,15 @@ sp_rcontext *sp_rcontext::create(THD *thd,
if (!ctx) if (!ctx)
return NULL; return NULL;
List<Spvar_definition> field_def_lst; Row_definition_list field_def_lst;
ctx->m_root_parsing_ctx->retrieve_field_definitions(&field_def_lst); ctx->m_root_parsing_ctx->retrieve_field_definitions(&field_def_lst);
if (args && if (args &&
ctx->adjust_formal_params_to_actual_params(thd, field_def_lst, args)) field_def_lst.adjust_formal_params_to_actual_params(thd, args))
return NULL; return NULL;
if (ctx->alloc_arrays(thd) || if (ctx->alloc_arrays(thd) ||
(resolve_type_refs && ctx->resolve_type_refs(thd, field_def_lst)) || (resolve_type_refs && field_def_lst.resolve_type_refs(thd)) ||
ctx->init_var_table(thd, field_def_lst) || ctx->init_var_table(thd, field_def_lst) ||
ctx->init_var_items(thd, field_def_lst)) ctx->init_var_items(thd, field_def_lst))
{ {
...@@ -93,13 +93,12 @@ sp_rcontext *sp_rcontext::create(THD *thd, ...@@ -93,13 +93,12 @@ sp_rcontext *sp_rcontext::create(THD *thd,
} }
bool sp_rcontext::adjust_formal_params_to_actual_params(THD *thd, bool Row_definition_list::
List<Spvar_definition> &field_def_lst, adjust_formal_params_to_actual_params(THD *thd, List<Item> *args)
List<Item> *args)
{ {
List_iterator<Spvar_definition> it(field_def_lst); List_iterator<Spvar_definition> it(*this);
List_iterator<Item> it_args(*args); List_iterator<Item> it_args(*args);
DBUG_ASSERT(field_def_lst.elements >= args->elements ); DBUG_ASSERT(elements >= args->elements );
Spvar_definition *def; Spvar_definition *def;
Item *arg; Item *arg;
while ((def= it++) && (arg= it_args++)) while ((def= it++) && (arg= it_args++))
...@@ -169,8 +168,7 @@ check_column_grant_for_type_ref(THD *thd, TABLE_LIST *table_list, ...@@ -169,8 +168,7 @@ check_column_grant_for_type_ref(THD *thd, TABLE_LIST *table_list,
/** /**
This method implementation is very close to fill_schema_table_by_open(). This method implementation is very close to fill_schema_table_by_open().
*/ */
bool sp_rcontext::resolve_type_ref(THD *thd, Column_definition *def, bool Qualified_column_ident::resolve_type_ref(THD *thd, Column_definition *def)
Qualified_column_ident *ref)
{ {
Open_tables_backup open_tables_state_backup; Open_tables_backup open_tables_state_backup;
thd->reset_n_backup_open_tables_state(&open_tables_state_backup); thd->reset_n_backup_open_tables_state(&open_tables_state_backup);
...@@ -187,18 +185,18 @@ bool sp_rcontext::resolve_type_ref(THD *thd, Column_definition *def, ...@@ -187,18 +185,18 @@ bool sp_rcontext::resolve_type_ref(THD *thd, Column_definition *def,
// Make %TYPE variables see temporary tables that shadow permanent tables // Make %TYPE variables see temporary tables that shadow permanent tables
thd->temporary_tables= open_tables_state_backup.temporary_tables; thd->temporary_tables= open_tables_state_backup.temporary_tables;
if ((table_list= lex.select_lex.add_table_to_list(thd, ref, NULL, 0, if ((table_list= lex.select_lex.add_table_to_list(thd, this, NULL, 0,
TL_READ_NO_INSERT, TL_READ_NO_INSERT,
MDL_SHARED_READ)) && MDL_SHARED_READ)) &&
!check_table_access(thd, SELECT_ACL, table_list, TRUE, UINT_MAX, FALSE) && !check_table_access(thd, SELECT_ACL, table_list, TRUE, UINT_MAX, FALSE) &&
!open_tables_only_view_structure(thd, table_list, !open_tables_only_view_structure(thd, table_list,
thd->mdl_context.has_locks())) thd->mdl_context.has_locks()))
{ {
if ((src= lex.query_tables->table->find_field_by_name(&ref->m_column))) if ((src= lex.query_tables->table->find_field_by_name(&m_column)))
{ {
if (!(rc= check_column_grant_for_type_ref(thd, table_list, if (!(rc= check_column_grant_for_type_ref(thd, table_list,
ref->m_column.str, m_column.str,
ref->m_column.length))) m_column.length)))
{ {
*def= Column_definition(thd, src, NULL/*No defaults,no constraints*/); *def= Column_definition(thd, src, NULL/*No defaults,no constraints*/);
def->flags&= (uint) ~NOT_NULL_FLAG; def->flags&= (uint) ~NOT_NULL_FLAG;
...@@ -206,7 +204,7 @@ bool sp_rcontext::resolve_type_ref(THD *thd, Column_definition *def, ...@@ -206,7 +204,7 @@ bool sp_rcontext::resolve_type_ref(THD *thd, Column_definition *def,
} }
} }
else else
my_error(ER_BAD_FIELD_ERROR, MYF(0), ref->m_column.str, ref->table.str); my_error(ER_BAD_FIELD_ERROR, MYF(0), m_column.str, table.str);
} }
lex.unit.cleanup(); lex.unit.cleanup();
...@@ -223,9 +221,8 @@ bool sp_rcontext::resolve_type_ref(THD *thd, Column_definition *def, ...@@ -223,9 +221,8 @@ bool sp_rcontext::resolve_type_ref(THD *thd, Column_definition *def,
rec t1%ROWTYPE; rec t1%ROWTYPE;
It opens the table "t1" and copies its structure to %ROWTYPE variable. It opens the table "t1" and copies its structure to %ROWTYPE variable.
*/ */
bool sp_rcontext::resolve_table_rowtype_ref(THD *thd, bool Table_ident::resolve_table_rowtype_ref(THD *thd,
Row_definition_list &defs, Row_definition_list &defs)
Table_ident *ref)
{ {
Open_tables_backup open_tables_state_backup; Open_tables_backup open_tables_state_backup;
thd->reset_n_backup_open_tables_state(&open_tables_state_backup); thd->reset_n_backup_open_tables_state(&open_tables_state_backup);
...@@ -246,7 +243,7 @@ bool sp_rcontext::resolve_table_rowtype_ref(THD *thd, ...@@ -246,7 +243,7 @@ bool sp_rcontext::resolve_table_rowtype_ref(THD *thd,
// Make %ROWTYPE variables see temporary tables that shadow permanent tables // Make %ROWTYPE variables see temporary tables that shadow permanent tables
thd->temporary_tables= open_tables_state_backup.temporary_tables; thd->temporary_tables= open_tables_state_backup.temporary_tables;
if ((table_list= lex.select_lex.add_table_to_list(thd, ref, NULL, 0, if ((table_list= lex.select_lex.add_table_to_list(thd, this, NULL, 0,
TL_READ_NO_INSERT, TL_READ_NO_INSERT,
MDL_SHARED_READ)) && MDL_SHARED_READ)) &&
!check_table_access(thd, SELECT_ACL, table_list, TRUE, UINT_MAX, FALSE) && !check_table_access(thd, SELECT_ACL, table_list, TRUE, UINT_MAX, FALSE) &&
...@@ -284,14 +281,14 @@ bool sp_rcontext::resolve_table_rowtype_ref(THD *thd, ...@@ -284,14 +281,14 @@ bool sp_rcontext::resolve_table_rowtype_ref(THD *thd,
} }
bool sp_rcontext::resolve_type_refs(THD *thd, List<Spvar_definition> &defs) bool Row_definition_list::resolve_type_refs(THD *thd)
{ {
List_iterator<Spvar_definition> it(defs); List_iterator<Spvar_definition> it(*this);
Spvar_definition *def; Spvar_definition *def;
while ((def= it++)) while ((def= it++))
{ {
if (def->is_column_type_ref() && if (def->is_column_type_ref() &&
resolve_type_ref(thd, def, def->column_type_ref())) def->column_type_ref()->resolve_type_ref(thd, def))
return true; return true;
} }
return false; return false;
...@@ -323,7 +320,7 @@ bool sp_rcontext::init_var_items(THD *thd, ...@@ -323,7 +320,7 @@ bool sp_rcontext::init_var_items(THD *thd,
Row_definition_list defs; Row_definition_list defs;
Item_field_row *item= new (thd->mem_root) Item_field_row(thd, field); Item_field_row *item= new (thd->mem_root) Item_field_row(thd, field);
if (!(m_var_items[idx]= item) || if (!(m_var_items[idx]= item) ||
resolve_table_rowtype_ref(thd, defs, def->table_rowtype_ref()) || def->table_rowtype_ref()->resolve_table_rowtype_ref(thd, defs) ||
item->row_create_items(thd, &defs)) item->row_create_items(thd, &defs))
return true; return true;
} }
......
...@@ -340,15 +340,6 @@ class sp_rcontext : public Sql_alloc ...@@ -340,15 +340,6 @@ class sp_rcontext : public Sql_alloc
/// @retval true on error. /// @retval true on error.
bool init_var_table(THD *thd, List<Spvar_definition> &defs); bool init_var_table(THD *thd, List<Spvar_definition> &defs);
bool resolve_type_refs(THD *, List<Spvar_definition> &defs);
bool resolve_type_ref(THD *thd, Column_definition *def,
Qualified_column_ident *ref);
bool resolve_table_rowtype_ref(THD *thd, Row_definition_list &defs,
Table_ident *ref);
bool adjust_formal_params_to_actual_params(THD *thd,
List<Spvar_definition> &field_def_lst,
List<Item> *args);
/// Create and initialize an Item-adapter (Item_field) for each SP-var field. /// Create and initialize an Item-adapter (Item_field) for each SP-var field.
/// ///
/// param thd Thread handle. /// param thd Thread handle.
......
...@@ -5496,6 +5496,7 @@ class Table_ident :public Sql_alloc ...@@ -5496,6 +5496,7 @@ class Table_ident :public Sql_alloc
{ {
db= *db_name; db= *db_name;
} }
bool resolve_table_rowtype_ref(THD *thd, Row_definition_list &defs);
}; };
...@@ -5519,6 +5520,7 @@ class Qualified_column_ident: public Table_ident ...@@ -5519,6 +5520,7 @@ class Qualified_column_ident: public Table_ident
:Table_ident(thd, db, table, false), :Table_ident(thd, db, table, false),
m_column(*column) m_column(*column)
{ } { }
bool resolve_type_ref(THD *thd, Column_definition *def);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment