summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorSergei Petrunia <psergey@askmonty.org>2021-05-14 15:42:05 +0300
committerSergei Petrunia <psergey@askmonty.org>2021-05-24 20:17:41 +0300
commite0a6cfb38b781474169f06478dbfe7800f9657ce (patch)
tree7a08d83549c742f6fc70aba5bf76e6496c7f48aa /sql
parent4e19539c1484a9b23e01601f88b14c450279780a (diff)
downloadmariadb-git-e0a6cfb38b781474169f06478dbfe7800f9657ce.tar.gz
MDEV-25078: ALTER INDEX is inconsistent with ADD/DROP/RENAME index
Support IF EXISTS in the command that alter index visibility: ALTER TABLE ALTER (KEY|INDEX) [IF EXISTS] index_name [NOT] IGNORED
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_class.h6
-rw-r--r--sql/sql_table.cc28
-rw-r--r--sql/sql_yacc.yy4
3 files changed, 33 insertions, 5 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 2df0651886f..2fa50882ebf 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -390,13 +390,14 @@ public:
class Alter_index_ignorability: public Sql_alloc
{
public:
- Alter_index_ignorability(const char *name, bool is_ignored) :
- m_name(name), m_is_ignored(is_ignored)
+ Alter_index_ignorability(const char *name, bool is_ignored, bool if_exists) :
+ m_name(name), m_is_ignored(is_ignored), m_if_exists(if_exists)
{
assert(name != NULL);
}
const char *name() const { return m_name; }
+ bool if_exists() const { return m_if_exists; }
/* The ignorability after the operation is performed. */
bool is_ignored() const { return m_is_ignored; }
@@ -406,6 +407,7 @@ public:
private:
const char *m_name;
bool m_is_ignored;
+ bool m_if_exists;
};
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 6be126655fc..cd48f58da10 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -5829,7 +5829,33 @@ drop_create_field:
rename_key_it.remove();
}
}
-
+ /* Handle ALTER KEY IF EXISTS. */
+ {
+ List_iterator<Alter_index_ignorability> ignor_it(alter_info->alter_index_ignorability_list);
+ Alter_index_ignorability *aii;
+ while ((aii= ignor_it++))
+ {
+ if (!aii->if_exists())
+ continue;
+ bool exists= false;
+ for (uint n_key= 0; n_key < table->s->keys; n_key++)
+ {
+ if (my_strcasecmp(system_charset_info, aii->name(),
+ table->key_info[n_key].name.str) == 0)
+ {
+ exists= true;
+ break;
+ }
+ }
+ if (exists)
+ continue;
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
+ ER_KEY_DOES_NOT_EXISTS,
+ ER_THD(thd, ER_KEY_DOES_NOT_EXISTS),
+ aii->name(), table->s->table_name.str);
+ ignor_it.remove();
+ }
+ }
/* ALTER TABLE ADD KEY IF NOT EXISTS */
/* ALTER TABLE ADD FOREIGN KEY IF NOT EXISTS */
{
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 931e5175f48..d1f22006e1d 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -7832,11 +7832,11 @@ alter_list_item:
if (unlikely(Lex->add_alter_list($4, $7, $3)))
MYSQL_YYABORT;
}
- | ALTER key_or_index ident ignorability
+ | ALTER key_or_index opt_if_exists_table_element ident ignorability
{
LEX *lex= Lex;
Alter_index_ignorability *ac= new (thd->mem_root)
- Alter_index_ignorability($3.str, $4);
+ Alter_index_ignorability($4.str, $5, $3);
if (ac == NULL)
MYSQL_YYABORT;
lex->alter_info.alter_index_ignorability_list.push_back(ac);