Commit 1bcb66c5 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-18806 Synchronize ALTER TABLE EXCHANGE PARTITION and PURGE grammar in...

MDEV-18806 Synchronize ALTER TABLE EXCHANGE PARTITION and PURGE grammar in sql_yacc.yy and sql_yacc_ora.yy
parent e3e06722
......@@ -31,8 +31,10 @@
#include "sql_select.h"
#include "sql_cte.h"
#include "sql_signal.h"
#include "sql_truncate.h" // Sql_cmd_truncate_table
#include "sql_admin.h" // Sql_cmd_analyze/Check..._table
#include "sql_partition.h"
#include "sql_partition_admin.h" // Sql_cmd_alter_table_*_part
void LEX::parse_error(uint err_number)
{
......@@ -8756,7 +8758,7 @@ bool LEX::tvc_finalize()
bool LEX::tvc_finalize_derived()
{
derived_tables|= DERIVED_SUBQUERY;
if (unlikely(!expr_allows_subselect || sql_command == (int)SQLCOM_PURGE))
if (unlikely(!expr_allows_subselect))
{
thd->parse_error();
return true;
......@@ -9004,7 +9006,7 @@ Item *LEX::create_item_query_expression(THD *thd,
const char *tok_start,
st_select_lex_unit *unit)
{
if (!expr_allows_subselect || sql_command == SQLCOM_PURGE)
if (!expr_allows_subselect)
{
thd->parse_error(ER_SYNTAX_ERROR, tok_start);
return NULL;
......@@ -9247,8 +9249,7 @@ SELECT_LEX_UNIT *LEX::parsed_body_unit_tail(SELECT_LEX_UNIT *unit,
SELECT_LEX *LEX::parsed_subselect(SELECT_LEX_UNIT *unit, char *place)
{
if (!expr_allows_subselect ||
sql_command == (int)SQLCOM_PURGE)
if (!expr_allows_subselect)
{
thd->parse_error(ER_SYNTAX_ERROR, place);
return NULL;
......@@ -10263,3 +10264,41 @@ void LEX::stmt_deallocate_prepare(const Lex_ident_sys_st &ident)
sql_command= SQLCOM_DEALLOCATE_PREPARE;
prepared_stmt.set(ident, NULL, NULL);
}
bool LEX::stmt_alter_table_exchange_partition(Table_ident *table)
{
DBUG_ASSERT(sql_command == SQLCOM_ALTER_TABLE);
first_select_lex()->db= table->db;
if (first_select_lex()->db.str == NULL &&
copy_db_to(&first_select_lex()->db))
return true;
name= table->table;
alter_info.partition_flags|= ALTER_PARTITION_EXCHANGE;
if (!first_select_lex()->add_table_to_list(thd, table, NULL,
TL_OPTION_UPDATING,
TL_READ_NO_INSERT,
MDL_SHARED_NO_WRITE))
return true;
DBUG_ASSERT(!m_sql_cmd);
m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table_exchange_partition();
return m_sql_cmd == NULL;
}
void LEX::stmt_purge_to(const LEX_CSTRING &to)
{
type= 0;
sql_command= SQLCOM_PURGE;
to_log= to.str;
}
bool LEX::stmt_purge_before(Item *item)
{
type= 0;
sql_command= SQLCOM_PURGE_BEFORE;
value_list.empty();
value_list.push_front(item, thd->mem_root);
return check_main_unit_semantics();
}
......@@ -4451,6 +4451,11 @@ struct LEX: public Query_tables_list
bool stmt_execute(const Lex_ident_sys_st &ident, List<Item> *params);
bool stmt_execute_immediate(Item *code, List<Item> *params);
void stmt_deallocate_prepare(const Lex_ident_sys_st &ident);
bool stmt_alter_table_exchange_partition(Table_ident *table);
void stmt_purge_to(const LEX_CSTRING &to);
bool stmt_purge_before(Item *item);
};
......
......@@ -1856,7 +1856,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%type <item>
literal insert_ident order_ident temporal_literal
simple_ident expr prepare_src sum_expr in_sum_expr
simple_ident expr expr_no_subselect sum_expr in_sum_expr
variable variable_aux bool_pri
predicate bit_expr parenthesized_expr
table_wild simple_expr column_default_non_parenthesized_expr udf_expr
......@@ -2318,14 +2318,14 @@ deallocate_or_drop:
;
prepare:
PREPARE_SYM ident FROM prepare_src
PREPARE_SYM ident FROM expr_no_subselect
{
if (Lex->stmt_prepare($2, $4))
MYSQL_YYABORT;
}
;
prepare_src:
expr_no_subselect:
{ Lex->expr_allows_subselect= false; }
expr
{
......@@ -2340,7 +2340,7 @@ execute:
if (Lex->stmt_execute($2, $3))
MYSQL_YYABORT;
}
| EXECUTE_SYM IMMEDIATE_SYM prepare_src execute_using
| EXECUTE_SYM IMMEDIATE_SYM expr_no_subselect execute_using
{
if (Lex->stmt_execute_immediate($3, $4))
MYSQL_YYABORT;
......@@ -8182,23 +8182,7 @@ alter_commands:
| EXCHANGE_SYM PARTITION_SYM alt_part_name_item
WITH TABLE_SYM table_ident have_partitioning
{
LEX *lex= thd->lex;
lex->first_select_lex()->db=$6->db;
if (lex->first_select_lex()->db.str == NULL &&
lex->copy_db_to(&lex->first_select_lex()->db))
{
MYSQL_YYABORT;
}
lex->name= $6->table;
lex->alter_info.partition_flags|= ALTER_PARTITION_EXCHANGE;
if (!lex->first_select_lex()->
add_table_to_list(thd, $6, NULL, TL_OPTION_UPDATING,
TL_READ_NO_INSERT, MDL_SHARED_NO_WRITE))
MYSQL_YYABORT;
DBUG_ASSERT(!lex->m_sql_cmd);
lex->m_sql_cmd= new (thd->mem_root)
Sql_cmd_alter_table_exchange_partition();
if (unlikely(lex->m_sql_cmd == NULL))
if (Lex->stmt_alter_table_exchange_partition($6))
MYSQL_YYABORT;
}
;
......@@ -14715,36 +14699,18 @@ master_reset_options:
;
purge:
PURGE
PURGE master_or_binary LOGS_SYM TO_SYM TEXT_STRING_sys
{
LEX *lex=Lex;
lex->type=0;
lex->sql_command = SQLCOM_PURGE;
}
purge_options
{}
;
purge_options:
master_or_binary LOGS_SYM purge_option
;
purge_option:
TO_SYM TEXT_STRING_sys
{
Lex->to_log = $2.str;
Lex->stmt_purge_to($5);
}
| BEFORE_SYM expr
| PURGE master_or_binary LOGS_SYM BEFORE_SYM expr_no_subselect
{
LEX *lex= Lex;
lex->value_list.empty();
lex->value_list.push_front($2, thd->mem_root);
lex->sql_command= SQLCOM_PURGE_BEFORE;
if (Lex->check_main_unit_semantics())
if (Lex->stmt_purge_before($5))
MYSQL_YYABORT;
}
;
/* kill threads */
kill:
......
......@@ -1357,7 +1357,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%type <item>
literal insert_ident order_ident temporal_literal
simple_ident expr prepare_src sum_expr in_sum_expr
simple_ident expr expr_no_subselect sum_expr in_sum_expr
variable variable_aux bool_pri
predicate bit_expr parenthesized_expr
table_wild simple_expr column_default_non_parenthesized_expr udf_expr
......@@ -1839,14 +1839,14 @@ deallocate_or_drop:
;
prepare:
PREPARE_SYM ident FROM prepare_src
PREPARE_SYM ident FROM expr_no_subselect
{
if (Lex->stmt_prepare($2, $4))
MYSQL_YYABORT;
}
;
prepare_src:
expr_no_subselect:
{ Lex->expr_allows_subselect= false; }
expr
{
......@@ -1861,7 +1861,7 @@ execute:
if (Lex->stmt_execute($2, $3))
MYSQL_YYABORT;
}
| EXECUTE_SYM IMMEDIATE_SYM prepare_src execute_using
| EXECUTE_SYM IMMEDIATE_SYM expr_no_subselect execute_using
{
if (Lex->stmt_execute_immediate($3, $4))
MYSQL_YYABORT;
......@@ -8274,20 +8274,7 @@ alter_commands:
| EXCHANGE_SYM PARTITION_SYM alt_part_name_item
WITH TABLE_SYM table_ident have_partitioning
{
LEX *lex= thd->lex;
if (lex->first_select_lex()->db.str == NULL &&
lex->copy_db_to(&lex->first_select_lex()->db))
MYSQL_YYABORT;
lex->name= $6->table;
lex->alter_info.partition_flags|= ALTER_PARTITION_EXCHANGE;
if (!lex->first_select_lex()->
add_table_to_list(thd, $6, NULL, TL_OPTION_UPDATING,
TL_READ_NO_INSERT, MDL_SHARED_NO_WRITE))
MYSQL_YYABORT;
DBUG_ASSERT(!lex->m_sql_cmd);
lex->m_sql_cmd= new (thd->mem_root)
Sql_cmd_alter_table_exchange_partition();
if (unlikely(lex->m_sql_cmd == NULL))
if (Lex->stmt_alter_table_exchange_partition($6))
MYSQL_YYABORT;
}
;
......@@ -14832,34 +14819,18 @@ master_reset_options:
;
purge:
PURGE
{
LEX *lex=Lex;
lex->type=0;
lex->sql_command = SQLCOM_PURGE;
}
purge_options
{}
;
purge_options:
master_or_binary LOGS_SYM purge_option
;
purge_option:
TO_SYM TEXT_STRING_sys
PURGE master_or_binary LOGS_SYM TO_SYM TEXT_STRING_sys
{
Lex->to_log = $2.str;
Lex->stmt_purge_to($5);
}
| BEFORE_SYM expr
| PURGE master_or_binary LOGS_SYM BEFORE_SYM expr_no_subselect
{
LEX *lex= Lex;
lex->value_list.empty();
lex->value_list.push_front($2, thd->mem_root);
lex->sql_command= SQLCOM_PURGE_BEFORE;
if (Lex->stmt_purge_before($5))
MYSQL_YYABORT;
}
;
/* kill threads */
kill:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment