Commit 456dd3af authored by unknown's avatar unknown

Merge kboortz@bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/Users/kent/mysql/bk/mysql-4.1
parents 3fb8ba1d 3d6179e7
...@@ -85,3 +85,27 @@ sec_to_time(time_to_sec(t)) ...@@ -85,3 +85,27 @@ sec_to_time(time_to_sec(t))
13:00:00 13:00:00
09:00:00 09:00:00
drop table t1; drop table t1;
SELECT CAST(235959.123456 AS TIME);
CAST(235959.123456 AS TIME)
23:59:59.123456
SELECT CAST(0.235959123456e+6 AS TIME);
CAST(0.235959123456e+6 AS TIME)
23:59:59.123456
SELECT CAST(235959123456e-6 AS TIME);
CAST(235959123456e-6 AS TIME)
23:59:59.123456
SELECT CAST(235959.1234567 AS TIME);
CAST(235959.1234567 AS TIME)
23:59:59.123456
Warnings:
Warning 1292 Truncated incorrect time value: '235959.1234567'
SELECT CAST(0.2359591234567e6 AS TIME);
CAST(0.2359591234567e6 AS TIME)
23:59:59.123456
Warnings:
Warning 1292 Truncated incorrect time value: '235959.1234567'
SELECT CAST(0.2359591234567e+30 AS TIME);
CAST(0.2359591234567e+30 AS TIME)
NULL
Warnings:
Warning 1292 Truncated incorrect time value: '2.359591234567e+29'
...@@ -21,4 +21,18 @@ select t, time_to_sec(t),sec_to_time(time_to_sec(t)) from t1; ...@@ -21,4 +21,18 @@ select t, time_to_sec(t),sec_to_time(time_to_sec(t)) from t1;
select sec_to_time(time_to_sec(t)) from t1; select sec_to_time(time_to_sec(t)) from t1;
drop table t1; drop table t1;
#
# BUG #12440: Incorrect processing of time values containing
# long fraction part and/or large exponent part.
#
# These must return normal result:
SELECT CAST(235959.123456 AS TIME);
SELECT CAST(0.235959123456e+6 AS TIME);
SELECT CAST(235959123456e-6 AS TIME);
# These must cut fraction part and produce warning:
SELECT CAST(235959.1234567 AS TIME);
SELECT CAST(0.2359591234567e6 AS TIME);
# This must return NULL and produce warning:
SELECT CAST(0.2359591234567e+30 AS TIME);
# End of 4.1 tests # End of 4.1 tests
...@@ -514,19 +514,35 @@ bool str_to_time(const char *str, uint length, MYSQL_TIME *l_time, ...@@ -514,19 +514,35 @@ bool str_to_time(const char *str, uint length, MYSQL_TIME *l_time,
/* Get fractional second part */ /* Get fractional second part */
if ((end-str) >= 2 && *str == '.' && my_isdigit(&my_charset_latin1,str[1])) if ((end-str) >= 2 && *str == '.' && my_isdigit(&my_charset_latin1,str[1]))
{ {
uint field_length=5; int field_length= 5;
str++; value=(uint) (uchar) (*str - '0'); str++; value=(uint) (uchar) (*str - '0');
while (++str != end && while (++str != end && my_isdigit(&my_charset_latin1, *str))
my_isdigit(&my_charset_latin1,str[0]) && {
field_length--) if (field_length-- > 0)
value=value*10 + (uint) (uchar) (*str - '0'); value= value*10 + (uint) (uchar) (*str - '0');
if (field_length) }
if (field_length > 0)
value*= (long) log_10_int[field_length]; value*= (long) log_10_int[field_length];
else if (field_length < 0)
*was_cut= 1;
date[4]=value; date[4]=value;
} }
else else
date[4]=0; date[4]=0;
/* Check for exponent part: E<gigit> | E<sign><digit> */
/* (may occur as result of %g formatting of time value) */
if ((end - str) > 1 &&
(*str == 'e' || *str == 'E') &&
(my_isdigit(&my_charset_latin1, str[1]) ||
((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) if (internal_format_positions[7] != 255)
{ {
/* Read a possible AM/PM */ /* Read a possible AM/PM */
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
pkglib_LTLIBRARIES=libz.la pkglib_LTLIBRARIES=libz.la
libz_la_LDFLAGS= -version-info 3:3:2
noinst_HEADERS= crc32.h deflate.h inffast.h inffixed.h inflate.h \ noinst_HEADERS= crc32.h deflate.h inffast.h inffixed.h inflate.h \
inftrees.h trees.h zconf.h zlib.h zutil.h inftrees.h trees.h zconf.h zlib.h zutil.h
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment