diff options
-rw-r--r-- | Docs/manual.texi | 4 | ||||
-rw-r--r-- | acinclude.m4 | 4 | ||||
-rw-r--r-- | client/mysql.cc | 19 | ||||
-rw-r--r-- | client/mysqladmin.c | 2 | ||||
-rw-r--r-- | client/mysqltest.c | 7 | ||||
-rw-r--r-- | include/my_pthread.h | 5 | ||||
-rw-r--r-- | include/my_sys.h | 5 | ||||
-rw-r--r-- | include/mysql.h | 19 | ||||
-rw-r--r-- | libmysql/libmysql.c | 16 | ||||
-rw-r--r-- | mysys/my_static.h | 7 | ||||
-rw-r--r-- | mysys/my_thr_init.c | 47 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 5 | ||||
-rw-r--r-- | sql/net_pkg.cc | 10 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 |
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 */ |