diff options
author | Nikita Malyavin <nikitamalyavin@gmail.com> | 2019-11-27 00:05:19 +1000 |
---|---|---|
committer | Nikita Malyavin <nikitamalyavin@gmail.com> | 2020-01-21 20:35:06 +1000 |
commit | 8a98daa0ed64c7ed571a9b56e2590e82b09a9ba6 (patch) | |
tree | de7f87e0d7fb980025897f6f298ea5e5c3cbba1c | |
parent | f1378332ce045abf8a527b895c3572812502c646 (diff) | |
download | mariadb-git-8a98daa0ed64c7ed571a9b56e2590e82b09a9ba6.tar.gz |
reduce code bloating in read_extra2()
-rw-r--r-- | sql/table.cc | 43 |
1 files changed, 19 insertions, 24 deletions
diff --git a/sql/table.cc b/sql/table.cc index 76fee61d20b..4576e983e38 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1527,6 +1527,15 @@ bool read_extra2(const uchar *frm_image, size_t len, extra2_fields *fields) size_t length= extra2_read_len(&extra2, e2end); if (!length) DBUG_RETURN(true); + + auto fill_extra2= [extra2, length](LEX_CUSTRING *section){ + if (section->str) + return true; + *section= {extra2, length}; + return false; + }; + + bool fail= false; switch (type) { case EXTRA2_TABLEDEF_VERSION: if (fields->version.str) // see init_from_sql_statement_string() @@ -1541,49 +1550,35 @@ bool read_extra2(const uchar *frm_image, size_t len, extra2_fields *fields) } break; case EXTRA2_ENGINE_TABLEOPTS: - if (fields->options.str) - DBUG_RETURN(true); - fields->options.str= extra2; - fields->options.length= length; + fail= fill_extra2(&fields->options); break; case EXTRA2_DEFAULT_PART_ENGINE: fields->engine.set((const char*)extra2, length); break; case EXTRA2_GIS: - if (fields->gis.str) - DBUG_RETURN(true); - fields->gis.str= extra2; - fields->gis.length= length; + fail= fill_extra2(&fields->gis); break; case EXTRA2_PERIOD_FOR_SYSTEM_TIME: - if (fields->system_period.str || length != 2 * frm_fieldno_size) - DBUG_RETURN(true); - fields->system_period.str = extra2; - fields->system_period.length= length; + fail= fill_extra2(&fields->system_period) + || length != 2 * frm_fieldno_size; break; case EXTRA2_FIELD_FLAGS: - if (fields->field_flags.str) - DBUG_RETURN(true); - fields->field_flags.str= extra2; - fields->field_flags.length= length; + fail= fill_extra2(&fields->field_flags); break; case EXTRA2_APPLICATION_TIME_PERIOD: - if (fields->application_period.str) - DBUG_RETURN(true); - fields->application_period.str= extra2; - fields->application_period.length= length; + fail= fill_extra2(&fields->application_period); break; case EXTRA2_FIELD_DATA_TYPE_INFO: - if (fields->field_data_type_info.str) - DBUG_RETURN(true); - fields->field_data_type_info.str= extra2; - fields->field_data_type_info.length= length; + fail= fill_extra2(&fields->field_data_type_info); break; default: /* abort frm parsing if it's an unknown but important extra2 value */ if (type >= EXTRA2_ENGINE_IMPORTANT) DBUG_RETURN(true); } + if (fail) + DBUG_RETURN(true); + extra2+= length; } if (extra2 != e2end) |