mirror of
https://github.com/MariaDB/server.git
synced 2025-08-09 22:24:09 +03:00
MDEV-11346 Move functions case_stmt_xxx and add_select_to_union_list as methods to LEX
The full list of functions moved: int case_stmt_action_expr(LEX *, Item* expr); int case_stmt_action_when(LEX *, Item *when, bool simple); int case_stmt_action_then(LEX *); bool add_select_to_union_list(LEX *,bool is_union_distinct, bool is_top_level); This is a preparatory change for "MDEV-10142 PL/SQL parser", to reuse the code easier between sql_yacc.yy and coming soon sql_yacc_ora.yy.
This commit is contained in:
@@ -3010,6 +3010,12 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int case_stmt_action_expr(Item* expr);
|
||||||
|
int case_stmt_action_when(Item *when, bool simple);
|
||||||
|
int case_stmt_action_then();
|
||||||
|
bool add_select_to_union_list(bool is_union_distinct, bool is_top_level);
|
||||||
|
bool setup_select_in_parentheses();
|
||||||
|
|
||||||
// Check if "KEY IF NOT EXISTS name" used outside of ALTER context
|
// Check if "KEY IF NOT EXISTS name" used outside of ALTER context
|
||||||
bool check_add_key(DDL_options_st ddl)
|
bool check_add_key(DDL_options_st ddl)
|
||||||
{
|
{
|
||||||
|
100
sql/sql_yacc.yy
100
sql/sql_yacc.yy
@@ -290,22 +290,20 @@ static bool push_sp_empty_label(THD *thd)
|
|||||||
@return 0 on success
|
@return 0 on success
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int case_stmt_action_expr(LEX *lex, Item* expr)
|
int LEX::case_stmt_action_expr(Item* expr)
|
||||||
{
|
{
|
||||||
sp_head *sp= lex->sphead;
|
int case_expr_id= spcont->register_case_expr();
|
||||||
sp_pcontext *parsing_ctx= lex->spcont;
|
|
||||||
int case_expr_id= parsing_ctx->register_case_expr();
|
|
||||||
sp_instr_set_case_expr *i;
|
sp_instr_set_case_expr *i;
|
||||||
|
|
||||||
if (parsing_ctx->push_case_expr_id(case_expr_id))
|
if (spcont->push_case_expr_id(case_expr_id))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
i= new (lex->thd->mem_root)
|
i= new (thd->mem_root)
|
||||||
sp_instr_set_case_expr(sp->instructions(), parsing_ctx, case_expr_id, expr,
|
sp_instr_set_case_expr(sphead->instructions(), spcont, case_expr_id, expr,
|
||||||
lex);
|
this);
|
||||||
|
|
||||||
sp->add_cont_backpatch(i);
|
sphead->add_cont_backpatch(i);
|
||||||
return sp->add_instr(i);
|
return sphead->add_instr(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -316,33 +314,30 @@ int case_stmt_action_expr(LEX *lex, Item* expr)
|
|||||||
@param simple true for simple cases, false for searched cases
|
@param simple true for simple cases, false for searched cases
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int case_stmt_action_when(LEX *lex, Item *when, bool simple)
|
int LEX::case_stmt_action_when(Item *when, bool simple)
|
||||||
{
|
{
|
||||||
sp_head *sp= lex->sphead;
|
uint ip= sphead->instructions();
|
||||||
sp_pcontext *ctx= lex->spcont;
|
|
||||||
uint ip= sp->instructions();
|
|
||||||
sp_instr_jump_if_not *i;
|
sp_instr_jump_if_not *i;
|
||||||
Item_case_expr *var;
|
Item_case_expr *var;
|
||||||
Item *expr;
|
Item *expr;
|
||||||
THD *thd= lex->thd;
|
|
||||||
|
|
||||||
if (simple)
|
if (simple)
|
||||||
{
|
{
|
||||||
var= new (thd->mem_root)
|
var= new (thd->mem_root)
|
||||||
Item_case_expr(thd, ctx->get_current_case_expr_id());
|
Item_case_expr(thd, spcont->get_current_case_expr_id());
|
||||||
|
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
if (var)
|
if (var)
|
||||||
{
|
{
|
||||||
var->m_sp= sp;
|
var->m_sp= sphead;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
expr= new (thd->mem_root) Item_func_eq(thd, var, when);
|
expr= new (thd->mem_root) Item_func_eq(thd, var, when);
|
||||||
i= new (thd->mem_root) sp_instr_jump_if_not(ip, ctx, expr, lex);
|
i= new (thd->mem_root) sp_instr_jump_if_not(ip, spcont, expr, this);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
i= new (thd->mem_root) sp_instr_jump_if_not(ip, ctx, when, lex);
|
i= new (thd->mem_root) sp_instr_jump_if_not(ip, spcont, when, this);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
BACKPATCH: Registering forward jump from
|
BACKPATCH: Registering forward jump from
|
||||||
@@ -350,10 +345,11 @@ int case_stmt_action_when(LEX *lex, Item *when, bool simple)
|
|||||||
(jump_if_not from instruction 2 to 5, 5 to 8 ... in the example)
|
(jump_if_not from instruction 2 to 5, 5 to 8 ... in the example)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return !MY_TEST(i) ||
|
return
|
||||||
sp->push_backpatch(thd, i, ctx->push_label(thd, empty_lex_str, 0)) ||
|
!MY_TEST(i) ||
|
||||||
sp->add_cont_backpatch(i) ||
|
sphead->push_backpatch(thd, i, spcont->push_label(thd, empty_lex_str, 0)) ||
|
||||||
sp->add_instr(i);
|
sphead->add_cont_backpatch(i) ||
|
||||||
|
sphead->add_instr(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -362,13 +358,11 @@ int case_stmt_action_when(LEX *lex, Item *when, bool simple)
|
|||||||
@param lex the parser lex context
|
@param lex the parser lex context
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int case_stmt_action_then(LEX *lex)
|
int LEX::case_stmt_action_then()
|
||||||
{
|
{
|
||||||
sp_head *sp= lex->sphead;
|
uint ip= sphead->instructions();
|
||||||
sp_pcontext *ctx= lex->spcont;
|
sp_instr_jump *i= new (thd->mem_root) sp_instr_jump(ip, spcont);
|
||||||
uint ip= sp->instructions();
|
if (!MY_TEST(i) || sphead->add_instr(i))
|
||||||
sp_instr_jump *i= new (lex->thd->mem_root) sp_instr_jump(ip, ctx);
|
|
||||||
if (!MY_TEST(i) || sp->add_instr(i))
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -377,7 +371,7 @@ int case_stmt_action_then(LEX *lex)
|
|||||||
(jump_if_not from instruction 2 to 5, 5 to 8 ... in the example)
|
(jump_if_not from instruction 2 to 5, 5 to 8 ... in the example)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sp->backpatch(ctx->pop_label());
|
sphead->backpatch(spcont->pop_label());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
BACKPATCH: Registering forward jump from
|
BACKPATCH: Registering forward jump from
|
||||||
@@ -385,7 +379,7 @@ int case_stmt_action_then(LEX *lex)
|
|||||||
(jump from instruction 4 to 12, 7 to 12 ... in the example)
|
(jump from instruction 4 to 12, 7 to 12 ... in the example)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return sp->push_backpatch(lex->thd, i, ctx->last_label());
|
return sphead->push_backpatch(thd, i, spcont->last_label());
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@@ -673,43 +667,43 @@ Item* handle_sql2003_note184_exception(THD *thd, Item* left, bool equal,
|
|||||||
@return <code>false</code> if successful, <code>true</code> if an error was
|
@return <code>false</code> if successful, <code>true</code> if an error was
|
||||||
reported. In the latter case parsing should stop.
|
reported. In the latter case parsing should stop.
|
||||||
*/
|
*/
|
||||||
bool add_select_to_union_list(LEX *lex, bool is_union_distinct,
|
bool LEX::add_select_to_union_list(bool is_union_distinct,
|
||||||
bool is_top_level)
|
bool is_top_level)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Only the last SELECT can have INTO. Since the grammar won't allow INTO in
|
Only the last SELECT can have INTO. Since the grammar won't allow INTO in
|
||||||
a nested SELECT, we make this check only when creating a top-level SELECT.
|
a nested SELECT, we make this check only when creating a top-level SELECT.
|
||||||
*/
|
*/
|
||||||
if (is_top_level && lex->result)
|
if (is_top_level && result)
|
||||||
{
|
{
|
||||||
my_error(ER_WRONG_USAGE, MYF(0), "UNION", "INTO");
|
my_error(ER_WRONG_USAGE, MYF(0), "UNION", "INTO");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
if (lex->current_select->order_list.first && !lex->current_select->braces)
|
if (current_select->order_list.first && !current_select->braces)
|
||||||
{
|
{
|
||||||
my_error(ER_WRONG_USAGE, MYF(0), "UNION", "ORDER BY");
|
my_error(ER_WRONG_USAGE, MYF(0), "UNION", "ORDER BY");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lex->current_select->explicit_limit && !lex->current_select->braces)
|
if (current_select->explicit_limit && !current_select->braces)
|
||||||
{
|
{
|
||||||
my_error(ER_WRONG_USAGE, MYF(0), "UNION", "LIMIT");
|
my_error(ER_WRONG_USAGE, MYF(0), "UNION", "LIMIT");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
if (lex->current_select->linkage == GLOBAL_OPTIONS_TYPE)
|
if (current_select->linkage == GLOBAL_OPTIONS_TYPE)
|
||||||
{
|
{
|
||||||
my_parse_error(lex->thd, ER_SYNTAX_ERROR);
|
my_parse_error(thd, ER_SYNTAX_ERROR);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
/* This counter shouldn't be incremented for UNION parts */
|
/* This counter shouldn't be incremented for UNION parts */
|
||||||
lex->nest_level--;
|
nest_level--;
|
||||||
if (mysql_new_select(lex, 0))
|
if (mysql_new_select(this, 0))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
mysql_init_select(lex);
|
mysql_init_select(this);
|
||||||
lex->current_select->linkage=UNION_TYPE;
|
current_select->linkage=UNION_TYPE;
|
||||||
if (is_union_distinct) /* UNION DISTINCT - remember position */
|
if (is_union_distinct) /* UNION DISTINCT - remember position */
|
||||||
lex->current_select->master_unit()->union_distinct=
|
current_select->master_unit()->union_distinct=
|
||||||
lex->current_select;
|
current_select;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4094,7 +4088,7 @@ case_stmt_body:
|
|||||||
{ Lex->sphead->reset_lex(thd); /* For expr $2 */ }
|
{ Lex->sphead->reset_lex(thd); /* For expr $2 */ }
|
||||||
expr
|
expr
|
||||||
{
|
{
|
||||||
if (case_stmt_action_expr(Lex, $2))
|
if (Lex->case_stmt_action_expr($2))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
|
|
||||||
if (Lex->sphead->restore_lex(thd))
|
if (Lex->sphead->restore_lex(thd))
|
||||||
@@ -4126,7 +4120,7 @@ simple_when_clause:
|
|||||||
/* Simple case: <caseval> = <whenval> */
|
/* Simple case: <caseval> = <whenval> */
|
||||||
|
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
if (case_stmt_action_when(lex, $3, true))
|
if (lex->case_stmt_action_when($3, true))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
/* For expr $3 */
|
/* For expr $3 */
|
||||||
if (lex->sphead->restore_lex(thd))
|
if (lex->sphead->restore_lex(thd))
|
||||||
@@ -4135,8 +4129,7 @@ simple_when_clause:
|
|||||||
THEN_SYM
|
THEN_SYM
|
||||||
sp_proc_stmts1
|
sp_proc_stmts1
|
||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
if (Lex->case_stmt_action_then())
|
||||||
if (case_stmt_action_then(lex))
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@@ -4149,7 +4142,7 @@ searched_when_clause:
|
|||||||
expr
|
expr
|
||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
if (case_stmt_action_when(lex, $3, false))
|
if (lex->case_stmt_action_when($3, false))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
/* For expr $3 */
|
/* For expr $3 */
|
||||||
if (lex->sphead->restore_lex(thd))
|
if (lex->sphead->restore_lex(thd))
|
||||||
@@ -4158,8 +4151,7 @@ searched_when_clause:
|
|||||||
THEN_SYM
|
THEN_SYM
|
||||||
sp_proc_stmts1
|
sp_proc_stmts1
|
||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
if (Lex->case_stmt_action_then())
|
||||||
if (case_stmt_action_then(lex))
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@@ -16183,7 +16175,7 @@ union_clause:
|
|||||||
union_list:
|
union_list:
|
||||||
UNION_SYM union_option
|
UNION_SYM union_option
|
||||||
{
|
{
|
||||||
if (add_select_to_union_list(Lex, (bool)$2, TRUE))
|
if (Lex->add_select_to_union_list((bool)$2, TRUE))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
union_list_part2
|
union_list_part2
|
||||||
@@ -16199,7 +16191,7 @@ union_list:
|
|||||||
union_list_view:
|
union_list_view:
|
||||||
UNION_SYM union_option
|
UNION_SYM union_option
|
||||||
{
|
{
|
||||||
if (add_select_to_union_list(Lex, (bool)$2, TRUE))
|
if (Lex->add_select_to_union_list((bool)$2, TRUE))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
query_expression_body_view
|
query_expression_body_view
|
||||||
@@ -16240,7 +16232,7 @@ order_or_limit:
|
|||||||
union_head_non_top:
|
union_head_non_top:
|
||||||
UNION_SYM union_option
|
UNION_SYM union_option
|
||||||
{
|
{
|
||||||
if (add_select_to_union_list(Lex, (bool)$2, FALSE))
|
if (Lex->add_select_to_union_list((bool)$2, FALSE))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
Reference in New Issue
Block a user