diff options
author | Alexander Barkov <bar@mnogosearch.org> | 2014-02-03 23:29:22 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mnogosearch.org> | 2014-02-03 23:29:22 +0400 |
commit | 156399901891b4508b43325dcdf9e99293d053d6 (patch) | |
tree | f6d20a747e82df8d01150c4cc0ca9f8428961e67 /sql/item_timefunc.cc | |
parent | 4d5f5f4cdf8c99bf693fd78490524a72418f1f45 (diff) | |
download | mariadb-git-156399901891b4508b43325dcdf9e99293d053d6.tar.gz |
MDEV-5450 Assertion `cached_field_ type == MYSQL_TYPE_STRING ||
ltime.time_type == MYSQL_TIMESTAMP_NONE ||
mysql_type_to_time_type(cached_field_type) == ltime.time_type'
fails with IF, ISNULL, ADDDATE
Diffstat (limited to 'sql/item_timefunc.cc')
-rw-r--r-- | sql/item_timefunc.cc | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 6ffa8b2af46..a9d519f9b60 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -1480,12 +1480,42 @@ String *Item_temporal_func::val_str(String *str) } +bool Item_temporal_hybrid_func::fix_temporal_type(MYSQL_TIME *ltime) +{ + if (ltime->time_type < 0) /* MYSQL_TIMESTAMP_NONE, MYSQL_TIMESTAMP_ERROR */ + return false; + switch (field_type()) + { + case MYSQL_TYPE_TIME: + ltime->year= ltime->month= ltime->day= 0; + ltime->time_type= MYSQL_TIMESTAMP_TIME; + return false; + case MYSQL_TYPE_DATETIME: + case MYSQL_TYPE_TIMESTAMP: + ltime->neg= 0; + ltime->time_type= MYSQL_TIMESTAMP_DATETIME; + return false; + case MYSQL_TYPE_DATE: + ltime->neg= 0; + ltime->hour= ltime->minute= ltime->second= ltime->second_part= 0; + ltime->time_type= MYSQL_TIMESTAMP_DATE; + return false; + case MYSQL_TYPE_STRING: /* DATE_ADD, ADDTIME can return VARCHAR */ + return false; + default: + DBUG_ASSERT(0); + return true; + } + return false; +} + + String *Item_temporal_hybrid_func::val_str_ascii(String *str) { DBUG_ASSERT(fixed == 1); MYSQL_TIME ltime; - if (get_date(<ime, 0) || + if (get_date(<ime, 0) || fix_temporal_type(<ime) || (null_value= my_TIME_to_str(<ime, str, decimals))) return (String *) 0; @@ -2599,16 +2629,18 @@ bool Item_func_add_time::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) longlong seconds; int l_sign= sign, was_cut= 0; - if (is_date) // TIMESTAMP function + if (cached_field_type == MYSQL_TYPE_DATETIME) { + // TIMESTAMP function OR the first argument is DATE/DATETIME/TIMESTAMP if (get_arg0_date(&l_time1, 0) || args[1]->get_time(&l_time2) || l_time1.time_type == MYSQL_TIMESTAMP_TIME || l_time2.time_type != MYSQL_TIMESTAMP_TIME) return (null_value= 1); } - else // ADDTIME function + else { + // ADDTIME function AND the first argument is TIME if (args[0]->get_time(&l_time1) || args[1]->get_time(&l_time2) || l_time2.time_type == MYSQL_TIMESTAMP_DATETIME) |