summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2012-02-21 21:18:41 +0100
committerSergei Golubchik <sergii@pisem.net>2012-02-21 21:18:41 +0100
commitc9fc9f73170a8eb16ea968a2ea51b298eb5cdcfc (patch)
treefb1c75149c75e14bdca91eee6c694e62ebc6cded
parentf93da174c514e001fd0af61bc4fba51f9f8e7c9e (diff)
downloadmariadb-git-c9fc9f73170a8eb16ea968a2ea51b298eb5cdcfc.tar.gz
lp:923429 Crash in decimal_cmp on using UNIX_TIMESTAMP with a wrongly formatted timestamp
UNIX_TIMESTAMP() can be null, and returns null for invalid values
-rw-r--r--mysql-test/r/type_timestamp.result13
-rw-r--r--mysql-test/t/type_timestamp.test7
-rw-r--r--sql/item_timefunc.cc8
-rw-r--r--sql/item_timefunc.h5
4 files changed, 20 insertions, 13 deletions
diff --git a/mysql-test/r/type_timestamp.result b/mysql-test/r/type_timestamp.result
index cfe229d2d15..5c3c3226bf8 100644
--- a/mysql-test/r/type_timestamp.result
+++ b/mysql-test/r/type_timestamp.result
@@ -587,3 +587,16 @@ Variable_name Value
Handler_read_next 1
DROP TABLE t1, t2;
End of 5.1 tests
+#
+# lp:923429 Crash in decimal_cmp on using UNIX_TIMESTAMP with a wrongly formatted timestamp
+#
+SELECT UNIX_TIMESTAMP('abc') > 0;
+UNIX_TIMESTAMP('abc') > 0
+NULL
+Warnings:
+Warning 1292 Incorrect datetime value: 'abc'
+SELECT UNIX_TIMESTAMP('abc');
+UNIX_TIMESTAMP('abc')
+NULL
+Warnings:
+Warning 1292 Incorrect datetime value: 'abc'
diff --git a/mysql-test/t/type_timestamp.test b/mysql-test/t/type_timestamp.test
index 533a45ba7fe..674f22cd1c2 100644
--- a/mysql-test/t/type_timestamp.test
+++ b/mysql-test/t/type_timestamp.test
@@ -410,3 +410,10 @@ SHOW STATUS LIKE 'Handler_read_next';
DROP TABLE t1, t2;
--echo End of 5.1 tests
+
+--echo #
+--echo # lp:923429 Crash in decimal_cmp on using UNIX_TIMESTAMP with a wrongly formatted timestamp
+--echo #
+SELECT UNIX_TIMESTAMP('abc') > 0;
+SELECT UNIX_TIMESTAMP('abc');
+
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index e01a4399cbe..1002cf9fea8 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -1134,15 +1134,7 @@ bool Item_func_unix_timestamp::get_timestamp_value(my_time_t *seconds,
MYSQL_TIME ltime;
if (get_arg0_date(&ltime, 0))
- {
- /*
- We have to set null_value again because get_arg0_date will also set it
- to true if we have wrong datetime parameter (and we should return 0 in
- this case).
- */
- null_value= args[0]->null_value;
return 1;
- }
uint error_code;
*seconds= TIME_to_timestamp(current_thd, &ltime, &error_code);
diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h
index e1bf53a5baf..8d19e59ddfb 100644
--- a/sql/item_timefunc.h
+++ b/sql/item_timefunc.h
@@ -385,11 +385,6 @@ public:
Item_func_unix_timestamp(Item *a) :Item_func_seconds_hybrid(a) {}
const char *func_name() const { return "unix_timestamp"; }
bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
- void fix_num_length_and_dec()
- {
- maybe_null= false;
- Item_func_seconds_hybrid::fix_num_length_and_dec();
- }
/*
UNIX_TIMESTAMP() depends on the current timezone
(and thus may not be used as a partitioning function)