summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/main/ignore_indexes.result20
-rw-r--r--mysql-test/main/ignore_indexes.test14
-rw-r--r--sql/sql_priv.h4
-rw-r--r--sql/sql_show.cc2
-rw-r--r--sql/sys_vars.cc1
-rw-r--r--sql/table.cc13
-rw-r--r--storage/innobase/handler/handler0alter.cc6
7 files changed, 44 insertions, 16 deletions
diff --git a/mysql-test/main/ignore_indexes.result b/mysql-test/main/ignore_indexes.result
index ee4af96db4f..bcbfb57ba34 100644
--- a/mysql-test/main/ignore_indexes.result
+++ b/mysql-test/main/ignore_indexes.result
@@ -97,7 +97,7 @@ t1 CREATE TABLE `t1` (
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
KEY `a` (`a`),
- KEY `b` (`b`) IGNORE,
+ KEY `b` (`b`) IGNORED,
KEY `c` (`c`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
@@ -379,3 +379,21 @@ EXPLAIN SELECT b FROM t1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 14
DROP TABLE t1;
+#
+# Using FORCE INDEX for an ignored index
+#
+CREATE TABLE t1(a INT, key k1(a));
+INSERT INTO t1 VALUES (1),(2),(3);
+EXPLAIN SELECT * FROM t1 FORCE INDEX(k1);
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index NULL k1 5 NULL 3 Using index
+ALTER TABLE t1 ALTER INDEX k1 IGNORE;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ KEY `k1` (`a`) IGNORED
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+EXPLAIN SELECT * FROM t1 FORCE INDEX(k1);
+ERROR 42000: Key 'k1' doesn't exist in table 't1'
+DROP TABLE t1;
diff --git a/mysql-test/main/ignore_indexes.test b/mysql-test/main/ignore_indexes.test
index 6648609e722..a061dab78ce 100644
--- a/mysql-test/main/ignore_indexes.test
+++ b/mysql-test/main/ignore_indexes.test
@@ -338,5 +338,19 @@ EXPLAIN SELECT * FROM t1 WHERE a = '04';
ALTER TABLE t1 ALTER INDEX b IGNORE;
EXPLAIN SELECT b FROM t1;
+DROP TABLE t1;
+
+--echo #
+--echo # Using FORCE INDEX for an ignored index
+--echo #
+
+CREATE TABLE t1(a INT, key k1(a));
+INSERT INTO t1 VALUES (1),(2),(3);
+
+EXPLAIN SELECT * FROM t1 FORCE INDEX(k1);
+ALTER TABLE t1 ALTER INDEX k1 IGNORE;
+SHOW CREATE TABLE t1;
+--error ER_KEY_DOES_NOT_EXISTS
+EXPLAIN SELECT * FROM t1 FORCE INDEX(k1);
DROP TABLE t1;
diff --git a/sql/sql_priv.h b/sql/sql_priv.h
index 7b6a139bbdf..493313da90a 100644
--- a/sql/sql_priv.h
+++ b/sql/sql_priv.h
@@ -232,7 +232,6 @@
#define OPTIMIZER_SWITCH_USE_ROWID_FILTER (1ULL << 33)
#define OPTIMIZER_SWITCH_COND_PUSHDOWN_FROM_HAVING (1ULL << 34)
#define OPTIMIZER_SWITCH_NOT_NULL_RANGE_SCAN (1ULL << 35)
-#define OPTIMIZER_SWITCH_IGNORE_INDEXES (1ULL << 36)
#define OPTIMIZER_SWITCH_DEFAULT (OPTIMIZER_SWITCH_INDEX_MERGE | \
OPTIMIZER_SWITCH_INDEX_MERGE_UNION | \
@@ -263,8 +262,7 @@
OPTIMIZER_SWITCH_COND_PUSHDOWN_FOR_SUBQUERY | \
OPTIMIZER_SWITCH_USE_ROWID_FILTER | \
OPTIMIZER_SWITCH_COND_PUSHDOWN_FROM_HAVING | \
- OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE| \
- OPTIMIZER_SWITCH_IGNORE_INDEXES)
+ OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE)
/*
Replication uses 8 bytes to store SQL_MODE in the binary log. The day you
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 5594b98db27..74d094a5dbb 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -2481,7 +2481,7 @@ static void store_key_options(THD *thd, String *packet, TABLE *table,
}
if (key_info->is_ignored)
- packet->append(STRING_WITH_LEN(" IGNORE"));
+ packet->append(STRING_WITH_LEN(" IGNORED"));
}
}
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 66e7d996988..df6f9933e36 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -2714,7 +2714,6 @@ export const char *optimizer_switch_names[]=
"rowid_filter",
"condition_pushdown_from_having",
"not_null_range_scan",
- "ignore_indexes",
"default",
NullS
};
diff --git a/sql/table.cc b/sql/table.cc
index a7142db17bd..282427c61d1 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -1431,13 +1431,9 @@ void TABLE_SHARE::set_ignored_indexes()
key_map TABLE_SHARE::usable_indexes(THD *thd)
{
- if (optimizer_flag(thd, OPTIMIZER_SWITCH_IGNORE_INDEXES))
- {
- key_map usable_indexes(keys_in_use);
- usable_indexes.subtract(ignored_indexes);
- return usable_indexes;
- }
- return keys_in_use;
+ key_map usable_indexes(keys_in_use);
+ usable_indexes.subtract(ignored_indexes);
+ return usable_indexes;
}
@@ -8269,7 +8265,8 @@ bool TABLE_LIST::process_index_hints(TABLE *tbl)
*/
if (tbl->s->keynames.type_names == 0 ||
(pos= find_type(&tbl->s->keynames, hint->key_name.str,
- hint->key_name.length, 1)) <= 0)
+ hint->key_name.length, 1)) <= 0 ||
+ (tbl->s->key_info[pos - 1].is_ignored))
{
my_error(ER_KEY_DOES_NOT_EXISTS, MYF(0), hint->key_name.str, alias.str);
return 1;
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index af61eecee89..37a23dae0a5 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -113,7 +113,8 @@ static const alter_table_operations INNOBASE_INPLACE_IGNORE
| ALTER_DROP_CHECK_CONSTRAINT
| ALTER_RENAME
| ALTER_COLUMN_INDEX_LENGTH
- | ALTER_CHANGE_INDEX_COMMENT;
+ | ALTER_CHANGE_INDEX_COMMENT
+ | ALTER_INDEX_IGNORABILITY;
/** Operations on foreign key definitions (changing the schema only) */
static const alter_table_operations INNOBASE_FOREIGN_OPERATIONS
@@ -1996,7 +1997,8 @@ ha_innobase::check_if_supported_inplace_alter(
& ~(INNOBASE_INPLACE_IGNORE
| INNOBASE_ALTER_INSTANT
| INNOBASE_ALTER_NOREBUILD
- | INNOBASE_ALTER_REBUILD)) {
+ | INNOBASE_ALTER_REBUILD
+ | ALTER_INDEX_IGNORABILITY)) {
if (ha_alter_info->handler_flags
& ALTER_STORED_COLUMN_TYPE) {