mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
System Versioning pre0.12
Merge remote-tracking branch 'origin/archive/2017-10-17' into 10.3
This commit is contained in:
@ -26,7 +26,8 @@ enum partition_type {
|
||||
NOT_A_PARTITION= 0,
|
||||
RANGE_PARTITION,
|
||||
HASH_PARTITION,
|
||||
LIST_PARTITION
|
||||
LIST_PARTITION,
|
||||
VERSIONING_PARTITION
|
||||
};
|
||||
|
||||
enum partition_state {
|
||||
@ -89,8 +90,74 @@ typedef struct p_elem_val
|
||||
|
||||
struct st_ddl_log_memory_entry;
|
||||
|
||||
class partition_element :public Sql_alloc {
|
||||
/* Used for collecting MIN/MAX stats on sys_trx_end for doing pruning
|
||||
in SYSTEM_TIME partitiong. */
|
||||
class Vers_min_max_stats : public Sql_alloc
|
||||
{
|
||||
static const uint buf_size= 4 + (TIME_SECOND_PART_DIGITS + 1) / 2;
|
||||
uchar min_buf[buf_size];
|
||||
uchar max_buf[buf_size];
|
||||
Field_timestampf min_value;
|
||||
Field_timestampf max_value;
|
||||
mysql_rwlock_t lock;
|
||||
|
||||
public:
|
||||
Vers_min_max_stats(const LEX_CSTRING *field_name, TABLE_SHARE *share) :
|
||||
min_value(min_buf, NULL, 0, Field::NONE, field_name, share, 6),
|
||||
max_value(max_buf, NULL, 0, Field::NONE, field_name, share, 6)
|
||||
{
|
||||
min_value.set_max();
|
||||
memset(max_buf, 0, buf_size);
|
||||
mysql_rwlock_init(key_rwlock_LOCK_vers_stats, &lock);
|
||||
}
|
||||
~Vers_min_max_stats()
|
||||
{
|
||||
mysql_rwlock_destroy(&lock);
|
||||
}
|
||||
bool update_unguarded(Field *from)
|
||||
{
|
||||
return
|
||||
from->update_min(&min_value, false) +
|
||||
from->update_max(&max_value, false);
|
||||
}
|
||||
bool update(Field *from)
|
||||
{
|
||||
mysql_rwlock_wrlock(&lock);
|
||||
bool res= update_unguarded(from);
|
||||
mysql_rwlock_unlock(&lock);
|
||||
return res;
|
||||
}
|
||||
my_time_t min_time()
|
||||
{
|
||||
mysql_rwlock_rdlock(&lock);
|
||||
my_time_t res= min_value.get_timestamp();
|
||||
mysql_rwlock_unlock(&lock);
|
||||
return res;
|
||||
}
|
||||
my_time_t max_time()
|
||||
{
|
||||
mysql_rwlock_rdlock(&lock);
|
||||
my_time_t res= max_value.get_timestamp();
|
||||
mysql_rwlock_unlock(&lock);
|
||||
return res;
|
||||
}
|
||||
};
|
||||
|
||||
enum stat_trx_field
|
||||
{
|
||||
STAT_TRX_END= 0
|
||||
};
|
||||
|
||||
class partition_element :public Sql_alloc
|
||||
{
|
||||
public:
|
||||
enum elem_type
|
||||
{
|
||||
CONVENTIONAL= 0,
|
||||
AS_OF_NOW,
|
||||
VERSIONING
|
||||
};
|
||||
|
||||
List<partition_element> subpartitions;
|
||||
List<part_elem_value> list_val_list;
|
||||
ha_rows part_max_rows;
|
||||
@ -109,6 +176,21 @@ public:
|
||||
bool has_null_value;
|
||||
bool signed_flag; // Range value signed
|
||||
bool max_value; // MAXVALUE range
|
||||
uint32 id;
|
||||
bool empty;
|
||||
|
||||
// TODO: subclass partition_element by partitioning type to avoid such semantic
|
||||
// mixup
|
||||
elem_type type()
|
||||
{
|
||||
return (elem_type)(signed_flag << 1 | max_value);
|
||||
}
|
||||
|
||||
void type(elem_type val)
|
||||
{
|
||||
max_value= val & 1;
|
||||
signed_flag= val & 2;
|
||||
}
|
||||
|
||||
partition_element()
|
||||
: part_max_rows(0), part_min_rows(0), range_value(0),
|
||||
@ -117,9 +199,10 @@ public:
|
||||
data_file_name(NULL), index_file_name(NULL),
|
||||
engine_type(NULL), connect_string(null_clex_str), part_state(PART_NORMAL),
|
||||
nodegroup_id(UNDEF_NODEGROUP), has_null_value(FALSE),
|
||||
signed_flag(FALSE), max_value(FALSE)
|
||||
{
|
||||
}
|
||||
signed_flag(FALSE), max_value(FALSE),
|
||||
id(UINT32_MAX),
|
||||
empty(true)
|
||||
{}
|
||||
partition_element(partition_element *part_elem)
|
||||
: part_max_rows(part_elem->part_max_rows),
|
||||
part_min_rows(part_elem->part_min_rows),
|
||||
@ -132,10 +215,20 @@ public:
|
||||
connect_string(null_clex_str),
|
||||
part_state(part_elem->part_state),
|
||||
nodegroup_id(part_elem->nodegroup_id),
|
||||
has_null_value(FALSE)
|
||||
{
|
||||
}
|
||||
has_null_value(FALSE),
|
||||
id(part_elem->id),
|
||||
empty(part_elem->empty)
|
||||
{}
|
||||
~partition_element() {}
|
||||
|
||||
part_column_list_val& get_col_val(uint idx)
|
||||
{
|
||||
DBUG_ASSERT(type() == CONVENTIONAL || list_val_list.elements == 1);
|
||||
part_elem_value *ev= list_val_list.head();
|
||||
DBUG_ASSERT(ev);
|
||||
DBUG_ASSERT(ev->col_val_array);
|
||||
return ev->col_val_array[idx];
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* PARTITION_ELEMENT_INCLUDED */
|
||||
|
Reference in New Issue
Block a user