mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-8960: Can't refer the same column twice in one ALTER TABLE
Problem was that if column was created in alter table when it was refered again it was not tried to find from list of current columns. mysql_prepare_alter_table: There is two cases (1) If alter table adds a new column and then later alter changes the field definition, there was no check from list of new columns, instead an incorrect error was given. (2) If alter table adds a new column and then later alter changes the default, there was no check from list of new columns, instead an incorrect error was given.
This commit is contained in:
@@ -7503,9 +7503,25 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
||||
{
|
||||
if (def->change && ! def->field)
|
||||
{
|
||||
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->change,
|
||||
table->s->table_name.str);
|
||||
goto err;
|
||||
/*
|
||||
Check if there is modify for newly added field.
|
||||
*/
|
||||
Create_field *find;
|
||||
find_it.rewind();
|
||||
while((find=find_it++))
|
||||
{
|
||||
if (!my_strcasecmp(system_charset_info,find->field_name, def->field_name))
|
||||
break;
|
||||
}
|
||||
|
||||
if (find && !find->field)
|
||||
find_it.remove();
|
||||
else
|
||||
{
|
||||
my_error(ER_BAD_FIELD_ERROR, MYF(0), def->change,
|
||||
table->s->table_name.str);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
/*
|
||||
Check that the DATE/DATETIME not null field we are going to add is
|
||||
@@ -7571,6 +7587,29 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
||||
find_it.after(def); // Put column after this
|
||||
}
|
||||
}
|
||||
/*
|
||||
Check if there is alter for newly added field.
|
||||
*/
|
||||
alter_it.rewind();
|
||||
Alter_column *alter;
|
||||
while ((alter=alter_it++))
|
||||
{
|
||||
if (!my_strcasecmp(system_charset_info,def->field_name, alter->name))
|
||||
break;
|
||||
}
|
||||
if (alter)
|
||||
{
|
||||
if (def->sql_type == MYSQL_TYPE_BLOB)
|
||||
{
|
||||
my_error(ER_BLOB_CANT_HAVE_DEFAULT, MYF(0), def->change);
|
||||
goto err;
|
||||
}
|
||||
if ((def->def=alter->def)) // Use new default
|
||||
def->flags&= ~NO_DEFAULT_VALUE_FLAG;
|
||||
else
|
||||
def->flags|= NO_DEFAULT_VALUE_FLAG;
|
||||
alter_it.remove();
|
||||
}
|
||||
}
|
||||
if (alter_info->alter_list.elements)
|
||||
{
|
||||
|
Reference in New Issue
Block a user