summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Docs/manual.texi4
-rw-r--r--acinclude.m44
-rw-r--r--client/mysql.cc19
-rw-r--r--client/mysqladmin.c2
-rw-r--r--client/mysqltest.c7
-rw-r--r--include/my_pthread.h5
-rw-r--r--include/my_sys.h5
-rw-r--r--include/mysql.h19
-rw-r--r--libmysql/libmysql.c16
-rw-r--r--mysys/my_static.h7
-rw-r--r--mysys/my_thr_init.c47
-rw-r--r--sql/item_cmpfunc.cc5
-rw-r--r--sql/net_pkg.cc10
-rw-r--r--sql/sql_parse.cc2
14 files changed, 74 insertions, 78 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi
index 93447f9072f..8bfd6aca44e 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -32537,7 +32537,7 @@ mysql> select MD5("testing");
This is an "RSA Data Security, Inc. MD5 Message-Digest Algorithm".
@findex DES_ENCRYPT()
-@item DES_ENCRYPT(string_to_encrypt, flag, [, (key_number | key_string) ] )
+@item DES_ENCRYPT(string_to_encrypt [, (key_number | key_string) ] )
Encrypts the string with the given key using the DES algorithm, which
provides strong encryption.
@@ -48931,6 +48931,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet
@item
+Don't give an error for @code{CREATE TABLE ...(... VARCHAR(0))}.
+@item
Fixed @code{SIGINT} and @code{SIGQUIT} problems in @file{mysql.cc} on Linux
with some @code{glibc} versions.
@item
diff --git a/acinclude.m4 b/acinclude.m4
index 85149d64dc7..9c5fbfbbb78 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -703,14 +703,14 @@ AC_DEFUN(MYSQL_CHECK_VIO, [
AC_DEFUN(MYSQL_FIND_OPENSSL, [
for d in /usr/ssl/include /usr/local/ssl/include /usr/include/openssl \
/usr/include/ssl /opt/ssl/include /opt/openssl/include \
-/usr/local/ssl/include/openssl ; do
+/usr/local/ssl/include/openssl /usr/local/include/openssl ; do
if test -f $d/ssl.h ; then
OPENSSL_INCLUDE=$d
fi
done
for d in /usr/ssl/lib /usr/local/ssl/lib /usr/lib/openssl \
-/usr/lib /opt/ssl/lib /opt/openssl/lib ; do
+/usr/lib /opt/ssl/lib /opt/openssl/lib /usr/local/lib/ ; do
if test -f $d/libssl.a ; then
OPENSSL_LIB=$d
fi
diff --git a/client/mysql.cc b/client/mysql.cc
index edb6738463e..be776997059 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -2340,7 +2340,7 @@ static int
com_status(String *buffer __attribute__((unused)),
char *line __attribute__((unused)))
{
- char *status;
+ const char *status;
tee_puts("--------------", stdout);
usage(1); /* Print version */
if (connected)
@@ -2635,18 +2635,21 @@ static const char* construct_prompt() {
processed_prompt.append(current_db ? current_db : "(none)");
break;
case 'h':
- if (strstr(mysql_get_host_info(&mysql),"Localhost")) {
+ {
+ const char *prompt=mysql_get_host_info(&mysql);
+ if (strstr(prompt, "Localhost"))
processed_prompt.append("localhost");
- }
- else {
- processed_prompt.append(strtok(mysql_get_host_info(&mysql)," "));
+ else
+ {
+ const char *end=strcend(prompt,' ');
+ processed_prompt.append(prompt, (uint) (end-prompt));
}
break;
+ }
case 'p':
- if (strstr(mysql_get_host_info(&mysql),"TCP/IP")
- || ! mysql.unix_socket) {
+ if (strstr(mysql_get_host_info(&mysql),"TCP/IP") ||
+ ! mysql.unix_socket)
add_int_to_prompt(mysql.port);
- }
else
processed_prompt.append(strrchr(mysql.unix_socket,'/')+1);
break;
diff --git a/client/mysqladmin.c b/client/mysqladmin.c
index f6ebffea087..17a453adbdf 100644
--- a/client/mysqladmin.c
+++ b/client/mysqladmin.c
@@ -400,7 +400,7 @@ static my_bool sql_connect(MYSQL *mysql,const char *host, const char *user,
static int execute_commands(MYSQL *mysql,int argc, char **argv)
{
- char *status;
+ const char *status;
for (; argc > 0 ; argv++,argc--)
{
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 4ae74d129b9..a007c7778e0 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -268,7 +268,7 @@ struct st_replace;
struct st_replace *init_replace(my_string *from, my_string *to, uint count,
my_string word_end_chars);
uint replace_strings(struct st_replace *rep, my_string *start,
- uint *max_length, my_string from);
+ uint *max_length, const char *from);
void free_replace();
static int insert_pointer_name(reg1 POINTER_ARRAY *pa,my_string name);
void free_pointer_array(POINTER_ARRAY *pa);
@@ -2041,7 +2041,8 @@ void reject_dump(const char* record_file, char* buf, int size)
/* Append the string to ds, with optional replace */
-static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, char *val, int len)
+static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val,
+ int len)
{
if (glob_replace)
{
@@ -3236,7 +3237,7 @@ static uint replace_len(my_string str)
/* Replace strings; Return length of result string */
uint replace_strings(REPLACE *rep, my_string *start,uint *max_length,
- my_string from)
+ const char *from)
{
reg1 REPLACE *rep_pos;
reg2 REPLACE_STRING *rep_str;
diff --git a/include/my_pthread.h b/include/my_pthread.h
index 4ca42339897..cfc1ea326f4 100644
--- a/include/my_pthread.h
+++ b/include/my_pthread.h
@@ -602,6 +602,11 @@ struct st_my_thread_var
extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const));
#define my_thread_var (_my_thread_var())
#define my_errno my_thread_var->thr_errno
+/*
+ Keep track of shutdown,signal, and main threads so that my_end() will not
+ report errors with them
+*/
+extern pthread_t shutdown_th, main_th, signal_th;
/* statistics_xxx functions are for not essential statistic */
diff --git a/include/my_sys.h b/include/my_sys.h
index 3950bfce758..5867368198f 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -137,10 +137,7 @@ extern int NEAR my_errno; /* Last error in mysys */
#define NORMAL_SAFEMALLOC sf_malloc_quick=0
extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick;
extern ulonglong safemalloc_mem_limit;
-/* keep track of shutdown,signal, and main threads so that my_end() will not
- report errors with them
-*/
-extern pthread_t shutdown_th, main_th,signal_th;
+
#define CALLER_INFO_PROTO , const char *sFile, uint uLine
#define CALLER_INFO , __FILE__, __LINE__
#define ORIG_CALLER_INFO , sFile, uLine
diff --git a/include/mysql.h b/include/mysql.h
index 074ea0a1876..7a16cbbe1d2 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -272,15 +272,15 @@ my_bool STDCALL mysql_eof(MYSQL_RES *res);
MYSQL_FIELD *STDCALL mysql_fetch_field_direct(MYSQL_RES *res,
unsigned int fieldnr);
MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res);
-MYSQL_ROWS * STDCALL mysql_row_tell(MYSQL_RES *res);
-unsigned int STDCALL mysql_field_tell(MYSQL_RES *res);
+MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res);
+MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res);
unsigned int STDCALL mysql_field_count(MYSQL *mysql);
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);
my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql);
unsigned int STDCALL mysql_errno(MYSQL *mysql);
-char * STDCALL mysql_error(MYSQL *mysql);
-char * STDCALL mysql_info(MYSQL *mysql);
+const char * STDCALL mysql_error(MYSQL *mysql);
+const char * STDCALL mysql_info(MYSQL *mysql);
unsigned long STDCALL mysql_thread_id(MYSQL *mysql);
const char * STDCALL mysql_character_set_name(MYSQL *mysql);
@@ -353,10 +353,10 @@ int STDCALL mysql_refresh(MYSQL *mysql,
unsigned int refresh_options);
int STDCALL mysql_kill(MYSQL *mysql,unsigned long pid);
int STDCALL mysql_ping(MYSQL *mysql);
-char * STDCALL mysql_stat(MYSQL *mysql);
-char * STDCALL mysql_get_server_info(MYSQL *mysql);
-char * STDCALL mysql_get_client_info(void);
-char * STDCALL mysql_get_host_info(MYSQL *mysql);
+const char * STDCALL mysql_stat(MYSQL *mysql);
+const char * STDCALL mysql_get_server_info(MYSQL *mysql);
+const char * STDCALL mysql_get_client_info(void);
+const char * STDCALL mysql_get_host_info(MYSQL *mysql);
unsigned int STDCALL mysql_get_proto_info(MYSQL *mysql);
MYSQL_RES * STDCALL mysql_list_dbs(MYSQL *mysql,const char *wild);
MYSQL_RES * STDCALL mysql_list_tables(MYSQL *mysql,const char *wild);
@@ -370,7 +370,8 @@ int STDCALL mysql_options(MYSQL *mysql,enum mysql_option option,
void STDCALL mysql_free_result(MYSQL_RES *result);
void STDCALL mysql_data_seek(MYSQL_RES *result,
my_ulonglong offset);
-MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET);
+MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result,
+ MYSQL_ROW_OFFSET offset);
MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result,
MYSQL_FIELD_OFFSET offset);
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 31b0ea0fb53..f861f3c96c5 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -2673,7 +2673,7 @@ mysql_dump_debug_info(MYSQL *mysql)
DBUG_RETURN(simple_command(mysql,COM_DEBUG,0,0,0));
}
-char * STDCALL
+const char * STDCALL
mysql_stat(MYSQL *mysql)
{
DBUG_ENTER("mysql_stat");
@@ -2698,14 +2698,14 @@ mysql_ping(MYSQL *mysql)
}
-char * STDCALL
+const char * STDCALL
mysql_get_server_info(MYSQL *mysql)
{
return((char*) mysql->server_version);
}
-char * STDCALL
+const char * STDCALL
mysql_get_host_info(MYSQL *mysql)
{
return(mysql->host_info);
@@ -2718,7 +2718,7 @@ mysql_get_proto_info(MYSQL *mysql)
return (mysql->protocol_version);
}
-char * STDCALL
+const char * STDCALL
mysql_get_client_info(void)
{
return (char*) MYSQL_SERVER_VERSION;
@@ -2803,12 +2803,12 @@ MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res)
return (res)->fields;
}
-MYSQL_ROWS * STDCALL mysql_row_tell(MYSQL_RES *res)
+MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res)
{
return res->data_cursor;
}
-uint STDCALL mysql_field_tell(MYSQL_RES *res)
+MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res)
{
return (res)->current_field;
}
@@ -2835,12 +2835,12 @@ uint STDCALL mysql_errno(MYSQL *mysql)
return mysql->net.last_errno;
}
-char * STDCALL mysql_error(MYSQL *mysql)
+const char * STDCALL mysql_error(MYSQL *mysql)
{
return mysql->net.last_error;
}
-char *STDCALL mysql_info(MYSQL *mysql)
+const char *STDCALL mysql_info(MYSQL *mysql)
{
return mysql->info;
}
diff --git a/mysys/my_static.h b/mysys/my_static.h
index ca384009063..88faf24ce82 100644
--- a/mysys/my_static.h
+++ b/mysys/my_static.h
@@ -57,10 +57,11 @@ extern const char *soundex_map;
extern USED_MEM* my_once_root_block;
extern uint my_once_extra;
-/* these threads are exept from safemalloc leak scrutiny unless
- PEDANTIC_SAFEMALLOC is defined
+/*
+ These threads are exept from safemalloc leak scrutiny unless
+ PEDANTIC_SAFEMALLOC is defined
*/
-extern pthread_t signal_thread,kill_thread;
+extern pthread_t signal_thread, kill_thread;
#ifndef HAVE_TEMPNAM
extern int _my_tempnam_used;
diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c
index 2c7fd098c63..5b137df20f8 100644
--- a/mysys/my_thr_init.c
+++ b/mysys/my_thr_init.c
@@ -111,6 +111,7 @@ my_bool my_thread_init(void)
#if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX)
pthread_mutex_lock(&THR_LOCK_lock);
#endif
+
#if !defined(__WIN__) || defined(USE_TLS)
if (my_pthread_getspecific(struct st_my_thread_var *,THR_KEY_mysys))
{
@@ -121,17 +122,8 @@ my_bool my_thread_init(void)
pthread_mutex_unlock(&THR_LOCK_lock);
return 0; /* Safequard */
}
- /* We must have many calloc() here because these are freed on
- pthread_exit */
- /*
- Sasha: the above comment does not make sense. I have changed calloc() to
- equivalent my_malloc() but it was calloc() before. It seems like the
- comment is out of date - we always call my_thread_end() before
- pthread_exit() to clean up. Note that I have also fixed up DBUG
- code to be able to call it from my_thread_init()
- */
if (!(tmp=(struct st_my_thread_var *)
- my_malloc(sizeof(struct st_my_thread_var),MYF(MY_WME|MY_ZEROFILL))))
+ calloc(1, sizeof(struct st_my_thread_var))))
{
pthread_mutex_unlock(&THR_LOCK_lock);
return 1;
@@ -139,21 +131,18 @@ my_bool my_thread_init(void)
pthread_setspecific(THR_KEY_mysys,tmp);
#else
- /* Sasha: TODO - explain what exactly we are doing on Windows
- At first glance, I have a hard time following the code
- */
- if (THR_KEY_mysys.id) /* Already initialized */
- {
-#if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX)
- pthread_mutex_unlock(&THR_LOCK_lock);
-#endif
- return 0;
- }
+ /*
+ Skip initialization if the thread specific variable is already initialized
+ */
+ if (THR_KEY_mysys.id)
+ goto end;
tmp= &THR_KEY_mysys;
#endif
tmp->id= ++thread_id;
pthread_mutex_init(&tmp->mutex,MY_MUTEX_INIT_FAST);
pthread_cond_init(&tmp->suspend, NULL);
+
+end:
#if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX)
pthread_mutex_unlock(&THR_LOCK_lock);
#endif
@@ -170,11 +159,7 @@ void my_thread_end(void)
if (tmp)
{
#if !defined(DBUG_OFF)
- /* Sasha: tmp->dbug is allocated inside DBUG library
- so for now we will not mess with trying to use my_malloc()/
- my_free(), but in the future it would be nice to figure out a
- way to do it
- */
+ /* tmp->dbug is allocated inside DBUG library */
if (tmp->dbug)
{
free(tmp->dbug);
@@ -186,15 +171,13 @@ void my_thread_end(void)
#endif
pthread_mutex_destroy(&tmp->mutex);
#if (!defined(__WIN__) && !defined(OS2)) || defined(USE_TLS)
- /* we need to setspecific to 0 BEFORE we call my_free, as my_free
- uses some DBUG_ macros that will use the follow the specific
- pointer after the block it is pointing to has been freed if
- specific does not get reset first
- */
- pthread_setspecific(THR_KEY_mysys,0);
- my_free((gptr)tmp,MYF(MY_WME));
+ free(tmp);
#endif
}
+ /* The following free has to be done, even if my_thread_var() is 0 */
+#if (!defined(__WIN__) && !defined(OS2)) || defined(USE_TLS)
+ pthread_setspecific(THR_KEY_mysys,0);
+#endif
}
struct st_my_thread_var *_my_thread_var(void)
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 0c83698e60a..bb773af1ddf 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -790,8 +790,9 @@ String *Item_func_coalesce::val_str(String *str)
null_value=0;
for (uint i=0 ; i < arg_count ; i++)
{
- if (args[i]->val_str(str) != NULL)
- return args[i]->val_str(str);
+ String *res;
+ if ((res=args[i]->val_str(str)))
+ return res;
}
null_value=1;
return 0;
diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc
index 9e52e4580e6..1ab3e18424f 100644
--- a/sql/net_pkg.cc
+++ b/sql/net_pkg.cc
@@ -108,10 +108,12 @@ net_printf(NET *net, uint errcode, ...)
thd->query_error = 1; // if we are here, something is wrong :-)
query_cache_abort(net); // Safety
va_start(args,errcode);
- // Sasha: this is needed to make net_printf() work with 0 argument for
- // errorcode and use the argument after that as the format string. This
- // is usefull for rare errors that are not worth the hassle to put in
- // errmsg.sys, but at the same time, the message is not fixed text
+ /*
+ The following is needed to make net_printf() work with 0 argument for
+ errorcode and use the argument after that as the format string. This
+ is useful for rare errors that are not worth the hassle to put in
+ errmsg.sys, but at the same time, the message is not fixed text
+ */
format=errcode ? ER(errcode) : va_arg(args,char*);
offset= net->return_errno ? 2 : 0;
text_pos=(char*) net->buff+head_length+offset+1;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 7f4553459f1..dc89888a1a5 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2990,7 +2990,7 @@ bool add_field_to_list(char *field_name, enum_field_types type,
if (new_field->length >= MAX_FIELD_WIDTH ||
(!new_field->length && !(new_field->flags & BLOB_FLAG) &&
- type != FIELD_TYPE_STRING))
+ type != FIELD_TYPE_STRING && type != FIELD_TYPE_VAR_STRING))
{
net_printf(&thd->net,ER_TOO_BIG_FIELDLENGTH,field_name,
MAX_FIELD_WIDTH-1); /* purecov: inspected */