summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@hundin.mysql.fi>2001-08-10 17:37:37 +0300
committerunknown <monty@hundin.mysql.fi>2001-08-10 17:37:37 +0300
commitaa3c4306754c3db0c2ea3a6db0cffcb6bc1ed0f7 (patch)
tree2d9d1fce1c8c7170391a58f2fa2731f5c6a02605
parentbffebc8e0be4772e7988b6b23570bd1197c7214a (diff)
downloadmariadb-git-aa3c4306754c3db0c2ea3a6db0cffcb6bc1ed0f7.tar.gz
Portability fixes
Added record_rnd_buffer Added --safe-user-create Fix for ALTER TABLE RENAME on windows Docs/manual.texi: Changelog and documentation of new features. More information about using threaded client libraries include/mysql_com.h: Added prototype for my_thread_init() include/mysqld_error.h: New error for --safe-create-user innobase/buf/buf0flu.c: Portability fix innobase/include/univ.i: Portability fix mysql-test/t/distinct.test: Test for distinct bug sql/mysql_priv.h: Added record_rnd_buffer sql/mysqld.cc: Added record_rnd_buffer sql/records.cc: Added record_rnd_buffer sql/share/czech/errmsg.txt: New error message for --safe-user-create sql/share/danish/errmsg.txt: New error message for --safe-user-create sql/share/dutch/errmsg.txt: New error message for --safe-user-create sql/share/english/errmsg.txt: New error message for --safe-user-create sql/share/estonian/errmsg.txt: New error message for --safe-user-create sql/share/french/errmsg.txt: New error message for --safe-user-create sql/share/german/errmsg.txt: New error message for --safe-user-create sql/share/greek/errmsg.txt: New error message for --safe-user-create sql/share/hungarian/errmsg.txt: New error message for --safe-user-create sql/share/italian/errmsg.txt: New error message for --safe-user-create sql/share/japanese/errmsg.txt: New error message for --safe-user-create sql/share/korean/errmsg.txt: New error message for --safe-user-create sql/share/norwegian-ny/errmsg.txt: New error message for --safe-user-create sql/share/norwegian/errmsg.txt: New error message for --safe-user-create sql/share/polish/errmsg.txt: New error message for --safe-user-create sql/share/portuguese/errmsg.txt: New error message for --safe-user-create sql/share/romanian/errmsg.txt: New error message for --safe-user-create sql/share/russian/errmsg.txt: New error message for --safe-user-create sql/share/slovak/errmsg.txt: New error message for --safe-user-create sql/share/spanish/errmsg.txt: New error message for --safe-user-create sql/share/swedish/errmsg.txt: New error message for --safe-user-create sql/sql_acl.cc: Checking of privileges for --safe-user-create sql/sql_acl.h: --safe-user-create sql/sql_base.cc: --safe-user-create sql/sql_parse.cc: --safe-user-create sql/sql_show.cc: --safe-user-create sql/sql_table.cc: Fix for ALTER TABLE RENAME on windows
-rw-r--r--Docs/manual.texi161
-rw-r--r--include/mysql_com.h8
-rw-r--r--include/mysqld_error.h3
-rw-r--r--innobase/buf/buf0flu.c1
-rw-r--r--innobase/include/univ.i4
-rw-r--r--mysql-test/t/distinct.test9
-rw-r--r--sql/mysql_priv.h7
-rw-r--r--sql/mysqld.cc30
-rw-r--r--sql/records.cc4
-rw-r--r--sql/share/czech/errmsg.txt1
-rw-r--r--sql/share/danish/errmsg.txt181
-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.txt1
-rw-r--r--sql/sql_acl.cc103
-rw-r--r--sql/sql_acl.h2
-rw-r--r--sql/sql_base.cc2
-rw-r--r--sql/sql_parse.cc5
-rw-r--r--sql/sql_show.cc2
-rw-r--r--sql/sql_table.cc11
36 files changed, 367 insertions, 186 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi
index 86a4b92f304..058e62e6234 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -14522,15 +14522,10 @@ Skip some optimize stages. Implies @code{--skip-delay-key-write}.
@item --safe-show-database
Don't show databases for which the user doesn't have any privileges.
-@item --secure
-IP numbers returned by the @code{gethostbyname()} system call are
-checked to make sure they resolve back to the original hostname. This
-makes it harder for someone on the outside to get access by pretending
-to be another host. This option also adds some sanity checks of
-hostnames. The option is turned off by default in @strong{MySQL} Version 3.21
-because sometimes it takes a long time to perform backward resolutions.
-@strong{MySQL} Version 3.22 caches hostnames (unless @code{--skip-host-cache}
-is used) and has this option enabled by default.
+@item --safe-user-create
+If this is enabled, a user can't create new users with the GRANT
+command, if the user doesn't have @code{INSERT} privilege to the
+@code{mysql.user} table or any column in this table.
@item --skip-concurrent-insert
Turn off the ability to select and insert at the same time on @code{MyISAM}
@@ -15313,11 +15308,10 @@ by using @code{LOAD DATA} to load @file{/etc/passwd} into a table, which
can then be read with @code{SELECT}.
@item
-If you don't trust your DNS, you should use IP numbers instead of hostnames
-in the grant tables. In principle, the @code{--secure} option to
-@code{mysqld} should make hostnames safe. In any case, you should be very
-careful about creating grant table entries using hostname values that
-contain wild cards!
+If you don't trust your DNS, you should use IP numbers instead of
+hostnames in the grant tables. In any case, you should be very careful
+about creating grant table entries using hostname values that contain
+wild cards!
@item
If you want to restrict the number of connections for a single user, you
@@ -15325,21 +15319,31 @@ can do this by setting the @code{max_user_connections} variable in
@code{mysqld}.
@end itemize
+
@node Privileges options, What Privileges, Security, Privilege system
@subsection Startup Options for @code{mysqld} Concerning Security
-The following @code{mysqld} options affect networking security:
+The following @code{mysqld} options affect security:
@table @code
-@item --secure
-IP numbers returned by the @code{gethostbyname()} system call are
-checked to make sure they resolve back to the original hostname. This
-makes it harder for someone on the outside to get access by pretending
-to be another host. This option also adds some sanity checks of
-hostnames. The option is turned off by default in @strong{MySQL} Version
-3.21 because sometimes it takes a long time to perform backward resolutions.
-@strong{MySQL} Version 3.22 caches hostnames and has this option enabled by
-default.
+@item --safe-show-database
+With this option,
+@code{SHOW DATABASES} returns only those databases for which the user has
+some kind of privilege.
+
+@item @code{--safe-user-create}
+If this is enabled, an user can't create new users with the @code{GRANT}
+command, if the user doesn't have @code{INSERT} privilege to the
+@code{mysql.user} table. If you want to give a user access to just create
+new users with those privileges that the user has right to grant, you should
+give the user the following privilege:
+
+@example
+GRANT INSERT(user) on mysql.user to 'user'@'hostname';
+@end example
+
+This will ensure that the user can't change any privilege columns directly,
+but has to use the @code{GRANT} command to give privileges to other users.
@item --skip-grant-tables
This option causes the server not to use the privilege system at all. This
@@ -15361,11 +15365,6 @@ support Unix sockets.
With this option, the
@code{SHOW DATABASES} statement doesn't return anything.
-@item --safe-show-database
-With this option,
-@code{SHOW DATABASES} returns only those databases for which the user has
-some kind of privilege.
-
@end table
@@ -19812,6 +19811,11 @@ Each thread that does a sequential scan allocates a buffer of this
size for each table it scans. If you do many sequential scans, you may
want to increase this value.
+@item @code{record_rnd_buffer}
+When reading rows in sorted order after a sort, the rows are read through this
+buffer to avoid a disk seeks. If not set, then it's set to the value of
+@code{record_buffer}.
+
@item @code{query_buffer_size}
The initial allocation of the query buffer. If most of your queries are
long (like when inserting blobs), you should increase this!
@@ -25946,6 +25950,7 @@ net_read_timeout current value: 30
net_write_timeout current value: 60
query_buffer_size current value: 0
record_buffer current value: 131072
+record_rnd_buffer current value: 131072
slow_launch_time current value: 2
sort_buffer current value: 2097116
table_cache current value: 64
@@ -26006,6 +26011,11 @@ shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \
-O table_cache=32 -O record_buffer=8k -O net_buffer=1K &
@end example
+If you are doing a @code{GROUP BY} or @code{ORDER BY} on files that are
+much bigger than your available memory you should increase the value of
+@code{record_rnd_buffer} to speed up the reading of rows after the sorting
+is done.
+
When you have installed @strong{MySQL}, the @file{support-files} directory will
contain some different @code{my.cnf} example files, @file{my-huge.cnf},
@file{my-large.cnf}, @file{my-medium.cnf}, and @file{my-small.cnf}, you can
@@ -26168,6 +26178,11 @@ Each request doing a sequential scan over a table allocates a read buffer
(variable @code{record_buffer}).
@item
+When reading rows in 'random' order (for example after a sort) a
+random-read buffer is allocated to avoid disk seeks.
+(variable @code{record_rnd_buffer}).
+
+@item
All joins are done in one pass, and most joins can be done without even
using a temporary table. Most temporary tables are memory-based (HEAP)
tables. Temporary tables with a big record length (calculated as the
@@ -27642,7 +27657,7 @@ significant decimal digits that will be stored for values, and
@code{2} (@code{scale}) represents the number of digits that will be
stored following the decimal point. In this case, therefore, the range
of values that can be stored in the @code{salary} column is from
-@code{-9999999.99} to @code{9999999.99}. In ANSI/ISO SQL92, the syntax
+@code{-999999.99} to @code{9999999.99}. In ANSI/ISO SQL92, the syntax
@code{DECIMAL(p)} is equivalent to @code{DECIMAL(p,0)}. Similarly, the
syntax @code{DECIMAL} is equivalent to @code{DECIMAL(p,0)}, where the
implementation is allowed to decide the value of @code{p}.
@@ -29145,6 +29160,15 @@ mysql> select INTERVAL(22, 23, 30, 44, 200);
Normally, if any expression in a string comparison is case sensitive, the
comparison is performed in case-sensitive fashion.
+If you are comparing case sensitive string with any of the standard
+operators (@code{=}, @code{<>}..., but not @code{LIKE}) end space will
+be ignored.
+
+@example
+mysql> select "a" ="A ";
+ -> 1
+@end example
+
@table @code
@findex LIKE
@item expr LIKE pat [ESCAPE 'escape-char']
@@ -37893,12 +37917,16 @@ To make Access work:
@itemize @bullet
@item
If you are using Access 2000, you should get and install the newest
-Microsoft MDAC (@code{Microsoft Data Access Components}) from
-@uref{http://www.microsoft.com/data}. This will fix the following bug
-in Access: when you export data to @strong{MySQL}, the table and column
-names aren't specified. Another way to around this bug is to upgrade to
-MyODBC Version 2.50.33 and @strong{MySQL} Version 3.23.x, which together
-provide a workaround for this bug!
+(version 2.6 or above) Microsoft MDAC (@code{Microsoft Data Access
+Components}) from @uref{http://www.microsoft.com/data}. This will fix
+the following bug in Access: when you export data to @strong{MySQL}, the
+table and column names aren't specified. Another way to around this bug
+is to upgrade to MyODBC Version 2.50.33 and @strong{MySQL} Version
+3.23.x, which together provide a workaround for this bug!
+
+You should also get and apply the Microsoft Jet 4.0 Service Pack 5 (SP5)
+which can be found here
+@uref{http://support.microsoft.com/support/kb/articles/Q 239/1/14.ASP}.
Note that if you are using @strong{MySQL} Version 3.22, you must to apply the
MDAC patch and use MyODBC 2.50.32 or 2.50.34 and above to go around
@@ -40033,7 +40061,7 @@ other APIs.
* C API function overview:: C API Function Overview
* C API functions:: C API Function Descriptions
* C API problems::
-* Thread-safe clients::
+* Thread-safe clients:: How to Make a Thread-safe Client
@end menu
The C API code is distributed with @strong{MySQL}. It is included in the
@@ -42834,6 +42862,34 @@ If you program with POSIX threads, you can use
establish and release a mutex lock.
@end itemize
+You need to know the following if you have a thread that is calling
+MySQL functions, but that thread has not created the connection to the
+MySQL database:
+
+When you call @code{mysql_init()} or @code{mysql_connect()}, MySQL will
+create a thread specific variable for the thread that is used by the
+debug library (among other things).
+
+If you have in a thread call a MySQL function, before a thread has
+called @code{mysql_init()} or @code{mysql_connect()}, the thread will
+not have the necessary thread specific variables in place and you are
+likely to end up with a core dump sooner or later.
+
+The get things to work smoothly you have to do the following:
+
+@enumerate
+@item
+Call @code{my_init()} at the start of your program if it calls
+any other MySQL function before calling @code{mysql_real_connect()}.
+@item
+Call @code{my_thread_init()} in the thread handler before calling
+any MySQL function.
+@item
+In the thread, call @code{my_thread_end()} before calling
+@code{pthread_exit()}. This will free the memory used by MySQL thread
+specific variables.
+@end enumerate
+
You may get some errors because of undefined symbols when linking your
client with @code{mysqlclient_r}. In most cases this is because you haven't
included the thread libraries on the link/compile line.
@@ -45434,6 +45490,8 @@ Romanian error messages.
Hungarian error messages.
@item Roberto M. Serqueira
Portugise error messages.
+@item Carsten H. Pedersen
+Danish error messages
@item David Sacerdote @email{davids@@secnet.com}
Ideas for secure checking of DNS hostnames.
@item Wei-Jou Chen @email{jou@@nematic.ieo.nctu.edu.tw}
@@ -45672,7 +45730,7 @@ users use this code as the rest of the code and because of this we are
not yet 100% confident in this code.
@menu
-* News-3.23.41::
+* News-3.23.41:: Changes in release 3.23.41
* News-3.23.40:: Changes in release 3.23.40
* News-3.23.39:: Changes in release 3.23.39
* News-3.23.38:: Changes in release 3.23.38
@@ -45721,8 +45779,35 @@ not yet 100% confident in this code.
@appendixsubsec Changes in release 3.23.41
@itemize @bullet
@item
+InnoDB now supports < 4 GB rows. The former limit was 8000 bytes.
+@item
+The @code{doublewrite} file flush method is used in InnoDB.
+It reduces the need for Unix fsync calls to a fraction and
+improves performance on most Unix flavors.
+@item
+You can now use the InnoDB Monitor to print a lot of InnoDB state
+information, including locks, to the standard output; useful in
+performance tuning.
+@item
+Several bugs which could cause hangs in InnoDB have been fixed.
+@item
+Split @code{record_buffer} to @code{record_buffer} and
+@code{record_rnd_buffer}. To make things compatible to previous MySQL
+versions, if @code{record_rnd_buffer} is not set, then it takes the
+value of @code{record_buffer}.
+@item
Fixed optimizing bug in @code{ORDER BY} where some @code{ORDER BY} parts
where wrongly removed.
+@item
+Fixed overflow bug with @code{ALTER TABLE} and @code{MERGE} tables.
+@item
+Added prototypes for @code{my_thread_init()} and @code{my_thread_end()} to
+@file{mysql_com.h}
+@item
+Added option @code{--safe-user-create} to @code{mysqld}.
+@item
+Added options to the @code{--ansi} startup options to let the user
+decide which @code{ansi} options one to enable.
@end itemize
@node News-3.23.40, News-3.23.39, News-3.23.41, News-3.23.x
diff --git a/include/mysql_com.h b/include/mysql_com.h
index 5b22d58150d..82eb34060a9 100644
--- a/include/mysql_com.h
+++ b/include/mysql_com.h
@@ -218,17 +218,19 @@ my_bool check_scramble(const char *, const char *message,
unsigned long *salt,my_bool old_ver);
char *get_tty_password(char *opt_message);
void hash_password(unsigned long *result, const char *password);
-#ifdef __cplusplus
-}
-#endif
/* Some other useful functions */
void my_init(void);
void load_defaults(const char *conf_file, const char **groups,
int *argc, char ***argv);
+my_bool my_thread_init(void);
void my_thread_end(void);
+#ifdef __cplusplus
+}
+#endif
+
#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */
#ifdef __WIN__
diff --git a/include/mysqld_error.h b/include/mysqld_error.h
index 32967931eac..758c74fc122 100644
--- a/include/mysqld_error.h
+++ b/include/mysqld_error.h
@@ -211,4 +211,5 @@
#define ER_DROP_DB_WITH_READ_LOCK 1208
#define ER_CREATE_DB_WITH_READ_LOCK 1209
#define ER_WRONG_ARGUMENTS 1210
-#define ER_ERROR_MESSAGES 211
+#define ER_NO_PERMISSON_TO_CREATE_USER 1211
+#define ER_ERROR_MESSAGES 212
diff --git a/innobase/buf/buf0flu.c b/innobase/buf/buf0flu.c
index 0f27cee45a5..3abb3702191 100644
--- a/innobase/buf/buf0flu.c
+++ b/innobase/buf/buf0flu.c
@@ -10,6 +10,7 @@ Created 11/11/1995 Heikki Tuuri
#ifdef UNIV_NONINL
#include "buf0flu.ic"
+#include "trx0sys.h"
#endif
#include "ut0byte.h"
diff --git a/innobase/include/univ.i b/innobase/include/univ.i
index 6ffbb1b8fef..f3e3b22bb3d 100644
--- a/innobase/include/univ.i
+++ b/innobase/include/univ.i
@@ -9,12 +9,10 @@ Created 1/20/1994 Heikki Tuuri
#ifndef univ_i
#define univ_i
-#if (defined(_WIN32) || defined(_WIN64))
+#if (defined(_WIN32) || defined(_WIN64)) && !defined(MYSQL_SERVER)
#define __WIN__
-#ifndef MYSQL_SERVER
#include <windows.h>
-#endif
/* If you want to check for errors with compiler level -W4,
comment out the above include of windows.h and let the following defines
diff --git a/mysql-test/t/distinct.test b/mysql-test/t/distinct.test
index 29b2fddbe5f..bf8a03ac40d 100644
--- a/mysql-test/t/distinct.test
+++ b/mysql-test/t/distinct.test
@@ -198,3 +198,12 @@ insert into t2 values (1,1),(2,2),(3,3);
select t1.a,sec_to_time(sum(time_to_sec(t))) from t1 left join t2 on (t1.b=t2.a) group by t1.a,t2.b;
select distinct t1.a,sec_to_time(sum(time_to_sec(t))) from t1 left join t2 on (t1.b=t2.a) group by t1.a,t2.b;
drop table t1,t2;
+
+#
+# Test problem with DISTINCT and HAVING
+#
+create table t1 (a int not null,b char(5), c text);
+insert into t1 (a) values (1),(2),(3),(4),(1),(2),(3),(4);
+select distinct a from t1 group by b,a having a > 2 order by a desc;
+select distinct a,c from t1 group by b,c,a having a > 2 order by a desc;
+drop table t1;
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index f21c635dbdf..e039cf1d925 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -251,6 +251,7 @@ void kill_mysql(void);
void close_connection(NET *net,uint errcode=0,bool lock=1);
bool check_access(THD *thd,uint access,const char *db=0,uint *save_priv=0,
bool no_grant=0);
+bool check_table_access(THD *thd,uint want_access,TABLE_LIST *tables);
bool check_process_priv(THD *thd=0);
int generate_table(THD *thd, TABLE_LIST *table_list,
@@ -530,10 +531,10 @@ extern ulong keybuff_size,sortbuff_size,max_item_sort_length,table_cache_size,
what_to_log,flush_time,
max_tmp_tables,max_heap_table_size,query_buff_size,
lower_case_table_names,thread_stack,thread_stack_min,
- binlog_cache_size, max_binlog_cache_size;
+ binlog_cache_size, max_binlog_cache_size, record_rnd_cache_size;
extern ulong specialflag, current_pid;
-extern bool low_priority_updates, using_update_log;
-extern bool opt_sql_bin_update, opt_safe_show_db, opt_warnings;
+extern bool low_priority_updates, using_update_log,opt_warnings;
+extern bool opt_sql_bin_update, opt_safe_show_db, opt_safe_user_create;
extern char language[LIBLEN],reg_ext[FN_EXTLEN],blob_newline;
extern const char **errmesg; /* Error messages */
extern const char *default_tx_isolation_name;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index a9771184b4b..9e86207bf69 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -213,7 +213,8 @@ static bool opt_log,opt_update_log,opt_bin_log,opt_slow_log,opt_noacl,
opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0,
opt_ansi_mode=0,opt_myisam_log=0,
opt_large_files=sizeof(my_off_t) > 4;
-bool opt_sql_bin_update = 0, opt_log_slave_updates = 0, opt_safe_show_db=0;
+bool opt_sql_bin_update = 0, opt_log_slave_updates = 0, opt_safe_show_db=0,
+ opt_safe_user_create=0;
FILE *bootstrap_file=0;
int segfaulted = 0; // ensure we do not enter SIGSEGV handler twice
extern MASTER_INFO glob_mi;
@@ -261,7 +262,7 @@ ulong keybuff_size,sortbuff_size,max_item_sort_length,table_cache_size,
query_buff_size, lower_case_table_names, mysqld_net_retry_count,
net_interactive_timeout, slow_launch_time = 2L,
net_read_timeout,net_write_timeout,slave_open_temp_tables=0,
- open_files_limit=0, max_binlog_size;
+ open_files_limit=0, max_binlog_size, record_rnd_cache_size;
ulong slave_net_timeout;
ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0;
volatile ulong cached_thread_count=0;
@@ -1481,9 +1482,13 @@ static void open_log(MYSQL_LOG *log, const char *hostname,
// get rid of extention if the log is binary to avoid problems
if (type == LOG_BIN)
{
- char* p = strrchr((char*) opt_name, FN_EXTCHAR);
+ char *p = fn_ext(opt_name);
if (p)
- *p = 0;
+ {
+ uint length=(uint) (p-opt_name);
+ strmake(tmp,opt_name,min(length,FN_REFLEN));
+ opt_name=tmp;
+ }
}
log->open(opt_name,type);
}
@@ -2471,7 +2476,8 @@ enum options {
OPT_GEMINI_FLUSH_LOG, OPT_GEMINI_RECOVER,
OPT_GEMINI_UNBUFFERED_IO, OPT_SKIP_SAFEMALLOC,
OPT_SKIP_STACK_TRACE, OPT_SKIP_SYMLINKS,
- OPT_MAX_BINLOG_DUMP_EVENTS, OPT_SPORADIC_BINLOG_DUMP_FAIL
+ OPT_MAX_BINLOG_DUMP_EVENTS, OPT_SPORADIC_BINLOG_DUMP_FAIL,
+ OPT_SAFE_USER_CREATE
};
static struct option long_options[] = {
@@ -2583,7 +2589,7 @@ static struct option long_options[] = {
(int) OPT_REPLICATE_REWRITE_DB},
{"safe-mode", no_argument, 0, (int) OPT_SAFE},
{"safe-show-database", no_argument, 0, (int) OPT_SAFE_SHOW_DB},
- {"socket", required_argument, 0, (int) OPT_SOCKET},
+ {"safe-user-create", no_argument, 0, (int) OPT_SAFE_USER_CREATE},
{"server-id", required_argument, 0, (int) OPT_SERVER_ID},
{"set-variable", required_argument, 0, 'O'},
{"skip-bdb", no_argument, 0, (int) OPT_BDB_SKIP},
@@ -2603,6 +2609,7 @@ static struct option long_options[] = {
{"skip-stack-trace", no_argument, 0, (int) OPT_SKIP_STACK_TRACE},
{"skip-symlink", no_argument, 0, (int) OPT_SKIP_SYMLINKS},
{"skip-thread-priority", no_argument, 0, (int) OPT_SKIP_PRIOR},
+ {"socket", required_argument, 0, (int) OPT_SOCKET},
{"sql-bin-update-same", no_argument, 0, (int) OPT_SQL_BIN_UPDATE_SAME},
#include "sslopt-longopts.h"
#ifdef __WIN__
@@ -2741,6 +2748,8 @@ CHANGEABLE_VAR changeable_vars[] = {
0, MALLOC_OVERHEAD, (long) ~0, MALLOC_OVERHEAD, IO_SIZE },
{ "record_buffer", (long*) &my_default_record_cache_size,
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE },
+ { "record_rnd_buffer", (long*) &record_rnd_cache_size,
+ 0, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE },
{ "slave_net_timeout", (long*) &slave_net_timeout,
SLAVE_NET_TIMEOUT, 1, 65535, 0, 1 },
{ "slow_launch_time", (long*) &slow_launch_time,
@@ -2856,6 +2865,7 @@ struct show_var_st init_vars[]= {
{"port", (char*) &mysql_port, SHOW_INT},
{"protocol_version", (char*) &protocol_version, SHOW_INT},
{"record_buffer", (char*) &my_default_record_cache_size,SHOW_LONG},
+ {"record_rnd_buffer", (char*) &record_rnd_cache_size, SHOW_LONG},
{"query_buffer_size", (char*) &query_buff_size, SHOW_LONG},
{"safe_show_database", (char*) &opt_safe_show_db, SHOW_BOOL},
{"server_id", (char*) &server_id, SHOW_LONG},
@@ -3030,6 +3040,8 @@ static void usage(void)
--safe-mode Skip some optimize stages (for testing)\n\
--safe-show-database Don't show databases for which the user has no\n\
privileges\n\
+ --safe-user-create Don't new users cretaion without privileges to the\n\
+ mysql.user table\n\
--skip-concurrent-insert\n\
Don't use concurrent insert with MyISAM\n\
--skip-delay-key-write\n\
@@ -3747,6 +3759,9 @@ static void get_options(int argc,char **argv)
case OPT_SAFE_SHOW_DB:
opt_safe_show_db=1;
break;
+ case OPT_SAFE_USER_CREATE:
+ opt_safe_user_create=1;
+ break;
case OPT_SKIP_SAFEMALLOC:
#ifdef SAFEMALLOC
sf_malloc_quick=1;
@@ -3770,6 +3785,9 @@ static void get_options(int argc,char **argv)
fix_paths();
default_table_type_name=ha_table_typelib.type_names[default_table_type-1];
default_tx_isolation_name=tx_isolation_typelib.type_names[default_tx_isolation];
+ /* To be deleted in MySQL 4.0 */
+ if (!record_rnd_cache_size)
+ record_rnd_cache_size=my_default_record_cache_size;
}
diff --git a/sql/records.cc b/sql/records.cc
index 3187aa424d7..0f49b3fa45e 100644
--- a/sql/records.cc
+++ b/sql/records.cc
@@ -66,7 +66,7 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table,
table->file->rnd_init(0);
if (! (specialflag & SPECIAL_SAFE_MODE) &&
- my_default_record_cache_size &&
+ record_rnd_cache_size &&
!table->file->fast_key_read() &&
(table->db_stat & HA_READ_ONLY ||
table->reginfo.lock_type <= TL_READ_NO_INSERT) &&
@@ -216,7 +216,7 @@ static int init_rr_cache(READ_RECORD *info)
info->reclength=ALIGN_SIZE(info->struct_length);
info->error_offset=info->table->reclength;
- info->cache_records=my_default_record_cache_size/
+ info->cache_records=record_rnd_cache_size/
(info->reclength+info->struct_length);
rec_cache_size=info->cache_records*info->reclength;
info->rec_cache_size=info->cache_records*info->ref_length;
diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt
index a0540bfe270..f67496da923 100644
--- a/sql/share/czech/errmsg.txt
+++ b/sql/share/czech/errmsg.txt
@@ -221,3 +221,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt
index 73fa8b79f0f..34c3d8ed95d 100644
--- a/sql/share/danish/errmsg.txt
+++ b/sql/share/danish/errmsg.txt
@@ -2,29 +2,29 @@
This file is public domain and comes with NO WARRANTY of any kind */
/* Knud Riishøjgård knudriis@post.tele.dk 99 &&
- Carsten H. Pedersen, carsten.pedersen@bitbybit.dk oct. 1999 */
+ Carsten H. Pedersen, carsten.pedersen@bitbybit.dk oct. 1999 / aug. 2001. */
"hashchk",
"isamchk",
"NEJ",
"JA",
"Kan ikke oprette filen '%-.64s' (Fejlkode: %d)",
-"Kan ikke opprette tabellen '%-.64s' (Fejlkode: %d)",
+"Kan ikke oprette tabellen '%-.64s' (Fejlkode: %d)",
"Kan ikke oprette databasen '%-.64s'. Fejl %d",
"Kan ikke oprette databasen '%-.64s'. Databasen eksisterer",
"Kan ikke slette (droppe) '%-.64s'. Databasen eksisterer ikke",
"Fejl ved sletning (drop) af databasen (kan ikke slette '%-.64s', Fejl %d)",
-"Fejl ved sletting af database (kan ikke slette biblioteket '%-.64s', Fejl %d)",
+"Fejl ved sletting af database (kan ikke slette folderen '%-.64s', Fejl %d)",
"Fejl ved sletning af '%-.64s' (Fejlkode: %d)",
-"Kan ikke læse posten i systembiblioteket",
+"Kan ikke læse posten i systemfolderen",
"Kan ikke læse status af '%-.64s' (Fejlkode: %d)",
-"Kan ikke læse aktive bibliotek (Fejlkode: %d)",
+"Kan ikke læse aktive folder (Fejlkode: %d)",
"Kan ikke låse fil (Fejlkode: %d)",
"Kan ikke åbne fil: '%-.64s'. (Fejlkode: %d)",
"Kan ikke finde fila: '%-.64s' (Fejlkode: %d)",
-"Kan ikke læse bibliotek '%-.64s' (Fejlkode: %d)",
-"Kan ikke skifte bibliotek til '%-.64s' (Fejlkode: %d)",
-"Posten erændret siden sidst læst '%-.64s'",
+"Kan ikke læse folder '%-.64s' (Fejlkode: %d)",
+"Kan ikke skifte folder til '%-.64s' (Fejlkode: %d)",
+"Posten er ændret siden sidste læsning '%-.64s'",
"Ikke mere diskplads (%s). Venter på at få frigjort plads....",
"Kan ikke skrive, flere ens nøgler i tabellen '%-.64s'",
"Fejl ved lukning af '%-.64s' (Fejlkode: %d)",
@@ -32,10 +32,10 @@
"Fejl ved omdøbning af '%-.64s' til '%-.64s' (Fejlkode: %d)",
"Fejl ved skriving av filen '%-.64s' (Fejlkode: %d)",
"'%-.64s' er låst mod opdateringer",
-"Sortering afbrutt",
+"Sortering afbrudt",
"View '%-.64s' eksisterer ikke for '%-.64s'",
-"Modtog fejl %d fra tabel håndterer",
-"Tabel håndtereren for '%-.64s' har ikke denne mulighed",
+"Modtog fejl %d fra tabel håndteringen",
+"Denne mulighed eksisterer ikke for tabeltypen '%-.64s'",
"Kan ikke finde posten i '%-.64s'",
"Forkert indhold i: '%-.64s'",
"Fejl i indeksfilen til tabellen '%-.64s', prøv at reparere den",
@@ -43,95 +43,95 @@
"'%-.64s' er skrivebeskyttet",
"Ikke mere hukommelse. Genstart serveren og prøv igen (mangler %d bytes)",
"Ikke mere sorteringshukommelse. Øg sorteringshukommelse (sort buffer size) for serveren",
-"Uventet sluttning af fil (eof) ved læsning af filen '%-.64s' (Fejlkode: %d)",
-"For mange tilkoblinger (connections)",
+"Uventet afslutning på fil (eof) ved læsning af filen '%-.64s' (Fejlkode: %d)",
+"For mange forbindelser (connections)",
"Udgået for tråde/hukommelse",
"Kan ikke få værtsnavn for din adresse",
"Forkert håndtryk (handshake)",
"Adgang nægtet bruger: '%-.32s@%-.64s' til databasen '%-.64s'",
-"Adgang nægtet bruger: '%-.32s@%-.64s' (Bruger password: %s)",
+"Adgang nægtet bruger: '%-.32s@%-.64s' (Bruger adgangskode: %s)",
"Ingen database valgt",
"Ukendt kommando",
-"Kolonne '%-.64s' kan ikke være nul",
+"Kolonne '%-.64s' kan ikke være NULL",
"Ukendt database '%-.64s'",
-"Tabellen '%-.64s' eksisterer allerede",
+"Tabellen '%-.64s' findes allerede",
"Ukendt tabel '%-.64s'",
"Felt: '%-.64s' i tabel %s er ikke entydigt",
-"Database nedkobling er i gang",
+"Database nedlukning er i gang",
"Ukendt kolonne '%-.64s' i tabel %s",
-"Grugte '%-.64s' som ikke var i group by",
+"Brugte '%-.64s' som ikke var i group by",
"Kan ikke gruppere på '%-.64s'",
"Udtrykket har summer (sum) funktioner og kolonner i samme udtryk",
-"Kolonne tæller stemmer ikke med værditæller",
-"Identifikationen '%-.64s' er for lang",
-"Feltnavnet '%-.64s' eksisterer allerede",
-"Indeksnavnet '%-.64s' eksisterer allerede",
+"Kolonne tæller stemmer ikke med antallet af værdier",
+"Navnet '%-.64s' er for langt",
+"Feltnavnet '%-.64s' findes allerede",
+"Indeksnavnet '%-.64s' findes allerede",
"Ens værdier '%-.64s' for indeks %d",
"Forkert kolonnespecifikaton for felt '%-.64s'",
"%s nær '%-.64s' på linje %d",
"Forespørgsel var tom",
-"Ikke unikt tabel/alias: '%-.64s'",
+"Tabellen/aliaset: '%-.64s' er ikke unikt",
"Ugyldig standardværdi for '%-.64s'",
-"Flere primærindekser specificeret",
-"For mange indekser specificeret. Maks %d indekser tillatt",
-"For mange indeksdele specificeret. Maks %d dele tillatt",
-"Specificeret indeks var for langt. Maks indekslængde er %d",
-"Indeks felt '%-.64s' eksiterer ikke i tabellen",
-"Blob felt '%-.64s' kan ikke bruges ved specifikation af indeks",
+"Flere primærnøgler specificeret",
+"For mange nøgler specificeret. Kun %d nøgler må bruges",
+"For mange nøgledele specificeret. Kun %d dele må bruges",
+"Specificeret nøgle var for lang. Maksimal nøglelængde er %d",
+"Nøglefeltet '%-.64s' eksisterer ikke i tabellen",
+"BLOB feltet '%-.64s' kan ikke bruges ved specifikation af indeks",
"For stor feltlængde for kolonne '%-.64s' (maks = %d). Brug BLOB i stedet",
-"Der kan kun bruges eet AUTO-felt og det skal være indekseret",
-"%s: klar for tilslutninger\n",
+"Der kan kun specificeres eet AUTO_INCREMENT-felt, og det skal være indekseret",
+"%s: klar til tilslutninger\n",
"%s: Normal nedlukning\n",
-"%s: Opdaget signal %d. Afslutter!!\n",
+"%s: Fangede signal %d. Afslutter!!\n",
"%s: Server lukket\n",
"%s: Forceret nedlukning af tråd: %ld bruger: '%-.64s'\n",
"Kan ikke oprette IP socket",
-"Tabellen '%-.64s' har intet indeks som det der er brugt i CREATE INDEX. Genopret tabellen",
+"Tabellen '%-.64s' har ikke den nøgle, som blev brugt i CREATE INDEX. Genopret tabellen",
"Felt adskiller er ikke som forventet, se dokumentationen",
"Man kan ikke bruge faste feltlængder med BLOB. Brug i stedet 'fields terminated by'.",
-"Filen '%-.64s' skal være i database-biblioteket for at kunne læses af alle",
+"Filen '%-.64s' skal være i database-folderen og kunne læses af alle",
"Filen '%-.64s' eksisterer allerede",
"Poster: %ld Fjernet: %ld Sprunget over: %ld Advarsler: %ld",
"Poster: %ld Ens: %ld",
-"Forkert indeksdel. Den anvendte indeksdel er ikke en streng eller den længden er større end indekslængden",
+"Forkert indeksdel. Den anvendte nøgledel er ikke en streng eller længden er større end nøglelængden",
"Man kan ikke slette alle felter med ALTER TABLE. Brug DROP TABLE i stedet.",
-"Kan ikke DROP '%-.64s'. Undersøg om felt/indeks eksisterer.",
+"Kan ikke udføre DROP '%-.64s'. Undersøg om feltet/nøglen eksisterer.",
"Poster: %ld Ens: %ld Advarsler: %ld",
"INSERT TABLE '%-.64s' er ikke tilladt i FROM tabel liste",
"Ukendt tråd id: %lu",
-"Du er ikke ejer av tråden %lu",
+"Du er ikke ejer af tråden %lu",
"Ingen tabeller i brug",
-"For mange tekststrenge kolonne %s og SET",
-"Kan ikke lave unikt loggfilnavn %s.(1-999)\n",
+"For mange tekststrenge til specifikationen af SET i kolonne %-.64s",
+"Kan ikke lave unikt log-filnavn %s.(1-999)\n",
"Tabellen '%-.64s' var låst med READ lås og kan ikke opdateres",
"Tabellen '%-.64s' var ikke låst med LOCK TABLES",
-"Blob feltet '%-.64s' kan ikke have en standard værdi",
+"BLOB feltet '%-.64s' kan ikke have en standard værdi",
"Ugyldigt database navn '%-.64s'",
"Ugyldigt tabel navn '%-.64s'",
-"SELECT ville undersøge for mange poster og ville sannsynligvis tage meget lang tid. Undersøg WHERE delen og brug SET OPTION SQL_BIG_SELECTS=1 hvis SELECTen er korrekt"
+"SELECT ville undersøge for mange poster og ville sandsynligvis tage meget lang tid. Undersøg WHERE delen og brug SET OPTION SQL_BIG_SELECTS=1 hvis udtrykket er korrekt"
"Ukendt fejl",
"Ukendt procedure %s",
"Forkert antal parametre til proceduren %s",
"Forkert(e) parametre til proceduren %s",
"Ukendt tabel '%-.64s' i %s",
-"Feltet '%-.64s' er anvendt to ganger",
-"Forkert brug af gruppe-funktion",
-"Tabellen '%-.64s' bruger et efternavn som ikke findes i denne MySQL version",
+"Feltet '%-.64s' er anvendt to gange",
+"Forkert brug af grupperings-funktion",
+"Tabellen '%-.64s' bruger et filtypenavn som ikke findes i denne MySQL version",
"En tabel skal have mindst een kolonne",
"Tabellen '%-.64s' er fuld",
-"Ukendt karaktersæt: '%-.64s'",
+"Ukendt tegnsæt: '%-.64s'",
"For mange tabeller. MySQL kan kun bruge %d tabeller i et join",
"For mange felter",
-"For store poster. Max post størrelse, unde BOLB's, er %d. Du må lave nogle felter til BLOB's",
+"For store poster. Max post størrelse, uden BLOB's, er %d. Du må lave nogle felter til BLOB's",
"Thread stack brugt: Brugt: %ld af en %ld stak. Brug 'mysqld -O thread_stack=#' for at allokere en større stak om nødvendigt",
"Krydsreferencer fundet i OUTER JOIN. Check dine ON conditions",
"Kolonne '%-.32s' bruges som UNIQUE eller INDEX men er ikke defineret som NOT NULL",
"Kan ikke læse funktionen '%-.64s'",
"Kan ikke starte funktionen '%-.64s'; %-.80s",
-"Ingen sti tilladte for delt bibliotek",
+"Angivelse af sti ikke tilladt for delt bibliotek",
"Funktionen '%-.64s' findes allerede",
"Kan ikke åbne delt bibliotek '%-.64s' (errno: %d %s)",
-"Kan ikke finde funktionen '%-.64s' in bibliotek'",
+"Kan ikke finde funktionen '%-.64s' i bibliotek'",
"Funktionen '%-.64s' er ikke defineret",
"Værten er blokeret på grund af mange fejlforespørgsler. Lås op med 'mysqladmin flush-hosts'",
"Værten '%-.64s' kan ikke tilkoble denne MySQL-server",
@@ -139,7 +139,7 @@
"Du skal have tilladelse til at opdatere tabeller i MySQL databasen for at ændre andres adgangskoder",
"Kan ikke finde nogen tilsvarende poster i bruger tabellen",
"Poster fundet: %ld Ændret: %ld Advarsler: %ld",
-"Kan ikke danne en ny tråd (thread) (errno %d). Hvis computeren ikke er løbet tør for hukommelse, kan du se i brugervejledningen for en mulig operativ-system - afhængig fejl",
+"Kan ikke danne en ny tråd (fejl nr. %d). Hvis computeren ikke er løbet tør for hukommelse, kan du se i brugervejledningen for en mulig operativ-system - afhængig fejl",
"Kolonne antallet stemmer ikke overens med antallet af værdier i post %ld",
"Kan ikke genåbne tabel '%-.64s',
"Forkert brug af nulværdi (NULL)",
@@ -171,47 +171,48 @@
"Denne tabeltype understøtter ikke brug af AUTO_INCREMENT kolonner",
"INSERT DELAYED kan ikke bruges med tabellen '%-.64s', fordi tabellen er låst med LOCK TABLES",
"Forkert kolonnenavn '%-.100s'",
-"Den brugte tabel styrer kan ikke indeksere kolonnen '%-.64s'",
+"Den brugte tabeltype kan ikke indeksere kolonnen '%-.64s'",
"Tabellerne i MERGE er ikke defineret ens",
"Kan ikke skrive til tabellen '%-.64s' fordi det vil bryde CONSTRAINT regler",
-"BLOB column '%-.64s' used in key specification without a key length",
-"All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead",
-"Result consisted of more than one row",
-"This table type requires a primary key",
-"This version of MySQL is not compiled with RAID support",
-"You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column",
-"Key '%-.64s' doesn't exist in table '%-.64s'",
-"Can't open table",
-"The handler for the table doesn't support check/repair",
-"You are not allowed to execute this command in a transaction",
-"Got error %d during COMMIT",
-"Got error %d during ROLLBACK",
-"Got error %d during FLUSH_LOGS",
-"Got error %d during CHECKPOINT",
-"Aborted connection %ld to db: '%-.64s' user: '%-.32s' host: `%-.64s' (%-.64s)",
-"The handler for the table does not support binary table dump",
-"Binlog closed while trying to FLUSH MASTER",
-"Failed rebuilding the index of dumped table '%-.64s'",
-"Error from master: '%-.64s'",
-"Net error reading from master",
-"Net error writing to master",
-"Can't find FULLTEXT index matching the column list",
-"Can't execute the given command because you have active locked tables or an active transaction",
-"Unknown system variable '%-.64'",
-"Table '%-.64s' is marked as crashed and should be repaired",
-"Table '%-.64s' is marked as crashed and last (automatic?) repair failed",
-"Warning: Some non-transactional changed tables couldn't be rolled back",
-"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again',
-"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",
-"User %-.64s has already more than 'max_user_connections' active connections",
-"You may only use constant expressions with SET",
-"Lock wait timeout exceeded",
-"The total number of locks exceeds the lock table size",
-"Update locks cannot be acquired during a READ UNCOMMITTED transaction",
-"DROP DATABASE not allowed while thread is holding global read lock",
-"CREATE DATABASE not allowed while thread is holding global read lock",
+"BLOB kolonnen '%-.64s' brugt i nøglespecifikation uden nøglelængde",
+"Alle dele af en PRIMARY KEY skal være NOT NULL; Hvis du skal bruge NULL i nøglen, brug UNIQUE istedet",
+"Resultatet bestod af mere end een række",
+"Denne tabeltype kræver en primærnøgle",
+"Denne udgave af MySQL er ikke oversat med understøttelse af RAID",
+"Du bruger sikker opdaterings modus ('safe update mode') og du forsøgte at opdatere en tabel uden en WHERE klausul, der gør brug af et KEY felt",
+"Nøglen '%-.64s' eksisterer ikke i tabellen '%-.64s'",
+"Kan ikke åbne tabellen",
+"Denne tabeltype understøtter ikke CHECK/REPAIR",
+"Du må ikke bruge denne kommando i en transaktion",
+"Modtog fejl %d mens kommandoen COMMIT blev udført",
+"Modtog fejl %d mens kommandoen ROLLBACK blev udført",
+"Modtog fejl %d mens kommandoen FLUSH_LOGS blev udført",
+"Modtog fejl %d mens kommandoen CHECKPOINT blev udført",
+"Afbrød forbindelsen %ld til databasen '%-.64s' bruger: '%-.32s' vært: `%-.64s' (%-.64s)",
+"Denne tabeltype unserstøtter ikke binært tabeldump",
+"Binlog blev lukket mens kommandoen FLUSH MASTER blev udført",
+"Kunne ikke genopbygge indekset for den dumpede tabel '%-.64s'",
+"Fejl fra master: '%-.64s'",
+"Netværksfejl ved læsning fra master",
+"Netværksfejl ved skrivning til master",
+"Kan ikke finde en FULLTEXT nøgle som svarer til kolonne listen",
+"Kan ikke udføre den givne kommando fordi der findes aktive, låste tabeller eller fordi der udføres en transaktion",
+"Ukendt systemvariabel '%-.64'",
+"Tabellen '%-.64s' er markeret med fejl og bør repareres",
+"Tabellen '%-.64s' er markeret med fejl og sidste (automatiske?) REPAIR fejlede",
+"Advarsel: Visse data i tabeller der ikke understøtter transaktioner kunne ikke tilbagestilles",
+"Fler-udtryks transaktion krævede mere plads en 'max_binlog_cache_size' bytes. Forhøj værdien af denne variabel og prøv igen',
+"Denne handling kunne ikke udføres med kørende slave, brug først kommandoen SLAVE STOP",
+"Denne handling kræver en kørende slave. Konfigurer en slave og brug kommandoen SLAVE START",
+"Denne server er ikke konfigureret som slave. Ret in config-filen eller brug kommandoen CHANGE MASTER TO",
+"Kunne ikke initialisere master info-struktur. Check om rettigheder i master.info",
+"Kunne ikke danne en slave-tråd. Check systemressourcerne",
+"Brugeren %-.64s har allerede mere end 'max_user_connections' aktive forbindelser",
+"Du må kun bruge konstantudtryk med SET",
+"Lock wait timeout overskredet",
+"Det totale antal låse overstiger størrelsen på låse-tabellen",
+"Update lås kan ikke opnås under en READ UNCOMMITTED transaktion",
+"DROP DATABASE er ikke tilladt mens en tråd holder på globalt read lock",
+"CREATE DATABASE er ikke tilladt mens en tråd holder på globalt read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt
index df3d35600ba..4eb31cb1d45 100644
--- a/sql/share/dutch/errmsg.txt
+++ b/sql/share/dutch/errmsg.txt
@@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt
index f6ab398e92f..80b99c58940 100644
--- a/sql/share/english/errmsg.txt
+++ b/sql/share/english/errmsg.txt
@@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt
index 8686b7e17a4..816997f5266 100644
--- a/sql/share/estonian/errmsg.txt
+++ b/sql/share/estonian/errmsg.txt
@@ -216,3 +216,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt
index fb181535764..98902e847b9 100644
--- a/sql/share/french/errmsg.txt
+++ b/sql/share/french/errmsg.txt
@@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt
index eabbff043f3..1d9e770ea8d 100644
--- a/sql/share/german/errmsg.txt
+++ b/sql/share/german/errmsg.txt
@@ -215,3 +215,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt
index 2dcbad5ffba..f879c281422 100644
--- a/sql/share/greek/errmsg.txt
+++ b/sql/share/greek/errmsg.txt
@@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt
index edeaec62590..303032d73b2 100644
--- a/sql/share/hungarian/errmsg.txt
+++ b/sql/share/hungarian/errmsg.txt
@@ -214,3 +214,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt
index 434fb2fc7a0..c927eceb163 100644
--- a/sql/share/italian/errmsg.txt
+++ b/sql/share/italian/errmsg.txt
@@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt
index 306fe22ab1d..a177fcf81a8 100644
--- a/sql/share/japanese/errmsg.txt
+++ b/sql/share/japanese/errmsg.txt
@@ -214,3 +214,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt
index 89e3abd9680..5c12cbf7d42 100644
--- a/sql/share/korean/errmsg.txt
+++ b/sql/share/korean/errmsg.txt
@@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt
index dd9b153acff..05562e675bb 100644
--- a/sql/share/norwegian-ny/errmsg.txt
+++ b/sql/share/norwegian-ny/errmsg.txt
@@ -214,3 +214,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt
index 87c25bd933f..8d973a57137 100644
--- a/sql/share/norwegian/errmsg.txt
+++ b/sql/share/norwegian/errmsg.txt
@@ -214,3 +214,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt
index 2bb0dbb9802..705eb7f86ef 100644
--- a/sql/share/polish/errmsg.txt
+++ b/sql/share/polish/errmsg.txt
@@ -216,3 +216,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt
index a8a7b0a565f..ae36c738606 100644
--- a/sql/share/portuguese/errmsg.txt
+++ b/sql/share/portuguese/errmsg.txt
@@ -212,3 +212,4 @@
"DROP DATABASE não permitido enquanto uma 'thread' está assegurando um travamento global de leitura",
"CREATE DATABASE não permitido enquanto uma 'thread' está assegurando um travamento global de leitura",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt
index 9a964780398..2364bbb6d7d 100644
--- a/sql/share/romanian/errmsg.txt
+++ b/sql/share/romanian/errmsg.txt
@@ -216,3 +216,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt
index 6d4fd4bcea6..0d778d67f11 100644
--- a/sql/share/russian/errmsg.txt
+++ b/sql/share/russian/errmsg.txt
@@ -215,3 +215,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt
index de12b57638f..e990e00722b 100644
--- a/sql/share/slovak/errmsg.txt
+++ b/sql/share/slovak/errmsg.txt
@@ -220,3 +220,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt
index 3bb80df41a9..35788a72935 100644
--- a/sql/share/spanish/errmsg.txt
+++ b/sql/share/spanish/errmsg.txt
@@ -213,3 +213,4 @@
"DROP DATABASE no permitido mientras un thread está ejerciendo un bloqueo de lectura global",
"CREATE DATABASE no permitido mientras un thread está ejerciendo un bloqueo de lectura global",
"Wrong arguments to %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt
index 0451e4fe6eb..79380cbc501 100644
--- a/sql/share/swedish/errmsg.txt
+++ b/sql/share/swedish/errmsg.txt
@@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock",
"CREATE DATABASE not allowed while thread is holding global read lock",
"Felaktiga argument till %s",
+"%-.32s@%-.64s is not allowed to create new users",
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 0cca3df0b16..86d3f61776c 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -943,16 +943,41 @@ end:
DBUG_RETURN(error);
}
+
+/* Return 1 if we are allowed to create new users */
+
+static bool test_if_create_new_users(THD *thd)
+{
+ bool create_new_users=1; // Assume that we are allowed to create new users
+ if (opt_safe_user_create && !(thd->master_access & INSERT_ACL))
+ {
+ TABLE_LIST tl;
+ uint db_access;
+ bzero((char*) &tl,sizeof(tl));
+ tl.db= (char*) "mysql";
+ tl.real_name= (char*) "user";
+ db_access=acl_get(thd->host, thd->ip, (char*) &thd->remote.sin_addr,
+ thd->priv_user, tl.db);
+ if (!(db_access & INSERT_ACL))
+ {
+ if (check_grant(thd,INSERT_ACL,&tl,0,1))
+ create_new_users=0;
+ }
+ }
+ return create_new_users;
+}
+
+
/****************************************************************************
** Handle GRANT commands
****************************************************************************/
static int replace_user_table(TABLE *table, const LEX_USER &combo,
- uint rights, char what)
+ uint rights, char what, bool create_user)
{
int error = -1;
uint i,j;
- bool ima=0;
+ bool old_row_exists=0;
char *password,empty_string[1];
DBUG_ENTER("replace_user_table");
@@ -971,14 +996,21 @@ static int replace_user_table(TABLE *table, const LEX_USER &combo,
(byte*) table->field[0]->ptr,0,
HA_READ_KEY_EXACT))
{
- if (what == 'N')
+ if (!create_user)
{
- my_printf_error(ER_NONEXISTING_GRANT,ER(ER_NONEXISTING_GRANT),
- MYF(0),combo.user.str,combo.host.str);
+ THD *thd=current_thd;
+ if (what == 'N')
+ my_printf_error(ER_NONEXISTING_GRANT,ER(ER_NONEXISTING_GRANT),
+ MYF(0),combo.user.str,combo.host.str);
+ else
+ my_printf_error(ER_NO_PERMISSON_TO_CREATE_USER,
+ ER(ER_NO_PERMISSON_TO_CREATE_USER),
+ MYF(0),thd->user,
+ thd->host ? thd->host : thd->ip ? thd->ip: "");
error= -1;
goto end;
}
- ima = 0; // no row; ima on Serbian means 'there is something'
+ old_row_exists = 0;
restore_record(table,2); // cp empty row from record[2]
table->field[0]->store(combo.host.str,combo.host.length);
table->field[1]->store(combo.user.str,combo.user.length);
@@ -986,7 +1018,7 @@ static int replace_user_table(TABLE *table, const LEX_USER &combo,
}
else
{
- ima = 1;
+ old_row_exists = 1;
store_record(table,1); // Save copy for update
if (combo.password.str) // If password given
table->field[2]->store(password,(uint) strlen(password));
@@ -1001,7 +1033,7 @@ static int replace_user_table(TABLE *table, const LEX_USER &combo,
}
rights=get_access(table,3);
- if (ima) // there is a row, therefore go to update, instead of insert
+ if (old_row_exists)
{
/*
We should NEVER delete from the user table, as a uses can still
@@ -1033,7 +1065,7 @@ static int replace_user_table(TABLE *table, const LEX_USER &combo,
acl_cache->clear(1); // Clear privilege cache
if (!combo.password.str)
password=0; // No password given on command
- if (ima)
+ if (old_row_exists)
acl_update_user(combo.user.str,combo.host.str,password,rights);
else
acl_insert_user(combo.user.str,combo.host.str,password,rights);
@@ -1052,7 +1084,7 @@ static int replace_db_table(TABLE *table, const char *db,
uint rights, char what)
{
uint i,j,store_rights;
- bool ima=0;
+ bool old_row_exists=0;
int error;
DBUG_ENTER("replace_db_table");
@@ -1076,7 +1108,7 @@ static int replace_db_table(TABLE *table, const char *db,
combo.user.str,combo.host.str);
goto abort;
}
- ima = 0; // no row
+ old_row_exists = 0;
restore_record(table,2); // cp empty row from record[2]
table->field[0]->store(combo.host.str,combo.host.length);
table->field[1]->store(db,(uint) strlen(db));
@@ -1084,7 +1116,7 @@ static int replace_db_table(TABLE *table, const char *db,
}
else
{
- ima = 1;
+ old_row_exists = 1;
store_record(table,1);
}
@@ -1097,8 +1129,9 @@ static int replace_db_table(TABLE *table, const char *db,
rights=get_access(table,3);
rights=fix_rights_for_db(rights);
- if (ima) // there is a row, therefore go update, else insert
+ if (old_row_exists)
{
+ // update old existing row
if (rights)
{
if ((error=table->file->update_row(table->record[1],table->record[0])))
@@ -1117,7 +1150,7 @@ static int replace_db_table(TABLE *table, const char *db,
}
acl_cache->clear(1); // Clear privilege cache
- if (ima)
+ if (old_row_exists)
acl_update_db(combo.user.str,combo.host.str,db,rights);
else
acl_insert_db(combo.user.str,combo.host.str,db,rights);
@@ -1324,7 +1357,7 @@ static int replace_column_table(GRANT_TABLE *g_t,
while ((xx=iter++))
{
uint privileges = xx->rights;
- bool ima=0;
+ bool old_row_exists=0;
key_restore(table,key,0,key_length);
table->field[4]->store(xx->column.ptr(),xx->column.length());
@@ -1339,7 +1372,7 @@ static int replace_column_table(GRANT_TABLE *g_t,
result= -1; /* purecov: inspected */
continue; /* purecov: inspected */
}
- ima = 0;
+ old_row_exists = 0;
restore_record(table,2); // Get empty record
key_restore(table,key,0,key_length);
table->field[4]->store(xx->column.ptr(),xx->column.length());
@@ -1353,13 +1386,13 @@ static int replace_column_table(GRANT_TABLE *g_t,
privileges = tmp & ~(privileges | rights);
else
privileges |= tmp;
- ima = 1;
+ old_row_exists = 1;
store_record(table,1); // copy original row
}
table->field[6]->store((longlong) get_rights_for_column(privileges));
- if (ima) // there is a row, therefore go update, else insert
+ if (old_row_exists)
{
if (privileges)
error=table->file->update_row(table->record[1],table->record[0]);
@@ -1465,7 +1498,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
uint rights, uint kolone, bool revoke_grant)
{
char grantor[HOSTNAME_LENGTH+1+USERNAME_LENGTH];
- int ima = 1;
+ int old_row_exists = 1;
int error=0;
uint store_table_rights,store_col_rights;
DBUG_ENTER("replace_table_table");
@@ -1505,13 +1538,13 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
table_name); /* purecov: deadcode */
DBUG_RETURN(-1); /* purecov: deadcode */
}
- ima = 0; // no row
+ old_row_exists = 0;
restore_record(table,1); // Get saved record
}
store_table_rights=get_rights_for_table(rights);
store_col_rights=get_rights_for_column(kolone);
- if (ima)
+ if (old_row_exists)
{
uint j,k;
store_record(table,1);
@@ -1536,7 +1569,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
rights=fix_rights_for_table(store_table_rights);
kolone=fix_rights_for_column(store_col_rights);
- if (ima) // there is a row, therefore go update, else insert
+ if (old_row_exists)
{
if (store_table_rights || store_col_rights)
{
@@ -1668,10 +1701,12 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
continue;
}
/* Create user if needed */
- if ((replace_user_table(tables[0].table,
+ if (replace_user_table(tables[0].table,
*Str,
0,
- revoke_grant ? 'N' : 'Y')))
+ revoke_grant ? 'N' : 'Y',
+ (revoke_grant ? 0 :
+ test_if_create_new_users(thd))))
{
result= -1; // Remember error
continue; // Add next user
@@ -1773,6 +1808,7 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, uint rights,
List_iterator <LEX_USER> str_list (list);
LEX_USER *Str;
char what;
+ bool create_new_users=0;
TABLE_LIST tables[2];
DBUG_ENTER("mysql_grant");
@@ -1799,8 +1835,10 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, uint rights,
DBUG_RETURN(-1); /* purecov: deadcode */
}
- // go through users in user_list
+ if (!revoke_grant)
+ create_new_users= test_if_create_new_users(thd);
+ // go through users in user_list
pthread_mutex_lock(&LOCK_grant);
VOID(pthread_mutex_lock(&acl_cache->lock));
grant_version++;
@@ -1822,11 +1860,14 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, uint rights,
}
if ((replace_user_table(tables[0].table,
*Str,
- (!db ? rights : 0), what)))
- result= -1;
- if (db && replace_db_table(tables[1].table, db, *Str, rights & DB_ACLS,
- what))
+ (!db ? rights : 0), what, create_new_users)))
result= -1;
+ else
+ {
+ if (db && replace_db_table(tables[1].table, db, *Str, rights & DB_ACLS,
+ what))
+ result= -1;
+ }
}
VOID(pthread_mutex_unlock(&acl_cache->lock));
pthread_mutex_unlock(&LOCK_grant);
@@ -1978,7 +2019,7 @@ void grant_reload(void)
****************************************************************************/
bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables,
- uint show_table)
+ uint show_table, bool no_errors)
{
TABLE_LIST *table;
char *user = thd->priv_user;
@@ -2026,7 +2067,7 @@ bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables,
err:
pthread_mutex_unlock(&LOCK_grant);
- if (show_table != 1) // Not a silent skip of table
+ if (!no_errors) // Not a silent skip of table
{
const char *command="";
if (want_access & SELECT_ACL)
diff --git a/sql/sql_acl.h b/sql/sql_acl.h
index ff9a105d76b..cf9696d51e7 100644
--- a/sql/sql_acl.h
+++ b/sql/sql_acl.h
@@ -74,7 +74,7 @@ int grant_init(void);
void grant_free(void);
void grant_reload(void);
bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables,
- uint show_command=0);
+ uint show_command=0, bool dont_print_error=0);
bool check_grant_column (THD *thd,TABLE *table, const char *name,uint length,
uint show_command=0);
bool check_grant_all_columns(THD *thd, uint want_access, TABLE *table);
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index fd7945cb5bf..a38829f3605 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -133,7 +133,7 @@ int list_open_tables(THD *thd,List<char> *tables, const char *db,
table_list.db= (char*) db;
table_list.real_name= entry->real_name;/*real name*/
table_list.grant.privilege=col_access;
- if (check_grant(thd,TABLE_ACLS,&table_list,1))
+ if (check_grant(thd,TABLE_ACLS,&table_list,1,1))
continue;
}
/* need to check if he have't already listed it */
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 87fbed47ef1..030d4743105 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -36,7 +36,6 @@ extern "C" int gethostname(char *name, int namelen);
static int check_for_max_user_connections(const char *user, int u_length,
const char *host);
static void decrease_user_connections(const char *user, const char *host);
-static bool check_table_access(THD *thd,uint want_access, TABLE_LIST *tables);
static bool check_db_used(THD *thd,TABLE_LIST *tables);
static bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *tables);
static bool check_dup(THD *thd,const char *db,const char *name,
@@ -1956,7 +1955,7 @@ mysql_execute_command(void)
else
res = mysql_grant(thd, lex->db, lex->users_list, lex->grant,
lex->sql_command == SQLCOM_REVOKE);
- if(!res)
+ if (!res)
{
mysql_update_log.write(thd, thd->query,thd->query_length);
if (mysql_bin_log.is_open())
@@ -2116,7 +2115,7 @@ bool check_process_priv(THD *thd)
** in the table list for GRANT checking
*/
-static bool
+bool
check_table_access(THD *thd,uint want_access,TABLE_LIST *tables)
{
uint found=0,found_access=0;
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 637ab4fe7e9..71ee60e1eca 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -220,7 +220,7 @@ mysql_find_files(THD *thd,List<char> *files, const char *db,const char *path,
table_list.db= (char*) db;
table_list.real_name=file->name;
table_list.grant.privilege=col_access;
- if (check_grant(thd,TABLE_ACLS,&table_list,1))
+ if (check_grant(thd,TABLE_ACLS,&table_list,1,1))
continue;
}
if (files->push_back(thd->strdup(file->name)))
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 207f9dd324d..44372ad4800 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -59,9 +59,9 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists)
VOID(pthread_mutex_lock(&LOCK_open));
pthread_mutex_unlock(&thd->mysys_var->mutex);
- if(global_read_lock)
+ if (global_read_lock)
{
- if(thd->global_read_lock)
+ if (thd->global_read_lock)
{
my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE,MYF(0),
tables->real_name);
@@ -1126,7 +1126,12 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
strmov(new_name_buff,new_name);
fn_same(new_name_buff,table_name,3);
#ifdef FN_LOWER_CASE
- if (!my_strcasecmp(new_name_buff,table_name))// Check if name changed
+ if (lower_case_table_names)
+ casedn_str(new_name);
+ if ((lower_case_table_names &&
+ !my_strcasecmp(new_name_buff,table_name)) ||
+ (!lower_case_table_names &&
+ !strcmp(new_name_buff,table_name)))
#else
if (!strcmp(new_name_buff,table_name)) // Check if name changed
#endif