diff options
author | Nikita Malyavin <nikitamalyavin@gmail.com> | 2019-11-27 00:33:54 +1000 |
---|---|---|
committer | Nikita Malyavin <nikitamalyavin@gmail.com> | 2020-01-21 20:35:06 +1000 |
commit | 951f056baeea8f58fa426d6a7940fe686ec75561 (patch) | |
tree | 3e1a027caa4d2a6ead2d5b7b16545fe44e6f9069 | |
parent | 8a98daa0ed64c7ed571a9b56e2590e82b09a9ba6 (diff) | |
download | mariadb-git-951f056baeea8f58fa426d6a7940fe686ec75561.tar.gz |
move frm data to separate extra2 section
-rw-r--r-- | sql/table.cc | 15 | ||||
-rw-r--r-- | sql/table.h | 4 | ||||
-rw-r--r-- | sql/unireg.cc | 15 | ||||
-rw-r--r-- | sql/unireg.h | 3 |
4 files changed, 21 insertions, 16 deletions
diff --git a/sql/table.cc b/sql/table.cc index 4576e983e38..e246a8e422a 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -60,6 +60,7 @@ struct extra2_fields LEX_CUSTRING system_period; LEX_CUSTRING application_period; LEX_CUSTRING field_data_type_info; + LEX_CUSTRING without_overlaps; void reset() { bzero((void*)this, sizeof(*this)); } }; @@ -1568,6 +1569,9 @@ bool read_extra2(const uchar *frm_image, size_t len, extra2_fields *fields) case EXTRA2_APPLICATION_TIME_PERIOD: fail= fill_extra2(&fields->application_period); break; + case EXTRA2_PERIOD_WITHOUT_OVERLAPS: + fail= fill_extra2(&fields->without_overlaps); + break; case EXTRA2_FIELD_DATA_TYPE_INFO: fail= fill_extra2(&fields->field_data_type_info); break; @@ -2256,8 +2260,11 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, if (init_period_from_extra2(&period, pos, end)) goto err; status_var_increment(thd->status_var.feature_application_time_periods); + } - const uchar *key_pos= pos + 2 * frm_fieldno_size; + if (extra2.without_overlaps.str) + { + const uchar *key_pos= extra2.without_overlaps.str; period.unique_keys= read_frm_keyno(key_pos); for (uint k= 0; k < period.unique_keys; k++) { @@ -2266,10 +2273,8 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, key_info[key_nr].without_overlaps= true; } - if (frm_ident_stored_size(period.name.length) - + frm_ident_stored_size(period.constr_name.length) - + (period.unique_keys + 1) * frm_keyno_size + 2 * frm_fieldno_size - != extra2.application_period.length) + if ((period.unique_keys + 1) * frm_keyno_size + != extra2.without_overlaps.length) goto err; } diff --git a/sql/table.h b/sql/table.h index 9a3ae7bd109..c674209c4d2 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1799,8 +1799,8 @@ static inline uint16 read_frm_keyno(const uchar *data) { return uint2korr(data); } static inline void store_frm_keyno(uchar *data, uint16 fieldno) { int2store(data, fieldno); } -static inline size_t frm_ident_stored_size(size_t len) -{ return len + (len > 255 ? 3 : 1); } +static inline size_t extra2_str_size(size_t len) +{ return (len > 255 ? 3 : 1) + len; } class select_unit; class TMP_TABLE_PARAM; diff --git a/sql/unireg.cc b/sql/unireg.cc index 1e95242786e..ea5d739a97e 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -147,12 +147,6 @@ bool has_extra2_field_flags(List<Create_field> &create_fields) return false; } -static size_t extra2_str_size(size_t len) -{ - return (len > 255 ? 3 : 1) + len; -} - - static uint gis_field_options_image(uchar *buff, List<Create_field> &create_fields) { @@ -256,9 +250,9 @@ LEX_CUSTRING build_frm_image(THD *thd, const LEX_CSTRING &table, size_t period_info_len= create_info->period_info.name ? extra2_str_size(create_info->period_info.name.length) + extra2_str_size(create_info->period_info.constr->name.length) - + frm_keyno_size * (create_info->period_info.unique_keys + 1) + 2 * frm_fieldno_size : 0; + size_t without_overlaps_len= frm_keyno_size * (create_info->period_info.unique_keys + 1); uint e_unique_hash_extra_parts= 0; uchar fileinfo[FRM_HEADER_SIZE],forminfo[FRM_FORMINFO_SIZE]; const partition_info *part_info= IF_PARTITIONING(thd->work_part_info, 0); @@ -391,7 +385,9 @@ LEX_CUSTRING build_frm_image(THD *thd, const LEX_CSTRING &table, if (create_info->period_info.name) { - extra2_size+= 1 + extra2_str_size(period_info_len); + // two extra2 sections are taken after 10.5 + extra2_size+= 2 + extra2_str_size(period_info_len) + + extra2_str_size(without_overlaps_len); } bool has_extra2_field_flags_= has_extra2_field_flags(create_fields); @@ -486,6 +482,9 @@ LEX_CUSTRING build_frm_image(THD *thd, const LEX_CSTRING &table, store_frm_fieldno(pos, get_fieldno_by_name(create_info, create_fields, create_info->period_info.period.end)); pos+= frm_fieldno_size; + + *pos++= EXTRA2_PERIOD_WITHOUT_OVERLAPS; + pos= extra2_write_len(pos, without_overlaps_len); store_frm_keyno(pos, create_info->period_info.unique_keys); pos+= frm_keyno_size; for (uint key= 0; key < keys; key++) diff --git a/sql/unireg.h b/sql/unireg.h index 419fbc4bd80..873d6f681fc 100644 --- a/sql/unireg.h +++ b/sql/unireg.h @@ -177,7 +177,8 @@ enum extra2_frm_value_type { EXTRA2_ENGINE_TABLEOPTS=128, EXTRA2_FIELD_FLAGS=129, - EXTRA2_FIELD_DATA_TYPE_INFO=130 + EXTRA2_FIELD_DATA_TYPE_INFO=130, + EXTRA2_PERIOD_WITHOUT_OVERLAPS=131, }; enum extra2_field_flags { |