Skip to content

Commit d8c8d7b

Browse files
kevgsmidenok
authored andcommitted
added implicitly generated fields in versioned tables support and refactored code a bit
1 parent 013345d commit d8c8d7b

File tree

7 files changed

+107
-29
lines changed

7 files changed

+107
-29
lines changed

mysql-test/r/create.result

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1949,6 +1949,19 @@ t1 CREATE TABLE `t1` (
19491949
PERIOD FOR SYSTEM_TIME (`Sys_start`, `Sys_end`)
19501950
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
19511951
drop table if exists t1;
1952+
# Versioning fields are set implicitly.
1953+
create table t1 (
1954+
XNo INT UNSIGNED
1955+
) WITH SYSTEM VERSIONING;
1956+
SHOW CREATE TABLE t1;
1957+
Table Create Table
1958+
t1 CREATE TABLE `t1` (
1959+
`XNo` int(10) unsigned DEFAULT NULL,
1960+
`sys_trx_start` timestamp(6) NULL GENERATED AS ROW START,
1961+
`sys_trx_end` timestamp(6) NULL GENERATED AS ROW END,
1962+
PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`)
1963+
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
1964+
drop table if exists t1;
19521965
create table t1 (
19531966
XNo INT UNSIGNED,
19541967
Sys_start TIMESTAMP(6) GENERATED ALWAYS AS ROW START,

mysql-test/t/create.test

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,6 +1799,14 @@ SHOW CREATE TABLE t1;
17991799

18001800
drop table if exists t1;
18011801

1802+
--echo # Versioning fields are set implicitly.
1803+
create table t1 (
1804+
XNo INT UNSIGNED
1805+
) WITH SYSTEM VERSIONING;
1806+
SHOW CREATE TABLE t1;
1807+
1808+
drop table if exists t1;
1809+
18021810
--error ER_SYS_START_MORE_THAN_ONCE
18031811
create table t1 (
18041812
XNo INT UNSIGNED,

sql/handler.cc

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6552,3 +6552,53 @@ int del_global_index_stat(THD *thd, TABLE* table, KEY* key_info)
65526552
mysql_mutex_unlock(&LOCK_global_index_stats);
65536553
DBUG_RETURN(res);
65546554
}
6555+
6556+
static bool create_string(MEM_ROOT *mem_root, String **s, const char *value)
6557+
{
6558+
*s= new (mem_root) String(value, system_charset_info);
6559+
return *s == NULL;
6560+
}
6561+
6562+
static bool create_sys_trx_field_if_missing(THD *thd, const char *field_name,
6563+
Alter_info *alter_info, String **s)
6564+
{
6565+
Create_field *f= new (thd->mem_root) Create_field();
6566+
if (!f)
6567+
return true;
6568+
6569+
f->field_name= field_name;
6570+
f->charset= system_charset_info;
6571+
f->sql_type= MYSQL_TYPE_TIMESTAMP;
6572+
f->length= 6;
6573+
f->decimals= 0;
6574+
6575+
if (f->check(thd))
6576+
return true;
6577+
6578+
if (create_string(thd->mem_root, s, field_name))
6579+
return true;
6580+
6581+
alter_info->create_list.push_back(f);
6582+
return false;
6583+
}
6584+
6585+
bool System_versioning_info::add_implicit_fields(THD *thd,
6586+
Alter_info *alter_info)
6587+
{
6588+
if (!declared_system_versioning)
6589+
return false;
6590+
6591+
// If user specified some of these he must specify the others too. Do nothing.
6592+
if (generated_as_row.start || generated_as_row.end ||
6593+
period_for_system_time.start || period_for_system_time.end)
6594+
return false;
6595+
6596+
return create_sys_trx_field_if_missing(thd, "sys_trx_start", alter_info,
6597+
&generated_as_row.start) ||
6598+
create_sys_trx_field_if_missing(thd, "sys_trx_end", alter_info,
6599+
&generated_as_row.end) ||
6600+
create_string(thd->mem_root, &period_for_system_time.start,
6601+
"sys_trx_start") ||
6602+
create_string(thd->mem_root, &period_for_system_time.end,
6603+
"sys_trx_end");
6604+
}

sql/handler.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,6 +1683,9 @@ struct System_versioning_info
16831683
set_period_for_system_time(NULL, NULL);
16841684
}
16851685

1686+
/** Returns true on failure */
1687+
bool add_implicit_fields(THD *thd, Alter_info *alter_info);
1688+
16861689
/** User has added 'WITH SYSTEM VERSIONING' to table definition */
16871690
bool declared_system_versioning;
16881691

@@ -1777,11 +1780,17 @@ struct Table_scope_and_contents_source_st
17771780
: ha_default_handlerton(thd);
17781781
}
17791782

1780-
bool versioned()
1783+
bool versioned() const
17811784
{
17821785
return system_versioning_info.versioned;
17831786
}
1784-
const System_versioning_info *get_system_versioning_info()
1787+
const System_versioning_info *get_system_versioning_info() const
1788+
{
1789+
if (!versioned())
1790+
return NULL;
1791+
return &system_versioning_info;
1792+
}
1793+
System_versioning_info *get_system_versioning_info()
17851794
{
17861795
if (!versioned())
17871796
return NULL;

sql/sql_lex.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3561,10 +3561,9 @@ struct LEX: public Query_tables_list
35613561
bool add_unit_in_brackets(SELECT_LEX *nselect);
35623562
void check_automatic_up(enum sub_select_type type);
35633563

3564-
System_versioning_info *vers_get_info()
3564+
System_versioning_info &vers_get_info()
35653565
{
3566-
create_info.system_versioning_info.versioned = true;
3567-
return &create_info.system_versioning_info;
3566+
return create_info.system_versioning_info;
35683567
}
35693568
};
35703569

sql/sql_parse.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3849,17 +3849,20 @@ mysql_execute_command(THD *thd)
38493849
copy.
38503850
*/
38513851
Alter_info alter_info(lex->alter_info, thd->mem_root);
3852-
3853-
if (check_system_versioning(&create_info))
3854-
goto end_with_restore_list;
3855-
38563852
if (thd->is_fatal_error)
38573853
{
38583854
/* If out of memory when creating a copy of alter_info. */
38593855
res= 1;
38603856
goto end_with_restore_list;
38613857
}
38623858

3859+
if (System_versioning_info *info= create_info.get_system_versioning_info())
3860+
if (info->add_implicit_fields(thd, &alter_info))
3861+
goto end_with_restore_list;
3862+
3863+
if (check_system_versioning(&create_info))
3864+
goto end_with_restore_list;
3865+
38633866
/* Check privileges */
38643867
if ((res= create_table_precheck(thd, select_tables, create_table)))
38653868
goto end_with_restore_list;

sql/sql_yacc.yy

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5852,10 +5852,9 @@ create_table_option:
58525852
}
58535853
| WITH SYSTEM VERSIONING
58545854
{
5855-
System_versioning_info *info = Lex->vers_get_info();
5856-
if (!info)
5857-
MYSQL_YYABORT;
5858-
info->declared_system_versioning = true;
5855+
System_versioning_info &info= Lex->vers_get_info();
5856+
info.declared_system_versioning= true;
5857+
info.versioned= true;
58595858
}
58605859
;
58615860

@@ -6060,15 +6059,14 @@ period_for_system_time:
60606059
// If FOR_SYM is followed by SYSTEM_TIME_SYM then they are merged to: FOR_SYSTEM_TIME_SYM .
60616060
PERIOD_SYM FOR_SYSTEM_TIME_SYM '(' period_for_system_time_column_id ',' period_for_system_time_column_id ')'
60626061
{
6063-
System_versioning_info *info = Lex->vers_get_info();
6064-
if (!info)
6065-
MYSQL_YYABORT;
6062+
System_versioning_info &info= Lex->vers_get_info();
60666063
if (!my_strcasecmp(system_charset_info, $4->c_ptr(), $6->c_ptr()))
60676064
{
60686065
my_error(ER_SYS_START_AND_SYS_END_SAME, MYF(0), $4->c_ptr());
60696066
MYSQL_YYABORT;
60706067
}
6071-
info->set_period_for_system_time($4, $6);
6068+
info.set_period_for_system_time($4, $6);
6069+
info.versioned= true;
60726070
}
60736071
;
60746072

@@ -6168,26 +6166,24 @@ field_def:
61686166
vcol_opt_specifier vcol_opt_attribute
61696167
| opt_generated_always AS ROW_SYM start_or_end
61706168
{
6171-
System_versioning_info *info =
6172-
Lex->vers_get_info();
6173-
if (!info)
6174-
MYSQL_YYABORT;
6175-
String *field_name = new (thd->mem_root)
6169+
System_versioning_info &info= Lex->vers_get_info();
6170+
info.versioned= true;
6171+
String *field_name= new (thd->mem_root)
61766172
String((const char*)Lex->last_field->field_name, system_charset_info);
61776173
if (!field_name)
61786174
MYSQL_YYABORT;
61796175

6180-
String **p = NULL;
6181-
int err_nr = 0;
6176+
String **p= NULL;
6177+
int err_nr= 0;
61826178
switch ($4)
61836179
{
61846180
case 1:
6185-
p = &info->generated_as_row.start;
6186-
err_nr = ER_SYS_START_MORE_THAN_ONCE;
6181+
p= &info.generated_as_row.start;
6182+
err_nr= ER_SYS_START_MORE_THAN_ONCE;
61876183
break;
61886184
case 0:
6189-
p = &info->generated_as_row.end;
6190-
err_nr = ER_SYS_END_MORE_THAN_ONCE;
6185+
p= &info.generated_as_row.end;
6186+
err_nr= ER_SYS_END_MORE_THAN_ONCE;
61916187
break;
61926188
default:
61936189
/* Not Reachable */
@@ -6199,7 +6195,7 @@ field_def:
61996195
my_error(err_nr, MYF(0), field_name->c_ptr());
62006196
MYSQL_YYABORT;
62016197
}
6202-
*p = field_name;
6198+
*p= field_name;
62036199
}
62046200
;
62056201

0 commit comments

Comments
 (0)