summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mnogosearch.org>2014-01-27 13:15:40 +0400
committerAlexander Barkov <bar@mnogosearch.org>2014-01-27 13:15:40 +0400
commit7ea9d1e692c69c8715d98a9dbc44289d47a65447 (patch)
treebc9a513b2c8ce075e6da55796863ed0a43ea5d78
parent669c6620af9a9996a66ca9b339d4fb05eb6bf944 (diff)
downloadmariadb-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.result24
-rw-r--r--mysql-test/r/type_date.result2
-rw-r--r--mysql-test/r/type_time.result2
-rw-r--r--mysql-test/t/func_time.test11
-rw-r--r--sql/item_func.cc12
-rw-r--r--sql/item_timefunc.cc22
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/time.cc14
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(&copy);
-
- 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(&copy);
+ 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.