summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Malyavin <nikitamalyavin@gmail.com>2019-12-04 01:37:00 +1000
committerNikita Malyavin <nikitamalyavin@gmail.com>2020-02-21 02:39:18 +1000
commit712648fde9390d7d6f7735821026e5a2fdbd6474 (patch)
tree37fd0817535f8a582e79297b41de0285ebc43538
parent21f27346802cd556fe7332f7b8a67f6d0d7958ff (diff)
downloadmariadb-git-712648fde9390d7d6f7735821026e5a2fdbd6474.tar.gz
enable keyread
-rw-r--r--sql/handler.cc29
1 files changed, 23 insertions, 6 deletions
diff --git a/sql/handler.cc b/sql/handler.cc
index 21923d5979b..805ebab62b9 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -6986,7 +6986,13 @@ int handler::ha_check_overlaps(const uchar *old_data, const uchar* new_data)
handler= check_overlaps_handler;
}
- for (uint key_nr= 0; key_nr < table_share->keys; key_nr++)
+ // Save and later restore this handler's keyread
+ int old_this_keyread= this->keyread;
+ DBUG_ASSERT(this->ha_end_keyread() == 0);
+
+ int error= 0;
+
+ for (uint key_nr= 0; key_nr < table_share->keys && !error; key_nr++)
{
const KEY &key_info= table->key_info[key_nr];
const uint key_parts= key_info.user_defined_key_parts;
@@ -7004,7 +7010,7 @@ int handler::ha_check_overlaps(const uchar *old_data, const uchar* new_data)
continue;
}
- int error= handler->ha_index_init(key_nr, 0);
+ error= handler->ha_index_init(key_nr, 0);
if (error)
return error;
@@ -7017,6 +7023,9 @@ int handler::ha_check_overlaps(const uchar *old_data, const uchar* new_data)
table->s->reclength - table->s->null_bytes) == 0;
};
+ error= handler->ha_start_keyread(key_nr);
+ DBUG_ASSERT(!error);
+
error = handler->ha_index_read_map(record_buffer,
check_overlaps_buffer,
key_part_map((1 << key_parts) - 1),
@@ -7041,11 +7050,19 @@ int handler::ha_check_overlaps(const uchar *old_data, const uchar* new_data)
if (error == HA_ERR_FOUND_DUPP_KEY)
overlaps_error_key= key_nr;
- int end_error= handler->ha_index_end();
- if (error || end_error)
- return error ? error : end_error;
+ int end_error= handler->ha_end_keyread();
+ DBUG_ASSERT(!end_error);
+
+ end_error= handler->ha_index_end();
+ if (!error && end_error)
+ error= end_error;
}
- return 0;
+
+ // Restore keyread of this handler, if it was enabled
+ if (old_this_keyread < MAX_KEY)
+ DBUG_ASSERT(this->ha_start_keyread(old_this_keyread) == 0);
+
+ return error;
}
#ifdef WITH_WSREP