summaryrefslogtreecommitdiff
path: root/sql/strfunc.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/strfunc.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/strfunc.cc')
-rw-r--r--sql/strfunc.cc147
1 files changed, 147 insertions, 0 deletions
diff --git a/sql/strfunc.cc b/sql/strfunc.cc
new file mode 100644
index 00000000000..1db2124bcee
--- /dev/null
+++ b/sql/strfunc.cc
@@ -0,0 +1,147 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/* Some useful string utility functions used by the MySQL server */
+
+#include "mysql_priv.h"
+
+/*
+ Return bitmap for strings used in a set
+
+ SYNOPSIS
+ find_set()
+ lib Strings in set
+ str Strings of set-strings separated by ','
+ err_pos If error, set to point to start of wrong set string
+ err_len If error, set to the length of wrong set string
+ set_warning Set to 1 if some string in set couldn't be used
+
+ NOTE
+ We delete all end space from str before comparison
+
+ RETURN
+ bitmap of all sets found in x.
+ set_warning is set to 1 if there was any sets that couldn't be set
+*/
+
+static const char field_separator=',';
+
+ulonglong find_set(TYPELIB *lib, const char *str, uint length, char **err_pos,
+ uint *err_len, bool *set_warning)
+{
+ const char *end= str + length;
+ *err_pos= 0; // No error yet
+ while (end > str && my_isspace(system_charset_info, end[-1]))
+ end--;
+
+ *err_len= 0;
+ ulonglong found= 0;
+ if (str != end)
+ {
+ const char *start= str;
+ for (;;)
+ {
+ const char *pos= start;
+ uint var_len;
+
+ for (; pos != end && *pos != field_separator; pos++) ;
+ var_len= (uint) (pos - start);
+ uint find= find_type(lib, start, var_len, 0);
+ 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;
+}
+
+
+/*
+ Function to find a string in a TYPELIB
+ (Same format as mysys/typelib.c)
+
+ SYNOPSIS
+ find_type()
+ lib TYPELIB (struct of pointer to values + count)
+ find String to find
+ length Length of string to find
+ part_match Allow part matching of value
+
+ RETURN
+ 0 error
+ > 0 position in TYPELIB->type_names +1
+*/
+
+uint find_type(TYPELIB *lib, const char *find, uint length, bool part_match)
+{
+ uint found_count=0, found_pos=0;
+ const char *end= find+length;
+ const char *i;
+ const char *j;
+ for (uint pos=0 ; (j=lib->type_names[pos++]) ; )
+ {
+ for (i=find ; i != end &&
+ my_toupper(system_charset_info,*i) ==
+ my_toupper(system_charset_info,*j) ; i++, j++) ;
+ if (i == end)
+ {
+ if (! *j)
+ return(pos);
+ found_count++;
+ found_pos= pos;
+ }
+ }
+ return(found_count == 1 && part_match ? found_count : 0);
+}
+
+
+/*
+ Check if the first word in a string is one of the ones in TYPELIB
+
+ SYNOPSIS
+ check_word()
+ lib TYPELIB
+ val String to check
+ end End of input
+ end_of_word Store value of last used byte here if we found word
+
+ RETURN
+ 0 No matching value
+ > 1 lib->type_names[#-1] matched
+ end_of_word will point to separator character/end in 'val'
+*/
+
+uint check_word(TYPELIB *lib, const char *val, const char *end,
+ const char **end_of_word)
+{
+ int res;
+ const char *ptr;
+
+ /* Fiend end of word */
+ for (ptr= val ; ptr < end && my_isalpha(&my_charset_latin1, *ptr) ; ptr++)
+ ;
+ if ((res=find_type(lib, val, (uint) (ptr - val), 1)) > 0)
+ *end_of_word= ptr;
+ return res;
+}