summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2004-08-31 14:12:42 +0400
committerunknown <sergefp@mysql.com>2004-08-31 14:12:42 +0400
commitd2baf0f12bbd9b63315212afb24c2e4ea9d80eeb (patch)
tree9be37fae6adfb6d8924626233277dacfc79d30de
parent02d3c022814a524a7af8cb2abe0573bb1613ff5d (diff)
parentc62dd0d409c76fe676e76467675512c275e8da09 (diff)
downloadmariadb-git-d2baf0f12bbd9b63315212afb24c2e4ea9d80eeb.tar.gz
Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/dbdata/psergey/mysql-4.1-bug-psnames sql/sql_class.cc: Auto merged
-rw-r--r--client/mysql.cc2
-rw-r--r--client/mysqladmin.c2
-rw-r--r--client/mysqlcheck.c2
-rw-r--r--client/mysqldump.c2
-rw-r--r--client/mysqlimport.c2
-rw-r--r--client/mysqlshow.c2
-rw-r--r--configure.in6
-rw-r--r--myisam/ftdefs.h2
-rw-r--r--myisam/mi_check.c36
-rw-r--r--myisam/mi_search.c5
-rw-r--r--myisam/myisamchk.c2
-rw-r--r--myisam/sort.c4
-rw-r--r--mysql-test/r/myisam.result16
-rw-r--r--mysql-test/t/myisam.test12
-rw-r--r--sql/mysql_priv.h8
-rw-r--r--sql/mysqld.cc80
-rw-r--r--sql/sql_acl.cc6
-rw-r--r--sql/sql_class.cc6
-rw-r--r--sql/sql_class.h8
-rw-r--r--sql/sql_prepare.cc18
-rw-r--r--sql/tztime.cc26
-rw-r--r--strings/ctype-utf8.c323
22 files changed, 307 insertions, 263 deletions
diff --git a/client/mysql.cc b/client/mysql.cc
index 51c84152298..8de9995f173 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -607,7 +607,7 @@ static struct my_option my_long_options[] =
{"silent", 's', "Be more silent. Print results with a tab as separator, each row on new line.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0,
0, 0},
#ifdef HAVE_SMEM
- {"shared_memory_base_name", OPT_SHARED_MEMORY_BASE_NAME,
+ {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
"Base name of shared memory.", (gptr*) &shared_memory_base_name, (gptr*) &shared_memory_base_name,
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
diff --git a/client/mysqladmin.c b/client/mysqladmin.c
index 9e5c698bb93..d8842d98c6b 100644
--- a/client/mysqladmin.c
+++ b/client/mysqladmin.c
@@ -151,7 +151,7 @@ static struct my_option my_long_options[] =
"Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM
- {"shared_memory_base_name", OPT_SHARED_MEMORY_BASE_NAME,
+ {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
"Base name of shared memory.", (gptr*) &shared_memory_base_name, (gptr*) &shared_memory_base_name,
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c
index 882efff37a2..904b234be64 100644
--- a/client/mysqlcheck.c
+++ b/client/mysqlcheck.c
@@ -125,7 +125,7 @@ static struct my_option my_long_options[] =
"Can fix almost anything except unique keys that aren't unique.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM
- {"shared_memory_base_name", OPT_SHARED_MEMORY_BASE_NAME,
+ {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
"Base name of shared memory.", (gptr*) &shared_memory_base_name, (gptr*) &shared_memory_base_name,
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 77c93e126e7..631f328a2f7 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -276,7 +276,7 @@ static struct my_option my_long_options[] =
"Direct output to a given file. This option should be used in MSDOS, because it prevents new line '\\n' from being converted to '\\r\\n' (carriage return + line feed).",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM
- {"shared_memory_base_name", OPT_SHARED_MEMORY_BASE_NAME,
+ {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
"Base name of shared memory.", (gptr*) &shared_memory_base_name, (gptr*) &shared_memory_base_name,
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
diff --git a/client/mysqlimport.c b/client/mysqlimport.c
index 201bf51b1bd..73f7e0a9006 100644
--- a/client/mysqlimport.c
+++ b/client/mysqlimport.c
@@ -123,7 +123,7 @@ static struct my_option my_long_options[] =
{"replace", 'r', "If duplicate unique key was found, replace old row.",
(gptr*) &replace, (gptr*) &replace, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM
- {"shared_memory_base_name", OPT_SHARED_MEMORY_BASE_NAME,
+ {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
"Base name of shared memory.", (gptr*) &shared_memory_base_name, (gptr*) &shared_memory_base_name,
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
diff --git a/client/mysqlshow.c b/client/mysqlshow.c
index 35d61f1fa2f..5d64c94ef1a 100644
--- a/client/mysqlshow.c
+++ b/client/mysqlshow.c
@@ -188,7 +188,7 @@ static struct my_option my_long_options[] =
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM
- {"shared_memory_base_name", OPT_SHARED_MEMORY_BASE_NAME,
+ {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
"Base name of shared memory.", (gptr*) &shared_memory_base_name, (gptr*) &shared_memory_base_name,
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif
diff --git a/configure.in b/configure.in
index d40cfbbae19..f7c7634a9f3 100644
--- a/configure.in
+++ b/configure.in
@@ -972,8 +972,8 @@ MAX_CXX_OPTIMIZE="-O3"
# workaround for Sun Forte/x86 see BUG#4681
case $SYSTEM_TYPE-$MACHINE_TYPE-$ac_cv_prog_gcc in
*solaris*-i?86-no)
- CFLAGS="$CFLAGS -DBIG_FILES"
- CXXFLAGS="$CXXFLAGS -DBIG_FILES"
+ CFLAGS="$CFLAGS -DBIG_TABLES"
+ CXXFLAGS="$CXXFLAGS -DBIG_TABLES"
;;
*) ;;
esac
@@ -2402,7 +2402,7 @@ dnl you must also create strings/ctype-$charset_name.c
AC_DIVERT_PUSH(0)
define(CHARSETS_AVAILABLE0,binary)
-define(CHARSETS_AVAILABLE1,ascii armscii8 ascii big5 cp1250 cp1251 cp1256 cp1257)
+define(CHARSETS_AVAILABLE1,armscii8 ascii big5 cp1250 cp1251 cp1256 cp1257)
define(CHARSETS_AVAILABLE2,cp850 cp852 cp866 dec8 euckr gb2312 gbk geostd8)
define(CHARSETS_AVAILABLE3,greek hebrew hp8 keybcs2 koi8r koi8u)
define(CHARSETS_AVAILABLE4,latin1 latin2 latin5 latin7 macce macroman)
diff --git a/myisam/ftdefs.h b/myisam/ftdefs.h
index e23bc3b75ac..e7a0829e140 100644
--- a/myisam/ftdefs.h
+++ b/myisam/ftdefs.h
@@ -27,7 +27,7 @@
#define misc_word_char(X) ((X)=='\'')
#define word_char(s,X) (true_word_char(s,X) || misc_word_char(X))
-#define FT_MAX_WORD_LEN_FOR_SORT 20
+#define FT_MAX_WORD_LEN_FOR_SORT 31
#define COMPILE_STOPWORDS_IN
diff --git a/myisam/mi_check.c b/myisam/mi_check.c
index 052fa55a559..a1c3698b3e9 100644
--- a/myisam/mi_check.c
+++ b/myisam/mi_check.c
@@ -2020,12 +2020,14 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
if (sort_param.keyinfo->flag & HA_FULLTEXT)
{
+ uint ft_max_word_len_for_sort=FT_MAX_WORD_LEN_FOR_SORT*
+ sort_param.keyinfo->seg->charset->mbmaxlen;
sort_info.max_records=
- (ha_rows) (sort_info.filelength/FT_MAX_WORD_LEN_FOR_SORT+1);
+ (ha_rows) (sort_info.filelength/ft_max_word_len_for_sort+1);
sort_param.key_read=sort_ft_key_read;
sort_param.key_write=sort_ft_key_write;
- sort_param.key_length+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN;
+ sort_param.key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
}
else
{
@@ -2425,7 +2427,11 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info,
total_key_length+=sort_param[i].key_length;
if (sort_param[i].keyinfo->flag & HA_FULLTEXT)
- sort_param[i].key_length+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN;
+ {
+ uint ft_max_word_len_for_sort=FT_MAX_WORD_LEN_FOR_SORT*
+ sort_param[i].keyinfo->seg->charset->mbmaxlen;
+ sort_param[i].key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
+ }
}
sort_info.total_keys=i;
sort_param[0].master= 1;
@@ -2634,7 +2640,6 @@ static int sort_key_read(MI_SORT_PARAM *sort_param, void *key)
DBUG_RETURN(sort_write_record(sort_param));
} /* sort_key_read */
-
static int sort_ft_key_read(MI_SORT_PARAM *sort_param, void *key)
{
int error;
@@ -3950,25 +3955,28 @@ static ha_checksum mi_byte_checksum(const byte *buf, uint length)
return crc;
}
-/*
- Deactive all not unique index that can be recreated fast
- These include packed keys on which sorting will use more temporary
- space than the max allowed file length or for which the unpacked keys
- will take much more space than packed keys.
- Note that 'rows' may be zero for the case when we don't know how many
- rows we will put into the file.
- */
-
static my_bool mi_too_big_key_for_sort(MI_KEYDEF *key, ha_rows rows)
{
uint key_maxlength=key->maxlength;
if (key->flag & HA_FULLTEXT)
- key_maxlength+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN;
+ {
+ uint ft_max_word_len_for_sort=FT_MAX_WORD_LEN_FOR_SORT*
+ key->seg->charset->mbmaxlen;
+ key_maxlength+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
+ }
return (key->flag & (HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY | HA_FULLTEXT) &&
((ulonglong) rows * key_maxlength >
(ulonglong) myisam_max_temp_length));
}
+/*
+ Deactivate all not unique index that can be recreated fast
+ These include packed keys on which sorting will use more temporary
+ space than the max allowed file length or for which the unpacked keys
+ will take much more space than packed keys.
+ Note that 'rows' may be zero for the case when we don't know how many
+ rows we will put into the file.
+ */
void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows)
{
diff --git a/myisam/mi_search.c b/myisam/mi_search.c
index 24f5db1401d..bc8be9c2732 100644
--- a/myisam/mi_search.c
+++ b/myisam/mi_search.c
@@ -451,9 +451,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
/* We have to compare k and vseg as if they where space extended */
for (end=vseg + (len-cmplen) ;
vseg < end && *vseg == (uchar) ' ';
- vseg++) ;
- if (vseg == end)
- goto cmp_rest; /* should never happen */
+ vseg++, matched++) ;
+ DBUG_ASSERT(vseg < end);
if (*vseg > (uchar) ' ')
{
diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c
index 5a6717833c5..649b28a93e3 100644
--- a/myisam/myisamchk.c
+++ b/myisam/myisamchk.c
@@ -154,7 +154,7 @@ enum options_mc {
OPT_KEY_CACHE_BLOCK_SIZE, OPT_MYISAM_BLOCK_SIZE,
OPT_READ_BUFFER_SIZE, OPT_WRITE_BUFFER_SIZE, OPT_SORT_BUFFER_SIZE,
OPT_SORT_KEY_BLOCKS, OPT_DECODE_BITS, OPT_FT_MIN_WORD_LEN,
- OPT_FT_MAX_WORD_LEN, OPT_FT_MAX_WORD_LEN_FOR_SORT, OPT_FT_STOPWORD_FILE,
+ OPT_FT_MAX_WORD_LEN, OPT_FT_STOPWORD_FILE,
OPT_MAX_RECORD_LENGTH
};
diff --git a/myisam/sort.c b/myisam/sort.c
index 509365b89a5..3dc066e877c 100644
--- a/myisam/sort.c
+++ b/myisam/sort.c
@@ -204,7 +204,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
reinit_io_cache(&tempfile,READ_CACHE,0L,0,0))
goto err; /* purecov: inspected */
if (!no_messages)
- puts(" - Last merge and dumping keys\n"); /* purecov: tested */
+ printf(" - Last merge and dumping keys\n"); /* purecov: tested */
if (merge_index(info,keys,sort_keys,dynamic_element(&buffpek,0,BUFFPEK *),
maxbuffer,&tempfile))
goto err; /* purecov: inspected */
@@ -219,6 +219,8 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
uint keyno=info->key;
uint key_length, ref_length=index->s->rec_reflength;
+ if (!no_messages)
+ printf(" - Adding exceptions\n"); /* purecov: tested */
if (flush_io_cache(&tempfile_for_exceptions) ||
reinit_io_cache(&tempfile_for_exceptions,READ_CACHE,0L,0,0))
goto err;
diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result
index 354675cd4d4..26dcce43d08 100644
--- a/mysql-test/r/myisam.result
+++ b/mysql-test/r/myisam.result
@@ -428,6 +428,22 @@ select * from t1 where a='807780' and b='477' and c='165';
a b c
807780 477 165
drop table t1;
+DROP TABLE IF EXISTS t1;
+Warnings:
+Note 1051 Unknown table 't1'
+CREATE TABLE t1 (a varchar(150) NOT NULL, KEY (a));
+INSERT t1 VALUES ("can \tcan");
+INSERT t1 VALUES ("can can");
+INSERT t1 VALUES ("can");
+SELECT * FROM t1;
+a
+can can
+can
+can can
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+DROP TABLE t1;
create table t1 (a blob);
insert into t1 values('a '),('a');
select concat(a,'.') from t1 where a='a';
diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test
index e6d47b5c570..f9081e8769b 100644
--- a/mysql-test/t/myisam.test
+++ b/mysql-test/t/myisam.test
@@ -423,6 +423,18 @@ select * from t1 where a='807780' and b='477' and c='165';
drop table t1;
#
+# space-stripping in _mi_prefix_search: BUG#5284
+#
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (a varchar(150) NOT NULL, KEY (a));
+INSERT t1 VALUES ("can \tcan");
+INSERT t1 VALUES ("can can");
+INSERT t1 VALUES ("can");
+SELECT * FROM t1;
+CHECK TABLE t1;
+DROP TABLE t1;
+
+#
# Verify blob handling
#
create table t1 (a blob);
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 1949ecf26dc..dcc39f30c69 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -783,10 +783,10 @@ int key_cmp(KEY_PART_INFO *key_part, const byte *key, uint key_length);
bool init_errmessage(void);
void sql_perror(const char *message);
-void vprint_msg_to_log( enum loglevel level, const char *format, va_list args );
-void sql_print_error( const char *format, ... );
-void sql_print_warning( const char *format, ...);
-void sql_print_information( const char *format, ...);
+void vprint_msg_to_log(enum loglevel level, const char *format, va_list args);
+void sql_print_error(const char *format, ...);
+void sql_print_warning(const char *format, ...);
+void sql_print_information(const char *format, ...);
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 11397736555..e7638f13526 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -762,7 +762,7 @@ void kill_mysql(void)
abort_loop=1;
if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
(void*) 0))
- sql_print_error("Error: Can't create thread to kill server");
+ sql_print_error("Can't create thread to kill server");
}
#endif
DBUG_VOID_RETURN;
@@ -791,7 +791,7 @@ static void __cdecl kill_server(int sig_ptr)
abort_loop=1; // This should be set
signal(sig,SIG_IGN);
if (sig == MYSQL_KILL_SIGNAL || sig == 0)
- sql_print_error(ER(ER_NORMAL_SHUTDOWN),my_progname);
+ sql_print_information(ER(ER_NORMAL_SHUTDOWN),my_progname);
else
sql_print_error(ER(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */
@@ -806,7 +806,7 @@ static void __cdecl kill_server(int sig_ptr)
#ifdef __NETWARE__
pthread_join(select_thread, NULL); // wait for main thread
#endif /* __NETWARE__ */
-
+
pthread_exit(0); /* purecov: deadcode */
#endif /* EMBEDDED_LIBRARY */
@@ -834,7 +834,7 @@ extern "C" sig_handler print_signal_warning(int sig)
if (!DBUG_IN_USE)
{
if (global_system_variables.log_warnings)
- sql_print_error("Warning: Got signal %d from thread %d",
+ sql_print_warning("Got signal %d from thread %d",
sig,my_thread_id());
}
#ifdef DONT_REMEMBER_SIGNAL
@@ -961,7 +961,7 @@ void clean_up(bool print_message)
#endif
if (print_message && errmesg)
- sql_print_error(ER(ER_SHUTDOWN_COMPLETE),my_progname);
+ sql_print_information(ER(ER_SHUTDOWN_COMPLETE),my_progname);
#if !defined(__WIN__) && !defined(EMBEDDED_LIBRARY)
if (!opt_bootstrap)
(void) my_delete(pidfile_name,MYF(0)); // This may not always exist
@@ -1062,8 +1062,8 @@ static void set_user(const char *user)
struct passwd *user_info= getpwnam(user);
if ((!user_info || user_id != user_info->pw_uid) &&
global_system_variables.log_warnings)
- fprintf(stderr,
- "Warning: One can only use the --user switch if running as root\n");
+ sql_print_warning(
+ "One can only use the --user switch if running as root\n");
}
return;
}
@@ -1183,7 +1183,7 @@ static void server_init(void)
if (listen(ip_sock,(int) back_log) < 0)
{
sql_perror("Can't start server: listen() on TCP/IP port");
- sql_print_error("Error: listen() on TCP/IP failed with error %d",
+ sql_print_error("listen() on TCP/IP failed with error %d",
socket_errno);
unireg_abort(1);
}
@@ -1278,7 +1278,7 @@ static void server_init(void)
(void) chmod(mysqld_unix_port,S_IFSOCK); /* Fix solaris 2.6 bug */
#endif
if (listen(unix_sock,(int) back_log) < 0)
- sql_print_error("Warning: listen() on Unix socket failed with error %d",
+ sql_print_warning("listen() on Unix socket failed with error %d",
socket_errno);
}
#endif
@@ -1870,7 +1870,7 @@ static void init_signals(void)
struct rlimit rl;
rl.rlim_cur = rl.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &rl) && global_system_variables.log_warnings)
- sql_print_error("Warning: setrlimit could not change the size of core files to 'infinity'; We may not be able to generate a core file on signals");
+ sql_print_warning("setrlimit could not change the size of core files to 'infinity'; We may not be able to generate a core file on signals");
}
#endif
(void) sigemptyset(&set);
@@ -2024,7 +2024,7 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
case SIGQUIT:
case SIGKILL:
#ifdef EXTRA_DEBUG
- sql_print_error("Got signal %d to shutdown mysqld",sig);
+ sql_print_information("Got signal %d to shutdown mysqld",sig);
#endif
DBUG_PRINT("info",("Got signal: %d abort_loop: %d",sig,abort_loop));
if (!abort_loop)
@@ -2036,7 +2036,7 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
my_pthread_attr_setprio(&connection_attrib,INTERRUPT_PRIOR);
if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
(void*) sig))
- sql_print_error("Error: Can't create thread to kill server");
+ sql_print_error("Can't create thread to kill server");
#else
kill_server((void*) sig); // MIT THREAD has a alarm thread
#endif
@@ -2060,7 +2060,7 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
#endif
default:
#ifdef EXTRA_DEBUG
- sql_print_error("Warning: Got signal: %d error: %d",sig,error); /* purecov: tested */
+ sql_print_warning("Got signal: %d error: %d",sig,error); /* purecov: tested */
#endif
break; /* purecov: tested */
}
@@ -2339,11 +2339,11 @@ static int init_common_variables(const char *conf_file_name, int argc,
("Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld",
files, max_connections, table_cache_size));
if (global_system_variables.log_warnings)
- sql_print_error("Warning: Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld",
+ sql_print_warning("Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld",
files, max_connections, table_cache_size);
}
else if (global_system_variables.log_warnings)
- sql_print_error("Warning: Could not increase number of max_open_files to more than %u (request: %u)", files, wanted_files);
+ sql_print_warning("Could not increase number of max_open_files to more than %u (request: %u)", files, wanted_files);
}
open_files_limit= files;
}
@@ -2523,8 +2523,8 @@ static int init_server_components()
}
else if (opt_log_slave_updates)
{
- sql_print_error("\
-Warning: you need to use --log-bin to make --log-slave-updates work. \
+ sql_print_warning("\
+you need to use --log-bin to make --log-slave-updates work. \
Now disabling --log-slave-updates.");
}
@@ -2532,7 +2532,7 @@ Now disabling --log-slave-updates.");
if (opt_log_slave_updates && replicate_same_server_id)
{
sql_print_error("\
-Error: using --replicate-same-server-id in conjunction with \
+using --replicate-same-server-id in conjunction with \
--log-slave-updates is impossible, it would lead to infinite loops in this \
server.");
unireg_abort(1);
@@ -2561,12 +2561,12 @@ server.");
if (opt_innodb_safe_binlog)
{
if (have_innodb != SHOW_OPTION_YES)
- sql_print_error("Warning: --innodb-safe-binlog is meaningful only if "
+ sql_print_warning("--innodb-safe-binlog is meaningful only if "
"the InnoDB storage engine is enabled in the server.");
#ifdef HAVE_INNOBASE_DB
if (innobase_flush_log_at_trx_commit != 1)
{
- sql_print_error("Warning: --innodb-safe-binlog is meaningful only if "
+ sql_print_warning("--innodb-safe-binlog is meaningful only if "
"innodb_flush_log_at_trx_commit is 1; now setting it "
"to 1.");
innobase_flush_log_at_trx_commit= 1;
@@ -2578,14 +2578,14 @@ server.");
good (especially "littlesync", and on Windows... see
srv/srv0start.c).
*/
- sql_print_error("Warning: --innodb-safe-binlog requires that "
+ sql_print_warning("--innodb-safe-binlog requires that "
"the innodb_flush_method actually synchronizes the "
"InnoDB log to disk; it is your responsibility "
"to verify that the method you chose does it.");
}
if (sync_binlog_period != 1)
{
- sql_print_error("Warning: --innodb-safe-binlog is meaningful only if "
+ sql_print_warning("--innodb-safe-binlog is meaningful only if "
"the global sync_binlog variable is 1; now setting it "
"to 1.");
sync_binlog_period= 1;
@@ -2624,7 +2624,7 @@ server.");
if (mlockall(MCL_CURRENT))
{
if (global_system_variables.log_warnings)
- sql_print_error("Warning: Failed to lock memory. Errno: %d\n",errno);
+ sql_print_warning("Failed to lock memory. Errno: %d\n",errno);
locked_in_memory= 0;
}
}
@@ -2650,7 +2650,7 @@ static void create_maintenance_thread()
{
pthread_t hThread;
if (pthread_create(&hThread,&connection_attrib,handle_manager,0))
- sql_print_error("Warning: Can't create thread to manage maintenance");
+ sql_print_warning("Can't create thread to manage maintenance");
}
}
@@ -2662,7 +2662,7 @@ static void create_shutdown_thread()
hEventShutdown=CreateEvent(0, FALSE, FALSE, shutdown_event_name);
pthread_t hThread;
if (pthread_create(&hThread,&connection_attrib,handle_shutdown,0))
- sql_print_error("Warning: Can't create thread to handle shutdown requests");
+ sql_print_warning("Can't create thread to handle shutdown requests");
// On "Stop Service" we have to do regular shutdown
Service.SetShutdownEvent(hEventShutdown);
@@ -2671,7 +2671,7 @@ static void create_shutdown_thread()
pthread_cond_init(&eventShutdown, NULL);
pthread_t hThread;
if (pthread_create(&hThread,&connection_attrib,handle_shutdown,0))
- sql_print_error("Warning: Can't create thread to handle shutdown requests");
+ sql_print_warning("Can't create thread to handle shutdown requests");
#endif
#endif // EMBEDDED_LIBRARY
}
@@ -2702,7 +2702,7 @@ static void handle_connections_methods()
if (pthread_create(&hThread,&connection_attrib,
handle_connections_namedpipes, 0))
{
- sql_print_error("Warning: Can't create thread to handle named pipes");
+ sql_print_warning("Can't create thread to handle named pipes");
handler_count--;
}
}
@@ -2713,7 +2713,7 @@ static void handle_connections_methods()
if (pthread_create(&hThread,&connection_attrib,
handle_connections_sockets, 0))
{
- sql_print_error("Warning: Can't create thread to handle TCP/IP");
+ sql_print_warning("Can't create thread to handle TCP/IP");
handler_count--;
}
}
@@ -2724,7 +2724,7 @@ static void handle_connections_methods()
if (pthread_create(&hThread,&connection_attrib,
handle_connections_shared_memory, 0))
{
- sql_print_error("Warning: Can't create thread to handle shared memory");
+ sql_print_warning("Can't create thread to handle shared memory");
handler_count--;
}
}
@@ -2784,7 +2784,7 @@ int main(int argc, char **argv)
if (stack_size && stack_size < thread_stack)
{
if (global_system_variables.log_warnings)
- sql_print_error("Warning: Asked for %ld thread stack, but got %ld",
+ sql_print_warning("Asked for %ld thread stack, but got %ld",
thread_stack, stack_size);
thread_stack= stack_size;
}
@@ -2807,8 +2807,8 @@ int main(int argc, char **argv)
if (lower_case_table_names_used)
{
if (global_system_variables.log_warnings)
- sql_print_error("\
-Warning: You have forced lower_case_table_names to 0 through a command-line \
+ sql_print_warning("\
+You have forced lower_case_table_names to 0 through a command-line \
option, even though your file system '%s' is case insensitive. This means \
that you can corrupt a MyISAM table by accessing it with different cases. \
You should consider changing lower_case_table_names to 1 or 2",
@@ -2817,7 +2817,7 @@ You should consider changing lower_case_table_names to 1 or 2",
else
{
if (global_system_variables.log_warnings)
- sql_print_error("Warning: Setting lower_case_table_names=2 because file system for %s is case insensitive", mysql_real_data_home);
+ sql_print_warning("Setting lower_case_table_names=2 because file system for %s is case insensitive", mysql_real_data_home);
lower_case_table_names= 2;
}
}
@@ -2850,14 +2850,14 @@ You should consider changing lower_case_table_names to 1 or 2",
#ifdef EXTRA_DEBUG
switch (server_id) {
case 1:
- sql_print_error("\
-Warning: You have enabled the binary log, but you haven't set server-id to \
+ sql_print_warning("\
+You have enabled the binary log, but you haven't set server-id to \
a non-zero value: we force server id to 1; updates will be logged to the \
binary log, but connections from slaves will not be accepted.");
break;
case 2:
- sql_print_error("\
-Warning: You should set server-id to a non-0 value if master_host is set; \
+ sql_print_warning("\
+You should set server-id to a non-0 value if master_host is set; \
we force server id to 2, but this MySQL server will not act as a slave.");
break;
}
@@ -3197,7 +3197,7 @@ static int bootstrap(FILE *file)
if (pthread_create(&thd->real_id,&connection_attrib,handle_bootstrap,
(void*) thd))
{
- sql_print_error("Warning: Can't create thread to handle bootstrap");
+ sql_print_warning("Can't create thread to handle bootstrap");
DBUG_RETURN(-1);
}
/* Wait for thread to die */
@@ -5606,7 +5606,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
if (!mysqld_user || !strcmp(mysqld_user, argument))
mysqld_user= argument;
else
- fprintf(stderr, "Warning: Ignoring user change to '%s' because the user was set to '%s' earlier on the command line\n", argument, mysqld_user);
+ sql_print_warning("Ignoring user change to '%s' because the user was set to '%s' earlier on the command line\n", argument, mysqld_user);
break;
case 'L':
strmake(language, argument, sizeof(language)-1);
@@ -6391,7 +6391,7 @@ static int test_if_case_insensitive(const char *dir_name)
(void) my_delete(buff2, MYF(0));
if ((file= my_create(buff, 0666, O_RDWR, MYF(0))) < 0)
{
- sql_print_error("Warning: Can't create test file %s", buff);
+ sql_print_warning("Can't create test file %s", buff);
DBUG_RETURN(-1);
}
my_close(file, MYF(0));
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index fd3d27099ed..9c6853187f6 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -251,9 +251,9 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{
global_system_variables.old_passwords= 1;
pthread_mutex_unlock(&LOCK_global_system_variables);
- sql_print_error("mysql.user table is not updated to new password format; "
- "Disabling new password usage until "
- "mysql_fix_privilege_tables is run");
+ sql_print_warning("mysql.user table is not updated to new password format; "
+ "Disabling new password usage until "
+ "mysql_fix_privilege_tables is run");
}
thd->variables.old_passwords= 1;
}
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index c7d8e81d11b..84821cb8748 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -1323,7 +1323,7 @@ void select_dumpvar::cleanup()
Item_arena::Item_arena(THD* thd)
:free_list(0),
- state((int)INITIALIZED)
+ state(INITIALIZED)
{
init_sql_alloc(&mem_root,
thd->variables.query_alloc_block_size,
@@ -1335,7 +1335,7 @@ Item_arena::Item_arena(THD* thd)
Item_arena::Item_arena()
:free_list(0),
- state((int)CONVENTIONAL_EXECUTION)
+ state(CONVENTIONAL_EXECUTION)
{
clear_alloc_root(&mem_root);
}
@@ -1343,7 +1343,7 @@ Item_arena::Item_arena()
Item_arena::Item_arena(bool init_mem_root)
:free_list(0),
- state((int)INITIALIZED)
+ state(INITIALIZED)
{
if (init_mem_root)
clear_alloc_root(&mem_root);
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 198e06bb3bd..a8035cffd96 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -427,13 +427,13 @@ public:
*/
Item *free_list;
MEM_ROOT mem_root;
- enum
+ enum enum_state
{
INITIALIZED= 0, PREPARED= 1, EXECUTED= 3, CONVENTIONAL_EXECUTION= 2,
ERROR= -1
};
- int state;
+ enum_state state;
/* We build without RTTI, so dynamic_cast can't be used. */
enum Type
@@ -447,8 +447,8 @@ public:
virtual Type type() const;
virtual ~Item_arena();
- inline bool is_stmt_prepare() const { return state < (int)PREPARED; }
- inline bool is_first_stmt_execute() const { return state == (int)PREPARED; }
+ inline bool is_stmt_prepare() const { return (int)state < (int)PREPARED; }
+ inline bool is_first_stmt_execute() const { return state == PREPARED; }
inline gptr alloc(unsigned int size) { return alloc_root(&mem_root,size); }
inline gptr calloc(unsigned int size)
{
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index baff7bd604d..708ca3a516f 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -132,7 +132,7 @@ find_prepared_statement(THD *thd, ulong id, const char *where,
{
Statement *stmt= thd->stmt_map.find(id);
- if (stmt == 0 || stmt->type() != (int)Item_arena::PREPARED_STATEMENT)
+ if (stmt == 0 || stmt->type() != Item_arena::PREPARED_STATEMENT)
{
char llbuf[22];
my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), 22, llstr(id, llbuf), where);
@@ -1619,7 +1619,7 @@ int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
{
sl->prep_where= sl->where;
}
- stmt->state= (int)Prepared_statement::PREPARED;
+ stmt->state= Item_arena::PREPARED;
}
DBUG_RETURN(!stmt);
@@ -1736,7 +1736,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
DBUG_PRINT("exec_query:", ("%s", stmt->query));
/* Check if we got an error when sending long data */
- if (stmt->state == (int)Item_arena::ERROR)
+ if (stmt->state == Item_arena::ERROR)
{
send_error(thd, stmt->last_errno, stmt->last_error);
DBUG_VOID_RETURN;
@@ -1853,7 +1853,7 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
transformations of the query tree (i.e. negations elimination).
This should be done permanently on the parse tree of this statement.
*/
- if (stmt->state == (int)Item_arena::PREPARED)
+ if (stmt->state == Item_arena::PREPARED)
thd->current_arena= stmt;
if (!(specialflag & SPECIAL_NO_PRIOR))
@@ -1866,10 +1866,10 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
/* Free Items that were created during this execution of the PS. */
free_items(thd->free_list);
thd->free_list= 0;
- if (stmt->state == (int)Item_arena::PREPARED)
+ if (stmt->state == Item_arena::PREPARED)
{
thd->current_arena= thd;
- stmt->state= (int)Item_arena::EXECUTED;
+ stmt->state= Item_arena::EXECUTED;
}
cleanup_items(stmt->free_list);
reset_stmt_params(stmt);
@@ -1908,7 +1908,7 @@ void mysql_stmt_reset(THD *thd, char *packet)
SEND_ERROR)))
DBUG_VOID_RETURN;
- stmt->state= (int)Item_arena::PREPARED;
+ stmt->state= Item_arena::PREPARED;
/*
Clear parameters from data which could be set by
@@ -1996,7 +1996,7 @@ void mysql_stmt_get_longdata(THD *thd, char *packet, ulong packet_length)
if (param_number >= stmt->param_count)
{
/* Error will be sent in execute call */
- stmt->state= (int)Item_arena::ERROR;
+ stmt->state= Item_arena::ERROR;
stmt->last_errno= ER_WRONG_ARGUMENTS;
sprintf(stmt->last_error, ER(ER_WRONG_ARGUMENTS),
"mysql_stmt_send_long_data");
@@ -2012,7 +2012,7 @@ void mysql_stmt_get_longdata(THD *thd, char *packet, ulong packet_length)
if (param->set_longdata(thd->extra_data, thd->extra_length))
#endif
{
- stmt->state= (int)Item_arena::ERROR;
+ stmt->state= Item_arena::ERROR;
stmt->last_errno= ER_OUTOFMEMORY;
sprintf(stmt->last_error, ER(ER_OUTOFMEMORY), 0);
}
diff --git a/sql/tztime.cc b/sql/tztime.cc
index 610f75f1643..af9af530fec 100644
--- a/sql/tztime.cc
+++ b/sql/tztime.cc
@@ -1560,8 +1560,8 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
if (open_tables(thd, tables_buff, &counter) ||
lock_tables(thd, tables_buff, counter))
{
- sql_print_error("Warning: Can't open and lock time zone table: %s "
- "trying to live without them", thd->net.last_error);
+ sql_print_warning("Can't open and lock time zone table: %s "
+ "trying to live without them", thd->net.last_error);
/* We will try emulate that everything is ok */
return_val= time_zone_tables_exist= 0;
goto end_with_setting_default_tz;
@@ -1740,8 +1740,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
if (!(alloc_buff= alloc_root(&tz_storage, sizeof(TIME_ZONE_INFO) +
tz_name->length() + 1)))
{
- sql_print_error("Error: Out of memory while loading time zone "
- "description");
+ sql_print_error("Out of memory while loading time zone description");
return 0;
}
tz_info= (TIME_ZONE_INFO *)alloc_buff;
@@ -1757,7 +1756,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
Let us find out time zone id by its name (there is only one index
and it is specifically for this purpose).
*/
- table= tz_tables->table;
+ table= tz_tables->table;
tz_tables= tz_tables->next;
table->field[0]->store(tz_name->ptr(), tz_name->length(), &my_charset_latin1);
/*
@@ -1770,7 +1769,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
if (table->file->index_read(table->record[0], (byte*)table->field[0]->ptr,
0, HA_READ_KEY_EXACT))
{
- sql_print_error("Error: Can't find description of time zone.");
+ sql_print_error("Can't find description of time zone.");
goto end;
}
@@ -1783,7 +1782,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
understand whenever this timezone uses leap seconds (again we are
using the only index in this table).
*/
- table= tz_tables->table;
+ table= tz_tables->table;
tz_tables= tz_tables->next;
table->field[0]->store((longlong)tzid);
(void)table->file->ha_index_init(0);
@@ -1791,7 +1790,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
if (table->file->index_read(table->record[0], (byte*)table->field[0]->ptr,
0, HA_READ_KEY_EXACT))
{
- sql_print_error("Error: Can't find description of time zone.");
+ sql_print_error("Can't find description of time zone.");
goto end;
}
@@ -1810,7 +1809,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
only for our time zone guess what are we doing?
Right - using special index.
*/
- table= tz_tables->table;
+ table= tz_tables->table;
tz_tables= tz_tables->next;
table->field[0]->store((longlong)tzid);
(void)table->file->ha_index_init(0);
@@ -1948,8 +1947,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
#endif
sizeof(TRAN_TYPE_INFO) * tz_info->typecnt)))
{
- sql_print_error("Error: Out of memory while loading time zone "
- "description");
+ sql_print_error("Out of memory while loading time zone description");
goto end;
}
@@ -1974,12 +1972,12 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
*/
if (tz_info->typecnt < 1)
{
- sql_print_error("Error: loading time zone without transition types");
+ sql_print_error("loading time zone without transition types");
goto end;
}
if (prepare_tz_info(tz_info, &tz_storage))
{
- sql_print_error("Error: Unable to build mktime map for time zone");
+ sql_print_error("Unable to build mktime map for time zone");
goto end;
}
@@ -1991,7 +1989,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
&my_charset_latin1),
my_hash_insert(&tz_names, (const byte *)tmp_tzname)))
{
- sql_print_error("Error: Out of memory while loading time zone");
+ sql_print_error("Out of memory while loading time zone");
goto end;
}
diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c
index 7c3baac3c39..5e339725b1a 100644
--- a/strings/ctype-utf8.c
+++ b/strings/ctype-utf8.c
@@ -1,15 +1,15 @@
/* Copyright (C) 2000 MySQL AB
-
+
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
-
+
This library 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
Library General Public License for more details.
-
+
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@@ -1524,7 +1524,7 @@ MY_UNICASE_INFO *uni_plane[256]={
#ifdef HAVE_CHARSET_utf8
-/*
+/*
We consider bytes with code more than 127 as a letter.
This garantees that word boundaries work fine with regular
expressions. Note, there is no need to mark byte 255 as a
@@ -1590,99 +1590,108 @@ static uchar to_upper_utf8[] = {
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
};
+static inline int bincmp(const uchar *s, const uchar *se,
+ const uchar *t, const uchar *te)
+{
+ int slen=se-s, tlen=te-t;
+ int len=min(slen,tlen);
+ int cmp= memcmp(s,t,len);
+ return cmp ? cmp : slen-tlen;
+}
+
static int my_utf8_uni(CHARSET_INFO *cs __attribute__((unused)),
- my_wc_t * pwc, const uchar *s, const uchar *e)
+ my_wc_t * pwc, const uchar *s, const uchar *e)
{
unsigned char c;
-
+
if (s >= e)
return MY_CS_TOOFEW(0);
c= s[0];
- if (c < 0x80)
+ if (c < 0x80)
{
*pwc = c;
return 1;
- }
- else if (c < 0xc2)
+ }
+ else if (c < 0xc2)
return MY_CS_ILSEQ;
- else if (c < 0xe0)
+ else if (c < 0xe0)
{
- if (s+2 > e) /* We need 2 characters */
+ if (s+2 > e) /* We need 2 characters */
return MY_CS_TOOFEW(0);
-
+
if (!((s[1] ^ 0x80) < 0x40))
return MY_CS_ILSEQ;
-
+
*pwc = ((my_wc_t) (c & 0x1f) << 6) | (my_wc_t) (s[1] ^ 0x80);
return 2;
- }
- else if (c < 0xf0)
+ }
+ else if (c < 0xf0)
{
if (s+3 > e) /* We need 3 characters */
return MY_CS_TOOFEW(0);
-
+
if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0)))
return MY_CS_ILSEQ;
-
- *pwc = ((my_wc_t) (c & 0x0f) << 12) |
- ((my_wc_t) (s[1] ^ 0x80) << 6) |
+
+ *pwc = ((my_wc_t) (c & 0x0f) << 12) |
+ ((my_wc_t) (s[1] ^ 0x80) << 6) |
(my_wc_t) (s[2] ^ 0x80);
-
+
return 3;
- }
+ }
#ifdef UNICODE_32BIT
- else if (c < 0xf8 && sizeof(my_wc_t)*8 >= 32)
+ else if (c < 0xf8 && sizeof(my_wc_t)*8 >= 32)
{
if (s+4 > e) /* We need 4 characters */
return MY_CS_TOOFEW(0);
-
- if (!((s[1] ^ 0x80) < 0x40 &&
- (s[2] ^ 0x80) < 0x40 &&
- (s[3] ^ 0x80) < 0x40 &&
+
+ if (!((s[1] ^ 0x80) < 0x40 &&
+ (s[2] ^ 0x80) < 0x40 &&
+ (s[3] ^ 0x80) < 0x40 &&
(c >= 0xf1 || s[1] >= 0x90)))
return MY_CS_ILSEQ;
-
- *pwc = ((my_wc_t) (c & 0x07) << 18) |
- ((my_wc_t) (s[1] ^ 0x80) << 12) |
- ((my_wc_t) (s[2] ^ 0x80) << 6) |
+
+ *pwc = ((my_wc_t) (c & 0x07) << 18) |
+ ((my_wc_t) (s[1] ^ 0x80) << 12) |
+ ((my_wc_t) (s[2] ^ 0x80) << 6) |
(my_wc_t) (s[3] ^ 0x80);
-
+
return 4;
}
- else if (c < 0xfc && sizeof(my_wc_t)*8 >= 32)
+ else if (c < 0xfc && sizeof(my_wc_t)*8 >= 32)
{
if (s+5 >e) /* We need 5 characters */
return MY_CS_TOOFEW(0);
-
- if (!((s[1] ^ 0x80) < 0x40 &&
- (s[2] ^ 0x80) < 0x40 &&
- (s[3] ^ 0x80) < 0x40 &&
- (s[4] ^ 0x80) < 0x40 &&
+
+ if (!((s[1] ^ 0x80) < 0x40 &&
+ (s[2] ^ 0x80) < 0x40 &&
+ (s[3] ^ 0x80) < 0x40 &&
+ (s[4] ^ 0x80) < 0x40 &&
(c >= 0xf9 || s[1] >= 0x88)))
return MY_CS_ILSEQ;
-
- *pwc = ((my_wc_t) (c & 0x03) << 24) |
+
+ *pwc = ((my_wc_t) (c & 0x03) << 24) |
((my_wc_t) (s[1] ^ 0x80) << 18) |
((my_wc_t) (s[2] ^ 0x80) << 12) |
((my_wc_t) (s[3] ^ 0x80) << 6) |
(my_wc_t) (s[4] ^ 0x80);
return 5;
- }
- else if (c < 0xfe && sizeof(my_wc_t)*8 >= 32)
+ }
+ else if (c < 0xfe && sizeof(my_wc_t)*8 >= 32)
{
if ( s+6 >e ) /* We need 6 characters */
return MY_CS_TOOFEW(0);
-
- if (!((s[1] ^ 0x80) < 0x40 &&
- (s[2] ^ 0x80) < 0x40 &&
- (s[3] ^ 0x80) < 0x40 &&
- (s[4] ^ 0x80) < 0x40 &&
- (s[5] ^ 0x80) < 0x40 &&
+
+ if (!((s[1] ^ 0x80) < 0x40 &&
+ (s[2] ^ 0x80) < 0x40 &&
+ (s[3] ^ 0x80) < 0x40 &&
+ (s[4] ^ 0x80) < 0x40 &&
+ (s[5] ^ 0x80) < 0x40 &&
(c >= 0xfd || s[1] >= 0x84)))
return MY_CS_ILSEQ;
-
+
*pwc = ((my_wc_t) (c & 0x01) << 30)
| ((my_wc_t) (s[1] ^ 0x80) << 24)
| ((my_wc_t) (s[2] ^ 0x80) << 18)
@@ -1702,12 +1711,12 @@ static int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) ,
if (r >= e)
return MY_CS_TOOSMALL;
-
- if (wc < 0x80)
+
+ if (wc < 0x80)
count = 1;
- else if (wc < 0x800)
+ else if (wc < 0x800)
count = 2;
- else if (wc < 0x10000)
+ else if (wc < 0x10000)
count = 3;
#ifdef UNICODE_32BIT
else if (wc < 0x200000)
@@ -1718,15 +1727,15 @@ static int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) ,
count = 6;
#endif
else return MY_CS_ILUNI;
-
- /*
- e is a character after the string r, not the last character of it.
+
+ /*
+ e is a character after the string r, not the last character of it.
Because of it (r+count > e), not (r+count-1 >e )
*/
- if ( r+count > e )
+ if ( r+count > e )
return MY_CS_TOOSMALL;
-
- switch (count) {
+
+ switch (count) {
/* Fall through all cases!!! */
#ifdef UNICODE_32BIT
case 6: r[5] = (uchar) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x4000000;
@@ -1806,8 +1815,8 @@ static void my_casedn_str_utf8(CHARSET_INFO *cs, char * s)
}
-static int my_strnncoll_utf8(CHARSET_INFO *cs,
- const uchar *s, uint slen,
+static int my_strnncoll_utf8(CHARSET_INFO *cs,
+ const uchar *s, uint slen,
const uchar *t, uint tlen,
my_bool t_is_prefix)
{
@@ -1821,13 +1830,13 @@ static int my_strnncoll_utf8(CHARSET_INFO *cs,
int plane;
s_res=my_utf8_uni(cs,&s_wc, s, se);
t_res=my_utf8_uni(cs,&t_wc, t, te);
-
+
if ( s_res <= 0 || t_res <= 0 )
{
- /* Incorrect string, compare by char value */
- return ((int)s[0]-(int)t[0]);
+ /* Incorrect string, compare byte by byte value */
+ return bincmp(s, se, t, te);
}
-
+
plane=(s_wc>>8) & 0xFF;
s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc;
plane=(t_wc>>8) & 0xFF;
@@ -1836,7 +1845,7 @@ static int my_strnncoll_utf8(CHARSET_INFO *cs,
{
return ((int) s_wc) - ((int) t_wc);
}
-
+
s+=s_res;
t+=t_res;
}
@@ -1850,11 +1859,11 @@ static int my_strnncoll_utf8(CHARSET_INFO *cs,
SYNOPSIS
my_strnncollsp_utf8()
- cs character set handler
- a First string to compare
- a_length Length of 'a'
- b Second string to compare
- b_length Length of 'b'
+ cs character set handler
+ a First string to compare
+ a_length Length of 'a'
+ b Second string to compare
+ b_length Length of 'b'
IMPLEMENTATION
If one string is shorter as the other, then we space extend the other
@@ -1867,32 +1876,32 @@ static int my_strnncoll_utf8(CHARSET_INFO *cs,
"a\0" < "a "
RETURN
- < 0 a < b
- = 0 a == b
- > 0 a > b
+ < 0 a < b
+ = 0 a == b
+ > 0 a > b
*/
-static int my_strnncollsp_utf8(CHARSET_INFO *cs,
- const uchar *s, uint slen,
- const uchar *t, uint tlen)
+static int my_strnncollsp_utf8(CHARSET_INFO *cs,
+ const uchar *s, uint slen,
+ const uchar *t, uint tlen)
{
int s_res,t_res;
my_wc_t s_wc,t_wc;
const uchar *se= s+slen;
const uchar *te= t+tlen;
-
+
while ( s < se && t < te )
{
int plane;
s_res=my_utf8_uni(cs,&s_wc, s, se);
t_res=my_utf8_uni(cs,&t_wc, t, te);
-
+
if ( s_res <= 0 || t_res <= 0 )
{
- /* Incorrect string, compare by char value */
- return ((int)s[0]-(int)t[0]);
+ /* Incorrect string, compare byte by byte value */
+ return bincmp(s, se, t, te);
}
-
+
plane=(s_wc>>8) & 0xFF;
s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc;
plane=(t_wc>>8) & 0xFF;
@@ -1901,14 +1910,14 @@ static int my_strnncollsp_utf8(CHARSET_INFO *cs,
{
return ((int) s_wc) - ((int) t_wc);
}
-
+
s+=s_res;
t+=t_res;
}
-
+
slen= se-s;
tlen= te-t;
-
+
if (slen != tlen)
{
int swap= 0;
@@ -1940,35 +1949,35 @@ static int my_strnncollsp_utf8(CHARSET_INFO *cs,
static int my_strncasecmp_utf8(CHARSET_INFO *cs,
- const char *s, const char *t, uint len)
+ const char *s, const char *t, uint len)
{
int s_res,t_res;
my_wc_t s_wc,t_wc;
const char *se=s+len;
const char *te=t+len;
-
+
while ( s < se && t < te )
{
int plane;
-
+
s_res=my_utf8_uni(cs,&s_wc, (const uchar*)s, (const uchar*)se);
t_res=my_utf8_uni(cs,&t_wc, (const uchar*)t, (const uchar*)te);
-
+
if ( s_res <= 0 || t_res <= 0 )
{
- /* Incorrect string, compare by char value */
- return ((int)s[0]-(int)t[0]);
+ /* Incorrect string, compare byte by byte value */
+ return bincmp(s, se, t, te);
}
-
+
plane=(s_wc>>8) & 0xFF;
s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].tolower : s_wc;
plane=(t_wc>>8) & 0xFF;
t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].tolower : t_wc;
-
+
if ( s_wc != t_wc )
return ((int) s_wc) - ((int) t_wc);
-
+
s+=s_res;
t+=t_res;
}
@@ -1983,9 +1992,9 @@ static int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t)
return my_strncasecmp_utf8(cs, s, t, len);
}
-static int my_strnxfrm_utf8(CHARSET_INFO *cs,
- uchar *dst, uint dstlen,
- const uchar *src, uint srclen)
+static int my_strnxfrm_utf8(CHARSET_INFO *cs,
+ uchar *dst, uint dstlen,
+ const uchar *src, uint srclen)
{
my_wc_t wc;
int res;
@@ -2002,10 +2011,10 @@ static int my_strnxfrm_utf8(CHARSET_INFO *cs,
}
src+=res;
srclen-=res;
-
+
plane=(wc>>8) & 0xFF;
wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].sort : wc;
-
+
if ((res=my_uni_utf8(cs,wc,dst,de)) <0)
{
break;
@@ -2026,18 +2035,18 @@ static int my_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint c)
{
if (c < 0x80)
return 1;
- else if (c < 0xc2)
+ else if (c < 0xc2)
return 0; /* Illegal mb head */
- else if (c < 0xe0)
+ else if (c < 0xe0)
return 2;
- else if (c < 0xf0)
+ else if (c < 0xf0)
return 3;
#ifdef UNICODE_32BIT
- else if (c < 0xf8)
+ else if (c < 0xf8)
return 4;
- else if (c < 0xfc)
+ else if (c < 0xfc)
return 5;
- else if (c < 0xfe)
+ else if (c < 0xfe)
return 6;
#endif
return 0; /* Illegal mb head */;
@@ -2046,7 +2055,7 @@ static int my_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint c)
static MY_COLLATION_HANDLER my_collation_ci_handler =
{
- NULL, /* init */
+ NULL, /* init */
my_strnncoll_utf8,
my_strnncollsp_utf8,
my_strnxfrm_utf8,
@@ -2059,7 +2068,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
MY_CHARSET_HANDLER my_charset_utf8_handler=
{
- NULL, /* init */
+ NULL, /* init */
my_ismbchar_utf8,
my_mbcharlen_utf8,
my_numchars_mb,
@@ -2089,27 +2098,27 @@ MY_CHARSET_HANDLER my_charset_utf8_handler=
CHARSET_INFO my_charset_utf8_general_ci=
{
- 33,0,0, /* number */
- MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */
- "utf8", /* cs name */
- "utf8_general_ci", /* name */
- "", /* comment */
- NULL, /* tailoring */
- ctype_utf8, /* ctype */
- to_lower_utf8, /* to_lower */
- to_upper_utf8, /* to_upper */
- to_upper_utf8, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
- NULL, /* tab_to_uni */
- NULL, /* tab_from_uni */
- NULL, /* state_map */
- NULL, /* ident_map */
- 1, /* strxfrm_multiply */
- 1, /* mbminlen */
- 3, /* mbmaxlen */
- 0, /* min_sort_char */
- 255, /* max_sort_char */
+ 33,0,0, /* number */
+ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */
+ "utf8", /* cs name */
+ "utf8_general_ci", /* name */
+ "", /* comment */
+ NULL, /* tailoring */
+ ctype_utf8, /* ctype */
+ to_lower_utf8, /* to_lower */
+ to_upper_utf8, /* to_upper */
+ to_upper_utf8, /* sort_order */
+ NULL, /* contractions */
+ NULL, /* sort_order_big*/
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 1, /* strxfrm_multiply */
+ 1, /* mbminlen */
+ 3, /* mbmaxlen */
+ 0, /* min_sort_char */
+ 255, /* max_sort_char */
&my_charset_utf8_handler,
&my_collation_ci_handler
};
@@ -2117,27 +2126,27 @@ CHARSET_INFO my_charset_utf8_general_ci=
CHARSET_INFO my_charset_utf8_bin=
{
- 83,0,0, /* number */
- MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE, /* state */
- "utf8", /* cs name */
- "utf8_bin", /* name */
- "", /* comment */
- NULL, /* tailoring */
- ctype_utf8, /* ctype */
- to_lower_utf8, /* to_lower */
- to_upper_utf8, /* to_upper */
- NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
- NULL, /* tab_to_uni */
- NULL, /* tab_from_uni */
- NULL, /* state_map */
- NULL, /* ident_map */
- 1, /* strxfrm_multiply */
- 1, /* mbminlen */
- 3, /* mbmaxlen */
- 0, /* min_sort_char */
- 255, /* max_sort_char */
+ 83,0,0, /* number */
+ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE, /* state */
+ "utf8", /* cs name */
+ "utf8_bin", /* name */
+ "", /* comment */
+ NULL, /* tailoring */
+ ctype_utf8, /* ctype */
+ to_lower_utf8, /* to_lower */
+ to_upper_utf8, /* to_upper */
+ NULL, /* sort_order */
+ NULL, /* contractions */
+ NULL, /* sort_order_big*/
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 1, /* strxfrm_multiply */
+ 1, /* mbminlen */
+ 3, /* mbmaxlen */
+ 0, /* min_sort_char */
+ 255, /* max_sort_char */
&my_charset_utf8_handler,
&my_collation_mb_bin_handler
};
@@ -2155,8 +2164,8 @@ static void test_mb(CHARSET_INFO *cs, uchar *s)
int len=my_mbcharlen_utf8(cs,*s);
while(len--)
{
- printf("%c",*s);
- s++;
+ printf("%c",*s);
+ s++;
}
printf("\n");
}
@@ -2172,23 +2181,23 @@ int main()
{
char str[1024]=" utf8 test проба ПЕРА по-РУССКИ";
CHARSET_INFO *cs;
-
+
test_mb(cs,(uchar*)str);
-
+
printf("orig :'%s'\n",str);
-
+
my_caseup_utf8(cs,str,15);
printf("caseup :'%s'\n",str);
-
+
my_caseup_str_utf8(cs,str);
printf("caseup_str:'%s'\n",str);
-
+
my_casedn_utf8(cs,str,15);
printf("casedn :'%s'\n",str);
-
+
my_casedn_str_utf8(cs,str);
printf("casedn_str:'%s'\n",str);
-
+
return 0;
}