diff --git a/mysql-test/r/func_math.result b/mysql-test/r/func_math.result
index b36902d787292d0a8e18259640a1fb1622d6c3d6..11a3d14fb65bf1a61ea73a238a55c6367f9b8a6b 100644
--- a/mysql-test/r/func_math.result
+++ b/mysql-test/r/func_math.result
@@ -145,3 +145,9 @@ insert into t1 values (1);
 select rand(i) from t1;
 ERROR HY000: Incorrect arguments to RAND
 drop table t1;
+create table t1 (a varchar(90), ts datetime not null, index (a)) engine=innodb default charset=utf8;
+insert into t1 values ('http://www.foo.com/', now());
+select a from t1 where a='http://www.foo.com/' order by abs(timediff(ts, 0));
+a
+http://www.foo.com/
+drop table t1;
diff --git a/mysql-test/t/func_math.test b/mysql-test/t/func_math.test
index c75454a96d40b66d094c6578f0e9e616b3f18b37..a8f62e38e866efa0b53294f0102aa3cc9140651b 100644
--- a/mysql-test/t/func_math.test
+++ b/mysql-test/t/func_math.test
@@ -86,4 +86,14 @@ insert into t1 values (1);
 select rand(i) from t1;
 drop table t1;
 
+#
+# Bug #14009: use of abs() on null value causes problems with filesort
+#
+# InnoDB is required to reproduce the fault, but it is okay if we default to
+# MyISAM when testing.
+create table t1 (a varchar(90), ts datetime not null, index (a)) engine=innodb default charset=utf8;
+insert into t1 values ('http://www.foo.com/', now());
+select a from t1 where a='http://www.foo.com/' order by abs(timediff(ts, 0));
+drop table t1;
+
 # End of 4.1 tests
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 288859443ff76079bde67236a0c9dfcc30930587..5a70e6ba89bee5e1747b9cbfcfb8c7117584b0ea 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -766,6 +766,7 @@ void Item_func_abs::fix_length_and_dec()
   hybrid_type= REAL_RESULT;
   if (args[0]->result_type() == INT_RESULT)
     hybrid_type= INT_RESULT;
+  maybe_null= 1;
 }