From cae6bf2b9c0c109b429e6db98dfc0ca8a13408d6 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 3 Apr 2017 15:30:31 +0400 Subject: [PATCH] Cleanup for MDEV-10581 sql_mode=ORACLE: Explicit cursor FOR LOOP Addressing Monty's review suggestions. --- sql/sql_lex.cc | 17 +++++++++++------ sql/sql_lex.h | 4 ++-- sql/sql_yacc_ora.yy | 8 +++++--- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 655c0872eeb..43e2e53ff6e 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -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); @@ -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); @@ -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) : NULL) && item_field->table_name == NULL) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index fe07c0367c9..6211330c2c2 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -3400,10 +3400,10 @@ public: 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, diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index de0cb80cd84..17eefce5a72 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -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; }