Bug #20927 sec_to_time treats big unsigned as signed
| Submitted: | 9 Jul 2006 12:24 | Modified: | 13 Nov 2006 19:14 |
|---|---|---|---|
| Reporter: | Martin Friebe (Gold Quality Contributor) (OCA) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Data Types | Severity: | S3 (Non-critical) |
| Version: | 4.1.20 and 5.0.22 | OS: | Linux (Linux, freebsd) |
| Assigned to: | Alexey Kopytov | CPU Architecture: | Any |
[9 Jul 2006 12:24]
Martin Friebe
[11 Jul 2006 20:09]
Valeriy Kravchuk
Thank you for a bug report. Verified just as described with 5.0.25-BK on Linux: mysql> select version(); +-----------+ | version() | +-----------+ | 5.0.25 | +-----------+ 1 row in set (0.00 sec) mysql> select sec_to_time(cast(0xffffffffffffffff as unsigned)); +---------------------------------------------------+ | sec_to_time(cast(0xffffffffffffffff as unsigned)) | +---------------------------------------------------+ | -00:00:01 | +---------------------------------------------------+ 1 row in set (0.03 sec) mysql> select sec_to_time(1844674407370955161500); +-------------------------------------+ | sec_to_time(1844674407370955161500) | +-------------------------------------+ | 512409557:36:10 | +-------------------------------------+ 1 row in set, 1 warning (0.02 sec) mysql> show warnings\G *************************** 1. row *************************** Level: Error Code: 1292 Message: Truncated incorrect DECIMAL value: '' 1 row in set (0.01 sec) mysql> select sec_to_time(184467440737095516150000); +---------------------------------------+ | sec_to_time(184467440737095516150000) | +---------------------------------------+ | -298651792:18:15 | +---------------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> show warnings\G *************************** 1. row *************************** Level: Error Code: 1292 Message: Truncated incorrect DECIMAL value: '' 1 row in set (0.01 sec)
[3 Oct 2006 9:51]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/12992 ChangeSet@1.2541, 2006-10-03 13:51:21+04:00, kaa@polly.local +8 -0 Fixes a number of problems with time/datetime <-> string conversion functions: - bug #11655 "Wrong time is returning from nested selects - maximum time exists - input and output TIME values were not validated properly in several conversion functions - bug #20927 "sec_to_time treats big unsigned as signed" - integer overflows were not checked in several functions. As a result, input values like 2^32 or 3600*2^32 were treated as 0 - BIGINT UNSIGNED values were treated as SIGNED in several functions - in cases where both input string truncation and out-of-range TIME value occur, only 'truncated incorrect time value' warning was produced
[3 Oct 2006 17:02]
Timothy Smith
Kaamos,
A few minor comments.
I would like to use something like:
#define TIME_MAX_HOUR 838
#define TIME_MAX_MINUTE 59
#define TIME_MAX_SECOND 59
Minor formatting issue (wrong indent):
@@ -2630,7 +2738,7 @@ String *Item_func_timediff::val_str(Stri
calc_time_from_sec(&l_time3, (long) seconds, microseconds);
- if (!make_datetime(l_time1.second_part || l_time2.second_part ?
+ if (!make_datetime_with_warn(l_time1.second_part || l_time2.second_part ?
TIME_MICROSECOND : TIME_ONLY,
&l_time3, str))
And another missing indent:
if ((null_value=(args[0]->null_value ||
args[1]->null_value ||
- args[2]->null_value ||
- minute > 59 || minute < 0 ||
- second > 59 || second < 0 ||
+ args[2]->null_value ||
+ minute < 0 || minute > 59 ||
+ second < 0 || second > 59 ||
Why is this no longer a warning? Is the %g conversion still done?
@@ -538,10 +543,7 @@ fractional:
((str[1] == '-' || str[1] == '+') &&
(end - str) > 2 &&
my_isdigit(&my_charset_latin1, str[2]))))
- {
- *was_cut= 1;
return 1;
- }
if (internal_format_positions[7] != 255)
{
Otherwise, it looks great! Thanks,
Tim
[4 Oct 2006 13:13]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/13069 ChangeSet@1.2541, 2006-10-04 17:13:32+04:00, kaa@polly.local +8 -0 Fixes a number of problems with time/datetime <-> string conversion functions: - bug #11655 "Wrong time is returning from nested selects - maximum time exists - input and output TIME values were not validated properly in several conversion functions - bug #20927 "sec_to_time treats big unsigned as signed" - integer overflows were not checked in several functions. As a result, input values like 2^32 or 3600*2^32 were treated as 0 - BIGINT UNSIGNED values were treated as SIGNED in several functions - in cases where both input string truncation and out-of-range TIME value occur, only 'truncated incorrect time value' warning was produced
[4 Oct 2006 23:28]
Timothy Smith
Looks good to me, Alexey. Thank you for the explanation.
[12 Oct 2006 7:21]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/13554 ChangeSet@1.2236, 2006-10-12 11:21:12+04:00, kaa@polly.local +2 -0 5.0-specific fixes when merging the fix for bug #11655 and bug #20927 from 4.1
[13 Nov 2006 19:14]
Paul DuBois
Noted in 4.1.23, 5.0.30 (not 5.0.29), 5.1.13 changelogs. Lack of validation for input and output TIME values resulted in several problems: SEC_TO_TIME() within subqueries incorrectly clipped large values; SEC_TO_TIME() treated BIGINT UNSIGNED values as signed; only truncation warnings were produced when both truncation and out-of-range TIME values occurred.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.070 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.