summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--storage/innobase/handler/handler0alter.cc60
1 files changed, 28 insertions, 32 deletions
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index 4168b91a4d9..c0c34103f1d 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -52,6 +52,9 @@ Smart ALTER TABLE
#include "row0sel.h"
#include "ha_innodb.h"
#include "ut0stage.h"
+#include "span.h"
+
+using st_::span;
static const char *MSG_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN=
"INPLACE ADD or DROP of virtual columns cannot be "
@@ -1272,20 +1275,22 @@ innobase_set_foreign_key_option(
/*******************************************************************//**
Check if a foreign key constraint can make use of an index
that is being created.
+@param[in] col_names column names
+@param[in] n_cols number of columns
+@param[in] keys index information
+@param[in] add indexes being created
@return useable index, or NULL if none found */
static MY_ATTRIBUTE((nonnull, warn_unused_result))
const KEY*
innobase_find_equiv_index(
-/*======================*/
const char*const* col_names,
- /*!< in: column names */
- uint n_cols, /*!< in: number of columns */
- const KEY* keys, /*!< in: index information */
- const uint* add, /*!< in: indexes being created */
- uint n_add) /*!< in: number of indexes to create */
+ uint n_cols,
+ const KEY* keys,
+ span<uint> add)
{
- for (uint i = 0; i < n_add; i++) {
- const KEY* key = &keys[add[i]];
+ for (span<uint>::iterator it = add.begin(), end = add.end(); it != end;
+ ++it) {
+ const KEY* key = &keys[*it];
if (key->user_defined_key_parts < n_cols
|| key->flags & HA_SPATIAL) {
@@ -1336,7 +1341,7 @@ no_match:
Find an index whose first fields are the columns in the array
in the same order and is not marked for deletion
@return matching index, NULL if not found */
-static MY_ATTRIBUTE((nonnull(1,2,6), warn_unused_result))
+static MY_ATTRIBUTE((nonnull(1,2,5), warn_unused_result))
dict_index_t*
innobase_find_fk_index(
/*===================*/
@@ -1346,10 +1351,8 @@ innobase_find_fk_index(
const char** col_names,
/*!< in: column names, or NULL
to use table->col_names */
- dict_index_t** drop_index,
+ span<dict_index_t*> drop_index,
/*!< in: indexes to be dropped */
- ulint n_drop_index,
- /*!< in: size of drop_index[] */
const char** columns,/*!< in: array of column names */
ulint n_cols) /*!< in: number of columns */
{
@@ -1358,21 +1361,14 @@ innobase_find_fk_index(
index = dict_table_get_first_index(table);
while (index != NULL) {
- if (dict_foreign_qualify_index(
- table, col_names, columns, n_cols,
- index, NULL, true, 0,
- NULL, NULL, NULL)) {
- for (ulint i = 0; i < n_drop_index; i++) {
- if (index == drop_index[i]) {
- /* Skip to-be-dropped indexes. */
- goto next_rec;
- }
- }
-
- return(index);
+ if (dict_foreign_qualify_index(table, col_names, columns,
+ n_cols, index, NULL, true, 0,
+ NULL, NULL, NULL)
+ && std::find(drop_index.begin(), drop_index.end(), index)
+ == drop_index.end()) {
+ return index;
}
-next_rec:
index = dict_table_get_next_index(index);
}
@@ -1519,7 +1515,7 @@ innobase_get_foreign_key_info(
index = innobase_find_fk_index(
ha_alter_info,
table, col_names,
- drop_index, n_drop_index,
+ span<dict_index_t*>(drop_index, n_drop_index),
column_names, i);
/* MySQL would add a index in the creation
@@ -1534,8 +1530,8 @@ innobase_get_foreign_key_info(
if (!index && !innobase_find_equiv_index(
column_names, static_cast<uint>(i),
ha_alter_info->key_info_buffer,
- ha_alter_info->index_add_buffer,
- ha_alter_info->index_add_count)) {
+ span<uint>(ha_alter_info->index_add_buffer,
+ ha_alter_info->index_add_count))) {
my_error(
ER_FK_NO_INDEX_CHILD,
MYF(0),
@@ -5180,8 +5176,8 @@ innobase_check_foreign_key_index(
foreign->referenced_col_names,
foreign->n_fields,
ha_alter_info->key_info_buffer,
- ha_alter_info->index_add_buffer,
- ha_alter_info->index_add_count)) {
+ span<uint>(ha_alter_info->index_add_buffer,
+ ha_alter_info->index_add_count))) {
/* Index cannot be dropped. */
trx->error_info = index;
@@ -5215,8 +5211,8 @@ innobase_check_foreign_key_index(
foreign->foreign_col_names,
foreign->n_fields,
ha_alter_info->key_info_buffer,
- ha_alter_info->index_add_buffer,
- ha_alter_info->index_add_count)) {
+ span<uint>(ha_alter_info->index_add_buffer,
+ ha_alter_info->index_add_count))) {
/* Index cannot be dropped. */
trx->error_info = index;