Skip to content

Commit 0a3292e

Browse files
committed
fix(bug):fix offpage assertion failed
Issues:#627
1 parent dcf7cee commit 0a3292e

4 files changed

Lines changed: 43 additions & 52 deletions

File tree

mysql-test/suite/secondary_engine/r/shannon_case7.result

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,24 @@ id col_char col_varchar text_preview longtext_length col_enum
111111
3 0 small
112112
4 new ad 0 small
113113
5 as we fs 4 small
114+
INSERT INTO test_string_types VALUES (6, 'new', 'ads', 'sa', 'mysql', 'ws', 'longtext_test_long test', 'small');
115+
EXPLAIN SELECT id, col_char, col_varchar, LEFT(col_text, 20) as text_preview,
116+
LENGTH(col_longtext) as longtext_length, col_enum
117+
FROM test_string_types ORDER BY id;
118+
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
119+
1 SIMPLE test_string_types NULL ALL NULL NULL NULL NULL 6 100.00 Using filesort; Using secondary engine Rapid
120+
Warnings:
121+
Note 1003 /* select#1 */ select `sh_test7`.`test_string_types`.`id` AS `id`,`sh_test7`.`test_string_types`.`col_char` AS `col_char`,`sh_test7`.`test_string_types`.`col_varchar` AS `col_varchar`,left(`sh_test7`.`test_string_types`.`col_text`,20) AS `text_preview`,length(`sh_test7`.`test_string_types`.`col_longtext`) AS `longtext_length`,`sh_test7`.`test_string_types`.`col_enum` AS `col_enum` from `sh_test7`.`test_string_types` order by `sh_test7`.`test_string_types`.`id`
122+
SELECT id, col_char, col_varchar, LEFT(col_text, 20) as text_preview,
123+
LENGTH(col_longtext) as longtext_length, col_enum
124+
FROM test_string_types ORDER BY id;
125+
id col_char col_varchar text_preview longtext_length col_enum
126+
1 char varchar text text text text text 5000 medium
127+
2 test another varchar text content 10000 large
128+
3 0 small
129+
4 new ad 0 small
130+
5 as we fs 4 small
131+
6 new ads sa 23 small
114132
SELECT
115133
CONCAT(col_char, '-', col_varchar) as concatenated,
116134
UPPER(col_enum) as enum_upper,

mysql-test/suite/secondary_engine/t/shannon_case7.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ SELECT id, col_char, col_varchar, LEFT(col_text, 20) as text_preview,
102102
LENGTH(col_longtext) as longtext_length, col_enum
103103
FROM test_string_types ORDER BY id;
104104

105+
INSERT INTO test_string_types VALUES (6, 'new', 'ads', 'sa', 'mysql', 'ws', 'longtext_test_long test', 'small');
106+
EXPLAIN SELECT id, col_char, col_varchar, LEFT(col_text, 20) as text_preview,
107+
LENGTH(col_longtext) as longtext_length, col_enum
108+
FROM test_string_types ORDER BY id;
109+
110+
SELECT id, col_char, col_varchar, LEFT(col_text, 20) as text_preview,
111+
LENGTH(col_longtext) as longtext_length, col_enum
112+
FROM test_string_types ORDER BY id;
113+
105114
SELECT
106115
CONCAT(col_char, '-', col_varchar) as concatenated,
107116
UPPER(col_enum) as enum_upper,

storage/rapid_engine/handler/ha_shannon_rapid.cc

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -917,42 +917,23 @@ void NotifyDropTable(Table_ref *tab) {
917917
*/
918918
static void read_off_page_data(TABLE *table,
919919
ShannonBase::Populate::change_record_buff_t::off_page_data_t &off_page_data) {
920-
const uint field_count = table->s->fields;
921-
Field **fields = table->field;
922-
for (uint idx = 0; idx < field_count; idx++) {
923-
Field *fld = fields[idx];
924-
uchar *base_ptr = fld->field_ptr();
920+
for (uint idx = 0; idx < table->s->fields; idx++) {
921+
Field *fld = *(table->field + idx);
922+
if (!bitmap_is_set(table->read_set, idx) || fld->is_flag_set(NOT_SECONDARY_FLAG)) continue;
923+
925924
if (likely(((fld->type() != MYSQL_TYPE_BLOB) && (fld->type() != MYSQL_TYPE_TINY_BLOB) &&
926925
(fld->type() != MYSQL_TYPE_MEDIUM_BLOB) && (fld->type() != MYSQL_TYPE_LONG_BLOB))))
927926
continue;
927+
if (fld->is_null()) continue;
928928

929929
auto bfld = down_cast<Field_blob *>(fld);
930-
uint pack_len = bfld->pack_length_no_ptr();
931-
size_t data_len = 0;
932-
switch (pack_len) {
933-
case 1:
934-
data_len = *base_ptr;
935-
break;
936-
case 2:
937-
data_len = uint2korr(base_ptr);
938-
break;
939-
case 3:
940-
data_len = uint3korr(base_ptr);
941-
break;
942-
case 4:
943-
data_len = uint4korr(base_ptr);
944-
break;
945-
default:
946-
continue;
947-
}
948-
uchar *blob_data_ptr = base_ptr + pack_len;
949-
uchar *actual_blob_data = nullptr;
950-
memcpy(&actual_blob_data, blob_data_ptr, sizeof(uchar *));
951-
if (actual_blob_data && data_len > 0) {
952-
std::shared_ptr<uchar[]> blob_copy(new uchar[data_len]);
953-
std::memcpy(blob_copy.get(), actual_blob_data, data_len);
954-
off_page_data.emplace(idx, std::make_pair(data_len, std::move(blob_copy)));
955-
}
930+
const size_t data_len = bfld->get_length();
931+
const uchar *actual_blob_data = bfld->get_blob_data();
932+
if (actual_blob_data == nullptr) continue;
933+
934+
std::shared_ptr<uchar[]> blob_copy(new uchar[data_len ? data_len : 1]);
935+
std::memcpy(blob_copy.get(), actual_blob_data, data_len);
936+
off_page_data.emplace(idx, std::make_pair(data_len, std::move(blob_copy)));
956937
}
957938
}
958939

storage/rapid_engine/imcs/row0row.cpp

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -298,27 +298,10 @@ RowBuffer::FieldDataInfo RowBuffer::extract_field_data(const Rapid_load_context
298298
info.data_ptr = it->second.second.get();
299299
} else { // parsed from record[0],record[1] by `load` operation.
300300
auto bfld = down_cast<Field_blob *>(fld);
301-
uint pack_len = bfld->pack_length_no_ptr();
302-
switch (pack_len) {
303-
case 1:
304-
info.data_len = *base_ptr;
305-
break;
306-
case 2:
307-
info.data_len = uint2korr(base_ptr);
308-
break;
309-
case 3:
310-
info.data_len = uint3korr(base_ptr);
311-
break;
312-
case 4:
313-
info.data_len = uint4korr(base_ptr);
314-
break;
315-
}
316-
// Advance past length prefix
317-
base_ptr += pack_len;
318-
// BLOB data maybe not in the page. stores off the page. Dereference blob pointer
319-
uchar *blob_ptr = nullptr;
320-
memcpy(&blob_ptr, base_ptr, sizeof(uchar *));
321-
info.data_ptr = blob_ptr;
301+
const size_t data_len = bfld->get_length();
302+
auto *actual_blob_data = bfld->get_blob_data();
303+
info.data_ptr = actual_blob_data;
304+
info.data_len = data_len;
322305
}
323306
break;
324307
}

0 commit comments

Comments
 (0)