Merge mysql.com:/home/jonas/src/mysql-4.1-ndb

into mysql.com:/home/jonas/src/wl2025
This commit is contained in:
joreland@mysql.com 2004-09-01 04:56:45 +02:00
commit 16a714c932
65 changed files with 633 additions and 1363 deletions

View file

@ -665,6 +665,41 @@ AC_DEFINE(STRUCT_DIRENT_HAS_D_INO, [1],
fi fi
]) ])
AC_DEFUN(MYSQL_STRUCT_DIRENT_D_NAMLEN,
[AC_REQUIRE([AC_HEADER_DIRENT])
AC_MSG_CHECKING(if struct dirent has a d_namlen member)
AC_CACHE_VAL(mysql_cv_dirent_has_dnamlen,
[AC_TRY_COMPILE([
#include <stdio.h>
#include <sys/types.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#if defined(HAVE_DIRENT_H)
# include <dirent.h>
#else
# define dirent direct
# ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif /* SYSNDIR */
# ifdef HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif /* SYSDIR */
# ifdef HAVE_NDIR_H
# include <ndir.h>
# endif
#endif /* HAVE_DIRENT_H */
],[
struct dirent d; int z; z = (int)d.d_namlen;
], mysql_cv_dirent_has_dnamlen=yes, mysql_cv_dirent_has_dnamlen=no)])
AC_MSG_RESULT($mysql_cv_dirent_has_dnamlen)
if test "$mysql_cv_dirent_has_dnamlen" = "yes"; then
AC_DEFINE(STRUCT_DIRENT_HAS_D_NAMLEN, [1],
[d_namlen member present in struct dirent])
fi
])
AC_DEFUN(MYSQL_TYPE_SIGHANDLER, AC_DEFUN(MYSQL_TYPE_SIGHANDLER,
[AC_MSG_CHECKING([whether signal handlers are of type void]) [AC_MSG_CHECKING([whether signal handlers are of type void])
AC_CACHE_VAL(mysql_cv_void_sighandler, AC_CACHE_VAL(mysql_cv_void_sighandler,

View file

@ -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, {"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}, 0, 0},
#ifdef HAVE_SMEM #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, "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}, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif #endif

View file

@ -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.", "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}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM #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, "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}, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif #endif

View file

@ -125,7 +125,7 @@ static struct my_option my_long_options[] =
"Can fix almost anything except unique keys that aren't unique.", "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}, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM #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, "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}, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif #endif

View file

@ -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).", "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}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM #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, "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}, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif #endif

View file

@ -123,7 +123,7 @@ static struct my_option my_long_options[] =
{"replace", 'r', "If duplicate unique key was found, replace old row.", {"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}, (gptr*) &replace, (gptr*) &replace, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM #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, "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}, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif #endif

View file

@ -188,7 +188,7 @@ static struct my_option my_long_options[] =
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).", {"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}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#ifdef HAVE_SMEM #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, "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}, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#endif #endif

View file

@ -30,7 +30,7 @@ EXTRA_DIST = makelist.sh np/unvis.c np/strlcpy.c np/vis.c np/vis.h np/strlcat.c
CLEANFILES = makelist common.h emacs.h vi.h fcns.h help.h fcns.c help.c CLEANFILES = makelist common.h emacs.h vi.h fcns.h help.h fcns.c help.c
DEFS = -DUNDEF_THREADS_HACK -DHAVE_CONFIG_H -DNO_KILL_INTR '-D__RCSID(x)=' '-D__COPYRIGHT(x)=' '-D__RENAME(x)=' '-D_DIAGASSERT(x)=' DEFS = -DUNDEF_THREADS_HACK -DHAVE_CONFIG_H -DNO_KILL_INTR
SUFFIXES = .sh SUFFIXES = .sh

View file

@ -62,13 +62,13 @@ cv_undo(EditLine *el)
{ {
c_undo_t *vu = &el->el_chared.c_undo; c_undo_t *vu = &el->el_chared.c_undo;
c_redo_t *r = &el->el_chared.c_redo; c_redo_t *r = &el->el_chared.c_redo;
uint size; int size;
/* Save entire line for undo */ /* Save entire line for undo */
size = el->el_line.lastchar - el->el_line.buffer; size = el->el_line.lastchar - el->el_line.buffer;
vu->len = size; vu->len = size;
vu->cursor = el->el_line.cursor - el->el_line.buffer; vu->cursor = el->el_line.cursor - el->el_line.buffer;
memcpy(vu->buf, el->el_line.buffer, size); memcpy(vu->buf, el->el_line.buffer, (size_t)size);
/* save command info for redo */ /* save command info for redo */
r->count = el->el_state.doingarg ? el->el_state.argument : 0; r->count = el->el_state.doingarg ? el->el_state.argument : 0;

View file

@ -1,3 +1,14 @@
#include "my_config.h" #include "my_config.h"
#include "sys.h" #include "sys.h"
#define __RCSID(x)
#define __COPYRIGHT(x)
#define __RENAME(x)
#define _DIAGASSERT(x)
#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
#define __attribute__(A)
#endif

View file

@ -33,6 +33,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h"
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
#if 0 #if 0
static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/4/93"; static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/4/93";

View file

@ -34,12 +34,12 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h"
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: vis.c,v 1.22 2002/03/23 17:38:27 christos Exp $"); __RCSID("$NetBSD: vis.c,v 1.22 2002/03/23 17:38:27 christos Exp $");
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#include "config.h"
#include <sys/types.h> #include <sys/types.h>
#include <assert.h> #include <assert.h>
#ifdef HAVE_ALLOCA_H #ifdef HAVE_ALLOCA_H

View file

@ -1345,7 +1345,7 @@ filename_completion_function(const char *text, int state)
/* otherwise, get first entry where first */ /* otherwise, get first entry where first */
/* filename_len characters are equal */ /* filename_len characters are equal */
if (entry->d_name[0] == filename[0] if (entry->d_name[0] == filename[0]
#if defined(__SVR4) || defined(__linux__) #ifndef STRUCT_DIRENT_HAS_D_NAMLEN
&& strlen(entry->d_name) >= filename_len && strlen(entry->d_name) >= filename_len
#else #else
&& entry->d_namlen >= filename_len && entry->d_namlen >= filename_len
@ -1358,7 +1358,7 @@ filename_completion_function(const char *text, int state)
if (entry) { /* match found */ if (entry) { /* match found */
struct stat stbuf; struct stat stbuf;
#if defined(__SVR4) || defined(__linux__) #ifndef STRUCT_DIRENT_HAS_D_NAMLEN
len = strlen(entry->d_name) + len = strlen(entry->d_name) +
#else #else
len = entry->d_namlen + len = entry->d_namlen +

View file

@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(sql/mysqld.cc) AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line! # The Docs Makefile.am parses this line!
AM_INIT_AUTOMAKE(mysql, 4.1.4-gamma) AM_INIT_AUTOMAKE(mysql, 4.1.5-gamma)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
PROTOCOL_VERSION=10 PROTOCOL_VERSION=10
@ -970,8 +970,8 @@ MAX_CXX_OPTIMIZE="-O3"
# workaround for Sun Forte/x86 see BUG#4681 # workaround for Sun Forte/x86 see BUG#4681
case $SYSTEM_TYPE-$MACHINE_TYPE-$ac_cv_prog_gcc in case $SYSTEM_TYPE-$MACHINE_TYPE-$ac_cv_prog_gcc in
*solaris*-i?86-no) *solaris*-i?86-no)
CFLAGS="$CFLAGS -DBIG_FILES" CFLAGS="$CFLAGS -DBIG_TABLES"
CXXFLAGS="$CXXFLAGS -DBIG_FILES" CXXFLAGS="$CXXFLAGS -DBIG_TABLES"
;; ;;
*) ;; *) ;;
esac esac
@ -1863,6 +1863,7 @@ MYSQL_HAVE_TIOCGWINSZ
MYSQL_HAVE_FIONREAD MYSQL_HAVE_FIONREAD
MYSQL_HAVE_TIOCSTAT MYSQL_HAVE_TIOCSTAT
MYSQL_STRUCT_DIRENT_D_INO MYSQL_STRUCT_DIRENT_D_INO
MYSQL_STRUCT_DIRENT_D_NAMLEN
MYSQL_TYPE_SIGHANDLER MYSQL_TYPE_SIGHANDLER
if test "$with_named_curses" = "no" if test "$with_named_curses" = "no"
then then
@ -2400,7 +2401,7 @@ dnl you must also create strings/ctype-$charset_name.c
AC_DIVERT_PUSH(0) AC_DIVERT_PUSH(0)
define(CHARSETS_AVAILABLE0,binary) 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_AVAILABLE2,cp850 cp852 cp866 dec8 euckr gb2312 gbk geostd8)
define(CHARSETS_AVAILABLE3,greek hebrew hp8 keybcs2 koi8r koi8u) define(CHARSETS_AVAILABLE3,greek hebrew hp8 keybcs2 koi8r koi8u)
define(CHARSETS_AVAILABLE4,latin1 latin2 latin5 latin7 macce macroman) define(CHARSETS_AVAILABLE4,latin1 latin2 latin5 latin7 macce macroman)

View file

@ -27,7 +27,7 @@
#define misc_word_char(X) ((X)=='\'') #define misc_word_char(X) ((X)=='\'')
#define word_char(s,X) (true_word_char(s,X) || misc_word_char(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 #define COMPILE_STOPWORDS_IN

View file

@ -2020,12 +2020,14 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
if (sort_param.keyinfo->flag & HA_FULLTEXT) 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= 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_read=sort_ft_key_read;
sort_param.key_write=sort_ft_key_write; 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 else
{ {
@ -2425,7 +2427,11 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info,
total_key_length+=sort_param[i].key_length; total_key_length+=sort_param[i].key_length;
if (sort_param[i].keyinfo->flag & HA_FULLTEXT) 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_info.total_keys=i;
sort_param[0].master= 1; 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)); DBUG_RETURN(sort_write_record(sort_param));
} /* sort_key_read */ } /* sort_key_read */
static int sort_ft_key_read(MI_SORT_PARAM *sort_param, void *key) static int sort_ft_key_read(MI_SORT_PARAM *sort_param, void *key)
{ {
int error; int error;
@ -3950,8 +3955,22 @@ static ha_checksum mi_byte_checksum(const byte *buf, uint length)
return crc; return crc;
} }
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)
{
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));
}
/* /*
Deactive all not unique index that can be recreated fast Deactivate all not unique index that can be recreated fast
These include packed keys on which sorting will use more temporary These include packed keys on which sorting will use more temporary
space than the max allowed file length or for which the unpacked keys space than the max allowed file length or for which the unpacked keys
will take much more space than packed keys. will take much more space than packed keys.
@ -3959,17 +3978,6 @@ static ha_checksum mi_byte_checksum(const byte *buf, uint length)
rows we will put into the file. 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;
return (key->flag & (HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY | HA_FULLTEXT) &&
((ulonglong) rows * key_maxlength >
(ulonglong) myisam_max_temp_length));
}
void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows) void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows)
{ {
MYISAM_SHARE *share=info->s; MYISAM_SHARE *share=info->s;

View file

@ -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 */ /* We have to compare k and vseg as if they where space extended */
for (end=vseg + (len-cmplen) ; for (end=vseg + (len-cmplen) ;
vseg < end && *vseg == (uchar) ' '; vseg < end && *vseg == (uchar) ' ';
vseg++) ; vseg++, matched++) ;
if (vseg == end) DBUG_ASSERT(vseg < end);
goto cmp_rest; /* should never happen */
if (*vseg > (uchar) ' ') if (*vseg > (uchar) ' ')
{ {

View file

@ -154,7 +154,7 @@ enum options_mc {
OPT_KEY_CACHE_BLOCK_SIZE, OPT_MYISAM_BLOCK_SIZE, OPT_KEY_CACHE_BLOCK_SIZE, OPT_MYISAM_BLOCK_SIZE,
OPT_READ_BUFFER_SIZE, OPT_WRITE_BUFFER_SIZE, OPT_SORT_BUFFER_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_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 OPT_MAX_RECORD_LENGTH
}; };

View file

@ -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)) reinit_io_cache(&tempfile,READ_CACHE,0L,0,0))
goto err; /* purecov: inspected */ goto err; /* purecov: inspected */
if (!no_messages) 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 *), if (merge_index(info,keys,sort_keys,dynamic_element(&buffpek,0,BUFFPEK *),
maxbuffer,&tempfile)) maxbuffer,&tempfile))
goto err; /* purecov: inspected */ 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 keyno=info->key;
uint key_length, ref_length=index->s->rec_reflength; 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) || if (flush_io_cache(&tempfile_for_exceptions) ||
reinit_io_cache(&tempfile_for_exceptions,READ_CACHE,0L,0,0)) reinit_io_cache(&tempfile_for_exceptions,READ_CACHE,0L,0,0))
goto err; goto err;

View file

@ -428,6 +428,22 @@ select * from t1 where a='807780' and b='477' and c='165';
a b c a b c
807780 477 165 807780 477 165
drop table t1; 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); create table t1 (a blob);
insert into t1 values('a '),('a'); insert into t1 values('a '),('a');
select concat(a,'.') from t1 where a='a'; select concat(a,'.') from t1 where a='a';

File diff suppressed because it is too large Load diff

View file

@ -212,3 +212,48 @@ select count(*) from t1 where b = 1;
count(*) count(*)
1 1
drop table t1; drop table t1;
CREATE TABLE t1 (
a int unsigned NOT NULL PRIMARY KEY,
b int unsigned,
c int unsigned,
KEY bc(b,c)
) engine = ndb;
insert into t1 values(1,1,1),(2,NULL,2),(3,NULL,NULL),(4,4,NULL);
select * from t1 use index (bc) where b IS NULL;
a b c
3 NULL NULL
2 NULL 2
select * from t1 use index (bc)order by a;
a b c
1 1 1
2 NULL 2
3 NULL NULL
4 4 NULL
select * from t1 use index (bc) order by a;
a b c
1 1 1
2 NULL 2
3 NULL NULL
4 4 NULL
select * from t1 use index (PRIMARY) where b IS NULL order by a;
a b c
2 NULL 2
3 NULL NULL
select * from t1 use index (bc) where b IS NULL order by a;
a b c
2 NULL 2
3 NULL NULL
select * from t1 use index (bc) where b IS NULL and c IS NULL order by a;
a b c
3 NULL NULL
select * from t1 use index (bc) where b IS NULL and c = 2 order by a;
a b c
2 NULL 2
select * from t1 use index (bc) where b < 4 order by a;
a b c
1 1 1
select * from t1 use index (bc) where b IS NOT NULL order by a;
a b c
1 1 1
4 4 NULL
drop table t1;

View file

@ -109,6 +109,68 @@ a b c
3 4 6 3 4 6
drop table t3; drop table t3;
CREATE TABLE t1 ( CREATE TABLE t1 (
pk int NOT NULL PRIMARY KEY,
a int unsigned,
UNIQUE KEY (a)
) engine=ndbcluster;
insert into t1 values (-1,NULL), (0,0), (1,NULL),(2,2),(3,NULL),(4,4);
select * from t1 order by pk;
pk a
-1 NULL
0 0
1 NULL
2 2
3 NULL
4 4
insert into t1 values (5,0);
ERROR 23000: Can't write, because of unique constraint, to table 't1'
select * from t1 order by pk;
pk a
-1 NULL
0 0
1 NULL
2 2
3 NULL
4 4
delete from t1 where a = 0;
insert into t1 values (5,0);
select * from t1 order by pk;
pk a
-1 NULL
1 NULL
2 2
3 NULL
4 4
5 0
CREATE TABLE t2 (
pk int NOT NULL PRIMARY KEY,
a int unsigned,
b tinyint NOT NULL,
c VARCHAR(10),
UNIQUE KEY si(a, c)
) engine=ndbcluster;
insert into t2 values (-1,1,17,NULL),(0,NULL,18,NULL),(1,3,19,'abc');
select * from t2 order by pk;
pk a b c
-1 1 17 NULL
0 NULL 18 NULL
1 3 19 abc
insert into t2 values(2,3,19,'abc');
ERROR 23000: Can't write, because of unique constraint, to table 't2'
select * from t2 order by pk;
pk a b c
-1 1 17 NULL
0 NULL 18 NULL
1 3 19 abc
delete from t2 where c IS NOT NULL;
insert into t2 values(2,3,19,'abc');
select * from t2 order by pk;
pk a b c
-1 1 17 NULL
0 NULL 18 NULL
2 3 19 abc
drop table t1, t2;
CREATE TABLE t1 (
cid smallint(5) unsigned NOT NULL default '0', cid smallint(5) unsigned NOT NULL default '0',
cv varchar(250) NOT NULL default '', cv varchar(250) NOT NULL default '',
PRIMARY KEY (cid), PRIMARY KEY (cid),

View file

@ -11,7 +11,7 @@ insert into t1 (gesuchnr, benutzer_id) value (3,2);
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
insert into t1 (gesuchnr,benutzer_id) values (1,1); insert into t1 (gesuchnr,benutzer_id) values (1,1);
ERROR 23000: Can't write; duplicate key in table 't1' ERROR 23000: Duplicate entry '1-1' for key 1
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
select * from t1 order by gesuchnr; select * from t1 order by gesuchnr;
gesuchnr benutzer_id gesuchnr benutzer_id

View file

@ -241,3 +241,21 @@ prepare stmt1 from "select * from t1 into outfile 'f1.txt'";
execute stmt1; execute stmt1;
deallocate prepare stmt1; deallocate prepare stmt1;
drop table t1; drop table t1;
prepare stmt1 from 'select 1';
prepare STMT1 from 'select 2';
execute sTmT1;
2
2
deallocate prepare StMt1;
deallocate prepare Stmt1;
ERROR HY000: Unknown prepared statement handler (Stmt1) given to DEALLOCATE PREPARE
set names utf8;
prepare `Ăź` from 'select 1234';
execute `Ăź` ;
1234
1234
set names latin1;
execute `ü`;
1234
1234
set names default;

View file

@ -422,6 +422,18 @@ insert into t1 values('807780', '472', '162');
select * from t1 where a='807780' and b='477' and c='165'; select * from t1 where a='807780' and b='477' and c='165';
drop table t1; 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 # Verify blob handling
# #

View file

@ -206,10 +206,6 @@ select * from t4 where a = 7 and b = 16 order by a;
select * from t4 where a = 7 and b = 17 order by a; select * from t4 where a = 7 and b = 17 order by a;
select * from t4 where a = 7 and b != 16 order by b; select * from t4 where a = 7 and b != 16 order by b;
select x1.a, x1.b from t2 x1, t2 x2 where x1.b = x2.b order by x1.a;
select a, b FROM t2 outer_table where
a = (select a from t2 where b = outer_table.b ) order by a;
# #
# update records # update records
# #
@ -225,6 +221,12 @@ while ($1)
} }
enable_query_log; enable_query_log;
delete from t2 where a > 5;
select x1.a, x1.b from t2 x1, t2 x2 where x1.b = x2.b order by x1.a;
select a, b FROM t2 outer_table where
a = (select a from t2 where b = outer_table.b ) order by a;
delete from t2; delete from t2;
delete from t3; delete from t3;
delete from t4; delete from t4;

View file

@ -122,18 +122,22 @@ drop table t1;
# Indexing NULL values # Indexing NULL values
# #
#CREATE TABLE t1 ( CREATE TABLE t1 (
# a int unsigned NOT NULL PRIMARY KEY, a int unsigned NOT NULL PRIMARY KEY,
# b int unsigned, b int unsigned,
# c int unsigned, c int unsigned,
# KEY bc(b,c) KEY bc(b,c)
#) engine = ndb; ) engine = ndb;
#insert into t1 values(1,1,1),(2,NULL,2),(3,NULL,NULL),(4,4,NULL); insert into t1 values(1,1,1),(2,NULL,2),(3,NULL,NULL),(4,4,NULL);
#select * from t1 use index (bc); select * from t1 use index (bc) where b IS NULL;
#select count(*) from t1 use index (bc);
#select count(*) from t1 use index (PRIMARY) where b IS NULL; select * from t1 use index (bc)order by a;
#select count(*) from t1 use index (bc) where b IS NULL; select * from t1 use index (bc) order by a;
#select count(*) from t1 use index (bc) where b IS NULL and c = 2; select * from t1 use index (PRIMARY) where b IS NULL order by a;
#select count(*) from t1 use index (bc) where b IS NOT NULL; select * from t1 use index (bc) where b IS NULL order by a;
#drop table t1; select * from t1 use index (bc) where b IS NULL and c IS NULL order by a;
select * from t1 use index (bc) where b IS NULL and c = 2 order by a;
select * from t1 use index (bc) where b < 4 order by a;
select * from t1 use index (bc) where b IS NOT NULL order by a;
drop table t1;

View file

@ -82,43 +82,43 @@ drop table t3;
# Indexes on NULL-able columns # Indexes on NULL-able columns
# #
#CREATE TABLE t1 ( CREATE TABLE t1 (
# pk int NOT NULL PRIMARY KEY, pk int NOT NULL PRIMARY KEY,
# a int unsigned, a int unsigned,
# UNIQUE KEY (a) UNIQUE KEY (a)
#) engine=ndbcluster; ) engine=ndbcluster;
#insert into t1 values (-1,NULL), (0,0), (1,NULL),(2,2),(3,NULL),(4,4); insert into t1 values (-1,NULL), (0,0), (1,NULL),(2,2),(3,NULL),(4,4);
#select * from t1 order by pk; select * from t1 order by pk;
#--error 1169 --error 1169
#insert into t1 values (5,0); insert into t1 values (5,0);
#select * from t1 order by pk; select * from t1 order by pk;
#delete from t1 where a = 0; delete from t1 where a = 0;
#insert into t1 values (5,0); insert into t1 values (5,0);
#select * from t1 order by pk; select * from t1 order by pk;
#CREATE TABLE t2 ( CREATE TABLE t2 (
# pk int NOT NULL PRIMARY KEY, pk int NOT NULL PRIMARY KEY,
# a int unsigned, a int unsigned,
# b tinyint NOT NULL, b tinyint NOT NULL,
# c VARCHAR(10), c VARCHAR(10),
# UNIQUE KEY si(a, c) UNIQUE KEY si(a, c)
#) engine=ndbcluster; ) engine=ndbcluster;
#insert into t2 values (-1,1,17,NULL),(0,NULL,18,NULL),(1,3,19,'abc'); insert into t2 values (-1,1,17,NULL),(0,NULL,18,NULL),(1,3,19,'abc');
#select * from t2 order by pk; select * from t2 order by pk;
#--error 1169 --error 1169
#insert into t2 values(2,3,19,'abc'); insert into t2 values(2,3,19,'abc');
#select * from t2 order by pk; select * from t2 order by pk;
#delete from t2 where c IS NOT NULL; delete from t2 where c IS NOT NULL;
#insert into t2 values(2,3,19,'abc'); insert into t2 values(2,3,19,'abc');
#select * from t2 order by pk; select * from t2 order by pk;
#drop table t1, t2; drop table t1, t2;
# #
# More complex tables # More complex tables

View file

@ -20,7 +20,7 @@ replace into t1 (gesuchnr,benutzer_id) values (1,1);
insert into t1 (gesuchnr, benutzer_id) value (3,2); insert into t1 (gesuchnr, benutzer_id) value (3,2);
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
--error 1022 --error 1062
insert into t1 (gesuchnr,benutzer_id) values (1,1); insert into t1 (gesuchnr,benutzer_id) values (1,1);
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
select * from t1 order by gesuchnr; select * from t1 order by gesuchnr;

View file

@ -240,3 +240,24 @@ prepare stmt1 from "select * from t1 into outfile 'f1.txt'";
execute stmt1; execute stmt1;
deallocate prepare stmt1; deallocate prepare stmt1;
drop table t1; drop table t1;
#
# BUG#5242 "Prepared statement names are case sensitive"
#
prepare stmt1 from 'select 1';
prepare STMT1 from 'select 2';
execute sTmT1;
deallocate prepare StMt1;
--error 1243
deallocate prepare Stmt1;
# also check that statement names are in right charset.
set names utf8;
prepare `ü` from 'select 1234';
execute `ü` ;
set names latin1;
execute `ü`;
set names default;

View file

@ -144,6 +144,7 @@ static int ndb_to_mysql_error(const NdbError *err)
int ha_ndbcluster::ndb_err(NdbConnection *trans) int ha_ndbcluster::ndb_err(NdbConnection *trans)
{ {
int res;
const NdbError err= trans->getNdbError(); const NdbError err= trans->getNdbError();
if (!err.code) if (!err.code)
return 0; // Don't log things to DBUG log if no error return 0; // Don't log things to DBUG log if no error
@ -161,7 +162,13 @@ int ha_ndbcluster::ndb_err(NdbConnection *trans)
default: default:
break; break;
} }
DBUG_RETURN(ndb_to_mysql_error(&err)); res= ndb_to_mysql_error(&err);
DBUG_PRINT("info", ("transformed ndbcluster error %d to mysql error %d",
err.code, res));
if (res == HA_ERR_FOUND_DUPP_KEY)
dupkey= table->primary_key;
DBUG_RETURN(res);
} }
@ -1075,11 +1082,13 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op,
const key_range *key, const key_range *key,
int bound) int bound)
{ {
uint i, tot_len; uint key_len, key_store_len, tot_len, key_tot_len;
byte *key_ptr; byte *key_ptr;
KEY* key_info= table->key_info + active_index; KEY* key_info= table->key_info + active_index;
KEY_PART_INFO* key_part= key_info->key_part; KEY_PART_INFO* key_part= key_info->key_part;
KEY_PART_INFO* end= key_part+key_info->key_parts; KEY_PART_INFO* end= key_part+key_info->key_parts;
Field* field;
bool key_nullable, key_null;
DBUG_ENTER("set_bounds"); DBUG_ENTER("set_bounds");
DBUG_PRINT("enter", ("bound: %d", bound)); DBUG_PRINT("enter", ("bound: %d", bound));
@ -1089,29 +1098,37 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op,
// Set bounds using key data // Set bounds using key data
tot_len= 0; tot_len= 0;
key_ptr= (byte *) key->key; key_ptr= (byte *) key->key;
key_tot_len= key->length;
for (; key_part != end; key_part++) for (; key_part != end; key_part++)
{ {
Field* field= key_part->field; field= key_part->field;
uint32 field_len= field->pack_length(); key_len= key_part->length;
tot_len+= field_len; key_store_len= key_part->store_length;
key_nullable= (bool) key_part->null_bit;
key_null= (field->maybe_null() && *key_ptr);
tot_len+= key_store_len;
const char* bounds[]= {"LE", "LT", "GE", "GT", "EQ"}; const char* bounds[]= {"LE", "LT", "GE", "GT", "EQ"};
DBUG_ASSERT(bound >= 0 && bound <= 4); DBUG_ASSERT(bound >= 0 && bound <= 4);
DBUG_PRINT("info", ("Set Bound%s on %s", DBUG_PRINT("info", ("Set Bound%s on %s %s %s %s",
bounds[bound], bounds[bound],
field->field_name)); field->field_name,
DBUG_DUMP("key", (char*)key_ptr, field_len); key_nullable ? "NULLABLE" : "",
key_null ? "NULL":""));
DBUG_PRINT("info", ("Total length %ds", tot_len));
DBUG_DUMP("key", (char*) key_ptr, key_store_len);
if (op->setBound(field->field_name, if (op->setBound(field->field_name,
bound, bound,
field->is_null() ? 0 : key_ptr, key_null ? 0 : (key_nullable ? key_ptr + 1 : key_ptr),
field->is_null() ? 0 : field_len) != 0) key_null ? 0 : key_len) != 0)
ERR_RETURN(op->getNdbError()); ERR_RETURN(op->getNdbError());
key_ptr+= field_len; key_ptr+= key_store_len;
if (tot_len >= key->length) if (tot_len >= key_tot_len)
break; break;
/* /*
@ -2157,7 +2174,10 @@ void ha_ndbcluster::info(uint flag)
if (flag & HA_STATUS_VARIABLE) if (flag & HA_STATUS_VARIABLE)
DBUG_PRINT("info", ("HA_STATUS_VARIABLE")); DBUG_PRINT("info", ("HA_STATUS_VARIABLE"));
if (flag & HA_STATUS_ERRKEY) if (flag & HA_STATUS_ERRKEY)
{
DBUG_PRINT("info", ("HA_STATUS_ERRKEY")); DBUG_PRINT("info", ("HA_STATUS_ERRKEY"));
errkey= dupkey;
}
if (flag & HA_STATUS_AUTO) if (flag & HA_STATUS_AUTO)
DBUG_PRINT("info", ("HA_STATUS_AUTO")); DBUG_PRINT("info", ("HA_STATUS_AUTO"));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
@ -2615,7 +2635,7 @@ int ndbcluster_commit(THD *thd, void *ndb_transaction)
const NdbOperation *error_op= trans->getNdbErrorOperation(); const NdbOperation *error_op= trans->getNdbErrorOperation();
ERR_PRINT(err); ERR_PRINT(err);
res= ndb_to_mysql_error(&err); res= ndb_to_mysql_error(&err);
if (res != -1) if (res != -1)
ndbcluster_print_error(res, error_op); ndbcluster_print_error(res, error_op);
} }
ndb->closeTransaction(trans); ndb->closeTransaction(trans);
@ -3108,7 +3128,7 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
m_ndb(NULL), m_ndb(NULL),
m_table(NULL), m_table(NULL),
m_table_flags(HA_REC_NOT_IN_SEQ | m_table_flags(HA_REC_NOT_IN_SEQ |
//HA_NULL_IN_KEY | HA_NULL_IN_KEY |
HA_NOT_EXACT_COUNT | HA_NOT_EXACT_COUNT |
HA_NO_PREFIX_CHAR_KEYS), HA_NO_PREFIX_CHAR_KEYS),
m_use_write(false), m_use_write(false),
@ -3120,7 +3140,8 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
ops_pending(0), ops_pending(0),
skip_auto_increment(true), skip_auto_increment(true),
blobs_buffer(0), blobs_buffer(0),
blobs_buffer_size(0) blobs_buffer_size(0),
dupkey((uint) -1)
{ {
int i; int i;

View file

@ -237,6 +237,7 @@ class ha_ndbcluster: public handler
// memory for blobs in one tuple // memory for blobs in one tuple
char *blobs_buffer; char *blobs_buffer;
uint32 blobs_buffer_size; uint32 blobs_buffer_size;
uint dupkey;
}; };
bool ndbcluster_init(void); bool ndbcluster_init(void);

View file

@ -783,10 +783,10 @@ int key_cmp(KEY_PART_INFO *key_part, const byte *key, uint key_length);
bool init_errmessage(void); bool init_errmessage(void);
void sql_perror(const char *message); void sql_perror(const char *message);
void vprint_msg_to_log( enum loglevel level, const char *format, va_list args ); void vprint_msg_to_log(enum loglevel level, const char *format, va_list args);
void sql_print_error( const char *format, ... ); void sql_print_error(const char *format, ...);
void sql_print_warning( const char *format, ...); void sql_print_warning(const char *format, ...);
void sql_print_information( const char *format, ...); void sql_print_information(const char *format, ...);

View file

@ -762,7 +762,7 @@ void kill_mysql(void)
abort_loop=1; abort_loop=1;
if (pthread_create(&tmp,&connection_attrib, kill_server_thread, if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
(void*) 0)) (void*) 0))
sql_print_error("Error: Can't create thread to kill server"); sql_print_error("Can't create thread to kill server");
} }
#endif #endif
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
@ -791,7 +791,7 @@ static void __cdecl kill_server(int sig_ptr)
abort_loop=1; // This should be set abort_loop=1; // This should be set
signal(sig,SIG_IGN); signal(sig,SIG_IGN);
if (sig == MYSQL_KILL_SIGNAL || sig == 0) 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 else
sql_print_error(ER(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */ 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__ #ifdef __NETWARE__
pthread_join(select_thread, NULL); // wait for main thread pthread_join(select_thread, NULL); // wait for main thread
#endif /* __NETWARE__ */ #endif /* __NETWARE__ */
pthread_exit(0); /* purecov: deadcode */ pthread_exit(0); /* purecov: deadcode */
#endif /* EMBEDDED_LIBRARY */ #endif /* EMBEDDED_LIBRARY */
@ -834,7 +834,7 @@ extern "C" sig_handler print_signal_warning(int sig)
if (!DBUG_IN_USE) if (!DBUG_IN_USE)
{ {
if (global_system_variables.log_warnings) 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()); sig,my_thread_id());
} }
#ifdef DONT_REMEMBER_SIGNAL #ifdef DONT_REMEMBER_SIGNAL
@ -961,7 +961,7 @@ void clean_up(bool print_message)
#endif #endif
if (print_message && errmesg) 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 !defined(__WIN__) && !defined(EMBEDDED_LIBRARY)
if (!opt_bootstrap) if (!opt_bootstrap)
(void) my_delete(pidfile_name,MYF(0)); // This may not always exist (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); struct passwd *user_info= getpwnam(user);
if ((!user_info || user_id != user_info->pw_uid) && if ((!user_info || user_id != user_info->pw_uid) &&
global_system_variables.log_warnings) global_system_variables.log_warnings)
fprintf(stderr, sql_print_warning(
"Warning: One can only use the --user switch if running as root\n"); "One can only use the --user switch if running as root\n");
} }
return; return;
} }
@ -1183,7 +1183,7 @@ static void server_init(void)
if (listen(ip_sock,(int) back_log) < 0) if (listen(ip_sock,(int) back_log) < 0)
{ {
sql_perror("Can't start server: listen() on TCP/IP port"); 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); socket_errno);
unireg_abort(1); unireg_abort(1);
} }
@ -1278,7 +1278,7 @@ static void server_init(void)
(void) chmod(mysqld_unix_port,S_IFSOCK); /* Fix solaris 2.6 bug */ (void) chmod(mysqld_unix_port,S_IFSOCK); /* Fix solaris 2.6 bug */
#endif #endif
if (listen(unix_sock,(int) back_log) < 0) 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); socket_errno);
} }
#endif #endif
@ -1870,7 +1870,7 @@ static void init_signals(void)
struct rlimit rl; struct rlimit rl;
rl.rlim_cur = rl.rlim_max = RLIM_INFINITY; rl.rlim_cur = rl.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &rl) && global_system_variables.log_warnings) 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 #endif
(void) sigemptyset(&set); (void) sigemptyset(&set);
@ -2024,7 +2024,7 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
case SIGQUIT: case SIGQUIT:
case SIGKILL: case SIGKILL:
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
sql_print_error("Got signal %d to shutdown mysqld",sig); sql_print_information("Got signal %d to shutdown mysqld",sig);
#endif #endif
DBUG_PRINT("info",("Got signal: %d abort_loop: %d",sig,abort_loop)); DBUG_PRINT("info",("Got signal: %d abort_loop: %d",sig,abort_loop));
if (!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); my_pthread_attr_setprio(&connection_attrib,INTERRUPT_PRIOR);
if (pthread_create(&tmp,&connection_attrib, kill_server_thread, if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
(void*) sig)) (void*) sig))
sql_print_error("Error: Can't create thread to kill server"); sql_print_error("Can't create thread to kill server");
#else #else
kill_server((void*) sig); // MIT THREAD has a alarm thread kill_server((void*) sig); // MIT THREAD has a alarm thread
#endif #endif
@ -2060,7 +2060,7 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
#endif #endif
default: default:
#ifdef EXTRA_DEBUG #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 #endif
break; /* purecov: tested */ 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", ("Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld",
files, max_connections, table_cache_size)); files, max_connections, table_cache_size));
if (global_system_variables.log_warnings) 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); files, max_connections, table_cache_size);
} }
else if (global_system_variables.log_warnings) 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; open_files_limit= files;
} }
@ -2523,8 +2523,8 @@ static int init_server_components()
} }
else if (opt_log_slave_updates) else if (opt_log_slave_updates)
{ {
sql_print_error("\ sql_print_warning("\
Warning: you need to use --log-bin to make --log-slave-updates work. \ you need to use --log-bin to make --log-slave-updates work. \
Now disabling --log-slave-updates."); Now disabling --log-slave-updates.");
} }
@ -2532,7 +2532,7 @@ Now disabling --log-slave-updates.");
if (opt_log_slave_updates && replicate_same_server_id) if (opt_log_slave_updates && replicate_same_server_id)
{ {
sql_print_error("\ 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 \ --log-slave-updates is impossible, it would lead to infinite loops in this \
server."); server.");
unireg_abort(1); unireg_abort(1);
@ -2561,12 +2561,12 @@ server.");
if (opt_innodb_safe_binlog) if (opt_innodb_safe_binlog)
{ {
if (have_innodb != SHOW_OPTION_YES) 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."); "the InnoDB storage engine is enabled in the server.");
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
if (innobase_flush_log_at_trx_commit != 1) 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 " "innodb_flush_log_at_trx_commit is 1; now setting it "
"to 1."); "to 1.");
innobase_flush_log_at_trx_commit= 1; innobase_flush_log_at_trx_commit= 1;
@ -2578,14 +2578,14 @@ server.");
good (especially "littlesync", and on Windows... see good (especially "littlesync", and on Windows... see
srv/srv0start.c). 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 " "the innodb_flush_method actually synchronizes the "
"InnoDB log to disk; it is your responsibility " "InnoDB log to disk; it is your responsibility "
"to verify that the method you chose does it."); "to verify that the method you chose does it.");
} }
if (sync_binlog_period != 1) 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 " "the global sync_binlog variable is 1; now setting it "
"to 1."); "to 1.");
sync_binlog_period= 1; sync_binlog_period= 1;
@ -2624,7 +2624,7 @@ server.");
if (mlockall(MCL_CURRENT)) if (mlockall(MCL_CURRENT))
{ {
if (global_system_variables.log_warnings) 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; locked_in_memory= 0;
} }
} }
@ -2650,7 +2650,7 @@ static void create_maintenance_thread()
{ {
pthread_t hThread; pthread_t hThread;
if (pthread_create(&hThread,&connection_attrib,handle_manager,0)) 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); hEventShutdown=CreateEvent(0, FALSE, FALSE, shutdown_event_name);
pthread_t hThread; pthread_t hThread;
if (pthread_create(&hThread,&connection_attrib,handle_shutdown,0)) 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 // On "Stop Service" we have to do regular shutdown
Service.SetShutdownEvent(hEventShutdown); Service.SetShutdownEvent(hEventShutdown);
@ -2671,7 +2671,7 @@ static void create_shutdown_thread()
pthread_cond_init(&eventShutdown, NULL); pthread_cond_init(&eventShutdown, NULL);
pthread_t hThread; pthread_t hThread;
if (pthread_create(&hThread,&connection_attrib,handle_shutdown,0)) 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
#endif // EMBEDDED_LIBRARY #endif // EMBEDDED_LIBRARY
} }
@ -2702,7 +2702,7 @@ static void handle_connections_methods()
if (pthread_create(&hThread,&connection_attrib, if (pthread_create(&hThread,&connection_attrib,
handle_connections_namedpipes, 0)) 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--; handler_count--;
} }
} }
@ -2713,7 +2713,7 @@ static void handle_connections_methods()
if (pthread_create(&hThread,&connection_attrib, if (pthread_create(&hThread,&connection_attrib,
handle_connections_sockets, 0)) 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--; handler_count--;
} }
} }
@ -2724,7 +2724,7 @@ static void handle_connections_methods()
if (pthread_create(&hThread,&connection_attrib, if (pthread_create(&hThread,&connection_attrib,
handle_connections_shared_memory, 0)) 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--; handler_count--;
} }
} }
@ -2784,7 +2784,7 @@ int main(int argc, char **argv)
if (stack_size && stack_size < thread_stack) if (stack_size && stack_size < thread_stack)
{ {
if (global_system_variables.log_warnings) 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);
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 (lower_case_table_names_used)
{ {
if (global_system_variables.log_warnings) if (global_system_variables.log_warnings)
sql_print_error("\ sql_print_warning("\
Warning: You have forced lower_case_table_names to 0 through a command-line \ 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 \ 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. \ 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", 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 else
{ {
if (global_system_variables.log_warnings) 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; lower_case_table_names= 2;
} }
} }
@ -2850,14 +2850,14 @@ You should consider changing lower_case_table_names to 1 or 2",
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
switch (server_id) { switch (server_id) {
case 1: case 1:
sql_print_error("\ sql_print_warning("\
Warning: You have enabled the binary log, but you haven't set server-id to \ 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 \ 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."); binary log, but connections from slaves will not be accepted.");
break; break;
case 2: case 2:
sql_print_error("\ sql_print_warning("\
Warning: You should set server-id to a non-0 value if master_host is set; \ 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."); we force server id to 2, but this MySQL server will not act as a slave.");
break; break;
} }
@ -3197,7 +3197,7 @@ static int bootstrap(FILE *file)
if (pthread_create(&thd->real_id,&connection_attrib,handle_bootstrap, if (pthread_create(&thd->real_id,&connection_attrib,handle_bootstrap,
(void*) thd)) (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); DBUG_RETURN(-1);
} }
/* Wait for thread to die */ /* 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)) if (!mysqld_user || !strcmp(mysqld_user, argument))
mysqld_user= argument; mysqld_user= argument;
else 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; break;
case 'L': case 'L':
strmake(language, argument, sizeof(language)-1); 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)); (void) my_delete(buff2, MYF(0));
if ((file= my_create(buff, 0666, O_RDWR, MYF(0))) < 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); DBUG_RETURN(-1);
} }
my_close(file, MYF(0)); my_close(file, MYF(0));

View file

@ -314,4 +314,4 @@ character-set=latin2
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -308,4 +308,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -316,4 +316,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -305,4 +305,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -310,4 +310,4 @@ character-set=latin7
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -305,4 +305,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -317,4 +317,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -305,4 +305,4 @@ character-set=greek
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -307,4 +307,4 @@ character-set=latin2
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -305,4 +305,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -307,4 +307,4 @@ character-set=ujis
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -305,4 +305,4 @@ character-set=euckr
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -307,4 +307,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -307,4 +307,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -309,4 +309,4 @@ character-set=latin2
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -306,4 +306,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -309,4 +309,4 @@ character-set=latin2
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -307,4 +307,4 @@ character-set=koi8r
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -311,4 +311,4 @@ character-set=cp1250
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -313,4 +313,4 @@ character-set=latin2
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -307,4 +307,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -305,4 +305,4 @@ character-set=latin1
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -310,4 +310,4 @@ character-set=koi8u
"Invalid TIMESTAMP value in column '%s' at row %ld", "Invalid TIMESTAMP value in column '%s' at row %ld",
"Invalid %s character string: '%.64s'", "Invalid %s character string: '%.64s'",
"Result of %s() was larger than max_allowed_packet (%ld) - truncated" "Result of %s() was larger than max_allowed_packet (%ld) - truncated"
"Conflicting declarations: '%s' and '%s'" "Conflicting declarations: '%s%s' and '%s%s'"

View file

@ -251,9 +251,9 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{ {
global_system_variables.old_passwords= 1; global_system_variables.old_passwords= 1;
pthread_mutex_unlock(&LOCK_global_system_variables); pthread_mutex_unlock(&LOCK_global_system_variables);
sql_print_error("mysql.user table is not updated to new password format; " sql_print_warning("mysql.user table is not updated to new password format; "
"Disabling new password usage until " "Disabling new password usage until "
"mysql_fix_privilege_tables is run"); "mysql_fix_privilege_tables is run");
} }
thd->variables.old_passwords= 1; thd->variables.old_passwords= 1;
} }

View file

@ -1323,7 +1323,7 @@ void select_dumpvar::cleanup()
Item_arena::Item_arena(THD* thd) Item_arena::Item_arena(THD* thd)
:free_list(0), :free_list(0),
state((int)INITIALIZED) state(INITIALIZED)
{ {
init_sql_alloc(&mem_root, init_sql_alloc(&mem_root,
thd->variables.query_alloc_block_size, thd->variables.query_alloc_block_size,
@ -1335,7 +1335,7 @@ Item_arena::Item_arena(THD* thd)
Item_arena::Item_arena() Item_arena::Item_arena()
:free_list(0), :free_list(0),
state((int)CONVENTIONAL_EXECUTION) state(CONVENTIONAL_EXECUTION)
{ {
clear_alloc_root(&mem_root); clear_alloc_root(&mem_root);
} }
@ -1343,7 +1343,7 @@ Item_arena::Item_arena()
Item_arena::Item_arena(bool init_mem_root) Item_arena::Item_arena(bool init_mem_root)
:free_list(0), :free_list(0),
state((int)INITIALIZED) state(INITIALIZED)
{ {
if (init_mem_root) if (init_mem_root)
clear_alloc_root(&mem_root); clear_alloc_root(&mem_root);
@ -1503,7 +1503,7 @@ Statement_map::Statement_map() :
hash_init(&st_hash, default_charset_info, START_STMT_HASH_SIZE, 0, 0, hash_init(&st_hash, default_charset_info, START_STMT_HASH_SIZE, 0, 0,
get_statement_id_as_hash_key, get_statement_id_as_hash_key,
delete_statement_as_hash_key, MYF(0)); delete_statement_as_hash_key, MYF(0));
hash_init(&names_hash, &my_charset_bin, START_NAME_HASH_SIZE, 0, 0, hash_init(&names_hash, system_charset_info, START_NAME_HASH_SIZE, 0, 0,
(hash_get_key) get_stmt_name_hash_key, (hash_get_key) get_stmt_name_hash_key,
NULL,MYF(0)); NULL,MYF(0));
} }

View file

@ -427,13 +427,13 @@ public:
*/ */
Item *free_list; Item *free_list;
MEM_ROOT mem_root; MEM_ROOT mem_root;
enum enum enum_state
{ {
INITIALIZED= 0, PREPARED= 1, EXECUTED= 3, CONVENTIONAL_EXECUTION= 2, INITIALIZED= 0, PREPARED= 1, EXECUTED= 3, CONVENTIONAL_EXECUTION= 2,
ERROR= -1 ERROR= -1
}; };
int state; enum_state state;
/* We build without RTTI, so dynamic_cast can't be used. */ /* We build without RTTI, so dynamic_cast can't be used. */
enum Type enum Type
@ -447,8 +447,8 @@ public:
virtual Type type() const; virtual Type type() const;
virtual ~Item_arena(); virtual ~Item_arena();
inline bool is_stmt_prepare() 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 == (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 alloc(unsigned int size) { return alloc_root(&mem_root,size); }
inline gptr calloc(unsigned int size) inline gptr calloc(unsigned int size)
{ {

View file

@ -132,7 +132,7 @@ find_prepared_statement(THD *thd, ulong id, const char *where,
{ {
Statement *stmt= thd->stmt_map.find(id); 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]; char llbuf[22];
my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), 22, llstr(id, llbuf), where); 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; sl->prep_where= sl->where;
} }
stmt->state= (int)Prepared_statement::PREPARED; stmt->state= Item_arena::PREPARED;
} }
DBUG_RETURN(!stmt); 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)); DBUG_PRINT("exec_query:", ("%s", stmt->query));
/* Check if we got an error when sending long data */ /* 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); send_error(thd, stmt->last_errno, stmt->last_error);
DBUG_VOID_RETURN; 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). transformations of the query tree (i.e. negations elimination).
This should be done permanently on the parse tree of this statement. 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; thd->current_arena= stmt;
if (!(specialflag & SPECIAL_NO_PRIOR)) 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 that were created during this execution of the PS. */
free_items(thd->free_list); free_items(thd->free_list);
thd->free_list= 0; thd->free_list= 0;
if (stmt->state == (int)Item_arena::PREPARED) if (stmt->state == Item_arena::PREPARED)
{ {
thd->current_arena= thd; thd->current_arena= thd;
stmt->state= (int)Item_arena::EXECUTED; stmt->state= Item_arena::EXECUTED;
} }
cleanup_items(stmt->free_list); cleanup_items(stmt->free_list);
reset_stmt_params(stmt); reset_stmt_params(stmt);
@ -1908,7 +1908,7 @@ void mysql_stmt_reset(THD *thd, char *packet)
SEND_ERROR))) SEND_ERROR)))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
stmt->state= (int)Item_arena::PREPARED; stmt->state= Item_arena::PREPARED;
/* /*
Clear parameters from data which could be set by 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) if (param_number >= stmt->param_count)
{ {
/* Error will be sent in execute call */ /* Error will be sent in execute call */
stmt->state= (int)Item_arena::ERROR; stmt->state= Item_arena::ERROR;
stmt->last_errno= ER_WRONG_ARGUMENTS; stmt->last_errno= ER_WRONG_ARGUMENTS;
sprintf(stmt->last_error, ER(ER_WRONG_ARGUMENTS), sprintf(stmt->last_error, ER(ER_WRONG_ARGUMENTS),
"mysql_stmt_send_long_data"); "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)) if (param->set_longdata(thd->extra_data, thd->extra_length))
#endif #endif
{ {
stmt->state= (int)Item_arena::ERROR; stmt->state= Item_arena::ERROR;
stmt->last_errno= ER_OUTOFMEMORY; stmt->last_errno= ER_OUTOFMEMORY;
sprintf(stmt->last_error, ER(ER_OUTOFMEMORY), 0); sprintf(stmt->last_error, ER(ER_OUTOFMEMORY), 0);
} }

View file

@ -1215,12 +1215,9 @@ default_charset:
cinfo->default_table_charset && $4 && cinfo->default_table_charset && $4 &&
!my_charset_same(cinfo->default_table_charset,$4)) !my_charset_same(cinfo->default_table_charset,$4))
{ {
char cs1[32]; net_printf(YYTHD, ER_CONFLICTING_DECLARATIONS,
char cs2[32]; "CHARACTER SET ", cinfo->default_table_charset->csname,
my_snprintf(cs1, sizeof(cs1), "CHARACTER SET %s", "CHARACTER SET ", $4->csname);
cinfo->default_table_charset->csname);
my_snprintf(cs2, sizeof(cs2), "CHARACTER SET %s", $4->csname);
net_printf(YYTHD, ER_CONFLICTING_DECLARATIONS, cs1, cs2);
YYABORT; YYABORT;
} }
Lex->create_info.default_table_charset= $4; Lex->create_info.default_table_charset= $4;

View file

@ -1560,8 +1560,8 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
if (open_tables(thd, tables_buff, &counter) || if (open_tables(thd, tables_buff, &counter) ||
lock_tables(thd, tables_buff, counter)) lock_tables(thd, tables_buff, counter))
{ {
sql_print_error("Warning: Can't open and lock time zone table: %s " sql_print_warning("Can't open and lock time zone table: %s "
"trying to live without them", thd->net.last_error); "trying to live without them", thd->net.last_error);
/* We will try emulate that everything is ok */ /* We will try emulate that everything is ok */
return_val= time_zone_tables_exist= 0; return_val= time_zone_tables_exist= 0;
goto end_with_setting_default_tz; 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) + if (!(alloc_buff= alloc_root(&tz_storage, sizeof(TIME_ZONE_INFO) +
tz_name->length() + 1))) tz_name->length() + 1)))
{ {
sql_print_error("Error: Out of memory while loading time zone " sql_print_error("Out of memory while loading time zone description");
"description");
return 0; return 0;
} }
tz_info= (TIME_ZONE_INFO *)alloc_buff; 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 Let us find out time zone id by its name (there is only one index
and it is specifically for this purpose). and it is specifically for this purpose).
*/ */
table= tz_tables->table; table= tz_tables->table;
tz_tables= tz_tables->next; tz_tables= tz_tables->next;
table->field[0]->store(tz_name->ptr(), tz_name->length(), &my_charset_latin1); 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, if (table->file->index_read(table->record[0], (byte*)table->field[0]->ptr,
0, HA_READ_KEY_EXACT)) 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; 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 understand whenever this timezone uses leap seconds (again we are
using the only index in this table). using the only index in this table).
*/ */
table= tz_tables->table; table= tz_tables->table;
tz_tables= tz_tables->next; tz_tables= tz_tables->next;
table->field[0]->store((longlong)tzid); table->field[0]->store((longlong)tzid);
(void)table->file->ha_index_init(0); (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, if (table->file->index_read(table->record[0], (byte*)table->field[0]->ptr,
0, HA_READ_KEY_EXACT)) 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; 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? only for our time zone guess what are we doing?
Right - using special index. Right - using special index.
*/ */
table= tz_tables->table; table= tz_tables->table;
tz_tables= tz_tables->next; tz_tables= tz_tables->next;
table->field[0]->store((longlong)tzid); table->field[0]->store((longlong)tzid);
(void)table->file->ha_index_init(0); (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 #endif
sizeof(TRAN_TYPE_INFO) * tz_info->typecnt))) sizeof(TRAN_TYPE_INFO) * tz_info->typecnt)))
{ {
sql_print_error("Error: Out of memory while loading time zone " sql_print_error("Out of memory while loading time zone description");
"description");
goto end; goto end;
} }
@ -1974,12 +1972,12 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
*/ */
if (tz_info->typecnt < 1) 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; goto end;
} }
if (prepare_tz_info(tz_info, &tz_storage)) 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; goto end;
} }
@ -1991,7 +1989,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
&my_charset_latin1), &my_charset_latin1),
my_hash_insert(&tz_names, (const byte *)tmp_tzname))) 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; goto end;
} }

View file

@ -1,15 +1,15 @@
/* Copyright (C) 2000 MySQL AB /* Copyright (C) 2000 MySQL AB
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version. version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details. Library General Public License for more details.
You should have received a copy of the GNU Library General Public You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
@ -1524,7 +1524,7 @@ MY_UNICASE_INFO *uni_plane[256]={
#ifdef HAVE_CHARSET_utf8 #ifdef HAVE_CHARSET_utf8
/* /*
We consider bytes with code more than 127 as a letter. We consider bytes with code more than 127 as a letter.
This garantees that word boundaries work fine with regular This garantees that word boundaries work fine with regular
expressions. Note, there is no need to mark byte 255 as a 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 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)), 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; unsigned char c;
if (s >= e) if (s >= e)
return MY_CS_TOOFEW(0); return MY_CS_TOOFEW(0);
c= s[0]; c= s[0];
if (c < 0x80) if (c < 0x80)
{ {
*pwc = c; *pwc = c;
return 1; return 1;
} }
else if (c < 0xc2) else if (c < 0xc2)
return MY_CS_ILSEQ; 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); return MY_CS_TOOFEW(0);
if (!((s[1] ^ 0x80) < 0x40)) if (!((s[1] ^ 0x80) < 0x40))
return MY_CS_ILSEQ; return MY_CS_ILSEQ;
*pwc = ((my_wc_t) (c & 0x1f) << 6) | (my_wc_t) (s[1] ^ 0x80); *pwc = ((my_wc_t) (c & 0x1f) << 6) | (my_wc_t) (s[1] ^ 0x80);
return 2; return 2;
} }
else if (c < 0xf0) else if (c < 0xf0)
{ {
if (s+3 > e) /* We need 3 characters */ if (s+3 > e) /* We need 3 characters */
return MY_CS_TOOFEW(0); return MY_CS_TOOFEW(0);
if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0))) if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0)))
return MY_CS_ILSEQ; return MY_CS_ILSEQ;
*pwc = ((my_wc_t) (c & 0x0f) << 12) | *pwc = ((my_wc_t) (c & 0x0f) << 12) |
((my_wc_t) (s[1] ^ 0x80) << 6) | ((my_wc_t) (s[1] ^ 0x80) << 6) |
(my_wc_t) (s[2] ^ 0x80); (my_wc_t) (s[2] ^ 0x80);
return 3; return 3;
} }
#ifdef UNICODE_32BIT #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 */ if (s+4 > e) /* We need 4 characters */
return MY_CS_TOOFEW(0); return MY_CS_TOOFEW(0);
if (!((s[1] ^ 0x80) < 0x40 && if (!((s[1] ^ 0x80) < 0x40 &&
(s[2] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 &&
(s[3] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 &&
(c >= 0xf1 || s[1] >= 0x90))) (c >= 0xf1 || s[1] >= 0x90)))
return MY_CS_ILSEQ; return MY_CS_ILSEQ;
*pwc = ((my_wc_t) (c & 0x07) << 18) | *pwc = ((my_wc_t) (c & 0x07) << 18) |
((my_wc_t) (s[1] ^ 0x80) << 12) | ((my_wc_t) (s[1] ^ 0x80) << 12) |
((my_wc_t) (s[2] ^ 0x80) << 6) | ((my_wc_t) (s[2] ^ 0x80) << 6) |
(my_wc_t) (s[3] ^ 0x80); (my_wc_t) (s[3] ^ 0x80);
return 4; 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 */ if (s+5 >e) /* We need 5 characters */
return MY_CS_TOOFEW(0); return MY_CS_TOOFEW(0);
if (!((s[1] ^ 0x80) < 0x40 && if (!((s[1] ^ 0x80) < 0x40 &&
(s[2] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 &&
(s[3] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 &&
(s[4] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 &&
(c >= 0xf9 || s[1] >= 0x88))) (c >= 0xf9 || s[1] >= 0x88)))
return MY_CS_ILSEQ; 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[1] ^ 0x80) << 18) |
((my_wc_t) (s[2] ^ 0x80) << 12) | ((my_wc_t) (s[2] ^ 0x80) << 12) |
((my_wc_t) (s[3] ^ 0x80) << 6) | ((my_wc_t) (s[3] ^ 0x80) << 6) |
(my_wc_t) (s[4] ^ 0x80); (my_wc_t) (s[4] ^ 0x80);
return 5; 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 */ if ( s+6 >e ) /* We need 6 characters */
return MY_CS_TOOFEW(0); return MY_CS_TOOFEW(0);
if (!((s[1] ^ 0x80) < 0x40 && if (!((s[1] ^ 0x80) < 0x40 &&
(s[2] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 &&
(s[3] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 &&
(s[4] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 &&
(s[5] ^ 0x80) < 0x40 && (s[5] ^ 0x80) < 0x40 &&
(c >= 0xfd || s[1] >= 0x84))) (c >= 0xfd || s[1] >= 0x84)))
return MY_CS_ILSEQ; return MY_CS_ILSEQ;
*pwc = ((my_wc_t) (c & 0x01) << 30) *pwc = ((my_wc_t) (c & 0x01) << 30)
| ((my_wc_t) (s[1] ^ 0x80) << 24) | ((my_wc_t) (s[1] ^ 0x80) << 24)
| ((my_wc_t) (s[2] ^ 0x80) << 18) | ((my_wc_t) (s[2] ^ 0x80) << 18)
@ -1702,12 +1711,12 @@ static int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) ,
if (r >= e) if (r >= e)
return MY_CS_TOOSMALL; return MY_CS_TOOSMALL;
if (wc < 0x80) if (wc < 0x80)
count = 1; count = 1;
else if (wc < 0x800) else if (wc < 0x800)
count = 2; count = 2;
else if (wc < 0x10000) else if (wc < 0x10000)
count = 3; count = 3;
#ifdef UNICODE_32BIT #ifdef UNICODE_32BIT
else if (wc < 0x200000) else if (wc < 0x200000)
@ -1718,15 +1727,15 @@ static int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) ,
count = 6; count = 6;
#endif #endif
else return MY_CS_ILUNI; 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 ) Because of it (r+count > e), not (r+count-1 >e )
*/ */
if ( r+count > e ) if ( r+count > e )
return MY_CS_TOOSMALL; return MY_CS_TOOSMALL;
switch (count) { switch (count) {
/* Fall through all cases!!! */ /* Fall through all cases!!! */
#ifdef UNICODE_32BIT #ifdef UNICODE_32BIT
case 6: r[5] = (uchar) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x4000000; 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, static int my_strnncoll_utf8(CHARSET_INFO *cs,
const uchar *s, uint slen, const uchar *s, uint slen,
const uchar *t, uint tlen, const uchar *t, uint tlen,
my_bool t_is_prefix) my_bool t_is_prefix)
{ {
@ -1821,13 +1830,13 @@ static int my_strnncoll_utf8(CHARSET_INFO *cs,
int plane; int plane;
s_res=my_utf8_uni(cs,&s_wc, s, se); s_res=my_utf8_uni(cs,&s_wc, s, se);
t_res=my_utf8_uni(cs,&t_wc, t, te); t_res=my_utf8_uni(cs,&t_wc, t, te);
if ( s_res <= 0 || t_res <= 0 ) if ( s_res <= 0 || t_res <= 0 )
{ {
/* Incorrect string, compare by char value */ /* Incorrect string, compare byte by byte value */
return ((int)s[0]-(int)t[0]); return bincmp(s, se, t, te);
} }
plane=(s_wc>>8) & 0xFF; plane=(s_wc>>8) & 0xFF;
s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc; s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc;
plane=(t_wc>>8) & 0xFF; plane=(t_wc>>8) & 0xFF;
@ -1836,7 +1845,7 @@ static int my_strnncoll_utf8(CHARSET_INFO *cs,
{ {
return ((int) s_wc) - ((int) t_wc); return ((int) s_wc) - ((int) t_wc);
} }
s+=s_res; s+=s_res;
t+=t_res; t+=t_res;
} }
@ -1850,11 +1859,11 @@ static int my_strnncoll_utf8(CHARSET_INFO *cs,
SYNOPSIS SYNOPSIS
my_strnncollsp_utf8() my_strnncollsp_utf8()
cs character set handler cs character set handler
a First string to compare a First string to compare
a_length Length of 'a' a_length Length of 'a'
b Second string to compare b Second string to compare
b_length Length of 'b' b_length Length of 'b'
IMPLEMENTATION IMPLEMENTATION
If one string is shorter as the other, then we space extend the other 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 " "a\0" < "a "
RETURN 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, static int my_strnncollsp_utf8(CHARSET_INFO *cs,
const uchar *s, uint slen, const uchar *s, uint slen,
const uchar *t, uint tlen) const uchar *t, uint tlen)
{ {
int s_res,t_res; int s_res,t_res;
my_wc_t s_wc,t_wc; my_wc_t s_wc,t_wc;
const uchar *se= s+slen; const uchar *se= s+slen;
const uchar *te= t+tlen; const uchar *te= t+tlen;
while ( s < se && t < te ) while ( s < se && t < te )
{ {
int plane; int plane;
s_res=my_utf8_uni(cs,&s_wc, s, se); s_res=my_utf8_uni(cs,&s_wc, s, se);
t_res=my_utf8_uni(cs,&t_wc, t, te); t_res=my_utf8_uni(cs,&t_wc, t, te);
if ( s_res <= 0 || t_res <= 0 ) if ( s_res <= 0 || t_res <= 0 )
{ {
/* Incorrect string, compare by char value */ /* Incorrect string, compare byte by byte value */
return ((int)s[0]-(int)t[0]); return bincmp(s, se, t, te);
} }
plane=(s_wc>>8) & 0xFF; plane=(s_wc>>8) & 0xFF;
s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc; s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc;
plane=(t_wc>>8) & 0xFF; plane=(t_wc>>8) & 0xFF;
@ -1901,14 +1910,14 @@ static int my_strnncollsp_utf8(CHARSET_INFO *cs,
{ {
return ((int) s_wc) - ((int) t_wc); return ((int) s_wc) - ((int) t_wc);
} }
s+=s_res; s+=s_res;
t+=t_res; t+=t_res;
} }
slen= se-s; slen= se-s;
tlen= te-t; tlen= te-t;
if (slen != tlen) if (slen != tlen)
{ {
int swap= 0; int swap= 0;
@ -1940,35 +1949,35 @@ static int my_strnncollsp_utf8(CHARSET_INFO *cs,
static int my_strncasecmp_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; int s_res,t_res;
my_wc_t s_wc,t_wc; my_wc_t s_wc,t_wc;
const char *se=s+len; const char *se=s+len;
const char *te=t+len; const char *te=t+len;
while ( s < se && t < te ) while ( s < se && t < te )
{ {
int plane; int plane;
s_res=my_utf8_uni(cs,&s_wc, (const uchar*)s, (const uchar*)se); 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); t_res=my_utf8_uni(cs,&t_wc, (const uchar*)t, (const uchar*)te);
if ( s_res <= 0 || t_res <= 0 ) if ( s_res <= 0 || t_res <= 0 )
{ {
/* Incorrect string, compare by char value */ /* Incorrect string, compare byte by byte value */
return ((int)s[0]-(int)t[0]); return bincmp(s, se, t, te);
} }
plane=(s_wc>>8) & 0xFF; plane=(s_wc>>8) & 0xFF;
s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].tolower : s_wc; s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].tolower : s_wc;
plane=(t_wc>>8) & 0xFF; plane=(t_wc>>8) & 0xFF;
t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].tolower : t_wc; t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].tolower : t_wc;
if ( s_wc != t_wc ) if ( s_wc != t_wc )
return ((int) s_wc) - ((int) t_wc); return ((int) s_wc) - ((int) t_wc);
s+=s_res; s+=s_res;
t+=t_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); return my_strncasecmp_utf8(cs, s, t, len);
} }
static int my_strnxfrm_utf8(CHARSET_INFO *cs, static int my_strnxfrm_utf8(CHARSET_INFO *cs,
uchar *dst, uint dstlen, uchar *dst, uint dstlen,
const uchar *src, uint srclen) const uchar *src, uint srclen)
{ {
my_wc_t wc; my_wc_t wc;
int res; int res;
@ -2002,10 +2011,10 @@ static int my_strnxfrm_utf8(CHARSET_INFO *cs,
} }
src+=res; src+=res;
srclen-=res; srclen-=res;
plane=(wc>>8) & 0xFF; plane=(wc>>8) & 0xFF;
wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].sort : wc; wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].sort : wc;
if ((res=my_uni_utf8(cs,wc,dst,de)) <0) if ((res=my_uni_utf8(cs,wc,dst,de)) <0)
{ {
break; break;
@ -2026,18 +2035,18 @@ static int my_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)) , uint c)
{ {
if (c < 0x80) if (c < 0x80)
return 1; return 1;
else if (c < 0xc2) else if (c < 0xc2)
return 0; /* Illegal mb head */ return 0; /* Illegal mb head */
else if (c < 0xe0) else if (c < 0xe0)
return 2; return 2;
else if (c < 0xf0) else if (c < 0xf0)
return 3; return 3;
#ifdef UNICODE_32BIT #ifdef UNICODE_32BIT
else if (c < 0xf8) else if (c < 0xf8)
return 4; return 4;
else if (c < 0xfc) else if (c < 0xfc)
return 5; return 5;
else if (c < 0xfe) else if (c < 0xfe)
return 6; return 6;
#endif #endif
return 0; /* Illegal mb head */; 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 = static MY_COLLATION_HANDLER my_collation_ci_handler =
{ {
NULL, /* init */ NULL, /* init */
my_strnncoll_utf8, my_strnncoll_utf8,
my_strnncollsp_utf8, my_strnncollsp_utf8,
my_strnxfrm_utf8, my_strnxfrm_utf8,
@ -2059,7 +2068,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
MY_CHARSET_HANDLER my_charset_utf8_handler= MY_CHARSET_HANDLER my_charset_utf8_handler=
{ {
NULL, /* init */ NULL, /* init */
my_ismbchar_utf8, my_ismbchar_utf8,
my_mbcharlen_utf8, my_mbcharlen_utf8,
my_numchars_mb, my_numchars_mb,
@ -2089,27 +2098,27 @@ MY_CHARSET_HANDLER my_charset_utf8_handler=
CHARSET_INFO my_charset_utf8_general_ci= CHARSET_INFO my_charset_utf8_general_ci=
{ {
33,0,0, /* number */ 33,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */
"utf8", /* cs name */ "utf8", /* cs name */
"utf8_general_ci", /* name */ "utf8_general_ci", /* name */
"", /* comment */ "", /* comment */
NULL, /* tailoring */ NULL, /* tailoring */
ctype_utf8, /* ctype */ ctype_utf8, /* ctype */
to_lower_utf8, /* to_lower */ to_lower_utf8, /* to_lower */
to_upper_utf8, /* to_upper */ to_upper_utf8, /* to_upper */
to_upper_utf8, /* sort_order */ to_upper_utf8, /* sort_order */
NULL, /* contractions */ NULL, /* contractions */
NULL, /* sort_order_big*/ NULL, /* sort_order_big*/
NULL, /* tab_to_uni */ NULL, /* tab_to_uni */
NULL, /* tab_from_uni */ NULL, /* tab_from_uni */
NULL, /* state_map */ NULL, /* state_map */
NULL, /* ident_map */ NULL, /* ident_map */
1, /* strxfrm_multiply */ 1, /* strxfrm_multiply */
1, /* mbminlen */ 1, /* mbminlen */
3, /* mbmaxlen */ 3, /* mbmaxlen */
0, /* min_sort_char */ 0, /* min_sort_char */
255, /* max_sort_char */ 255, /* max_sort_char */
&my_charset_utf8_handler, &my_charset_utf8_handler,
&my_collation_ci_handler &my_collation_ci_handler
}; };
@ -2117,27 +2126,27 @@ CHARSET_INFO my_charset_utf8_general_ci=
CHARSET_INFO my_charset_utf8_bin= CHARSET_INFO my_charset_utf8_bin=
{ {
83,0,0, /* number */ 83,0,0, /* number */
MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE, /* state */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE, /* state */
"utf8", /* cs name */ "utf8", /* cs name */
"utf8_bin", /* name */ "utf8_bin", /* name */
"", /* comment */ "", /* comment */
NULL, /* tailoring */ NULL, /* tailoring */
ctype_utf8, /* ctype */ ctype_utf8, /* ctype */
to_lower_utf8, /* to_lower */ to_lower_utf8, /* to_lower */
to_upper_utf8, /* to_upper */ to_upper_utf8, /* to_upper */
NULL, /* sort_order */ NULL, /* sort_order */
NULL, /* contractions */ NULL, /* contractions */
NULL, /* sort_order_big*/ NULL, /* sort_order_big*/
NULL, /* tab_to_uni */ NULL, /* tab_to_uni */
NULL, /* tab_from_uni */ NULL, /* tab_from_uni */
NULL, /* state_map */ NULL, /* state_map */
NULL, /* ident_map */ NULL, /* ident_map */
1, /* strxfrm_multiply */ 1, /* strxfrm_multiply */
1, /* mbminlen */ 1, /* mbminlen */
3, /* mbmaxlen */ 3, /* mbmaxlen */
0, /* min_sort_char */ 0, /* min_sort_char */
255, /* max_sort_char */ 255, /* max_sort_char */
&my_charset_utf8_handler, &my_charset_utf8_handler,
&my_collation_mb_bin_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); int len=my_mbcharlen_utf8(cs,*s);
while(len--) while(len--)
{ {
printf("%c",*s); printf("%c",*s);
s++; s++;
} }
printf("\n"); printf("\n");
} }
@ -2172,23 +2181,23 @@ int main()
{ {
char str[1024]=" utf8 test проба ПЕРА по-РУССКИ"; char str[1024]=" utf8 test проба ПЕРА по-РУССКИ";
CHARSET_INFO *cs; CHARSET_INFO *cs;
test_mb(cs,(uchar*)str); test_mb(cs,(uchar*)str);
printf("orig :'%s'\n",str); printf("orig :'%s'\n",str);
my_caseup_utf8(cs,str,15); my_caseup_utf8(cs,str,15);
printf("caseup :'%s'\n",str); printf("caseup :'%s'\n",str);
my_caseup_str_utf8(cs,str); my_caseup_str_utf8(cs,str);
printf("caseup_str:'%s'\n",str); printf("caseup_str:'%s'\n",str);
my_casedn_utf8(cs,str,15); my_casedn_utf8(cs,str,15);
printf("casedn :'%s'\n",str); printf("casedn :'%s'\n",str);
my_casedn_str_utf8(cs,str); my_casedn_str_utf8(cs,str);
printf("casedn_str:'%s'\n",str); printf("casedn_str:'%s'\n",str);
return 0; return 0;
} }