1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

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

Addressing Monty's review suggestions.
This commit is contained in:
Alexander Barkov
2017-04-03 15:30:31 +04:00
parent ce4b291b51
commit cae6bf2b9c
3 changed files with 18 additions and 11 deletions

View File

@@ -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,
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,
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)

View File

@@ -3400,10 +3400,10 @@ public:
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,

View File

@@ -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;
} }