Commit 18405e5f authored by Sergei Golubchik's avatar Sergei Golubchik

Partitioning syntax for versioning

 partition by system_time (
    partition p0 history,
    partition pn current
 )
parent f1490133
......@@ -29,50 +29,50 @@ x
300
create or replace table t1 (x int)
partition by system_time (
partition p0 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition pn current);
ERROR HY000: System Versioning required: t1
create or replace table t1 (x int);
alter table t1
partition by system_time (
partition p0 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition pn current);
Got one of the listed errors
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 as of current_timestamp);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one VERSIONING and exactly one last AS OF CURRENT_TIMESTAMP
partition p0 current);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one HISTORY and exactly one last CURRENT
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 as of current_timestamp,
partition p1 as of current_timestamp);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one VERSIONING and exactly one last AS OF CURRENT_TIMESTAMP
partition p0 current,
partition p1 current);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one HISTORY and exactly one last CURRENT
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 versioning,
partition p1 versioning);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one VERSIONING and exactly one last AS OF CURRENT_TIMESTAMP
partition p0 history,
partition p1 history);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one HISTORY and exactly one last CURRENT
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition pn as of current_timestamp,
partition p0 versioning);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one VERSIONING and exactly one last AS OF CURRENT_TIMESTAMP
partition pn current,
partition p0 history);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one HISTORY and exactly one last CURRENT
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition pn current);
alter table t1 add partition (
partition p1 as of current_timestamp);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one VERSIONING and exactly one last AS OF CURRENT_TIMESTAMP
partition p1 current);
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one HISTORY and exactly one last CURRENT
alter table t1 add partition (
partition p1 versioning);
partition p1 history);
Warnings:
Warning 4115 Maybe missing parameters: no rotation condition for multiple `VERSIONING` partitions.
Warning 4115 Maybe missing parameters: no rotation condition for multiple HISTORY partitions.
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
......@@ -82,15 +82,15 @@ t1 CREATE TABLE `t1` (
PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`)
) ENGINE=${INNODB_OR_MYISAM} DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
PARTITION BY SYSTEM_TIME
(PARTITION `p0` VERSIONING ENGINE = ${INNODB_OR_MYISAM},
PARTITION `p1` VERSIONING ENGINE = ${INNODB_OR_MYISAM},
PARTITION `pn` AS OF CURRENT_TIMESTAMP ENGINE = ${INNODB_OR_MYISAM})
(PARTITION `p0` HISTORY ENGINE = ${INNODB_OR_MYISAM},
PARTITION `p1` HISTORY ENGINE = ${INNODB_OR_MYISAM},
PARTITION `pn` CURRENT ENGINE = ${INNODB_OR_MYISAM})
insert into t1 values (1), (2);
alter table t1 drop partition pn;
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one VERSIONING and exactly one last AS OF CURRENT_TIMESTAMP
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one HISTORY and exactly one last CURRENT
alter table t1 drop partition p1;
alter table t1 drop partition p0;
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one VERSIONING and exactly one last AS OF CURRENT_TIMESTAMP
ERROR HY000: Wrong partitions consistency for `t1`: must have at least one HISTORY and exactly one last CURRENT
select x from t1;
x
1
......@@ -98,8 +98,8 @@ x
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition pn current);
set @now= now(6);
insert into t1 values (1);
set @ts_start= sys_commit_ts('sys_trx_start');
......@@ -178,16 +178,16 @@ select @ts2 = @ts3;
create or replace table t1 (x int)
with system versioning
partition by system_time limit 0 (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'LIMIT'
create or replace table t1 (x int)
with system versioning
partition by system_time limit 1 (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
......@@ -197,9 +197,9 @@ t1 CREATE TABLE `t1` (
PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`)
) ENGINE=${INNODB_OR_MYISAM} DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
PARTITION BY SYSTEM_TIME LIMIT 1
(PARTITION `p0` VERSIONING ENGINE = ${INNODB_OR_MYISAM},
PARTITION `p1` VERSIONING ENGINE = ${INNODB_OR_MYISAM},
PARTITION `pn` AS OF CURRENT_TIMESTAMP ENGINE = ${INNODB_OR_MYISAM})
(PARTITION `p0` HISTORY ENGINE = ${INNODB_OR_MYISAM},
PARTITION `p1` HISTORY ENGINE = ${INNODB_OR_MYISAM},
PARTITION `pn` CURRENT ENGINE = ${INNODB_OR_MYISAM})
alter table t1 drop partition non_existent;
ERROR HY000: Error in list of partitions to DROP
insert into t1 values (1), (2);
......@@ -219,7 +219,7 @@ x
insert into t1 values (3);
delete from t1;
Warnings:
Warning 4114 Versioned table `test`.`t1`: partition `p1` is full, add more VERSIONING partitions
Warning 4114 Versioned table `test`.`t1`: partition `p1` is full, add more HISTORY partitions
select * from t1 partition (p1);
x
2
......@@ -227,16 +227,16 @@ x
create or replace table t1 (x int)
with system versioning
partition by system_time interval 0 second (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'INTERVAL'
create or replace table t1 (x int)
with system versioning
partition by system_time interval 1 second (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
insert into t1 values (1), (2), (3);
select * from t1 partition (pn);
x
......@@ -261,9 +261,9 @@ with system versioning
partition by system_time limit 1
subpartition by key (x)
subpartitions 2 (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
insert into t1 (x) values (1), (2), (3);
select * from t1 partition (pnsp0);
x
......@@ -275,7 +275,7 @@ x
delete from t1;
Warnings:
Note 4116 Versioned table `test`.`t1`: switching from partition `p0` to `p1`
Warning 4114 Versioned table `test`.`t1`: partition `p1` is full, add more VERSIONING partitions
Warning 4114 Versioned table `test`.`t1`: partition `p1` is full, add more HISTORY partitions
select * from t1 partition (p0sp0);
x
1
......
......@@ -26,56 +26,56 @@ select * from t1 partition (p1);
--error ER_VERSIONING_REQUIRED
create or replace table t1 (x int)
partition by system_time (
partition p0 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition pn current);
create or replace table t1 (x int);
--error ER_VERSIONING_REQUIRED,ER_VERSIONING_REQUIRED
alter table t1
partition by system_time (
partition p0 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition pn current);
--error ER_VERS_WRONG_PARTS
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 as of current_timestamp);
partition p0 current);
--error ER_VERS_WRONG_PARTS
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 as of current_timestamp,
partition p1 as of current_timestamp);
partition p0 current,
partition p1 current);
--error ER_VERS_WRONG_PARTS
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 versioning,
partition p1 versioning);
partition p0 history,
partition p1 history);
--error ER_VERS_WRONG_PARTS
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition pn as of current_timestamp,
partition p0 versioning);
partition pn current,
partition p0 history);
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition pn current);
# alter table
--error ER_VERS_WRONG_PARTS
alter table t1 add partition (
partition p1 as of current_timestamp);
partition p1 current);
alter table t1 add partition (
partition p1 versioning);
partition p1 history);
--replace_result InnoDB ${INNODB_OR_MYISAM} MyISAM ${INNODB_OR_MYISAM} "bigint(20) unsigned" ${SYS_TRX_TYPE} timestamp(6) ${SYS_TRX_TYPE}
show create table t1;
......@@ -94,8 +94,8 @@ select x from t1;
create or replace table t1 (x int)
with system versioning
partition by system_time (
partition p0 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition pn current);
set @now= now(6);
insert into t1 values (1);
......@@ -157,16 +157,16 @@ select @ts2 = @ts3;
create or replace table t1 (x int)
with system versioning
partition by system_time limit 0 (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
create or replace table t1 (x int)
with system versioning
partition by system_time limit 1 (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
--replace_result InnoDB ${INNODB_OR_MYISAM} MyISAM ${INNODB_OR_MYISAM} "bigint(20) unsigned" ${SYS_TRX_TYPE} timestamp(6) ${SYS_TRX_TYPE}
show create table t1;
......@@ -189,16 +189,16 @@ select * from t1 partition (p1);
create or replace table t1 (x int)
with system versioning
partition by system_time interval 0 second (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
create or replace table t1 (x int)
with system versioning
partition by system_time interval 1 second (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
insert into t1 values (1), (2), (3);
select * from t1 partition (pn);
......@@ -216,9 +216,9 @@ with system versioning
partition by system_time limit 1
subpartition by key (x)
subpartitions 2 (
partition p0 versioning,
partition p1 versioning,
partition pn as of current_timestamp);
partition p0 history,
partition p1 history,
partition pn current);
insert into t1 (x) values (1), (2), (3);
select * from t1 partition (pnsp0);
......
......@@ -4395,7 +4395,7 @@ int ha_partition::update_row(const uchar *old_data, const uchar *new_data)
uint sub_factor= m_part_info->num_subparts ? m_part_info->num_subparts : 1;
DBUG_ASSERT(m_tot_parts == m_part_info->num_parts * sub_factor);
uint lpart_id= new_part_id / sub_factor;
// lpart_id is VERSIONING partition because new_part_id != old_part_id
// lpart_id is HISTORY partition because new_part_id != old_part_id
m_part_info->vers_update_stats(thd, lpart_id);
}
......
......@@ -273,6 +273,7 @@ static SYMBOL symbols[] = {
{ "HAVING", SYM(HAVING)},
{ "HELP", SYM(HELP_SYM)},
{ "HIGH_PRIORITY", SYM(HIGH_PRIORITY)},
{ "HISTORY", SYM(HISTORY_SYM)},
{ "HOST", SYM(HOST_SYM)},
{ "HOSTS", SYM(HOSTS_SYM)},
{ "HOUR", SYM(HOUR_SYM)},
......
......@@ -156,8 +156,8 @@ class partition_element :public Sql_alloc
enum elem_type
{
CONVENTIONAL= 0,
AS_OF_NOW,
VERSIONING
CURRENT,
HISTORY
};
List<partition_element> subpartitions;
......
......@@ -927,7 +927,7 @@ bool partition_info::vers_set_expression(THD *thd, partition_element *el, MYSQL_
for (uint i= 0; i < num_columns; ++i)
{
part_column_list_val *col_val= add_column_value(thd);
if (el->type() == partition_element::AS_OF_NOW)
if (el->type() == partition_element::CURRENT)
{
col_val->max_value= true;
col_val->item_expression= NULL;
......@@ -991,20 +991,20 @@ bool partition_info::vers_setup_expression(THD * thd, uint32 alter_add)
if (alter_add)
{
/* Non-empty historical partitions are left as is. */
if (el->type() == partition_element::VERSIONING && !el->empty)
if (el->type() == partition_element::HISTORY && !el->empty)
{
++id;
continue;
}
/* Newly added element is inserted before AS_OF_NOW. */
if (el->id == UINT32_MAX || el->type() == partition_element::AS_OF_NOW)
if (el->id == UINT32_MAX || el->type() == partition_element::CURRENT)
{
DBUG_ASSERT(table && table->s);
Vers_min_max_stats *stat_trx_end= new (&table->s->mem_root)
Vers_min_max_stats(&table->s->vers_end_field()->field_name, table->s);
table->s->stat_trx[id * num_columns + STAT_TRX_END]= stat_trx_end;
el->id= id++;
if (el->type() == partition_element::AS_OF_NOW)
if (el->type() == partition_element::CURRENT)
break;
goto set_expression;
}
......@@ -1037,7 +1037,7 @@ bool partition_info::vers_scan_min_max(THD *thd, partition_element *part)
uint32 part_id= part->id * sub_factor;
uint32 part_id_end= part_id + sub_factor;
DBUG_ASSERT(part->empty);
DBUG_ASSERT(part->type() == partition_element::VERSIONING);
DBUG_ASSERT(part->type() == partition_element::HISTORY);
DBUG_ASSERT(table->s->stat_trx);
for (; part_id < part_id_end; ++part_id)
{
......@@ -1198,7 +1198,7 @@ bool partition_info::vers_setup_stats(THD * thd, bool is_create_table_ind)
partition_element *el= NULL, *prev;
while ((prev= el, el= it++))
{
if (el->type() == partition_element::VERSIONING && dont_stat)
if (el->type() == partition_element::HISTORY && dont_stat)
{
if (el->id == table->s->hist_part_id)
{
......@@ -1216,7 +1216,7 @@ bool partition_info::vers_setup_stats(THD * thd, bool is_create_table_ind)
if (!is_create_table_ind)
{
if (el->type() == partition_element::AS_OF_NOW)
if (el->type() == partition_element::CURRENT)
{
uchar buf[8];
Field_timestampf fld(buf, NULL, 0, Field::NONE, &table->vers_end_field()->field_name, NULL, 6);
......@@ -1237,10 +1237,10 @@ bool partition_info::vers_setup_stats(THD * thd, bool is_create_table_ind)
}
}
if (el->type() == partition_element::AS_OF_NOW)
if (el->type() == partition_element::CURRENT)
break;
DBUG_ASSERT(el->type() == partition_element::VERSIONING);
DBUG_ASSERT(el->type() == partition_element::HISTORY);
if (vers_info->hist_part)
{
......@@ -2085,13 +2085,13 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type,
}
if (part_type == VERSIONING_PARTITION)
{
if (part_elem->type() == partition_element::VERSIONING)
if (part_elem->type() == partition_element::HISTORY)
{
hist_parts++;
}
else
{
DBUG_ASSERT(part_elem->type() == partition_element::AS_OF_NOW);
DBUG_ASSERT(part_elem->type() == partition_element::CURRENT);
now_parts++;
}
}
......@@ -2141,7 +2141,7 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type,
Sql_condition::WARN_LEVEL_WARN,
WARN_VERS_PARAMETERS,
ER_THD(thd, WARN_VERS_PARAMETERS),
"no rotation condition for multiple `VERSIONING` partitions.");
"no rotation condition for multiple HISTORY partitions.");
}
}
if (now_parts > 1)
......
......@@ -58,11 +58,11 @@ struct Vers_part_info : public Sql_alloc
if (now_part)
{
DBUG_ASSERT(now_part->id != UINT32_MAX);
DBUG_ASSERT(now_part->type() == partition_element::AS_OF_NOW);
DBUG_ASSERT(now_part->type() == partition_element::CURRENT);
DBUG_ASSERT(!fully || (bool) hist_part);
DBUG_ASSERT(!hist_part || (
hist_part->id != UINT32_MAX &&
hist_part->type() == partition_element::VERSIONING));
hist_part->type() == partition_element::HISTORY));
return true;
}
return false;
......@@ -436,7 +436,7 @@ class partition_info : public Sql_alloc
while ((el= it++))
{
DBUG_ASSERT(el->type() != partition_element::CONVENTIONAL);
if (el->type() == partition_element::VERSIONING &&
if (el->type() == partition_element::HISTORY &&
el->id == table->s->hist_part_id)
{
vers_info->hist_part= el;
......@@ -508,7 +508,7 @@ class partition_info : public Sql_alloc
{
DBUG_ASSERT(vers_info && vers_info->initialized());
DBUG_ASSERT(table && table->s);
DBUG_ASSERT(el && el->type() == partition_element::VERSIONING);
DBUG_ASSERT(el && el->type() == partition_element::HISTORY);
bool updated;
mysql_rwlock_wrlock(&table->s->LOCK_stat_serial);
el->empty= false;
......
......@@ -7837,7 +7837,7 @@ ER_PARTITION_WRONG_TYPE
eng "Wrong partition type, expected type: %`s"
WARN_VERS_PART_FULL
eng "Versioned table %`s.%`s: partition %`s is full, add more VERSIONING partitions"
eng "Versioned table %`s.%`s: partition %`s is full, add more HISTORY partitions"
WARN_VERS_PARAMETERS
eng "Maybe missing parameters: %s"
......@@ -7897,7 +7897,7 @@ ER_PART_WRONG_VALUE
eng "Wrong parameters for partitioned %`s: wrong value for '%s'"
ER_VERS_WRONG_PARTS
eng "Wrong partitions consistency for %`s: must have at least one VERSIONING and exactly one last AS OF CURRENT_TIMESTAMP"
eng "Wrong partitions consistency for %`s: must have at least one HISTORY and exactly one last CURRENT"
ER_VERS_HISTORY_LOCK
eng "Versioned SELECT write-locking of history rows"
......
......@@ -2220,11 +2220,11 @@ static int add_partition_values(String *str, partition_info *part_info,
{
switch (p_elem->type())
{
case partition_element::AS_OF_NOW:
err+= str->append(STRING_WITH_LEN(" AS OF CURRENT_TIMESTAMP"));
case partition_element::CURRENT:
err+= str->append(STRING_WITH_LEN(" CURRENT"));
break;
case partition_element::VERSIONING:
err+= str->append(STRING_WITH_LEN(" VERSIONING"));
case partition_element::HISTORY:
err+= str->append(STRING_WITH_LEN(" HISTORY"));
break;
default:
DBUG_ASSERT(0 && "wrong p_elem->type");
......@@ -5000,7 +5000,7 @@ that are reorganised.
partition_element *el;
while ((el= it++))
{
if (el->type() == partition_element::AS_OF_NOW)
if (el->type() == partition_element::CURRENT)
{
DBUG_ASSERT(tab_part_info->vers_info && el == tab_part_info->vers_info->now_part);
it.remove();
......@@ -5094,7 +5094,7 @@ that are reorganised.
alter_info->partition_names))
{
if (tab_part_info->part_type == VERSIONING_PARTITION &&
part_elem->type() == partition_element::AS_OF_NOW)
part_elem->type() == partition_element::CURRENT)
{
DBUG_ASSERT(table && table->s && table->s->table_name.str);
my_error(ER_VERS_WRONG_PARTS, MYF(0), table->s->table_name.str);
......
......@@ -1156,6 +1156,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token HEX_NUM
%token HEX_STRING
%token HIGH_PRIORITY
%token HISTORY_SYM /* MYSQL */
%token HOST_SYM
%token HOSTS_SYM
%token HOUR_MICROSECOND_SYM
......@@ -5460,7 +5461,7 @@ opt_part_values:
part_info->part_type= LIST_PARTITION;
}
part_values_in {}
| AS OF_SYM NOW_SYM
| CURRENT_SYM
{
LEX *lex= Lex;
partition_info *part_info= lex->part_info;
......@@ -5479,7 +5480,7 @@ opt_part_values:
my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0),
Lex->create_last_non_select_table->table_name));
}
elem->type(partition_element::AS_OF_NOW);
elem->type(partition_element::CURRENT);
DBUG_ASSERT(part_info->vers_info);
part_info->vers_info->now_part= elem;
if (part_info->init_column_part(thd))
......@@ -5487,7 +5488,7 @@ opt_part_values:
MYSQL_YYABORT;
}
}
| VERSIONING_SYM
| HISTORY_SYM
{
LEX *lex= Lex;
partition_info *part_info= lex->part_info;
......@@ -5510,7 +5511,7 @@ opt_part_values:
DBUG_ASSERT(Lex->create_last_non_select_table->table_name);
my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0), Lex->create_last_non_select_table->table_name));
}
elem->type(partition_element::VERSIONING);
elem->type(partition_element::HISTORY);
if (part_info->init_column_part(thd))
{
MYSQL_YYABORT;
......@@ -15506,6 +15507,7 @@ keyword_sp_not_data_type:
| GOTO_SYM {}
| HASH_SYM {}
| HARD_SYM {}
| HISTORY_SYM {}
| HOSTS_SYM {}
| HOUR_SYM {}
| ID_SYM {}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment