BUG#15101 SYSDATE() disregards SET TIMESTAMP.
After the ChangeSet 1.1892.20.1 2005/08/24 (Bug #12562) SYSDATE() is not an alias of NOW() and is unsafe for replication. `SYSDATE()' backward compatible aliasing clashes with the idea #12562 fix. To make it safe-replicatable we have to either use RBR or to restore the pre-5.0 style. --sysdate-is-now command line flag was introduced to provide backward compatibility.
This commit is contained in:
parent
579271a461
commit
d187d410d1
4
mysql-test/r/sysdate_is_now.result
Normal file
4
mysql-test/r/sysdate_is_now.result
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
set timestamp=1;
|
||||||
|
SELECT sleep(1),NOW()-SYSDATE() as zero;
|
||||||
|
sleep(1) zero
|
||||||
|
0 0
|
1
mysql-test/t/sysdate_is_now-master.opt
Normal file
1
mysql-test/t/sysdate_is_now-master.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--sysdate-is-now
|
11
mysql-test/t/sysdate_is_now.test
Normal file
11
mysql-test/t/sysdate_is_now.test
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#
|
||||||
|
# BUG#15101 restore aliasing of SYSDATE to NOW in 5.0
|
||||||
|
# this feature is activated via --sysdate-is-now mysqld init opt
|
||||||
|
#
|
||||||
|
# To test here
|
||||||
|
# 1. SYSDATE() does not distiguish from NOW()
|
||||||
|
# 2. SYSDATE() obeys set timestamp
|
||||||
|
|
||||||
|
set timestamp=1;
|
||||||
|
SELECT sleep(1),NOW()-SYSDATE() as zero;
|
||||||
|
# End of 5.0 tests
|
@ -4578,6 +4578,7 @@ enum options_mysqld
|
|||||||
OPT_DATETIME_FORMAT,
|
OPT_DATETIME_FORMAT,
|
||||||
OPT_LOG_QUERIES_NOT_USING_INDEXES,
|
OPT_LOG_QUERIES_NOT_USING_INDEXES,
|
||||||
OPT_DEFAULT_TIME_ZONE,
|
OPT_DEFAULT_TIME_ZONE,
|
||||||
|
OPT_SYSDATE_IS_NOW,
|
||||||
OPT_OPTIMIZER_SEARCH_DEPTH,
|
OPT_OPTIMIZER_SEARCH_DEPTH,
|
||||||
OPT_OPTIMIZER_PRUNE_LEVEL,
|
OPT_OPTIMIZER_PRUNE_LEVEL,
|
||||||
OPT_UPDATABLE_VIEWS_WITH_LIMIT,
|
OPT_UPDATABLE_VIEWS_WITH_LIMIT,
|
||||||
@ -5935,6 +5936,10 @@ The minimum value for this variable is 4096.",
|
|||||||
(gptr*) &max_system_variables.net_wait_timeout, 0, GET_ULONG,
|
(gptr*) &max_system_variables.net_wait_timeout, 0, GET_ULONG,
|
||||||
REQUIRED_ARG, NET_WAIT_TIMEOUT, 1, IF_WIN(INT_MAX32/1000, LONG_TIMEOUT),
|
REQUIRED_ARG, NET_WAIT_TIMEOUT, 1, IF_WIN(INT_MAX32/1000, LONG_TIMEOUT),
|
||||||
0, 1, 0},
|
0, 1, 0},
|
||||||
|
{"sysdate-is-now", OPT_SYSDATE_IS_NOW,
|
||||||
|
"Non-default flag to alias SYSDATE() to NOW() to be safe-replicatable. Since 5.0 SYSDATE returns a `dynamic' value different for different invocation even within a query",
|
||||||
|
(gptr*) &global_system_variables.sysdate_is_now,
|
||||||
|
0, 0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 1, 0},
|
||||||
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -585,6 +585,7 @@ struct system_variables
|
|||||||
DATE_TIME_FORMAT *date_format;
|
DATE_TIME_FORMAT *date_format;
|
||||||
DATE_TIME_FORMAT *datetime_format;
|
DATE_TIME_FORMAT *datetime_format;
|
||||||
DATE_TIME_FORMAT *time_format;
|
DATE_TIME_FORMAT *time_format;
|
||||||
|
my_bool sysdate_is_now;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -4671,9 +4671,19 @@ simple_expr:
|
|||||||
| SUBSTRING_INDEX '(' expr ',' expr ',' expr ')'
|
| SUBSTRING_INDEX '(' expr ',' expr ',' expr ')'
|
||||||
{ $$= new Item_func_substr_index($3,$5,$7); }
|
{ $$= new Item_func_substr_index($3,$5,$7); }
|
||||||
| SYSDATE optional_braces
|
| SYSDATE optional_braces
|
||||||
{ $$= new Item_func_sysdate_local(); Lex->safe_to_cache_query=0;}
|
{
|
||||||
|
if (global_system_variables.sysdate_is_now == 0)
|
||||||
|
$$= new Item_func_sysdate_local();
|
||||||
|
else $$= new Item_func_now_local();
|
||||||
|
Lex->safe_to_cache_query=0;
|
||||||
|
}
|
||||||
| SYSDATE '(' expr ')'
|
| SYSDATE '(' expr ')'
|
||||||
{ $$= new Item_func_sysdate_local($3); Lex->safe_to_cache_query=0;}
|
{
|
||||||
|
if (global_system_variables.sysdate_is_now == 0)
|
||||||
|
$$= new Item_func_sysdate_local($3);
|
||||||
|
else $$= new Item_func_now_local($3);
|
||||||
|
Lex->safe_to_cache_query=0;
|
||||||
|
}
|
||||||
| TIME_SYM '(' expr ')'
|
| TIME_SYM '(' expr ')'
|
||||||
{ $$= new Item_time_typecast($3); }
|
{ $$= new Item_time_typecast($3); }
|
||||||
| TIMESTAMP '(' expr ')'
|
| TIMESTAMP '(' expr ')'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user