Skip to content

Commit

Permalink
Cleanup for MDEV-10581 sql_mode=ORACLE: Explicit cursor FOR LOOP
Browse files Browse the repository at this point in the history
Addressing Monty's review suggestions.
  • Loading branch information
Alexander Barkov committed Apr 5, 2017
1 parent ce4b291 commit cae6bf2
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
17 changes: 11 additions & 6 deletions sql/sql_lex.cc
Expand Up @@ -5428,9 +5428,12 @@ LEX::sp_add_for_loop_cursor_variable(THD *thd,
Item_args *parameters)
{
sp_variable *spvar= spcont->add_variable(thd, name);
if (!spvar)
return NULL;
spcont->declare_var_boundary(1);
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);

Expand Down Expand Up @@ -5488,11 +5491,15 @@ bool LEX::sp_for_loop_intrange_condition_test(THD *thd,
bool LEX::sp_for_loop_cursor_condition_test(THD *thd,
const Lex_for_loop_st &loop)
{
const LEX_STRING *cursor_name;
Item *expr;
spcont->set_for_loop(loop);
sphead->reset_lex(thd);
const LEX_STRING *cursor_name= spcont->find_cursor(loop.m_cursor_offset);
Item *expr= new (thd->mem_root) Item_func_cursor_found(thd, *cursor_name,
loop.m_cursor_offset);
cursor_name= spcont->find_cursor(loop.m_cursor_offset);
DBUG_ASSERT(cursor_name);
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))
return true;
return thd->lex->sphead->restore_lex(thd);
Expand Down Expand Up @@ -5531,9 +5538,7 @@ bool LEX::sp_for_loop_cursor_declarations(THD *thd,
const sp_pcursor *pcursor;

if ((item_splocal= item->get_item_splocal()))
{
name= item_splocal->m_name;
}
else if ((item_field= item->type() == Item::FIELD_ITEM ?
static_cast<Item_field *>(item) : NULL) &&
item_field->table_name == NULL)
Expand Down
4 changes: 2 additions & 2 deletions sql/sql_lex.h
Expand Up @@ -3400,10 +3400,10 @@ struct LEX: public Query_tables_list
This methods adds declarations:
- 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
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,
const LEX_STRING &index,
Expand Down
8 changes: 5 additions & 3 deletions sql/sql_yacc_ora.yy
Expand Up @@ -3888,21 +3888,23 @@ sp_for_loop_bounds:
}
| IN_SYM opt_sp_for_loop_direction '(' sp_cursor_stmt ')'
{
Item *item;
DBUG_ASSERT(Lex->sphead);
LEX_STRING name= {C_STRING_WITH_LEN("[implicit_cursor]") };
if (Lex->sp_declare_cursor(thd, name, $4, NULL, true))
MYSQL_YYABORT;
$$.m_direction= 1;
if (!($$.m_index= new (thd->mem_root) sp_assignment_lex(thd, thd->lex)))
MYSQL_YYABORT;
$$.m_index->sp_lex_in_use= true;
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(),
NullS, NullS, name.str);
NullS, NullS, name.str)))
MYSQL_YYABORT;
$$.m_index->set_item_and_free_list(item, NULL);
if (Lex->sphead->restore_lex(thd))
MYSQL_YYABORT;
$$.m_direction= 1;
$$.m_upper_bound= NULL;
$$.m_implicit_cursor= true;
}
Expand Down

0 comments on commit cae6bf2

Please sign in to comment.