MDEV-14694 ALTER COLUMN IF EXISTS .. causes syntax error.
Implementing the 'IF EXISTS' option for statements ALTER TABLE ALTER COLUMN SET/DROP DEFAULT.
This commit is contained in:
parent
5478547c96
commit
926adcfeea
@ -2275,6 +2275,19 @@ t1 CREATE TABLE `t1` (
|
|||||||
`c` int(11) DEFAULT NULL
|
`c` int(11) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (i int);
|
||||||
|
alter table t1 alter column if exists a set default 1;
|
||||||
|
Warnings:
|
||||||
|
Note 1054 Unknown column 'a' in 't1'
|
||||||
|
alter table t1 alter column if exists a drop default;
|
||||||
|
Warnings:
|
||||||
|
Note 1054 Unknown column 'a' in 't1'
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`i` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
#
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
|
@ -1882,6 +1882,16 @@ alter table t1 drop column a, drop index a;
|
|||||||
show create table t1;
|
show create table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-14694 ALTER COLUMN IF EXISTS .. causes syntax error
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1 (i int);
|
||||||
|
alter table t1 alter column if exists a set default 1;
|
||||||
|
alter table t1 alter column if exists a drop default;
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -284,8 +284,9 @@ class Alter_column :public Sql_alloc {
|
|||||||
public:
|
public:
|
||||||
const char *name;
|
const char *name;
|
||||||
Virtual_column_info *default_value;
|
Virtual_column_info *default_value;
|
||||||
Alter_column(const char *par_name, Virtual_column_info *expr)
|
bool alter_if_exists;
|
||||||
:name(par_name), default_value(expr) {}
|
Alter_column(const char *par_name, Virtual_column_info *expr, bool par_exists)
|
||||||
|
:name(par_name), default_value(expr), alter_if_exists(par_exists) {}
|
||||||
/**
|
/**
|
||||||
Used to make a clone of this object for ALTER/CREATE TABLE
|
Used to make a clone of this object for ALTER/CREATE TABLE
|
||||||
@sa comment for Key_part_spec::clone
|
@sa comment for Key_part_spec::clone
|
||||||
|
@ -3645,6 +3645,8 @@ public:
|
|||||||
alter_info.check_constraint_list.push_back(constr);
|
alter_info.check_constraint_list.push_back(constr);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
bool add_alter_list(const char *par_name, Virtual_column_info *expr,
|
||||||
|
bool par_exists);
|
||||||
void set_command(enum_sql_command command,
|
void set_command(enum_sql_command command,
|
||||||
DDL_options_st options)
|
DDL_options_st options)
|
||||||
{
|
{
|
||||||
|
@ -6114,6 +6114,40 @@ drop_create_field:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handle ALTER COLUMN IF EXISTS SET/DROP DEFAULT. */
|
||||||
|
{
|
||||||
|
List_iterator<Alter_column> it(alter_info->alter_list);
|
||||||
|
Alter_column *acol;
|
||||||
|
|
||||||
|
while ((acol=it++))
|
||||||
|
{
|
||||||
|
if (!acol->alter_if_exists)
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
If there is NO field with the same name in the table already,
|
||||||
|
remove the acol from the list.
|
||||||
|
*/
|
||||||
|
for (f_ptr=table->field; *f_ptr; f_ptr++)
|
||||||
|
{
|
||||||
|
if (my_strcasecmp(system_charset_info,
|
||||||
|
acol->name, (*f_ptr)->field_name.str) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*f_ptr == NULL)
|
||||||
|
{
|
||||||
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
|
||||||
|
ER_BAD_FIELD_ERROR,
|
||||||
|
ER_THD(thd, ER_BAD_FIELD_ERROR),
|
||||||
|
acol->name, table->s->table_name.str);
|
||||||
|
it.remove();
|
||||||
|
if (alter_info->alter_list.is_empty())
|
||||||
|
{
|
||||||
|
alter_info->flags&= ~(Alter_info::ALTER_CHANGE_COLUMN_DEFAULT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle DROP COLUMN/KEY IF EXISTS. */
|
/* Handle DROP COLUMN/KEY IF EXISTS. */
|
||||||
{
|
{
|
||||||
List_iterator<Alter_drop> drop_it(alter_info->drop_list);
|
List_iterator<Alter_drop> drop_it(alter_info->drop_list);
|
||||||
@ -6142,7 +6176,9 @@ drop_create_field:
|
|||||||
}
|
}
|
||||||
else if (drop->type == Alter_drop::CHECK_CONSTRAINT)
|
else if (drop->type == Alter_drop::CHECK_CONSTRAINT)
|
||||||
{
|
{
|
||||||
for (uint i=table->s->field_check_constraints; i < table->s->table_check_constraints; i++)
|
for (uint i=table->s->field_check_constraints;
|
||||||
|
i < table->s->table_check_constraints;
|
||||||
|
i++)
|
||||||
{
|
{
|
||||||
if (my_strcasecmp(system_charset_info, drop->name,
|
if (my_strcasecmp(system_charset_info, drop->name,
|
||||||
table->check_constraints[i]->name.str) == 0)
|
table->check_constraints[i]->name.str) == 0)
|
||||||
|
@ -699,6 +699,18 @@ void LEX::add_key_to_list(LEX_CSTRING *field_name,
|
|||||||
alter_info.key_list.push_back(key, mem_root);
|
alter_info.key_list.push_back(key, mem_root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LEX::add_alter_list(const char *name, Virtual_column_info *expr,
|
||||||
|
bool exists)
|
||||||
|
{
|
||||||
|
MEM_ROOT *mem_root= thd->mem_root;
|
||||||
|
Alter_column *ac= new (mem_root) Alter_column(name, expr, exists);
|
||||||
|
if (ac == NULL)
|
||||||
|
return true;
|
||||||
|
alter_info.alter_list.push_back(ac, mem_root);
|
||||||
|
alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN_DEFAULT;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void LEX::init_last_field(Column_definition *field,
|
void LEX::init_last_field(Column_definition *field,
|
||||||
const LEX_CSTRING *field_name,
|
const LEX_CSTRING *field_name,
|
||||||
const CHARSET_INFO *cs)
|
const CHARSET_INFO *cs)
|
||||||
@ -8174,24 +8186,15 @@ alter_list_item:
|
|||||||
lex->alter_info.keys_onoff= Alter_info::ENABLE;
|
lex->alter_info.keys_onoff= Alter_info::ENABLE;
|
||||||
lex->alter_info.flags|= Alter_info::ALTER_KEYS_ONOFF;
|
lex->alter_info.flags|= Alter_info::ALTER_KEYS_ONOFF;
|
||||||
}
|
}
|
||||||
| ALTER opt_column field_ident SET DEFAULT column_default_expr
|
| ALTER opt_column opt_if_exists_table_element field_ident SET DEFAULT column_default_expr
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
if (Lex->add_alter_list($4.str, $7, $3))
|
||||||
Alter_column *ac= new (thd->mem_root) Alter_column($3.str,$6);
|
|
||||||
if (ac == NULL)
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
lex->alter_info.alter_list.push_back(ac, thd->mem_root);
|
|
||||||
lex->alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN_DEFAULT;
|
|
||||||
}
|
}
|
||||||
| ALTER opt_column field_ident DROP DEFAULT
|
| ALTER opt_column opt_if_exists_table_element field_ident DROP DEFAULT
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
if (Lex->add_alter_list($4.str, (Virtual_column_info*) 0, $3))
|
||||||
Alter_column *ac= (new (thd->mem_root)
|
|
||||||
Alter_column($3.str, (Virtual_column_info*) 0));
|
|
||||||
if (ac == NULL)
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
lex->alter_info.alter_list.push_back(ac, thd->mem_root);
|
|
||||||
lex->alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN_DEFAULT;
|
|
||||||
}
|
}
|
||||||
| RENAME opt_to table_ident
|
| RENAME opt_to table_ident
|
||||||
{
|
{
|
||||||
|
@ -7735,24 +7735,15 @@ alter_list_item:
|
|||||||
lex->alter_info.keys_onoff= Alter_info::ENABLE;
|
lex->alter_info.keys_onoff= Alter_info::ENABLE;
|
||||||
lex->alter_info.flags|= Alter_info::ALTER_KEYS_ONOFF;
|
lex->alter_info.flags|= Alter_info::ALTER_KEYS_ONOFF;
|
||||||
}
|
}
|
||||||
| ALTER opt_column field_ident SET DEFAULT column_default_expr
|
| ALTER opt_column opt_if_exists_table_element field_ident SET DEFAULT column_default_expr
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
if (Lex->add_alter_list($4.str, $7, $3))
|
||||||
Alter_column *ac= new (thd->mem_root) Alter_column($3.str,$6);
|
|
||||||
if (ac == NULL)
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
lex->alter_info.alter_list.push_back(ac, thd->mem_root);
|
|
||||||
lex->alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN_DEFAULT;
|
|
||||||
}
|
}
|
||||||
| ALTER opt_column field_ident DROP DEFAULT
|
| ALTER opt_column opt_if_exists_table_element field_ident DROP DEFAULT
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
if (Lex->add_alter_list($4.str, (Virtual_column_info*) 0, $3))
|
||||||
Alter_column *ac= (new (thd->mem_root)
|
|
||||||
Alter_column($3.str, (Virtual_column_info*) 0));
|
|
||||||
if (ac == NULL)
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
lex->alter_info.alter_list.push_back(ac, thd->mem_root);
|
|
||||||
lex->alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN_DEFAULT;
|
|
||||||
}
|
}
|
||||||
| RENAME opt_to table_ident
|
| RENAME opt_to table_ident
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user