diff options
author | unknown <monty@narttu.mysql.fi> | 2003-11-03 14:01:59 +0200 |
---|---|---|
committer | unknown <monty@narttu.mysql.fi> | 2003-11-03 14:01:59 +0200 |
commit | bee5d9d4627a3b6d09430015357487c1c6c94bca (patch) | |
tree | f9406690fb9f579e21f4877826d439fb785d6902 /sql/field.cc | |
parent | dd85b7602660a400f71d16d00bb8c869d4320c7a (diff) | |
download | mariadb-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.cc | 159 |
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,<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: |