1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

System Versioning 1.0 pre5 [closes #407]

Merge branch '10.3' into trunk

Both field_visibility and VERS_HIDDEN_FLAG exist independently.

TODO:
VERS_HIDDEN_FLAG should be replaced with SYSTEM_INVISIBLE (or COMPLETELY_INVISIBLE?).
This commit is contained in:
Aleksey Midenkov
2017-12-15 15:01:13 +03:00
91 changed files with 2662 additions and 566 deletions

View File

@@ -87,10 +87,31 @@ static uchar *extra2_write(uchar *pos, enum extra2_frm_value_type type,
return extra2_write(pos, type, reinterpret_cast<LEX_CSTRING *>(str));
}
static uchar *extra2_write_field_properties(uchar *pos,
List<Create_field> &create_fields)
{
List_iterator<Create_field> it(create_fields);
*pos++= EXTRA2_FIELD_FLAGS;
/*
always first 2 for field visibility
*/
pos= extra2_write_len(pos, create_fields.elements);
while (Create_field *cf= it++)
{
uchar flags= cf->field_visibility;
if (cf->flags & VERS_UPDATE_UNVERSIONED_FLAG)
flags|= VERS_OPTIMIZED_UPDATE;
if (cf->flags & VERS_HIDDEN_FLAG)
flags|= VERS_HIDDEN;
*pos++= flags;
}
return pos;
}
static const bool ROW_START = true;
static const bool ROW_END = false;
inline
static inline
uint16
vers_get_field(HA_CREATE_INFO *create_info, List<Create_field> &create_fields, bool row_start)
{
@@ -116,12 +137,15 @@ vers_get_field(HA_CREATE_INFO *create_info, List<Create_field> &create_fields, b
return 0;
}
static inline
bool has_extra2_field_flags(List<Create_field> &create_fields)
{
List_iterator<Create_field> it(create_fields);
while (Create_field *f= it++)
{
if (f->flags & (VERS_UPDATE_UNVERSIONED_FLAG | HIDDEN_FLAG))
if (f->field_visibility != NOT_INVISIBLE)
return true;
if (f->flags & (VERS_UPDATE_UNVERSIONED_FLAG | VERS_HIDDEN_FLAG))
return true;
}
return false;
@@ -272,8 +296,8 @@ LEX_CUSTRING build_frm_image(THD *thd, const char *table,
bool has_extra2_field_flags_= has_extra2_field_flags(create_fields);
if (has_extra2_field_flags_)
{
extra2_size+=
1 + (create_fields.elements <= 255 ? 1 : 3) + create_fields.elements;
extra2_size+= 1 + (create_fields.elements > 255 ? 3 : 1) +
create_fields.elements;
}
key_buff_length= uint4korr(fileinfo+47);
@@ -349,20 +373,7 @@ LEX_CUSTRING build_frm_image(THD *thd, const char *table,
}
if (has_extra2_field_flags_)
{
*pos++= EXTRA2_FIELD_FLAGS;
pos= extra2_write_len(pos, create_fields.elements);
List_iterator<Create_field> it(create_fields);
while (Create_field *field= it++)
{
uchar flags= 0;
if (field->flags & VERS_UPDATE_UNVERSIONED_FLAG)
flags|= VERS_OPTIMIZED_UPDATE;
if (field->flags & HIDDEN_FLAG)
flags|= HIDDEN;
*pos++= flags;
}
}
pos= extra2_write_field_properties(pos, create_fields);
int4store(pos, filepos); // end of the extra2 segment
pos+= 4;