summaryrefslogtreecommitdiff
path: root/sql/sql_table.cc
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2017-07-27 13:17:13 +0300
committerJan Lindström <jan.lindstrom@mariadb.com>2017-08-18 10:11:54 +0300
commitce6c0e584e35b516297f2afdaea5b31e508b7570 (patch)
treecb58c2d874e4bfff714c001a16297408650c67be /sql/sql_table.cc
parent7581fb23e2d8126378296e987d84641d7bbd8914 (diff)
downloadmariadb-git-ce6c0e584e35b516297f2afdaea5b31e508b7570.tar.gz
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.
Diffstat (limited to 'sql/sql_table.cc')
-rw-r--r--sql/sql_table.cc45
1 files changed, 42 insertions, 3 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 2eff8fd5e2f..3ba3ec6847e 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -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)
{