summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-11-11 00:36:56 +0200
committerunknown <monty@mysql.com>2004-11-11 00:36:56 +0200
commit71196720d1d50a2d84b0af894db248c5cafd03f3 (patch)
tree3ebfa72b3730e7aa8ee735c40286d02aea15377c /sql
parent8eae81ba317f8bb29312da53412755db99fcbcc3 (diff)
parent5205078ef93edb0b9752285a98aa3616057aad35 (diff)
downloadmariadb-git-71196720d1d50a2d84b0af894db248c5cafd03f3.tar.gz
Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/my/mysql-4.1 sql/handler.cc: Auto merged sql/slave.cc: Auto merged sql/sql_parse.cc: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/field.cc10
-rw-r--r--sql/handler.cc38
-rw-r--r--sql/item_timefunc.cc13
-rw-r--r--sql/log.cc32
-rw-r--r--sql/mysqld.cc2
-rw-r--r--sql/slave.cc2
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_parse.cc11
8 files changed, 72 insertions, 38 deletions
diff --git a/sql/field.cc b/sql/field.cc
index deb38048d42..f70a23e889a 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5941,8 +5941,14 @@ Field *make_field(char *ptr, uint32 field_length,
if (f_is_alpha(pack_flag))
{
if (!f_is_packed(pack_flag))
- return new Field_string(ptr,field_length,null_pos,null_bit,
- unireg_check, field_name, table, field_charset);
+ {
+ if (field_type == FIELD_TYPE_STRING ||
+ field_type == FIELD_TYPE_VAR_STRING)
+ return new Field_string(ptr,field_length,null_pos,null_bit,
+ unireg_check, field_name, table,
+ field_charset);
+ return 0; // Error
+ }
uint pack_length=calc_pack_length((enum_field_types)
f_packtype(pack_flag),
diff --git a/sql/handler.cc b/sql/handler.cc
index 32f5ad6ff1d..b6b09ceca91 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -110,6 +110,7 @@ TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names)-1,"",
tx_isolation_names, NULL};
static TYPELIB known_extensions= {0,"known_exts", NULL, NULL};
+uint known_extensions_id= 0;
enum db_type ha_resolve_by_name(const char *name, uint namelen)
{
@@ -1660,6 +1661,7 @@ int handler::index_read_idx(byte * buf, uint index, const byte * key,
return error;
}
+
/*
Returns a list of all known extensions.
@@ -1668,20 +1670,24 @@ int handler::index_read_idx(byte * buf, uint index, const byte * key,
NOTES
No mutexes, worst case race is a minor surplus memory allocation
+ We have to recreate the extension map if mysqld is restarted (for example
+ within libmysqld)
RETURN VALUE
pointer pointer to TYPELIB structure
*/
+
TYPELIB *ha_known_exts(void)
{
- if (!known_extensions.type_names)
+ if (!known_extensions.type_names || mysys_usage_id != known_extensions_id)
{
show_table_type_st *types;
List<char> found_exts;
List_iterator_fast<char> it(found_exts);
- const char *e, **ext;
-
- found_exts.push_back(".db");
+ const char **ext, *old_ext;
+
+ known_extensions_id= mysys_usage_id;
+ found_exts.push_back((char*) ".db");
for (types= sys_table_types; types->type; types++)
{
if (*types->value == SHOW_OPTION_YES)
@@ -1689,28 +1695,30 @@ TYPELIB *ha_known_exts(void)
handler *file= get_new_handler(0,(enum db_type) types->db_type);
for (ext= file->bas_ext(); *ext; ext++)
{
- while (e=it++)
- if (e == *ext)
+ while ((old_ext= it++))
+ {
+ if (!strcmp(old_ext, *ext))
break;
-
- if (!e)
- found_exts.push_back((char *)*ext);
+ }
+ if (!old_ext)
+ found_exts.push_back((char *) *ext);
it.rewind();
}
delete file;
}
}
- ext= (const char **)my_once_alloc(sizeof(char *)*
- (found_exts.elements+1), MYF(MY_WME));
+ ext= (const char **) my_once_alloc(sizeof(char *)*
+ (found_exts.elements+1),
+ MYF(MY_WME | MY_FAE));
DBUG_ASSERT(ext);
- for (uint i=0; e=it++; i++)
- ext[i]= e;
- ext[found_exts.elements]= 0;
-
known_extensions.count= found_exts.elements;
known_extensions.type_names= ext;
+
+ while ((old_ext= it++))
+ *ext++= old_ext;
+ *ext= 0;
}
return &known_extensions;
}
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index 41418c0094d..d8142352e70 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -161,21 +161,24 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
{
int weekday= 0, yearday= 0, daypart= 0;
int week_number= -1;
- CHARSET_INFO *cs= &my_charset_bin;
int error= 0;
- bool usa_time= 0;
- bool sunday_first_n_first_week_non_iso= -2;
- bool strict_week_number;
int strict_week_number_year= -1;
- bool strict_week_number_year_type= -1;
int frac_part;
+ bool usa_time= 0;
+ bool sunday_first_n_first_week_non_iso;
+ bool strict_week_number;
+ bool strict_week_number_year_type;
const char *val_begin= val;
const char *val_end= val + length;
const char *ptr= format->format.str;
const char *end= ptr + format->format.length;
+ CHARSET_INFO *cs= &my_charset_bin;
DBUG_ENTER("extract_date_time");
LINT_INIT(strict_week_number);
+ /* Remove valgrind varnings when using gcc 3.3 and -O1 */
+ PURIFY_OR_LINT_INIT(strict_week_number_year_type);
+ PURIFY_OR_LINT_INIT(sunday_first_n_first_week_non_iso);
if (!sub_pattern_end)
bzero((char*) l_time, sizeof(*l_time));
diff --git a/sql/log.cc b/sql/log.cc
index ef57a57d3b4..bcd99326501 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -1703,6 +1703,8 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
time_t current_time;
if (!is_open())
return 0;
+ DBUG_ENTER("MYSQL_LOG::write");
+
VOID(pthread_mutex_lock(&LOCK_log));
if (is_open())
{ // Safety agains reopen
@@ -1712,7 +1714,7 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
if (!(thd->options & OPTION_UPDATE_LOG))
{
VOID(pthread_mutex_unlock(&LOCK_log));
- return 0;
+ DBUG_RETURN(0);
}
if (!(specialflag & SPECIAL_SHORT_LOG_FORMAT) || query_start_arg)
{
@@ -1812,7 +1814,7 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
}
}
VOID(pthread_mutex_unlock(&LOCK_log));
- return error;
+ DBUG_RETURN(error);
}
@@ -1832,16 +1834,19 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
THD::enter_cond() (see NOTES in sql_class.h).
*/
-void MYSQL_LOG:: wait_for_update(THD* thd, bool master_or_slave)
+void MYSQL_LOG::wait_for_update(THD* thd, bool master_or_slave)
{
- const char* old_msg = thd->enter_cond(&update_cond, &LOCK_log,
- master_or_slave ?
- "Has read all relay log; waiting for \
-the slave I/O thread to update it" :
- "Has sent all binlog to slave; \
-waiting for binlog to be updated");
+ const char *old_msg;
+ DBUG_ENTER("wait_for_update");
+ old_msg= thd->enter_cond(&update_cond, &LOCK_log,
+ master_or_slave ?
+ "Has read all relay log; waiting for the slave I/O "
+ "thread to update it" :
+ "Has sent all binlog to slave; waiting for binlog "
+ "to be updated");
pthread_cond_wait(&update_cond, &LOCK_log);
thd->exit_cond(old_msg);
+ DBUG_VOID_RETURN;
}
@@ -2198,6 +2203,15 @@ void MYSQL_LOG::report_pos_in_innodb()
DBUG_VOID_RETURN;
}
+
+void MYSQL_LOG::signal_update()
+{
+ DBUG_ENTER("MYSQL_LOG::signal_update");
+ pthread_cond_broadcast(&update_cond);
+ DBUG_VOID_RETURN;
+}
+
+
#ifdef __NT__
void print_buffer_to_nt_eventlog(enum loglevel level, char *buff,
uint length, int buffLen)
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 078ee19fe6a..5622ac50a7b 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -540,7 +540,7 @@ static void close_connections(void)
struct timespec abstime;
int error;
LINT_INIT(error);
- DBUG_PRINT("info",("Waiting for select_thread"));
+ DBUG_PRINT("info",("Waiting for select thread"));
#ifndef DONT_USE_THR_ALARM
if (pthread_kill(select_thread,THR_CLIENT_ALARM))
diff --git a/sql/slave.cc b/sql/slave.cc
index d5278e06d8a..b6ad35573ff 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -2635,7 +2635,7 @@ static int request_dump(MYSQL* mysql, MASTER_INFO* mi,
DBUG_ENTER("request_dump");
// TODO if big log files: Change next to int8store()
- int4store(buf, (longlong) mi->master_log_pos);
+ int4store(buf, (ulong) mi->master_log_pos);
int2store(buf + 4, binlog_flags);
int4store(buf + 6, server_id);
len = (uint) strlen(logname);
diff --git a/sql/sql_class.h b/sql/sql_class.h
index df6be559df2..312d9de9794 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -131,7 +131,7 @@ public:
DBUG_VOID_RETURN;
}
void set_max_size(ulong max_size_arg);
- void signal_update() { pthread_cond_broadcast(&update_cond);}
+ void signal_update();
void wait_for_update(THD* thd, bool master_or_slave);
void set_need_start_event() { need_start_event = 1; }
void init(enum_log_type log_type_arg,
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 9b1cac63e50..9d755731cb7 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1610,15 +1610,15 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
#ifndef EMBEDDED_LIBRARY
case COM_BINLOG_DUMP:
{
+ ulong pos;
+ ushort flags;
+ uint32 slave_server_id;
+
statistic_increment(com_other,&LOCK_status);
thd->slow_command = TRUE;
if (check_global_access(thd, REPL_SLAVE_ACL))
break;
- mysql_log.write(thd,command, 0);
- ulong pos;
- ushort flags;
- uint32 slave_server_id;
/* TODO: The following has to be changed to an 8 byte integer */
pos = uint4korr(packet);
flags = uint2korr(packet + 4);
@@ -1626,6 +1626,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
if ((slave_server_id= uint4korr(packet+6))) // mysqlbinlog.server_id==0
kill_zombie_dump_threads(slave_server_id);
thd->server_id = slave_server_id;
+
+ mysql_log.write(thd, command, "Log: '%s' Pos: %ld", packet+10,
+ (long) pos);
mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags);
unregister_slave(thd,1,1);
// fake COM_QUIT -- if we get here, the thread needs to terminate