Commit ef8d161d authored by monty@work.mysql.com's avatar monty@work.mysql.com

merge

parents 04aeee5d 23e031f2
...@@ -3,5 +3,6 @@ jani@janikt.pp.saunalahti.fi ...@@ -3,5 +3,6 @@ jani@janikt.pp.saunalahti.fi
monty@hundin.mysql.fi monty@hundin.mysql.fi
monty@work.mysql.com monty@work.mysql.com
mwagner@evoq.mwagner.org mwagner@evoq.mwagner.org
paul@central.snake.net
sasha@mysql.sashanet.com sasha@mysql.sashanet.com
tonu@hundin.mysql.fi tonu@hundin.mysql.fi
This diff is collapsed.
...@@ -209,7 +209,7 @@ extern long lCurMemory,lMaxMemory; /* from safemalloc */ ...@@ -209,7 +209,7 @@ extern long lCurMemory,lMaxMemory; /* from safemalloc */
extern ulong my_default_record_cache_size; extern ulong my_default_record_cache_size;
extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io, extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
NEAR my_disable_flush_key_blocks; NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks;
extern char wild_many,wild_one,wild_prefix; extern char wild_many,wild_one,wild_prefix;
extern const char *charsets_dir; extern const char *charsets_dir;
extern char *defaults_extra_file; extern char *defaults_extra_file;
......
...@@ -49,6 +49,35 @@ const char *client_errors[]= ...@@ -49,6 +49,35 @@ const char *client_errors[]=
"Embedded server", "Embedded server",
}; };
/* Start of code added by Roberto M. Serqueira - martinsc@uol.com.br - 05.24.2001 */
#elif defined PORTUGUESE
const char *client_errors[]=
{
"Erro desconhecido do MySQL",
"No pode criar 'UNIX socket' (%d)",
"No pode se conectar ao servidor MySQL local atravs do 'socket' '%-.64s' (%d)",
"No pode se conectar ao servidor MySQL em '%-.64s' (%d)",
"No pode criar 'socket TCP/IP' (%d)",
"'Host' servidor MySQL '%-.64s' (%d) desconhecido",
"Servidor MySQL desapareceu",
"Incompatibilidade de protocolos. Verso do Servidor: %d - Verso do Cliente: %d",
"Cliente do MySQL com falta de memria",
"Informao invlida de 'host'",
"Localhost via 'UNIX socket'",
"%-.64s via 'TCP/IP'",
"Erro na negociao de acesso ao servidor",
"Conexo perdida com servidor MySQL durante 'query'",
"Comandos fora de sincronismo. Voc no pode executar este comando agora",
"%-.64s via 'named pipe'",
"No pode esperar pelo 'named pipe' para o 'host' %-.64s - 'pipe' %-.32s (%lu)",
"No pode abrir 'named pipe' para o 'host' %-.64s - 'pipe' %-.32s (%lu)",
"No pode estabelecer o estado do 'named pipe' para o 'host' %-.64s - 'pipe' %-.32s (%lu)",
"No pode inicializar conjunto de caracteres %-.64s (caminho %-.64s)",
"Obteve pacote maior do que 'max_allowed_packet'",
"Embedded server"
};
#else /* ENGLISH */ #else /* ENGLISH */
const char *client_errors[]= const char *client_errors[]=
{ {
...@@ -73,7 +102,7 @@ const char *client_errors[]= ...@@ -73,7 +102,7 @@ const char *client_errors[]=
"Can't set state of named pipe to host: %-.64s pipe: %-.32s (%lu)", "Can't set state of named pipe to host: %-.64s pipe: %-.32s (%lu)",
"Can't initialize character set %-.64s (path: %-.64s)", "Can't initialize character set %-.64s (path: %-.64s)",
"Got packet bigger than 'max_allowed_packet'", "Got packet bigger than 'max_allowed_packet'",
"Embedded server", "Embedded server"
}; };
#endif #endif
......
...@@ -117,6 +117,8 @@ int chk_status(MI_CHECK *param, register MI_INFO *info) ...@@ -117,6 +117,8 @@ int chk_status(MI_CHECK *param, register MI_INFO *info)
mi_check_print_warning(param, mi_check_print_warning(param,
"%d clients is using or hasn't closed the table properly", "%d clients is using or hasn't closed the table properly",
share->state.open_count); share->state.open_count);
/* If this will be fixed by the check, forget the warning */
if (param->testflag & T_UPDATE_STATE)
param->warning_printed=save; param->warning_printed=save;
} }
return 0; return 0;
......
...@@ -54,7 +54,7 @@ int my_copy(const char *from, const char *to, myf MyFlags) ...@@ -54,7 +54,7 @@ int my_copy(const char *from, const char *to, myf MyFlags)
if (MyFlags & MY_HOLD_ORIGINAL_MODES) /* Copy stat if possible */ if (MyFlags & MY_HOLD_ORIGINAL_MODES) /* Copy stat if possible */
new_file_stat=stat((char*) to, &new_stat_buff); new_file_stat=stat((char*) to, &new_stat_buff);
if ((from_file=my_open(from,O_RDONLY,MyFlags)) >= 0) if ((from_file=my_open(from,O_RDONLY | O_SHARE,MyFlags)) >= 0)
{ {
if (stat(from,&stat_buff)) if (stat(from,&stat_buff))
{ {
...@@ -64,7 +64,7 @@ int my_copy(const char *from, const char *to, myf MyFlags) ...@@ -64,7 +64,7 @@ int my_copy(const char *from, const char *to, myf MyFlags)
if (MyFlags & MY_HOLD_ORIGINAL_MODES && !new_file_stat) if (MyFlags & MY_HOLD_ORIGINAL_MODES && !new_file_stat)
stat_buff=new_stat_buff; stat_buff=new_stat_buff;
if ((to_file= my_create(to,(int) stat_buff.st_mode, if ((to_file= my_create(to,(int) stat_buff.st_mode,
O_WRONLY | O_TRUNC | O_BINARY, O_WRONLY | O_TRUNC | O_BINARY | O_SHARE,
MyFlags)) < 0) MyFlags)) < 0)
goto err; goto err;
......
...@@ -97,4 +97,5 @@ int (*fatal_error_handler_hook)(uint error,const char *str,myf MyFlags)= ...@@ -97,4 +97,5 @@ int (*fatal_error_handler_hook)(uint error,const char *str,myf MyFlags)=
my_bool NEAR my_disable_locking=0; my_bool NEAR my_disable_locking=0;
my_bool NEAR my_disable_async_io=0; my_bool NEAR my_disable_async_io=0;
my_bool NEAR my_disable_flush_key_blocks=0; my_bool NEAR my_disable_flush_key_blocks=0;
my_bool NEAR my_disable_symlinks=0;
my_bool NEAR mysys_uses_curses=0; my_bool NEAR mysys_uses_curses=0;
...@@ -62,7 +62,8 @@ File my_create_with_symlink(const char *linkname, const char *filename, ...@@ -62,7 +62,8 @@ File my_create_with_symlink(const char *linkname, const char *filename,
int my_delete_with_symlink(const char *name, myf MyFlags) int my_delete_with_symlink(const char *name, myf MyFlags)
{ {
char link_name[FN_REFLEN]; char link_name[FN_REFLEN];
int was_symlink= !my_readlink(link_name, name, MYF(0)); int was_symlink= (!my_disable_symlinks &&
!my_readlink(link_name, name, MYF(0)));
int result; int result;
DBUG_ENTER("my_delete_with_symlink"); DBUG_ENTER("my_delete_with_symlink");
...@@ -90,7 +91,8 @@ int my_rename_with_symlink(const char *from, const char *to, myf MyFlags) ...@@ -90,7 +91,8 @@ int my_rename_with_symlink(const char *from, const char *to, myf MyFlags)
return my_rename(from, to, MyFlags); return my_rename(from, to, MyFlags);
#else #else
char link_name[FN_REFLEN], tmp_name[FN_REFLEN]; char link_name[FN_REFLEN], tmp_name[FN_REFLEN];
int was_symlink= !my_readlink(link_name, name, MYF(0)); int was_symlink= (!my_disable_symlinks &&
!my_readlink(link_name, name, MYF(0)));
int result; int result;
DBUG_ENTER("my_rename_with_symlink"); DBUG_ENTER("my_rename_with_symlink");
......
...@@ -2484,7 +2484,7 @@ enum options { ...@@ -2484,7 +2484,7 @@ enum options {
OPT_TEMP_POOL, OPT_DO_PSTACK, OPT_TX_ISOLATION, OPT_TEMP_POOL, OPT_DO_PSTACK, OPT_TX_ISOLATION,
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_REPORT_HOST, OPT_SKIP_STACK_TRACE, OPT_SKIP_SYMLINKS, OPT_REPORT_HOST,
OPT_REPORT_USER, OPT_REPORT_PASSWORD, OPT_REPORT_PORT OPT_REPORT_USER, OPT_REPORT_PASSWORD, OPT_REPORT_PORT
}; };
...@@ -2619,6 +2619,7 @@ static struct option long_options[] = { ...@@ -2619,6 +2619,7 @@ static struct option long_options[] = {
{"skip-show-database", no_argument, 0, (int) OPT_SKIP_SHOW_DB}, {"skip-show-database", no_argument, 0, (int) OPT_SKIP_SHOW_DB},
{"skip-slave-start", no_argument, 0, (int) OPT_SKIP_SLAVE_START}, {"skip-slave-start", no_argument, 0, (int) OPT_SKIP_SLAVE_START},
{"skip-stack-trace", no_argument, 0, (int) OPT_SKIP_STACK_TRACE}, {"skip-stack-trace", no_argument, 0, (int) OPT_SKIP_STACK_TRACE},
{"skip-symlinks", 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},
{"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"
...@@ -3445,6 +3446,7 @@ static void get_options(int argc,char **argv) ...@@ -3445,6 +3446,7 @@ static void get_options(int argc,char **argv)
myisam_delay_key_write=0; myisam_delay_key_write=0;
myisam_concurrent_insert=0; myisam_concurrent_insert=0;
myisam_recover_options= HA_RECOVER_NONE; myisam_recover_options= HA_RECOVER_NONE;
my_disable_symlinks=1;
ha_open_options&= ~HA_OPEN_ABORT_IF_CRASHED; ha_open_options&= ~HA_OPEN_ABORT_IF_CRASHED;
break; break;
case (int) OPT_SAFE: case (int) OPT_SAFE:
...@@ -3501,6 +3503,9 @@ static void get_options(int argc,char **argv) ...@@ -3501,6 +3503,9 @@ static void get_options(int argc,char **argv)
case (int) OPT_SKIP_STACK_TRACE: case (int) OPT_SKIP_STACK_TRACE:
test_flags|=TEST_NO_STACKTRACE; test_flags|=TEST_NO_STACKTRACE;
break; break;
case (int) OPT_SKIP_SYMLINKS:
my_disable_symlinks=1;
break;
case (int) OPT_BIND_ADDRESS: case (int) OPT_BIND_ADDRESS:
if (optarg && isdigit(optarg[0])) if (optarg && isdigit(optarg[0]))
{ {
......
...@@ -140,7 +140,7 @@ net_printf(NET *net, uint errcode, ...) ...@@ -140,7 +140,7 @@ net_printf(NET *net, uint errcode, ...)
void void
send_ok(NET *net,ha_rows affected_rows,ulonglong id,const char *message) send_ok(NET *net,ha_rows affected_rows,ulonglong id,const char *message)
{ {
if(net->no_send_ok) if (net->no_send_ok) // hack for re-parsing queries
return; return;
char buff[MYSQL_ERRMSG_SIZE+10],*pos; char buff[MYSQL_ERRMSG_SIZE+10],*pos;
......
This diff is collapsed.
...@@ -315,15 +315,18 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, ...@@ -315,15 +315,18 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
const char* table_name) const char* table_name)
{ {
uint packet_len = my_net_read(net); // read create table statement uint packet_len = my_net_read(net); // read create table statement
Vio* save_vio;
HA_CHECK_OPT check_opt;
TABLE_LIST tables; TABLE_LIST tables;
int error = 0; int error= 1;
handler *file;
if(packet_len == packet_error) if (packet_len == packet_error)
{ {
send_error(&thd->net, ER_MASTER_NET_READ); send_error(&thd->net, ER_MASTER_NET_READ);
return 1; return 1;
} }
if(net->read_pos[0] == 255) // error from master if (net->read_pos[0] == 255) // error from master
{ {
net->read_pos[packet_len] = 0; net->read_pos[packet_len] = 0;
net_printf(&thd->net, ER_MASTER, net->read_pos + 3); net_printf(&thd->net, ER_MASTER, net->read_pos + 3);
...@@ -331,7 +334,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, ...@@ -331,7 +334,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
} }
thd->command = COM_TABLE_DUMP; thd->command = COM_TABLE_DUMP;
thd->query = sql_alloc(packet_len + 1); thd->query = sql_alloc(packet_len + 1);
if(!thd->query) if (!thd->query)
{ {
sql_print_error("create_table_from_dump: out of memory"); sql_print_error("create_table_from_dump: out of memory");
net_printf(&thd->net, ER_GET_ERRNO, "Out of memory"); net_printf(&thd->net, ER_GET_ERRNO, "Out of memory");
...@@ -349,11 +352,8 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, ...@@ -349,11 +352,8 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
mysql_parse(thd, thd->query, packet_len); // run create table mysql_parse(thd, thd->query, packet_len); // run create table
thd->db = save_db; // leave things the way the were before thd->db = save_db; // leave things the way the were before
if(thd->query_error) if (thd->query_error)
{ goto err; // mysql_parse took care of the error send
close_thread_tables(thd); // mysql_parse takes care of the error send
return 1;
}
bzero((char*) &tables,sizeof(tables)); bzero((char*) &tables,sizeof(tables));
tables.db = (char*)db; tables.db = (char*)db;
...@@ -362,41 +362,37 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, ...@@ -362,41 +362,37 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
thd->proc_info = "Opening master dump table"; thd->proc_info = "Opening master dump table";
if (!open_ltable(thd, &tables, TL_WRITE)) if (!open_ltable(thd, &tables, TL_WRITE))
{ {
// open tables will send the error send_error(&thd->net,0,0); // Send error from open_ltable
sql_print_error("create_table_from_dump: could not open created table"); sql_print_error("create_table_from_dump: could not open created table");
close_thread_tables(thd); goto err;
return 1;
} }
handler *file = tables.table->file; file = tables.table->file;
thd->proc_info = "Reading master dump table data"; thd->proc_info = "Reading master dump table data";
if (file->net_read_dump(net)) if (file->net_read_dump(net))
{ {
net_printf(&thd->net, ER_MASTER_NET_READ); net_printf(&thd->net, ER_MASTER_NET_READ);
sql_print_error("create_table_from_dump::failed in\ sql_print_error("create_table_from_dump::failed in\
handler::net_read_dump()"); handler::net_read_dump()");
close_thread_tables(thd); goto err;
return 1;
} }
HA_CHECK_OPT check_opt;
check_opt.init(); check_opt.init();
check_opt.flags|= T_VERY_SILENT; check_opt.flags|= T_VERY_SILENT;
check_opt.quick = 1; check_opt.quick = 1;
thd->proc_info = "Rebuilding the index on master dump table"; thd->proc_info = "Rebuilding the index on master dump table";
Vio* save_vio = thd->net.vio;
// we do not want repair() to spam us with messages // we do not want repair() to spam us with messages
// just send them to the error log, and report the failure in case of // just send them to the error log, and report the failure in case of
// problems // problems
save_vio = thd->net.vio;
thd->net.vio = 0; thd->net.vio = 0;
if (file->repair(thd,&check_opt )) error=file->repair(thd,&check_opt) != 0;
{
net_printf(&thd->net, ER_INDEX_REBUILD,tables.table->real_name );
error = 1;
}
thd->net.vio = save_vio; thd->net.vio = save_vio;
close_thread_tables(thd); if (error)
net_printf(&thd->net, ER_INDEX_REBUILD,tables.table->real_name);
err:
close_thread_tables(thd);
thd->net.no_send_ok = 0; thd->net.no_send_ok = 0;
return error; return error;
} }
...@@ -407,16 +403,16 @@ int fetch_nx_table(THD* thd, const char* db_name, const char* table_name, ...@@ -407,16 +403,16 @@ int fetch_nx_table(THD* thd, const char* db_name, const char* table_name,
int error = 1; int error = 1;
int nx_errno = 0; int nx_errno = 0;
bool called_connected = (mysql != NULL); bool called_connected = (mysql != NULL);
if(!called_connected && !(mysql = mc_mysql_init(NULL))) if (!called_connected && !(mysql = mc_mysql_init(NULL)))
{ {
sql_print_error("fetch_nx_table: Error in mysql_init()"); sql_print_error("fetch_nx_table: Error in mysql_init()");
nx_errno = ER_GET_ERRNO; nx_errno = ER_GET_ERRNO;
goto err; goto err;
} }
if(!called_connected) if (!called_connected)
{ {
if(connect_to_master(thd, mysql, mi)) if (connect_to_master(thd, mysql, mi))
{ {
sql_print_error("Could not connect to master while fetching table\ sql_print_error("Could not connect to master while fetching table\
'%-64s.%-64s'", db_name, table_name); '%-64s.%-64s'", db_name, table_name);
...@@ -424,15 +420,18 @@ int fetch_nx_table(THD* thd, const char* db_name, const char* table_name, ...@@ -424,15 +420,18 @@ int fetch_nx_table(THD* thd, const char* db_name, const char* table_name,
goto err; goto err;
} }
} }
safe_connect(thd, mysql, mi);
if (slave_killed(thd))
goto err;
if(request_table_dump(mysql, db_name, table_name)) if (request_table_dump(mysql, thd->last_nx_db, thd->last_nx_table))
{ {
nx_errno = ER_GET_ERRNO; nx_errno = ER_GET_ERRNO;
sql_print_error("fetch_nx_table: failed on table dump request "); sql_print_error("fetch_nx_table: failed on table dump request ");
goto err; goto err;
} }
if(create_table_from_dump(thd, &mysql->net, db_name, if (create_table_from_dump(thd, &mysql->net, db_name,
table_name)) table_name))
{ {
// create_table_from_dump will have sent the error alread // create_table_from_dump will have sent the error alread
...@@ -447,6 +446,7 @@ int fetch_nx_table(THD* thd, const char* db_name, const char* table_name, ...@@ -447,6 +446,7 @@ int fetch_nx_table(THD* thd, const char* db_name, const char* table_name,
mc_mysql_close(mysql); mc_mysql_close(mysql);
if (nx_errno && thd->net.vio) if (nx_errno && thd->net.vio)
send_error(&thd->net, nx_errno, "Error in fetch_nx_table"); send_error(&thd->net, nx_errno, "Error in fetch_nx_table");
thd->net.no_send_ok = 0; // Clear up garbage after create_table_from_dump
return error; return error;
} }
......
...@@ -1243,21 +1243,11 @@ mysql_execute_command(void) ...@@ -1243,21 +1243,11 @@ mysql_execute_command(void)
if (strlen(tables->name) > NAME_LEN) if (strlen(tables->name) > NAME_LEN)
{ {
net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->name); net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->name);
res=0;
break;
}
if(fetch_nx_table(thd, tables->db, tables->real_name, &glob_mi, 0))
// fetch_nx_table is responsible for sending
// the error
{
res = 0;
thd->net.no_send_ok = 0; // easier to do it here
// this way we make sure that when we are done, we are clean
break; break;
} }
res = 0; if (fetch_nx_table(thd, tables->db, tables->real_name, &glob_mi, 0))
break; // fetch_nx_table did send the error to the client
send_ok(&thd->net); send_ok(&thd->net);
break; break;
......
...@@ -832,13 +832,13 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table) ...@@ -832,13 +832,13 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table)
int lock_retcode; int lock_retcode;
pthread_mutex_lock(&LOCK_open); pthread_mutex_lock(&LOCK_open);
if((lock_retcode = lock_table_name(thd, table)) < 0) if ((lock_retcode = lock_table_name(thd, table)) < 0)
{ {
pthread_mutex_unlock(&LOCK_open); pthread_mutex_unlock(&LOCK_open);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
if(lock_retcode && wait_for_locked_table_names(thd, table)) if (lock_retcode && wait_for_locked_table_names(thd, table))
{ {
unlock_table_name(thd, table); unlock_table_name(thd, table);
pthread_mutex_unlock(&LOCK_open); pthread_mutex_unlock(&LOCK_open);
...@@ -846,7 +846,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table) ...@@ -846,7 +846,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table)
} }
pthread_mutex_unlock(&LOCK_open); pthread_mutex_unlock(&LOCK_open);
if(my_copy(src_path, if (my_copy(src_path,
fn_format(dst_path, dst_path,"", fn_format(dst_path, dst_path,"",
reg_ext, 4), reg_ext, 4),
MYF(MY_WME))) MYF(MY_WME)))
...@@ -860,7 +860,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table) ...@@ -860,7 +860,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table)
// generate table will try to send OK which messes up the output // generate table will try to send OK which messes up the output
// for the client // for the client
if(generate_table(thd, table, 0)) if (generate_table(thd, table, 0))
{ {
unlock_table_name(thd, table); unlock_table_name(thd, table);
thd->net.no_send_ok = save_no_send_ok; thd->net.no_send_ok = save_no_send_ok;
...@@ -921,7 +921,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, ...@@ -921,7 +921,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
// now we should be able to open the partially restored table // now we should be able to open the partially restored table
// to finish the restore in the handler later on // to finish the restore in the handler later on
if(!(table->table = reopen_name_locked_table(thd, table))) if (!(table->table = reopen_name_locked_table(thd, table)))
unlock_table_name(thd, table); unlock_table_name(thd, table);
} }
...@@ -1748,7 +1748,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -1748,7 +1748,7 @@ copy_data_between_tables(TABLE *from,TABLE *to,
alter table is to delete the new table so there alter table is to delete the new table so there
is no need to log the changes to it. */ is no need to log the changes to it. */
error = ha_recovery_logging(thd,false); error = ha_recovery_logging(thd,false);
if(error) if (error)
{ {
error = 1; error = 1;
goto err; goto err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment