summaryrefslogtreecommitdiff
path: root/sql/item_timefunc.h
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2017-04-22 21:59:00 +0400
committerAlexander Barkov <bar@mariadb.org>2017-04-22 21:59:00 +0400
commitba670edfa30a5317c4b0eebd005b83dce63d0dfc (patch)
tree1ab1be28e18153969062a88349e0e38e59023ad5 /sql/item_timefunc.h
parentb7814086017b66f8a8ef1762096ea9394a26aa7a (diff)
downloadmariadb-git-ba670edfa30a5317c4b0eebd005b83dce63d0dfc.tar.gz
MDEV-12559 Split Item::temporal_precision() into virtual methods in Type_handler
- Adding a new virtual method Type_handler::Item_time_precision() - Adding a new virtual method Type_handler::Item_datetime_precision() - Removing Item::temporal_precision() and adding Item::time_precision() and Item::datetime_precision() instead. - Moving Item_func_convert_tz::fix_length_and_dec() from item_timefunc.cc to item_timefunc.h. It's only two lines, and we're changing it anyway. - Removing Item_temporal_typecast::fix_length_and_dec_generic(), moving this code to Type_handler::Item_{date|time|datetime}_typecast_fix_length_and_dec(). This allows to get rid of one more field_type() call. Also, in the old reduction, Item_date_typecast::fix_length_and_dec() unnecessarily called args[0]->temporal_precision(). The new reduction does not call args[0]->datetime_precision(), as DATE does not have fractional digits.
Diffstat (limited to 'sql/item_timefunc.h')
-rw-r--r--sql/item_timefunc.h37
1 files changed, 17 insertions, 20 deletions
diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h
index 40b8c169c80..5caeea489f6 100644
--- a/sql/item_timefunc.h
+++ b/sql/item_timefunc.h
@@ -443,16 +443,13 @@ class Item_func_dayname :public Item_func_weekday
class Item_func_seconds_hybrid: public Item_func_numhybrid
{
-protected:
- virtual enum_field_types arg0_expected_type() const = 0;
public:
Item_func_seconds_hybrid(THD *thd): Item_func_numhybrid(thd) {}
Item_func_seconds_hybrid(THD *thd, Item *a): Item_func_numhybrid(thd, a) {}
- void fix_length_and_dec()
+ void fix_length_and_dec_generic(uint dec)
{
- if (arg_count)
- decimals= args[0]->temporal_precision(arg0_expected_type());
- set_if_smaller(decimals, TIME_SECOND_PART_DIGITS);
+ DBUG_ASSERT(dec <= TIME_SECOND_PART_DIGITS);
+ decimals= dec;
max_length=17 + (decimals ? decimals + 1 : 0);
maybe_null= true;
set_handler_by_result_type(decimals ? DECIMAL_RESULT : INT_RESULT);
@@ -466,8 +463,6 @@ public:
class Item_func_unix_timestamp :public Item_func_seconds_hybrid
{
bool get_timestamp_value(my_time_t *seconds, ulong *second_part);
-protected:
- enum_field_types arg0_expected_type() const { return MYSQL_TYPE_DATETIME; }
public:
Item_func_unix_timestamp(THD *thd): Item_func_seconds_hybrid(thd) {}
Item_func_unix_timestamp(THD *thd, Item *a):
@@ -491,6 +486,10 @@ public:
return FALSE;
return mark_unsupported_function(func_name(), "()", arg, VCOL_TIME_FUNC);
}
+ void fix_length_and_dec()
+ {
+ fix_length_and_dec_generic(arg_count ? args[0]->datetime_precision() : 0);
+ }
longlong int_op();
my_decimal *decimal_op(my_decimal* buf);
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
@@ -500,8 +499,6 @@ public:
class Item_func_time_to_sec :public Item_func_seconds_hybrid
{
-protected:
- enum_field_types arg0_expected_type() const { return MYSQL_TYPE_TIME; }
public:
Item_func_time_to_sec(THD *thd, Item *item):
Item_func_seconds_hybrid(thd, item) {}
@@ -512,6 +509,10 @@ public:
{
return !has_time_args();
}
+ void fix_length_and_dec()
+ {
+ fix_length_and_dec_generic(args[0]->time_precision());
+ }
longlong int_op();
my_decimal *decimal_op(my_decimal* buf);
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
@@ -864,7 +865,11 @@ class Item_func_convert_tz :public Item_datetimefunc
Item_func_convert_tz(THD *thd, Item *a, Item *b, Item *c):
Item_datetimefunc(thd, a, b, c), from_tz_cached(0), to_tz_cached(0) {}
const char *func_name() const { return "convert_tz"; }
- void fix_length_and_dec();
+ void fix_length_and_dec()
+ {
+ fix_attributes_datetime(args[0]->datetime_precision());
+ maybe_null= true;
+ }
bool get_date(MYSQL_TIME *res, ulonglong fuzzy_date);
void cleanup();
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
@@ -1059,13 +1064,6 @@ public:
Item_temporal_typecast(THD *thd, Item *a): Item_temporal_func(thd, a) {}
virtual const char *cast_type() const = 0;
void print(String *str, enum_query_type query_type);
- void fix_length_and_dec_generic(uint int_part_len)
- {
- if (decimals == NOT_FIXED_DEC)
- decimals= args[0]->temporal_precision(field_type());
- fix_attributes_temporal(int_part_len, decimals);
- maybe_null= true;
- }
};
class Item_date_typecast :public Item_temporal_typecast
@@ -1157,8 +1155,7 @@ public:
const char *func_name() const { return "timediff"; }
void fix_length_and_dec()
{
- uint dec= MY_MAX(args[0]->temporal_precision(MYSQL_TYPE_TIME),
- args[1]->temporal_precision(MYSQL_TYPE_TIME));
+ uint dec= MY_MAX(args[0]->time_precision(), args[1]->time_precision());
fix_attributes_time(dec);
maybe_null= true;
}