summaryrefslogtreecommitdiff
path: root/storage/innobase/btr/btr0cur.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/btr/btr0cur.cc')
-rw-r--r--storage/innobase/btr/btr0cur.cc41
1 files changed, 34 insertions, 7 deletions
diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc
index 773b03775be..157f8a37646 100644
--- a/storage/innobase/btr/btr0cur.cc
+++ b/storage/innobase/btr/btr0cur.cc
@@ -1109,7 +1109,11 @@ retry_page_get:
buf_mode, file, line, mtr, &err);
tree_blocks[n_blocks] = block;
+ /* Note that block==NULL signifies either an error or change
+ buffering. */
+
if (err != DB_SUCCESS) {
+ ut_ad(block == NULL);
if (err == DB_DECRYPTION_FAILED) {
ib_push_warning((void *)NULL,
DB_DECRYPTION_FAILED,
@@ -1117,7 +1121,7 @@ retry_page_get:
" used key_id is not available. "
" Can't continue reading table.",
index->table->name);
- index->table->is_encrypted = true;
+ index->table->file_unreadable = true;
}
goto func_exit;
@@ -1230,7 +1234,7 @@ retry_page_get:
" used key_id is not available. "
" Can't continue reading table.",
index->table->name);
- index->table->is_encrypted = true;
+ index->table->file_unreadable = true;
}
goto func_exit;
@@ -1259,7 +1263,7 @@ retry_page_get:
" used key_id is not available. "
" Can't continue reading table.",
index->table->name);
- index->table->is_encrypted = true;
+ index->table->file_unreadable = true;
}
goto func_exit;
@@ -2057,7 +2061,7 @@ btr_cur_open_at_index_side_func(
ulint offsets_[REC_OFFS_NORMAL_SIZE];
ulint* offsets = offsets_;
dberr_t err = DB_SUCCESS;
-
+
rec_offs_init(offsets_);
estimate = latch_mode & BTR_ESTIMATE;
@@ -2158,6 +2162,8 @@ btr_cur_open_at_index_side_func(
BUF_GET, file, line, mtr, &err);
tree_blocks[n_blocks] = block;
+ ut_ad((block != NULL) == (err == DB_SUCCESS));
+
if (err != DB_SUCCESS) {
if (err == DB_DECRYPTION_FAILED) {
ib_push_warning((void *)NULL,
@@ -2166,7 +2172,7 @@ btr_cur_open_at_index_side_func(
" used key_id is not available. "
" Can't continue reading table.",
index->table->name);
- index->table->is_encrypted = true;
+ index->table->file_unreadable = true;
}
goto exit_loop;
@@ -2516,6 +2522,8 @@ btr_cur_open_at_rnd_pos_func(
BUF_GET, file, line, mtr, &err);
tree_blocks[n_blocks] = block;
+ ut_ad((block != NULL) == (err == DB_SUCCESS));
+
if (err != DB_SUCCESS) {
if (err == DB_DECRYPTION_FAILED) {
ib_push_warning((void *)NULL,
@@ -2524,8 +2532,9 @@ btr_cur_open_at_rnd_pos_func(
" used key_id is not available. "
" Can't continue reading table.",
index->table->name);
- index->table->is_encrypted = true;
+ index->table->file_unreadable = true;
}
+
goto exit_loop;
}
@@ -5323,6 +5332,8 @@ btr_estimate_n_rows_in_range_on_level(
NULL, BUF_GET_POSSIBLY_FREED,
__FILE__, __LINE__, &mtr, &err);
+ ut_ad((block != NULL) == (err == DB_SUCCESS));
+
if (err != DB_SUCCESS) {
if (err == DB_DECRYPTION_FAILED) {
ib_push_warning((void *)NULL,
@@ -5331,7 +5342,7 @@ btr_estimate_n_rows_in_range_on_level(
" used key_id is not available. "
" Can't continue reading table.",
index->table->name);
- index->table->is_encrypted = true;
+ index->table->file_unreadable = true;
}
mtr_commit(&mtr);
@@ -5481,6 +5492,11 @@ btr_estimate_n_rows_in_range_low(
&cursor, 0,
__FILE__, __LINE__, &mtr);
+ if (!index->table->is_readable()) {
+ mtr_commit(&mtr);
+ return (0);
+ }
+
ut_ad(!page_rec_is_infimum(btr_cur_get_rec(&cursor)));
/* We should count the border if there are any records to
@@ -5518,6 +5534,10 @@ btr_estimate_n_rows_in_range_low(
mtr_commit(&mtr);
+ if (!index->table->is_readable()) {
+ return (0);
+ }
+
mtr_start(&mtr);
cursor.path_arr = path2;
@@ -5997,6 +6017,12 @@ btr_estimate_number_of_different_key_vals(
because otherwise our algorithm would give a wrong estimate
for an index where there is just one key value. */
+ if (!index->table->is_readable()) {
+ mtr_commit(&mtr);
+ goto exit_loop;
+ }
+
+
page = btr_cur_get_page(&cursor);
rec = page_rec_get_next(page_get_infimum_rec(page));
@@ -6080,6 +6106,7 @@ btr_estimate_number_of_different_key_vals(
mtr_commit(&mtr);
}
+exit_loop:
/* If we saw k borders between different key values on
n_sample_pages leaf pages, we can estimate how many
there will be in index->stat_n_leaf_pages */