1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00

Portability fixes

Added record_rnd_buffer
Added --safe-user-create
Fix for ALTER TABLE RENAME on windows
This commit is contained in:
monty@hundin.mysql.fi
2001-08-10 17:37:37 +03:00
parent 410faef67e
commit e7575da7bb
36 changed files with 367 additions and 186 deletions

View File

@ -14522,15 +14522,10 @@ Skip some optimize stages. Implies @code{--skip-delay-key-write}.
@item --safe-show-database @item --safe-show-database
Don't show databases for which the user doesn't have any privileges. Don't show databases for which the user doesn't have any privileges.
@item --secure @item --safe-user-create
IP numbers returned by the @code{gethostbyname()} system call are If this is enabled, a user can't create new users with the GRANT
checked to make sure they resolve back to the original hostname. This command, if the user doesn't have @code{INSERT} privilege to the
makes it harder for someone on the outside to get access by pretending @code{mysql.user} table or any column in this table.
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 --skip-concurrent-insert @item --skip-concurrent-insert
Turn off the ability to select and insert at the same time on @code{MyISAM} 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}. can then be read with @code{SELECT}.
@item @item
If you don't trust your DNS, you should use IP numbers instead of hostnames If you don't trust your DNS, you should use IP numbers instead of
in the grant tables. In principle, the @code{--secure} option to hostnames in the grant tables. In any case, you should be very careful
@code{mysqld} should make hostnames safe. In any case, you should be very about creating grant table entries using hostname values that contain
careful about creating grant table entries using hostname values that wild cards!
contain wild cards!
@item @item
If you want to restrict the number of connections for a single user, you 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}. @code{mysqld}.
@end itemize @end itemize
@node Privileges options, What Privileges, Security, Privilege system @node Privileges options, What Privileges, Security, Privilege system
@subsection Startup Options for @code{mysqld} Concerning Security @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 @table @code
@item --secure @item --safe-show-database
IP numbers returned by the @code{gethostbyname()} system call are With this option,
checked to make sure they resolve back to the original hostname. This @code{SHOW DATABASES} returns only those databases for which the user has
makes it harder for someone on the outside to get access by pretending some kind of privilege.
to be another host. This option also adds some sanity checks of
hostnames. The option is turned off by default in @strong{MySQL} Version @item @code{--safe-user-create}
3.21 because sometimes it takes a long time to perform backward resolutions. If this is enabled, an user can't create new users with the @code{GRANT}
@strong{MySQL} Version 3.22 caches hostnames and has this option enabled by command, if the user doesn't have @code{INSERT} privilege to the
default. @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 @item --skip-grant-tables
This option causes the server not to use the privilege system at all. This 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 With this option, the
@code{SHOW DATABASES} statement doesn't return anything. @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 @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 size for each table it scans. If you do many sequential scans, you may
want to increase this value. 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} @item @code{query_buffer_size}
The initial allocation of the query buffer. If most of your queries are The initial allocation of the query buffer. If most of your queries are
long (like when inserting blobs), you should increase this! 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 net_write_timeout current value: 60
query_buffer_size current value: 0 query_buffer_size current value: 0
record_buffer current value: 131072 record_buffer current value: 131072
record_rnd_buffer current value: 131072
slow_launch_time current value: 2 slow_launch_time current value: 2
sort_buffer current value: 2097116 sort_buffer current value: 2097116
table_cache current value: 64 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 & -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &
@end example @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 When you have installed @strong{MySQL}, the @file{support-files} directory will
contain some different @code{my.cnf} example files, @file{my-huge.cnf}, 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 @file{my-large.cnf}, @file{my-medium.cnf}, and @file{my-small.cnf}, you can
@ -26167,6 +26177,11 @@ common we may add general support for memory mapping.
Each request doing a sequential scan over a table allocates a read buffer Each request doing a sequential scan over a table allocates a read buffer
(variable @code{record_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 @item
All joins are done in one pass, and most joins can be done without even 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) using a temporary table. Most temporary tables are memory-based (HEAP)
@ -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 @code{2} (@code{scale}) represents the number of digits that will be
stored following the decimal point. In this case, therefore, the range stored following the decimal point. In this case, therefore, the range
of values that can be stored in the @code{salary} column is from 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 @code{DECIMAL(p)} is equivalent to @code{DECIMAL(p,0)}. Similarly, the
syntax @code{DECIMAL} is equivalent to @code{DECIMAL(p,0)}, where the syntax @code{DECIMAL} is equivalent to @code{DECIMAL(p,0)}, where the
implementation is allowed to decide the value of @code{p}. 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 Normally, if any expression in a string comparison is case sensitive, the
comparison is performed in case-sensitive fashion. 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 @table @code
@findex LIKE @findex LIKE
@item expr LIKE pat [ESCAPE 'escape-char'] @item expr LIKE pat [ESCAPE 'escape-char']
@ -37893,12 +37917,16 @@ To make Access work:
@itemize @bullet @itemize @bullet
@item @item
If you are using Access 2000, you should get and install the newest If you are using Access 2000, you should get and install the newest
Microsoft MDAC (@code{Microsoft Data Access Components}) from (version 2.6 or above) Microsoft MDAC (@code{Microsoft Data Access
@uref{http://www.microsoft.com/data}. This will fix the following bug Components}) from @uref{http://www.microsoft.com/data}. This will fix
in Access: when you export data to @strong{MySQL}, the table and column the following bug in Access: when you export data to @strong{MySQL}, the
names aren't specified. Another way to around this bug is to upgrade to table and column names aren't specified. Another way to around this bug
MyODBC Version 2.50.33 and @strong{MySQL} Version 3.23.x, which together is to upgrade to MyODBC Version 2.50.33 and @strong{MySQL} Version
provide a workaround for this bug! 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 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 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 function overview:: C API Function Overview
* C API functions:: C API Function Descriptions * C API functions:: C API Function Descriptions
* C API problems:: * C API problems::
* Thread-safe clients:: * Thread-safe clients:: How to Make a Thread-safe Client
@end menu @end menu
The C API code is distributed with @strong{MySQL}. It is included in the 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. establish and release a mutex lock.
@end itemize @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 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 client with @code{mysqlclient_r}. In most cases this is because you haven't
included the thread libraries on the link/compile line. included the thread libraries on the link/compile line.
@ -45434,6 +45490,8 @@ Romanian error messages.
Hungarian error messages. Hungarian error messages.
@item Roberto M. Serqueira @item Roberto M. Serqueira
Portugise error messages. Portugise error messages.
@item Carsten H. Pedersen
Danish error messages
@item David Sacerdote @email{davids@@secnet.com} @item David Sacerdote @email{davids@@secnet.com}
Ideas for secure checking of DNS hostnames. Ideas for secure checking of DNS hostnames.
@item Wei-Jou Chen @email{jou@@nematic.ieo.nctu.edu.tw} @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. not yet 100% confident in this code.
@menu @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.40:: Changes in release 3.23.40
* News-3.23.39:: Changes in release 3.23.39 * News-3.23.39:: Changes in release 3.23.39
* News-3.23.38:: Changes in release 3.23.38 * 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 @appendixsubsec Changes in release 3.23.41
@itemize @bullet @itemize @bullet
@item @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 Fixed optimizing bug in @code{ORDER BY} where some @code{ORDER BY} parts
where wrongly removed. 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 @end itemize
@node News-3.23.40, News-3.23.39, News-3.23.41, News-3.23.x @node News-3.23.40, News-3.23.39, News-3.23.41, News-3.23.x

View File

@ -218,17 +218,19 @@ my_bool check_scramble(const char *, const char *message,
unsigned long *salt,my_bool old_ver); unsigned long *salt,my_bool old_ver);
char *get_tty_password(char *opt_message); char *get_tty_password(char *opt_message);
void hash_password(unsigned long *result, const char *password); void hash_password(unsigned long *result, const char *password);
#ifdef __cplusplus
}
#endif
/* Some other useful functions */ /* Some other useful functions */
void my_init(void); void my_init(void);
void load_defaults(const char *conf_file, const char **groups, void load_defaults(const char *conf_file, const char **groups,
int *argc, char ***argv); int *argc, char ***argv);
my_bool my_thread_init(void);
void my_thread_end(void); void my_thread_end(void);
#ifdef __cplusplus
}
#endif
#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */ #define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */
#ifdef __WIN__ #ifdef __WIN__

View File

@ -211,4 +211,5 @@
#define ER_DROP_DB_WITH_READ_LOCK 1208 #define ER_DROP_DB_WITH_READ_LOCK 1208
#define ER_CREATE_DB_WITH_READ_LOCK 1209 #define ER_CREATE_DB_WITH_READ_LOCK 1209
#define ER_WRONG_ARGUMENTS 1210 #define ER_WRONG_ARGUMENTS 1210
#define ER_ERROR_MESSAGES 211 #define ER_NO_PERMISSON_TO_CREATE_USER 1211
#define ER_ERROR_MESSAGES 212

View File

@ -10,6 +10,7 @@ Created 11/11/1995 Heikki Tuuri
#ifdef UNIV_NONINL #ifdef UNIV_NONINL
#include "buf0flu.ic" #include "buf0flu.ic"
#include "trx0sys.h"
#endif #endif
#include "ut0byte.h" #include "ut0byte.h"

View File

@ -9,12 +9,10 @@ Created 1/20/1994 Heikki Tuuri
#ifndef univ_i #ifndef univ_i
#define univ_i #define univ_i
#if (defined(_WIN32) || defined(_WIN64)) #if (defined(_WIN32) || defined(_WIN64)) && !defined(MYSQL_SERVER)
#define __WIN__ #define __WIN__
#ifndef MYSQL_SERVER
#include <windows.h> #include <windows.h>
#endif
/* If you want to check for errors with compiler level -W4, /* If you want to check for errors with compiler level -W4,
comment out the above include of windows.h and let the following defines comment out the above include of windows.h and let the following defines

View File

@ -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 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; 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; 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;

View File

@ -251,6 +251,7 @@ void kill_mysql(void);
void close_connection(NET *net,uint errcode=0,bool lock=1); 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 check_access(THD *thd,uint access,const char *db=0,uint *save_priv=0,
bool no_grant=0); bool no_grant=0);
bool check_table_access(THD *thd,uint want_access,TABLE_LIST *tables);
bool check_process_priv(THD *thd=0); bool check_process_priv(THD *thd=0);
int generate_table(THD *thd, TABLE_LIST *table_list, 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, what_to_log,flush_time,
max_tmp_tables,max_heap_table_size,query_buff_size, max_tmp_tables,max_heap_table_size,query_buff_size,
lower_case_table_names,thread_stack,thread_stack_min, 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 ulong specialflag, current_pid;
extern bool low_priority_updates, using_update_log; extern bool low_priority_updates, using_update_log,opt_warnings;
extern bool opt_sql_bin_update, opt_safe_show_db, 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 char language[LIBLEN],reg_ext[FN_EXTLEN],blob_newline;
extern const char **errmesg; /* Error messages */ extern const char **errmesg; /* Error messages */
extern const char *default_tx_isolation_name; extern const char *default_tx_isolation_name;

View File

@ -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_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0,
opt_ansi_mode=0,opt_myisam_log=0, opt_ansi_mode=0,opt_myisam_log=0,
opt_large_files=sizeof(my_off_t) > 4; 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; FILE *bootstrap_file=0;
int segfaulted = 0; // ensure we do not enter SIGSEGV handler twice int segfaulted = 0; // ensure we do not enter SIGSEGV handler twice
extern MASTER_INFO glob_mi; 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, query_buff_size, lower_case_table_names, mysqld_net_retry_count,
net_interactive_timeout, slow_launch_time = 2L, net_interactive_timeout, slow_launch_time = 2L,
net_read_timeout,net_write_timeout,slave_open_temp_tables=0, 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 slave_net_timeout;
ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0; ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0;
volatile ulong cached_thread_count=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 // get rid of extention if the log is binary to avoid problems
if (type == LOG_BIN) if (type == LOG_BIN)
{ {
char* p = strrchr((char*) opt_name, FN_EXTCHAR); char *p = fn_ext(opt_name);
if (p) 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); log->open(opt_name,type);
} }
@ -2471,7 +2476,8 @@ enum options {
OPT_GEMINI_FLUSH_LOG, OPT_GEMINI_RECOVER, OPT_GEMINI_FLUSH_LOG, OPT_GEMINI_RECOVER,
OPT_GEMINI_UNBUFFERED_IO, OPT_SKIP_SAFEMALLOC, OPT_GEMINI_UNBUFFERED_IO, OPT_SKIP_SAFEMALLOC,
OPT_SKIP_STACK_TRACE, OPT_SKIP_SYMLINKS, 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[] = { static struct option long_options[] = {
@ -2583,7 +2589,7 @@ static struct option long_options[] = {
(int) OPT_REPLICATE_REWRITE_DB}, (int) OPT_REPLICATE_REWRITE_DB},
{"safe-mode", no_argument, 0, (int) OPT_SAFE}, {"safe-mode", no_argument, 0, (int) OPT_SAFE},
{"safe-show-database", no_argument, 0, (int) OPT_SAFE_SHOW_DB}, {"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}, {"server-id", required_argument, 0, (int) OPT_SERVER_ID},
{"set-variable", required_argument, 0, 'O'}, {"set-variable", required_argument, 0, 'O'},
{"skip-bdb", no_argument, 0, (int) OPT_BDB_SKIP}, {"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-stack-trace", no_argument, 0, (int) OPT_SKIP_STACK_TRACE},
{"skip-symlink", no_argument, 0, (int) OPT_SKIP_SYMLINKS}, {"skip-symlink", no_argument, 0, (int) OPT_SKIP_SYMLINKS},
{"skip-thread-priority", no_argument, 0, (int) OPT_SKIP_PRIOR}, {"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}, {"sql-bin-update-same", no_argument, 0, (int) OPT_SQL_BIN_UPDATE_SAME},
#include "sslopt-longopts.h" #include "sslopt-longopts.h"
#ifdef __WIN__ #ifdef __WIN__
@ -2741,6 +2748,8 @@ CHANGEABLE_VAR changeable_vars[] = {
0, MALLOC_OVERHEAD, (long) ~0, MALLOC_OVERHEAD, IO_SIZE }, 0, MALLOC_OVERHEAD, (long) ~0, MALLOC_OVERHEAD, IO_SIZE },
{ "record_buffer", (long*) &my_default_record_cache_size, { "record_buffer", (long*) &my_default_record_cache_size,
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_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", (long*) &slave_net_timeout,
SLAVE_NET_TIMEOUT, 1, 65535, 0, 1 }, SLAVE_NET_TIMEOUT, 1, 65535, 0, 1 },
{ "slow_launch_time", (long*) &slow_launch_time, { "slow_launch_time", (long*) &slow_launch_time,
@ -2856,6 +2865,7 @@ struct show_var_st init_vars[]= {
{"port", (char*) &mysql_port, SHOW_INT}, {"port", (char*) &mysql_port, SHOW_INT},
{"protocol_version", (char*) &protocol_version, SHOW_INT}, {"protocol_version", (char*) &protocol_version, SHOW_INT},
{"record_buffer", (char*) &my_default_record_cache_size,SHOW_LONG}, {"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}, {"query_buffer_size", (char*) &query_buff_size, SHOW_LONG},
{"safe_show_database", (char*) &opt_safe_show_db, SHOW_BOOL}, {"safe_show_database", (char*) &opt_safe_show_db, SHOW_BOOL},
{"server_id", (char*) &server_id, SHOW_LONG}, {"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-mode Skip some optimize stages (for testing)\n\
--safe-show-database Don't show databases for which the user has no\n\ --safe-show-database Don't show databases for which the user has no\n\
privileges\n\ privileges\n\
--safe-user-create Don't new users cretaion without privileges to the\n\
mysql.user table\n\
--skip-concurrent-insert\n\ --skip-concurrent-insert\n\
Don't use concurrent insert with MyISAM\n\ Don't use concurrent insert with MyISAM\n\
--skip-delay-key-write\n\ --skip-delay-key-write\n\
@ -3747,6 +3759,9 @@ static void get_options(int argc,char **argv)
case OPT_SAFE_SHOW_DB: case OPT_SAFE_SHOW_DB:
opt_safe_show_db=1; opt_safe_show_db=1;
break; break;
case OPT_SAFE_USER_CREATE:
opt_safe_user_create=1;
break;
case OPT_SKIP_SAFEMALLOC: case OPT_SKIP_SAFEMALLOC:
#ifdef SAFEMALLOC #ifdef SAFEMALLOC
sf_malloc_quick=1; sf_malloc_quick=1;
@ -3770,6 +3785,9 @@ static void get_options(int argc,char **argv)
fix_paths(); fix_paths();
default_table_type_name=ha_table_typelib.type_names[default_table_type-1]; 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]; 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;
} }

View File

@ -66,7 +66,7 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table,
table->file->rnd_init(0); table->file->rnd_init(0);
if (! (specialflag & SPECIAL_SAFE_MODE) && if (! (specialflag & SPECIAL_SAFE_MODE) &&
my_default_record_cache_size && record_rnd_cache_size &&
!table->file->fast_key_read() && !table->file->fast_key_read() &&
(table->db_stat & HA_READ_ONLY || (table->db_stat & HA_READ_ONLY ||
table->reginfo.lock_type <= TL_READ_NO_INSERT) && 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->reclength=ALIGN_SIZE(info->struct_length);
info->error_offset=info->table->reclength; 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); (info->reclength+info->struct_length);
rec_cache_size=info->cache_records*info->reclength; rec_cache_size=info->cache_records*info->reclength;
info->rec_cache_size=info->cache_records*info->ref_length; info->rec_cache_size=info->cache_records*info->ref_length;

View File

@ -221,3 +221,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -2,29 +2,29 @@
This file is public domain and comes with NO WARRANTY of any kind */ This file is public domain and comes with NO WARRANTY of any kind */
/* Knud Riish<73>jg<6A>rd knudriis@post.tele.dk 99 && /* Knud Riish<73>jg<6A>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", "hashchk",
"isamchk", "isamchk",
"NEJ", "NEJ",
"JA", "JA",
"Kan ikke oprette filen '%-.64s' (Fejlkode: %d)", "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'. Fejl %d",
"Kan ikke oprette databasen '%-.64s'. Databasen eksisterer", "Kan ikke oprette databasen '%-.64s'. Databasen eksisterer",
"Kan ikke slette (droppe) '%-.64s'. Databasen eksisterer ikke", "Kan ikke slette (droppe) '%-.64s'. Databasen eksisterer ikke",
"Fejl ved sletning (drop) af databasen (kan ikke slette '%-.64s', Fejl %d)", "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)", "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 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 l<>se fil (Fejlkode: %d)",
"Kan ikke <20>bne fil: '%-.64s'. (Fejlkode: %d)", "Kan ikke <20>bne fil: '%-.64s'. (Fejlkode: %d)",
"Kan ikke finde fila: '%-.64s' (Fejlkode: %d)", "Kan ikke finde fila: '%-.64s' (Fejlkode: %d)",
"Kan ikke l<>se bibliotek '%-.64s' (Fejlkode: %d)", "Kan ikke l<>se folder '%-.64s' (Fejlkode: %d)",
"Kan ikke skifte bibliotek til '%-.64s' (Fejlkode: %d)", "Kan ikke skifte folder til '%-.64s' (Fejlkode: %d)",
"Posten er<65>ndret siden sidst l<>st '%-.64s'", "Posten er <EFBFBD>ndret siden sidste l<>sning '%-.64s'",
"Ikke mere diskplads (%s). Venter p<> at f<> frigjort plads....", "Ikke mere diskplads (%s). Venter p<> at f<> frigjort plads....",
"Kan ikke skrive, flere ens n<>gler i tabellen '%-.64s'", "Kan ikke skrive, flere ens n<>gler i tabellen '%-.64s'",
"Fejl ved lukning af '%-.64s' (Fejlkode: %d)", "Fejl ved lukning af '%-.64s' (Fejlkode: %d)",
@ -32,10 +32,10 @@
"Fejl ved omd<6D>bning af '%-.64s' til '%-.64s' (Fejlkode: %d)", "Fejl ved omd<6D>bning af '%-.64s' til '%-.64s' (Fejlkode: %d)",
"Fejl ved skriving av filen '%-.64s' (Fejlkode: %d)", "Fejl ved skriving av filen '%-.64s' (Fejlkode: %d)",
"'%-.64s' er l<>st mod opdateringer", "'%-.64s' er l<>st mod opdateringer",
"Sortering afbrutt", "Sortering afbrudt",
"View '%-.64s' eksisterer ikke for '%-.64s'", "View '%-.64s' eksisterer ikke for '%-.64s'",
"Modtog fejl %d fra tabel h<>ndterer", "Modtog fejl %d fra tabel h<>ndteringen",
"Tabel h<>ndtereren for '%-.64s' har ikke denne mulighed", "Denne mulighed eksisterer ikke for tabeltypen '%-.64s'",
"Kan ikke finde posten i '%-.64s'", "Kan ikke finde posten i '%-.64s'",
"Forkert indhold i: '%-.64s'", "Forkert indhold i: '%-.64s'",
"Fejl i indeksfilen til tabellen '%-.64s', pr<70>v at reparere den", "Fejl i indeksfilen til tabellen '%-.64s', pr<70>v at reparere den",
@ -43,95 +43,95 @@
"'%-.64s' er skrivebeskyttet", "'%-.64s' er skrivebeskyttet",
"Ikke mere hukommelse. Genstart serveren og pr<70>v igen (mangler %d bytes)", "Ikke mere hukommelse. Genstart serveren og pr<70>v igen (mangler %d bytes)",
"Ikke mere sorteringshukommelse. <20>g sorteringshukommelse (sort buffer size) for serveren", "Ikke mere sorteringshukommelse. <20>g sorteringshukommelse (sort buffer size) for serveren",
"Uventet sluttning af fil (eof) ved l<>sning af filen '%-.64s' (Fejlkode: %d)", "Uventet afslutning p<EFBFBD> fil (eof) ved l<>sning af filen '%-.64s' (Fejlkode: %d)",
"For mange tilkoblinger (connections)", "For mange forbindelser (connections)",
"Udg<64>et for tr<74>de/hukommelse", "Udg<64>et for tr<74>de/hukommelse",
"Kan ikke f<> v<>rtsnavn for din adresse", "Kan ikke f<> v<>rtsnavn for din adresse",
"Forkert h<>ndtryk (handshake)", "Forkert h<>ndtryk (handshake)",
"Adgang n<>gtet bruger: '%-.32s@%-.64s' til databasen '%-.64s'", "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", "Ingen database valgt",
"Ukendt kommando", "Ukendt kommando",
"Kolonne '%-.64s' kan ikke v<>re nul", "Kolonne '%-.64s' kan ikke v<>re NULL",
"Ukendt database '%-.64s'", "Ukendt database '%-.64s'",
"Tabellen '%-.64s' eksisterer allerede", "Tabellen '%-.64s' findes allerede",
"Ukendt tabel '%-.64s'", "Ukendt tabel '%-.64s'",
"Felt: '%-.64s' i tabel %s er ikke entydigt", "Felt: '%-.64s' i tabel %s er ikke entydigt",
"Database nedkobling er i gang", "Database nedlukning er i gang",
"Ukendt kolonne '%-.64s' i tabel %s", "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'", "Kan ikke gruppere p<> '%-.64s'",
"Udtrykket har summer (sum) funktioner og kolonner i samme udtryk", "Udtrykket har summer (sum) funktioner og kolonner i samme udtryk",
"Kolonne t<>ller stemmer ikke med v<>rdit<EFBFBD>ller", "Kolonne t<>ller stemmer ikke med antallet af v<EFBFBD>rdier",
"Identifikationen '%-.64s' er for lang", "Navnet '%-.64s' er for langt",
"Feltnavnet '%-.64s' eksisterer allerede", "Feltnavnet '%-.64s' findes allerede",
"Indeksnavnet '%-.64s' eksisterer allerede", "Indeksnavnet '%-.64s' findes allerede",
"Ens v<>rdier '%-.64s' for indeks %d", "Ens v<>rdier '%-.64s' for indeks %d",
"Forkert kolonnespecifikaton for felt '%-.64s'", "Forkert kolonnespecifikaton for felt '%-.64s'",
"%s n<>r '%-.64s' p<> linje %d", "%s n<>r '%-.64s' p<> linje %d",
"Foresp<73>rgsel var tom", "Foresp<73>rgsel var tom",
"Ikke unikt tabel/alias: '%-.64s'", "Tabellen/aliaset: '%-.64s' er ikke unikt",
"Ugyldig standardv<64>rdi for '%-.64s'", "Ugyldig standardv<64>rdi for '%-.64s'",
"Flere prim<69>rindekser specificeret", "Flere prim<69>rn<EFBFBD>gler specificeret",
"For mange indekser specificeret. Maks %d indekser tillatt", "For mange n<EFBFBD>gler specificeret. Kun %d n<>gler m<> bruges",
"For mange indeksdele specificeret. Maks %d dele tillatt", "For mange n<EFBFBD>gledele specificeret. Kun %d dele m<EFBFBD> bruges",
"Specificeret indeks var for langt. Maks indeksl<EFBFBD>ngde er %d", "Specificeret n<EFBFBD>gle var for lang. Maksimal n<>glel<EFBFBD>ngde er %d",
"Indeks felt '%-.64s' eksiterer ikke i tabellen", "N<EFBFBD>glefeltet '%-.64s' eksisterer ikke i tabellen",
"Blob felt '%-.64s' kan ikke bruges ved specifikation af indeks", "BLOB feltet '%-.64s' kan ikke bruges ved specifikation af indeks",
"For stor feltl<74>ngde for kolonne '%-.64s' (maks = %d). Brug BLOB i stedet", "For stor feltl<74>ngde for kolonne '%-.64s' (maks = %d). Brug BLOB i stedet",
"Der kan kun bruges eet AUTO-felt og det skal v<>re indekseret", "Der kan kun specificeres eet AUTO_INCREMENT-felt, og det skal v<>re indekseret",
"%s: klar for tilslutninger\n", "%s: klar til tilslutninger\n",
"%s: Normal nedlukning\n", "%s: Normal nedlukning\n",
"%s: Opdaget signal %d. Afslutter!!\n", "%s: Fangede signal %d. Afslutter!!\n",
"%s: Server lukket\n", "%s: Server lukket\n",
"%s: Forceret nedlukning af tr<74>d: %ld bruger: '%-.64s'\n", "%s: Forceret nedlukning af tr<74>d: %ld bruger: '%-.64s'\n",
"Kan ikke oprette IP socket", "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", "Felt adskiller er ikke som forventet, se dokumentationen",
"Man kan ikke bruge faste feltl<74>ngder med BLOB. Brug i stedet 'fields terminated by'.", "Man kan ikke bruge faste feltl<74>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", "Filen '%-.64s' eksisterer allerede",
"Poster: %ld Fjernet: %ld Sprunget over: %ld Advarsler: %ld", "Poster: %ld Fjernet: %ld Sprunget over: %ld Advarsler: %ld",
"Poster: %ld Ens: %ld", "Poster: %ld Ens: %ld",
"Forkert indeksdel. Den anvendte indeksdel er ikke en streng eller den l<EFBFBD>ngden er st<73>rre end indeksl<EFBFBD>ngden", "Forkert indeksdel. Den anvendte n<EFBFBD>gledel er ikke en streng eller l<>ngden er st<73>rre end n<EFBFBD>glel<EFBFBD>ngden",
"Man kan ikke slette alle felter med ALTER TABLE. Brug DROP TABLE i stedet.", "Man kan ikke slette alle felter med ALTER TABLE. Brug DROP TABLE i stedet.",
"Kan ikke DROP '%-.64s'. Unders<72>g om felt/indeks eksisterer.", "Kan ikke udf<EFBFBD>re DROP '%-.64s'. Unders<72>g om feltet/n<>glen eksisterer.",
"Poster: %ld Ens: %ld Advarsler: %ld", "Poster: %ld Ens: %ld Advarsler: %ld",
"INSERT TABLE '%-.64s' er ikke tilladt i FROM tabel liste", "INSERT TABLE '%-.64s' er ikke tilladt i FROM tabel liste",
"Ukendt tr<74>d id: %lu", "Ukendt tr<74>d id: %lu",
"Du er ikke ejer av tr<74>den %lu", "Du er ikke ejer af tr<74>den %lu",
"Ingen tabeller i brug", "Ingen tabeller i brug",
"For mange tekststrenge kolonne %s og SET", "For mange tekststrenge til specifikationen af SET i kolonne %-.64s",
"Kan ikke lave unikt loggfilnavn %s.(1-999)\n", "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 l<>st med READ l<>s og kan ikke opdateres",
"Tabellen '%-.64s' var ikke l<>st med LOCK TABLES", "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 database navn '%-.64s'",
"Ugyldigt tabel navn '%-.64s'", "Ugyldigt tabel navn '%-.64s'",
"SELECT ville unders<72>ge for mange poster og ville sannsynligvis tage meget lang tid. Unders<72>g WHERE delen og brug SET OPTION SQL_BIG_SELECTS=1 hvis SELECTen er korrekt" "SELECT ville unders<72>ge for mange poster og ville sandsynligvis tage meget lang tid. Unders<72>g WHERE delen og brug SET OPTION SQL_BIG_SELECTS=1 hvis udtrykket er korrekt"
"Ukendt fejl", "Ukendt fejl",
"Ukendt procedure %s", "Ukendt procedure %s",
"Forkert antal parametre til proceduren %s", "Forkert antal parametre til proceduren %s",
"Forkert(e) parametre til proceduren %s", "Forkert(e) parametre til proceduren %s",
"Ukendt tabel '%-.64s' i %s", "Ukendt tabel '%-.64s' i %s",
"Feltet '%-.64s' er anvendt to ganger", "Feltet '%-.64s' er anvendt to gange",
"Forkert brug af gruppe-funktion", "Forkert brug af grupperings-funktion",
"Tabellen '%-.64s' bruger et efternavn som ikke findes i denne MySQL version", "Tabellen '%-.64s' bruger et filtypenavn som ikke findes i denne MySQL version",
"En tabel skal have mindst een kolonne", "En tabel skal have mindst een kolonne",
"Tabellen '%-.64s' er fuld", "Tabellen '%-.64s' er fuld",
"Ukendt karakters<EFBFBD>t: '%-.64s'", "Ukendt tegns<EFBFBD>t: '%-.64s'",
"For mange tabeller. MySQL kan kun bruge %d tabeller i et join", "For mange tabeller. MySQL kan kun bruge %d tabeller i et join",
"For mange felter", "For mange felter",
"For store poster. Max post st<73>rrelse, unde BOLB's, er %d. Du m<> lave nogle felter til BLOB's", "For store poster. Max post st<73>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<73>rre stak om n<>dvendigt", "Thread stack brugt: Brugt: %ld af en %ld stak. Brug 'mysqld -O thread_stack=#' for at allokere en st<73>rre stak om n<>dvendigt",
"Krydsreferencer fundet i OUTER JOIN. Check dine ON conditions", "Krydsreferencer fundet i OUTER JOIN. Check dine ON conditions",
"Kolonne '%-.32s' bruges som UNIQUE eller INDEX men er ikke defineret som NOT NULL", "Kolonne '%-.32s' bruges som UNIQUE eller INDEX men er ikke defineret som NOT NULL",
"Kan ikke l<>se funktionen '%-.64s'", "Kan ikke l<>se funktionen '%-.64s'",
"Kan ikke starte funktionen '%-.64s'; %-.80s", "Kan ikke starte funktionen '%-.64s'; %-.80s",
"Ingen sti tilladte for delt bibliotek", "Angivelse af sti ikke tilladt for delt bibliotek",
"Funktionen '%-.64s' findes allerede", "Funktionen '%-.64s' findes allerede",
"Kan ikke <20>bne delt bibliotek '%-.64s' (errno: %d %s)", "Kan ikke <20>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", "Funktionen '%-.64s' er ikke defineret",
"V<>rten er blokeret p<> grund af mange fejlforesp<73>rgsler. L<>s op med 'mysqladmin flush-hosts'", "V<>rten er blokeret p<> grund af mange fejlforesp<73>rgsler. L<>s op med 'mysqladmin flush-hosts'",
"V<>rten '%-.64s' kan ikke tilkoble denne MySQL-server", "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 <20>ndre andres adgangskoder", "Du skal have tilladelse til at opdatere tabeller i MySQL databasen for at <20>ndre andres adgangskoder",
"Kan ikke finde nogen tilsvarende poster i bruger tabellen", "Kan ikke finde nogen tilsvarende poster i bruger tabellen",
"Poster fundet: %ld <20>ndret: %ld Advarsler: %ld", "Poster fundet: %ld <20>ndret: %ld Advarsler: %ld",
"Kan ikke danne en ny tr<74>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<66>ngig fejl", "Kan ikke danne en ny tr<74>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<66>ngig fejl",
"Kolonne antallet stemmer ikke overens med antallet af v<>rdier i post %ld", "Kolonne antallet stemmer ikke overens med antallet af v<>rdier i post %ld",
"Kan ikke gen<65>bne tabel '%-.64s', "Kan ikke gen<65>bne tabel '%-.64s',
"Forkert brug af nulv<6C>rdi (NULL)", "Forkert brug af nulv<6C>rdi (NULL)",
@ -171,47 +171,48 @@
"Denne tabeltype underst<73>tter ikke brug af AUTO_INCREMENT kolonner", "Denne tabeltype underst<73>tter ikke brug af AUTO_INCREMENT kolonner",
"INSERT DELAYED kan ikke bruges med tabellen '%-.64s', fordi tabellen er l<>st med LOCK TABLES", "INSERT DELAYED kan ikke bruges med tabellen '%-.64s', fordi tabellen er l<>st med LOCK TABLES",
"Forkert kolonnenavn '%-.100s'", "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", "Tabellerne i MERGE er ikke defineret ens",
"Kan ikke skrive til tabellen '%-.64s' fordi det vil bryde CONSTRAINT regler", "Kan ikke skrive til tabellen '%-.64s' fordi det vil bryde CONSTRAINT regler",
"BLOB column '%-.64s' used in key specification without a key length", "BLOB kolonnen '%-.64s' brugt i n<>glespecifikation uden n<>glel<65>ngde",
"All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead", "Alle dele af en PRIMARY KEY skal v<>re NOT NULL; Hvis du skal bruge NULL i n<>glen, brug UNIQUE istedet",
"Result consisted of more than one row", "Resultatet bestod af mere end een r<>kke",
"This table type requires a primary key", "Denne tabeltype kr<EFBFBD>ver en prim<69>rn<72>gle",
"This version of MySQL is not compiled with RAID support", "Denne udgave af MySQL er ikke oversat med underst<73>ttelse af RAID",
"You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", "Du bruger sikker opdaterings modus ('safe update mode') og du fors<72>gte at opdatere en tabel uden en WHERE klausul, der g<>r brug af et KEY felt",
"Key '%-.64s' doesn't exist in table '%-.64s'", "N<EFBFBD>glen '%-.64s' eksisterer ikke i tabellen '%-.64s'",
"Can't open table", "Kan ikke <20>bne tabellen",
"The handler for the table doesn't support check/repair", "Denne tabeltype underst<73>tter ikke CHECK/REPAIR",
"You are not allowed to execute this command in a transaction", "Du m<> ikke bruge denne kommando i en transaktion",
"Got error %d during COMMIT", "Modtog fejl %d mens kommandoen COMMIT blev udf<64>rt",
"Got error %d during ROLLBACK", "Modtog fejl %d mens kommandoen ROLLBACK blev udf<64>rt",
"Got error %d during FLUSH_LOGS", "Modtog fejl %d mens kommandoen FLUSH_LOGS blev udf<64>rt",
"Got error %d during CHECKPOINT", "Modtog fejl %d mens kommandoen CHECKPOINT blev udf<64>rt",
"Aborted connection %ld to db: '%-.64s' user: '%-.32s' host: `%-.64s' (%-.64s)", "Afbr<EFBFBD>d forbindelsen %ld til databasen '%-.64s' bruger: '%-.32s' v<EFBFBD>rt: `%-.64s' (%-.64s)",
"The handler for the table does not support binary table dump", "Denne tabeltype unserst<73>tter ikke bin<EFBFBD>rt tabeldump",
"Binlog closed while trying to FLUSH MASTER", "Binlog blev lukket mens kommandoen FLUSH MASTER blev udf<64>rt",
"Failed rebuilding the index of dumped table '%-.64s'", "Kunne ikke genopbygge indekset for den dumpede tabel '%-.64s'",
"Error from master: '%-.64s'", "Fejl fra master: '%-.64s'",
"Net error reading from master", "Netv<EFBFBD>rksfejl ved l<>sning fra master",
"Net error writing to master", "Netv<EFBFBD>rksfejl ved skrivning til master",
"Can't find FULLTEXT index matching the column list", "Kan ikke finde en FULLTEXT n<EFBFBD>gle som svarer til kolonne listen",
"Can't execute the given command because you have active locked tables or an active transaction", "Kan ikke udf<64>re den givne kommando fordi der findes aktive, l<EFBFBD>ste tabeller eller fordi der udf<64>res en transaktion",
"Unknown system variable '%-.64'", "Ukendt systemvariabel '%-.64'",
"Table '%-.64s' is marked as crashed and should be repaired", "Tabellen '%-.64s' er markeret med fejl og b<>r repareres",
"Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Tabellen '%-.64s' er markeret med fejl og sidste (automatiske?) REPAIR fejlede",
"Warning: Some non-transactional changed tables couldn't be rolled back", "Advarsel: Visse data i tabeller der ikke underst<73>tter transaktioner kunne ikke tilbagestilles",
"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "Fler-udtryks transaktion kr<EFBFBD>vede mere plads en 'max_binlog_cache_size' bytes. Forh<72>j v<>rdien af denne variabel og pr<70>v igen',
"This operation cannot be performed with a running slave, run SLAVE STOP first", "Denne handling kunne ikke udf<64>res med k<>rende slave, brug f<>rst kommandoen SLAVE STOP",
"This operation requires a running slave, configure slave and do SLAVE START", "Denne handling kr<6B>ver en k<>rende slave. Konfigurer en slave og brug kommandoen SLAVE START",
"The server is not configured as slave, fix in config file or with CHANGE MASTER TO", "Denne server er ikke konfigureret som slave. Ret in config-filen eller brug kommandoen CHANGE MASTER TO",
"Could not initialize master info structure, check permisions on master.info", "Kunne ikke initialisere master info-struktur. Check om rettigheder i master.info",
"Could not create slave thread, check system resources", "Kunne ikke danne en slave-tr<74>d. Check systemressourcerne",
"User %-.64s has already more than 'max_user_connections' active connections", "Brugeren %-.64s har allerede mere end 'max_user_connections' aktive forbindelser",
"You may only use constant expressions with SET", "Du m<EFBFBD> kun bruge konstantudtryk med SET",
"Lock wait timeout exceeded", "Lock wait timeout overskredet",
"The total number of locks exceeds the lock table size", "Det totale antal l<>se overstiger st<73>rrelsen p<> l<>se-tabellen",
"Update locks cannot be acquired during a READ UNCOMMITTED transaction", "Update l<EFBFBD>s kan ikke opn<70>s under en READ UNCOMMITTED transaktion",
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE er ikke tilladt mens en tr<74>d holder p<> globalt read lock",
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE er ikke tilladt mens en tr<74>d holder p<> globalt read lock",
"Wrong arguments to %s", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -216,3 +216,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -215,3 +215,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -214,3 +214,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -214,3 +214,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -214,3 +214,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -214,3 +214,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -216,3 +216,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -212,3 +212,4 @@
"DROP DATABASE n<>o permitido enquanto uma 'thread' est<73> assegurando um travamento global de leitura", "DROP DATABASE n<>o permitido enquanto uma 'thread' est<73> assegurando um travamento global de leitura",
"CREATE DATABASE n<>o permitido enquanto uma 'thread' est<73> assegurando um travamento global de leitura", "CREATE DATABASE n<>o permitido enquanto uma 'thread' est<73> assegurando um travamento global de leitura",
"Wrong arguments to %s", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -216,3 +216,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -215,3 +215,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -220,3 +220,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -213,3 +213,4 @@
"DROP DATABASE no permitido mientras un thread est<73> ejerciendo un bloqueo de lectura global", "DROP DATABASE no permitido mientras un thread est<73> ejerciendo un bloqueo de lectura global",
"CREATE DATABASE no permitido mientras un thread est<73> ejerciendo un bloqueo de lectura global", "CREATE DATABASE no permitido mientras un thread est<73> ejerciendo un bloqueo de lectura global",
"Wrong arguments to %s", "Wrong arguments to %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -212,3 +212,4 @@
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE not allowed while thread is holding global read lock",
"CREATE 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", "Felaktiga argument till %s",
"%-.32s@%-.64s is not allowed to create new users",

View File

@ -943,16 +943,41 @@ end:
DBUG_RETURN(error); 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 ** Handle GRANT commands
****************************************************************************/ ****************************************************************************/
static int replace_user_table(TABLE *table, const LEX_USER &combo, 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; int error = -1;
uint i,j; uint i,j;
bool ima=0; bool old_row_exists=0;
char *password,empty_string[1]; char *password,empty_string[1];
DBUG_ENTER("replace_user_table"); 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, (byte*) table->field[0]->ptr,0,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
{ {
if (what == 'N') if (!create_user)
{ {
THD *thd=current_thd;
if (what == 'N')
my_printf_error(ER_NONEXISTING_GRANT,ER(ER_NONEXISTING_GRANT), my_printf_error(ER_NONEXISTING_GRANT,ER(ER_NONEXISTING_GRANT),
MYF(0),combo.user.str,combo.host.str); 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; error= -1;
goto end; 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] restore_record(table,2); // cp empty row from record[2]
table->field[0]->store(combo.host.str,combo.host.length); table->field[0]->store(combo.host.str,combo.host.length);
table->field[1]->store(combo.user.str,combo.user.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 else
{ {
ima = 1; old_row_exists = 1;
store_record(table,1); // Save copy for update store_record(table,1); // Save copy for update
if (combo.password.str) // If password given if (combo.password.str) // If password given
table->field[2]->store(password,(uint) strlen(password)); 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); 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 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 acl_cache->clear(1); // Clear privilege cache
if (!combo.password.str) if (!combo.password.str)
password=0; // No password given on command password=0; // No password given on command
if (ima) if (old_row_exists)
acl_update_user(combo.user.str,combo.host.str,password,rights); acl_update_user(combo.user.str,combo.host.str,password,rights);
else else
acl_insert_user(combo.user.str,combo.host.str,password,rights); 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 rights, char what)
{ {
uint i,j,store_rights; uint i,j,store_rights;
bool ima=0; bool old_row_exists=0;
int error; int error;
DBUG_ENTER("replace_db_table"); 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); combo.user.str,combo.host.str);
goto abort; goto abort;
} }
ima = 0; // no row old_row_exists = 0;
restore_record(table,2); // cp empty row from record[2] restore_record(table,2); // cp empty row from record[2]
table->field[0]->store(combo.host.str,combo.host.length); table->field[0]->store(combo.host.str,combo.host.length);
table->field[1]->store(db,(uint) strlen(db)); table->field[1]->store(db,(uint) strlen(db));
@ -1084,7 +1116,7 @@ static int replace_db_table(TABLE *table, const char *db,
} }
else else
{ {
ima = 1; old_row_exists = 1;
store_record(table,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=get_access(table,3);
rights=fix_rights_for_db(rights); 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 (rights)
{ {
if ((error=table->file->update_row(table->record[1],table->record[0]))) 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 acl_cache->clear(1); // Clear privilege cache
if (ima) if (old_row_exists)
acl_update_db(combo.user.str,combo.host.str,db,rights); acl_update_db(combo.user.str,combo.host.str,db,rights);
else else
acl_insert_db(combo.user.str,combo.host.str,db,rights); 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++)) while ((xx=iter++))
{ {
uint privileges = xx->rights; uint privileges = xx->rights;
bool ima=0; bool old_row_exists=0;
key_restore(table,key,0,key_length); key_restore(table,key,0,key_length);
table->field[4]->store(xx->column.ptr(),xx->column.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 */ result= -1; /* purecov: inspected */
continue; /* purecov: inspected */ continue; /* purecov: inspected */
} }
ima = 0; old_row_exists = 0;
restore_record(table,2); // Get empty record restore_record(table,2); // Get empty record
key_restore(table,key,0,key_length); key_restore(table,key,0,key_length);
table->field[4]->store(xx->column.ptr(),xx->column.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); privileges = tmp & ~(privileges | rights);
else else
privileges |= tmp; privileges |= tmp;
ima = 1; old_row_exists = 1;
store_record(table,1); // copy original row store_record(table,1); // copy original row
} }
table->field[6]->store((longlong) get_rights_for_column(privileges)); 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) if (privileges)
error=table->file->update_row(table->record[1],table->record[0]); 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) uint rights, uint kolone, bool revoke_grant)
{ {
char grantor[HOSTNAME_LENGTH+1+USERNAME_LENGTH]; char grantor[HOSTNAME_LENGTH+1+USERNAME_LENGTH];
int ima = 1; int old_row_exists = 1;
int error=0; int error=0;
uint store_table_rights,store_col_rights; uint store_table_rights,store_col_rights;
DBUG_ENTER("replace_table_table"); DBUG_ENTER("replace_table_table");
@ -1505,13 +1538,13 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
table_name); /* purecov: deadcode */ table_name); /* purecov: deadcode */
DBUG_RETURN(-1); /* purecov: deadcode */ DBUG_RETURN(-1); /* purecov: deadcode */
} }
ima = 0; // no row old_row_exists = 0;
restore_record(table,1); // Get saved record restore_record(table,1); // Get saved record
} }
store_table_rights=get_rights_for_table(rights); store_table_rights=get_rights_for_table(rights);
store_col_rights=get_rights_for_column(kolone); store_col_rights=get_rights_for_column(kolone);
if (ima) if (old_row_exists)
{ {
uint j,k; uint j,k;
store_record(table,1); 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); rights=fix_rights_for_table(store_table_rights);
kolone=fix_rights_for_column(store_col_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) if (store_table_rights || store_col_rights)
{ {
@ -1668,10 +1701,12 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
continue; continue;
} }
/* Create user if needed */ /* Create user if needed */
if ((replace_user_table(tables[0].table, if (replace_user_table(tables[0].table,
*Str, *Str,
0, 0,
revoke_grant ? 'N' : 'Y'))) revoke_grant ? 'N' : 'Y',
(revoke_grant ? 0 :
test_if_create_new_users(thd))))
{ {
result= -1; // Remember error result= -1; // Remember error
continue; // Add next user 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); List_iterator <LEX_USER> str_list (list);
LEX_USER *Str; LEX_USER *Str;
char what; char what;
bool create_new_users=0;
TABLE_LIST tables[2]; TABLE_LIST tables[2];
DBUG_ENTER("mysql_grant"); 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 */ 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); pthread_mutex_lock(&LOCK_grant);
VOID(pthread_mutex_lock(&acl_cache->lock)); VOID(pthread_mutex_lock(&acl_cache->lock));
grant_version++; grant_version++;
@ -1822,12 +1860,15 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, uint rights,
} }
if ((replace_user_table(tables[0].table, if ((replace_user_table(tables[0].table,
*Str, *Str,
(!db ? rights : 0), what))) (!db ? rights : 0), what, create_new_users)))
result= -1; result= -1;
else
{
if (db && replace_db_table(tables[1].table, db, *Str, rights & DB_ACLS, if (db && replace_db_table(tables[1].table, db, *Str, rights & DB_ACLS,
what)) what))
result= -1; result= -1;
} }
}
VOID(pthread_mutex_unlock(&acl_cache->lock)); VOID(pthread_mutex_unlock(&acl_cache->lock));
pthread_mutex_unlock(&LOCK_grant); pthread_mutex_unlock(&LOCK_grant);
close_thread_tables(thd); close_thread_tables(thd);
@ -1978,7 +2019,7 @@ void grant_reload(void)
****************************************************************************/ ****************************************************************************/
bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables, bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables,
uint show_table) uint show_table, bool no_errors)
{ {
TABLE_LIST *table; TABLE_LIST *table;
char *user = thd->priv_user; char *user = thd->priv_user;
@ -2026,7 +2067,7 @@ bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables,
err: err:
pthread_mutex_unlock(&LOCK_grant); 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=""; const char *command="";
if (want_access & SELECT_ACL) if (want_access & SELECT_ACL)

View File

@ -74,7 +74,7 @@ int grant_init(void);
void grant_free(void); void grant_free(void);
void grant_reload(void); void grant_reload(void);
bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables, 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, bool check_grant_column (THD *thd,TABLE *table, const char *name,uint length,
uint show_command=0); uint show_command=0);
bool check_grant_all_columns(THD *thd, uint want_access, TABLE *table); bool check_grant_all_columns(THD *thd, uint want_access, TABLE *table);

View File

@ -133,7 +133,7 @@ int list_open_tables(THD *thd,List<char> *tables, const char *db,
table_list.db= (char*) db; table_list.db= (char*) db;
table_list.real_name= entry->real_name;/*real name*/ table_list.real_name= entry->real_name;/*real name*/
table_list.grant.privilege=col_access; 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; continue;
} }
/* need to check if he have't already listed it */ /* need to check if he have't already listed it */

View File

@ -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, static int check_for_max_user_connections(const char *user, int u_length,
const char *host); const char *host);
static void decrease_user_connections(const char *user, 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_db_used(THD *thd,TABLE_LIST *tables);
static bool check_merge_table_access(THD *thd, char *db, 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, static bool check_dup(THD *thd,const char *db,const char *name,
@ -2116,7 +2115,7 @@ bool check_process_priv(THD *thd)
** in the table list for GRANT checking ** in the table list for GRANT checking
*/ */
static bool bool
check_table_access(THD *thd,uint want_access,TABLE_LIST *tables) check_table_access(THD *thd,uint want_access,TABLE_LIST *tables)
{ {
uint found=0,found_access=0; uint found=0,found_access=0;

View File

@ -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.db= (char*) db;
table_list.real_name=file->name; table_list.real_name=file->name;
table_list.grant.privilege=col_access; 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; continue;
} }
if (files->push_back(thd->strdup(file->name))) if (files->push_back(thd->strdup(file->name)))

View File

@ -1126,7 +1126,12 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
strmov(new_name_buff,new_name); strmov(new_name_buff,new_name);
fn_same(new_name_buff,table_name,3); fn_same(new_name_buff,table_name,3);
#ifdef FN_LOWER_CASE #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 #else
if (!strcmp(new_name_buff,table_name)) // Check if name changed if (!strcmp(new_name_buff,table_name)) // Check if name changed
#endif #endif