merge.
This commit is contained in:
commit
19ee83f02e
@ -72,7 +72,7 @@ extern void my_cleanup_options(const struct my_option *options);
|
||||
extern void my_print_help(const struct my_option *options);
|
||||
extern void my_print_variables(const struct my_option *options);
|
||||
extern void my_getopt_register_get_addr(uchar ** (*func_addr)(const char *, uint,
|
||||
const struct my_option *));
|
||||
const struct my_option *, int *));
|
||||
|
||||
ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp,
|
||||
my_bool *fix);
|
||||
|
@ -43,6 +43,15 @@ extern char mysql_server_last_error[MYSQL_ERRMSG_SIZE];
|
||||
static my_bool emb_read_query_result(MYSQL *mysql);
|
||||
|
||||
|
||||
extern "C" void unireg_clear(int exit_code)
|
||||
{
|
||||
DBUG_ENTER("unireg_clear");
|
||||
clean_up(!opt_help && (exit_code || !opt_bootstrap)); /* purecov: inspected */
|
||||
my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Reads error information from the MYSQL_DATA and puts
|
||||
it into proper MYSQL members
|
||||
|
@ -692,3 +692,29 @@ unlock tables;
|
||||
drop table t1;
|
||||
--error ER_UNKNOWN_TABLE
|
||||
handler t1 read a next;
|
||||
|
||||
#
|
||||
# Bug#41110: crash with handler command when used concurrently with alter table
|
||||
# Bug#41112: crash in mysql_ha_close_table/get_lock_data with alter table
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1);
|
||||
handler t1 open;
|
||||
connect(con1,localhost,root,,);
|
||||
send alter table t1 engine=memory;
|
||||
connection default;
|
||||
let $wait_condition=
|
||||
select count(*) = 1 from information_schema.processlist
|
||||
where state = "rename result table" and info = "alter table t1 engine=memory";
|
||||
--source include/wait_condition.inc
|
||||
--error ER_ILLEGAL_HA
|
||||
handler t1 read a next;
|
||||
handler t1 close;
|
||||
connection con1;
|
||||
--reap
|
||||
drop table t1;
|
||||
connection default;
|
||||
|
@ -730,3 +730,12 @@ unlock tables;
|
||||
drop table t1;
|
||||
handler t1 read a next;
|
||||
ERROR 42S02: Unknown table 't1' in HANDLER
|
||||
drop table if exists t1;
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1);
|
||||
handler t1 open;
|
||||
alter table t1 engine=memory;
|
||||
handler t1 read a next;
|
||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||
handler t1 close;
|
||||
drop table t1;
|
||||
|
@ -728,3 +728,12 @@ unlock tables;
|
||||
drop table t1;
|
||||
handler t1 read a next;
|
||||
ERROR 42S02: Unknown table 't1' in HANDLER
|
||||
drop table if exists t1;
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1);
|
||||
handler t1 open;
|
||||
alter table t1 engine=memory;
|
||||
handler t1 read a next;
|
||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||
handler t1 close;
|
||||
drop table t1;
|
||||
|
@ -411,17 +411,6 @@ drop table t1;
|
||||
1
|
||||
drop table t1;
|
||||
shell> mysqlbinlog std_data/corrupt-relay-bin.000624 > var/tmp/bug31793.sql
|
||||
set @@global.server_id= 4294967295;
|
||||
reset master;
|
||||
select
|
||||
(@a:=load_file("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog"))
|
||||
is not null;
|
||||
(@a:=load_file("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog"))
|
||||
is not null
|
||||
1
|
||||
*** Unsigned server_id 4294967295 is found: 1 ***
|
||||
set @@global.server_id= 1;
|
||||
End of 5.0 tests
|
||||
flush logs;
|
||||
BUG#31611: Security risk with BINLOG statement
|
||||
SET BINLOG_FORMAT=ROW;
|
||||
@ -471,4 +460,15 @@ an_int 1000
|
||||
a_decimal 907.79
|
||||
a_string Just a test
|
||||
DROP TABLE t1;
|
||||
set @@global.server_id= 4294967295;
|
||||
reset master;
|
||||
flush logs;
|
||||
select
|
||||
(@a:=load_file("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog"))
|
||||
is not null;
|
||||
(@a:=load_file("MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog"))
|
||||
is not null
|
||||
1
|
||||
*** Unsigned server_id 4294967295 is found: 1 ***
|
||||
set @@global.server_id= 1;
|
||||
End of 5.1 tests
|
||||
|
@ -278,27 +278,6 @@ echo shell> mysqlbinlog std_data/corrupt-relay-bin.000624 > var/tmp/bug31793.sql
|
||||
error 1;
|
||||
exec $MYSQL_BINLOG $MYSQL_TEST_DIR/std_data/corrupt-relay-bin.000624 > $MYSQLTEST_VARDIR/tmp/bug31793.sql;
|
||||
|
||||
#
|
||||
# Bug #37313 BINLOG Contains Incorrect server id
|
||||
#
|
||||
|
||||
let $save_server_id= `select @@global.server_id`;
|
||||
let $s_id_max=`select (1 << 32) - 1`;
|
||||
eval set @@global.server_id= $s_id_max;
|
||||
|
||||
reset master;
|
||||
--exec $MYSQL_BINLOG $MYSQLTEST_VARDIR/log/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
eval select
|
||||
(@a:=load_file("$MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog"))
|
||||
is not null;
|
||||
let $s_id_unsigned= `select @a like "%server id $s_id_max%" /* must return 1 */`;
|
||||
echo *** Unsigned server_id $s_id_max is found: $s_id_unsigned ***;
|
||||
|
||||
eval set @@global.server_id= $save_server_id;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
#
|
||||
# Test --disable-force-if-open and --force-if-open
|
||||
@ -363,4 +342,25 @@ remove_file $MYSQLTEST_VARDIR/tmp/bug32580.sql;
|
||||
query_vertical SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #37313 BINLOG Contains Incorrect server id
|
||||
#
|
||||
|
||||
let $save_server_id= `select @@global.server_id`;
|
||||
let $s_id_max=`select (1 << 32) - 1`;
|
||||
eval set @@global.server_id= $s_id_max;
|
||||
|
||||
reset master;
|
||||
flush logs;
|
||||
--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
eval select
|
||||
(@a:=load_file("$MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog"))
|
||||
is not null;
|
||||
let $s_id_unsigned= `select @a like "%server id $s_id_max%" /* must return 1 */`;
|
||||
echo *** Unsigned server_id $s_id_max is found: $s_id_unsigned ***;
|
||||
|
||||
eval set @@global.server_id= $save_server_id;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug37313.binlog
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -144,6 +144,7 @@ static char *remove_end_comment(char *ptr);
|
||||
RETURN
|
||||
0 ok
|
||||
1 given cinf_file doesn't exist
|
||||
2 out of memory
|
||||
|
||||
The global variable 'my_defaults_group_suffix' is updated with value for
|
||||
--defaults_group_suffix
|
||||
@ -190,7 +191,7 @@ int my_search_option_files(const char *conf_file, int *argc, char ***argv,
|
||||
if (!(extra_groups=
|
||||
(const char**)alloc_root(ctx->alloc,
|
||||
(2*group->count+1)*sizeof(char*))))
|
||||
goto err;
|
||||
DBUG_RETURN(2);
|
||||
|
||||
for (i= 0; i < group->count; i++)
|
||||
{
|
||||
@ -199,7 +200,7 @@ int my_search_option_files(const char *conf_file, int *argc, char ***argv,
|
||||
|
||||
len= strlen(extra_groups[i]);
|
||||
if (!(ptr= alloc_root(ctx->alloc, len+instance_len+1)))
|
||||
goto err;
|
||||
DBUG_RETURN(2);
|
||||
|
||||
extra_groups[i+group->count]= ptr;
|
||||
|
||||
@ -254,12 +255,11 @@ int my_search_option_files(const char *conf_file, int *argc, char ***argv,
|
||||
}
|
||||
}
|
||||
|
||||
DBUG_RETURN(error);
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
fprintf(stderr,"Fatal error in defaults handling. Program aborted\n");
|
||||
exit(1);
|
||||
return 0; /* Keep compiler happy */
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -100,10 +100,10 @@ static void default_reporter(enum loglevel level,
|
||||
one. Call function 'get_one_option()' once for each option.
|
||||
*/
|
||||
|
||||
static uchar** (*getopt_get_addr)(const char *, uint, const struct my_option *);
|
||||
static uchar** (*getopt_get_addr)(const char *, uint, const struct my_option *, int *);
|
||||
|
||||
void my_getopt_register_get_addr(uchar** (*func_addr)(const char *, uint,
|
||||
const struct my_option *))
|
||||
const struct my_option *, int *))
|
||||
{
|
||||
getopt_get_addr= func_addr;
|
||||
}
|
||||
@ -362,8 +362,12 @@ int handle_options(int *argc, char ***argv,
|
||||
my_progname, optp->name);
|
||||
return EXIT_NO_ARGUMENT_ALLOWED;
|
||||
}
|
||||
error= 0;
|
||||
value= optp->var_type & GET_ASK_ADDR ?
|
||||
(*getopt_get_addr)(key_name, (uint) strlen(key_name), optp) : optp->value;
|
||||
(*getopt_get_addr)(key_name, (uint) strlen(key_name), optp, &error) :
|
||||
optp->value;
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (optp->arg_type == NO_ARG)
|
||||
{
|
||||
@ -1092,7 +1096,7 @@ static void init_variables(const struct my_option *options,
|
||||
if (options->value)
|
||||
init_one_value(options, options->value, options->def_value);
|
||||
if (options->var_type & GET_ASK_ADDR &&
|
||||
(variable= (*getopt_get_addr)("", 0, options)))
|
||||
(variable= (*getopt_get_addr)("", 0, options, 0)))
|
||||
init_one_value(options, variable, options->def_value);
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
@ -1196,7 +1200,7 @@ void my_print_variables(const struct my_option *options)
|
||||
for (optp= options; optp->id; optp++)
|
||||
{
|
||||
uchar* *value= (optp->var_type & GET_ASK_ADDR ?
|
||||
(*getopt_get_addr)("", 0, optp) : optp->value);
|
||||
(*getopt_get_addr)("", 0, optp, 0) : optp->value);
|
||||
if (value)
|
||||
{
|
||||
printf("%s ", optp->name);
|
||||
|
@ -1258,7 +1258,7 @@ void Log_event::print_header(IO_CACHE* file,
|
||||
|
||||
my_b_printf(file, "#");
|
||||
print_timestamp(file);
|
||||
my_b_printf(file, " server id %lu end_log_pos %s ", server_id,
|
||||
my_b_printf(file, " server id %lu end_log_pos %s ", (ulong) server_id,
|
||||
llstr(log_pos,llbuff));
|
||||
|
||||
/* mysqlbinlog --hexdump */
|
||||
|
@ -2411,7 +2411,8 @@ extern "C" void unireg_abort(int exit_code) __attribute__((noreturn));
|
||||
void kill_delayed_threads(void);
|
||||
bool check_stack_overrun(THD *thd, long margin, uchar *dummy);
|
||||
#else
|
||||
#define unireg_abort(exit_code) DBUG_RETURN(exit_code)
|
||||
extern "C" void unireg_clear(int exit_code);
|
||||
#define unireg_abort(exit_code) do { unireg_clear(exit_code); DBUG_RETURN(exit_code); } while(0)
|
||||
inline void kill_delayed_threads(void) {}
|
||||
#define check_stack_overrun(A, B, C) 0
|
||||
#endif
|
||||
|
139
sql/mysqld.cc
139
sql/mysqld.cc
@ -747,12 +747,12 @@ uint connection_count= 0;
|
||||
|
||||
pthread_handler_t signal_hand(void *arg);
|
||||
static int mysql_init_variables(void);
|
||||
static void get_options(int *argc,char **argv);
|
||||
static int get_options(int *argc,char **argv);
|
||||
extern "C" my_bool mysqld_get_one_option(int, const struct my_option *, char *);
|
||||
static void set_server_version(void);
|
||||
static int init_thread_environment();
|
||||
static char *get_relative_path(const char *path);
|
||||
static void fix_paths(void);
|
||||
static int fix_paths(void);
|
||||
pthread_handler_t handle_connections_sockets(void *arg);
|
||||
pthread_handler_t kill_server_thread(void *arg);
|
||||
static void bootstrap(FILE *file);
|
||||
@ -766,7 +766,7 @@ pthread_handler_t handle_connections_shared_memory(void *arg);
|
||||
pthread_handler_t handle_slave(void *arg);
|
||||
static ulong find_bit_type(const char *x, TYPELIB *bit_lib);
|
||||
static ulong find_bit_type_or_exit(const char *x, TYPELIB *bit_lib,
|
||||
const char *option);
|
||||
const char *option, int *error);
|
||||
static void clean_up(bool print_message);
|
||||
static int test_if_case_insensitive(const char *dir_name);
|
||||
|
||||
@ -1190,7 +1190,8 @@ extern "C" void unireg_abort(int exit_code)
|
||||
my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
|
||||
exit(exit_code); /* purecov: inspected */
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*EMBEDDED_LIBRARY*/
|
||||
|
||||
|
||||
void clean_up(bool print_message)
|
||||
@ -3226,7 +3227,8 @@ static int init_common_variables(const char *conf_file_name, int argc,
|
||||
load_defaults(conf_file_name, groups, &argc, &argv);
|
||||
defaults_argv=argv;
|
||||
defaults_argc=argc;
|
||||
get_options(&defaults_argc, defaults_argv);
|
||||
if (get_options(&defaults_argc, defaults_argv))
|
||||
return 1;
|
||||
set_server_version();
|
||||
|
||||
DBUG_PRINT("info",("%s Ver %s for %s on %s\n",my_progname,
|
||||
@ -7497,6 +7499,7 @@ To see what values a running MySQL server is using, type\n\
|
||||
|
||||
static int mysql_init_variables(void)
|
||||
{
|
||||
int error;
|
||||
/* Things reset to zero */
|
||||
opt_skip_slave_start= opt_reckless_slave = 0;
|
||||
mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
|
||||
@ -7554,7 +7557,10 @@ static int mysql_init_variables(void)
|
||||
delay_key_write_options= (uint) DELAY_KEY_WRITE_ON;
|
||||
slave_exec_mode_options= 0;
|
||||
slave_exec_mode_options= (uint)
|
||||
find_bit_type_or_exit(slave_exec_mode_str, &slave_exec_mode_typelib, NULL);
|
||||
find_bit_type_or_exit(slave_exec_mode_str, &slave_exec_mode_typelib, NULL,
|
||||
&error);
|
||||
if (error)
|
||||
return 1;
|
||||
opt_specialflag= SPECIAL_ENGLISH;
|
||||
unix_sock= ip_sock= INVALID_SOCKET;
|
||||
mysql_home_ptr= mysql_home;
|
||||
@ -7732,6 +7738,8 @@ mysqld_get_one_option(int optid,
|
||||
const struct my_option *opt __attribute__((unused)),
|
||||
char *argument)
|
||||
{
|
||||
int error;
|
||||
|
||||
switch(optid) {
|
||||
case '#':
|
||||
#ifndef DBUG_OFF
|
||||
@ -7775,7 +7783,9 @@ mysqld_get_one_option(int optid,
|
||||
break;
|
||||
case OPT_SLAVE_EXEC_MODE:
|
||||
slave_exec_mode_options= (uint)
|
||||
find_bit_type_or_exit(argument, &slave_exec_mode_typelib, "");
|
||||
find_bit_type_or_exit(argument, &slave_exec_mode_typelib, "", &error);
|
||||
if (error)
|
||||
return 1;
|
||||
break;
|
||||
#endif
|
||||
case OPT_SAFEMALLOC_MEM_LIMIT:
|
||||
@ -7843,18 +7853,16 @@ mysqld_get_one_option(int optid,
|
||||
|
||||
if (!(p= strstr(argument, "->")))
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Bad syntax in replicate-rewrite-db - missing '->'!\n");
|
||||
exit(1);
|
||||
sql_print_error("Bad syntax in replicate-rewrite-db - missing '->'!\n");
|
||||
return 1;
|
||||
}
|
||||
val= p--;
|
||||
while (my_isspace(mysqld_charset, *p) && p > argument)
|
||||
*p-- = 0;
|
||||
if (p == argument)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Bad syntax in replicate-rewrite-db - empty FROM db!\n");
|
||||
exit(1);
|
||||
sql_print_error("Bad syntax in replicate-rewrite-db - empty FROM db!\n");
|
||||
return 1;
|
||||
}
|
||||
*val= 0;
|
||||
val+= 2;
|
||||
@ -7862,9 +7870,8 @@ mysqld_get_one_option(int optid,
|
||||
*val++;
|
||||
if (!*val)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Bad syntax in replicate-rewrite-db - empty TO db!\n");
|
||||
exit(1);
|
||||
sql_print_error("Bad syntax in replicate-rewrite-db - empty TO db!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
rpl_filter->add_db_rewrite(key, val);
|
||||
@ -7892,8 +7899,8 @@ mysqld_get_one_option(int optid,
|
||||
{
|
||||
if (rpl_filter->add_do_table(argument))
|
||||
{
|
||||
fprintf(stderr, "Could not add do table rule '%s'!\n", argument);
|
||||
exit(1);
|
||||
sql_print_error("Could not add do table rule '%s'!\n", argument);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -7901,8 +7908,8 @@ mysqld_get_one_option(int optid,
|
||||
{
|
||||
if (rpl_filter->add_wild_do_table(argument))
|
||||
{
|
||||
fprintf(stderr, "Could not add do table rule '%s'!\n", argument);
|
||||
exit(1);
|
||||
sql_print_error("Could not add do table rule '%s'!\n", argument);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -7910,8 +7917,8 @@ mysqld_get_one_option(int optid,
|
||||
{
|
||||
if (rpl_filter->add_wild_ignore_table(argument))
|
||||
{
|
||||
fprintf(stderr, "Could not add ignore table rule '%s'!\n", argument);
|
||||
exit(1);
|
||||
sql_print_error("Could not add ignore table rule '%s'!\n", argument);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -7919,8 +7926,8 @@ mysqld_get_one_option(int optid,
|
||||
{
|
||||
if (rpl_filter->add_ignore_table(argument))
|
||||
{
|
||||
fprintf(stderr, "Could not add ignore table rule '%s'!\n", argument);
|
||||
exit(1);
|
||||
sql_print_error("Could not add ignore table rule '%s'!\n", argument);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -7941,7 +7948,9 @@ mysqld_get_one_option(int optid,
|
||||
{
|
||||
log_output_str= argument;
|
||||
log_output_options=
|
||||
find_bit_type_or_exit(argument, &log_output_typelib, opt->name);
|
||||
find_bit_type_or_exit(argument, &log_output_typelib, opt->name, &error);
|
||||
if (error)
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -7951,7 +7960,7 @@ mysqld_get_one_option(int optid,
|
||||
sql_perror("Event scheduler is not supported in embedded build.");
|
||||
#else
|
||||
if (Events::set_opt_event_scheduler(argument))
|
||||
exit(1);
|
||||
return 1;
|
||||
#endif
|
||||
break;
|
||||
case (int) OPT_SKIP_NEW:
|
||||
@ -7990,7 +7999,7 @@ mysqld_get_one_option(int optid,
|
||||
case (int) OPT_SKIP_NETWORKING:
|
||||
#if defined(__NETWARE__)
|
||||
sql_perror("Can't start server: skip-networking option is currently not supported on NetWare");
|
||||
exit(1);
|
||||
return 1;
|
||||
#endif
|
||||
opt_disable_networking=1;
|
||||
mysqld_port=0;
|
||||
@ -8161,7 +8170,10 @@ mysqld_get_one_option(int optid,
|
||||
{
|
||||
myisam_recover_options_str=argument;
|
||||
myisam_recover_options=
|
||||
find_bit_type_or_exit(argument, &myisam_recover_typelib, opt->name);
|
||||
find_bit_type_or_exit(argument, &myisam_recover_typelib, opt->name,
|
||||
&error);
|
||||
if (error)
|
||||
return 1;
|
||||
}
|
||||
ha_open_options|=HA_OPEN_ABORT_IF_CRASHED;
|
||||
break;
|
||||
@ -8206,7 +8218,9 @@ mysqld_get_one_option(int optid,
|
||||
{
|
||||
sql_mode_str= argument;
|
||||
global_system_variables.sql_mode=
|
||||
find_bit_type_or_exit(argument, &sql_mode_typelib, opt->name);
|
||||
find_bit_type_or_exit(argument, &sql_mode_typelib, opt->name, &error);
|
||||
if (error)
|
||||
return 1;
|
||||
global_system_variables.sql_mode= fix_sql_mode(global_system_variables.
|
||||
sql_mode);
|
||||
break;
|
||||
@ -8245,13 +8259,17 @@ mysqld_get_one_option(int optid,
|
||||
|
||||
/** Handle arguments for multiple key caches. */
|
||||
|
||||
extern "C" uchar **mysql_getopt_value(const char *keyname, uint key_length,
|
||||
const struct my_option *option);
|
||||
extern "C" int mysql_getopt_value(uchar **value,
|
||||
const char *keyname, uint key_length,
|
||||
const struct my_option *option,
|
||||
int *error);
|
||||
|
||||
uchar* *
|
||||
static uchar* *
|
||||
mysql_getopt_value(const char *keyname, uint key_length,
|
||||
const struct my_option *option)
|
||||
const struct my_option *option, int *error)
|
||||
{
|
||||
if (error)
|
||||
*error= 0;
|
||||
switch (option->id) {
|
||||
case OPT_KEY_BUFFER_SIZE:
|
||||
case OPT_KEY_CACHE_BLOCK_SIZE:
|
||||
@ -8260,7 +8278,11 @@ mysql_getopt_value(const char *keyname, uint key_length,
|
||||
{
|
||||
KEY_CACHE *key_cache;
|
||||
if (!(key_cache= get_or_create_key_cache(keyname, key_length)))
|
||||
exit(1);
|
||||
{
|
||||
if (error)
|
||||
*error= EXIT_OUT_OF_MEMORY;
|
||||
return 0;
|
||||
}
|
||||
switch (option->id) {
|
||||
case OPT_KEY_BUFFER_SIZE:
|
||||
return (uchar**) &key_cache->param_buff_size;
|
||||
@ -8298,7 +8320,7 @@ void option_error_reporter(enum loglevel level, const char *format, ...)
|
||||
@todo
|
||||
- FIXME add EXIT_TOO_MANY_ARGUMENTS to "mysys_err.h" and return that code?
|
||||
*/
|
||||
static void get_options(int *argc,char **argv)
|
||||
static int get_options(int *argc,char **argv)
|
||||
{
|
||||
int ho_error;
|
||||
|
||||
@ -8312,7 +8334,7 @@ static void get_options(int *argc,char **argv)
|
||||
|
||||
if ((ho_error= handle_options(argc, &argv, my_long_options,
|
||||
mysqld_get_one_option)))
|
||||
exit(ho_error);
|
||||
return ho_error;
|
||||
(*argc)++; /* add back one for the progname handle_options removes */
|
||||
/* no need to do this for argv as we are discarding it. */
|
||||
|
||||
@ -8351,7 +8373,8 @@ static void get_options(int *argc,char **argv)
|
||||
max_allowed_packet= global_system_variables.max_allowed_packet;
|
||||
net_buffer_length= global_system_variables.net_buffer_length;
|
||||
#endif
|
||||
fix_paths();
|
||||
if (fix_paths())
|
||||
return 1;
|
||||
|
||||
/*
|
||||
Set some global variables from the global_system_variables
|
||||
@ -8378,7 +8401,7 @@ static void get_options(int *argc,char **argv)
|
||||
&global_system_variables.time_format) ||
|
||||
init_global_datetime_format(MYSQL_TIMESTAMP_DATETIME,
|
||||
&global_system_variables.datetime_format))
|
||||
exit(1);
|
||||
return 1;
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
one_thread_scheduler(&thread_scheduler);
|
||||
@ -8391,6 +8414,7 @@ static void get_options(int *argc,char **argv)
|
||||
else
|
||||
pool_of_threads_scheduler(&thread_scheduler); /* purecov: tested */
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -8454,7 +8478,7 @@ fn_format_relative_to_data_home(char * to, const char *name,
|
||||
}
|
||||
|
||||
|
||||
static void fix_paths(void)
|
||||
static int fix_paths(void)
|
||||
{
|
||||
char buff[FN_REFLEN],*pos;
|
||||
convert_dirname(mysql_home,mysql_home,NullS);
|
||||
@ -8501,12 +8525,12 @@ static void fix_paths(void)
|
||||
charsets_dir=mysql_charsets_dir;
|
||||
|
||||
if (init_tmpdir(&mysql_tmpdir_list, opt_mysql_tmpdir))
|
||||
exit(1);
|
||||
return 1;
|
||||
#ifdef HAVE_REPLICATION
|
||||
if (!slave_load_tmpdir)
|
||||
{
|
||||
if (!(slave_load_tmpdir = (char*) my_strdup(mysql_tmpdir, MYF(MY_FAE))))
|
||||
exit(1);
|
||||
return 1;
|
||||
}
|
||||
#endif /* HAVE_REPLICATION */
|
||||
/*
|
||||
@ -8519,30 +8543,37 @@ static void fix_paths(void)
|
||||
my_free(opt_secure_file_priv, MYF(0));
|
||||
opt_secure_file_priv= my_strdup(buff, MYF(MY_FAE));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static ulong find_bit_type_or_exit(const char *x, TYPELIB *bit_lib,
|
||||
const char *option)
|
||||
const char *option, int *error)
|
||||
{
|
||||
ulong res;
|
||||
|
||||
ulong result;
|
||||
const char **ptr;
|
||||
|
||||
if ((res= find_bit_type(x, bit_lib)) == ~(ulong) 0)
|
||||
*error= 0;
|
||||
if ((result= find_bit_type(x, bit_lib)) == ~(ulong) 0)
|
||||
{
|
||||
char *buff= (char *) my_alloca(2048);
|
||||
char *cbuf;
|
||||
ptr= bit_lib->type_names;
|
||||
if (!*x)
|
||||
fprintf(stderr, "No option given to %s\n", option);
|
||||
else
|
||||
fprintf(stderr, "Wrong option to %s. Option(s) given: %s\n", option, x);
|
||||
fprintf(stderr, "Alternatives are: '%s'", *ptr);
|
||||
cbuf= buff + ((!*x) ?
|
||||
my_snprintf(buff, 2048, "No option given to %s\n", option) :
|
||||
my_snprintf(buff, 2048, "Wrong option to %s. Option(s) given: %s\n",
|
||||
option, x));
|
||||
cbuf+= my_snprintf(cbuf, 2048 - (cbuf-buff), "Alternatives are: '%s'", *ptr);
|
||||
while (*++ptr)
|
||||
fprintf(stderr, ",'%s'", *ptr);
|
||||
fprintf(stderr, "\n");
|
||||
exit(1);
|
||||
cbuf+= my_snprintf(cbuf, 2048 - (cbuf-buff), ",'%s'", *ptr);
|
||||
my_snprintf(cbuf, 2048 - (cbuf-buff), "\n");
|
||||
sql_perror(buff);
|
||||
*error= 1;
|
||||
my_afree(buff);
|
||||
return 0;
|
||||
}
|
||||
return res;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
@ -160,6 +160,9 @@ static void mysql_ha_close_table(THD *thd, TABLE_LIST *tables,
|
||||
table->query_id= thd->query_id;
|
||||
table->open_by_handler= 0;
|
||||
}
|
||||
|
||||
/* Mark table as closed, ready for re-open if necessary. */
|
||||
tables->table= NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -177,8 +180,7 @@ static void mysql_ha_close_table(THD *thd, TABLE_LIST *tables,
|
||||
'reopen' is set when a handler table is to be re-opened. In this case,
|
||||
'tables' is the pointer to the hashed TABLE_LIST object which has been
|
||||
saved on the original open.
|
||||
'reopen' is also used to suppress the sending of an 'ok' message or
|
||||
error messages.
|
||||
'reopen' is also used to suppress the sending of an 'ok' message.
|
||||
|
||||
RETURN
|
||||
FALSE OK
|
||||
@ -214,8 +216,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
|
||||
strlen(tables->alias) + 1))
|
||||
{
|
||||
DBUG_PRINT("info",("duplicate '%s'", tables->alias));
|
||||
if (! reopen)
|
||||
my_error(ER_NONUNIQ_TABLE, MYF(0), tables->alias);
|
||||
my_error(ER_NONUNIQ_TABLE, MYF(0), tables->alias);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
@ -259,8 +260,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
|
||||
/* There can be only one table in '*tables'. */
|
||||
if (! (tables->table->file->ha_table_flags() & HA_CAN_SQL_HANDLER))
|
||||
{
|
||||
if (! reopen)
|
||||
my_error(ER_ILLEGAL_HA, MYF(0), tables->alias);
|
||||
my_error(ER_ILLEGAL_HA, MYF(0), tables->alias);
|
||||
goto err;
|
||||
}
|
||||
|
||||
@ -479,8 +479,7 @@ retry:
|
||||
|
||||
if (need_reopen)
|
||||
{
|
||||
mysql_ha_close_table(thd, tables, FALSE);
|
||||
hash_tables->table= NULL;
|
||||
mysql_ha_close_table(thd, hash_tables, FALSE);
|
||||
/*
|
||||
The lock might have been aborted, we need to manually reset
|
||||
thd->some_tables_deleted because handler's tables are closed
|
||||
@ -761,11 +760,7 @@ void mysql_ha_flush(THD *thd)
|
||||
{
|
||||
hash_tables= (TABLE_LIST*) hash_element(&thd->handler_tables_hash, i);
|
||||
if (hash_tables->table && hash_tables->table->needs_reopen_or_name_lock())
|
||||
{
|
||||
mysql_ha_close_table(thd, hash_tables, TRUE);
|
||||
/* Mark table as closed, ready for re-open. */
|
||||
hash_tables->table= NULL;
|
||||
}
|
||||
}
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
|
@ -4252,7 +4252,6 @@ convert_search_mode_to_innobase(
|
||||
case HA_READ_MBR_WITHIN:
|
||||
case HA_READ_MBR_DISJOINT:
|
||||
case HA_READ_MBR_EQUAL:
|
||||
my_error(ER_TABLE_CANT_HANDLE_SPKEYS, MYF(0));
|
||||
return(PAGE_CUR_UNSUPP);
|
||||
/* do not use "default:" in order to produce a gcc warning:
|
||||
enumeration value '...' not handled in switch
|
||||
@ -5803,7 +5802,7 @@ ha_innobase::records_in_range(
|
||||
mode2);
|
||||
} else {
|
||||
|
||||
n_rows = 0;
|
||||
n_rows = HA_POS_ERROR;
|
||||
}
|
||||
|
||||
dtuple_free_for_mysql(heap1);
|
||||
|
@ -1789,6 +1789,8 @@ int ha_myisam::extra(enum ha_extra_function operation)
|
||||
{
|
||||
if ((specialflag & SPECIAL_SAFE_MODE) && operation == HA_EXTRA_KEYREAD)
|
||||
return 0;
|
||||
if (operation == HA_EXTRA_MMAP && !opt_myisam_use_mmap)
|
||||
return 0;
|
||||
return mi_extra(file, operation, 0);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user