diff options
author | Alexander Barkov <bar@mariadb.com> | 2020-07-28 17:32:19 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2020-07-28 23:29:08 +0400 |
commit | 5b3b53ce36b9a05832af3a19ae8d846b6669a1f5 (patch) | |
tree | af8b06547a4466125138314a61db6e69ee743d78 /sql/item_func.h | |
parent | 69cf6302f30e9bca7d2b0903c29fc1b26b09bcc7 (diff) | |
download | mariadb-git-5b3b53ce36b9a05832af3a19ae8d846b6669a1f5.tar.gz |
MDEV-23311 CEILING() and FLOOR() convert temporal input to numbers, unlike ROUND() and TRUNCATE()
Fixing functions CEILING and FLOOR to return
- TIME for TIME input
- DATETIME for DATETIME and TIMESTAMP input
Diffstat (limited to 'sql/item_func.h')
-rw-r--r-- | sql/item_func.h | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/sql/item_func.h b/sql/item_func.h index a8727272adc..dc9ec9be742 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1666,13 +1666,32 @@ public: }; -class Item_func_int_val :public Item_func_num1 +class Item_func_int_val :public Item_func_hybrid_field_type { public: - Item_func_int_val(THD *thd, Item *a): Item_func_num1(thd, a) {} + Item_func_int_val(THD *thd, Item *a): Item_func_hybrid_field_type(thd, a) {} + bool check_partition_func_processor(void *int_arg) { return FALSE; } + bool check_vcol_func_processor(void *arg) { return FALSE; } void fix_length_and_dec_double(); void fix_length_and_dec_int_or_decimal(); + void fix_length_and_dec_time() + { + fix_attributes_time(0); + set_handler(&type_handler_time2); + } + void fix_length_and_dec_datetime() + { + fix_attributes_datetime(0); + set_handler(&type_handler_datetime2); + maybe_null= true; // E.g. CEILING(TIMESTAMP'0000-01-01 23:59:59.9') + } bool fix_length_and_dec(); + String *str_op(String *str) { DBUG_ASSERT(0); return 0; } + bool native_op(THD *thd, Native *to) + { + DBUG_ASSERT(0); + return true; + } }; @@ -1684,6 +1703,8 @@ public: longlong int_op(); double real_op(); my_decimal *decimal_op(my_decimal *); + bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate); + bool time_op(THD *thd, MYSQL_TIME *ltime); Item *get_copy(THD *thd) { return get_item_copy<Item_func_ceiling>(thd, this); } }; @@ -1697,6 +1718,8 @@ public: longlong int_op(); double real_op(); my_decimal *decimal_op(my_decimal *); + bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate); + bool time_op(THD *thd, MYSQL_TIME *ltime); Item *get_copy(THD *thd) { return get_item_copy<Item_func_floor>(thd, this); } }; |