summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorunknown <monty@narttu.mysql.fi>2003-11-03 14:01:59 +0200
committerunknown <monty@narttu.mysql.fi>2003-11-03 14:01:59 +0200
commitbee5d9d4627a3b6d09430015357487c1c6c94bca (patch)
treef9406690fb9f579e21f4877826d439fb785d6902 /sql/field.cc
parentdd85b7602660a400f71d16d00bb8c869d4320c7a (diff)
downloadmariadb-git-bee5d9d4627a3b6d09430015357487c1c6c94bca.tar.gz
Simplified 'wrong xxx name' error messages by introducing 'general' ER_WRONG_NAME error
Cleaned up (and disabled part of) date/time/datetime format patch. One can't anymore change default read/write date/time/formats. This is becasue the non standard datetime formats can't be compared as strings and MySQL does still a lot of datetime comparisons as strings Changed flag argument to str_to_TIME() and get_date() from bool to uint Removed THD from str_to_xxxx functions and Item class. Fixed core dump when doing --print-defaults Move some common string functions to strfunc.cc Dates as strings are now of type my_charset_bin instead of default_charset() Introduce IDENT_QUOTED to not have to create an extra copy of simple identifiers (all chars < 128) Removed xxx_FORMAT_TYPE enums and replaced them with the old TIMESTAMP_xxx enums Renamed some TIMESTAMP_xxx enums to more appropriate names Use defines instead of integers for date/time/datetime string lengths Added to build system and use the new my_strtoll10() function. BUILD/compile-pentium-valgrind-max: Remove double printing of warning VC++Files/libmysqld/libmysqld.dsp: Added strfunc.cc VC++Files/sql/mysqld.dsp: Added strfunc.cc VC++Files/sql/mysqldmax.dsp: Added strfunc.cc VC++Files/strings/strings.dsp: added my_strtoll10.c include/m_ctype.h: Removed MY_LEX_FOUND_IDENT (not used) include/m_string.h: Added my_strtoll10() include/mysqld_error.h: simplified 'wrong xxx name' error messages include/sql_state.h: simplified 'wrong xxx name' error messages libmysqld/Makefile.am: Added strfunc.cc mysql-test/mysql-test-run.sh: Simplified some options changed $@ to "$@" in an attempt to handle options with space (Didn't succeed; Problem will disappear when mysql-test-run is rewritten in C) mysql-test/r/ctype_latin1_de.result: Added new tests mysql-test/r/ctype_recoding.result: Extended tests mysql-test/r/date_formats.result: Cleaned up tests Disabled some tests that can't yet be run mysql-test/r/func_compress.result: New error message mysql-test/r/rpl_temporary.result: Added new test mysql-test/t/create.test: Changed error numbers mysql-test/t/ctype_latin1_de.test: New tests mysql-test/t/ctype_recoding.test: Extended tests mysql-test/t/date_formats-master.opt: Removed datetime_format as we can't handle options with space in mysql-test-run mysql-test/t/date_formats.test: Cleaned up tests Disabled some tests that can't yet be run mysql-test/t/rpl_temporary.test: Added testing of open temporary table on slave shutdown mysql-test/t/symlink.test: Fixed error numbers mysys/default.c: Fixed core dump when doing --print-defaults sql/Makefile.am: Added strfunc.cc sql/derror.cc: Fixed compiler warning sql/field.cc: Changed argument to str_to_TIME() from bool to uint Removed THD argument from str_to_TIME() Moved find_enum() and find_set() to strfunc.cc sql/field.h: Changed type of last argument to get_date() to be able to handle more options sql/init.cc: Remove not used variable dayord sql/item.cc: Changed type of last argument to get_date() to be able to handle more options Removed THD* element from item. Don't use make_date_time() to generate date/time/datetimes sql/item.h: Changed type of last argument to get_date() to be able to handle more options Removed THD* from Item sql/item_create.cc: Indentation cleanup sql/item_func.cc: Use new find_type() sql/item_func.h: Changed type of last argument to get_date() to be able to handle more options sql/item_strfunc.h: space change sql/item_timefunc.cc: Changed month_names[] to be easier to use Moved check_names[] to strfunc.cc Added back old make_datetime() function Optimized extract_date_time() Use my_strtoll10() insetad of my_strntoll() Optimized make_date_time() Replaced short variable names with long ones. Use new functions make_time(), make_date() and make_datetime() Dates as strings are now of type my_charset_bin instead of default_charset() Changed Item_func_str_to_date() to by default return a date. sql/item_timefunc.h: Changed charset for date string from default_charset() to my_charset_bin Changed type of last argument to get_date() to be able to handle more options Use defines instead of integers for date/time/datetime string lengths sql/mysql_priv.h: Fixed/added new prototypes sql/mysqld.cc: Removed opt_datetime_format_names Cleaned up handling of date_time format handling. (Fixed core dump when mysqld had error on startup) Removed some unnecessary double init of collation variables sql/protocol.cc: Changed back protocol functions to always return dates in ISO format sql/set_var.cc: Added variables time_format, date_format and datetime_format This had to be recoded becasue checking was done in 'update' method and not in 'check' method. sql/set_var.h: Removed class sys_var_datetime_format() as this defined a variable (which doesn't work) instead of updating a variable sql/share/czech/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/danish/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/dutch/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/english/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/estonian/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/french/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/german/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/greek/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/hungarian/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/italian/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/japanese/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/korean/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/norwegian-ny/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/norwegian/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/polish/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/portuguese/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/romanian/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/russian/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/serbian/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/slovak/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/spanish/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/swedish/errmsg.txt: simplified 'wrong xxx name' error messages sql/share/ukrainian/errmsg.txt: simplified 'wrong xxx name' error messages sql/sql_base.cc: Use new find_type() sql/sql_class.cc: Allocate/free date_time format variables sql/sql_class.h: Define datetime_format variables sql/sql_db.cc: Use new ER_WRONG_NAME error sql/sql_lex.cc: Change lex to generate IDENT_QUOTED for quoted identifiers or identifers that are using characters > 128. This enabled us to not have to copy and convert the identifier to utf8 for simpe identifiers sql/sql_parse.cc: Use new ER_WRONG_NAME error Use new find_type() function sql/sql_prepare.cc: Use new defines sql/sql_table.cc: Use new ER_WRONG_NAME error sql/sql_yacc.yy: Don't copy and convert simple identifiers to utf8. Replace __FORMAT_TYPE defines with TIMESTAMP... defines sql/structs.h: Renamed DATETIME_FORMAT to DATE_TIME format to indicate that it's for date/time/datetime formats Renamed WRONT_TIMESTAMP_FULL to TIMESTAMP_DATETIME_ERROR and TIMESTAMP_FULL to TIMESTAMP_DATETIME Added KNOWN_DATE_TIME_FORMAT struct for Item_func_get_format sql/time.cc: Prepare str_to_TIME and str_to_time() for general date/time handling Removed THD from str_to... functions Renamed date/time/datetime functions to use 'date_time' instead of 'datetime' Added functions to make and copy DATE_TIME_FORMAT's Added trivial functions 'make_time()', 'make_date()' and 'make_datetime()' strings/Makefile.am: Added my_strtoll10() strings/ctype-bin.c: Cleared upper part of binary state map to be able to easily identify simple identifiers strings/my_vsnprintf.c: F
Diffstat (limited to 'sql/field.cc')
-rw-r--r--sql/field.cc159
1 files changed, 50 insertions, 109 deletions
diff --git a/sql/field.cc b/sql/field.cc
index b025f65a798..1a5206ff07b 100644
--- a/sql/field.cc
+++ b/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;
+ break;
case TIMESTAMP_DATE:
- tmp_format= &t_datetime_frm(current_thd, DATE_FORMAT_TYPE).datetime_format;
+ sprintf(buff,"%04d-%02d-%02d", ltime->year,ltime->month,ltime->day);
+ store(buff,10,&my_charset_bin);
break;
- case TIMESTAMP_FULL:
- tmp_format=&t_datetime_frm(current_thd,DATETIME_FORMAT_TYPE).datetime_format;
+ 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,&ltime,current_thd))
+ if (str_to_time(from,len,&ltime))
{
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, &ltime, 0, 0,
- tmp_format->format,
- tmp_format->format_length, 1);
+ make_time((DATE_TIME_FORMAT*) 0, &ltime, 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, &ltime, 0, 0,
- tmp_format->format,
- tmp_format->format_length, 1);
+ make_date((DATE_TIME_FORMAT *) 0, &ltime, 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: