summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Malyavin <nikitamalyavin@gmail.com>2019-11-27 00:05:19 +1000
committerNikita Malyavin <nikitamalyavin@gmail.com>2020-01-21 20:35:06 +1000
commit8a98daa0ed64c7ed571a9b56e2590e82b09a9ba6 (patch)
treede7f87e0d7fb980025897f6f298ea5e5c3cbba1c
parentf1378332ce045abf8a527b895c3572812502c646 (diff)
downloadmariadb-git-8a98daa0ed64c7ed571a9b56e2590e82b09a9ba6.tar.gz
reduce code bloating in read_extra2()
-rw-r--r--sql/table.cc43
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)