diff options
author | Alexander Barkov <bar@mnogosearch.org> | 2014-01-27 13:15:40 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mnogosearch.org> | 2014-01-27 13:15:40 +0400 |
commit | 7ea9d1e692c69c8715d98a9dbc44289d47a65447 (patch) | |
tree | bc9a513b2c8ce075e6da55796863ed0a43ea5d78 | |
parent | 669c6620af9a9996a66ca9b339d4fb05eb6bf944 (diff) | |
download | mariadb-git-7ea9d1e692c69c8715d98a9dbc44289d47a65447.tar.gz |
MDEV-5458 RQG hits 'sql/tztime.cc:799: my_time_t sec_since_epoch(...):
Assertion `mon > 0 && mon < 13' failed.'
-rw-r--r-- | mysql-test/r/func_time.result | 24 | ||||
-rw-r--r-- | mysql-test/r/type_date.result | 2 | ||||
-rw-r--r-- | mysql-test/r/type_time.result | 2 | ||||
-rw-r--r-- | mysql-test/t/func_time.test | 11 | ||||
-rw-r--r-- | sql/item_func.cc | 12 | ||||
-rw-r--r-- | sql/item_timefunc.cc | 22 | ||||
-rw-r--r-- | sql/mysql_priv.h | 1 | ||||
-rw-r--r-- | sql/time.cc | 14 |
8 files changed, 63 insertions, 25 deletions
diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index ddbf42c8060..ac336418823 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -2348,6 +2348,30 @@ SELECT EXTRACT(DAY FROM TIME('1 02:00:00')), EXTRACT(DAY FROM TIME('26:00:00')); EXTRACT(DAY FROM TIME('1 02:00:00')) EXTRACT(DAY FROM TIME('26:00:00')) 1 1 # +# MDEV-5458 RQG hits 'sql/tztime.cc:799: my_time_t sec_since_epoch(int, int, int, int, int, int): Assertion `mon > 0 && mon < 13' failed.' +# +SET TIMESTAMP=UNIX_TIMESTAMP('2014-01-22 18:19:20'); +CREATE TABLE t1 (t TIME); +INSERT INTO t1 VALUES ('03:22:30'),('18:30:05'); +SELECT CONVERT_TZ(GREATEST(t, CURRENT_DATE()), '+02:00', '+10:00') FROM t1; +CONVERT_TZ(GREATEST(t, CURRENT_DATE()), '+02:00', '+10:00') +NULL +NULL +Warnings: +Warning 1292 Truncated incorrect time value: '1296:00:00' +Warning 1292 Incorrect datetime value: '838:59:59' +Warning 1292 Truncated incorrect time value: '1296:00:00' +Warning 1292 Incorrect datetime value: '838:59:59' +SELECT GREATEST(t, CURRENT_DATE()) FROM t1; +GREATEST(t, CURRENT_DATE()) +838:59:59 +838:59:59 +Warnings: +Warning 1292 Truncated incorrect time value: '1296:00:00' +Warning 1292 Truncated incorrect time value: '1296:00:00' +DROP TABLE t1; +SET TIMESTAMP=DEFAULT; +# # MDEV-5504 Server crashes in String::length on SELECT with MONTHNAME, GROUP BY, ROLLUP # CREATE TABLE t1 (i INT); diff --git a/mysql-test/r/type_date.result b/mysql-test/r/type_date.result index e452b3255ae..b7776d67651 100644 --- a/mysql-test/r/type_date.result +++ b/mysql-test/r/type_date.result @@ -305,7 +305,7 @@ SELECT CONVERT_TZ(GREATEST(DATE('2021-00-00'),DATE('2022-00-00')),'+00:00','+7:5 CONVERT_TZ(GREATEST(DATE('2021-00-00'),DATE('2022-00-00')),'+00:00','+7:5') NULL Warnings: -Warning 1292 Incorrect datetime value: '2022-00-00 00:00:00' +Warning 1292 Incorrect datetime value: '2022-00-00' # # MDEV-4804 Date comparing false result # diff --git a/mysql-test/r/type_time.result b/mysql-test/r/type_time.result index 84cd6ca4d9e..26e42d3b3b2 100644 --- a/mysql-test/r/type_time.result +++ b/mysql-test/r/type_time.result @@ -180,7 +180,7 @@ SELECT CONVERT_TZ(GREATEST(TIME('00:00:00'),TIME('00:00:00')),'+00:00','+7:5'); CONVERT_TZ(GREATEST(TIME('00:00:00'),TIME('00:00:00')),'+00:00','+7:5') NULL Warnings: -Warning 1292 Incorrect datetime value: '0000-00-00 00:00:00' +Warning 1292 Incorrect datetime value: '00:00:00' # # MDEV-4652 Wrong result for CONCAT(GREATEST(TIME('00:00:01'),TIME('00:00:00'))) # diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index 2e8716f3297..4205a70ee56 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -1418,6 +1418,17 @@ SELECT EXTRACT(HOUR FROM TIME'1 02:00:00'), EXTRACT(HOUR FROM TIME'26:00:00'); SELECT EXTRACT(HOUR FROM TIME('1 02:00:00')), EXTRACT(HOUR FROM TIME('26:00:00')); SELECT EXTRACT(DAY FROM TIME('1 02:00:00')), EXTRACT(DAY FROM TIME('26:00:00')); +--echo # +--echo # MDEV-5458 RQG hits 'sql/tztime.cc:799: my_time_t sec_since_epoch(int, int, int, int, int, int): Assertion `mon > 0 && mon < 13' failed.' +--echo # +SET TIMESTAMP=UNIX_TIMESTAMP('2014-01-22 18:19:20'); +CREATE TABLE t1 (t TIME); +INSERT INTO t1 VALUES ('03:22:30'),('18:30:05'); +SELECT CONVERT_TZ(GREATEST(t, CURRENT_DATE()), '+02:00', '+10:00') FROM t1; +SELECT GREATEST(t, CURRENT_DATE()) FROM t1; +DROP TABLE t1; +SET TIMESTAMP=DEFAULT; + --echo # --echo # MDEV-5504 Server crashes in String::length on SELECT with MONTHNAME, GROUP BY, ROLLUP diff --git a/sql/item_func.cc b/sql/item_func.cc index 03cd6b5139d..d6a63348dc2 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2635,11 +2635,6 @@ bool Item_func_min_max::get_date(MYSQL_TIME *ltime, uint fuzzy_date) } unpack_time(min_max, ltime); - if (!(fuzzy_date & TIME_TIME_ONLY) && - ((null_value= check_date_with_warn(ltime, fuzzy_date, - MYSQL_TIMESTAMP_ERROR)))) - return true; - if (compare_as_dates->field_type() == MYSQL_TYPE_DATE) { ltime->time_type= MYSQL_TIMESTAMP_DATE; @@ -2650,8 +2645,15 @@ bool Item_func_min_max::get_date(MYSQL_TIME *ltime, uint fuzzy_date) ltime->time_type= MYSQL_TIMESTAMP_TIME; ltime->hour+= (ltime->month * 32 + ltime->day) * 24; ltime->month= ltime->day= 0; + if (adjust_time_range_with_warn(ltime, + min(decimals, TIME_SECOND_PART_DIGITS))) + return (null_value= true); } + if (!(fuzzy_date & TIME_TIME_ONLY) && + ((null_value= check_date_with_warn(ltime, fuzzy_date, + MYSQL_TIMESTAMP_ERROR)))) + return true; return 0; } diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index b5d43786248..ebc61e02a82 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2448,7 +2448,7 @@ bool Item_func_add_time::get_date(MYSQL_TIME *ltime, uint fuzzy_date) bool is_time= 0; long days, microseconds; longlong seconds; - int l_sign= sign, was_cut= 0; + int l_sign= sign; if (is_date) // TIMESTAMP function { @@ -2499,16 +2499,7 @@ bool Item_func_add_time::get_date(MYSQL_TIME *ltime, uint fuzzy_date) } ltime->hour+= days*24; - - MYSQL_TIME copy= *ltime; - Lazy_string_time str(©); - - check_time_range(ltime, decimals, &was_cut); - if (was_cut) - make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, - &str, MYSQL_TIMESTAMP_TIME, NullS); - - return (null_value= 0); + return (null_value= adjust_time_range_with_warn(ltime, decimals)); } @@ -2546,7 +2537,7 @@ bool Item_func_timediff::get_date(MYSQL_TIME *ltime, uint fuzzy_date) DBUG_ASSERT(fixed == 1); longlong seconds; long microseconds; - int l_sign= 1, was_cut= 0; + int l_sign= 1; MYSQL_TIME l_time1,l_time2,l_time3; Lazy_string_time str(&l_time3); @@ -2590,12 +2581,7 @@ bool Item_func_timediff::get_date(MYSQL_TIME *ltime, uint fuzzy_date) goto null_date; *ltime= l_time3; - check_time_range(ltime, decimals, &was_cut); - - if (was_cut) - make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, - &str, MYSQL_TIMESTAMP_TIME, NullS); - return (null_value= 0); + return (null_value= adjust_time_range_with_warn(ltime, decimals)); null_date: return (null_value= 1); diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 191e6663ff1..0bfdac2f531 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -2582,6 +2582,7 @@ check_date(const MYSQL_TIME *ltime, ulonglong flags, int *was_cut) } bool check_date_with_warn(const MYSQL_TIME *ltime, uint fuzzy_date, timestamp_type ts_type); +bool adjust_time_range_with_warn(MYSQL_TIME *ltime, uint dec); int test_if_number(char *str,int *res,bool allow_wildcards); void change_byte(uchar *,uint,char,char); bool init_read_record(READ_RECORD *info, THD *thd, TABLE *reg_form, diff --git a/sql/time.cc b/sql/time.cc index dc724e21a16..4dce2f4135a 100644 --- a/sql/time.cc +++ b/sql/time.cc @@ -229,6 +229,20 @@ check_date_with_warn(const MYSQL_TIME *ltime, uint fuzzy_date, } +bool +adjust_time_range_with_warn(MYSQL_TIME *ltime, uint dec) +{ + MYSQL_TIME copy= *ltime; + Lazy_string_time str(©); + int warnings= 0; + if (check_time_range(ltime, dec, &warnings)) + return true; + if (warnings) + make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + &str, MYSQL_TIMESTAMP_TIME, NullS); + return false; +} + /* Convert a timestamp string to a MYSQL_TIME value and produce a warning if string was truncated during conversion. |