From a9151bd89a6ed7c1c7558e8f62b744d3fd843154 Mon Sep 17 00:00:00 2001 From: ximinliang Date: Sat, 17 May 2025 15:35:21 +0800 Subject: [PATCH] add get_date and get_time for null_if func --- mysql-test/r/func_if.result | 18 ++++++++++++++++++ mysql-test/t/func_if.test | 11 +++++++++++ sql/item_cmpfunc.cc | 17 +++++++++++++++++ sql/item_cmpfunc.h | 2 ++ 4 files changed, 48 insertions(+) diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index 3594fee3ceee..7ce6cefb5ae9 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -367,3 +367,21 @@ COALESCE(CASE WHEN x THEN NULL ELSE NULL END, x) SELECT COALESCE(COALESCE(NULL, NULL), x) FROM t EXCEPT SELECT 1; COALESCE(COALESCE(NULL, NULL), x) DROP TABLE t; +# +# Bug #0000: WRONG RESULT WHEN CAST RESULT OF NULLIF AS DATE OR TIME +# +SELECT CAST(NULLIF('1996-11-21 19:40:27', '') AS DATE); +CAST(NULLIF('1996-11-21 19:40:27', '') AS DATE) +1996-11-21 +SELECT CAST(NULLIF('1996-11-21 19:40:27', '') AS DATETIME); +CAST(NULLIF('1996-11-21 19:40:27', '') AS DATETIME) +1996-11-21 19:40:27 +SELECT CAST(NULLIF('19:40:27', '') AS TIME); +CAST(NULLIF('19:40:27', '') AS TIME) +19:40:27 +SELECT CAST(NULLIF('1996-11-21', '1996-11-21') AS DATE); +CAST(NULLIF('1996-11-21', '1996-11-21') AS DATE) +NULL +SELECT CAST(NULLIF(19961121, 0) AS DATE); +CAST(NULLIF(19961121, 0) AS DATE) +1996-11-21 diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test index a53c6a1eb855..943b8cd079f1 100644 --- a/mysql-test/t/func_if.test +++ b/mysql-test/t/func_if.test @@ -322,3 +322,14 @@ SELECT COALESCE(IF(x, NULL, NULL), x) FROM t EXCEPT SELECT 1; SELECT COALESCE(CASE WHEN x THEN NULL ELSE NULL END, x) FROM t EXCEPT SELECT 1; SELECT COALESCE(COALESCE(NULL, NULL), x) FROM t EXCEPT SELECT 1; DROP TABLE t; + + +--echo # +--echo # Bug #0000: WRONG RESULT WHEN CAST RESULT OF NULLIF AS DATE OR TIME +--echo # + +SELECT CAST(NULLIF('1996-11-21 19:40:27', '') AS DATE); +SELECT CAST(NULLIF('1996-11-21 19:40:27', '') AS DATETIME); +SELECT CAST(NULLIF('19:40:27', '') AS TIME); +SELECT CAST(NULLIF('1996-11-21', '1996-11-21') AS DATE); +SELECT CAST(NULLIF(19961121, 0) AS DATE); diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 51481aa72a1b..b67091163a6d 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -3917,6 +3917,23 @@ bool Item_func_nullif::val_json(Json_wrapper *wr) { return res; } +bool Item_func_nullif::get_date(MYSQL_TIME *res, my_time_flags_t fuzzy_date) { + assert(fixed); + if (!cmp.compare()) { + null_value = true; + return true; + } + return get_arg0_date(res, fuzzy_date); +} +bool Item_func_nullif::get_time(MYSQL_TIME *res) { + assert(fixed); + if (!cmp.compare()) { + null_value = true; + return true; + } + return get_arg0_time(res); +} + bool Item_func_nullif::is_null() { const int result = cmp.compare(); if (current_thd->is_error()) { diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index b8669532eae0..21235ac9c770 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -1607,6 +1607,8 @@ class Item_func_nullif final : public Item_bool_func2 { String *val_str(String *str) override; my_decimal *val_decimal(my_decimal *) override; bool val_json(Json_wrapper *wr) override; + bool get_date(MYSQL_TIME *res, my_time_flags_t fuzzy_date) override; + bool get_time(MYSQL_TIME *ltime) override; Item_result result_type() const override { return cached_result_type; } enum_field_types default_data_type() const override { return MYSQL_TYPE_VARCHAR;