diff --git a/mysql-test/suite/versioning/r/variables.result b/mysql-test/suite/versioning/r/variables.result new file mode 100644 index 00000000000..c0d15cbf1e8 --- /dev/null +++ b/mysql-test/suite/versioning/r/variables.result @@ -0,0 +1,38 @@ +create table t (a int) with system versioning; +insert into t values (1); +update t set a=2; +select * from t; +a +2 +show variables where Variable_name like "temporal_current_timestamp%"; +Variable_name Value +temporal_current_timestamp now +set global temporal_current_timestamp = '2031-1-1 0:0:0'; +select * from t; +a +2 +set global temporal_current_timestamp = '2011-1-1 0:0:0'; +select * from t; +a +set global temporal_current_timestamp = 'all'; +select * from t; +a +2 +1 +show variables where Variable_name like "temporal_current_timestamp%"; +Variable_name Value +temporal_current_timestamp all +create view vt as select * from t; +select * from t; +a +2 +1 +drop view vt; +select * from (select * from t) as tt; +a +2 +1 +set session temporal_current_timestamp = 'now'; +ERROR HY000: Variable 'temporal_current_timestamp' is a GLOBAL variable and should be set with SET GLOBAL +drop table t; +set global temporal_current_timestamp = 'now'; diff --git a/mysql-test/suite/versioning/t/variables.test b/mysql-test/suite/versioning/t/variables.test new file mode 100644 index 00000000000..7b7b458f642 --- /dev/null +++ b/mysql-test/suite/versioning/t/variables.test @@ -0,0 +1,28 @@ +create table t (a int) with system versioning; +insert into t values (1); +update t set a=2; + +select * from t; +show variables where Variable_name like "temporal_current_timestamp%"; + +set global temporal_current_timestamp = '2031-1-1 0:0:0'; +select * from t; + +set global temporal_current_timestamp = '2011-1-1 0:0:0'; +select * from t; + +set global temporal_current_timestamp = 'all'; +select * from t; +show variables where Variable_name like "temporal_current_timestamp%"; + +create view vt as select * from t; +select * from t; +drop view vt; + +select * from (select * from t) as tt; + +--error ER_GLOBAL_VARIABLE +set session temporal_current_timestamp = 'now'; + +drop table t; +set global temporal_current_timestamp = 'now'; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 5196ec41c11..b7eccea80c6 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -781,6 +781,9 @@ char *relay_log_info_file, *report_user, *report_password, *report_host; char *opt_relay_logname = 0, *opt_relaylog_index_name=0; char *opt_logname, *opt_slow_logname, *opt_bin_logname; +/* System Versioning */ +char *temporal_current_timestamp; + /* Static variables */ static volatile sig_atomic_t kill_in_progress; diff --git a/sql/mysqld.h b/sql/mysqld.h index 46382396a5a..ece0992dd82 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -175,6 +175,7 @@ extern char *opt_backup_history_logname, *opt_backup_progress_logname, *opt_backup_settings_name; extern const char *log_output_str; extern const char *log_backup_output_str; +extern char *temporal_current_timestamp; extern char *mysql_home_ptr, *pidfile_name_ptr; extern MYSQL_PLUGIN_IMPORT char glob_hostname[FN_REFLEN]; extern char mysql_home[FN_REFLEN]; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2ba2f2e7234..3d5f158df36 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -62,6 +62,7 @@ #include #include #include +#include "sys_vars_shared.h" /* A key part number that means we're using a fulltext scan. @@ -775,6 +776,28 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr, DBUG_RETURN(-1); } + if (vers_conditions.type == FOR_SYSTEM_TIME_UNSPECIFIED) + { + const char var[]= "temporal_current_timestamp"; + sys_var *sv= intern_find_sys_var(var, sizeof(var) - 1); + DBUG_ASSERT(sv); + const char *data= *(char **)sv->option.value; + DBUG_ASSERT(data); + if (0 == strcmp(data, "all")) + { + vers_conditions.init(FOR_SYSTEM_TIME_ALL, UNIT_TIMESTAMP); + } + else if (0 != strcmp(data, "now")) + { + Item *ts= create_temporal_literal(thd, data, strlen(data), + system_charset_info, + MYSQL_TYPE_DATETIME, true); + if (!ts) + DBUG_RETURN(-1); + vers_conditions.init(FOR_SYSTEM_TIME_AS_OF, UNIT_TIMESTAMP, ts); + } + } + if (vers_conditions.type != FOR_SYSTEM_TIME_UNSPECIFIED) { switch (slex->lock_type) diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index da8fa18cb26..bc2b37d9d6d 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -382,6 +382,11 @@ static Sys_var_charptr Sys_basedir( READ_ONLY GLOBAL_VAR(mysql_home_ptr), CMD_LINE(REQUIRED_ARG, 'b'), IN_FS_CHARSET, DEFAULT(0)); +static Sys_var_charptr sys_temporal_current_timestamp( + "temporal_current_timestamp", "Default AS OF value for versioned tables", + GLOBAL_VAR(temporal_current_timestamp), CMD_LINE(REQUIRED_ARG, 'b'), + IN_FS_CHARSET, DEFAULT("now")); + static Sys_var_ulonglong Sys_binlog_cache_size( "binlog_cache_size", "The size of the transactional cache for " "updates to transactional engines for the binary log. "