Commit cae6bf2b authored by Alexander Barkov's avatar Alexander Barkov

Cleanup for MDEV-10581 sql_mode=ORACLE: Explicit cursor FOR LOOP

Addressing Monty's review suggestions.
parent ce4b291b
...@@ -5428,9 +5428,12 @@ LEX::sp_add_for_loop_cursor_variable(THD *thd, ...@@ -5428,9 +5428,12 @@ LEX::sp_add_for_loop_cursor_variable(THD *thd,
Item_args *parameters) Item_args *parameters)
{ {
sp_variable *spvar= spcont->add_variable(thd, name); sp_variable *spvar= spcont->add_variable(thd, name);
if (!spvar)
return NULL;
spcont->declare_var_boundary(1); spcont->declare_var_boundary(1);
sphead->fill_spvar_definition(thd, &spvar->field_def, spvar->name.str); sphead->fill_spvar_definition(thd, &spvar->field_def, spvar->name.str);
spvar->default_value= new (thd->mem_root) Item_null(thd); if (!(spvar->default_value= new (thd->mem_root) Item_null(thd)))
return NULL;
spvar->field_def.set_cursor_rowtype_ref(true); spvar->field_def.set_cursor_rowtype_ref(true);
...@@ -5488,11 +5491,15 @@ bool LEX::sp_for_loop_intrange_condition_test(THD *thd, ...@@ -5488,11 +5491,15 @@ bool LEX::sp_for_loop_intrange_condition_test(THD *thd,
bool LEX::sp_for_loop_cursor_condition_test(THD *thd, bool LEX::sp_for_loop_cursor_condition_test(THD *thd,
const Lex_for_loop_st &loop) const Lex_for_loop_st &loop)
{ {
const LEX_STRING *cursor_name;
Item *expr;
spcont->set_for_loop(loop); spcont->set_for_loop(loop);
sphead->reset_lex(thd); sphead->reset_lex(thd);
const LEX_STRING *cursor_name= spcont->find_cursor(loop.m_cursor_offset); cursor_name= spcont->find_cursor(loop.m_cursor_offset);
Item *expr= new (thd->mem_root) Item_func_cursor_found(thd, *cursor_name, DBUG_ASSERT(cursor_name);
loop.m_cursor_offset); if (!(expr= new (thd->mem_root) Item_func_cursor_found(thd, *cursor_name,
loop.m_cursor_offset)))
return true;
if (thd->lex->sp_while_loop_expression(thd, expr)) if (thd->lex->sp_while_loop_expression(thd, expr))
return true; return true;
return thd->lex->sphead->restore_lex(thd); return thd->lex->sphead->restore_lex(thd);
...@@ -5531,9 +5538,7 @@ bool LEX::sp_for_loop_cursor_declarations(THD *thd, ...@@ -5531,9 +5538,7 @@ bool LEX::sp_for_loop_cursor_declarations(THD *thd,
const sp_pcursor *pcursor; const sp_pcursor *pcursor;
if ((item_splocal= item->get_item_splocal())) if ((item_splocal= item->get_item_splocal()))
{
name= item_splocal->m_name; name= item_splocal->m_name;
}
else if ((item_field= item->type() == Item::FIELD_ITEM ? else if ((item_field= item->type() == Item::FIELD_ITEM ?
static_cast<Item_field *>(item) : NULL) && static_cast<Item_field *>(item) : NULL) &&
item_field->table_name == NULL) item_field->table_name == NULL)
......
...@@ -3400,10 +3400,10 @@ struct LEX: public Query_tables_list ...@@ -3400,10 +3400,10 @@ struct LEX: public Query_tables_list
This methods adds declarations: This methods adds declarations:
- An explicit integer or cursor%ROWTYPE "index" variable - An explicit integer or cursor%ROWTYPE "index" variable
- An implicit ingeger upper bound variable, in case of integer range loops - An implicit integer upper bound variable, in case of integer range loops
- A CURSOR, in case of an implicit CURSOR loops - A CURSOR, in case of an implicit CURSOR loops
The generated variables are stored into "loop". The generated variables are stored into "loop".
Additional loop characteristics are copies from "bounds" to "loop". Additional loop characteristics are copied from "bounds" to "loop".
*/ */
bool sp_for_loop_declarations(THD *thd, Lex_for_loop_st *loop, bool sp_for_loop_declarations(THD *thd, Lex_for_loop_st *loop,
const LEX_STRING &index, const LEX_STRING &index,
......
...@@ -3888,21 +3888,23 @@ sp_for_loop_bounds: ...@@ -3888,21 +3888,23 @@ sp_for_loop_bounds:
} }
| IN_SYM opt_sp_for_loop_direction '(' sp_cursor_stmt ')' | IN_SYM opt_sp_for_loop_direction '(' sp_cursor_stmt ')'
{ {
Item *item;
DBUG_ASSERT(Lex->sphead); DBUG_ASSERT(Lex->sphead);
LEX_STRING name= {C_STRING_WITH_LEN("[implicit_cursor]") }; LEX_STRING name= {C_STRING_WITH_LEN("[implicit_cursor]") };
if (Lex->sp_declare_cursor(thd, name, $4, NULL, true)) if (Lex->sp_declare_cursor(thd, name, $4, NULL, true))
MYSQL_YYABORT; MYSQL_YYABORT;
$$.m_direction= 1;
if (!($$.m_index= new (thd->mem_root) sp_assignment_lex(thd, thd->lex))) if (!($$.m_index= new (thd->mem_root) sp_assignment_lex(thd, thd->lex)))
MYSQL_YYABORT; MYSQL_YYABORT;
$$.m_index->sp_lex_in_use= true; $$.m_index->sp_lex_in_use= true;
Lex->sphead->reset_lex(thd, $$.m_index); Lex->sphead->reset_lex(thd, $$.m_index);
Item *item= new (thd->mem_root) Item_field(thd, if (!(item= new (thd->mem_root) Item_field(thd,
Lex->current_context(), Lex->current_context(),
NullS, NullS, name.str); NullS, NullS, name.str)))
MYSQL_YYABORT;
$$.m_index->set_item_and_free_list(item, NULL); $$.m_index->set_item_and_free_list(item, NULL);
if (Lex->sphead->restore_lex(thd)) if (Lex->sphead->restore_lex(thd))
MYSQL_YYABORT; MYSQL_YYABORT;
$$.m_direction= 1;
$$.m_upper_bound= NULL; $$.m_upper_bound= NULL;
$$.m_implicit_cursor= true; $$.m_implicit_cursor= true;
} }
......
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