summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/sysdate_is_now.result4
-rw-r--r--mysql-test/t/sysdate_is_now-master.opt1
-rw-r--r--mysql-test/t/sysdate_is_now.test11
-rw-r--r--sql/mysqld.cc5
-rw-r--r--sql/sql_class.h1
-rw-r--r--sql/sql_yacc.yy14
6 files changed, 34 insertions, 2 deletions
diff --git a/mysql-test/r/sysdate_is_now.result b/mysql-test/r/sysdate_is_now.result
new file mode 100644
index 00000000000..82861436ff6
--- /dev/null
+++ b/mysql-test/r/sysdate_is_now.result
@@ -0,0 +1,4 @@
+set timestamp=1;
+SELECT sleep(1),NOW()-SYSDATE() as zero;
+sleep(1) zero
+0 0
diff --git a/mysql-test/t/sysdate_is_now-master.opt b/mysql-test/t/sysdate_is_now-master.opt
new file mode 100644
index 00000000000..97a58d28032
--- /dev/null
+++ b/mysql-test/t/sysdate_is_now-master.opt
@@ -0,0 +1 @@
+--sysdate-is-now
diff --git a/mysql-test/t/sysdate_is_now.test b/mysql-test/t/sysdate_is_now.test
new file mode 100644
index 00000000000..166914e20c8
--- /dev/null
+++ b/mysql-test/t/sysdate_is_now.test
@@ -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
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index bc30a2c981b..f1cffbfd657 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -4578,6 +4578,7 @@ enum options_mysqld
OPT_DATETIME_FORMAT,
OPT_LOG_QUERIES_NOT_USING_INDEXES,
OPT_DEFAULT_TIME_ZONE,
+ OPT_SYSDATE_IS_NOW,
OPT_OPTIMIZER_SEARCH_DEPTH,
OPT_OPTIMIZER_PRUNE_LEVEL,
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,
REQUIRED_ARG, NET_WAIT_TIMEOUT, 1, IF_WIN(INT_MAX32/1000, LONG_TIMEOUT),
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}
};
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 048a0a49618..6189470b88d 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -585,6 +585,7 @@ struct system_variables
DATE_TIME_FORMAT *date_format;
DATE_TIME_FORMAT *datetime_format;
DATE_TIME_FORMAT *time_format;
+ my_bool sysdate_is_now;
};
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index b6d197369cf..03da97b91c9 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -4671,9 +4671,19 @@ simple_expr:
| SUBSTRING_INDEX '(' expr ',' expr ',' expr ')'
{ $$= new Item_func_substr_index($3,$5,$7); }
| 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 ')'
- { $$= 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 ')'
{ $$= new Item_time_typecast($3); }
| TIMESTAMP '(' expr ')'