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:
@@ -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)
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user