summaryrefslogtreecommitdiff
path: root/sql/time.cc
diff options
context:
space:
mode:
authorunknown <gluh@gluh.mysql.r18.ru>2004-03-15 18:28:21 +0400
committerunknown <gluh@gluh.mysql.r18.ru>2004-03-15 18:28:21 +0400
commitafedd9f8f777cd3ccbe6901f70b467bb71147afa (patch)
treec617b4731b141e48f4e7d0e9c03dffad70b9d936 /sql/time.cc
parent1b81fcf8ca993a4aac88492f1332868b0fea9233 (diff)
downloadmariadb-git-afedd9f8f777cd3ccbe6901f70b467bb71147afa.tar.gz
Task #835: additional changes fot str_to_date
include/mysqld_error.h: Task #835: additional changes fot str_to_date New error message mysql-test/r/date_formats.result: Task #835: additional changes fot str_to_date tests mysql-test/r/func_sapdb.result: Task #835: additional changes fot str_to_date tests mysql-test/r/func_time.result: Task #835: additional changes fot str_to_date tests mysql-test/r/type_time.result: Task #835: additional changes fot str_to_date tests mysql-test/t/date_formats.test: Task #835: additional changes fot str_to_date tests mysql-test/t/func_sapdb.test: Task #835: additional changes fot str_to_date tests mysql-test/t/func_time.test: Task #835: additional changes fot str_to_date tests sql/share/czech/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/danish/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/dutch/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/english/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/estonian/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/french/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/german/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/greek/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/hungarian/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/italian/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/japanese/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/korean/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/norwegian-ny/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/norwegian/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/polish/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/portuguese/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/romanian/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/russian/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/serbian/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/slovak/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/spanish/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/swedish/errmsg.txt: Task #835: additional changes fot str_to_date New error message sql/share/ukrainian/errmsg.txt: Task #835: additional changes fot str_to_date New error message
Diffstat (limited to 'sql/time.cc')
-rw-r--r--sql/time.cc80
1 files changed, 64 insertions, 16 deletions
diff --git a/sql/time.cc b/sql/time.cc
index 1dff0c62edf..376ad6926b8 100644
--- a/sql/time.cc
+++ b/sql/time.cc
@@ -391,9 +391,11 @@ str_to_TIME(const char *str, uint length, TIME *l_time, uint flags)
ulong not_zero_date, allow_space;
bool is_internal_format;
const char *pos, *last_field_pos;
+ const char *str_begin= str;
const char *end=str+length;
const uchar *format_position;
bool found_delimitier= 0, found_space= 0;
+ uint frac_pos, frac_len;
DBUG_ENTER("str_to_TIME");
DBUG_PRINT("ENTER",("str: %.*s",length,str));
@@ -482,7 +484,7 @@ str_to_TIME(const char *str, uint length, TIME *l_time, uint flags)
tmp_value=tmp_value*10 + (ulong) (uchar) (*str - '0');
str++;
}
- date_len[i]+= (uint) (str - start);
+ date_len[i]= (uint) (str - start);
if (tmp_value > 999999) // Impossible date part
DBUG_RETURN(TIMESTAMP_NONE);
date[i]=tmp_value;
@@ -535,9 +537,9 @@ str_to_TIME(const char *str, uint length, TIME *l_time, uint flags)
{
if (str+2 <= end && (str[1] == 'M' || str[1] == 'm'))
{
- if (str[1] == 'p' || str[1] == 'P')
+ if (str[0] == 'p' || str[0] == 'P')
add_hours= 12;
- else if (str[1] != 'a' || str[1] != 'A')
+ else if (str[0] != 'a' || str[0] != 'A')
continue; // Not AM/PM
str+= 2; // Skip AM/PM
/* Skip space after AM/PM */
@@ -569,7 +571,13 @@ str_to_TIME(const char *str, uint length, TIME *l_time, uint flags)
l_time->hour= date[(uint) format_position[3]];
l_time->minute= date[(uint) format_position[4]];
l_time->second= date[(uint) format_position[5]];
- l_time->second_part= date[(uint) format_position[6]];
+
+ frac_pos= (uint) format_position[6];
+ frac_len= date_len[frac_pos];
+ if (frac_len < 6)
+ date[frac_pos]*= (uint) log_10_int[6 - frac_len];
+ l_time->second_part= date[frac_pos];
+
if (format_position[7] != (uchar) 255)
{
if (l_time->hour > 12)
@@ -585,6 +593,8 @@ str_to_TIME(const char *str, uint length, TIME *l_time, uint flags)
l_time->hour= date[3];
l_time->minute= date[4];
l_time->second= date[5];
+ if (date_len[6] < 6)
+ date[6]*= (uint) log_10_int[6 - date_len[6]];
l_time->second_part=date[6];
}
l_time->neg= 0;
@@ -614,15 +624,17 @@ str_to_TIME(const char *str, uint length, TIME *l_time, uint flags)
current_thd->cuted_fields++;
goto err;
}
- if (str != end && current_thd->count_cuted_fields)
+
+ l_time->time_type= (number_of_fields <= 3 ?
+ TIMESTAMP_DATE : TIMESTAMP_DATETIME);
+
+ for (; str != end ; str++)
{
- for (; str != end ; str++)
+ if (!my_isspace(&my_charset_latin1,*str))
{
- if (!my_isspace(&my_charset_latin1,*str))
- {
- current_thd->cuted_fields++;
- break;
- }
+ make_truncated_value_warning(current_thd, str_begin, length,
+ l_time->time_type);
+ break;
}
}
@@ -686,6 +698,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time)
{
long date[5],value;
const char *end=str+length, *end_of_days;
+ const char *str_begin= str;
bool found_days,found_hours;
uint state;
@@ -706,7 +719,7 @@ bool str_to_time(const char *str,uint length,TIME *l_time)
{ // Probably full timestamp
enum timestamp_type res= str_to_TIME(str,length,l_time,
(TIME_FUZZY_DATE |
- TIME_DATETIME_ONLY));
+ TIME_DATETIME_ONLY));
if ((int) res >= (int) TIMESTAMP_DATETIME_ERROR)
return res == TIMESTAMP_DATETIME_ERROR;
}
@@ -784,6 +797,8 @@ fractional:
my_isdigit(&my_charset_latin1,str[0]) &&
field_length--)
value=value*10 + (uint) (uchar) (*str - '0');
+ if (field_length)
+ value*= (long) log_10_int[field_length];
date[4]=value;
}
else
@@ -796,12 +811,12 @@ fractional:
str++;
if (str+2 <= end && (str[1] == 'M' || str[1] == 'm'))
{
- if (str[1] == 'p' || str[1] == 'P')
+ if (str[0] == 'p' || str[0] == 'P')
{
str+= 2;
date[1]= date[1]%12 + 12;
}
- else if (str[1] == 'a' || str[1] == 'A')
+ else if (str[0] == 'a' || str[0] == 'A')
str+=2;
}
}
@@ -822,13 +837,14 @@ fractional:
l_time->time_type= TIMESTAMP_TIME;
/* Check if there is garbage at end of the TIME specification */
- if (str != end && current_thd->count_cuted_fields)
+ if (str != end)
{
do
{
if (!my_isspace(&my_charset_latin1,*str))
{
- current_thd->cuted_fields++;
+ make_truncated_value_warning(current_thd, str_begin, length,
+ TIMESTAMP_TIME);
break;
}
} while (++str != end);
@@ -1265,3 +1281,35 @@ void make_datetime(DATE_TIME_FORMAT *format, TIME *l_time, String *str)
str->length(length);
str->set_charset(&my_charset_bin);
}
+
+void make_truncated_value_warning(THD *thd, const char *str_val,
+ uint str_length, timestamp_type time_type)
+{
+ char warn_buff[MYSQL_ERRMSG_SIZE];
+ const char *type_str;
+
+ char buff[128];
+ String str(buff,(uint32) sizeof(buff), system_charset_info);
+ str.length(0);
+ str.append(str_val, str_length);
+ str.append('\0');
+
+ switch (time_type) {
+ case TIMESTAMP_DATE:
+ type_str= "date";
+ break;
+ case TIMESTAMP_DATETIME:
+ type_str= "datetime";
+ break;
+ case TIMESTAMP_TIME:
+ type_str= "time";
+ break;
+ default:
+ type_str= "string";
+ break;
+ }
+ sprintf(warn_buff, ER(ER_TRUNCATED_WRONG_VALUE),
+ type_str, str.ptr());
+ push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
+ ER_TRUNCATED_WRONG_VALUE, warn_buff);
+}