mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge
BitKeeper/etc/ignore: auto-union include/m_ctype.h: Auto merged mysql-test/mysql-test-run.sh: Auto merged mysql-test/r/func_compress.result: Auto merged mysql-test/t/date_formats.test: Auto merged sql/field.cc: Auto merged sql/field.h: Auto merged sql/item.cc: Auto merged sql/item.h: Auto merged sql/item_create.cc: Auto merged sql/item_func.cc: Auto merged sql/item_func.h: Auto merged sql/item_strfunc.h: Auto merged sql/mysql_priv.h: Auto merged sql/set_var.cc: Auto merged sql/set_var.h: Auto merged sql/sql_base.cc: Auto merged sql/sql_class.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_lex.cc: Auto merged sql/sql_parse.cc: Auto merged sql/sql_prepare.cc: Auto merged sql/sql_table.cc: Auto merged sql/sql_yacc.yy: Auto merged strings/ctype-bin.c: Auto merged include/mysqld_error.h: Merge error messages mysql-test/r/date_formats.result: merge sql/derror.cc: Fixed wront return value sql/item_timefunc.cc: merge sql/item_timefunc.h: merge sql/mysqld.cc: merge sql/share/czech/errmsg.txt: Merge error messages sql/share/danish/errmsg.txt: Merge error messages sql/share/dutch/errmsg.txt: Merge error messages sql/share/english/errmsg.txt: Merge error messages sql/share/estonian/errmsg.txt: Merge error messages sql/share/french/errmsg.txt: Merge error messages sql/share/german/errmsg.txt: Merge error messages sql/share/greek/errmsg.txt: Merge error messages sql/share/hungarian/errmsg.txt: Merge error messages sql/share/italian/errmsg.txt: Merge error messages sql/share/japanese/errmsg.txt: Merge error messages sql/share/korean/errmsg.txt: Merge error messages sql/share/norwegian-ny/errmsg.txt: Merge error messages sql/share/norwegian/errmsg.txt: Merge error messages sql/share/polish/errmsg.txt: Merge error messages sql/share/portuguese/errmsg.txt: Merge error messages sql/share/romanian/errmsg.txt: Merge error messages sql/share/russian/errmsg.txt: Merge error messages sql/share/serbian/errmsg.txt: Merge error messages sql/share/slovak/errmsg.txt: Merge error messages sql/share/spanish/errmsg.txt: Merge error messages sql/share/swedish/errmsg.txt: Merge error messages sql/share/ukrainian/errmsg.txt: Merge error messages
This commit is contained in:
161
sql/field.cc
161
sql/field.cc
@ -274,13 +274,14 @@ uint Field::fill_cache_field(CACHE_FIELD *copy)
|
||||
return copy->length+(int) copy->strip;
|
||||
}
|
||||
|
||||
bool Field::get_date(TIME *ltime,bool fuzzydate)
|
||||
|
||||
bool Field::get_date(TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
char buff[40];
|
||||
String tmp(buff,sizeof(buff),&my_charset_bin),tmp2,*res;
|
||||
if (!(res=val_str(&tmp,&tmp2)) ||
|
||||
str_to_TIME(res->ptr(),res->length(),ltime,fuzzydate,current_thd)<=
|
||||
WRONG_TIMESTAMP_FULL)
|
||||
str_to_TIME(res->ptr(),res->length(),ltime,fuzzydate) <=
|
||||
TIMESTAMP_DATETIME_ERROR)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@ -290,39 +291,44 @@ bool Field::get_time(TIME *ltime)
|
||||
char buff[40];
|
||||
String tmp(buff,sizeof(buff),&my_charset_bin),tmp2,*res;
|
||||
if (!(res=val_str(&tmp,&tmp2)) ||
|
||||
str_to_time(res->ptr(),res->length(),ltime,current_thd))
|
||||
str_to_time(res->ptr(),res->length(),ltime))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
This is called when storing a date in a string
|
||||
|
||||
NOTES
|
||||
Needs to be changed if/when we want to support different time formats
|
||||
*/
|
||||
|
||||
/* This is called when storing a date in a string */
|
||||
void Field::store_time(TIME *ltime,timestamp_type type)
|
||||
{
|
||||
char buff[25];
|
||||
String tmp((char*) buff,sizeof(buff),&my_charset_bin);
|
||||
DATETIME_FORMAT *tmp_format= 0;
|
||||
bool is_time_only= 0;
|
||||
|
||||
switch (type) {
|
||||
case TIMESTAMP_NONE:
|
||||
case WRONG_TIMESTAMP_FULL:
|
||||
case TIMESTAMP_DATETIME_ERROR:
|
||||
store("",0,&my_charset_bin); // Probably an error
|
||||
return;
|
||||
case TIMESTAMP_DATE:
|
||||
tmp_format= &t_datetime_frm(current_thd, DATE_FORMAT_TYPE).datetime_format;
|
||||
break;
|
||||
case TIMESTAMP_FULL:
|
||||
tmp_format=&t_datetime_frm(current_thd,DATETIME_FORMAT_TYPE).datetime_format;
|
||||
case TIMESTAMP_DATE:
|
||||
sprintf(buff,"%04d-%02d-%02d", ltime->year,ltime->month,ltime->day);
|
||||
store(buff,10,&my_charset_bin);
|
||||
break;
|
||||
case TIMESTAMP_DATETIME:
|
||||
sprintf(buff,"%04d-%02d-%02d %02d:%02d:%02d",
|
||||
ltime->year,ltime->month,ltime->day,
|
||||
ltime->hour,ltime->minute,ltime->second);
|
||||
store(buff,19,&my_charset_bin);
|
||||
break;
|
||||
case TIMESTAMP_TIME:
|
||||
tmp_format= &t_datetime_frm(current_thd, TIME_FORMAT_TYPE).datetime_format;
|
||||
is_time_only= 1;
|
||||
{
|
||||
ulong length= my_sprintf(buff, (buff, "%02d:%02d:%02d",
|
||||
ltime->hour,ltime->minute,ltime->second));
|
||||
store(buff,(uint) length, &my_charset_bin);
|
||||
break;
|
||||
}
|
||||
make_datetime(&tmp, ltime, is_time_only, 0,
|
||||
tmp_format->format, tmp_format->format_length, 1);
|
||||
store(tmp.ptr(),tmp.length(),&my_charset_bin);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2693,7 +2699,7 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg,
|
||||
|
||||
int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
{
|
||||
long tmp=(long) str_to_timestamp(from,len,current_thd);
|
||||
long tmp=(long) str_to_timestamp(from,len);
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
if (table->db_low_byte_first)
|
||||
{
|
||||
@ -2908,7 +2914,7 @@ String *Field_timestamp::val_str(String *val_buffer,
|
||||
}
|
||||
|
||||
|
||||
bool Field_timestamp::get_date(TIME *ltime, bool fuzzydate)
|
||||
bool Field_timestamp::get_date(TIME *ltime, uint fuzzydate)
|
||||
{
|
||||
long temp;
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
@ -2937,7 +2943,7 @@ bool Field_timestamp::get_date(TIME *ltime, bool fuzzydate)
|
||||
ltime->second= start->tm_sec;
|
||||
ltime->second_part= 0;
|
||||
ltime->neg= 0;
|
||||
ltime->time_type=TIMESTAMP_FULL;
|
||||
ltime->time_type=TIMESTAMP_DATETIME;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -2951,7 +2957,7 @@ bool Field_timestamp::get_time(TIME *ltime)
|
||||
bool Field_timestamp::send_binary(Protocol *protocol)
|
||||
{
|
||||
TIME tm;
|
||||
Field_timestamp::get_date(&tm, 1);
|
||||
Field_timestamp::get_date(&tm, TIME_FUZZY_DATE);
|
||||
return protocol->store(&tm);
|
||||
}
|
||||
|
||||
@ -3027,7 +3033,7 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
TIME ltime;
|
||||
long tmp;
|
||||
int error= 0;
|
||||
if (str_to_time(from,len,<ime,current_thd))
|
||||
if (str_to_time(from,len,<ime))
|
||||
{
|
||||
tmp=0L;
|
||||
error= 1;
|
||||
@ -3137,27 +3143,23 @@ String *Field_time::val_str(String *val_buffer,
|
||||
String *val_ptr __attribute__((unused)))
|
||||
{
|
||||
TIME ltime;
|
||||
val_buffer->alloc(16);
|
||||
val_buffer->alloc(19);
|
||||
long tmp=(long) sint3korr(ptr);
|
||||
const char *sign="";
|
||||
ltime.neg= 0;
|
||||
if (tmp < 0)
|
||||
{
|
||||
tmp= -tmp;
|
||||
ltime.neg= 1;
|
||||
}
|
||||
DATETIME_FORMAT *tmp_format= (&t_datetime_frm
|
||||
(current_thd, TIME_FORMAT_TYPE).datetime_format);
|
||||
ltime.day= (uint) 0;
|
||||
ltime.hour= (uint) (tmp/10000);
|
||||
ltime.minute= (uint) (tmp/100 % 100);
|
||||
ltime.second= (uint) (tmp % 100);
|
||||
make_datetime(val_buffer, <ime, 0, 0,
|
||||
tmp_format->format,
|
||||
tmp_format->format_length, 1);
|
||||
make_time((DATE_TIME_FORMAT*) 0, <ime, val_buffer);
|
||||
return val_buffer;
|
||||
}
|
||||
|
||||
|
||||
bool Field_time::get_time(TIME *ltime)
|
||||
{
|
||||
long tmp=(long) sint3korr(ptr);
|
||||
@ -3320,7 +3322,7 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
|
||||
TIME l_time;
|
||||
uint32 tmp;
|
||||
int error= 0;
|
||||
if (str_to_TIME(from,len,&l_time,1,current_thd) <= WRONG_TIMESTAMP_FULL)
|
||||
if (str_to_TIME(from,len,&l_time,1) <= TIMESTAMP_DATETIME_ERROR)
|
||||
{
|
||||
tmp=0;
|
||||
error= 1;
|
||||
@ -3432,7 +3434,6 @@ String *Field_date::val_str(String *val_buffer,
|
||||
{
|
||||
TIME ltime;
|
||||
val_buffer->alloc(field_length);
|
||||
val_buffer->length(field_length);
|
||||
int32 tmp;
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
if (table->db_low_byte_first)
|
||||
@ -3440,18 +3441,15 @@ String *Field_date::val_str(String *val_buffer,
|
||||
else
|
||||
#endif
|
||||
longget(tmp,ptr);
|
||||
DATETIME_FORMAT *tmp_format= (&t_datetime_frm
|
||||
(current_thd, DATE_FORMAT_TYPE).datetime_format);
|
||||
ltime.neg= 0;
|
||||
ltime.year= (int) ((uint32) tmp/10000L % 10000);
|
||||
ltime.month= (int) ((uint32) tmp/100 % 100);
|
||||
ltime.day= (int) ((uint32) tmp % 100);
|
||||
make_datetime(val_buffer, <ime, 0, 0,
|
||||
tmp_format->format,
|
||||
tmp_format->format_length, 1);
|
||||
make_date((DATE_TIME_FORMAT *) 0, <ime, val_buffer);
|
||||
return val_buffer;
|
||||
}
|
||||
|
||||
|
||||
int Field_date::cmp(const char *a_ptr, const char *b_ptr)
|
||||
{
|
||||
int32 a,b;
|
||||
@ -3507,7 +3505,7 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
TIME l_time;
|
||||
long tmp;
|
||||
int error= 0;
|
||||
if (str_to_TIME(from,len,&l_time,1,current_thd) <= WRONG_TIMESTAMP_FULL)
|
||||
if (str_to_TIME(from,len,&l_time,1) <= TIMESTAMP_DATETIME_ERROR)
|
||||
{
|
||||
tmp=0L;
|
||||
error= 1;
|
||||
@ -3572,7 +3570,7 @@ int Field_newdate::store(longlong nr)
|
||||
void Field_newdate::store_time(TIME *ltime,timestamp_type type)
|
||||
{
|
||||
long tmp;
|
||||
if (type == TIMESTAMP_DATE || type == TIMESTAMP_FULL)
|
||||
if (type == TIMESTAMP_DATE || type == TIMESTAMP_DATETIME)
|
||||
tmp=ltime->year*16*32+ltime->month*32+ltime->day;
|
||||
else
|
||||
{
|
||||
@ -3628,7 +3626,7 @@ String *Field_newdate::val_str(String *val_buffer,
|
||||
return val_buffer;
|
||||
}
|
||||
|
||||
bool Field_newdate::get_date(TIME *ltime,bool fuzzydate)
|
||||
bool Field_newdate::get_date(TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
if (is_null())
|
||||
return 1;
|
||||
@ -3676,7 +3674,7 @@ void Field_newdate::sql_type(String &res) const
|
||||
|
||||
int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
{
|
||||
longlong tmp=str_to_datetime(from,len,1,current_thd);
|
||||
longlong tmp=str_to_datetime(from,len,1);
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
if (table->db_low_byte_first)
|
||||
{
|
||||
@ -3730,7 +3728,7 @@ int Field_datetime::store(longlong nr)
|
||||
void Field_datetime::store_time(TIME *ltime,timestamp_type type)
|
||||
{
|
||||
longlong tmp;
|
||||
if (type == TIMESTAMP_DATE || type == TIMESTAMP_FULL)
|
||||
if (type == TIMESTAMP_DATE || type == TIMESTAMP_DATETIME)
|
||||
tmp=((ltime->year*10000L+ltime->month*100+ltime->day)*LL(1000000)+
|
||||
(ltime->hour*10000L+ltime->minute*100+ltime->second));
|
||||
else
|
||||
@ -3751,7 +3749,7 @@ void Field_datetime::store_time(TIME *ltime,timestamp_type type)
|
||||
bool Field_datetime::send_binary(Protocol *protocol)
|
||||
{
|
||||
TIME tm;
|
||||
Field_datetime::get_date(&tm, 1);
|
||||
Field_datetime::get_date(&tm, TIME_FUZZY_DATE);
|
||||
return protocol->store(&tm);
|
||||
}
|
||||
|
||||
@ -3822,14 +3820,14 @@ String *Field_datetime::val_str(String *val_buffer,
|
||||
return val_buffer;
|
||||
}
|
||||
|
||||
bool Field_datetime::get_date(TIME *ltime,bool fuzzydate)
|
||||
bool Field_datetime::get_date(TIME *ltime, uint fuzzydate)
|
||||
{
|
||||
longlong tmp=Field_datetime::val_int();
|
||||
uint32 part1,part2;
|
||||
part1=(uint32) (tmp/LL(1000000));
|
||||
part2=(uint32) (tmp - (ulonglong) part1*LL(1000000));
|
||||
|
||||
ltime->time_type= TIMESTAMP_FULL;
|
||||
ltime->time_type= TIMESTAMP_DATETIME;
|
||||
ltime->neg= 0;
|
||||
ltime->second_part= 0;
|
||||
ltime->second= (int) (part2%100);
|
||||
@ -4921,26 +4919,6 @@ void Field_enum::store_type(ulonglong value)
|
||||
}
|
||||
|
||||
|
||||
uint find_enum(TYPELIB *lib,const char *x, uint length)
|
||||
{
|
||||
const char *end=x+length;
|
||||
while (end > x && my_isspace(system_charset_info,end[-1]))
|
||||
end--;
|
||||
|
||||
const char *i;
|
||||
const char *j;
|
||||
for (uint pos=0 ; (j=lib->type_names[pos]) ; pos++)
|
||||
{
|
||||
for (i=x ; i != end &&
|
||||
my_toupper(system_charset_info,*i) ==
|
||||
my_toupper(system_charset_info,*j) ; i++, j++) ;
|
||||
if (i == end && ! *j)
|
||||
return(pos+1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Note. Storing a empty string in a enum field gives a warning
|
||||
** (if there isn't a empty value in the enum)
|
||||
@ -4958,7 +4936,11 @@ int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
|
||||
from= tmpstr.ptr();
|
||||
length= tmpstr.length();
|
||||
}
|
||||
uint tmp=find_enum(typelib,from,length);
|
||||
|
||||
/* Remove end space */
|
||||
while (length > 0 && my_isspace(system_charset_info,from[length-1]))
|
||||
length--;
|
||||
uint tmp=find_type(typelib, from, length, 0);
|
||||
if (!tmp)
|
||||
{
|
||||
if (length < 6) // Can't be more than 99999 enums
|
||||
@ -5111,49 +5093,8 @@ void Field_enum::sql_type(String &res) const
|
||||
For example "One,two,five"
|
||||
If one uses this string in a number context one gets the bits as a longlong
|
||||
number.
|
||||
|
||||
If there was a value in string that wasn't in set, the 'err_pos' points to
|
||||
the last invalid value found. 'err_len' will be set to length of the
|
||||
error string.
|
||||
*/
|
||||
|
||||
ulonglong find_set(TYPELIB *lib, const char *x, uint length, char **err_pos,
|
||||
uint *err_len, bool *set_warning)
|
||||
{
|
||||
const char *end= x + length;
|
||||
*err_pos= 0; // No error yet
|
||||
while (end > x && my_isspace(system_charset_info, end[-1]))
|
||||
end--;
|
||||
|
||||
*err_len= 0;
|
||||
ulonglong found= 0;
|
||||
if (x != end)
|
||||
{
|
||||
const char *start= x;
|
||||
for (;;)
|
||||
{
|
||||
const char *pos= start;
|
||||
uint var_len;
|
||||
|
||||
for (; pos != end && *pos != field_separator; pos++) ;
|
||||
var_len= (uint) (pos - start);
|
||||
uint find= find_enum(lib, start, var_len);
|
||||
if (!find)
|
||||
{
|
||||
*err_pos= (char*) start;
|
||||
*err_len= var_len;
|
||||
*set_warning= 1;
|
||||
}
|
||||
else
|
||||
found|= ((longlong) 1 << (find - 1));
|
||||
if (pos == end)
|
||||
break;
|
||||
start= pos + 1;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
|
||||
{
|
||||
@ -5512,7 +5453,7 @@ create_field::create_field(Field *old_field,Field *orig_field)
|
||||
case 3: sql_type= FIELD_TYPE_MEDIUM_BLOB; break;
|
||||
default: sql_type= FIELD_TYPE_LONG_BLOB; break;
|
||||
}
|
||||
length /= charset->mbmaxlen;
|
||||
length /= charset->mbmaxlen; // QQ: Probably not needed
|
||||
break;
|
||||
case FIELD_TYPE_STRING:
|
||||
case FIELD_TYPE_VAR_STRING:
|
||||
|
Reference in New Issue
Block a user