summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@donna.mysql.com>2001-02-20 22:34:47 +0200
committerunknown <monty@donna.mysql.com>2001-02-20 22:34:47 +0200
commit62884b8f36e2bdb7dffd43fe65b7ac17025e6abe (patch)
treef87e7ff2aa4e7016660a9275fe538c9ce99b6dfe
parentdc7eafea57a321c92716b5b84c574a0347ade74f (diff)
downloadmariadb-git-62884b8f36e2bdb7dffd43fe65b7ac17025e6abe.tar.gz
Added max_user_connections
Fixes for Innobase Don't reset whole to-buffer in strxnmov BUILD/compile-pentium-debug: Added innobase include/mysqld_error.h: New error messages innobase/configure.in: Update from heikki innobase/include/lock0types.h: Update from heikki innobase/include/os0sync.h: Update from heikki innobase/include/sync0types.h: Update from heikki innobase/os/os0file.c: Update from heikki innobase/srv/srv0start.c: Update from heikki sql/ha_innobase.cc: Update from Heikki Changed assert -> dbug_assert Changed return -> DBUG_RETURN sql/mysql_priv.h: Added max_user_connections sql/mysqld.cc: Added max_user_connections sql/share/czech/errmsg.txt: Added max_user_connections sql/share/danish/errmsg.txt: Added max_user_connections sql/share/dutch/errmsg.txt: Added max_user_connections sql/share/english/errmsg.txt: Added max_user_connections sql/share/estonian/errmsg.txt: Added max_user_connections sql/share/french/errmsg.txt: Added max_user_connections sql/share/german/errmsg.txt: Added max_user_connections sql/share/greek/errmsg.txt: Added max_user_connections sql/share/hungarian/errmsg.txt: Added max_user_connections sql/share/italian/errmsg.txt: Added max_user_connections sql/share/japanese/errmsg.txt: Added max_user_connections sql/share/korean/errmsg.txt: Added max_user_connections sql/share/norwegian-ny/errmsg.txt: Added max_user_connections sql/share/norwegian/errmsg.txt: Added max_user_connections sql/share/polish/errmsg.txt: Added max_user_connections sql/share/portuguese/errmsg.txt: Added max_user_connections sql/share/romanian/errmsg.txt: Added max_user_connections sql/share/russian/errmsg.txt: Added max_user_connections sql/share/slovak/errmsg.txt: Added max_user_connections sql/share/spanish/errmsg.txt: Added max_user_connections sql/share/swedish/errmsg.OLD: Added max_user_connections sql/share/swedish/errmsg.txt: Added max_user_connections sql/sql_class.h: cleanup strings/str_test.c: Added tests for strxnmov strings/strxnmov.c: Don't reset whole to buffer
-rwxr-xr-xBUILD/compile-pentium-debug2
-rw-r--r--include/mysqld_error.h3
-rw-r--r--innobase/configure.in3
-rw-r--r--innobase/include/lock0types.h1
-rw-r--r--innobase/include/os0sync.h8
-rw-r--r--innobase/include/sync0types.h1
-rw-r--r--innobase/os/os0file.c5
-rw-r--r--innobase/srv/srv0start.c16
-rw-r--r--sql/ha_innobase.cc114
-rw-r--r--sql/mysql_priv.h2
-rw-r--r--sql/mysqld.cc16
-rw-r--r--sql/share/czech/errmsg.txt1
-rw-r--r--sql/share/danish/errmsg.txt1
-rw-r--r--sql/share/dutch/errmsg.txt1
-rw-r--r--sql/share/english/errmsg.txt1
-rw-r--r--sql/share/estonian/errmsg.txt1
-rw-r--r--sql/share/french/errmsg.txt1
-rw-r--r--sql/share/german/errmsg.txt1
-rw-r--r--sql/share/greek/errmsg.txt1
-rw-r--r--sql/share/hungarian/errmsg.txt1
-rw-r--r--sql/share/italian/errmsg.txt1
-rw-r--r--sql/share/japanese/errmsg.txt1
-rw-r--r--sql/share/korean/errmsg.txt1
-rw-r--r--sql/share/norwegian-ny/errmsg.txt1
-rw-r--r--sql/share/norwegian/errmsg.txt1
-rw-r--r--sql/share/polish/errmsg.txt1
-rw-r--r--sql/share/portuguese/errmsg.txt1
-rw-r--r--sql/share/romanian/errmsg.txt1
-rw-r--r--sql/share/russian/errmsg.txt1
-rw-r--r--sql/share/slovak/errmsg.txt1
-rw-r--r--sql/share/spanish/errmsg.txt1
-rw-r--r--sql/share/swedish/errmsg.OLD6
-rw-r--r--sql/share/swedish/errmsg.txt11
-rw-r--r--sql/sql_class.h6
-rw-r--r--strings/str_test.c24
-rw-r--r--strings/strxnmov.c24
36 files changed, 175 insertions, 87 deletions
diff --git a/BUILD/compile-pentium-debug b/BUILD/compile-pentium-debug
index 45305661806..85d06c77886 100755
--- a/BUILD/compile-pentium-debug
+++ b/BUILD/compile-pentium-debug
@@ -11,7 +11,7 @@ extra_configs="$pentium_configs $debug_configs"
# Use the debug version if it exists
if test -d /usr/local/BerkeleyDB-dbug/
then
- extra_configs="$extra_configs --with-berkeley-db=/usr/local/BerkeleyDB-dbug/"
+ extra_configs="$extra_configs --with-berkeley-db=/usr/local/BerkeleyDB-dbug/ --with-innobase"
fi
. "$path/FINISH.sh"
diff --git a/include/mysqld_error.h b/include/mysqld_error.h
index c84b0c08c77..d322d8cb993 100644
--- a/include/mysqld_error.h
+++ b/include/mysqld_error.h
@@ -203,4 +203,5 @@
#define ER_BAD_SLAVE 1200
#define ER_MASTER_INFO 1201
#define ER_SLAVE_THREAD 1202
-#define ER_ERROR_MESSAGES 203
+#define ER_TOO_MANY_USER_CONNECTIONS 1203
+#define ER_ERROR_MESSAGES 204
diff --git a/innobase/configure.in b/innobase/configure.in
index 1289f881344..ba95df0cc8c 100644
--- a/innobase/configure.in
+++ b/innobase/configure.in
@@ -1,5 +1,6 @@
# Process this file with autoconf to produce a configure script
-AC_INIT(./os/os0file.c)
+AC_INIT
+AM_MAINTAINER_MODE
AM_CONFIG_HEADER(ib_config.h)
AM_INIT_AUTOMAKE(ib, 0.90)
AC_PROG_CC
diff --git a/innobase/include/lock0types.h b/innobase/include/lock0types.h
index 705e64f6581..6c3e54ee1fc 100644
--- a/innobase/include/lock0types.h
+++ b/innobase/include/lock0types.h
@@ -9,6 +9,7 @@ Created 5/7/1996 Heikki Tuuri
#ifndef lock0types_h
#define lock0types_h
+#define lock_t ib_lock_t
typedef struct lock_struct lock_t;
typedef struct lock_sys_struct lock_sys_t;
diff --git a/innobase/include/os0sync.h b/innobase/include/os0sync.h
index dcf519fdb9d..3201a12b0a7 100644
--- a/innobase/include/os0sync.h
+++ b/innobase/include/os0sync.h
@@ -25,8 +25,8 @@ struct os_event_struct {
fields */
ibool is_set; /* this is TRUE if the next mutex is
not reserved */
- os_fast_mutex_t wait_mutex; /* this mutex is used in waiting for
- the event */
+ pthread_cond_t cond_var; /* condition variable is used in
+ waiting for the event */
};
typedef struct os_event_struct os_event_struct_t;
typedef os_event_struct_t* os_event_t;
@@ -190,9 +190,9 @@ os_fast_mutex_free(
/*===============*/
os_fast_mutex_t* fast_mutex); /* in: mutex to free */
#endif
-
+
#ifndef UNIV_NONINL
#include "os0sync.ic"
#endif
-#endif
+#endif
diff --git a/innobase/include/sync0types.h b/innobase/include/sync0types.h
index 2c31f80cca3..57478426f25 100644
--- a/innobase/include/sync0types.h
+++ b/innobase/include/sync0types.h
@@ -9,6 +9,7 @@ Created 9/5/1995 Heikki Tuuri
#ifndef sync0types_h
#define sync0types_h
+#define mutex_t ib_mutex_t
typedef struct mutex_struct mutex_t;
diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c
index 7851b83732d..f155e15ac49 100644
--- a/innobase/os/os0file.c
+++ b/innobase/os/os0file.c
@@ -316,8 +316,11 @@ try_again:
UT_NOT_USED(purpose);
if (create_mode == OS_FILE_CREATE) {
-
+#ifndef S_IRWXU
+ file = open(name, create_flag);
+#else
file = open(name, create_flag, S_IRWXU | S_IRWXG | S_IRWXO);
+#endif
} else {
file = open(name, create_flag);
}
diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c
index f627e5d6aa5..a3e94b63e37 100644
--- a/innobase/srv/srv0start.c
+++ b/innobase/srv/srv0start.c
@@ -56,6 +56,9 @@ Created 2/16/1996 Heikki Tuuri
#include "srv0start.h"
#include "que0que.h"
+ibool srv_is_being_started = FALSE;
+ibool srv_was_started = FALSE;
+
ibool measure_cont = FALSE;
os_file_t files[1000];
@@ -443,6 +446,8 @@ innobase_start_or_create_for_mysql(void)
log_do_write = TRUE;
/* yydebug = TRUE; */
+ srv_is_being_started = TRUE;
+
os_aio_use_native_aio = srv_use_native_aio;
err = srv_boot();
@@ -676,6 +681,9 @@ innobase_start_or_create_for_mysql(void)
thread_ids + 2 + SRV_MAX_N_IO_THREADS);
fprintf(stderr, "Innobase: Started\n");
+ srv_was_started = TRUE;
+ srv_is_being_started = FALSE;
+
sync_order_checks_on = TRUE;
/* buf_debug_prints = TRUE; */
@@ -691,6 +699,14 @@ innobase_shutdown_for_mysql(void)
/*=============================*/
/* out: DB_SUCCESS or error code */
{
+ if (!srv_was_started) {
+ if (srv_is_being_started) {
+ fprintf(stderr,
+ "Innobase: Warning: shutting down not properly started database\n");
+ }
+ return(DB_SUCCESS);
+ }
+
/* Flush buffer pool to disk, write the current lsn to
the tablespace header(s), and copy all log data to archive */
diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc
index 4b33c7b87ae..5116d6ef07f 100644
--- a/sql/ha_innobase.cc
+++ b/sql/ha_innobase.cc
@@ -172,9 +172,9 @@ convert_error_code_to_mysql(
return(HA_ERR_TO_BIG_ROW);
} else {
- assert(0);
+ dbug_assert(0);
- return(0);
+ return(-1); // Unknown error
}
}
@@ -194,7 +194,7 @@ check_trx_exists(
trx = (trx_t*) thd->transaction.all.innobase_tid;
if (trx == NULL) {
- assert(thd != NULL);
+ dbug_assert(thd != NULL);
trx = trx_allocate_for_mysql();
thd->transaction.all.innobase_tid = trx;
@@ -418,31 +418,41 @@ innobase_init(void)
int err;
bool ret;
ibool test_bool;
-
+ static char *current_dir[3];
DBUG_ENTER("innobase_init");
- test_bool = TRUE;
- assert(test_bool == 1);
- test_bool = FALSE;
- assert(test_bool == 0);
+ /* Use current_dir if no paths are set */
+ current_dir[0]=FN_CURLIB;
+ current_dir[1]=FN_LIBCHAR;
+ current_dir[2]=0;
/* Set Innobase initialization parameters according to the values
read from MySQL .cnf file */
- srv_data_home = innobase_data_home_dir;
+ if (!innobase_data_file_path)
+ {
+ fprintf(stderr,"Can't initialize innobase as 'innobase_data_file_path' is not set\n");
+ DBUG_RETURN(TRUE);
+ }
+
+ srv_data_home = (innobase_data_home_dir ? innobase_data_home_dir :
+ current_dir);
srv_logs_home = "";
- srv_arch_dir = innobase_log_arch_dir;
+ srv_arch_dir = (innobase_log_arch_dir ? innobase_log_arch_dir :
+ current_dir);
ret = innobase_parse_data_file_paths_and_sizes();
if (ret == FALSE) {
- return(TRUE);
+ DBUG_RETURN(TRUE);
}
+ if (!innobase_log_group_home_dir)
+ innobase_log_group_home_dir= current_dir;
ret = innobase_parse_log_group_home_dirs();
if (ret == FALSE) {
- return(TRUE);
+ DBUG_RETURN(TRUE);
}
srv_n_log_groups = (ulint) innobase_mirrored_log_groups;
@@ -466,12 +476,12 @@ innobase_init(void)
if (err != DB_SUCCESS) {
- return(1);
+ DBUG_RETURN(1);
}
(void) hash_init(&innobase_open_tables,32,0,0,
(hash_get_key) innobase_get_key,0,0);
pthread_mutex_init(&innobase_mutex,NULL);
- return(0);
+ DBUG_RETURN(0);
}
/***********************************************************************
@@ -490,10 +500,10 @@ innobase_end(void)
if (err != DB_SUCCESS) {
- return(1);
+ DBUG_RETURN(1);
}
- return(0);
+ DBUG_RETURN(0);
}
/********************************************************************
@@ -666,7 +676,7 @@ normalize_table_name(
/* Scan name from the end */
- ptr = (char*) name + strlen(name) - 1;
+ ptr = strend(name)-1;
while (ptr >= name && *ptr != '\\' && *ptr != '/') {
ptr--;
@@ -674,7 +684,7 @@ normalize_table_name(
name_ptr = ptr + 1;
- assert(ptr > name);
+ dbug_assert(ptr > name);
ptr--;
@@ -770,7 +780,7 @@ ha_innobase::open(
((row_prebuilt_t*)innobase_prebuilt)
->clust_index_was_generated = TRUE;
- assert(key_used_on_scan == MAX_KEY);
+ dbug_assert(key_used_on_scan == MAX_KEY);
}
/* Init table lock structure */
@@ -911,8 +921,8 @@ innobase_mysql_cmp(
{
enum_field_types mysql_tp;
- assert(a_length != UNIV_SQL_NULL);
- assert(b_length != UNIV_SQL_NULL);
+ dbug_assert(a_length != UNIV_SQL_NULL);
+ dbug_assert(b_length != UNIV_SQL_NULL);
mysql_tp = (enum_field_types) mysql_type;
@@ -943,11 +953,11 @@ get_innobase_type_from_mysql_type(
8 bits: this is used in ibuf and also when DATA_NOT_NULL is
ORed to the type */
- assert((ulint)FIELD_TYPE_STRING < 256);
- assert((ulint)FIELD_TYPE_VAR_STRING < 256);
- assert((ulint)FIELD_TYPE_DOUBLE < 256);
- assert((ulint)FIELD_TYPE_FLOAT < 256);
- assert((ulint)FIELD_TYPE_DECIMAL < 256);
+ dbug_assert((ulint)FIELD_TYPE_STRING < 256);
+ dbug_assert((ulint)FIELD_TYPE_VAR_STRING < 256);
+ dbug_assert((ulint)FIELD_TYPE_DOUBLE < 256);
+ dbug_assert((ulint)FIELD_TYPE_FLOAT < 256);
+ dbug_assert((ulint)FIELD_TYPE_DECIMAL < 256);
switch (field->type()) {
case FIELD_TYPE_VAR_STRING: if (field->flags & BINARY_FLAG) {
@@ -1072,6 +1082,14 @@ build_template(
templ_type = ROW_MYSQL_WHOLE_ROW;
}
+ if (prebuilt->select_lock_type == LOCK_X) {
+ /* TODO: should fix the code in sql_update so that we could do
+ with fetching only the needed columns */
+
+ templ_type = ROW_MYSQL_WHOLE_ROW;
+ }
+
+
if (templ_type == ROW_MYSQL_REC_FIELDS) {
if (prebuilt->select_lock_type != LOCK_NONE) {
@@ -1288,9 +1306,9 @@ calc_row_difference(
uint n_fields;
ulint o_len;
ulint n_len;
- mysql_byte* o_ptr;
- mysql_byte* n_ptr;
- mysql_byte* buf;
+ byte* o_ptr;
+ byte* n_ptr;
+ byte* buf;
upd_field_t* ufield;
ulint col_type;
ulint is_unsigned;
@@ -1300,7 +1318,7 @@ calc_row_difference(
n_fields = table->fields;
/* We use upd_buff to convert changed fields */
- buf = upd_buff;
+ buf = (byte*) upd_buff;
for (i = 0; i < n_fields; i++) {
field = table->field[i];
@@ -1312,8 +1330,8 @@ calc_row_difference(
goto skip_field;
}
- o_ptr = old_row + get_field_offset(table, field);
- n_ptr = new_row + get_field_offset(table, field);
+ o_ptr = (byte*) old_row + get_field_offset(table, field);
+ n_ptr = (byte*) new_row + get_field_offset(table, field);
o_len = field->pack_length();
n_len = field->pack_length();
@@ -1353,8 +1371,10 @@ calc_row_difference(
ufield = uvect->fields + n_changed;
- buf = innobase_convert_and_store_changed_col(ufield,
- buf, n_ptr, n_len, col_type,
+ buf = (byte*)
+ innobase_convert_and_store_changed_col(ufield,
+ (mysql_byte*)buf,
+ (mysql_byte*)n_ptr, n_len, col_type,
is_unsigned);
ufield->exp = NULL;
ufield->field_no =
@@ -1580,7 +1600,7 @@ ha_innobase::index_read(
last_match_mode = match_mode;
- ret = row_search_for_mysql(buf, mode, prebuilt, match_mode, 0);
+ ret = row_search_for_mysql((byte*) buf, mode, prebuilt, match_mode, 0);
if (ret == DB_SUCCESS) {
error = 0;
@@ -1690,7 +1710,8 @@ ha_innobase::general_fetch(
DBUG_ENTER("general_fetch");
- ret = row_search_for_mysql(buf, 0, prebuilt, match_mode, direction);
+ ret = row_search_for_mysql((byte*)buf, 0, prebuilt,
+ match_mode, direction);
if (ret == DB_SUCCESS) {
error = 0;
@@ -1935,7 +1956,7 @@ ha_innobase::position(
len = store_key_val_for_row(primary_key, (char*) ref, record);
}
- assert(len <= ref_length);
+ dbug_assert(len <= ref_length);
ref_stored_len = len;
}
@@ -2174,23 +2195,14 @@ ha_innobase::create(
int primary_key_no = -1;
KEY* key;
uint i;
- char name2[1000];
- char norm_name[1000];
+ char name2[FN_REFLEN];
+ char norm_name[FN_REFLEN];
DBUG_ENTER("ha_innobase::create");
trx = trx_allocate_for_mysql();
- name_len = strlen(name);
-
- assert(name_len < 1000);
- assert(name_len > 4);
-
- memcpy(name2, name, name_len);
-
- /* Erase the .frm end from table name: */
-
- name2[name_len - 4] = '\0';
+ fn_format(name2, name, "", "",2); // Remove the .frm extension
normalize_table_name(norm_name, name2);
@@ -2550,11 +2562,11 @@ ha_innobase::update_table_comment(
char *str=my_malloc(length + 50,MYF(0));
if (!str)
- return comment;
+ return (char*)comment;
sprintf(str,"%s Innobase free: %lu kB", comment,innobase_get_free_space());
- return str;
+ return((char*) str);
}
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 4e324704a31..b0a10830663 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -231,6 +231,8 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list);
bool mysql_change_db(THD *thd,const char *name);
void mysql_parse(THD *thd,char *inBuf,uint length);
void mysql_init_select(LEX *lex);
+void init_max_user_conn(void);
+void free_max_user_conn(void);
pthread_handler_decl(handle_one_connection,arg);
pthread_handler_decl(handle_bootstrap,arg);
sig_handler end_thread_signal(int sig);
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index ca5d3bc7540..4c04ae335e7 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -263,7 +263,7 @@ ulong select_full_range_join_count,select_full_join_count;
ulong specialflag=0,opened_tables=0,created_tmp_tables=0,
created_tmp_disk_tables=0;
ulong max_connections,max_insert_delayed_threads,max_used_connections,
- max_connect_errors;
+ max_connect_errors, max_user_connections = 0;
ulong thread_id=1L,current_pid;
ulong slow_launch_threads = 0;
char mysql_real_data_home[FN_REFLEN],
@@ -295,7 +295,8 @@ pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count,
LOCK_error_log,
LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create,
LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received,
- LOCK_binlog_update, LOCK_slave, LOCK_server_id;
+ LOCK_binlog_update, LOCK_slave, LOCK_server_id,
+ LOCK_user_conn;
pthread_cond_t COND_refresh,COND_thread_count,COND_binlog_update,
COND_slave_stopped, COND_slave_start;
@@ -647,6 +648,7 @@ void clean_up(void)
my_free(mysql_tmpdir,MYF(0));
x_free(opt_bin_logname);
bitmap_free(&temp_pool);
+ free_max_user_conn();
#ifndef __WIN__
if (!opt_bootstrap)
(void) my_delete(pidfile_name,MYF(0)); // This may not always exist
@@ -1576,6 +1578,7 @@ int main(int argc, char **argv)
(void) pthread_mutex_init(&LOCK_binlog_update, NULL);
(void) pthread_mutex_init(&LOCK_slave, NULL);
(void) pthread_mutex_init(&LOCK_server_id, NULL);
+ (void) pthread_mutex_init(&LOCK_user_conn, NULL);
(void) pthread_cond_init(&COND_binlog_update, NULL);
(void) pthread_cond_init(&COND_slave_stopped, NULL);
(void) pthread_cond_init(&COND_slave_start, NULL);
@@ -1765,6 +1768,8 @@ The server will not act as a slave.");
}
if (!opt_noacl)
(void) grant_init();
+ if (max_user_connections)
+ init_max_user_conn();
#ifdef HAVE_DLOPEN
if (!opt_noacl)
@@ -2625,6 +2630,8 @@ CHANGEABLE_VAR changeable_vars[] = {
1024, 4, 8192*1024L, 0, 1 },
{ "max_tmp_tables", (long*) &max_tmp_tables,
32, 1, ~0L, 0, 1 },
+ { "max_user_connections", (long*) &max_user_connections,
+ 0, 1, ~0L, 0, 1 },
{ "max_write_lock_count", (long*) &max_write_lock_count,
~0L, 1, ~0L, 0, 1 },
{ "myisam_sort_buffer_size", (long*) &myisam_sort_buffer_size,
@@ -2720,6 +2727,7 @@ struct show_var_st init_vars[]= {
{"max_heap_table_size", (char*) &max_heap_table_size, SHOW_LONG},
{"max_join_size", (char*) &max_join_size, SHOW_LONG},
{"max_sort_length", (char*) &max_item_sort_length, SHOW_LONG},
+ {"max_user_connections", (char*) &max_user_connections, SHOW_LONG},
{"max_tmp_tables", (char*) &max_tmp_tables, SHOW_LONG},
{"max_write_lock_count", (char*) &max_write_lock_count, SHOW_LONG},
{"myisam_recover_options", (char*) &myisam_recover_options_str, SHOW_CHAR_PTR},
@@ -3843,6 +3851,10 @@ static int get_service_parameters()
{
SET_CHANGEABLE_VARVAL( "max_connections" );
}
+ else if ( lstrcmp(szKeyValueName, TEXT("MaxUserConnections")) == 0 )
+ {
+ SET_CHANGEABLE_VARVAL( "max_user_connections" );
+ }
else if ( lstrcmp(szKeyValueName, TEXT("MaxConnectErrors")) == 0 )
{
SET_CHANGEABLE_VARVAL( "max_connect_errors" );
diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt
index 319d8a88149..0ba76ca4ff2 100644
--- a/sql/share/czech/errmsg.txt
+++ b/sql/share/czech/errmsg.txt
@@ -213,3 +213,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt
index 43aad2f71e4..eb2a5dc3dd2 100644
--- a/sql/share/danish/errmsg.txt
+++ b/sql/share/danish/errmsg.txt
@@ -207,3 +207,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt
index 74bc2fe992d..3ef00cf0837 100644
--- a/sql/share/dutch/errmsg.txt
+++ b/sql/share/dutch/errmsg.txt
@@ -204,3 +204,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt
index 941e7f434ea..5148b25e4cf 100644
--- a/sql/share/english/errmsg.txt
+++ b/sql/share/english/errmsg.txt
@@ -204,3 +204,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt
index 227b6336562..f42b5209ea6 100644
--- a/sql/share/estonian/errmsg.txt
+++ b/sql/share/estonian/errmsg.txt
@@ -208,3 +208,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt
index 594da49c32e..949a12a52b3 100644
--- a/sql/share/french/errmsg.txt
+++ b/sql/share/french/errmsg.txt
@@ -204,3 +204,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt
index 621cef7affa..89401557f6c 100644
--- a/sql/share/german/errmsg.txt
+++ b/sql/share/german/errmsg.txt
@@ -207,3 +207,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt
index dfaea718fb1..f9018013875 100644
--- a/sql/share/greek/errmsg.txt
+++ b/sql/share/greek/errmsg.txt
@@ -204,3 +204,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt
index a6388ed624e..c81466104a7 100644
--- a/sql/share/hungarian/errmsg.txt
+++ b/sql/share/hungarian/errmsg.txt
@@ -206,3 +206,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt
index f182608798e..25dd252797e 100644
--- a/sql/share/italian/errmsg.txt
+++ b/sql/share/italian/errmsg.txt
@@ -204,3 +204,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt
index 04b411239ae..008303c3cf5 100644
--- a/sql/share/japanese/errmsg.txt
+++ b/sql/share/japanese/errmsg.txt
@@ -206,3 +206,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt
index e1efb0c15ae..231d00b44b2 100644
--- a/sql/share/korean/errmsg.txt
+++ b/sql/share/korean/errmsg.txt
@@ -204,3 +204,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt
index 5484b58425e..50a3345351d 100644
--- a/sql/share/norwegian-ny/errmsg.txt
+++ b/sql/share/norwegian-ny/errmsg.txt
@@ -206,3 +206,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt
index 4db4af5457f..b31429fca0d 100644
--- a/sql/share/norwegian/errmsg.txt
+++ b/sql/share/norwegian/errmsg.txt
@@ -206,3 +206,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt
index 5e90cf05b8e..d8126917c1b 100644
--- a/sql/share/polish/errmsg.txt
+++ b/sql/share/polish/errmsg.txt
@@ -208,3 +208,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt
index 33618a0e671..c1f4595f1b2 100644
--- a/sql/share/portuguese/errmsg.txt
+++ b/sql/share/portuguese/errmsg.txt
@@ -204,3 +204,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt
index 115bcc299f2..235493e538d 100644
--- a/sql/share/romanian/errmsg.txt
+++ b/sql/share/romanian/errmsg.txt
@@ -208,3 +208,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt
index d3564e5ef5b..c08c471e9e1 100644
--- a/sql/share/russian/errmsg.txt
+++ b/sql/share/russian/errmsg.txt
@@ -207,3 +207,4 @@
"üÔÏÔ ÓÅÒ×ÅÒ ÎÅ slave, ÉÓÐÒÁ×ØÔÅ × ËÏÎÆÉÇÕÒÁÃÉÏÎÎÏÍ ÆÁÊÌÅ ÉÌÉ ËÏÍÍÁÎÄÏÊ CHANGE MASTER TO",
"îÅ ÐÏÌÕÞÉÌÏÓØ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÓÔÒÕËÔÕÒÕ master info, ÐÒÏ×ÅÒÔÅ persmissions ÎÁ ÆÁÊÌÅ master.info",
"îÅ ÍÏÇÕ ÓÏÚÄÁÔØ ÐÒÏÃÅÓÓ SLAVE, ÐÒÏ×ÅÒØÔÅ ÓÉÓÔÅÍÎÙÅ ÒÅÓÕÒÓÙ",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt
index 82817fff7d6..c80e30bb775 100644
--- a/sql/share/slovak/errmsg.txt
+++ b/sql/share/slovak/errmsg.txt
@@ -212,3 +212,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt
index 50c5f4ea8c1..641ac3e1dce 100644
--- a/sql/share/spanish/errmsg.txt
+++ b/sql/share/spanish/errmsg.txt
@@ -205,3 +205,4 @@
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info",
"Could not create slave thread, check system resources",
+"User %-.64s has already more than 'max_user_connections' active connections",
diff --git a/sql/share/swedish/errmsg.OLD b/sql/share/swedish/errmsg.OLD
index ee3d913e51a..132a9fdf4f9 100644
--- a/sql/share/swedish/errmsg.OLD
+++ b/sql/share/swedish/errmsg.OLD
@@ -199,3 +199,9 @@
"Tabell '%-.64s' är crashad och senast (automatiska?) reparation misslyckades",
"Warning: Några icke transaktionella tabeller kunde inte återställas vid ROLLBACK",
"Transaktionen krävde mera än 'max_binlog_cache_size' minne. Utöka denna mysqld variabel och försök på nytt",
+"Denna operation kan inte göras under replikering; Gör SLAVE STOP först",
+"Denna operation kan endast göras under replikering; Konfigurera slaven och gör SLAVE START",
+"Servern är inte konfigurerade som en replikations slav. Ändra konfigurationsfilen eller gör CHANGE MASTER TO",
+"Kunde inte initializera replications-strukturerna. Kontrollera privilegerna för 'master.info'",
+"Kunde inte starta en tråd för replikering",
+"Användare '%-.64s' har redan 'max_user_connections' aktiva inloggningar",
diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt
index a47bdf7428e..132a9fdf4f9 100644
--- a/sql/share/swedish/errmsg.txt
+++ b/sql/share/swedish/errmsg.txt
@@ -199,8 +199,9 @@
"Tabell '%-.64s' är crashad och senast (automatiska?) reparation misslyckades",
"Warning: Några icke transaktionella tabeller kunde inte återställas vid ROLLBACK",
"Transaktionen krävde mera än 'max_binlog_cache_size' minne. Utöka denna mysqld variabel och försök på nytt",
-"This operation cannot be performed with a running slave, run SLAVE STOP first",
-"This operation requires a running slave, configure slave and do SLAVE START",
-"The server is not configured as slave, fix in config file or with CHANGE MASTER TO",
-"Could not initialize master info structure, check permisions on master.info",
-"Could not create slave thread, check system resources",
+"Denna operation kan inte göras under replikering; Gör SLAVE STOP först",
+"Denna operation kan endast göras under replikering; Konfigurera slaven och gör SLAVE START",
+"Servern är inte konfigurerade som en replikations slav. Ändra konfigurationsfilen eller gör CHANGE MASTER TO",
+"Kunde inte initializera replications-strukturerna. Kontrollera privilegerna för 'master.info'",
+"Kunde inte starta en tråd för replikering",
+"Användare '%-.64s' har redan 'max_user_connections' aktiva inloggningar",
diff --git a/sql/sql_class.h b/sql/sql_class.h
index cc5095397b6..f9720a3774a 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -265,14 +265,14 @@ public:
pthread_t real_id;
uint current_tablenr,tmp_table,cond_count,col_access,query_length;
uint server_status,open_options;
- bool slave_thread;
char scramble[9];
+ bool slave_thread;
bool set_query_id,locked,count_cuted_fields,some_tables_deleted;
bool no_errors, allow_sum_func, password, fatal_error;
bool query_start_used,last_insert_id_used,insert_id_used;
- bool volatile killed,bootstrap;
bool system_thread,in_lock_tables,global_read_lock;
- bool query_error;
+ bool query_error, bootstrap;
+ bool volatile killed;
LOG_INFO* current_linfo;
// if we do a purge of binary logs, log index info of the threads
// that are currently reading it needs to be adjusted. To do that
diff --git a/strings/str_test.c b/strings/str_test.c
index 069e7a5b487..bd54bc6d806 100644
--- a/strings/str_test.c
+++ b/strings/str_test.c
@@ -33,13 +33,13 @@
static char from_buff[100],to_buff[100];
static my_string from,to;
static int errors,tests;
-static int test_strarg(char *name,...);
+static int test_strarg(const char *name,...);
static void init_strings (void); /* Init from and to */
-void test_arg (my_string message,long func_value,long value);
-int compare_buff (my_string message,my_string b1,my_string b2,int length,
+void test_arg (const char *message,long func_value,long value);
+int compare_buff(const char *message,my_string b1,my_string b2,int length,
pchar fill, pchar prefill);
-int my_test(int a)
+static int my_test(int a)
{
return a ? 1 : 0;
}
@@ -116,6 +116,14 @@ int main(void)
test_strarg("strxmov(to,from,\"!!\",NullS)",strxmov(to,from,"!!",NullS),to+F_LEN+2,F_LEN,F_CHAR,2,'!',0,0,0);
test_strarg("strxmov(to,NullS)",strxmov(to,NullS),to,1,0,0,0);
test_strarg("strxmov(to,from,from,from,from,from,'!!',from,NullS)",strxmov(to,from,from,from,from,from,"!!",from,NullS),to+F_LEN*6+2,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,2,'!',F_LEN,F_CHAR,1,0,0,0);
+
+ test_strarg("strxnmov(to,100,from,\"!!\",NullS)",strxnmov(to,100,from,"!!",NullS),to+F_LEN+2,F_LEN,F_CHAR,2,'!',0,0,0);
+ test_strarg("strxnmov(to,2,NullS)",strxnmov(to,2,NullS),to,1,0,0,0);
+ test_strarg("strxnmov(to,100,from,from,from,from,from,'!!',from,NullS)",strxnmov(to,100,from,from,from,from,from,"!!",from,NullS),to+F_LEN*6+2,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,2,'!',F_LEN,F_CHAR,1,0,0,0);
+ test_strarg("strxnmov(to,2,\"!!!\",NullS)",strxnmov(to,2,"!!!",NullS),to+2,2,'!',0,0,0);
+ test_strarg("strxnmov(to,2,\"!!\",NullS)",strxnmov(to,2,"!!","xx",NullS),to+2,2,'!',0,0,0);
+ test_strarg("strxnmov(to,2,\"!\",\"x\",\"y\",NullS)",strxnmov(to,2,"!","x","y",NullS),to+2,1,'!',1,'x',0,0,0);
+
test_strarg("bchange(to,2,from,4,6)",(bchange(to,2,from,4,6),0L),INT_MAX32,
4,F_CHAR,2,T_CHAR,0,0);
@@ -156,7 +164,7 @@ void init_strings(void)
/* Test that function return rigth value */
-void test_arg(my_string message, long int func_value, long int value)
+void test_arg(const char *message, long int func_value, long int value)
{
tests++;
printf("testing '%s'\n",message);
@@ -169,7 +177,7 @@ void test_arg(my_string message, long int func_value, long int value)
/* Test function return value and from and to arrays */
-static int test_strarg(char *message,...)
+static int test_strarg(const char *message,...)
{
long func_value,value;
int error,length;
@@ -223,7 +231,7 @@ static int test_strarg(char *message,...)
/* test if function made right value */
-int compare_buff(my_string message, my_string b1, my_string b2, int length,
+int compare_buff(const char *message, my_string b1, my_string b2, int length,
pchar fill, pchar prefill)
{
int i,error=0;
@@ -256,6 +264,8 @@ int compare_buff(my_string message, my_string b1, my_string b2, int length,
/* These are here to be loaded and examined */
+extern void dummy_functions(void);
+
void dummy_functions(void)
{
VOID(memchr(from,'a',5));
diff --git a/strings/strxnmov.c b/strings/strxnmov.c
index 494b227209f..b55a2e0ab79 100644
--- a/strings/strxnmov.c
+++ b/strings/strxnmov.c
@@ -15,9 +15,9 @@
and NOT to use 0, as on some machines 0 is not the same size as a
character pointer, or not the same bit pattern as NullS.
- Note: strxnmov is like strnmov in that it always moves EXACTLY len
- characters; dst will be padded on the right with NUL characters as
- needed. strxncpy does the same. strxncat, like strncat, does NOT.
+ Note: strxnmov is like strnmov in that it moves up to len
+ characters; dst will be padded on the right with one NUL characters if
+ needed.
*/
#include <global.h>
@@ -27,20 +27,22 @@
char *strxnmov(char *dst,uint len, const char *src, ...)
{
va_list pvar;
- char *result;
+ char *end_of_dst=dst+len;
va_start(pvar,src);
- while (src != NullS) {
- do if (len-- == 0)
+ while (src != NullS)
+ {
+ do
{
- va_end(pvar);
- return dst;
+ if (dst == end_of_dst)
+ goto end;
}
- while ((*dst++ = *src++) != 0);
+ while ((*dst++ = *src++));
dst--;
src = va_arg(pvar, char *);
}
- for (result= dst; len-- != 0; *dst++ = 0) ;
+ *dst=0;
+end:
va_end(pvar);
- return result;
+ return dst;
}