diff options
author | Sergei Petrunia <psergey@askmonty.org> | 2021-05-14 15:42:05 +0300 |
---|---|---|
committer | Sergei Petrunia <psergey@askmonty.org> | 2021-05-24 20:17:41 +0300 |
commit | e0a6cfb38b781474169f06478dbfe7800f9657ce (patch) | |
tree | 7a08d83549c742f6fc70aba5bf76e6496c7f48aa /sql | |
parent | 4e19539c1484a9b23e01601f88b14c450279780a (diff) | |
download | mariadb-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.h | 6 | ||||
-rw-r--r-- | sql/sql_table.cc | 28 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 4 |
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); |