Merge trift2.:/MySQL/M51/target-5.1.22

into  trift2.:/MySQL/M51/push-5.1

Includes manual merges.
This commit is contained in:
joerg@trift2. 2007-08-22 16:08:55 +02:00
commit 20ce606797
147 changed files with 1451 additions and 1041 deletions

View File

@ -3,7 +3,13 @@
# Assume Forte is installed in /opt/SUNWSpro and ld is installed in # Assume Forte is installed in /opt/SUNWSpro and ld is installed in
# /usr/ccs/bin # /usr/ccs/bin
PATH=/opt/SUNWspro/bin/:/usr/ccs/bin:$PATH PATH=/opt/SUNWspro/bin:/usr/ccs/bin:/usr/sfw/bin:/opt/csw/bin:$PATH
prefix="/usr/local/mysql"
if test -n "$MYSQL_BUILD_PREFIX"
then
prefix="$MYSQL_BUILD_PREFIX"
fi
make -k maintainer-clean || true make -k maintainer-clean || true
/bin/rm -f */.deps/*.P config.cache /bin/rm -f */.deps/*.P config.cache
@ -12,9 +18,9 @@ path=`dirname $0`
. "$path/autorun.sh" . "$path/autorun.sh"
# For "optimal" code for this computer add -fast to EXTRA # For "optimal" code for this computer add -fast to EXTRA
# To compile 64 bit, add -xarch=v9 to EXTRA_64_BIT # To compile 32/64 bit, uncomment/comment EXTRA_64_BIT
EXTRA_64_BIT="-xarch=v9" # Remove comment to get 64 bit binaries EXTRA_64_BIT="-m64"
EXTRA="-fast" # Remove comment to target current machine EXTRA="-fast" # Remove comment to target current machine
# #
@ -22,10 +28,9 @@ EXTRA="-fast" # Remove comment to target current machine
# #
STD="-mt -D_FORTEC_ $EXTRA $EXTRA_64_BIT" STD="-mt -D_FORTEC_ $EXTRA $EXTRA_64_BIT"
ASFLAGS="$EXTRA_64_BIT" \
CC=cc-5.0 CFLAGS="-Xa -xstrconst $STD" \ CC=cc-5.0 CFLAGS="-Xa -xstrconst $STD" \
CXX=CC CXXFLAGS="-noex $STD" \ CXX=CC CXXFLAGS="-noex $STD" \
./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --prefix=$PREFIX
make -j 4 make -j 4
if [ $? = 0 ] if [ $? = 0 ]

View File

@ -196,6 +196,8 @@ void tee_putc(int c, FILE *file);
static void tee_print_sized_data(const char *, unsigned int, unsigned int, bool); static void tee_print_sized_data(const char *, unsigned int, unsigned int, bool);
/* The names of functions that actually do the manipulation. */ /* The names of functions that actually do the manipulation. */
static int get_options(int argc,char **argv); static int get_options(int argc,char **argv);
extern "C" my_bool get_one_option(int optid, const struct my_option *opt,
char *argument);
static int com_quit(String *str,char*), static int com_quit(String *str,char*),
com_go(String *str,char*), com_ego(String *str,char*), com_go(String *str,char*), com_ego(String *str,char*),
com_print(String *str,char*), com_print(String *str,char*),
@ -349,8 +351,8 @@ static ulong start_timer(void);
static void end_timer(ulong start_time,char *buff); static void end_timer(ulong start_time,char *buff);
static void mysql_end_timer(ulong start_time,char *buff); static void mysql_end_timer(ulong start_time,char *buff);
static void nice_time(double sec,char *buff,bool part_second); static void nice_time(double sec,char *buff,bool part_second);
static sig_handler mysql_end(int sig); extern "C" sig_handler mysql_end(int sig);
static sig_handler handle_sigint(int sig); extern "C" sig_handler handle_sigint(int sig);
int main(int argc,char *argv[]) int main(int argc,char *argv[])
{ {
@ -814,7 +816,7 @@ and you are welcome to modify and redistribute it under the GPL license\n");
} }
static my_bool my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)), get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
char *argument) char *argument)
{ {
@ -1427,7 +1429,7 @@ static bool add_line(String &buffer,char *line,char *in_string,
#ifdef HAVE_READLINE #ifdef HAVE_READLINE
static char *new_command_generator(const char *text, int); static char *new_command_generator(const char *text, int);
static char **new_mysql_completion (const char *text, int start, int end); extern "C" char **new_mysql_completion (const char *text, int start, int end);
/* /*
Tell the GNU Readline library how to complete. We want to try to complete Tell the GNU Readline library how to complete. We want to try to complete
@ -1436,9 +1438,9 @@ static char **new_mysql_completion (const char *text, int start, int end);
*/ */
#if defined(USE_NEW_READLINE_INTERFACE) || defined(USE_LIBEDIT_INTERFACE) #if defined(USE_NEW_READLINE_INTERFACE) || defined(USE_LIBEDIT_INTERFACE)
char *no_completion(const char*,int) extern "C" char *no_completion(const char*,int)
#else #else
char *no_completion() extern "C" char *no_completion()
#endif #endif
{ {
return 0; /* No filename completion */ return 0; /* No filename completion */
@ -1540,9 +1542,9 @@ static void initialize_readline (char *name)
array of matches, or NULL if there aren't any. array of matches, or NULL if there aren't any.
*/ */
static char **new_mysql_completion (const char *text, char **new_mysql_completion (const char *text,
int start __attribute__((unused)), int start __attribute__((unused)),
int end __attribute__((unused))) int end __attribute__((unused)))
{ {
if (!status.batch && !quick) if (!status.batch && !quick)
#if defined(USE_NEW_READLINE_INTERFACE) #if defined(USE_NEW_READLINE_INTERFACE)

View File

@ -451,7 +451,7 @@ static int run_query(const char *query, DYNAMIC_STRING *ds_res,
MYF(MY_WME))) < 0) MYF(MY_WME))) < 0)
die("Failed to create temporary file for defaults"); die("Failed to create temporary file for defaults");
if (my_write(fd, query, strlen(query), if (my_write(fd, (uchar*) query, strlen(query),
MYF(MY_FNABP | MY_WME))) MYF(MY_FNABP | MY_WME)))
die("Failed to write to '%s'", query_file_path); die("Failed to write to '%s'", query_file_path);

View File

@ -71,10 +71,12 @@ static uint ex_var_count, max_var_length, max_val_length;
static void print_version(void); static void print_version(void);
static void usage(void); static void usage(void);
extern "C" my_bool get_one_option(int optid, const struct my_option *opt,
char *argument);
static my_bool sql_connect(MYSQL *mysql, uint wait); static my_bool sql_connect(MYSQL *mysql, uint wait);
static int execute_commands(MYSQL *mysql,int argc, char **argv); static int execute_commands(MYSQL *mysql,int argc, char **argv);
static int drop_db(MYSQL *mysql,const char *db); static int drop_db(MYSQL *mysql,const char *db);
static sig_handler endprog(int signal_number); extern "C" sig_handler endprog(int signal_number);
static void nice_time(ulong sec,char *buff); static void nice_time(ulong sec,char *buff);
static void print_header(MYSQL_RES *result); static void print_header(MYSQL_RES *result);
static void print_top(MYSQL_RES *result); static void print_top(MYSQL_RES *result);
@ -230,7 +232,7 @@ static struct my_option my_long_options[] =
static const char *load_default_groups[]= { "mysqladmin","client",0 }; static const char *load_default_groups[]= { "mysqladmin","client",0 };
static my_bool my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)), get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
char *argument) char *argument)
{ {
@ -430,7 +432,7 @@ int main(int argc,char *argv[])
} }
static sig_handler endprog(int signal_number __attribute__((unused))) sig_handler endprog(int signal_number __attribute__((unused)))
{ {
interrupted=1; interrupted=1;
} }

View File

@ -1030,14 +1030,14 @@ static int dump_log_entries(const char* logname)
like CREATE PROCEDURE safely like CREATE PROCEDURE safely
*/ */
fprintf(result_file, "DELIMITER /*!*/;\n"); fprintf(result_file, "DELIMITER /*!*/;\n");
strcpy(print_event_info.delimiter, "/*!*/;"); strmov(print_event_info.delimiter, "/*!*/;");
rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) : rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) :
dump_local_log_entries(&print_event_info, logname)); dump_local_log_entries(&print_event_info, logname));
/* Set delimiter back to semicolon */ /* Set delimiter back to semicolon */
fprintf(result_file, "DELIMITER ;\n"); fprintf(result_file, "DELIMITER ;\n");
strcpy(print_event_info.delimiter, ";"); strmov(print_event_info.delimiter, ";");
return rc; return rc;
} }

View File

@ -677,7 +677,7 @@ static void print_result()
*/ */
if (found_error && opt_auto_repair && what_to_do != DO_REPAIR && if (found_error && opt_auto_repair && what_to_do != DO_REPAIR &&
strcmp(row[3],"OK")) strcmp(row[3],"OK"))
insert_dynamic(&tables4repair, prev); insert_dynamic(&tables4repair, (uchar*) prev);
found_error=0; found_error=0;
if (opt_silent) if (opt_silent)
continue; continue;
@ -697,7 +697,7 @@ static void print_result()
} }
/* add the last table to be repaired to the list */ /* add the last table to be repaired to the list */
if (found_error && opt_auto_repair && what_to_do != DO_REPAIR) if (found_error && opt_auto_repair && what_to_do != DO_REPAIR)
insert_dynamic(&tables4repair, prev); insert_dynamic(&tables4repair, (uchar*) prev);
mysql_free_result(res); mysql_free_result(res);
} }

View File

@ -3913,9 +3913,9 @@ static int init_dumping(char *database, int init_func(char*))
/* Return 1 if we should copy the table */ /* Return 1 if we should copy the table */
my_bool include_table(const char* hash_key, uint len) my_bool include_table(const uchar *hash_key, size_t len)
{ {
return !hash_search(&ignore_table, (uchar*) hash_key, len); return !hash_search(&ignore_table, hash_key, len);
} }
@ -3943,7 +3943,7 @@ static int dump_all_tables_in_db(char *database)
for (numrows= 0 ; (table= getTableName(1)) ; ) for (numrows= 0 ; (table= getTableName(1)) ; )
{ {
char *end= strmov(afterdot, table); char *end= strmov(afterdot, table);
if (include_table(hash_key,end - hash_key)) if (include_table((uchar*) hash_key,end - hash_key))
{ {
numrows++; numrows++;
dynstr_append_checked(&query, quote_name(table, table_buff, 1)); dynstr_append_checked(&query, quote_name(table, table_buff, 1));
@ -3964,7 +3964,7 @@ static int dump_all_tables_in_db(char *database)
while ((table= getTableName(0))) while ((table= getTableName(0)))
{ {
char *end= strmov(afterdot, table); char *end= strmov(afterdot, table);
if (include_table(hash_key, end - hash_key)) if (include_table((uchar*) hash_key, end - hash_key))
{ {
dump_table(table,database); dump_table(table,database);
my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
@ -4043,7 +4043,7 @@ static my_bool dump_all_views_in_db(char *database)
for (numrows= 0 ; (table= getTableName(1)); ) for (numrows= 0 ; (table= getTableName(1)); )
{ {
char *end= strmov(afterdot, table); char *end= strmov(afterdot, table);
if (include_table(hash_key,end - hash_key)) if (include_table((uchar*) hash_key,end - hash_key))
{ {
numrows++; numrows++;
dynstr_append_checked(&query, quote_name(table, table_buff, 1)); dynstr_append_checked(&query, quote_name(table, table_buff, 1));
@ -4064,7 +4064,7 @@ static my_bool dump_all_views_in_db(char *database)
while ((table= getTableName(0))) while ((table= getTableName(0)))
{ {
char *end= strmov(afterdot, table); char *end= strmov(afterdot, table);
if (include_table(hash_key, end - hash_key)) if (include_table((uchar*) hash_key, end - hash_key))
get_view_structure(table, database); get_view_structure(table, database);
} }
if (opt_xml) if (opt_xml)

View File

@ -1354,7 +1354,7 @@ get_options(int *argc,char ***argv)
} }
tmp_string= (char *)my_malloc(sbuf.st_size + 1, tmp_string= (char *)my_malloc(sbuf.st_size + 1,
MYF(MY_ZEROFILL|MY_FAE|MY_WME)); MYF(MY_ZEROFILL|MY_FAE|MY_WME));
my_read(data_file, tmp_string, sbuf.st_size, MYF(0)); my_read(data_file, (uchar*) tmp_string, sbuf.st_size, MYF(0));
tmp_string[sbuf.st_size]= '\0'; tmp_string[sbuf.st_size]= '\0';
my_close(data_file,MYF(0)); my_close(data_file,MYF(0));
parse_delimiter(tmp_string, &create_statements, delimiter[0]); parse_delimiter(tmp_string, &create_statements, delimiter[0]);
@ -1381,7 +1381,7 @@ get_options(int *argc,char ***argv)
} }
tmp_string= (char *)my_malloc(sbuf.st_size + 1, tmp_string= (char *)my_malloc(sbuf.st_size + 1,
MYF(MY_ZEROFILL|MY_FAE|MY_WME)); MYF(MY_ZEROFILL|MY_FAE|MY_WME));
my_read(data_file, tmp_string, sbuf.st_size, MYF(0)); my_read(data_file, (uchar*) tmp_string, sbuf.st_size, MYF(0));
tmp_string[sbuf.st_size]= '\0'; tmp_string[sbuf.st_size]= '\0';
my_close(data_file,MYF(0)); my_close(data_file,MYF(0));
if (user_supplied_query) if (user_supplied_query)
@ -1412,7 +1412,7 @@ get_options(int *argc,char ***argv)
} }
tmp_string= (char *)my_malloc(sbuf.st_size + 1, tmp_string= (char *)my_malloc(sbuf.st_size + 1,
MYF(MY_ZEROFILL|MY_FAE|MY_WME)); MYF(MY_ZEROFILL|MY_FAE|MY_WME));
my_read(data_file, tmp_string, sbuf.st_size, MYF(0)); my_read(data_file, (uchar*) tmp_string, sbuf.st_size, MYF(0));
tmp_string[sbuf.st_size]= '\0'; tmp_string[sbuf.st_size]= '\0';
my_close(data_file,MYF(0)); my_close(data_file,MYF(0));
if (user_supplied_pre_statements) if (user_supplied_pre_statements)
@ -1443,7 +1443,7 @@ get_options(int *argc,char ***argv)
} }
tmp_string= (char *)my_malloc(sbuf.st_size + 1, tmp_string= (char *)my_malloc(sbuf.st_size + 1,
MYF(MY_ZEROFILL|MY_FAE|MY_WME)); MYF(MY_ZEROFILL|MY_FAE|MY_WME));
my_read(data_file, tmp_string, sbuf.st_size, MYF(0)); my_read(data_file, (uchar*) tmp_string, sbuf.st_size, MYF(0));
tmp_string[sbuf.st_size]= '\0'; tmp_string[sbuf.st_size]= '\0';
my_close(data_file,MYF(0)); my_close(data_file,MYF(0));
if (user_supplied_post_statements) if (user_supplied_post_statements)
@ -2076,7 +2076,7 @@ print_conclusions_csv(conclusions *con)
con->users, /* Children used */ con->users, /* Children used */
con->avg_rows /* Queries run */ con->avg_rows /* Queries run */
); );
my_write(csv_file, buffer, (uint)strlen(buffer), MYF(0)); my_write(csv_file, (uchar*) buffer, (uint)strlen(buffer), MYF(0));
} }
void void

View File

@ -1514,7 +1514,7 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
void var_set_query_get_value(struct st_command *command, VAR *var) void var_set_query_get_value(struct st_command *command, VAR *var)
{ {
ulong row_no; long row_no;
int col_no= -1; int col_no= -1;
MYSQL_RES* res; MYSQL_RES* res;
MYSQL* mysql= &cur_con->mysql; MYSQL* mysql= &cur_con->mysql;
@ -1591,7 +1591,7 @@ void var_set_query_get_value(struct st_command *command, VAR *var)
while ((row= mysql_fetch_row(res))) while ((row= mysql_fetch_row(res)))
{ {
if (++rows == row_no) if (++rows == (ulong) row_no)
{ {
DBUG_PRINT("info", ("At row %ld, column %d is '%s'", DBUG_PRINT("info", ("At row %ld, column %d is '%s'",
@ -2584,7 +2584,7 @@ void do_send_quit(struct st_command *command)
DBUG_PRINT("info", ("con->name: %s", con->name)); DBUG_PRINT("info", ("con->name: %s", con->name));
if (!strcmp(con->name, name)) if (!strcmp(con->name, name))
{ {
simple_command(&con->mysql,COM_QUIT,NullS,0,1); simple_command(&con->mysql,COM_QUIT,0,0,1);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
} }

View File

@ -805,10 +805,8 @@ copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs,
const uchar *from_end= (const uchar*) from+from_length; const uchar *from_end= (const uchar*) from+from_length;
char *to_start= to; char *to_start= to;
uchar *to_end= (uchar*) to+to_length; uchar *to_end= (uchar*) to+to_length;
int (*mb_wc)(struct charset_info_st *, my_wc_t *, const uchar *, my_charset_conv_mb_wc mb_wc= from_cs->cset->mb_wc;
const uchar *) = from_cs->cset->mb_wc; my_charset_conv_wc_mb wc_mb= to_cs->cset->wc_mb;
int (*wc_mb)(struct charset_info_st *, my_wc_t, uchar *s, uchar *e)=
to_cs->cset->wc_mb;
uint error_count= 0; uint error_count= 0;
while (1) while (1)

View File

@ -743,7 +743,7 @@ AC_CHECK_HEADERS(fcntl.h float.h floatingpoint.h ieeefp.h limits.h \
unistd.h utime.h sys/utime.h termio.h termios.h sched.h crypt.h alloca.h \ unistd.h utime.h sys/utime.h termio.h termios.h sched.h crypt.h alloca.h \
sys/ioctl.h malloc.h sys/malloc.h sys/ipc.h sys/shm.h linux/config.h \ sys/ioctl.h malloc.h sys/malloc.h sys/ipc.h sys/shm.h linux/config.h \
sys/prctl.h \ sys/prctl.h \
sys/resource.h sys/param.h port.h) sys/resource.h sys/param.h port.h ieeefp.h)
AC_CHECK_HEADERS([xfs/xfs.h]) AC_CHECK_HEADERS([xfs/xfs.h])
@ -757,6 +757,7 @@ AC_CHECK_LIB(m, floor, [], AC_CHECK_LIB(m, __infinity))
AC_CHECK_LIB(nsl_r, gethostbyname_r, [], AC_CHECK_LIB(nsl_r, gethostbyname_r, [],
AC_CHECK_LIB(nsl, gethostbyname_r)) AC_CHECK_LIB(nsl, gethostbyname_r))
AC_CHECK_FUNC(gethostbyname_r) AC_CHECK_FUNC(gethostbyname_r)
AC_CHECK_LIB(mtmalloc, malloc)
AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt)) AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt))
AC_CHECK_FUNC(yp_get_default_domain, , AC_CHECK_FUNC(yp_get_default_domain, ,

View File

@ -309,9 +309,9 @@ static int insert_pointer_name(reg1 POINTER_ARRAY *pa,char * name)
old_count*sizeof(*pa->flag)); old_count*sizeof(*pa->flag));
} }
pa->flag[pa->typelib.count]=0; /* Reset flag */ pa->flag[pa->typelib.count]=0; /* Reset flag */
pa->typelib.type_names[pa->typelib.count++]= pa->str+pa->length; pa->typelib.type_names[pa->typelib.count++]= (char*) (pa->str+pa->length);
pa->typelib.type_names[pa->typelib.count]= NullS; /* Put end-mark */ pa->typelib.type_names[pa->typelib.count]= NullS; /* Put end-mark */
VOID(strmov(pa->str+pa->length,name)); VOID(strmov((char*) pa->str + pa->length, name));
pa->length+=length; pa->length+=length;
DBUG_RETURN(0); DBUG_RETURN(0);
} /* insert_pointer_name */ } /* insert_pointer_name */
@ -988,7 +988,8 @@ int n;
return 0; return 0;
/* Read in new stuff. */ /* Read in new stuff. */
if ((i=(int) my_read(fd, buffer + bufbytes, (uint) bufread,MYF(MY_WME))) < 0) if ((i=(int) my_read(fd, (uchar*) buffer + bufbytes,
(size_t) bufread, MYF(MY_WME))) < 0)
return -1; return -1;
/* Kludge to pretend every nonempty file ends with a newline. */ /* Kludge to pretend every nonempty file ends with a newline. */
@ -1039,7 +1040,7 @@ FILE *in,*out;
return 1; return 1;
if (!my_eof) if (!my_eof)
out_buff[length++]=save_char; /* Don't write added newline */ out_buff[length++]=save_char; /* Don't write added newline */
if (my_fwrite(out,out_buff,length,MYF(MY_WME | MY_NABP))) if (my_fwrite(out, (uchar*) out_buff, length, MYF(MY_WME | MY_NABP)))
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }

View File

@ -170,6 +170,14 @@ extern MY_COLLATION_HANDLER my_collation_8bit_bin_handler;
extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler; extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler;
extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler; extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler;
/* Some typedef to make it easy for C++ to make function pointers */
typedef int (*my_charset_conv_mb_wc)(struct charset_info_st *, my_wc_t *,
const uchar *, const uchar *);
typedef int (*my_charset_conv_wc_mb)(struct charset_info_st *, my_wc_t,
uchar *, uchar *);
typedef size_t (*my_charset_conv_case)(struct charset_info_st *,
char *, size_t, char *, size_t);
/* See strings/CHARSET_INFO.txt about information on this structure */ /* See strings/CHARSET_INFO.txt about information on this structure */
typedef struct my_charset_handler_st typedef struct my_charset_handler_st
@ -188,10 +196,8 @@ typedef struct my_charset_handler_st
size_t (*numcells)(struct charset_info_st *, const char *b, const char *e); size_t (*numcells)(struct charset_info_st *, const char *b, const char *e);
/* Unicode conversion */ /* Unicode conversion */
int (*mb_wc)(struct charset_info_st *cs,my_wc_t *wc, my_charset_conv_mb_wc mb_wc;
const uchar *s,const uchar *e); my_charset_conv_wc_mb wc_mb;
int (*wc_mb)(struct charset_info_st *cs,my_wc_t wc,
uchar *s,uchar *e);
/* CTYPE scanner */ /* CTYPE scanner */
int (*ctype)(struct charset_info_st *cs, int *ctype, int (*ctype)(struct charset_info_st *cs, int *ctype,
@ -200,10 +206,9 @@ typedef struct my_charset_handler_st
/* Functions for case and sort conversion */ /* Functions for case and sort conversion */
size_t (*caseup_str)(struct charset_info_st *, char *); size_t (*caseup_str)(struct charset_info_st *, char *);
size_t (*casedn_str)(struct charset_info_st *, char *); size_t (*casedn_str)(struct charset_info_st *, char *);
size_t (*caseup)(struct charset_info_st *, char *src, size_t srclen,
char *dst, size_t dstlen); my_charset_conv_case caseup;
size_t (*casedn)(struct charset_info_st *, char *src, size_t srclen, my_charset_conv_case casedn;
char *dst, size_t dstlen);
/* Charset dependant snprintf() */ /* Charset dependant snprintf() */
size_t (*snprintf)(struct charset_info_st *, char *to, size_t n, size_t (*snprintf)(struct charset_info_st *, char *to, size_t n,

View File

@ -225,6 +225,7 @@ extern CHARSET_INFO compiled_charsets[];
/* statistics */ /* statistics */
extern ulong my_file_opened,my_stream_opened, my_tmp_file_created; extern ulong my_file_opened,my_stream_opened, my_tmp_file_created;
extern ulong my_file_total_opened;
extern uint mysys_usage_id; extern uint mysys_usage_id;
extern my_bool my_init_done; extern my_bool my_init_done;

View File

@ -455,7 +455,7 @@ typedef struct st_sort_info
enum data_file_type new_data_file_type; enum data_file_type new_data_file_type;
MI_INFO *info; MI_INFO *info;
MI_CHECK *param; MI_CHECK *param;
char *buff; uchar *buff;
SORT_KEY_BLOCKS *key_block,*key_block_end; SORT_KEY_BLOCKS *key_block,*key_block_end;
SORT_FT_BUF *ft_buf; SORT_FT_BUF *ft_buf;
/* sync things */ /* sync things */

View File

@ -341,7 +341,7 @@ my_bool STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
DBUG_RETURN(1); DBUG_RETURN(1);
master->reconnect= 1; master->reconnect= 1;
mysql->last_used_con = master; mysql->last_used_con = master;
DBUG_RETURN(simple_command(master, COM_QUERY, q, length, 1)); DBUG_RETURN(simple_command(master, COM_QUERY, (const uchar*) q, length, 1));
} }
@ -375,7 +375,8 @@ my_bool STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
0,0,0,0)) 0,0,0,0))
DBUG_RETURN(1); DBUG_RETURN(1);
slave_to_use->reconnect= 1; slave_to_use->reconnect= 1;
DBUG_RETURN(simple_command(slave_to_use, COM_QUERY, q, length, 1)); DBUG_RETURN(simple_command(slave_to_use, COM_QUERY, (const uchar*) q,
length, 1));
} }
@ -669,7 +670,8 @@ int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd)
password in old format. The reply contains scramble_323. password in old format. The reply contains scramble_323.
*/ */
scramble_323(buff, mysql->scramble, passwd); scramble_323(buff, mysql->scramble, passwd);
if (my_net_write(net, buff, SCRAMBLE_LENGTH_323 + 1) || net_flush(net)) if (my_net_write(net, (uchar*) buff, SCRAMBLE_LENGTH_323 + 1) ||
net_flush(net))
{ {
net->last_errno= CR_SERVER_LOST; net->last_errno= CR_SERVER_LOST;
strmov(net->sqlstate, unknown_sqlstate); strmov(net->sqlstate, unknown_sqlstate);
@ -720,7 +722,7 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
end= strmov(end, db ? db : "") + 1; end= strmov(end, db ? db : "") + 1;
/* Write authentication package */ /* Write authentication package */
simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (end-buff),1); simple_command(mysql,COM_CHANGE_USER, (uchar*) buff, (ulong) (end-buff), 1);
rc= (*mysql->methods->read_change_user_result)(mysql, buff, passwd); rc= (*mysql->methods->read_change_user_result)(mysql, buff, passwd);
@ -830,7 +832,7 @@ my_bool handle_local_infile(MYSQL *mysql, const char *net_filename)
if ((*options->local_infile_init)(&li_ptr, net_filename, if ((*options->local_infile_init)(&li_ptr, net_filename,
options->local_infile_userdata)) options->local_infile_userdata))
{ {
VOID(my_net_write(net,"",0)); /* Server needs one packet */ VOID(my_net_write(net,(const uchar*) "",0)); /* Server needs one packet */
net_flush(net); net_flush(net);
strmov(net->sqlstate, unknown_sqlstate); strmov(net->sqlstate, unknown_sqlstate);
net->last_errno= (*options->local_infile_error)(li_ptr, net->last_errno= (*options->local_infile_error)(li_ptr,
@ -844,7 +846,7 @@ my_bool handle_local_infile(MYSQL *mysql, const char *net_filename)
(*options->local_infile_read)(li_ptr, buf, (*options->local_infile_read)(li_ptr, buf,
packet_length)) > 0) packet_length)) > 0)
{ {
if (my_net_write(net,buf,readcount)) if (my_net_write(net, (uchar*) buf, readcount))
{ {
DBUG_PRINT("error", DBUG_PRINT("error",
("Lost connection to MySQL server during LOAD DATA of local file")); ("Lost connection to MySQL server during LOAD DATA of local file"));
@ -856,7 +858,7 @@ my_bool handle_local_infile(MYSQL *mysql, const char *net_filename)
} }
/* Send empty packet to mark end of file */ /* Send empty packet to mark end of file */
if (my_net_write(net,"",0) || net_flush(net)) if (my_net_write(net, (const uchar*) "", 0) || net_flush(net))
{ {
strmov(net->sqlstate, unknown_sqlstate); strmov(net->sqlstate, unknown_sqlstate);
net->last_errno=CR_SERVER_LOST; net->last_errno=CR_SERVER_LOST;
@ -1242,7 +1244,8 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
end=strmake(strmake(buff, table,128)+1,wild ? wild : "",128); end=strmake(strmake(buff, table,128)+1,wild ? wild : "",128);
free_old_query(mysql); free_old_query(mysql);
if (simple_command(mysql,COM_FIELD_LIST,buff,(ulong) (end-buff),1) || if (simple_command(mysql, COM_FIELD_LIST, (uchar*) buff,
(ulong) (end-buff), 1) ||
!(fields= (*mysql->methods->list_fields)(mysql))) !(fields= (*mysql->methods->list_fields)(mysql)))
DBUG_RETURN(NULL); DBUG_RETURN(NULL);
@ -1313,7 +1316,7 @@ mysql_shutdown(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level)
uchar level[1]; uchar level[1];
DBUG_ENTER("mysql_shutdown"); DBUG_ENTER("mysql_shutdown");
level[0]= (uchar) shutdown_level; level[0]= (uchar) shutdown_level;
DBUG_RETURN(simple_command(mysql, COM_SHUTDOWN, (char *)level, 1, 0)); DBUG_RETURN(simple_command(mysql, COM_SHUTDOWN, level, 1, 0));
} }
@ -1323,14 +1326,14 @@ mysql_refresh(MYSQL *mysql,uint options)
uchar bits[1]; uchar bits[1];
DBUG_ENTER("mysql_refresh"); DBUG_ENTER("mysql_refresh");
bits[0]= (uchar) options; bits[0]= (uchar) options;
DBUG_RETURN(simple_command(mysql,COM_REFRESH,(char*) bits,1,0)); DBUG_RETURN(simple_command(mysql, COM_REFRESH, bits, 1, 0));
} }
int STDCALL int STDCALL
mysql_kill(MYSQL *mysql,ulong pid) mysql_kill(MYSQL *mysql,ulong pid)
{ {
char buff[4]; uchar buff[4];
DBUG_ENTER("mysql_kill"); DBUG_ENTER("mysql_kill");
int4store(buff,pid); int4store(buff,pid);
DBUG_RETURN(simple_command(mysql,COM_PROCESS_KILL,buff,sizeof(buff),0)); DBUG_RETURN(simple_command(mysql,COM_PROCESS_KILL,buff,sizeof(buff),0));
@ -1340,7 +1343,7 @@ mysql_kill(MYSQL *mysql,ulong pid)
int STDCALL int STDCALL
mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option) mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)
{ {
char buff[2]; uchar buff[2];
DBUG_ENTER("mysql_set_server_option"); DBUG_ENTER("mysql_set_server_option");
int2store(buff, (uint) option); int2store(buff, (uint) option);
DBUG_RETURN(simple_command(mysql, COM_SET_OPTION, buff, sizeof(buff), 0)); DBUG_RETURN(simple_command(mysql, COM_SET_OPTION, buff, sizeof(buff), 0));
@ -2059,7 +2062,7 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length)
if ((int) stmt->state > (int) MYSQL_STMT_INIT_DONE) if ((int) stmt->state > (int) MYSQL_STMT_INIT_DONE)
{ {
/* This is second prepare with another statement */ /* This is second prepare with another statement */
char buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */ uchar buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */
if (reset_stmt_handle(stmt, RESET_LONG_DATA | RESET_STORE_RESULT)) if (reset_stmt_handle(stmt, RESET_LONG_DATA | RESET_STORE_RESULT))
DBUG_RETURN(1); DBUG_RETURN(1);
@ -2089,7 +2092,7 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length)
} }
} }
if (stmt_command(mysql, COM_STMT_PREPARE, query, length, stmt)) if (stmt_command(mysql, COM_STMT_PREPARE, (const uchar*) query, length, stmt))
{ {
set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno, set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno,
mysql->net.sqlstate); mysql->net.sqlstate);
@ -2425,9 +2428,9 @@ static void store_param_str(NET *net, MYSQL_BIND *param)
{ {
/* param->length is always set in mysql_stmt_bind_param */ /* param->length is always set in mysql_stmt_bind_param */
ulong length= *param->length; ulong length= *param->length;
char *to= (char *) net_store_length((char *) net->write_pos, length); uchar *to= net_store_length(net->write_pos, length);
memcpy(to, param->buffer, length); memcpy(to, param->buffer, length);
net->write_pos= (uchar*) to+length; net->write_pos= to+length;
} }
@ -2495,10 +2498,9 @@ static my_bool execute(MYSQL_STMT *stmt, char *packet, ulong length)
{ {
MYSQL *mysql= stmt->mysql; MYSQL *mysql= stmt->mysql;
NET *net= &mysql->net; NET *net= &mysql->net;
char buff[4 /* size of stmt id */ + uchar buff[4 /* size of stmt id */ +
5 /* execution flags */]; 5 /* execution flags */];
my_bool res; my_bool res;
DBUG_ENTER("execute"); DBUG_ENTER("execute");
DBUG_DUMP("packet", packet, length); DBUG_DUMP("packet", packet, length);
@ -2508,7 +2510,7 @@ static my_bool execute(MYSQL_STMT *stmt, char *packet, ulong length)
int4store(buff+5, 1); /* iteration count */ int4store(buff+5, 1); /* iteration count */
res= test(cli_advanced_command(mysql, COM_STMT_EXECUTE, buff, sizeof(buff), res= test(cli_advanced_command(mysql, COM_STMT_EXECUTE, buff, sizeof(buff),
packet, length, 1, NULL) || (uchar*) packet, length, 1, NULL) ||
(*mysql->methods->read_query_result)(mysql)); (*mysql->methods->read_query_result)(mysql));
stmt->affected_rows= mysql->affected_rows; stmt->affected_rows= mysql->affected_rows;
stmt->server_status= mysql->server_status; stmt->server_status= mysql->server_status;
@ -2587,7 +2589,7 @@ int cli_stmt_execute(MYSQL_STMT *stmt)
} }
length= (ulong) (net->write_pos - net->buff); length= (ulong) (net->write_pos - net->buff);
/* TODO: Look into avoding the following memdup */ /* TODO: Look into avoding the following memdup */
if (!(param_data= my_memdup((const char*) net->buff, length, MYF(0)))) if (!(param_data= my_memdup(net->buff, length, MYF(0))))
{ {
set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate); set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate);
DBUG_RETURN(1); DBUG_RETURN(1);
@ -2714,8 +2716,8 @@ stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row)
MYSQL *mysql= stmt->mysql; MYSQL *mysql= stmt->mysql;
NET *net= &mysql->net; NET *net= &mysql->net;
MYSQL_DATA *result= &stmt->result; MYSQL_DATA *result= &stmt->result;
char buff[4 /* statement id */ + uchar buff[4 /* statement id */ +
4 /* number of rows to fetch */]; 4 /* number of rows to fetch */];
free_root(&result->alloc, MYF(MY_KEEP_PREALLOC)); free_root(&result->alloc, MYF(MY_KEEP_PREALLOC));
result->data= NULL; result->data= NULL;
@ -2724,7 +2726,7 @@ stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row)
int4store(buff, stmt->stmt_id); int4store(buff, stmt->stmt_id);
int4store(buff + 4, stmt->prefetch_rows); /* number of rows to fetch */ int4store(buff + 4, stmt->prefetch_rows); /* number of rows to fetch */
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_FETCH, if ((*mysql->methods->advanced_command)(mysql, COM_STMT_FETCH,
buff, sizeof(buff), NullS, 0, buff, sizeof(buff), (uchar*) 0, 0,
1, NULL)) 1, NULL))
{ {
set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
@ -3380,7 +3382,7 @@ mysql_stmt_send_long_data(MYSQL_STMT *stmt, uint param_number,
{ {
MYSQL *mysql= stmt->mysql; MYSQL *mysql= stmt->mysql;
/* Packet header: stmt id (4 bytes), param no (2 bytes) */ /* Packet header: stmt id (4 bytes), param no (2 bytes) */
char buff[MYSQL_LONG_DATA_HEADER]; uchar buff[MYSQL_LONG_DATA_HEADER];
int4store(buff, stmt->stmt_id); int4store(buff, stmt->stmt_id);
int2store(buff + 4, param_number); int2store(buff + 4, param_number);
@ -3391,7 +3393,7 @@ mysql_stmt_send_long_data(MYSQL_STMT *stmt, uint param_number,
This is intentional to save bandwidth. This is intentional to save bandwidth.
*/ */
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_SEND_LONG_DATA, if ((*mysql->methods->advanced_command)(mysql, COM_STMT_SEND_LONG_DATA,
buff, sizeof(buff), data, buff, sizeof(buff), (uchar*) data,
length, 1, NULL)) length, 1, NULL))
{ {
set_stmt_errmsg(stmt, mysql->net.last_error, set_stmt_errmsg(stmt, mysql->net.last_error,
@ -3719,19 +3721,20 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field,
} }
default: default:
{ {
char buff[22]; /* Enough for longlong */ uchar buff[22]; /* Enough for longlong */
char *end= longlong10_to_str(value, buff, is_unsigned ? 10: -10); uchar *end= (uchar*) longlong10_to_str(value, (char*) buff,
is_unsigned ? 10: -10);
/* Resort to string conversion which supports all typecodes */ /* Resort to string conversion which supports all typecodes */
uint length= (uint) (end-buff); uint length= (uint) (end-buff);
if (field->flags & ZEROFILL_FLAG && length < field->length && if (field->flags & ZEROFILL_FLAG && length < field->length &&
field->length < 21) field->length < 21)
{ {
bmove_upp((char*) buff+field->length,buff+length, length); bmove_upp(buff+field->length,buff+length, length);
bfill((char*) buff, field->length - length,'0'); bfill(buff, field->length - length,'0');
length= field->length; length= field->length;
} }
fetch_string_with_conversion(param, buff, length); fetch_string_with_conversion(param, (char*) buff, length);
break; break;
} }
} }
@ -4785,14 +4788,14 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
Server side cursor exist, tell server to start sending the rows Server side cursor exist, tell server to start sending the rows
*/ */
NET *net= &mysql->net; NET *net= &mysql->net;
char buff[4 /* statement id */ + uchar buff[4 /* statement id */ +
4 /* number of rows to fetch */]; 4 /* number of rows to fetch */];
/* Send row request to the server */ /* Send row request to the server */
int4store(buff, stmt->stmt_id); int4store(buff, stmt->stmt_id);
int4store(buff + 4, (int)~0); /* number of rows to fetch */ int4store(buff + 4, (int)~0); /* number of rows to fetch */
if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff), if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff),
NullS, 0, 1, NULL)) (uchar*) 0, 0, 1, NULL))
{ {
set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
DBUG_RETURN(1); DBUG_RETURN(1);
@ -4976,7 +4979,7 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags)
Reset the server side statement and close the server side Reset the server side statement and close the server side
cursor if it exists. cursor if it exists.
*/ */
char buff[MYSQL_STMT_HEADER]; /* packet header: 4 bytes for stmt id */ uchar buff[MYSQL_STMT_HEADER]; /* packet header: 4 bytes for stmt id */
int4store(buff, stmt->stmt_id); int4store(buff, stmt->stmt_id);
if ((*mysql->methods->advanced_command)(mysql, COM_STMT_RESET, buff, if ((*mysql->methods->advanced_command)(mysql, COM_STMT_RESET, buff,
sizeof(buff), 0, 0, 0, NULL)) sizeof(buff), 0, 0, 0, NULL))
@ -5037,7 +5040,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
net_clear_error(&mysql->net); net_clear_error(&mysql->net);
if ((int) stmt->state > (int) MYSQL_STMT_INIT_DONE) if ((int) stmt->state > (int) MYSQL_STMT_INIT_DONE)
{ {
char buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */ uchar buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */
if (mysql->unbuffered_fetch_owner == &stmt->unbuffered_fetch_cancelled) if (mysql->unbuffered_fetch_owner == &stmt->unbuffered_fetch_cancelled)
mysql->unbuffered_fetch_owner= 0; mysql->unbuffered_fetch_owner= 0;

View File

@ -158,7 +158,7 @@ MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
} }
sprintf(msg_buf,"%-.16s %-.16s\n",user,passwd); sprintf(msg_buf,"%-.16s %-.16s\n",user,passwd);
msg_len=strlen(msg_buf); msg_len=strlen(msg_buf);
if (my_net_write(&con->net,msg_buf,msg_len) || net_flush(&con->net)) if (my_net_write(&con->net,(uchar*) msg_buf,msg_len) || net_flush(&con->net))
{ {
con->last_errno=con->net.last_errno; con->last_errno=con->net.last_errno;
strmov(con->last_error,"Write error on socket"); strmov(con->last_error,"Write error on socket");
@ -218,7 +218,7 @@ int STDCALL mysql_manager_command(MYSQL_MANAGER* con,const char* cmd,
{ {
if (!cmd_len) if (!cmd_len)
cmd_len=strlen(cmd); cmd_len=strlen(cmd);
if (my_net_write(&con->net,(char*)cmd,cmd_len) || net_flush(&con->net)) if (my_net_write(&con->net,(const uchar*)cmd,cmd_len) || net_flush(&con->net))
{ {
con->last_errno=errno; con->last_errno=errno;
strmov(con->last_error,"Write error on socket"); strmov(con->last_error,"Write error on socket");

View File

@ -567,7 +567,7 @@ void init_embedded_mysql(MYSQL *mysql, int client_flag)
void *create_embedded_thd(int client_flag) void *create_embedded_thd(int client_flag)
{ {
THD * thd= new THD; THD * thd= new THD;
thd->thread_id= thread_id++; thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
thd->thread_stack= (char*) &thd; thd->thread_stack= (char*) &thd;
if (thd->store_globals()) if (thd->store_globals())

View File

@ -4142,7 +4142,7 @@ sub stop_all_servers () {
my $pid; my $pid;
# Start shutdown of all started masters # Start shutdown of all started masters
foreach my $mysqld (@{$master}, @{$slave}) foreach my $mysqld (@{$slave}, @{$master})
{ {
if ( $mysqld->{'pid'} ) if ( $mysqld->{'pid'} )
{ {

View File

@ -41,8 +41,8 @@ BEGIN
INSERT INTO t4 VALUES (ins1, ins2, ind); INSERT INTO t4 VALUES (ins1, ins2, ind);
END END
master-bin.000001 783 Query 1 999 use `test`; INSERT INTO t4 VALUES ( NAME_CONST('ins1',_latin1 0x466F6F2773206120426172), NAME_CONST('ins2',_cp932 0xED40ED41ED42), NAME_CONST('ind',47.93)) master-bin.000001 783 Query 1 999 use `test`; INSERT INTO t4 VALUES ( NAME_CONST('ins1',_latin1 0x466F6F2773206120426172), NAME_CONST('ins2',_cp932 0xED40ED41ED42), NAME_CONST('ind',47.93))
master-bin.000001 999 Query 1 1085 use `test`; DROP PROCEDURE bug18293 master-bin.000001 999 Query 1 1088 use `test`; DROP PROCEDURE bug18293
master-bin.000001 1085 Query 1 1161 use `test`; DROP TABLE t4 master-bin.000001 1088 Query 1 1167 use `test`; DROP TABLE t4
End of 5.0 tests End of 5.0 tests
SHOW BINLOG EVENTS FROM 364; SHOW BINLOG EVENTS FROM 364;
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Wrong offset or I/O error ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Wrong offset or I/O error

View File

@ -1,3 +1,4 @@
DROP TABLE IF EXISTS t1;
select format(1.5555,0),format(123.5555,1),format(1234.5555,2),format(12345.55555,3),format(123456.5555,4),format(1234567.5555,5),format("12345.2399",2); select format(1.5555,0),format(123.5555,1),format(1234.5555,2),format(12345.55555,3),format(123456.5555,4),format(1234567.5555,5),format("12345.2399",2);
format(1.5555,0) format(123.5555,1) format(1234.5555,2) format(12345.55555,3) format(123456.5555,4) format(1234567.5555,5) format("12345.2399",2) format(1.5555,0) format(123.5555,1) format(1234.5555,2) format(12345.55555,3) format(123456.5555,4) format(1234567.5555,5) format("12345.2399",2)
2 123.6 1,234.56 12,345.556 123,456.5555 1,234,567.55550 12,345.24 2 123.6 1,234.56 12,345.556 123,456.5555 1,234,567.55550 12,345.24
@ -56,7 +57,6 @@ select a from t1 where mid(a+0,6,3) = ( mid(20040106123400,6,3) );
a a
2004-01-06 12:34:00 2004-01-06 12:34:00
drop table t1; drop table t1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (conn CHAR(7), connection_id INT); CREATE TABLE t1 (conn CHAR(7), connection_id INT);
INSERT INTO t1 VALUES ('default', CONNECTION_ID()); INSERT INTO t1 VALUES ('default', CONNECTION_ID());
SELECT GET_LOCK('bug16501',600); SELECT GET_LOCK('bug16501',600);

View File

@ -1463,4 +1463,26 @@ where a.table_name='t1' and a.table_schema='test' and b.table_name=a.table_name;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ALL NULL TABLE_SCHEMA,TABLE_NAME NULL NULL NULL Using where; Skip_open_table; Scanned 0 databases 1 SIMPLE a ALL NULL TABLE_SCHEMA,TABLE_NAME NULL NULL NULL Using where; Skip_open_table; Scanned 0 databases
1 SIMPLE b ALL NULL NULL NULL NULL NULL Using where; Open_frm_only; Scanned all databases; Using join buffer 1 SIMPLE b ALL NULL NULL NULL NULL NULL Using where; Open_frm_only; Scanned all databases; Using join buffer
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'mysqltest';
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = '';
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'test';
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH
NULL test latin1 latin1_swedish_ci NULL
select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysql' AND TABLE_NAME='nonexisting';
count(*)
0
select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysql' AND TABLE_NAME='';
count(*)
0
select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='' AND TABLE_NAME='';
count(*)
0
select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='' AND TABLE_NAME='nonexisting';
count(*)
0
End of 5.1 tests. End of 5.1 tests.

View File

@ -31,9 +31,6 @@ inserts updates deletes
2 1 1 2 1 1
flush logs; flush logs;
purge master logs before now(); purge master logs before now();
select count(*) from mysql.ndb_binlog_index;
count(*)
0
create table t1 (a int primary key, b int) engine=ndb; create table t1 (a int primary key, b int) engine=ndb;
create database mysqltest; create database mysqltest;
use mysqltest; use mysqltest;

View File

@ -1,3 +1,6 @@
select count(*) from information_schema.columns;
count(*)
#
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
CREATE LOGFILE GROUP lg1 CREATE LOGFILE GROUP lg1
ADD UNDOFILE 'undofile.dat' ADD UNDOFILE 'undofile.dat'

View File

@ -46,10 +46,18 @@ select inserts,updates,deletes from
# #
# check that purge clears the ndb_binlog_index # check that purge clears the ndb_binlog_index
# #
# TODO: make this deterministic
# This test is disabled until we can make this determistic under load.
# The problem is that in some cases, the binlog writing thread gets
# scheduled after the purge, writes pending things, then the select
# gets scheduled
#
flush logs; flush logs;
--sleep 1 --sleep 1
purge master logs before now(); purge master logs before now();
--disable_parsing
select count(*) from mysql.ndb_binlog_index; select count(*) from mysql.ndb_binlog_index;
--enable_parsing
# #
# several tables in different databases # several tables in different databases

View File

@ -14,6 +14,12 @@
-- source include/have_ndb.inc -- source include/have_ndb.inc
#
# Bug#30322 Server crashes on selecting from i_s.columns when cluster is running -regression
#
--replace_column 1 #
select count(*) from information_schema.columns;
--disable_warnings --disable_warnings
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
--enable_warnings --enable_warnings

View File

@ -2,6 +2,10 @@
# Testing of misc functions # Testing of misc functions
# #
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
select format(1.5555,0),format(123.5555,1),format(1234.5555,2),format(12345.55555,3),format(123456.5555,4),format(1234567.5555,5),format("12345.2399",2); select format(1.5555,0),format(123.5555,1),format(1234.5555,2),format(12345.55555,3),format(123456.5555,4),format(1234567.5555,5),format("12345.2399",2);
select inet_ntoa(inet_aton("255.255.255.255.255.255.255.255")); select inet_ntoa(inet_aton("255.255.255.255.255.255.255.255"));
@ -48,9 +52,6 @@ drop table t1;
# #
# Bug#16501: IS_USED_LOCK does not appear to work # Bug#16501: IS_USED_LOCK does not appear to work
# #
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 (conn CHAR(7), connection_id INT); CREATE TABLE t1 (conn CHAR(7), connection_id INT);
INSERT INTO t1 VALUES ('default', CONNECTION_ID()); INSERT INTO t1 VALUES ('default', CONNECTION_ID());

View File

@ -1120,4 +1120,20 @@ explain select b.table_name
from information_schema.tables a, information_schema.columns b from information_schema.tables a, information_schema.columns b
where a.table_name='t1' and a.table_schema='test' and b.table_name=a.table_name; where a.table_name='t1' and a.table_schema='test' and b.table_name=a.table_name;
#
# Bug#30310 wrong result on SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE ..
#
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'mysqltest';
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = '';
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'test';
select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysql' AND TABLE_NAME='nonexisting';
select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysql' AND TABLE_NAME='';
select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='' AND TABLE_NAME='';
select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='' AND TABLE_NAME='nonexisting';
--echo End of 5.1 tests. --echo End of 5.1 tests.

View File

@ -76,6 +76,7 @@ FILE *my_fopen(const char *filename, int flags, myf MyFlags)
my_strdup(filename,MyFlags))) my_strdup(filename,MyFlags)))
{ {
my_stream_opened++; my_stream_opened++;
my_file_total_opened++;
my_file_info[fileno(fd)].type = STREAM_BY_FOPEN; my_file_info[fileno(fd)].type = STREAM_BY_FOPEN;
pthread_mutex_unlock(&THR_LOCK_open); pthread_mutex_unlock(&THR_LOCK_open);
DBUG_PRINT("exit",("stream: 0x%lx", (long) fd)); DBUG_PRINT("exit",("stream: 0x%lx", (long) fd));

View File

@ -19,7 +19,9 @@
#include "mysys_priv.h" #include "mysys_priv.h"
#include <m_string.h> #include <m_string.h>
#if !defined(__FreeBSD__) || defined(__linux__) #ifndef MAIN
#if defined(__FreeBSD__) || defined(__linux__)
static my_bool memcpy_and_test(uchar *to, uchar *from, uint len) static my_bool memcpy_and_test(uchar *to, uchar *from, uint len)
{ {
uint i, res=1; uint i, res=1;
@ -29,6 +31,7 @@ static my_bool memcpy_and_test(uchar *to, uchar *from, uint len)
res=0; res=0;
return res; return res;
} }
#endif /* FreeBSD || linux */
#ifdef __FreeBSD__ #ifdef __FreeBSD__
@ -98,7 +101,7 @@ err:
return res; return res;
} }
#else #else /* FreeBSD elif linux */
/* just fail */ /* just fail */
my_bool my_gethwaddr(uchar *to __attribute__((unused))) my_bool my_gethwaddr(uchar *to __attribute__((unused)))
{ {

View File

@ -151,6 +151,7 @@ File my_register_filename(File fd, const char *FileName, enum file_type
if ((my_file_info[fd].name = (char*) my_strdup(FileName,MyFlags))) if ((my_file_info[fd].name = (char*) my_strdup(FileName,MyFlags)))
{ {
my_file_opened++; my_file_opened++;
my_file_total_opened++;
my_file_info[fd].type = type_of_file; my_file_info[fd].type = type_of_file;
#if defined(THREAD) && !defined(HAVE_PREAD) #if defined(THREAD) && !defined(HAVE_PREAD)
pthread_mutex_init(&my_file_info[fd].mutex,MY_MUTEX_INIT_FAST); pthread_mutex_init(&my_file_info[fd].mutex,MY_MUTEX_INIT_FAST);

View File

@ -30,6 +30,7 @@ const char *my_progname=0;
char NEAR curr_dir[FN_REFLEN]= {0}, char NEAR curr_dir[FN_REFLEN]= {0},
NEAR home_dir_buff[FN_REFLEN]= {0}; NEAR home_dir_buff[FN_REFLEN]= {0};
ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0; ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0;
ulong my_file_total_opened= 0;
int NEAR my_umask=0664, NEAR my_umask_dir=0777; int NEAR my_umask=0664, NEAR my_umask_dir=0777;
#ifndef THREAD #ifndef THREAD
int NEAR my_errno=0; int NEAR my_errno=0;

View File

@ -38,7 +38,7 @@ uint thr_client_alarm;
static int alarm_aborted=1; /* No alarm thread */ static int alarm_aborted=1; /* No alarm thread */
my_bool thr_alarm_inited= 0; my_bool thr_alarm_inited= 0;
volatile my_bool alarm_thread_running= 0; volatile my_bool alarm_thread_running= 0;
time_t next_alarm_expire_time= ~ (time_t) 0;
static sig_handler process_alarm_part2(int sig); static sig_handler process_alarm_part2(int sig);
#if !defined(__WIN__) #if !defined(__WIN__)
@ -71,6 +71,7 @@ void init_thr_alarm(uint max_alarms)
sigset_t s; sigset_t s;
DBUG_ENTER("init_thr_alarm"); DBUG_ENTER("init_thr_alarm");
alarm_aborted=0; alarm_aborted=0;
next_alarm_expire_time= ~ (time_t) 0;
init_queue(&alarm_queue,max_alarms+1,offsetof(ALARM,expire_time),0, init_queue(&alarm_queue,max_alarms+1,offsetof(ALARM,expire_time),0,
compare_ulong,NullS); compare_ulong,NullS);
sigfillset(&full_signal_set); /* Neaded to block signals */ sigfillset(&full_signal_set); /* Neaded to block signals */
@ -150,22 +151,28 @@ void resize_thr_alarm(uint max_alarms)
my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data) my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data)
{ {
ulong now; time_t now;
#ifndef USE_ONE_SIGNAL_HAND
sigset_t old_mask; sigset_t old_mask;
#endif
my_bool reschedule; my_bool reschedule;
struct st_my_thread_var *current_my_thread_var= my_thread_var; struct st_my_thread_var *current_my_thread_var= my_thread_var;
DBUG_ENTER("thr_alarm"); DBUG_ENTER("thr_alarm");
DBUG_PRINT("enter",("thread: %s sec: %d",my_thread_name(),sec)); DBUG_PRINT("enter",("thread: %s sec: %d",my_thread_name(),sec));
now=(ulong) my_time(0); now= my_time(0);
#ifndef USE_ONE_SIGNAL_HAND
pthread_sigmask(SIG_BLOCK,&full_signal_set,&old_mask); pthread_sigmask(SIG_BLOCK,&full_signal_set,&old_mask);
#endif
pthread_mutex_lock(&LOCK_alarm); /* Lock from threads & alarms */ pthread_mutex_lock(&LOCK_alarm); /* Lock from threads & alarms */
if (alarm_aborted > 0) if (alarm_aborted > 0)
{ /* No signal thread */ { /* No signal thread */
DBUG_PRINT("info", ("alarm aborted")); DBUG_PRINT("info", ("alarm aborted"));
*alrm= 0; /* No alarm */ *alrm= 0; /* No alarm */
pthread_mutex_unlock(&LOCK_alarm); pthread_mutex_unlock(&LOCK_alarm);
#ifndef USE_ONE_SIGNAL_HAND
pthread_sigmask(SIG_SETMASK,&old_mask,NULL); pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
#endif
DBUG_RETURN(1); DBUG_RETURN(1);
} }
if (alarm_aborted < 0) if (alarm_aborted < 0)
@ -179,14 +186,14 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data)
fprintf(stderr,"Warning: thr_alarm queue is full\n"); fprintf(stderr,"Warning: thr_alarm queue is full\n");
*alrm= 0; /* No alarm */ *alrm= 0; /* No alarm */
pthread_mutex_unlock(&LOCK_alarm); pthread_mutex_unlock(&LOCK_alarm);
#ifndef USE_ONE_SIGNAL_HAND
pthread_sigmask(SIG_SETMASK,&old_mask,NULL); pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
#endif
DBUG_RETURN(1); DBUG_RETURN(1);
} }
max_used_alarms=alarm_queue.elements+1; max_used_alarms=alarm_queue.elements+1;
} }
reschedule= (!alarm_queue.elements || reschedule= (ulong) next_alarm_expire_time > (ulong) now + sec;
(int) (((ALARM*) queue_top(&alarm_queue))->expire_time - now) >
(int) sec);
if (!alarm_data) if (!alarm_data)
{ {
if (!(alarm_data=(ALARM*) my_malloc(sizeof(ALARM),MYF(MY_WME)))) if (!(alarm_data=(ALARM*) my_malloc(sizeof(ALARM),MYF(MY_WME))))
@ -194,7 +201,9 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data)
DBUG_PRINT("info", ("failed my_malloc()")); DBUG_PRINT("info", ("failed my_malloc()"));
*alrm= 0; /* No alarm */ *alrm= 0; /* No alarm */
pthread_mutex_unlock(&LOCK_alarm); pthread_mutex_unlock(&LOCK_alarm);
#ifndef USE_ONE_SIGNAL_HAND
pthread_sigmask(SIG_SETMASK,&old_mask,NULL); pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
#endif
DBUG_RETURN(1); DBUG_RETURN(1);
} }
alarm_data->malloced=1; alarm_data->malloced=1;
@ -212,12 +221,17 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data)
{ {
DBUG_PRINT("info", ("reschedule")); DBUG_PRINT("info", ("reschedule"));
if (pthread_equal(pthread_self(),alarm_thread)) if (pthread_equal(pthread_self(),alarm_thread))
{
alarm(sec); /* purecov: inspected */ alarm(sec); /* purecov: inspected */
next_alarm_expire_time= now + sec;
}
else else
reschedule_alarms(); /* Reschedule alarms */ reschedule_alarms(); /* Reschedule alarms */
} }
pthread_mutex_unlock(&LOCK_alarm); pthread_mutex_unlock(&LOCK_alarm);
#ifndef USE_ONE_SIGNAL_HAND
pthread_sigmask(SIG_SETMASK,&old_mask,NULL); pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
#endif
(*alrm)= &alarm_data->alarmed; (*alrm)= &alarm_data->alarmed;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
@ -230,11 +244,15 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data)
void thr_end_alarm(thr_alarm_t *alarmed) void thr_end_alarm(thr_alarm_t *alarmed)
{ {
ALARM *alarm_data; ALARM *alarm_data;
#ifndef USE_ONE_SIGNAL_HAND
sigset_t old_mask; sigset_t old_mask;
#endif
uint i, found=0; uint i, found=0;
DBUG_ENTER("thr_end_alarm"); DBUG_ENTER("thr_end_alarm");
#ifndef USE_ONE_SIGNAL_HAND
pthread_sigmask(SIG_BLOCK,&full_signal_set,&old_mask); pthread_sigmask(SIG_BLOCK,&full_signal_set,&old_mask);
#endif
pthread_mutex_lock(&LOCK_alarm); pthread_mutex_lock(&LOCK_alarm);
alarm_data= (ALARM*) ((uchar*) *alarmed - offsetof(ALARM,alarmed)); alarm_data= (ALARM*) ((uchar*) *alarmed - offsetof(ALARM,alarmed));
@ -261,7 +279,9 @@ void thr_end_alarm(thr_alarm_t *alarmed)
(long) *alarmed)); (long) *alarmed));
} }
pthread_mutex_unlock(&LOCK_alarm); pthread_mutex_unlock(&LOCK_alarm);
#ifndef USE_ONE_SIGNAL_HAND
pthread_sigmask(SIG_SETMASK,&old_mask,NULL); pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
#endif
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
@ -380,10 +400,18 @@ static sig_handler process_alarm_part2(int sig __attribute__((unused)))
alarm(0); /* Remove old alarm */ alarm(0); /* Remove old alarm */
#endif #endif
alarm((uint) (alarm_data->expire_time-now)); alarm((uint) (alarm_data->expire_time-now));
next_alarm_expire_time= alarm_data->expire_time;
} }
#endif #endif
} }
} }
else
{
/*
Ensure that next time we call thr_alarm(), we will schedule a new alarm
*/
next_alarm_expire_time= ~(time_t) 0;
}
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
@ -537,6 +565,7 @@ static void *alarm_handler(void *arg __attribute__((unused)))
{ {
abstime.tv_sec=sleep_time; abstime.tv_sec=sleep_time;
abstime.tv_nsec=0; abstime.tv_nsec=0;
next_alarm_expire_time= sleep_time;
if ((error=pthread_cond_timedwait(&COND_alarm,&LOCK_alarm,&abstime)) && if ((error=pthread_cond_timedwait(&COND_alarm,&LOCK_alarm,&abstime)) &&
error != ETIME && error != ETIMEDOUT) error != ETIME && error != ETIMEDOUT)
{ {
@ -549,12 +578,16 @@ static void *alarm_handler(void *arg __attribute__((unused)))
} }
else if (alarm_aborted == -1) else if (alarm_aborted == -1)
break; break;
else if ((error=pthread_cond_wait(&COND_alarm,&LOCK_alarm))) else
{ {
next_alarm_expire_time= ~ (time_t) 0;
if ((error=pthread_cond_wait(&COND_alarm,&LOCK_alarm)))
{
#ifdef MAIN #ifdef MAIN
printf("Got error: %d from ptread_cond_wait (errno: %d)\n", printf("Got error: %d from ptread_cond_wait (errno: %d)\n",
error,errno); error,errno);
#endif #endif
}
} }
process_alarm(0); process_alarm(0);
} }

View File

@ -29,8 +29,15 @@ fi
# configure # configure
./configure $base_configs $extra_configs ./configure $base_configs $extra_configs
# make # Ensure a clean tree
make clean bin-dist make clean
# Link NetWare specific .def files into their proper locations
# in the source tree
( cd netware && make link_sources )
# Now, do the real build
make bin-dist
# mark the build # mark the build
for file in *.tar.gz *.zip for file in *.tar.gz *.zip

View File

@ -83,7 +83,7 @@ EXTRA_DIST= $(BUILT_SOURCES) comp_err.def install_test_db.ncf \
perror.def \ perror.def \
mysql_client_test.def \ mysql_client_test.def \
replace.def resolve_stack_dump.def resolveip.def \ replace.def resolve_stack_dump.def resolveip.def \
static_init_db.sql \ static_init_db.sql init_db.sql test_db.sql \
BUILD/apply-patch BUILD/compile-AUTOTOOLS \ BUILD/apply-patch BUILD/compile-AUTOTOOLS \
BUILD/compile-linux-tools BUILD/compile-netware-END \ BUILD/compile-linux-tools BUILD/compile-netware-END \
BUILD/compile-netware-START BUILD/compile-netware-all\ BUILD/compile-netware-START BUILD/compile-netware-all\

View File

@ -1479,8 +1479,8 @@ sopno pos;
} }
{ {
int length=(HERE()-pos-1)*sizeof(sop); int length=(HERE()-pos-1)*sizeof(sop);
bmove_upp((char *) &p->strip[pos+1]+length, bmove_upp((uchar *) &p->strip[pos+1]+length,
(char *) &p->strip[pos]+length, (uchar *) &p->strip[pos]+length,
length); length);
} }
#ifdef OLD_CODE #ifdef OLD_CODE

View File

@ -31,6 +31,7 @@ force=0
in_rpm=0 in_rpm=0
ip_only=0 ip_only=0
windows=0 windows=0
source_install=0
usage() usage()
{ {
@ -41,7 +42,7 @@ Usage: $0 [OPTIONS]
--force Causes mysql_install_db to run even if DNS does not --force Causes mysql_install_db to run even if DNS does not
work. In that case, grant table entries that normally work. In that case, grant table entries that normally
use hostnames will use IP addresses. use hostnames will use IP addresses.
--ldata=path The path to the MySQL data directory. --ldata=path The path to the MySQL data directory. Same as --datadir.
--rpm For internal use. This option is used by RPM files --rpm For internal use. This option is used by RPM files
during the MySQL installation process. during the MySQL installation process.
--skip-name-resolve Use IP addresses rather than hostnames when creating --skip-name-resolve Use IP addresses rather than hostnames when creating
@ -120,6 +121,13 @@ parse_arguments()
# package. # package.
windows=1 ;; windows=1 ;;
--source-install)
# This is used when you want to run mysqld directly from the
# source tree (for example when you are developing MySQL and
# only want to create the default tables but don't want to
# install mysqld yet.
source_install=1 ;;
*) *)
if test -n "$pick_args" if test -n "$pick_args"
then then
@ -147,15 +155,22 @@ find_in_basedir()
file=$1; shift file=$1; shift
base="$basedir"
if test -z "$base"
then
# Assume source installation if basedir is not given
base="."
fi
for dir in "$@" for dir in "$@"
do do
if test -f "$basedir/$dir/$file" if test -f "$base/$dir/$file"
then then
if test -n "$return_dir" if test -n "$return_dir"
then then
echo "$basedir/$dir" echo "$base/$dir"
else else
echo "$basedir/$dir/$file" echo "$base/$dir/$file"
fi fi
break break
fi fi
@ -164,11 +179,17 @@ find_in_basedir()
missing_in_basedir() missing_in_basedir()
{ {
echo "FATAL ERROR: Could not find $* inside --basedir" if test -z "$basedir"
echo then
echo "When using --basedir you must point either into a MySQL binary" echo "FATAL ERROR: Could not find $* inside --basedir"
echo "distribution directory or a compiled tree previously populated" echo
echo "by 'make install'" echo "When using --basedir you must point either into a MySQL binary"
echo "distribution directory or a compiled tree previously populated"
echo "by 'make install'"
else
echo "FATAL ERROR: Can't find $*. Please specify your installation"
echo "directory with the '--basedir=' option."
fi
} }
# Ok, let's go. We first need to parse arguments which are required by # Ok, let's go. We first need to parse arguments which are required by
@ -178,15 +199,10 @@ parse_arguments PICK-ARGS-FROM-ARGV "$@"
# We can now find my_print_defaults, either in the supplied --basedir # We can now find my_print_defaults, either in the supplied --basedir
# location or in the installed area. # location or in the installed area.
if test -n "$basedir"
print_defaults=`find_in_basedir my_print_defaults bin extra`
if test -z "$print_defaults"
then then
print_defaults=`find_in_basedir my_print_defaults bin extra`
if ! test -x "$print_defaults"
then
missing_in_basedir my_print_defaults
exit 1
fi
else
print_defaults="@bindir@/my_print_defaults" print_defaults="@bindir@/my_print_defaults"
if ! test -x "$print_defaults" if ! test -x "$print_defaults"
then then
@ -194,7 +210,8 @@ else
echo echo
echo "If you are using a binary release, you must run this script from" echo "If you are using a binary release, you must run this script from"
echo "within the directory the archive extracted into. If you compiled" echo "within the directory the archive extracted into. If you compiled"
echo "MySQL yourself you must run 'make install' first." echo "MySQL yourself you must run 'make install' first or use"
echo "use --source-install --install-dir=xxx from the top source directory"
exit 1 exit 1
fi fi
fi fi
@ -205,10 +222,11 @@ parse_arguments `$print_defaults $defaults mysqld mysql_install_db`
parse_arguments PICK-ARGS-FROM-ARGV "$@" parse_arguments PICK-ARGS-FROM-ARGV "$@"
# Path to MySQL installation directory # Path to MySQL installation directory
if test -z "$basedir" if test -z "$basedir" -a "$source_install" = 0
then then
basedir="@prefix@" basedir="@prefix@"
bindir="@bindir@" bindir="@bindir@"
extra_bindir="$bindir"
mysqld="@libexecdir@/mysqld" mysqld="@libexecdir@/mysqld"
pkgdatadir="@pkgdatadir@" pkgdatadir="@pkgdatadir@"
else else
@ -216,17 +234,33 @@ else
# We set up bootstrap-specific paths later, so skip this for --windows # We set up bootstrap-specific paths later, so skip this for --windows
if test "$windows" -eq 0 if test "$windows" -eq 0
then then
pkgdatadir=`find_in_basedir --dir fill_help_tables.sql share share/mysql`
if test -z "$pkgdatadir"
then
missing_in_basedir fill_help_tables.sql
exit 1
fi
mysqld=`find_in_basedir mysqld libexec sbin bin` mysqld=`find_in_basedir mysqld libexec sbin bin`
if ! test -x "$mysqld" if test -z "$basedir"
then then
missing_in_basedir mysqld # We come here when source-install is given
exit 1 bindir="$basedir/bin"
extra_bindir="$bindir"
fi
if test -x "$mysqld"
then
pkgdatadir=`find_in_basedir --dir fill_help_tables.sql share share/mysql scripts`
if test -z "$pkgdatadir"
then
missing_in_basedir fill_help_tables.sql
exit 1
fi
else
if test -x "./sql/mysqld"
then
# Source installation
mysqld="./sql/mysqld"
bindir="./client"
extra_bindir="./extra"
pkgdatadir="./scripts"
mysqld_opt="--language=./sql/share/english"
else
missing_in_basedir mysqld
fi
fi fi
fi fi
fi fi
@ -272,7 +306,7 @@ fi
# already tested above). # already tested above).
if test ! -x "$mysqld" if test ! -x "$mysqld"
then then
echo "FATAL ERROR: $mysqld not found!" echo "FATAL ERROR: 'mysqld' executable not found!"
exit 1 exit 1
fi fi
@ -282,14 +316,14 @@ hostname=`@HOSTNAME@`
# Check if hostname is valid # Check if hostname is valid
if test "$windows" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0 if test "$windows" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
then then
resolved=`$bindir/resolveip $hostname 2>&1` resolved=`$extra_bindir/resolveip $hostname 2>&1`
if [ $? -ne 0 ] if [ $? -ne 0 ]
then then
resolved=`$bindir/resolveip localhost 2>&1` resolved=`$extra_bindir/resolveip localhost 2>&1`
if [ $? -ne 0 ] if [ $? -ne 0 ]
then then
echo "Neither host '$hostname' nor 'localhost' could be looked up with" echo "Neither host '$hostname' nor 'localhost' could be looked up with"
echo "$bindir/resolveip" echo "$extra_bindir/resolveip"
echo "Please configure the 'hostname' command to return a correct" echo "Please configure the 'hostname' command to return a correct"
echo "hostname." echo "hostname."
echo "If you want to solve this at a later stage, restart this script" echo "If you want to solve this at a later stage, restart this script"
@ -332,7 +366,7 @@ fi
# Peform the install of system tables # Peform the install of system tables
mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}" mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \ mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
--basedir=$basedir --datadir=$ldata --loose-skip-innodb \ --basedir=$basedir --datadir=$ldata --log-warnings=0 --loose-skip-innodb \
--loose-skip-ndbcluster $args --max_allowed_packet=8M \ --loose-skip-ndbcluster $args --max_allowed_packet=8M \
--net_buffer_length=16K" --net_buffer_length=16K"
@ -374,7 +408,7 @@ then
echo "$bindir/mysqladmin -u root -h $hostname password 'new-password'" echo "$bindir/mysqladmin -u root -h $hostname password 'new-password'"
echo "See the manual for more instructions." echo "See the manual for more instructions."
if test "$in_rpm" -eq 0 if test "$in_rpm" -eq 0 -a "$source_install" -eq 0
then then
echo "You can start the MySQL daemon with:" echo "You can start the MySQL daemon with:"
echo "cd @prefix@ ; $bindir/mysqld_safe &" echo "cd @prefix@ ; $bindir/mysqld_safe &"

View File

@ -176,6 +176,8 @@ static bool create_pid_file()
appropriately. appropriately.
*************************************************************************/ *************************************************************************/
extern "C" void reap_child(int);
void reap_child(int __attribute__((unused)) signo) void reap_child(int __attribute__((unused)) signo)
{ {
/* NOTE: As we have only one child, no need to cycle waitpid(). */ /* NOTE: As we have only one child, no need to cycle waitpid(). */
@ -197,6 +199,7 @@ void reap_child(int __attribute__((unused)) signo)
Set termination status and return. Set termination status and return.
*************************************************************************/ *************************************************************************/
extern "C" void terminate(int signo);
void terminate(int signo) void terminate(int signo)
{ {
shutdown_request_signo= signo; shutdown_request_signo= signo;

View File

@ -27,7 +27,9 @@
enum { THREAD_KICK_OFF_SIGNAL= SIGUSR2 }; enum { THREAD_KICK_OFF_SIGNAL= SIGUSR2 };
static void handle_signal(int __attribute__((unused)) sig_no) extern "C" void handle_signal(int);
void handle_signal(int __attribute__((unused)) sig_no)
{ {
} }
#endif #endif

View File

@ -2302,7 +2302,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
db= 0; db= 0;
} }
/* Write authentication package */ /* Write authentication package */
if (my_net_write(net,buff,(ulong) (end-buff)) || net_flush(net)) if (my_net_write(net, (uchar*) buff, (size_t) (end-buff)) || net_flush(net))
{ {
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate, set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
ER(CR_SERVER_LOST_EXTENDED), ER(CR_SERVER_LOST_EXTENDED),
@ -2334,7 +2334,8 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
password in old format. password in old format.
*/ */
scramble_323(buff, mysql->scramble, passwd); scramble_323(buff, mysql->scramble, passwd);
if (my_net_write(net, buff, SCRAMBLE_LENGTH_323 + 1) || net_flush(net)) if (my_net_write(net, (uchar*) buff, SCRAMBLE_LENGTH_323 + 1) ||
net_flush(net))
{ {
set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate, set_mysql_extended_error(mysql, CR_SERVER_LOST, unknown_sqlstate,
ER(CR_SERVER_LOST_EXTENDED), ER(CR_SERVER_LOST_EXTENDED),
@ -2531,7 +2532,8 @@ mysql_select_db(MYSQL *mysql, const char *db)
DBUG_ENTER("mysql_select_db"); DBUG_ENTER("mysql_select_db");
DBUG_PRINT("enter",("db: '%s'",db)); DBUG_PRINT("enter",("db: '%s'",db));
if ((error=simple_command(mysql,COM_INIT_DB,db,(ulong) strlen(db),0))) if ((error=simple_command(mysql,COM_INIT_DB, (const uchar*) db,
(ulong) strlen(db),0)))
DBUG_RETURN(error); DBUG_RETURN(error);
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR)); my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
mysql->db=my_strdup(db,MYF(MY_WME)); mysql->db=my_strdup(db,MYF(MY_WME));
@ -2644,7 +2646,7 @@ void STDCALL mysql_close(MYSQL *mysql)
free_old_query(mysql); free_old_query(mysql);
mysql->status=MYSQL_STATUS_READY; /* Force command */ mysql->status=MYSQL_STATUS_READY; /* Force command */
mysql->reconnect=0; mysql->reconnect=0;
simple_command(mysql,COM_QUIT,NullS,0,1); simple_command(mysql,COM_QUIT,(uchar*) 0,0,1);
end_server(mysql); /* Sets mysql->net.vio= 0 */ end_server(mysql); /* Sets mysql->net.vio= 0 */
} }
mysql_close_free_options(mysql); mysql_close_free_options(mysql);
@ -2775,7 +2777,7 @@ mysql_send_query(MYSQL* mysql, const char* query, ulong length)
mysql->last_used_con = mysql; mysql->last_used_con = mysql;
#endif #endif
DBUG_RETURN(simple_command(mysql, COM_QUERY, query, length, 1)); DBUG_RETURN(simple_command(mysql, COM_QUERY, (uchar*) query, length, 1));
} }

View File

@ -301,9 +301,6 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
field_length= 6; /* 6 digits */ field_length= 6; /* 6 digits */
} }
continue; continue;
/* No part seconds */
date[++i]= 0;
} }
while (str != end && while (str != end &&
(my_ispunct(&my_charset_latin1,*str) || (my_ispunct(&my_charset_latin1,*str) ||
@ -569,12 +566,12 @@ my_bool str_to_time(const char *str, uint length, MYSQL_TIME *l_time,
/* Fix the date to assume that seconds was given */ /* Fix the date to assume that seconds was given */
if (!found_hours && !found_days) if (!found_hours && !found_days)
{ {
bmove_upp((char*) (date+4), (char*) (date+state), bmove_upp((uchar*) (date+4), (uchar*) (date+state),
sizeof(long)*(state-1)); sizeof(long)*(state-1));
bzero((char*) date, sizeof(long)*(4-state)); bzero((uchar*) date, sizeof(long)*(4-state));
} }
else else
bzero((char*) (date+state), sizeof(long)*(4-state)); bzero((uchar*) (date+state), sizeof(long)*(4-state));
} }
fractional: fractional:

View File

@ -99,23 +99,23 @@ uchar *net_store_length(uchar *packet, ulonglong length)
if (length < (ulonglong) LL(251)) if (length < (ulonglong) LL(251))
{ {
*packet=(uchar) length; *packet=(uchar) length;
return (char*) packet+1; return packet+1;
} }
/* 251 is reserved for NULL */ /* 251 is reserved for NULL */
if (length < (ulonglong) LL(65536)) if (length < (ulonglong) LL(65536))
{ {
*packet++=252; *packet++=252;
int2store(packet,(uint) length); int2store(packet,(uint) length);
return (char*) packet+2; return packet+2;
} }
if (length < (ulonglong) LL(16777216)) if (length < (ulonglong) LL(16777216))
{ {
*packet++=253; *packet++=253;
int3store(packet,(ulong) length); int3store(packet,(ulong) length);
return (char*) packet+3; return packet+3;
} }
*packet++=254; *packet++=254;
int8store(packet,length); int8store(packet,length);
return (char*) packet+8; return packet+8;
} }

View File

@ -390,8 +390,9 @@ Event_db_repository::index_read_for_db_for_i_s(THD *thd, TABLE *schema_table,
} }
key_copy(key_buf, event_table->record[0], key_info, key_len); key_copy(key_buf, event_table->record[0], key_info, key_len);
if (!(ret= event_table->file->index_read(event_table->record[0], key_buf, if (!(ret= event_table->file->index_read_map(event_table->record[0], key_buf,
(key_part_map)1, HA_READ_PREFIX))) (key_part_map)1,
HA_READ_PREFIX)))
{ {
DBUG_PRINT("info",("Found rows. Let's retrieve them. ret=%d", ret)); DBUG_PRINT("info",("Found rows. Let's retrieve them. ret=%d", ret));
do do
@ -839,8 +840,8 @@ Event_db_repository::find_named_event(LEX_STRING db, LEX_STRING name,
key_copy(key, table->record[0], table->key_info, table->key_info->key_length); key_copy(key, table->record[0], table->key_info, table->key_info->key_length);
if (table->file->index_read_idx(table->record[0], 0, key, HA_WHOLE_KEY, if (table->file->index_read_idx_map(table->record[0], 0, key, HA_WHOLE_KEY,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
{ {
DBUG_PRINT("info", ("Row not found")); DBUG_PRINT("info", ("Row not found"));
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);

View File

@ -52,8 +52,9 @@
execute_at.second_part is not considered during comparison execute_at.second_part is not considered during comparison
*/ */
static int extern "C" int event_queue_element_compare_q(void *, uchar *, uchar *);
event_queue_element_compare_q(void *vptr, uchar* a, uchar *b)
int event_queue_element_compare_q(void *vptr, uchar* a, uchar *b)
{ {
my_time_t lhs = ((Event_queue_element *)a)->execute_at; my_time_t lhs = ((Event_queue_element *)a)->execute_at;
my_time_t rhs = ((Event_queue_element *)b)->execute_at; my_time_t rhs = ((Event_queue_element *)b)->execute_at;

View File

@ -6298,12 +6298,12 @@ uint Field::is_equal(Create_field *new_field)
/* If one of the fields is binary and the other one isn't return 1 else 0 */ /* If one of the fields is binary and the other one isn't return 1 else 0 */
bool Field_str::compare_str_field_flags(Create_field *new_field, uint32 flags) bool Field_str::compare_str_field_flags(Create_field *new_field, uint32 flag_arg)
{ {
return (((new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) && return (((new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
!(flags & (BINCMP_FLAG | BINARY_FLAG))) || !(flag_arg & (BINCMP_FLAG | BINARY_FLAG))) ||
(!(new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) && (!(new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
(flags & (BINCMP_FLAG | BINARY_FLAG)))); (flag_arg & (BINCMP_FLAG | BINARY_FLAG))));
} }

View File

@ -1125,7 +1125,7 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
0 Success 0 Success
*/ */
int ha_partition::prepare_new_partition(TABLE *table, int ha_partition::prepare_new_partition(TABLE *tbl,
HA_CREATE_INFO *create_info, HA_CREATE_INFO *create_info,
handler *file, const char *part_name, handler *file, const char *part_name,
partition_element *p_elem) partition_element *p_elem)
@ -1134,13 +1134,13 @@ int ha_partition::prepare_new_partition(TABLE *table,
bool create_flag= FALSE; bool create_flag= FALSE;
DBUG_ENTER("prepare_new_partition"); DBUG_ENTER("prepare_new_partition");
if ((error= set_up_table_before_create(table, part_name, create_info, if ((error= set_up_table_before_create(tbl, part_name, create_info,
0, p_elem))) 0, p_elem)))
goto error; goto error;
if ((error= file->create(part_name, table, create_info))) if ((error= file->create(part_name, tbl, create_info)))
goto error; goto error;
create_flag= TRUE; create_flag= TRUE;
if ((error= file->ha_open(table, part_name, m_mode, m_open_test_lock))) if ((error= file->ha_open(tbl, part_name, m_mode, m_open_test_lock)))
goto error; goto error;
/* /*
Note: if you plan to add another call that may return failure, Note: if you plan to add another call that may return failure,
@ -1776,7 +1776,7 @@ partition_element *ha_partition::find_partition_element(uint part_id)
4) Data file name on partition 4) Data file name on partition
*/ */
int ha_partition::set_up_table_before_create(TABLE *table, int ha_partition::set_up_table_before_create(TABLE *tbl,
const char *partition_name_with_path, const char *partition_name_with_path,
HA_CREATE_INFO *info, HA_CREATE_INFO *info,
uint part_id, uint part_id,
@ -1793,8 +1793,8 @@ int ha_partition::set_up_table_before_create(TABLE *table,
if (!part_elem) if (!part_elem)
DBUG_RETURN(1); // Fatal error DBUG_RETURN(1); // Fatal error
} }
table->s->max_rows= part_elem->part_max_rows; tbl->s->max_rows= part_elem->part_max_rows;
table->s->min_rows= part_elem->part_min_rows; tbl->s->min_rows= part_elem->part_min_rows;
partition_name= strrchr(partition_name_with_path, FN_LIBCHAR); partition_name= strrchr(partition_name_with_path, FN_LIBCHAR);
if ((part_elem->index_file_name && if ((part_elem->index_file_name &&
(error= append_file_to_dir(thd, (error= append_file_to_dir(thd,
@ -3400,11 +3400,11 @@ int ha_partition::index_end()
used in conjuntion with multi read ranges. used in conjuntion with multi read ranges.
*/ */
int ha_partition::index_read(uchar * buf, const uchar * key, int ha_partition::index_read_map(uchar *buf, const uchar *key,
key_part_map keypart_map, key_part_map keypart_map,
enum ha_rkey_function find_flag) enum ha_rkey_function find_flag)
{ {
DBUG_ENTER("ha_partition::index_read"); DBUG_ENTER("ha_partition::index_read_map");
end_range= 0; end_range= 0;
m_index_scan_type= partition_index_read; m_index_scan_type= partition_index_read;
@ -3566,7 +3566,7 @@ int ha_partition::common_first_last(uchar *buf)
index_read_last() index_read_last()
buf Read row in MySQL Row Format buf Read row in MySQL Row Format
key Key key Key
keylen Length of key keypart_map Which part of key is used
RETURN VALUE RETURN VALUE
>0 Error code >0 Error code
@ -3577,8 +3577,8 @@ int ha_partition::common_first_last(uchar *buf)
Can only be used on indexes supporting HA_READ_ORDER Can only be used on indexes supporting HA_READ_ORDER
*/ */
int ha_partition::index_read_last(uchar *buf, const uchar *key, int ha_partition::index_read_last_map(uchar *buf, const uchar *key,
key_part_map keypart_map) key_part_map keypart_map)
{ {
DBUG_ENTER("ha_partition::index_read_last"); DBUG_ENTER("ha_partition::index_read_last");
@ -3929,9 +3929,9 @@ int ha_partition::handle_unordered_scan_next_partition(uchar * buf)
switch (m_index_scan_type) { switch (m_index_scan_type) {
case partition_index_read: case partition_index_read:
DBUG_PRINT("info", ("index_read on partition %d", i)); DBUG_PRINT("info", ("index_read on partition %d", i));
error= file->index_read(buf, m_start_key.key, error= file->index_read_map(buf, m_start_key.key,
m_start_key.keypart_map, m_start_key.keypart_map,
m_start_key.flag); m_start_key.flag);
break; break;
case partition_index_first: case partition_index_first:
DBUG_PRINT("info", ("index_first on partition %d", i)); DBUG_PRINT("info", ("index_first on partition %d", i));
@ -4020,10 +4020,10 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
switch (m_index_scan_type) { switch (m_index_scan_type) {
case partition_index_read: case partition_index_read:
error= file->index_read(rec_buf_ptr, error= file->index_read_map(rec_buf_ptr,
m_start_key.key, m_start_key.key,
m_start_key.keypart_map, m_start_key.keypart_map,
m_start_key.flag); m_start_key.flag);
break; break;
case partition_index_first: case partition_index_first:
error= file->index_first(rec_buf_ptr); error= file->index_first(rec_buf_ptr);
@ -4034,9 +4034,9 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
reverse_order= TRUE; reverse_order= TRUE;
break; break;
case partition_index_read_last: case partition_index_read_last:
error= file->index_read_last(rec_buf_ptr, error= file->index_read_last_map(rec_buf_ptr,
m_start_key.key, m_start_key.key,
m_start_key.keypart_map); m_start_key.keypart_map);
reverse_order= TRUE; reverse_order= TRUE;
break; break;
default: default:

View File

@ -387,9 +387,9 @@ public:
index_init initializes an index before using it and index_end does index_init initializes an index before using it and index_end does
any end processing needed. any end processing needed.
*/ */
virtual int index_read(uchar * buf, const uchar * key, virtual int index_read_map(uchar * buf, const uchar * key,
key_part_map keypart_map, key_part_map keypart_map,
enum ha_rkey_function find_flag); enum ha_rkey_function find_flag);
virtual int index_init(uint idx, bool sorted); virtual int index_init(uint idx, bool sorted);
virtual int index_end(); virtual int index_end();
@ -402,8 +402,8 @@ public:
virtual int index_first(uchar * buf); virtual int index_first(uchar * buf);
virtual int index_last(uchar * buf); virtual int index_last(uchar * buf);
virtual int index_next_same(uchar * buf, const uchar * key, uint keylen); virtual int index_next_same(uchar * buf, const uchar * key, uint keylen);
virtual int index_read_last(uchar * buf, const uchar * key, virtual int index_read_last_map(uchar * buf, const uchar * key,
key_part_map keypart_map); key_part_map keypart_map);
/* /*
read_first_row is virtual method but is only implemented by read_first_row is virtual method but is only implemented by

View File

@ -25,8 +25,6 @@
#include "mysql_priv.h" #include "mysql_priv.h"
#include "rpl_filter.h" #include "rpl_filter.h"
#include <myisampack.h> #include <myisampack.h>
#include <errno.h> #include <errno.h>
@ -64,7 +62,7 @@ static const LEX_STRING sys_table_aliases[]=
}; };
const char *ha_row_type[] = { const char *ha_row_type[] = {
"", "FIXED", "DYNAMIC", "COMPRESSED", "REDUNDANT", "COMPACT", "?","?","?" "", "FIXED", "DYNAMIC", "COMPRESSED", "REDUNDANT", "COMPACT", "PAGE", "?","?","?"
}; };
const char *tx_isolation_names[] = const char *tx_isolation_names[] =
@ -1993,9 +1991,9 @@ void handler::get_auto_increment(ulonglong offset, ulonglong increment,
key_copy(key, table->record[0], key_copy(key, table->record[0],
table->key_info + table->s->next_number_index, table->key_info + table->s->next_number_index,
table->s->next_number_key_offset); table->s->next_number_key_offset);
error= index_read(table->record[1], key, error= index_read_map(table->record[1], key,
make_prev_keypart_map(table->s->next_number_keypart), make_prev_keypart_map(table->s->next_number_keypart),
HA_READ_PREFIX_LAST); HA_READ_PREFIX_LAST);
/* /*
MySQL needs to call us for next row: assume we are inserting ("a",null) MySQL needs to call us for next row: assume we are inserting ("a",null)
here, we return 3, and next this statement will want to insert here, we return 3, and next this statement will want to insert
@ -3218,10 +3216,10 @@ int handler::read_range_first(const key_range *start_key,
if (!start_key) // Read first record if (!start_key) // Read first record
result= index_first(table->record[0]); result= index_first(table->record[0]);
else else
result= index_read(table->record[0], result= index_read_map(table->record[0],
start_key->key, start_key->key,
start_key->keypart_map, start_key->keypart_map,
start_key->flag); start_key->flag);
if (result) if (result)
DBUG_RETURN((result == HA_ERR_KEY_NOT_FOUND) DBUG_RETURN((result == HA_ERR_KEY_NOT_FOUND)
? HA_ERR_END_OF_FILE ? HA_ERR_END_OF_FILE
@ -3293,15 +3291,15 @@ int handler::compare_key(key_range *range)
} }
int handler::index_read_idx(uchar * buf, uint index, const uchar * key, int handler::index_read_idx_map(uchar * buf, uint index, const uchar * key,
key_part_map keypart_map, key_part_map keypart_map,
enum ha_rkey_function find_flag) enum ha_rkey_function find_flag)
{ {
int error, error1; int error, error1;
error= index_init(index, 0); error= index_init(index, 0);
if (!error) if (!error)
{ {
error= index_read(buf, key, keypart_map, find_flag); error= index_read_map(buf, key, keypart_map, find_flag);
error1= index_end(); error1= index_end();
} }
return error ? error : error1; return error ? error : error1;

View File

@ -278,7 +278,7 @@ enum legacy_db_type
enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED, enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED,
ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED, ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED,
ROW_TYPE_REDUNDANT, ROW_TYPE_COMPACT, ROW_TYPE_PAGES }; ROW_TYPE_REDUNDANT, ROW_TYPE_COMPACT, ROW_TYPE_PAGE };
enum enum_binlog_func { enum enum_binlog_func {
BFN_RESET_LOGS= 1, BFN_RESET_LOGS= 1,
@ -321,6 +321,7 @@ enum enum_binlog_command {
#define HA_CREATE_USED_PASSWORD (1L << 17) #define HA_CREATE_USED_PASSWORD (1L << 17)
#define HA_CREATE_USED_CONNECTION (1L << 18) #define HA_CREATE_USED_CONNECTION (1L << 18)
#define HA_CREATE_USED_KEY_BLOCK_SIZE (1L << 19) #define HA_CREATE_USED_KEY_BLOCK_SIZE (1L << 19)
#define HA_CREATE_USED_TRANSACTIONAL (1L << 20)
typedef ulonglong my_xid; // this line is the same as in log_event.h typedef ulonglong my_xid; // this line is the same as in log_event.h
#define MYSQL_XID_PREFIX "MySQLXid" #define MYSQL_XID_PREFIX "MySQLXid"
@ -788,6 +789,7 @@ class partition_info;
struct st_partition_iter; struct st_partition_iter;
#define NOT_A_PARTITION_ID ((uint32)-1) #define NOT_A_PARTITION_ID ((uint32)-1)
enum ha_choice { HA_CHOICE_UNDEF, HA_CHOICE_NO, HA_CHOICE_YES };
typedef struct st_ha_create_information typedef struct st_ha_create_information
{ {
@ -810,6 +812,8 @@ typedef struct st_ha_create_information
uint options; /* OR of HA_CREATE_ options */ uint options; /* OR of HA_CREATE_ options */
uint merge_insert_method; uint merge_insert_method;
uint extra_size; /* length of extra data segment */ uint extra_size; /* length of extra data segment */
/* 0 not used, 1 if not transactional, 2 if transactional */
enum ha_choice transactional;
bool table_existed; /* 1 in create if table existed */ bool table_existed; /* 1 in create if table existed */
bool frm_only; /* 1 if no ha_create_table() */ bool frm_only; /* 1 if no ha_create_table() */
bool varchar; /* 1 if table has a VARCHAR */ bool varchar; /* 1 if table has a VARCHAR */
@ -1277,27 +1281,28 @@ public:
enum ha_rkey_function find_flag) enum ha_rkey_function find_flag)
{ return HA_ERR_WRONG_COMMAND; } { return HA_ERR_WRONG_COMMAND; }
public: public:
/** /**
@brief @brief
Positions an index cursor to the index specified in the handle. Fetches the Positions an index cursor to the index specified in the handle. Fetches the
row if available. If the key value is null, begin at the first key of the row if available. If the key value is null, begin at the first key of the
index. index.
*/ */
virtual int index_read(uchar * buf, const uchar * key, key_part_map keypart_map, virtual int index_read_map(uchar * buf, const uchar * key,
enum ha_rkey_function find_flag)
{
uint key_len= calculate_key_len(table, active_index, key, keypart_map);
return index_read(buf, key, key_len, find_flag);
}
/**
@brief
Positions an index cursor to the index specified in the handle. Fetches the
row if available. If the key value is null, begin at the first key of the
index.
*/
virtual int index_read_idx(uchar * buf, uint index, const uchar * key,
key_part_map keypart_map, key_part_map keypart_map,
enum ha_rkey_function find_flag); enum ha_rkey_function find_flag)
{
uint key_len= calculate_key_len(table, active_index, key, keypart_map);
return index_read(buf, key, key_len, find_flag);
}
/**
@brief
Positions an index cursor to the index specified in the handle. Fetches the
row if available. If the key value is null, begin at the first key of the
index.
*/
virtual int index_read_idx_map(uchar * buf, uint index, const uchar * key,
key_part_map keypart_map,
enum ha_rkey_function find_flag);
virtual int index_next(uchar * buf) virtual int index_next(uchar * buf)
{ return HA_ERR_WRONG_COMMAND; } { return HA_ERR_WRONG_COMMAND; }
virtual int index_prev(uchar * buf) virtual int index_prev(uchar * buf)
@ -1311,17 +1316,17 @@ public:
virtual int index_read_last(uchar * buf, const uchar * key, uint key_len) virtual int index_read_last(uchar * buf, const uchar * key, uint key_len)
{ return (my_errno=HA_ERR_WRONG_COMMAND); } { return (my_errno=HA_ERR_WRONG_COMMAND); }
public: public:
/** /**
@brief @brief
The following functions works like index_read, but it find the last The following functions works like index_read, but it find the last
row with the current key value or prefix. row with the current key value or prefix.
*/ */
virtual int index_read_last(uchar * buf, const uchar * key, virtual int index_read_last_map(uchar * buf, const uchar * key,
key_part_map keypart_map) key_part_map keypart_map)
{ {
uint key_len= calculate_key_len(table, active_index, key, keypart_map); uint key_len= calculate_key_len(table, active_index, key, keypart_map);
return index_read_last(buf, key, key_len); return index_read_last(buf, key, key_len);
} }
virtual int read_multi_range_first(KEY_MULTI_RANGE **found_range_p, virtual int read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
KEY_MULTI_RANGE *ranges, uint range_count, KEY_MULTI_RANGE *ranges, uint range_count,
bool sorted, HANDLER_BUFFER *buffer); bool sorted, HANDLER_BUFFER *buffer);
@ -1864,7 +1869,7 @@ int ha_find_files(THD *thd,const char *db,const char *path,
int ha_table_exists_in_engine(THD* thd, const char* db, const char* name); int ha_table_exists_in_engine(THD* thd, const char* db, const char* name);
/* key cache */ /* key cache */
int ha_init_key_cache(const char *name, KEY_CACHE *key_cache); extern "C" int ha_init_key_cache(const char *name, KEY_CACHE *key_cache);
int ha_resize_key_cache(KEY_CACHE *key_cache); int ha_resize_key_cache(KEY_CACHE *key_cache);
int ha_change_key_cache_param(KEY_CACHE *key_cache); int ha_change_key_cache_param(KEY_CACHE *key_cache);
int ha_change_key_cache(KEY_CACHE *old_key_cache, KEY_CACHE *new_key_cache); int ha_change_key_cache(KEY_CACHE *old_key_cache, KEY_CACHE *new_key_cache);

View File

@ -3869,15 +3869,15 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
if ((*res)->type() == Item::FIELD_ITEM) if ((*res)->type() == Item::FIELD_ITEM)
{ {
/* /*
It's an Item_field referencing another Item_field in the select It's an Item_field referencing another Item_field in the select
list. list.
use the field from the Item_field in the select list and leave Use the field from the Item_field in the select list and leave
the Item_field instance in place. the Item_field instance in place.
*/ */
Field *field= (*((Item_field**)res))->field; Field *new_field= (*((Item_field**)res))->field;
if (field == NULL) if (new_field == NULL)
{ {
/* The column to which we link isn't valid. */ /* The column to which we link isn't valid. */
my_error(ER_BAD_FIELD_ERROR, MYF(0), (*res)->name, my_error(ER_BAD_FIELD_ERROR, MYF(0), (*res)->name,
@ -3885,7 +3885,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
return(1); return(1);
} }
set_field(field); set_field(new_field);
return 0; return 0;
} }
else else

View File

@ -3017,11 +3017,11 @@ uchar *in_longlong::get_value(Item *item)
void in_datetime::set(uint pos,Item *item) void in_datetime::set(uint pos,Item *item)
{ {
Item **tmp= &item; Item **tmp_item= &item;
bool is_null; bool is_null;
struct packed_longlong *buff= &((packed_longlong*) base)[pos]; struct packed_longlong *buff= &((packed_longlong*) base)[pos];
buff->val= get_datetime_value(thd, &tmp, 0, warn_item, &is_null); buff->val= get_datetime_value(thd, &tmp_item, 0, warn_item, &is_null);
buff->unsigned_flag= 1L; buff->unsigned_flag= 1L;
} }

View File

@ -1158,7 +1158,6 @@ public:
class Item_func_in :public Item_func_opt_neg class Item_func_in :public Item_func_opt_neg
{ {
public: public:
Item_result cmp_type;
/* /*
an array of values when the right hand arguments of IN an array of values when the right hand arguments of IN
are all SQL constant and there are no nulls are all SQL constant and there are no nulls

View File

@ -4376,11 +4376,11 @@ int Item_func_set_user_var::save_in_field(Field *field, bool no_conversions,
else if (result_type() == DECIMAL_RESULT) else if (result_type() == DECIMAL_RESULT)
{ {
my_decimal decimal_value; my_decimal decimal_value;
my_decimal *value= entry->val_decimal(&null_value, &decimal_value); my_decimal *val= entry->val_decimal(&null_value, &decimal_value);
if (null_value) if (null_value)
return set_field_to_null(field); return set_field_to_null(field);
field->set_notnull(); field->set_notnull();
error=field->store_decimal(value); error=field->store_decimal(val);
} }
else else
{ {

View File

@ -1049,6 +1049,23 @@ String *Item_str_conv::val_str(String *str)
} }
void Item_func_lcase::fix_length_and_dec()
{
collation.set(args[0]->collation);
multiply= collation.collation->casedn_multiply;
converter= collation.collation->cset->casedn;
max_length= args[0]->max_length * multiply;
}
void Item_func_ucase::fix_length_and_dec()
{
collation.set(args[0]->collation);
multiply= collation.collation->caseup_multiply;
converter= collation.collation->cset->caseup;
max_length= args[0]->max_length * multiply;
}
String *Item_func_left::val_str(String *str) String *Item_func_left::val_str(String *str)
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);

View File

@ -145,8 +145,7 @@ class Item_str_conv :public Item_str_func
{ {
protected: protected:
uint multiply; uint multiply;
size_t (*converter)(CHARSET_INFO *cs, char *src, size_t srclen, my_charset_conv_case converter;
char *dst, size_t dstlen);
String tmp_value; String tmp_value;
public: public:
Item_str_conv(Item *item) :Item_str_func(item) {} Item_str_conv(Item *item) :Item_str_func(item) {}
@ -159,13 +158,7 @@ class Item_func_lcase :public Item_str_conv
public: public:
Item_func_lcase(Item *item) :Item_str_conv(item) {} Item_func_lcase(Item *item) :Item_str_conv(item) {}
const char *func_name() const { return "lcase"; } const char *func_name() const { return "lcase"; }
void fix_length_and_dec() void fix_length_and_dec();
{
collation.set(args[0]->collation);
multiply= collation.collation->casedn_multiply;
converter= collation.collation->cset->casedn;
max_length= args[0]->max_length * multiply;
}
}; };
class Item_func_ucase :public Item_str_conv class Item_func_ucase :public Item_str_conv
@ -173,13 +166,7 @@ class Item_func_ucase :public Item_str_conv
public: public:
Item_func_ucase(Item *item) :Item_str_conv(item) {} Item_func_ucase(Item *item) :Item_str_conv(item) {}
const char *func_name() const { return "ucase"; } const char *func_name() const { return "ucase"; }
void fix_length_and_dec() void fix_length_and_dec();
{
collation.set(args[0]->collation);
multiply= collation.collation->caseup_multiply;
converter= collation.collation->cset->caseup;
max_length= args[0]->max_length * multiply;
}
}; };

View File

@ -2129,10 +2129,10 @@ int subselect_uniquesubquery_engine::exec()
if (!table->file->inited) if (!table->file->inited)
table->file->ha_index_init(tab->ref.key, 0); table->file->ha_index_init(tab->ref.key, 0);
error= table->file->index_read(table->record[0], error= table->file->index_read_map(table->record[0],
tab->ref.key_buff, tab->ref.key_buff,
make_prev_keypart_map(tab->ref.key_parts), make_prev_keypart_map(tab->ref.key_parts),
HA_READ_KEY_EXACT); HA_READ_KEY_EXACT);
if (error && if (error &&
error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
error= report_error(table, error); error= report_error(table, error);
@ -2239,10 +2239,10 @@ int subselect_indexsubquery_engine::exec()
if (!table->file->inited) if (!table->file->inited)
table->file->ha_index_init(tab->ref.key, 1); table->file->ha_index_init(tab->ref.key, 1);
error= table->file->index_read(table->record[0], error= table->file->index_read_map(table->record[0],
tab->ref.key_buff, tab->ref.key_buff,
make_prev_keypart_map(tab->ref.key_parts), make_prev_keypart_map(tab->ref.key_parts),
HA_READ_KEY_EXACT); HA_READ_KEY_EXACT);
if (error && if (error &&
error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
error= report_error(table, error); error= report_error(table, error);

View File

@ -570,13 +570,13 @@ String *Item_nodeset_func_rootelement::val_nodeset(String *nodeset)
String * Item_nodeset_func_union::val_nodeset(String *nodeset) String * Item_nodeset_func_union::val_nodeset(String *nodeset)
{ {
uint numnodes= pxml->length() / sizeof(MY_XML_NODE); uint num_nodes= pxml->length() / sizeof(MY_XML_NODE);
String set0, *s0= args[0]->val_nodeset(&set0); String set0, *s0= args[0]->val_nodeset(&set0);
String set1, *s1= args[1]->val_nodeset(&set1); String set1, *s1= args[1]->val_nodeset(&set1);
String both_str; String both_str;
both_str.alloc(numnodes); both_str.alloc(num_nodes);
char *both= (char*) both_str.ptr(); char *both= (char*) both_str.ptr();
bzero((void*)both, numnodes); bzero((void*)both, num_nodes);
MY_XPATH_FLT *flt; MY_XPATH_FLT *flt;
fltbeg= (MY_XPATH_FLT*) s0->ptr(); fltbeg= (MY_XPATH_FLT*) s0->ptr();
@ -590,7 +590,7 @@ String * Item_nodeset_func_union::val_nodeset(String *nodeset)
both[flt->num]= 1; both[flt->num]= 1;
nodeset->length(0); nodeset->length(0);
for (uint i= 0, pos= 0; i < numnodes; i++) for (uint i= 0, pos= 0; i < num_nodes; i++)
{ {
if (both[i]) if (both[i])
((XPathFilter*)nodeset)->append_element(i, pos++); ((XPathFilter*)nodeset)->append_element(i, pos++);
@ -2656,7 +2656,9 @@ static uint xml_parent_tag(MY_XML_NODE *items, uint nitems, uint level)
RETURN RETURN
Currently only MY_XML_OK Currently only MY_XML_OK
*/ */
static int xml_enter(MY_XML_PARSER *st,const char *attr, size_t len) extern "C" int xml_enter(MY_XML_PARSER *st,const char *attr, size_t len);
int xml_enter(MY_XML_PARSER *st,const char *attr, size_t len)
{ {
MY_XML_USER_DATA *data= (MY_XML_USER_DATA*)st->user_data; MY_XML_USER_DATA *data= (MY_XML_USER_DATA*)st->user_data;
MY_XML_NODE *nodes= (MY_XML_NODE*) data->pxml->ptr(); MY_XML_NODE *nodes= (MY_XML_NODE*) data->pxml->ptr();
@ -2687,7 +2689,9 @@ static int xml_enter(MY_XML_PARSER *st,const char *attr, size_t len)
RETURN RETURN
Currently only MY_XML_OK Currently only MY_XML_OK
*/ */
static int xml_value(MY_XML_PARSER *st,const char *attr, size_t len) extern "C" int xml_value(MY_XML_PARSER *st,const char *attr, size_t len);
int xml_value(MY_XML_PARSER *st,const char *attr, size_t len)
{ {
MY_XML_USER_DATA *data= (MY_XML_USER_DATA*)st->user_data; MY_XML_USER_DATA *data= (MY_XML_USER_DATA*)st->user_data;
MY_XML_NODE *nodes= (MY_XML_NODE*) data->pxml->ptr(); MY_XML_NODE *nodes= (MY_XML_NODE*) data->pxml->ptr();
@ -2717,7 +2721,9 @@ static int xml_value(MY_XML_PARSER *st,const char *attr, size_t len)
RETURN RETURN
Currently only MY_XML_OK Currently only MY_XML_OK
*/ */
static int xml_leave(MY_XML_PARSER *st,const char *attr, size_t len) extern "C" int xml_leave(MY_XML_PARSER *st,const char *attr, size_t len);
int xml_leave(MY_XML_PARSER *st,const char *attr, size_t len)
{ {
MY_XML_USER_DATA *data= (MY_XML_USER_DATA*)st->user_data; MY_XML_USER_DATA *data= (MY_XML_USER_DATA*)st->user_data;
DBUG_ASSERT(data->level > 0); DBUG_ASSERT(data->level > 0);

View File

@ -480,6 +480,7 @@ int key_cmp(KEY_PART_INFO *key_part, const uchar *key, uint key_length)
rec0 Pointer to table->record[0] rec0 Pointer to table->record[0]
first_rec Pointer to record compare with first_rec Pointer to record compare with
second_rec Pointer to record compare against first_rec second_rec Pointer to record compare against first_rec
DESCRIPTION DESCRIPTION
This method is set-up such that it can be called directly from the This method is set-up such that it can be called directly from the
priority queue and it is attempted to be optimised as much as possible priority queue and it is attempted to be optimised as much as possible

View File

@ -1934,7 +1934,7 @@ bool MYSQL_QUERY_LOG::write(time_t event_time, const char *user_host,
{ {
char buff[32]; char buff[32];
uint length= 0; uint length= 0;
char time_buff[MAX_TIME_SIZE]; char local_time_buff[MAX_TIME_SIZE];
struct tm start; struct tm start;
uint time_buff_len= 0; uint time_buff_len= 0;
@ -1950,13 +1950,13 @@ bool MYSQL_QUERY_LOG::write(time_t event_time, const char *user_host,
localtime_r(&event_time, &start); localtime_r(&event_time, &start);
time_buff_len= my_snprintf(time_buff, MAX_TIME_SIZE, time_buff_len= my_snprintf(local_time_buff, MAX_TIME_SIZE,
"%02d%02d%02d %2d:%02d:%02d", "%02d%02d%02d %2d:%02d:%02d",
start.tm_year % 100, start.tm_mon + 1, start.tm_year % 100, start.tm_mon + 1,
start.tm_mday, start.tm_hour, start.tm_mday, start.tm_hour,
start.tm_min, start.tm_sec); start.tm_min, start.tm_sec);
if (my_b_write(&log_file, (uchar*) &time_buff, time_buff_len)) if (my_b_write(&log_file, (uchar*) local_time_buff, time_buff_len))
goto err; goto err;
} }
else else
@ -2346,8 +2346,7 @@ bool MYSQL_BIN_LOG::open(const char *log_name,
s.flags|= LOG_EVENT_BINLOG_IN_USE_F; s.flags|= LOG_EVENT_BINLOG_IN_USE_F;
if (!s.is_valid()) if (!s.is_valid())
goto err; goto err;
if (null_created_arg) s.dont_set_created= null_created_arg;
s.created= 0;
if (s.write(&log_file)) if (s.write(&log_file))
goto err; goto err;
bytes_written+= s.data_written; bytes_written+= s.data_written;

View File

@ -641,6 +641,7 @@ void Log_event::init_show_field_list(List<Item>* field_list)
bool Log_event::write_header(IO_CACHE* file, ulong event_data_length) bool Log_event::write_header(IO_CACHE* file, ulong event_data_length)
{ {
uchar header[LOG_EVENT_HEADER_LEN]; uchar header[LOG_EVENT_HEADER_LEN];
ulong now;
DBUG_ENTER("Log_event::write_header"); DBUG_ENTER("Log_event::write_header");
/* Store number of bytes that will be written by this event */ /* Store number of bytes that will be written by this event */
@ -691,18 +692,7 @@ bool Log_event::write_header(IO_CACHE* file, ulong event_data_length)
log_pos= my_b_safe_tell(file)+data_written; log_pos= my_b_safe_tell(file)+data_written;
} }
/* now= (ulong) get_time(); // Query start time
Set time of when to when the query started. Since this function is
called from init_server_components() as well, it might be that the
current thread is not defined. In that case, we take the current
time instead. It is safe to call my_time() here since the first
time this line is reached is through the init_server_components()
call, which is after the my_init() call in the main() function (or
it's replacement, for some platforms).
*/
THD *thd= current_thd;
if (!when)
when= thd ? thd->start_time : my_time(0);
/* /*
Header will be of size LOG_EVENT_HEADER_LEN for all events, except for Header will be of size LOG_EVENT_HEADER_LEN for all events, except for
@ -711,7 +701,7 @@ bool Log_event::write_header(IO_CACHE* file, ulong event_data_length)
because we read them before knowing the format). because we read them before knowing the format).
*/ */
int4store(header, (ulong) when); // timestamp int4store(header, now); // timestamp
header[EVENT_TYPE_OFFSET]= get_type_code(); header[EVENT_TYPE_OFFSET]= get_type_code();
int4store(header+ SERVER_ID_OFFSET, server_id); int4store(header+ SERVER_ID_OFFSET, server_id);
int4store(header+ EVENT_LEN_OFFSET, data_written); int4store(header+ EVENT_LEN_OFFSET, data_written);
@ -820,10 +810,12 @@ end:
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
Log_event* Log_event::read_log_event(IO_CACHE* file, Log_event* Log_event::read_log_event(IO_CACHE* file,
pthread_mutex_t* log_lock, pthread_mutex_t* log_lock,
const Format_description_log_event *description_event) const Format_description_log_event
*description_event)
#else #else
Log_event* Log_event::read_log_event(IO_CACHE* file, Log_event* Log_event::read_log_event(IO_CACHE* file,
const Format_description_log_event *description_event) const Format_description_log_event
*description_event)
#endif #endif
{ {
DBUG_ENTER("Log_event::read_log_event"); DBUG_ENTER("Log_event::read_log_event");
@ -1478,7 +1470,7 @@ Query_log_event::Query_log_event()
/* /*
SYNOPSIS SYNOPSIS
Query_log_event::Query_log_event() Query_log_event::Query_log_event()
thd - thread handle thd_arg - thread handle
query_arg - array of char representing the query query_arg - array of char representing the query
query_length - size of the `query_arg' array query_length - size of the `query_arg' array
using_trans - there is a modified transactional table using_trans - there is a modified transactional table
@ -1494,10 +1486,12 @@ Query_log_event::Query_log_event()
*/ */
Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg, Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
ulong query_length, bool using_trans, ulong query_length, bool using_trans,
bool suppress_use, THD::killed_state killed_status_arg) bool suppress_use,
THD::killed_state killed_status_arg)
:Log_event(thd_arg, :Log_event(thd_arg,
(thd_arg->thread_specific_used ? LOG_EVENT_THREAD_SPECIFIC_F : 0) | (thd_arg->thread_specific_used ? LOG_EVENT_THREAD_SPECIFIC_F :
(suppress_use ? LOG_EVENT_SUPPRESS_USE_F : 0), 0) |
(suppress_use ? LOG_EVENT_SUPPRESS_USE_F : 0),
using_trans), using_trans),
data_buf(0), query(query_arg), catalog(thd_arg->catalog), data_buf(0), query(query_arg), catalog(thd_arg->catalog),
db(thd_arg->db), q_len((uint32) query_length), db(thd_arg->db), q_len((uint32) query_length),
@ -1518,10 +1512,10 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
error_code= error_code=
(killed_status_arg == THD::NOT_KILLED) ? thd_arg->net.last_errno : (killed_status_arg == THD::NOT_KILLED) ? thd_arg->net.last_errno :
((thd_arg->system_thread & SYSTEM_THREAD_DELAYED_INSERT) ? 0 : ((thd_arg->system_thread & SYSTEM_THREAD_DELAYED_INSERT) ? 0 :
thd->killed_errno()); thd_arg->killed_errno());
time(&end_time); time(&end_time);
exec_time = (ulong) (end_time - thd->start_time); exec_time = (ulong) (end_time - thd_arg->start_time);
catalog_len = (catalog) ? (uint32) strlen(catalog) : 0; catalog_len = (catalog) ? (uint32) strlen(catalog) : 0;
/* status_vars_len is set just before writing the event */ /* status_vars_len is set just before writing the event */
db_len = (db) ? (uint32) strlen(db) : 0; db_len = (db) ? (uint32) strlen(db) : 0;
@ -1530,15 +1524,15 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
/* /*
If we don't use flags2 for anything else than options contained in If we don't use flags2 for anything else than options contained in
thd->options, it would be more efficient to flags2=thd_arg->options thd_arg->options, it would be more efficient to flags2=thd_arg->options
(OPTIONS_WRITTEN_TO_BINLOG would be used only at reading time). (OPTIONS_WRITTEN_TO_BINLOG would be used only at reading time).
But it's likely that we don't want to use 32 bits for 3 bits; in the future But it's likely that we don't want to use 32 bits for 3 bits; in the future
we will probably want to reclaim the 29 bits. So we need the &. we will probably want to reclaim the 29 bits. So we need the &.
*/ */
flags2= (uint32) (thd_arg->options & OPTIONS_WRITTEN_TO_BIN_LOG); flags2= (uint32) (thd_arg->options & OPTIONS_WRITTEN_TO_BIN_LOG);
DBUG_ASSERT(thd->variables.character_set_client->number < 256*256); DBUG_ASSERT(thd_arg->variables.character_set_client->number < 256*256);
DBUG_ASSERT(thd->variables.collation_connection->number < 256*256); DBUG_ASSERT(thd_arg->variables.collation_connection->number < 256*256);
DBUG_ASSERT(thd->variables.collation_server->number < 256*256); DBUG_ASSERT(thd_arg->variables.collation_server->number < 256*256);
int2store(charset, thd_arg->variables.character_set_client->number); int2store(charset, thd_arg->variables.character_set_client->number);
int2store(charset+2, thd_arg->variables.collation_connection->number); int2store(charset+2, thd_arg->variables.collation_connection->number);
int2store(charset+4, thd_arg->variables.collation_server->number); int2store(charset+4, thd_arg->variables.collation_server->number);
@ -2264,9 +2258,10 @@ Muted_query_log_event::Muted_query_log_event()
**************************************************************************/ **************************************************************************/
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
Start_log_event_v3::Start_log_event_v3() :Log_event(), binlog_version(BINLOG_VERSION), artificial_event(0) Start_log_event_v3::Start_log_event_v3()
:Log_event(), created(0), binlog_version(BINLOG_VERSION),
artificial_event(0), dont_set_created(0)
{ {
created= when;
memcpy(server_version, ::server_version, ST_SERVER_VER_LEN); memcpy(server_version, ::server_version, ST_SERVER_VER_LEN);
} }
#endif #endif
@ -2336,7 +2331,8 @@ void Start_log_event_v3::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
*/ */
Start_log_event_v3::Start_log_event_v3(const char* buf, Start_log_event_v3::Start_log_event_v3(const char* buf,
const Format_description_log_event* description_event) const Format_description_log_event
*description_event)
:Log_event(buf, description_event) :Log_event(buf, description_event)
{ {
buf+= description_event->common_header_len; buf+= description_event->common_header_len;
@ -2348,6 +2344,7 @@ Start_log_event_v3::Start_log_event_v3(const char* buf,
created= uint4korr(buf+ST_CREATED_OFFSET); created= uint4korr(buf+ST_CREATED_OFFSET);
/* We use log_pos to mark if this was an artificial event or not */ /* We use log_pos to mark if this was an artificial event or not */
artificial_event= (log_pos == 0); artificial_event= (log_pos == 0);
dont_set_created= 1;
} }
@ -2361,6 +2358,8 @@ bool Start_log_event_v3::write(IO_CACHE* file)
char buff[START_V3_HEADER_LEN]; char buff[START_V3_HEADER_LEN];
int2store(buff + ST_BINLOG_VER_OFFSET,binlog_version); int2store(buff + ST_BINLOG_VER_OFFSET,binlog_version);
memcpy(buff + ST_SERVER_VER_OFFSET,server_version,ST_SERVER_VER_LEN); memcpy(buff + ST_SERVER_VER_OFFSET,server_version,ST_SERVER_VER_LEN);
if (!dont_set_created)
created= when= get_time();
int4store(buff + ST_CREATED_OFFSET,created); int4store(buff + ST_CREATED_OFFSET,created);
return (write_header(file, sizeof(buff)) || return (write_header(file, sizeof(buff)) ||
my_b_safe_write(file, (uchar*) buff, sizeof(buff))); my_b_safe_write(file, (uchar*) buff, sizeof(buff)));
@ -2391,8 +2390,7 @@ bool Start_log_event_v3::write(IO_CACHE* file)
int Start_log_event_v3::do_apply_event(Relay_log_info const *rli) int Start_log_event_v3::do_apply_event(Relay_log_info const *rli)
{ {
DBUG_ENTER("Start_log_event_v3::do_apply_event"); DBUG_ENTER("Start_log_event_v3::do_apply_event");
switch (binlog_version) switch (binlog_version) {
{
case 3: case 3:
case 4: case 4:
/* /*
@ -2463,7 +2461,6 @@ Format_description_log_event::
Format_description_log_event(uint8 binlog_ver, const char* server_ver) Format_description_log_event(uint8 binlog_ver, const char* server_ver)
:Start_log_event_v3() :Start_log_event_v3()
{ {
created= when;
binlog_version= binlog_ver; binlog_version= binlog_ver;
switch (binlog_ver) { switch (binlog_ver) {
case 4: /* MySQL 5.0 */ case 4: /* MySQL 5.0 */
@ -2615,6 +2612,8 @@ bool Format_description_log_event::write(IO_CACHE* file)
uchar buff[FORMAT_DESCRIPTION_HEADER_LEN]; uchar buff[FORMAT_DESCRIPTION_HEADER_LEN];
int2store(buff + ST_BINLOG_VER_OFFSET,binlog_version); int2store(buff + ST_BINLOG_VER_OFFSET,binlog_version);
memcpy((char*) buff + ST_SERVER_VER_OFFSET,server_version,ST_SERVER_VER_LEN); memcpy((char*) buff + ST_SERVER_VER_OFFSET,server_version,ST_SERVER_VER_LEN);
if (!dont_set_created)
created= when= get_time();
int4store(buff + ST_CREATED_OFFSET,created); int4store(buff + ST_CREATED_OFFSET,created);
buff[ST_COMMON_HEADER_LEN_OFFSET]= LOG_EVENT_HEADER_LEN; buff[ST_COMMON_HEADER_LEN_OFFSET]= LOG_EVENT_HEADER_LEN;
memcpy((char*) buff+ST_COMMON_HEADER_LEN_OFFSET+1, (uchar*) post_header_len, memcpy((char*) buff+ST_COMMON_HEADER_LEN_OFFSET+1, (uchar*) post_header_len,
@ -4921,8 +4920,9 @@ err:
*/ */
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
Append_block_log_event::Append_block_log_event(THD* thd_arg, const char* db_arg, Append_block_log_event::Append_block_log_event(THD *thd_arg,
char* block_arg, const char *db_arg,
char *block_arg,
uint block_len_arg, uint block_len_arg,
bool using_trans) bool using_trans)
:Log_event(thd_arg,0, using_trans), block(block_arg), :Log_event(thd_arg,0, using_trans), block(block_arg),
@ -5171,7 +5171,8 @@ int Delete_file_log_event::do_apply_event(Relay_log_info const *rli)
*/ */
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
Execute_load_log_event::Execute_load_log_event(THD *thd_arg, const char* db_arg, Execute_load_log_event::Execute_load_log_event(THD *thd_arg,
const char* db_arg,
bool using_trans) bool using_trans)
:Log_event(thd_arg, 0, using_trans), file_id(thd_arg->file_id), db(db_arg) :Log_event(thd_arg, 0, using_trans), file_id(thd_arg->file_id), db(db_arg)
{ {
@ -5372,7 +5373,7 @@ int Begin_load_query_log_event::get_create_or_append() const
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
Execute_load_query_log_event:: Execute_load_query_log_event::
Execute_load_query_log_event(THD* thd_arg, const char* query_arg, Execute_load_query_log_event(THD *thd_arg, const char* query_arg,
ulong query_length_arg, uint fn_pos_start_arg, ulong query_length_arg, uint fn_pos_start_arg,
uint fn_pos_end_arg, uint fn_pos_end_arg,
enum_load_dup_handling dup_handling_arg, enum_load_dup_handling dup_handling_arg,
@ -7015,7 +7016,8 @@ int Write_rows_log_event::do_after_row_operations(TABLE *table, int error)
return error? error : local_error; return error? error : local_error;
} }
int Write_rows_log_event::do_prepare_row(THD *thd, Relay_log_info const *rli, int Write_rows_log_event::do_prepare_row(THD *thd_arg,
Relay_log_info const *rli,
TABLE *table, TABLE *table,
uchar const *const row_start, uchar const *const row_start,
uchar const **const row_end) uchar const **const row_end)
@ -7026,7 +7028,7 @@ int Write_rows_log_event::do_prepare_row(THD *thd, Relay_log_info const *rli,
if (int error= unpack_row(rli, table, m_width, row_start, &m_cols, row_end, if (int error= unpack_row(rli, table, m_width, row_start, &m_cols, row_end,
&m_master_reclength, table->write_set, WRITE_ROWS_EVENT)) &m_master_reclength, table->write_set, WRITE_ROWS_EVENT))
{ {
thd->net.last_errno= error; thd_arg->net.last_errno= error;
return error; return error;
} }
bitmap_copy(table->read_set, table->write_set); bitmap_copy(table->read_set, table->write_set);
@ -7289,11 +7291,12 @@ replace_record(THD *thd, TABLE *table,
DBUG_RETURN(ENOMEM); DBUG_RETURN(ENOMEM);
} }
key_copy((uchar*)key.get(), table->record[0], table->key_info + keynum, 0); key_copy((uchar*)key.get(), table->record[0], table->key_info + keynum,
error= table->file->index_read_idx(table->record[1], keynum, 0);
(const uchar*)key.get(), error= table->file->index_read_idx_map(table->record[1], keynum,
HA_WHOLE_KEY, (const uchar*)key.get(),
HA_READ_KEY_EXACT); HA_WHOLE_KEY,
HA_READ_KEY_EXACT);
if (error) if (error)
{ {
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
@ -7544,8 +7547,8 @@ static int find_and_fetch_row(TABLE *table, uchar *key)
my_ptrdiff_t const pos= my_ptrdiff_t const pos=
table->s->null_bytes > 0 ? table->s->null_bytes - 1 : 0; table->s->null_bytes > 0 ? table->s->null_bytes - 1 : 0;
table->record[1][pos]= 0xFF; table->record[1][pos]= 0xFF;
if ((error= table->file->index_read(table->record[1], key, HA_WHOLE_KEY, if ((error= table->file->index_read_map(table->record[1], key, HA_WHOLE_KEY,
HA_READ_KEY_EXACT))) HA_READ_KEY_EXACT)))
{ {
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
table->file->ha_index_end(); table->file->ha_index_end();
@ -7745,7 +7748,8 @@ int Delete_rows_log_event::do_after_row_operations(TABLE *table, int error)
return error; return error;
} }
int Delete_rows_log_event::do_prepare_row(THD *thd, Relay_log_info const *rli, int Delete_rows_log_event::do_prepare_row(THD *thd_arg,
Relay_log_info const *rli,
TABLE *table, TABLE *table,
uchar const *const row_start, uchar const *const row_start,
uchar const **const row_end) uchar const **const row_end)
@ -7754,7 +7758,7 @@ int Delete_rows_log_event::do_prepare_row(THD *thd, Relay_log_info const *rli,
if (int error= unpack_row(rli, table, m_width, row_start, &m_cols, row_end, if (int error= unpack_row(rli, table, m_width, row_start, &m_cols, row_end,
&m_master_reclength, table->read_set, DELETE_ROWS_EVENT)) &m_master_reclength, table->read_set, DELETE_ROWS_EVENT))
{ {
thd->net.last_errno= error; thd_arg->net.last_errno= error;
return error; return error;
} }
@ -7911,7 +7915,10 @@ int Update_rows_log_event::do_before_row_operations(TABLE *table)
int Update_rows_log_event::do_after_row_operations(TABLE *table, int error) int Update_rows_log_event::do_after_row_operations(TABLE *table, int error)
{ {
/*error= ToDo:find out what this should really be, this triggers close_scan in nbd, returning error?*/ /*
error= ToDo:find out what this should really be, this triggers
close_scan in nbd, returning error?
*/
table->file->ha_index_or_rnd_end(); table->file->ha_index_or_rnd_end();
my_free(m_memory, MYF(MY_ALLOW_ZERO_PTR)); my_free(m_memory, MYF(MY_ALLOW_ZERO_PTR));
m_memory= NULL; m_memory= NULL;
@ -7921,7 +7928,8 @@ int Update_rows_log_event::do_after_row_operations(TABLE *table, int error)
return error; return error;
} }
int Update_rows_log_event::do_prepare_row(THD *thd, Relay_log_info const *rli, int Update_rows_log_event::do_prepare_row(THD *thd_arg,
Relay_log_info const *rli,
TABLE *table, TABLE *table,
uchar const *const row_start, uchar const *const row_start,
uchar const **const row_end) uchar const **const row_end)
@ -7936,9 +7944,10 @@ int Update_rows_log_event::do_prepare_row(THD *thd, Relay_log_info const *rli,
/* record[0] is the before image for the update */ /* record[0] is the before image for the update */
if ((error= unpack_row(rli, table, m_width, row_start, &m_cols, row_end, if ((error= unpack_row(rli, table, m_width, row_start, &m_cols, row_end,
&m_master_reclength, table->read_set, UPDATE_ROWS_EVENT))) &m_master_reclength, table->read_set,
UPDATE_ROWS_EVENT)))
{ {
thd->net.last_errno= error; thd_arg->net.last_errno= error;
return error; return error;
} }
@ -7946,9 +7955,10 @@ int Update_rows_log_event::do_prepare_row(THD *thd, Relay_log_info const *rli,
uchar const *next_start = *row_end; uchar const *next_start = *row_end;
/* m_after_image is the after image for the update */ /* m_after_image is the after image for the update */
if ((error= unpack_row(rli, table, m_width, next_start, &m_cols_ai, row_end, if ((error= unpack_row(rli, table, m_width, next_start, &m_cols_ai, row_end,
&m_master_reclength, table->write_set, UPDATE_ROWS_EVENT))) &m_master_reclength, table->write_set,
UPDATE_ROWS_EVENT)))
{ {
thd->net.last_errno= error; thd_arg->net.last_errno= error;
return error; return error;
} }
@ -8132,5 +8142,3 @@ Incident_log_event::write_data_body(IO_CACHE *file)
DBUG_ENTER("Incident_log_event::write_data_body"); DBUG_ENTER("Incident_log_event::write_data_body");
DBUG_RETURN(write_str(file, m_message.str, m_message.length)); DBUG_RETURN(write_str(file, m_message.str, m_message.length));
} }

View File

@ -57,8 +57,8 @@
which increments every time we write an event to the binlog) (3 bytes). which increments every time we write an event to the binlog) (3 bytes).
Q: how do we handle when the counter is overflowed and restarts from 0 ? Q: how do we handle when the counter is overflowed and restarts from 0 ?
- Query and Load (Create or Execute) events may have a more precise timestamp - Query and Load (Create or Execute) events may have a more precise
(with microseconds), number of matched/affected/warnings rows timestamp (with microseconds), number of matched/affected/warnings rows
and fields of session variables: SQL_MODE, and fields of session variables: SQL_MODE,
FOREIGN_KEY_CHECKS, UNIQUE_CHECKS, SQL_AUTO_IS_NULL, the collations and FOREIGN_KEY_CHECKS, UNIQUE_CHECKS, SQL_AUTO_IS_NULL, the collations and
charsets, the PASSWORD() version (old/new/...). charsets, the PASSWORD() version (old/new/...).
@ -706,7 +706,8 @@ public:
*/ */
static Log_event* read_log_event(IO_CACHE* file, static Log_event* read_log_event(IO_CACHE* file,
pthread_mutex_t* log_lock, pthread_mutex_t* log_lock,
const Format_description_log_event *description_event); const Format_description_log_event
*description_event);
static int read_log_event(IO_CACHE* file, String* packet, static int read_log_event(IO_CACHE* file, String* packet,
pthread_mutex_t* log_lock); pthread_mutex_t* log_lock);
/* /*
@ -734,7 +735,8 @@ public:
Log_event() : temp_buf(0) {} Log_event() : temp_buf(0) {}
/* avoid having to link mysqlbinlog against libpthread */ /* avoid having to link mysqlbinlog against libpthread */
static Log_event* read_log_event(IO_CACHE* file, static Log_event* read_log_event(IO_CACHE* file,
const Format_description_log_event *description_event); const Format_description_log_event
*description_event);
/* print*() functions are used by mysqlbinlog */ /* print*() functions are used by mysqlbinlog */
virtual void print(FILE* file, PRINT_EVENT_INFO* print_event_info) = 0; virtual void print(FILE* file, PRINT_EVENT_INFO* print_event_info) = 0;
void print_timestamp(IO_CACHE* file, time_t *ts = 0); void print_timestamp(IO_CACHE* file, time_t *ts = 0);
@ -770,12 +772,24 @@ public:
{ return 0; } { return 0; }
virtual bool write_data_body(IO_CACHE* file __attribute__((unused))) virtual bool write_data_body(IO_CACHE* file __attribute__((unused)))
{ return 0; } { return 0; }
inline time_t get_time()
{
THD *tmp_thd;
if (when)
return when;
if (thd)
return thd->start_time;
if ((tmp_thd= current_thd))
return tmp_thd->start_time;
return my_time(0);
}
#endif #endif
virtual Log_event_type get_type_code() = 0; virtual Log_event_type get_type_code() = 0;
virtual bool is_valid() const = 0; virtual bool is_valid() const = 0;
virtual bool is_artificial_event() { return 0; } virtual bool is_artificial_event() { return 0; }
inline bool get_cache_stmt() const { return cache_stmt; } inline bool get_cache_stmt() const { return cache_stmt; }
Log_event(const char* buf, const Format_description_log_event* description_event); Log_event(const char* buf, const Format_description_log_event
*description_event);
virtual ~Log_event() { free_temp_buf();} virtual ~Log_event() { free_temp_buf();}
void register_temp_buf(char* buf) { temp_buf = buf; } void register_temp_buf(char* buf) { temp_buf = buf; }
void free_temp_buf() void free_temp_buf()
@ -798,6 +812,8 @@ public:
/* returns the human readable name of the event's type */ /* returns the human readable name of the event's type */
const char* get_type_str(); const char* get_type_str();
/* Return start of query time or current time */
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
public: public:
@ -809,7 +825,8 @@ public:
@see do_apply_event @see do_apply_event
*/ */
int apply_event(Relay_log_info const *rli) { int apply_event(Relay_log_info const *rli)
{
return do_apply_event(rli); return do_apply_event(rli);
} }
@ -917,7 +934,6 @@ protected:
non-zero. The caller shall decrease the counter by one. non-zero. The caller shall decrease the counter by one.
*/ */
virtual enum_skip_reason do_shall_skip(Relay_log_info *rli); virtual enum_skip_reason do_shall_skip(Relay_log_info *rli);
#endif #endif
}; };
@ -1149,7 +1165,8 @@ private:
char **fn_start, char **fn_end); char **fn_start, char **fn_end);
protected: protected:
int copy_log_event(const char *buf, ulong event_len, int copy_log_event(const char *buf, ulong event_len,
int body_offset, const Format_description_log_event* description_event); int body_offset,
const Format_description_log_event* description_event);
public: public:
ulong thread_id; ulong thread_id;
@ -1294,6 +1311,11 @@ public:
setting log_event == 0 (for now). setting log_event == 0 (for now).
*/ */
bool artificial_event; bool artificial_event;
/*
We set this to 1 if we don't want to have the created time in the log,
which is the case when we rollover to a new log.
*/
bool dont_set_created;
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
Start_log_event_v3(); Start_log_event_v3();
@ -1360,7 +1382,8 @@ public:
Format_description_log_event(uint8 binlog_ver, const char* server_ver=0); Format_description_log_event(uint8 binlog_ver, const char* server_ver=0);
Format_description_log_event(const char* buf, uint event_len, Format_description_log_event(const char* buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event
*description_event);
~Format_description_log_event() { my_free((uchar*)post_header_len, MYF(0)); } ~Format_description_log_event() { my_free((uchar*)post_header_len, MYF(0)); }
Log_event_type get_type_code() { return FORMAT_DESCRIPTION_EVENT;} Log_event_type get_type_code() { return FORMAT_DESCRIPTION_EVENT;}
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
@ -1418,7 +1441,8 @@ public:
void print(FILE* file, PRINT_EVENT_INFO* print_event_info); void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Intvar_log_event(const char* buf, const Format_description_log_event* description_event); Intvar_log_event(const char* buf,
const Format_description_log_event *description_event);
~Intvar_log_event() {} ~Intvar_log_event() {}
Log_event_type get_type_code() { return INTVAR_EVENT;} Log_event_type get_type_code() { return INTVAR_EVENT;}
const char* get_var_type_name(); const char* get_var_type_name();
@ -1465,7 +1489,8 @@ class Rand_log_event: public Log_event
void print(FILE* file, PRINT_EVENT_INFO* print_event_info); void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Rand_log_event(const char* buf, const Format_description_log_event* description_event); Rand_log_event(const char* buf,
const Format_description_log_event *description_event);
~Rand_log_event() {} ~Rand_log_event() {}
Log_event_type get_type_code() { return RAND_EVENT;} Log_event_type get_type_code() { return RAND_EVENT;}
int get_data_size() { return 16; /* sizeof(ulonglong) * 2*/ } int get_data_size() { return 16; /* sizeof(ulonglong) * 2*/ }
@ -1508,7 +1533,8 @@ class Xid_log_event: public Log_event
void print(FILE* file, PRINT_EVENT_INFO* print_event_info); void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Xid_log_event(const char* buf, const Format_description_log_event* description_event); Xid_log_event(const char* buf,
const Format_description_log_event *description_event);
~Xid_log_event() {} ~Xid_log_event() {}
Log_event_type get_type_code() { return XID_EVENT;} Log_event_type get_type_code() { return XID_EVENT;}
int get_data_size() { return sizeof(xid); } int get_data_size() { return sizeof(xid); }
@ -1554,7 +1580,8 @@ public:
void print(FILE* file, PRINT_EVENT_INFO* print_event_info); void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
User_var_log_event(const char* buf, const Format_description_log_event* description_event); User_var_log_event(const char* buf,
const Format_description_log_event *description_event);
~User_var_log_event() {} ~User_var_log_event() {}
Log_event_type get_type_code() { return USER_VAR_EVENT;} Log_event_type get_type_code() { return USER_VAR_EVENT;}
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
@ -1586,7 +1613,8 @@ public:
void print(FILE* file, PRINT_EVENT_INFO* print_event_info); void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Stop_log_event(const char* buf, const Format_description_log_event* description_event): Stop_log_event(const char* buf,
const Format_description_log_event *description_event):
Log_event(buf, description_event) Log_event(buf, description_event)
{} {}
~Stop_log_event() {} ~Stop_log_event() {}
@ -1695,7 +1723,8 @@ public:
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
#else #else
void print(FILE* file, PRINT_EVENT_INFO* print_event_info); void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
void print(FILE* file, PRINT_EVENT_INFO* print_event_info, bool enable_local); void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
bool enable_local);
#endif #endif
Create_file_log_event(const char* buf, uint event_len, Create_file_log_event(const char* buf, uint event_len,
@ -1770,7 +1799,8 @@ public:
#endif #endif
Append_block_log_event(const char* buf, uint event_len, Append_block_log_event(const char* buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event
*description_event);
~Append_block_log_event() {} ~Append_block_log_event() {}
Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;} Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;}
int get_data_size() { return block_len + APPEND_BLOCK_HEADER_LEN ;} int get_data_size() { return block_len + APPEND_BLOCK_HEADER_LEN ;}
@ -1806,7 +1836,8 @@ public:
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
#else #else
void print(FILE* file, PRINT_EVENT_INFO* print_event_info); void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
void print(FILE* file, PRINT_EVENT_INFO* print_event_info, bool enable_local); void print(FILE* file, PRINT_EVENT_INFO* print_event_info,
bool enable_local);
#endif #endif
Delete_file_log_event(const char* buf, uint event_len, Delete_file_log_event(const char* buf, uint event_len,
@ -1849,7 +1880,8 @@ public:
#endif #endif
Execute_load_log_event(const char* buf, uint event_len, Execute_load_log_event(const char* buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event
*description_event);
~Execute_load_log_event() {} ~Execute_load_log_event() {}
Log_event_type get_type_code() { return EXEC_LOAD_EVENT;} Log_event_type get_type_code() { return EXEC_LOAD_EVENT;}
int get_data_size() { return EXEC_LOAD_HEADER_LEN ;} int get_data_size() { return EXEC_LOAD_HEADER_LEN ;}
@ -1888,7 +1920,8 @@ public:
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
#endif #endif
Begin_load_query_log_event(const char* buf, uint event_len, Begin_load_query_log_event(const char* buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event
*description_event);
~Begin_load_query_log_event() {} ~Begin_load_query_log_event() {}
Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; } Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
}; };
@ -1940,7 +1973,8 @@ public:
const char *local_fname); const char *local_fname);
#endif #endif
Execute_load_query_log_event(const char* buf, uint event_len, Execute_load_query_log_event(const char* buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event
*description_event);
~Execute_load_query_log_event() {} ~Execute_load_query_log_event() {}
Log_event_type get_type_code() { return EXECUTE_LOAD_QUERY_EVENT; } Log_event_type get_type_code() { return EXECUTE_LOAD_QUERY_EVENT; }
@ -1967,7 +2001,8 @@ public:
Log_event's ctor, this way we can extract maximum information from the Log_event's ctor, this way we can extract maximum information from the
event's header (the unique ID for example). event's header (the unique ID for example).
*/ */
Unknown_log_event(const char* buf, const Format_description_log_event* description_event): Unknown_log_event(const char* buf,
const Format_description_log_event *description_event):
Log_event(buf, description_event) Log_event(buf, description_event)
{} {}
~Unknown_log_event() {} ~Unknown_log_event() {}

View File

@ -5,7 +5,7 @@
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
int int
Write_rows_log_event_old::do_prepare_row(THD *thd, Write_rows_log_event_old::do_prepare_row(THD *thd_arg,
Relay_log_info const *rli, Relay_log_info const *rli,
TABLE *table, TABLE *table,
uchar const *row_start, uchar const *row_start,
@ -25,7 +25,7 @@ Write_rows_log_event_old::do_prepare_row(THD *thd,
int int
Delete_rows_log_event_old::do_prepare_row(THD *thd, Delete_rows_log_event_old::do_prepare_row(THD *thd_arg,
Relay_log_info const *rli, Relay_log_info const *rli,
TABLE *table, TABLE *table,
uchar const *row_start, uchar const *row_start,
@ -58,7 +58,7 @@ Delete_rows_log_event_old::do_prepare_row(THD *thd,
} }
int Update_rows_log_event_old::do_prepare_row(THD *thd, int Update_rows_log_event_old::do_prepare_row(THD *thd_arg,
Relay_log_info const *rli, Relay_log_info const *rli,
TABLE *table, TABLE *table,
uchar const *row_start, uchar const *row_start,

View File

@ -168,7 +168,7 @@ public:
protected: protected:
Object_creation_ctx() {} Object_creation_ctx() {}
virtual Object_creation_ctx *create_backup_ctx(THD *thd) = 0; virtual Object_creation_ctx *create_backup_ctx(THD *thd) const = 0;
virtual void change_env(THD *thd) const = 0; virtual void change_env(THD *thd) const = 0;
@ -204,7 +204,7 @@ protected:
CHARSET_INFO *connection_cl); CHARSET_INFO *connection_cl);
protected: protected:
virtual Object_creation_ctx *create_backup_ctx(THD *thd); virtual Object_creation_ctx *create_backup_ctx(THD *thd) const;
virtual void change_env(THD *thd) const; virtual void change_env(THD *thd) const;
@ -1642,7 +1642,7 @@ bool key_cmp_if_same(TABLE *form,const uchar *key,uint index,uint key_length);
void key_unpack(String *to,TABLE *form,uint index); void key_unpack(String *to,TABLE *form,uint index);
bool is_key_used(TABLE *table, uint idx, const MY_BITMAP *fields); bool is_key_used(TABLE *table, uint idx, const MY_BITMAP *fields);
int key_cmp(KEY_PART_INFO *key_part, const uchar *key, uint key_length); int key_cmp(KEY_PART_INFO *key_part, const uchar *key, uint key_length);
int key_rec_cmp(void *key_info, uchar *a, uchar *b); extern "C" int key_rec_cmp(void *key_info, uchar *a, uchar *b);
bool init_errmessage(void); bool init_errmessage(void);
#endif /* MYSQL_SERVER */ #endif /* MYSQL_SERVER */

View File

@ -693,7 +693,7 @@ struct st_VioSSLFd *ssl_acceptor_fd;
pthread_handler_t signal_hand(void *arg); pthread_handler_t signal_hand(void *arg);
static void mysql_init_variables(void); static void mysql_init_variables(void);
static void get_options(int *argc,char **argv); static void get_options(int *argc,char **argv);
static my_bool get_one_option(int, const struct my_option *, char *); extern "C" my_bool mysqld_get_one_option(int, const struct my_option *, char *);
static void set_server_version(void); static void set_server_version(void);
static int init_thread_environment(); static int init_thread_environment();
static char *get_relative_path(const char *path); static char *get_relative_path(const char *path);
@ -1141,6 +1141,7 @@ void unireg_end(void)
extern "C" void unireg_abort(int exit_code) extern "C" void unireg_abort(int exit_code)
{ {
DBUG_ENTER("unireg_abort"); DBUG_ENTER("unireg_abort");
if (exit_code) if (exit_code)
sql_print_error("Aborting\n"); sql_print_error("Aborting\n");
else if (opt_help) else if (opt_help)
@ -2353,7 +2354,7 @@ static void init_signals(void)
sigaddset(&set,SIGTSTP); sigaddset(&set,SIGTSTP);
#endif #endif
if (thd_lib_detected != THD_LIB_LT) if (thd_lib_detected != THD_LIB_LT)
sigaddset(&set,THR_SERVER_ALARM); sigaddset(&set,THR_SERVER_ALARM);
if (test_flags & TEST_SIGINT) if (test_flags & TEST_SIGINT)
{ {
// May be SIGINT // May be SIGINT
@ -2549,7 +2550,9 @@ static void check_data_home(const char *path)
/* ARGSUSED */ /* ARGSUSED */
static int my_message_sql(uint error, const char *str, myf MyFlags) extern "C" int my_message_sql(uint error, const char *str, myf MyFlags);
int my_message_sql(uint error, const char *str, myf MyFlags)
{ {
THD *thd; THD *thd;
DBUG_ENTER("my_message_sql"); DBUG_ENTER("my_message_sql");
@ -2612,13 +2615,16 @@ static int my_message_sql(uint error, const char *str, myf MyFlags)
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
static void *my_str_malloc_mysqld(size_t size) extern "C" void *my_str_malloc_mysqld(size_t size);
extern "C" void my_str_free_mysqld(void *ptr);
void *my_str_malloc_mysqld(size_t size)
{ {
return my_malloc(size, MYF(MY_FAE)); return my_malloc(size, MYF(MY_FAE));
} }
static void my_str_free_mysqld(void *ptr) void my_str_free_mysqld(void *ptr)
{ {
my_free((uchar*)ptr, MYF(MY_FAE)); my_free((uchar*)ptr, MYF(MY_FAE));
} }
@ -3418,7 +3424,7 @@ server.");
my_getopt_skip_unknown= 0; my_getopt_skip_unknown= 0;
if ((ho_error= handle_options(&defaults_argc, &tmp_argv, no_opts, if ((ho_error= handle_options(&defaults_argc, &tmp_argv, no_opts,
get_one_option))) mysqld_get_one_option)))
unireg_abort(ho_error); unireg_abort(ho_error);
if (defaults_argc) if (defaults_argc)
@ -3902,7 +3908,6 @@ we force server id to 2, but this MySQL server will not act as a slave.");
*/ */
if (init_slave() && !active_mi) if (init_slave() && !active_mi)
{ {
end_thr_alarm(1); // Don't allow alarms
unireg_abort(1); unireg_abort(1);
} }
@ -3910,16 +3915,12 @@ we force server id to 2, but this MySQL server will not act as a slave.");
{ {
select_thread_in_use= 0; // Allow 'kill' to work select_thread_in_use= 0; // Allow 'kill' to work
bootstrap(stdin); bootstrap(stdin);
end_thr_alarm(1); // Don't allow alarms
unireg_abort(bootstrap_error ? 1 : 0); unireg_abort(bootstrap_error ? 1 : 0);
} }
if (opt_init_file) if (opt_init_file)
{ {
if (read_init_file(opt_init_file)) if (read_init_file(opt_init_file))
{
end_thr_alarm(1); // Don't allow alarms
unireg_abort(1); unireg_abort(1);
}
} }
execute_ddl_log_recovery(); execute_ddl_log_recovery();
@ -6879,6 +6880,7 @@ SHOW_VAR status_vars[]= {
{"Open_streams", (char*) &my_stream_opened, SHOW_LONG_NOFLUSH}, {"Open_streams", (char*) &my_stream_opened, SHOW_LONG_NOFLUSH},
{"Open_table_definitions", (char*) &show_table_definitions, SHOW_FUNC}, {"Open_table_definitions", (char*) &show_table_definitions, SHOW_FUNC},
{"Open_tables", (char*) &show_open_tables, SHOW_FUNC}, {"Open_tables", (char*) &show_open_tables, SHOW_FUNC},
{"Opened_files", (char*) &my_file_total_opened, SHOW_LONG_NOFLUSH},
{"Opened_tables", (char*) offsetof(STATUS_VAR, opened_tables), SHOW_LONG_STATUS}, {"Opened_tables", (char*) offsetof(STATUS_VAR, opened_tables), SHOW_LONG_STATUS},
{"Prepared_stmt_count", (char*) &show_prepared_stmt_count, SHOW_FUNC}, {"Prepared_stmt_count", (char*) &show_prepared_stmt_count, SHOW_FUNC},
#ifdef HAVE_QUERY_CACHE #ifdef HAVE_QUERY_CACHE
@ -7246,9 +7248,10 @@ static void mysql_init_variables(void)
} }
static my_bool my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)), mysqld_get_one_option(int optid,
char *argument) const struct my_option *opt __attribute__((unused)),
char *argument)
{ {
switch(optid) { switch(optid) {
case '#': case '#':
@ -7744,7 +7747,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
/* Handle arguments for multiple key caches */ /* Handle arguments for multiple key caches */
static uchar* * extern "C" uchar **mysql_getopt_value(const char *keyname, uint key_length,
const struct my_option *option);
uchar* *
mysql_getopt_value(const char *keyname, uint key_length, mysql_getopt_value(const char *keyname, uint key_length,
const struct my_option *option) const struct my_option *option)
{ {
@ -7773,11 +7779,19 @@ mysql_getopt_value(const char *keyname, uint key_length,
} }
static void option_error_reporter(enum loglevel level, const char *format, ...) extern "C" void option_error_reporter(enum loglevel level, const char *format, ...);
void option_error_reporter(enum loglevel level, const char *format, ...)
{ {
va_list args; va_list args;
va_start(args, format); va_start(args, format);
vprint_msg_to_log(level, format, args);
/* Don't print warnings for --loose options during bootstrap */
if (level == ERROR_LEVEL || !opt_bootstrap ||
global_system_variables.log_warnings)
{
vprint_msg_to_log(level, format, args);
}
va_end(args); va_end(args);
} }
@ -7795,7 +7809,7 @@ static void get_options(int *argc,char **argv)
my_getopt_skip_unknown= TRUE; my_getopt_skip_unknown= TRUE;
if ((ho_error= handle_options(argc, &argv, my_long_options, if ((ho_error= handle_options(argc, &argv, my_long_options,
get_one_option))) mysqld_get_one_option)))
exit(ho_error); exit(ho_error);
(*argc)++; /* add back one for the progname handle_options removes */ (*argc)++; /* add back one for the progname handle_options removes */
/* no need to do this for argv as we are discarding it. */ /* no need to do this for argv as we are discarding it. */
@ -8156,7 +8170,7 @@ void refresh_status(THD *thd)
add_to_status(&global_status_var, &thd->status_var); add_to_status(&global_status_var, &thd->status_var);
/* Reset thread's status variables */ /* Reset thread's status variables */
bzero((char*) &thd->status_var, sizeof(thd->status_var)); bzero((uchar*) &thd->status_var, sizeof(thd->status_var));
/* Reset some global variables */ /* Reset some global variables */
reset_status_vars(); reset_status_vars();

View File

@ -8375,7 +8375,8 @@ int QUICK_RANGE_SELECT::get_next_prefix(uint prefix_length,
{ {
/* Read the next record in the same range with prefix after cur_prefix. */ /* Read the next record in the same range with prefix after cur_prefix. */
DBUG_ASSERT(cur_prefix != 0); DBUG_ASSERT(cur_prefix != 0);
result= file->index_read(record, cur_prefix, keypart_map, HA_READ_AFTER_KEY); result= file->index_read_map(record, cur_prefix, keypart_map,
HA_READ_AFTER_KEY);
if (result || (file->compare_key(file->end_range) <= 0)) if (result || (file->compare_key(file->end_range) <= 0))
DBUG_RETURN(result); DBUG_RETURN(result);
} }
@ -8446,9 +8447,10 @@ int QUICK_RANGE_SELECT_GEOM::get_next()
} }
last_range= *(cur_range++); last_range= *(cur_range++);
result= file->index_read(record, last_range->min_key, result= file->index_read_map(record, last_range->min_key,
last_range->min_keypart_map, last_range->min_keypart_map,
(ha_rkey_function)(last_range->flag ^ GEOM_FLAG)); (ha_rkey_function)(last_range->flag ^
GEOM_FLAG));
if (result != HA_ERR_KEY_NOT_FOUND && result != HA_ERR_END_OF_FILE) if (result != HA_ERR_KEY_NOT_FOUND && result != HA_ERR_END_OF_FILE)
DBUG_RETURN(result); DBUG_RETURN(result);
last_range= 0; // Not found, to next range last_range= 0; // Not found, to next range
@ -8579,18 +8581,19 @@ int QUICK_SELECT_DESC::get_next()
if (last_range->flag & EQ_RANGE) if (last_range->flag & EQ_RANGE)
{ {
result = file->index_read(record, last_range->max_key, result = file->index_read_map(record, last_range->max_key,
last_range->max_keypart_map, HA_READ_KEY_EXACT); last_range->max_keypart_map,
HA_READ_KEY_EXACT);
} }
else else
{ {
DBUG_ASSERT(last_range->flag & NEAR_MAX || DBUG_ASSERT(last_range->flag & NEAR_MAX ||
range_reads_after_key(last_range)); range_reads_after_key(last_range));
result=file->index_read(record, last_range->max_key, result=file->index_read_map(record, last_range->max_key,
last_range->max_keypart_map, last_range->max_keypart_map,
((last_range->flag & NEAR_MAX) ? ((last_range->flag & NEAR_MAX) ?
HA_READ_BEFORE_KEY : HA_READ_BEFORE_KEY :
HA_READ_PREFIX_LAST_OR_PREV)); HA_READ_PREFIX_LAST_OR_PREV));
} }
if (result) if (result)
{ {
@ -10446,9 +10449,9 @@ int QUICK_GROUP_MIN_MAX_SELECT::get_next()
first sub-group with the extended prefix. first sub-group with the extended prefix.
*/ */
if (!have_min && !have_max && key_infix_len > 0) if (!have_min && !have_max && key_infix_len > 0)
result= file->index_read(record, group_prefix, result= file->index_read_map(record, group_prefix,
make_prev_keypart_map(real_key_parts), make_prev_keypart_map(real_key_parts),
HA_READ_KEY_EXACT); HA_READ_KEY_EXACT);
result= have_min ? min_res : have_max ? max_res : result; result= have_min ? min_res : have_max ? max_res : result;
} while ((result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE) && } while ((result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE) &&
@ -10510,9 +10513,9 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_min()
/* Apply the constant equality conditions to the non-group select fields */ /* Apply the constant equality conditions to the non-group select fields */
if (key_infix_len > 0) if (key_infix_len > 0)
{ {
if ((result= file->index_read(record, group_prefix, if ((result= file->index_read_map(record, group_prefix,
make_prev_keypart_map(real_key_parts), make_prev_keypart_map(real_key_parts),
HA_READ_KEY_EXACT))) HA_READ_KEY_EXACT)))
DBUG_RETURN(result); DBUG_RETURN(result);
} }
@ -10527,9 +10530,9 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_min()
{ {
/* Find the first subsequent record without NULL in the MIN/MAX field. */ /* Find the first subsequent record without NULL in the MIN/MAX field. */
key_copy(tmp_record, record, index_info, 0); key_copy(tmp_record, record, index_info, 0);
result= file->index_read(record, tmp_record, result= file->index_read_map(record, tmp_record,
make_keypart_map(real_key_parts), make_keypart_map(real_key_parts),
HA_READ_AFTER_KEY); HA_READ_AFTER_KEY);
/* /*
Check if the new record belongs to the current group by comparing its Check if the new record belongs to the current group by comparing its
prefix with the group's prefix. If it is from the next group, then the prefix with the group's prefix. If it is from the next group, then the
@ -10584,9 +10587,9 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_max()
if (min_max_ranges.elements > 0) if (min_max_ranges.elements > 0)
result= next_max_in_range(); result= next_max_in_range();
else else
result= file->index_read(record, group_prefix, result= file->index_read_map(record, group_prefix,
make_prev_keypart_map(real_key_parts), make_prev_keypart_map(real_key_parts),
HA_READ_PREFIX_LAST); HA_READ_PREFIX_LAST);
DBUG_RETURN(result); DBUG_RETURN(result);
} }
@ -10637,9 +10640,9 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_prefix()
else else
{ {
/* Load the first key in this group into record. */ /* Load the first key in this group into record. */
result= file->index_read(record, group_prefix, result= file->index_read_map(record, group_prefix,
make_prev_keypart_map(group_key_parts), make_prev_keypart_map(group_key_parts),
HA_READ_AFTER_KEY); HA_READ_AFTER_KEY);
if (result) if (result)
DBUG_RETURN(result); DBUG_RETURN(result);
} }
@ -10716,7 +10719,7 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_min_in_range()
HA_READ_AFTER_KEY : HA_READ_KEY_OR_NEXT; HA_READ_AFTER_KEY : HA_READ_KEY_OR_NEXT;
} }
result= file->index_read(record, group_prefix, keypart_map, find_flag); result= file->index_read_map(record, group_prefix, keypart_map, find_flag);
if (result) if (result)
{ {
if ((result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE) && if ((result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE) &&
@ -10849,7 +10852,7 @@ int QUICK_GROUP_MIN_MAX_SELECT::next_max_in_range()
HA_READ_BEFORE_KEY : HA_READ_PREFIX_LAST_OR_PREV; HA_READ_BEFORE_KEY : HA_READ_PREFIX_LAST_OR_PREV;
} }
result= file->index_read(record, group_prefix, keypart_map, find_flag); result= file->index_read_map(record, group_prefix, keypart_map, find_flag);
if (result) if (result)
{ {

View File

@ -270,9 +270,10 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
Closed interval: Either The MIN argument is non-nullable, or Closed interval: Either The MIN argument is non-nullable, or
we have a >= predicate for the MIN argument. we have a >= predicate for the MIN argument.
*/ */
error= table->file->index_read(table->record[0], ref.key_buff, error= table->file->index_read_map(table->record[0],
make_prev_keypart_map(ref.key_parts), ref.key_buff,
HA_READ_KEY_OR_NEXT); make_prev_keypart_map(ref.key_parts),
HA_READ_KEY_OR_NEXT);
else else
{ {
/* /*
@ -281,9 +282,10 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
2) there is a > predicate on it, nullability is irrelevant. 2) there is a > predicate on it, nullability is irrelevant.
We need to scan the next bigger record first. We need to scan the next bigger record first.
*/ */
error= table->file->index_read(table->record[0], ref.key_buff, error= table->file->index_read_map(table->record[0],
make_prev_keypart_map(ref.key_parts), ref.key_buff,
HA_READ_AFTER_KEY); make_prev_keypart_map(ref.key_parts),
HA_READ_AFTER_KEY);
/* /*
If the found record is outside the group formed by the search If the found record is outside the group formed by the search
prefix, or there is no such record at all, check if all prefix, or there is no such record at all, check if all
@ -305,9 +307,10 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
key_cmp_if_same(table, ref.key_buff, ref.key, prefix_len))) key_cmp_if_same(table, ref.key_buff, ref.key, prefix_len)))
{ {
DBUG_ASSERT(item_field->field->real_maybe_null()); DBUG_ASSERT(item_field->field->real_maybe_null());
error= table->file->index_read(table->record[0], ref.key_buff, error= table->file->index_read_map(table->record[0],
make_prev_keypart_map(ref.key_parts), ref.key_buff,
HA_READ_KEY_EXACT); make_prev_keypart_map(ref.key_parts),
HA_READ_KEY_EXACT);
} }
} }
} }
@ -394,11 +397,11 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
if (!ref.key_length) if (!ref.key_length)
error= table->file->index_last(table->record[0]); error= table->file->index_last(table->record[0]);
else else
error= table->file->index_read(table->record[0], key_buff, error= table->file->index_read_map(table->record[0], key_buff,
make_prev_keypart_map(ref.key_parts), make_prev_keypart_map(ref.key_parts),
range_fl & NEAR_MAX ? range_fl & NEAR_MAX ?
HA_READ_BEFORE_KEY : HA_READ_BEFORE_KEY :
HA_READ_PREFIX_LAST_OR_PREV); HA_READ_PREFIX_LAST_OR_PREV);
if (!error && reckey_in_range(1, &ref, item_field->field, if (!error && reckey_in_range(1, &ref, item_field->field,
conds, range_fl, prefix_len)) conds, range_fl, prefix_len))
error= HA_ERR_KEY_NOT_FOUND; error= HA_ERR_KEY_NOT_FOUND;

View File

@ -91,10 +91,10 @@ partition_info *partition_info::get_clone()
#define MAX_PART_NAME_SIZE 8 #define MAX_PART_NAME_SIZE 8
char *partition_info::create_default_partition_names(uint part_no, char *partition_info::create_default_partition_names(uint part_no,
uint no_parts, uint no_parts_arg,
uint start_no) uint start_no)
{ {
char *ptr= (char*) sql_calloc(no_parts*MAX_PART_NAME_SIZE); char *ptr= (char*) sql_calloc(no_parts_arg*MAX_PART_NAME_SIZE);
char *move_ptr= ptr; char *move_ptr= ptr;
uint i= 0; uint i= 0;
DBUG_ENTER("create_default_partition_names"); DBUG_ENTER("create_default_partition_names");
@ -105,11 +105,11 @@ char *partition_info::create_default_partition_names(uint part_no,
{ {
my_sprintf(move_ptr, (move_ptr,"p%u", (start_no + i))); my_sprintf(move_ptr, (move_ptr,"p%u", (start_no + i)));
move_ptr+=MAX_PART_NAME_SIZE; move_ptr+=MAX_PART_NAME_SIZE;
} while (++i < no_parts); } while (++i < no_parts_arg);
} }
else else
{ {
mem_alloc_error(no_parts*MAX_PART_NAME_SIZE); mem_alloc_error(no_parts_arg*MAX_PART_NAME_SIZE);
} }
DBUG_RETURN(ptr); DBUG_RETURN(ptr);
} }

View File

@ -362,9 +362,11 @@ Rpl_filter::add_ignore_db(const char* table_spec)
ignore_db.push_back(db); ignore_db.push_back(db);
} }
extern "C" uchar *get_table_key(const uchar *, size_t *, my_bool);
extern "C" void free_table_ent(void* a);
static uchar* get_table_key(const uchar* a, size_t *len, uchar *get_table_key(const uchar* a, size_t *len,
my_bool __attribute__((unused))) my_bool __attribute__((unused)))
{ {
TABLE_RULE_ENT *e= (TABLE_RULE_ENT *) a; TABLE_RULE_ENT *e= (TABLE_RULE_ENT *) a;
@ -373,7 +375,7 @@ static uchar* get_table_key(const uchar* a, size_t *len,
} }
static void free_table_ent(void* a) void free_table_ent(void* a)
{ {
TABLE_RULE_ENT *e= (TABLE_RULE_ENT *) a; TABLE_RULE_ENT *e= (TABLE_RULE_ENT *) a;

View File

@ -3266,11 +3266,12 @@ bool sys_var_thd_storage_engine::check(THD *thd, set_var *var)
var->save_result.plugin= NULL; var->save_result.plugin= NULL;
if (var->value->result_type() == STRING_RESULT) if (var->value->result_type() == STRING_RESULT)
{ {
LEX_STRING name; LEX_STRING engine_name;
handlerton *hton; handlerton *hton;
if (!(res=var->value->val_str(&str)) || if (!(res=var->value->val_str(&str)) ||
!(name.str= (char *)res->ptr()) || !(name.length= res->length()) || !(engine_name.str= (char *)res->ptr()) ||
!(var->save_result.plugin= ha_resolve_by_name(thd, &name)) || !(engine_name.length= res->length()) ||
!(var->save_result.plugin= ha_resolve_by_name(thd, &engine_name)) ||
!(hton= plugin_data(var->save_result.plugin, handlerton *)) || !(hton= plugin_data(var->save_result.plugin, handlerton *)) ||
ha_checktype(thd, ha_legacy_type(hton), 1, 0) != hton) ha_checktype(thd, ha_legacy_type(hton), 1, 0) != hton)
{ {
@ -3292,13 +3293,13 @@ uchar *sys_var_thd_storage_engine::value_ptr(THD *thd, enum_var_type type,
{ {
uchar* result; uchar* result;
handlerton *hton; handlerton *hton;
LEX_STRING *name; LEX_STRING *engine_name;
plugin_ref plugin= thd->variables.*offset; plugin_ref plugin= thd->variables.*offset;
if (type == OPT_GLOBAL) if (type == OPT_GLOBAL)
plugin= my_plugin_lock(thd, &(global_system_variables.*offset)); plugin= my_plugin_lock(thd, &(global_system_variables.*offset));
hton= plugin_data(plugin, handlerton*); hton= plugin_data(plugin, handlerton*);
name= &hton2plugin[hton->slot]->name; engine_name= &hton2plugin[hton->slot]->name;
result= (uchar *) thd->strmake(name->str, name->length); result= (uchar *) thd->strmake(engine_name->str, engine_name->length);
if (type == OPT_GLOBAL) if (type == OPT_GLOBAL)
plugin_unlock(thd, plugin); plugin_unlock(thd, plugin);
return result; return result;
@ -3585,7 +3586,7 @@ void free_key_cache(const char *name, KEY_CACHE *key_cache)
} }
bool process_key_caches(int (* func) (const char *name, KEY_CACHE *)) bool process_key_caches(process_key_cache_t func)
{ {
I_List_iterator<NAMED_LIST> it(key_caches); I_List_iterator<NAMED_LIST> it(key_caches);
NAMED_LIST *element; NAMED_LIST *element;

View File

@ -1128,6 +1128,11 @@ public:
}; };
extern "C"
{
typedef int (*process_key_cache_t) (const char *, KEY_CACHE *);
}
/* Named lists (used for keycaches) */ /* Named lists (used for keycaches) */
class NAMED_LIST :public ilink class NAMED_LIST :public ilink
@ -1152,8 +1157,7 @@ public:
{ {
my_free((uchar*) name, MYF(0)); my_free((uchar*) name, MYF(0));
} }
friend bool process_key_caches(int (* func) (const char *name, friend bool process_key_caches(process_key_cache_t func);
KEY_CACHE *));
friend void delete_elements(I_List<NAMED_LIST> *list, friend void delete_elements(I_List<NAMED_LIST> *list,
void (*free_element)(const char*, uchar*)); void (*free_element)(const char*, uchar*));
}; };
@ -1201,6 +1205,6 @@ extern sys_var_str sys_var_general_log_path, sys_var_slow_log_path;
KEY_CACHE *get_key_cache(LEX_STRING *cache_name); KEY_CACHE *get_key_cache(LEX_STRING *cache_name);
KEY_CACHE *get_or_create_key_cache(const char *name, uint length); KEY_CACHE *get_or_create_key_cache(const char *name, uint length);
void free_key_cache(const char *name, KEY_CACHE *key_cache); void free_key_cache(const char *name, KEY_CACHE *key_cache);
bool process_key_caches(int (* func) (const char *name, KEY_CACHE *)); bool process_key_caches(process_key_cache_t func);
void delete_elements(I_List<NAMED_LIST> *list, void delete_elements(I_List<NAMED_LIST> *list,
void (*free_element)(const char*, uchar*)); void (*free_element)(const char*, uchar*));

View File

@ -97,7 +97,8 @@ public:
protected: protected:
virtual Object_creation_ctx *create_backup_ctx(THD *thd) const virtual Object_creation_ctx *create_backup_ctx(THD *thd) const
{ {
return new Stored_routine_creation_ctx(thd); DBUG_ENTER("Stored_routine_creation_ctx::create_backup_ctx");
DBUG_RETURN(new Stored_routine_creation_ctx(thd));
} }
private: private:
@ -348,8 +349,8 @@ db_find_routine_aux(THD *thd, int type, sp_name *name, TABLE *table)
key_copy(key, table->record[0], table->key_info, key_copy(key, table->record[0], table->key_info,
table->key_info->key_length); table->key_info->key_length);
if (table->file->index_read_idx(table->record[0], 0, key, HA_WHOLE_KEY, if (table->file->index_read_idx_map(table->record[0], 0, key, HA_WHOLE_KEY,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
DBUG_RETURN(SP_KEY_NOT_FOUND); DBUG_RETURN(SP_KEY_NOT_FOUND);
DBUG_RETURN(SP_OK); DBUG_RETURN(SP_OK);
@ -1182,9 +1183,9 @@ sp_drop_db_routines(THD *thd, char *db)
ret= SP_OK; ret= SP_OK;
table->file->ha_index_init(0, 1); table->file->ha_index_init(0, 1);
if (! table->file->index_read(table->record[0], if (! table->file->index_read_map(table->record[0],
(uchar *)table->field[MYSQL_PROC_FIELD_DB]->ptr, (uchar *)table->field[MYSQL_PROC_FIELD_DB]->ptr,
(key_part_map)1, HA_READ_KEY_EXACT)) (key_part_map)1, HA_READ_KEY_EXACT))
{ {
int nxtres; int nxtres;
bool deleted= FALSE; bool deleted= FALSE;

View File

@ -214,8 +214,12 @@ void sp_cache_flush_obsolete(sp_cache **cp)
Internal functions Internal functions
*************************************************************************/ *************************************************************************/
static uchar *hash_get_key_for_sp_head(const uchar *ptr, size_t *plen, extern "C" uchar *hash_get_key_for_sp_head(const uchar *ptr, size_t *plen,
my_bool first) my_bool first);
extern "C" void hash_free_sp_head(void *p);
uchar *hash_get_key_for_sp_head(const uchar *ptr, size_t *plen,
my_bool first)
{ {
sp_head *sp= (sp_head *)ptr; sp_head *sp= (sp_head *)ptr;
*plen= sp->m_qname.length; *plen= sp->m_qname.length;
@ -223,8 +227,7 @@ static uchar *hash_get_key_for_sp_head(const uchar *ptr, size_t *plen,
} }
static void void hash_free_sp_head(void *p)
hash_free_sp_head(void *p)
{ {
sp_head *sp= (sp_head *)p; sp_head *sp= (sp_head *)p;
delete sp; delete sp;

View File

@ -32,6 +32,8 @@
#include <my_user.h> #include <my_user.h>
extern "C" uchar *sp_table_key(const uchar *ptr, size_t *plen, my_bool first);
Item_result Item_result
sp_map_result_type(enum enum_field_types type) sp_map_result_type(enum enum_field_types type)
{ {
@ -483,7 +485,6 @@ sp_head::sp_head()
*/ */
m_db= m_name= m_qname= str_reset; m_db= m_name= m_qname= str_reset;
extern uchar *sp_table_key(const uchar *ptr, size_t *plen, my_bool first);
DBUG_ENTER("sp_head::sp_head"); DBUG_ENTER("sp_head::sp_head");
m_backpatch.empty(); m_backpatch.empty();
@ -1077,6 +1078,12 @@ sp_head::execute(THD *thd)
thd->query_error= 0; thd->query_error= 0;
old_arena= thd->stmt_arena; old_arena= thd->stmt_arena;
/*
Switch query context. This has to be done early as this is sometimes
allocated trough sql_alloc
*/
saved_creation_ctx= m_creation_ctx->set_n_backup(thd);
/* /*
We have to save/restore this info when we are changing call level to We have to save/restore this info when we are changing call level to
be able properly do close_thread_tables() in instructions. be able properly do close_thread_tables() in instructions.
@ -1122,10 +1129,6 @@ sp_head::execute(THD *thd)
*/ */
thd->spcont->callers_arena= &backup_arena; thd->spcont->callers_arena= &backup_arena;
/* Switch query context. */
saved_creation_ctx= m_creation_ctx->set_n_backup(thd);
do do
{ {
sp_instr *i; sp_instr *i;
@ -3602,8 +3605,8 @@ typedef struct st_sp_table
uint8 trg_event_map; uint8 trg_event_map;
} SP_TABLE; } SP_TABLE;
uchar *
sp_table_key(const uchar *ptr, size_t *plen, my_bool first) uchar *sp_table_key(const uchar *ptr, size_t *plen, my_bool first)
{ {
SP_TABLE *tab= (SP_TABLE *)ptr; SP_TABLE *tab= (SP_TABLE *)ptr;
*plen= tab->qname.length; *plen= tab->qname.length;

View File

@ -1815,9 +1815,9 @@ static bool update_user_table(THD *thd, TABLE *table,
key_copy((uchar *) user_key, table->record[0], table->key_info, key_copy((uchar *) user_key, table->record[0], table->key_info,
table->key_info->key_length); table->key_info->key_length);
if (table->file->index_read_idx(table->record[0], 0, if (table->file->index_read_idx_map(table->record[0], 0,
(uchar *) user_key, HA_WHOLE_KEY, (uchar *) user_key, HA_WHOLE_KEY,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
{ {
my_message(ER_PASSWORD_NO_MATCH, ER(ER_PASSWORD_NO_MATCH), my_message(ER_PASSWORD_NO_MATCH, ER(ER_PASSWORD_NO_MATCH),
MYF(0)); /* purecov: deadcode */ MYF(0)); /* purecov: deadcode */
@ -1908,8 +1908,9 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
key_copy(user_key, table->record[0], table->key_info, key_copy(user_key, table->record[0], table->key_info,
table->key_info->key_length); table->key_info->key_length);
if (table->file->index_read_idx(table->record[0], 0, user_key, HA_WHOLE_KEY, if (table->file->index_read_idx_map(table->record[0], 0, user_key,
HA_READ_KEY_EXACT)) HA_WHOLE_KEY,
HA_READ_KEY_EXACT))
{ {
/* what == 'N' means revoke */ /* what == 'N' means revoke */
if (what == 'N') if (what == 'N')
@ -2131,8 +2132,9 @@ static int replace_db_table(TABLE *table, const char *db,
key_copy(user_key, table->record[0], table->key_info, key_copy(user_key, table->record[0], table->key_info,
table->key_info->key_length); table->key_info->key_length);
if (table->file->index_read_idx(table->record[0],0, user_key, HA_WHOLE_KEY, if (table->file->index_read_idx_map(table->record[0],0, user_key,
HA_READ_KEY_EXACT)) HA_WHOLE_KEY,
HA_READ_KEY_EXACT))
{ {
if (what == 'N') if (what == 'N')
{ // no row, no revoke { // no row, no revoke
@ -2348,8 +2350,8 @@ GRANT_TABLE::GRANT_TABLE(TABLE *form, TABLE *col_privs)
col_privs->field[4]->store("",0, &my_charset_latin1); col_privs->field[4]->store("",0, &my_charset_latin1);
col_privs->file->ha_index_init(0, 1); col_privs->file->ha_index_init(0, 1);
if (col_privs->file->index_read(col_privs->record[0], (uchar*) key, if (col_privs->file->index_read_map(col_privs->record[0], (uchar*) key,
(key_part_map)15, HA_READ_KEY_EXACT)) (key_part_map)15, HA_READ_KEY_EXACT))
{ {
cols = 0; /* purecov: deadcode */ cols = 0; /* purecov: deadcode */
col_privs->file->ha_index_end(); col_privs->file->ha_index_end();
@ -2511,8 +2513,8 @@ static int replace_column_table(GRANT_TABLE *g_t,
key_copy(user_key, table->record[0], table->key_info, key_copy(user_key, table->record[0], table->key_info,
table->key_info->key_length); table->key_info->key_length);
if (table->file->index_read(table->record[0], user_key, HA_WHOLE_KEY, if (table->file->index_read_map(table->record[0], user_key, HA_WHOLE_KEY,
HA_READ_KEY_EXACT)) HA_READ_KEY_EXACT))
{ {
if (revoke_grant) if (revoke_grant)
{ {
@ -2589,8 +2591,9 @@ static int replace_column_table(GRANT_TABLE *g_t,
key_copy(user_key, table->record[0], table->key_info, key_copy(user_key, table->record[0], table->key_info,
key_prefix_length); key_prefix_length);
if (table->file->index_read(table->record[0], user_key, (key_part_map)15, if (table->file->index_read_map(table->record[0], user_key,
HA_READ_KEY_EXACT)) (key_part_map)15,
HA_READ_KEY_EXACT))
goto end; goto end;
/* Scan through all rows with the same host,db,user and table */ /* Scan through all rows with the same host,db,user and table */
@ -2691,8 +2694,9 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
key_copy(user_key, table->record[0], table->key_info, key_copy(user_key, table->record[0], table->key_info,
table->key_info->key_length); table->key_info->key_length);
if (table->file->index_read_idx(table->record[0], 0, user_key, HA_WHOLE_KEY, if (table->file->index_read_idx_map(table->record[0], 0, user_key,
HA_READ_KEY_EXACT)) HA_WHOLE_KEY,
HA_READ_KEY_EXACT))
{ {
/* /*
The following should never happen as we first check the in memory The following should never happen as we first check the in memory
@ -2816,9 +2820,10 @@ static int replace_routine_table(THD *thd, GRANT_NAME *grant_name,
TRUE); TRUE);
store_record(table,record[1]); // store at pos 1 store_record(table,record[1]); // store at pos 1
if (table->file->index_read_idx(table->record[0], 0, if (table->file->index_read_idx_map(table->record[0], 0,
(uchar*) table->field[0]->ptr, HA_WHOLE_KEY, (uchar*) table->field[0]->ptr,
HA_READ_KEY_EXACT)) HA_WHOLE_KEY,
HA_READ_KEY_EXACT))
{ {
/* /*
The following should never happen as we first check the in memory The following should never happen as we first check the in memory
@ -5015,9 +5020,9 @@ static int handle_grant_table(TABLE_LIST *tables, uint table_no, bool drop,
table->key_info->key_part[1].store_length); table->key_info->key_part[1].store_length);
key_copy(user_key, table->record[0], table->key_info, key_prefix_length); key_copy(user_key, table->record[0], table->key_info, key_prefix_length);
if ((error= table->file->index_read_idx(table->record[0], 0, if ((error= table->file->index_read_idx_map(table->record[0], 0,
user_key, (key_part_map)3, user_key, (key_part_map)3,
HA_READ_KEY_EXACT))) HA_READ_KEY_EXACT)))
{ {
if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
{ {

View File

@ -2730,14 +2730,17 @@ void mark_transaction_to_rollback(THD *thd, bool all)
pthread_mutex_t LOCK_xid_cache; pthread_mutex_t LOCK_xid_cache;
HASH xid_cache; HASH xid_cache;
static uchar *xid_get_hash_key(const uchar *ptr, size_t *length, extern "C" uchar *xid_get_hash_key(const uchar *, size_t *, my_bool);
extern "C" void xid_free_hash(void *);
uchar *xid_get_hash_key(const uchar *ptr, size_t *length,
my_bool not_used __attribute__((unused))) my_bool not_used __attribute__((unused)))
{ {
*length=((XID_STATE*)ptr)->xid.key_length(); *length=((XID_STATE*)ptr)->xid.key_length();
return ((XID_STATE*)ptr)->xid.key(); return ((XID_STATE*)ptr)->xid.key();
} }
static void xid_free_hash (void *ptr) void xid_free_hash(void *ptr)
{ {
if (!((XID_STATE*)ptr)->in_thd) if (!((XID_STATE*)ptr)->in_thd)
my_free((uchar*)ptr, MYF(0)); my_free((uchar*)ptr, MYF(0));
@ -3271,13 +3274,13 @@ int THD::binlog_flush_pending_rows_event(bool stmt_end)
RETURN VALUE RETURN VALUE
Error code, or 0 if no error. Error code, or 0 if no error.
*/ */
int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query, int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query_arg,
ulong query_len, bool is_trans, bool suppress_use, ulong query_len, bool is_trans, bool suppress_use,
THD::killed_state killed_status_arg) THD::killed_state killed_status_arg)
{ {
DBUG_ENTER("THD::binlog_query"); DBUG_ENTER("THD::binlog_query");
DBUG_PRINT("enter", ("qtype=%d, query='%s'", qtype, query)); DBUG_PRINT("enter", ("qtype: %d query: '%s'", qtype, query_arg));
DBUG_ASSERT(query && mysql_bin_log.is_open()); DBUG_ASSERT(query_arg && mysql_bin_log.is_open());
/* /*
If we are not in prelocked mode, mysql_unlock_tables() will be If we are not in prelocked mode, mysql_unlock_tables() will be
@ -3333,7 +3336,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query,
flush the pending rows event if necessary. flush the pending rows event if necessary.
*/ */
{ {
Query_log_event qinfo(this, query, query_len, is_trans, suppress_use, Query_log_event qinfo(this, query_arg, query_len, is_trans, suppress_use,
killed_status_arg); killed_status_arg);
qinfo.flags|= LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F; qinfo.flags|= LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F;
/* /*

View File

@ -1317,10 +1317,10 @@ public:
mode, row-based binlogging is used for such cases where two mode, row-based binlogging is used for such cases where two
auto_increment columns are inserted. auto_increment columns are inserted.
*/ */
inline void record_first_successful_insert_id_in_cur_stmt(ulonglong id) inline void record_first_successful_insert_id_in_cur_stmt(ulonglong id_arg)
{ {
if (first_successful_insert_id_in_cur_stmt == 0) if (first_successful_insert_id_in_cur_stmt == 0)
first_successful_insert_id_in_cur_stmt= id; first_successful_insert_id_in_cur_stmt= id_arg;
} }
inline ulonglong read_first_successful_insert_id_in_prev_stmt(void) inline ulonglong read_first_successful_insert_id_in_prev_stmt(void)
{ {

View File

@ -59,8 +59,10 @@ typedef struct my_dblock_st
lock_db key. lock_db key.
*/ */
static uchar* lock_db_get_key(my_dblock_t *ptr, size_t *length, extern "C" uchar* lock_db_get_key(my_dblock_t *, size_t *, my_bool not_used);
my_bool not_used __attribute__((unused)))
uchar* lock_db_get_key(my_dblock_t *ptr, size_t *length,
my_bool not_used __attribute__((unused)))
{ {
*length= ptr->name_length; *length= ptr->name_length;
return (uchar*) ptr->name; return (uchar*) ptr->name;
@ -71,7 +73,9 @@ static uchar* lock_db_get_key(my_dblock_t *ptr, size_t *length,
Free lock_db hash element. Free lock_db hash element.
*/ */
static void lock_db_free_element(void *ptr) extern "C" void lock_db_free_element(void *ptr);
void lock_db_free_element(void *ptr)
{ {
my_free(ptr, MYF(0)); my_free(ptr, MYF(0));
} }
@ -155,8 +159,11 @@ typedef struct my_dbopt_st
Function we use in the creation of our hash to get key. Function we use in the creation of our hash to get key.
*/ */
static uchar* dboptions_get_key(my_dbopt_t *opt, size_t *length, extern "C" uchar* dboptions_get_key(my_dbopt_t *opt, size_t *length,
my_bool not_used __attribute__((unused))) my_bool not_used);
uchar* dboptions_get_key(my_dbopt_t *opt, size_t *length,
my_bool not_used __attribute__((unused)))
{ {
*length= opt->name_length; *length= opt->name_length;
return (uchar*) opt->name; return (uchar*) opt->name;
@ -182,7 +189,9 @@ static inline void write_to_binlog(THD *thd, char *query, uint q_len,
Function to free dboptions hash element Function to free dboptions hash element
*/ */
static void free_dbopt(void *dbopt) extern "C" void free_dbopt(void *dbopt);
void free_dbopt(void *dbopt)
{ {
my_free((uchar*) dbopt, MYF(0)); my_free((uchar*) dbopt, MYF(0));
} }

View File

@ -760,7 +760,7 @@ void multi_delete::send_error(uint errcode,const char *err)
int multi_delete::do_deletes() int multi_delete::do_deletes()
{ {
int local_error= 0, counter= 0, error; int local_error= 0, counter= 0, tmp_error;
bool will_batch; bool will_batch;
DBUG_ENTER("do_deletes"); DBUG_ENTER("do_deletes");
DBUG_ASSERT(do_delete); DBUG_ASSERT(do_delete);
@ -814,11 +814,11 @@ int multi_delete::do_deletes()
break; break;
} }
} }
if (will_batch && (error= table->file->end_bulk_delete())) if (will_batch && (tmp_error= table->file->end_bulk_delete()))
{ {
if (!local_error) if (!local_error)
{ {
local_error= error; local_error= tmp_error;
table->file->print_error(local_error,MYF(0)); table->file->print_error(local_error,MYF(0));
} }
} }

View File

@ -541,8 +541,8 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
table->file->ha_index_or_rnd_end(); table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno, 1); table->file->ha_index_init(keyno, 1);
key_copy(key, table->record[0], table->key_info + keyno, key_len); key_copy(key, table->record[0], table->key_info + keyno, key_len);
error= table->file->index_read(table->record[0], error= table->file->index_read_map(table->record[0],
key, keypart_map, ha_rkey_mode); key, keypart_map, ha_rkey_mode);
mode=rkey_to_rnext[(int)ha_rkey_mode]; mode=rkey_to_rnext[(int)ha_rkey_mode];
break; break;
} }

View File

@ -294,9 +294,9 @@ int get_topics_for_keyword(THD *thd, TABLE *topics, TABLE *relations,
rkey_id->store((longlong) key_id, TRUE); rkey_id->store((longlong) key_id, TRUE);
rkey_id->get_key_image(buff, rkey_id->pack_length(), Field::itRAW); rkey_id->get_key_image(buff, rkey_id->pack_length(), Field::itRAW);
int key_res= relations->file->index_read(relations->record[0], int key_res= relations->file->index_read_map(relations->record[0],
buff, (key_part_map) 1, buff, (key_part_map) 1,
HA_READ_KEY_EXACT); HA_READ_KEY_EXACT);
for ( ; for ( ;
!key_res && key_id == (int16) rkey_id->val_int() ; !key_res && key_id == (int16) rkey_id->val_int() ;
@ -308,8 +308,8 @@ int get_topics_for_keyword(THD *thd, TABLE *topics, TABLE *relations,
field->store((longlong) topic_id, TRUE); field->store((longlong) topic_id, TRUE);
field->get_key_image(topic_id_buff, field->pack_length(), Field::itRAW); field->get_key_image(topic_id_buff, field->pack_length(), Field::itRAW);
if (!topics->file->index_read(topics->record[0], topic_id_buff, if (!topics->file->index_read_map(topics->record[0], topic_id_buff,
(key_part_map)1, HA_READ_KEY_EXACT)) (key_part_map)1, HA_READ_KEY_EXACT))
{ {
memorize_variant_topic(thd,topics,count,find_fields, memorize_variant_topic(thd,topics,count,find_fields,
names,name,description,example); names,name,description,example);

View File

@ -1398,9 +1398,9 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
} }
} }
key_copy((uchar*) key,table->record[0],table->key_info+key_nr,0); key_copy((uchar*) key,table->record[0],table->key_info+key_nr,0);
if ((error=(table->file->index_read_idx(table->record[1],key_nr, if ((error=(table->file->index_read_idx_map(table->record[1],key_nr,
(uchar*) key, HA_WHOLE_KEY, (uchar*) key, HA_WHOLE_KEY,
HA_READ_KEY_EXACT)))) HA_READ_KEY_EXACT))))
goto err; goto err;
} }
if (info->handle_duplicates == DUP_UPDATE) if (info->handle_duplicates == DUP_UPDATE)
@ -3556,13 +3556,13 @@ select_create::binlog_show_create_table(TABLE **tables, uint count)
char buf[2048]; char buf[2048];
String query(buf, sizeof(buf), system_charset_info); String query(buf, sizeof(buf), system_charset_info);
int result; int result;
TABLE_LIST table_list; TABLE_LIST tmp_table_list;
memset(&table_list, 0, sizeof(table_list)); memset(&tmp_table_list, 0, sizeof(tmp_table_list));
table_list.table = *tables; tmp_table_list.table = *tables;
query.length(0); // Have to zero it since constructor doesn't query.length(0); // Have to zero it since constructor doesn't
result= store_create_info(thd, &table_list, &query, create_info); result= store_create_info(thd, &tmp_table_list, &query, create_info);
DBUG_ASSERT(result == 0); /* store_create_info() always return 0 */ DBUG_ASSERT(result == 0); /* store_create_info() always return 0 */
thd->binlog_query(THD::STMT_QUERY_TYPE, thd->binlog_query(THD::STMT_QUERY_TYPE,

View File

@ -2826,8 +2826,8 @@ void st_select_lex::fix_prepare_information(THD *thd, Item **conds,
SYNOPSIS SYNOPSIS
set_index_hint_type() set_index_hint_type()
type the kind of hints to be added from now on. type_arg The kind of hints to be added from now on.
clause the clause to use for hints to be added from now on. clause The clause to use for hints to be added from now on.
DESCRIPTION DESCRIPTION
Used in filling up the tagged hints list. Used in filling up the tagged hints list.
@ -2836,10 +2836,10 @@ void st_select_lex::fix_prepare_information(THD *thd, Item **conds,
Then the context variable index_hint_type can be reset to the Then the context variable index_hint_type can be reset to the
next hint type. next hint type.
*/ */
void st_select_lex::set_index_hint_type(enum index_hint_type type, void st_select_lex::set_index_hint_type(enum index_hint_type type_arg,
index_clause_map clause) index_clause_map clause)
{ {
current_index_hint_type= type; current_index_hint_type= type_arg;
current_index_hint_clause= clause; current_index_hint_clause= clause;
} }

View File

@ -1058,8 +1058,12 @@ err:
} }
static uchar *get_hash_key(const uchar *buff, size_t *length, extern "C" uchar *get_plugin_hash_key(const uchar *, size_t *, my_bool);
my_bool not_used __attribute__((unused))) extern "C" uchar *get_bookmark_hash_key(const uchar *, size_t *, my_bool);
uchar *get_plugin_hash_key(const uchar *buff, size_t *length,
my_bool not_used __attribute__((unused)))
{ {
struct st_plugin_int *plugin= (st_plugin_int *)buff; struct st_plugin_int *plugin= (st_plugin_int *)buff;
*length= (uint)plugin->name.length; *length= (uint)plugin->name.length;
@ -1067,8 +1071,8 @@ static uchar *get_hash_key(const uchar *buff, size_t *length,
} }
static uchar *get_bookmark_hash_key(const uchar *buff, size_t *length, uchar *get_bookmark_hash_key(const uchar *buff, size_t *length,
my_bool not_used __attribute__((unused))) my_bool not_used __attribute__((unused)))
{ {
struct st_bookmark *var= (st_bookmark *)buff; struct st_bookmark *var= (st_bookmark *)buff;
*length= var->name_len + 1; *length= var->name_len + 1;
@ -1115,7 +1119,7 @@ int plugin_init(int *argc, char **argv, int flags)
for (i= 0; i < MYSQL_MAX_PLUGIN_TYPE_NUM; i++) for (i= 0; i < MYSQL_MAX_PLUGIN_TYPE_NUM; i++)
{ {
if (hash_init(&plugin_hash[i], system_charset_info, 16, 0, 0, if (hash_init(&plugin_hash[i], system_charset_info, 16, 0, 0,
get_hash_key, NULL, HASH_UNIQUE)) get_plugin_hash_key, NULL, HASH_UNIQUE))
goto err; goto err;
} }
@ -1702,9 +1706,10 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name)
table->use_all_columns(); table->use_all_columns();
table->field[0]->store(name->str, name->length, system_charset_info); table->field[0]->store(name->str, name->length, system_charset_info);
if (! table->file->index_read_idx(table->record[0], 0, if (! table->file->index_read_idx_map(table->record[0], 0,
(uchar *)table->field[0]->ptr, HA_WHOLE_KEY, (uchar *)table->field[0]->ptr,
HA_READ_KEY_EXACT)) HA_WHOLE_KEY,
HA_READ_KEY_EXACT))
{ {
int error; int error;
if ((error= table->file->ha_delete_row(table->record[0]))) if ((error= table->file->ha_delete_row(table->record[0])))
@ -2769,8 +2774,10 @@ static void plugin_opt_set_limits(struct my_option *options,
options->arg_type= OPT_ARG; options->arg_type= OPT_ARG;
} }
extern "C" my_bool get_one_plugin_option(int optid, const struct my_option *,
char *);
static my_bool get_one_option(int optid __attribute__((unused)), my_bool get_one_plugin_option(int optid __attribute__((unused)),
const struct my_option *opt, const struct my_option *opt,
char *argument) char *argument)
{ {
@ -3078,7 +3085,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
error= handle_options(argc, &argv, opts, get_one_option); error= handle_options(argc, &argv, opts, get_one_plugin_option);
(*argc)++; /* add back one for the program name */ (*argc)++; /* add back one for the program name */
if (error) if (error)
@ -3140,7 +3147,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp,
DBUG_RETURN(0); DBUG_RETURN(0);
} }
if (enabled_saved) if (enabled_saved && global_system_variables.log_warnings)
sql_print_information("Plugin '%s' disabled by command line option", sql_print_information("Plugin '%s' disabled by command line option",
tmp->name.str); tmp->name.str);
DBUG_RETURN(1); DBUG_RETURN(1);

View File

@ -11152,10 +11152,10 @@ int safe_index_read(JOIN_TAB *tab)
{ {
int error; int error;
TABLE *table= tab->table; TABLE *table= tab->table;
if ((error=table->file->index_read(table->record[0], if ((error=table->file->index_read_map(table->record[0],
tab->ref.key_buff, tab->ref.key_buff,
make_prev_keypart_map(tab->ref.key_parts), make_prev_keypart_map(tab->ref.key_parts),
HA_READ_KEY_EXACT))) HA_READ_KEY_EXACT)))
return report_error(table, error); return report_error(table, error);
return 0; return 0;
} }
@ -11291,10 +11291,10 @@ join_read_const(JOIN_TAB *tab)
error=HA_ERR_KEY_NOT_FOUND; error=HA_ERR_KEY_NOT_FOUND;
else else
{ {
error=table->file->index_read_idx(table->record[0],tab->ref.key, error=table->file->index_read_idx_map(table->record[0],tab->ref.key,
(uchar*) tab->ref.key_buff, (uchar*) tab->ref.key_buff,
make_prev_keypart_map(tab->ref.key_parts), make_prev_keypart_map(tab->ref.key_parts),
HA_READ_KEY_EXACT); HA_READ_KEY_EXACT);
} }
if (error) if (error)
{ {
@ -11335,10 +11335,10 @@ join_read_key(JOIN_TAB *tab)
table->status=STATUS_NOT_FOUND; table->status=STATUS_NOT_FOUND;
return -1; return -1;
} }
error=table->file->index_read(table->record[0], error=table->file->index_read_map(table->record[0],
tab->ref.key_buff, tab->ref.key_buff,
make_prev_keypart_map(tab->ref.key_parts), make_prev_keypart_map(tab->ref.key_parts),
HA_READ_KEY_EXACT); HA_READ_KEY_EXACT);
if (error && error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) if (error && error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
return report_error(table, error); return report_error(table, error);
} }
@ -11364,10 +11364,10 @@ join_read_always_key(JOIN_TAB *tab)
} }
if (cp_buffer_from_ref(tab->join->thd, table, &tab->ref)) if (cp_buffer_from_ref(tab->join->thd, table, &tab->ref))
return -1; return -1;
if ((error=table->file->index_read(table->record[0], if ((error=table->file->index_read_map(table->record[0],
tab->ref.key_buff, tab->ref.key_buff,
make_prev_keypart_map(tab->ref.key_parts), make_prev_keypart_map(tab->ref.key_parts),
HA_READ_KEY_EXACT))) HA_READ_KEY_EXACT)))
{ {
if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
return report_error(table, error); return report_error(table, error);
@ -11392,8 +11392,9 @@ join_read_last_key(JOIN_TAB *tab)
table->file->ha_index_init(tab->ref.key, tab->sorted); table->file->ha_index_init(tab->ref.key, tab->sorted);
if (cp_buffer_from_ref(tab->join->thd, table, &tab->ref)) if (cp_buffer_from_ref(tab->join->thd, table, &tab->ref))
return -1; return -1;
if ((error=table->file->index_read_last(table->record[0], if ((error=table->file->index_read_last_map(table->record[0],
tab->ref.key_buff, make_prev_keypart_map(tab->ref.key_parts)))) tab->ref.key_buff,
make_prev_keypart_map(tab->ref.key_parts))))
{ {
if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
return report_error(table, error); return report_error(table, error);
@ -11934,9 +11935,10 @@ end_update(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
if (item->maybe_null) if (item->maybe_null)
group->buff[-1]= (char) group->field->is_null(); group->buff[-1]= (char) group->field->is_null();
} }
if (!table->file->index_read(table->record[1], if (!table->file->index_read_map(table->record[1],
join->tmp_table_param.group_buff, HA_WHOLE_KEY, join->tmp_table_param.group_buff,
HA_READ_KEY_EXACT)) HA_WHOLE_KEY,
HA_READ_KEY_EXACT))
{ /* Update old record */ { /* Update old record */
restore_record(table,record[1]); restore_record(table,record[1]);
update_tmptable_sum_func(join->sum_funcs,table); update_tmptable_sum_func(join->sum_funcs,table);

View File

@ -516,9 +516,10 @@ int insert_server_record(TABLE *table, FOREIGN_SERVER *server)
system_charset_info); system_charset_info);
/* read index until record is that specified in server_name */ /* read index until record is that specified in server_name */
if ((error= table->file->index_read_idx(table->record[0], 0, if ((error= table->file->index_read_idx_map(table->record[0], 0,
(uchar *)table->field[0]->ptr, HA_WHOLE_KEY, (uchar *)table->field[0]->ptr,
HA_READ_KEY_EXACT))) HA_WHOLE_KEY,
HA_READ_KEY_EXACT)))
{ {
/* if not found, err */ /* if not found, err */
if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
@ -858,9 +859,10 @@ update_server_record(TABLE *table, FOREIGN_SERVER *server)
server->server_name_length, server->server_name_length,
system_charset_info); system_charset_info);
if ((error= table->file->index_read_idx(table->record[0], 0, if ((error= table->file->index_read_idx_map(table->record[0], 0,
(uchar *)table->field[0]->ptr, ~(longlong)0, (uchar *)table->field[0]->ptr,
HA_READ_KEY_EXACT))) ~(longlong)0,
HA_READ_KEY_EXACT)))
{ {
if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
@ -914,9 +916,10 @@ delete_server_record(TABLE *table,
/* set the field that's the PK to the value we're looking for */ /* set the field that's the PK to the value we're looking for */
table->field[0]->store(server_name, server_name_length, system_charset_info); table->field[0]->store(server_name, server_name_length, system_charset_info);
if ((error= table->file->index_read_idx(table->record[0], 0, if ((error= table->file->index_read_idx_map(table->record[0], 0,
(uchar *)table->field[0]->ptr, HA_WHOLE_KEY, (uchar *)table->field[0]->ptr,
HA_READ_KEY_EXACT))) HA_WHOLE_KEY,
HA_READ_KEY_EXACT)))
{ {
if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE) if (error != HA_ERR_KEY_NOT_FOUND && error != HA_ERR_END_OF_FILE)
table->file->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));

View File

@ -1356,6 +1356,11 @@ int store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
packet->append(STRING_WITH_LEN(" ROW_FORMAT=")); packet->append(STRING_WITH_LEN(" ROW_FORMAT="));
packet->append(ha_row_type[(uint) share->row_type]); packet->append(ha_row_type[(uint) share->row_type]);
} }
if (share->transactional != HA_CHOICE_UNDEF)
{
packet->append(STRING_WITH_LEN(" TRANSACTIONAL="));
packet->append(share->transactional == HA_CHOICE_YES ? "1" : "0", 1);
}
if (table->s->key_block_size) if (table->s->key_block_size)
{ {
char *end; char *end;
@ -2952,49 +2957,70 @@ static int fill_schema_table_from_frm(THD *thd,TABLE *table,
LEX_STRING *table_name, LEX_STRING *table_name,
enum enum_schema_tables schema_table_idx) enum enum_schema_tables schema_table_idx)
{ {
TABLE_SHARE share; TABLE_SHARE *share;
TABLE tbl; TABLE tbl;
TABLE_LIST table_list; TABLE_LIST table_list;
char path[FN_REFLEN]; uint res= 0;
uint res; int error;
char key[MAX_DBKEY_LENGTH];
uint key_length;
bzero((char*) &table_list, sizeof(TABLE_LIST)); bzero((char*) &table_list, sizeof(TABLE_LIST));
bzero((char*) &tbl, sizeof(TABLE)); bzero((char*) &tbl, sizeof(TABLE));
(void) build_table_filename(path, sizeof(path), db_name->str,
table_name->str, "", 0); table_list.table_name= table_name->str;
init_tmp_table_share(&share, "", 0, "", path); table_list.db= db_name->str;
if (!(res= open_table_def(thd, &share, OPEN_VIEW))) key_length= create_table_def_key(thd, key, &table_list, 0);
pthread_mutex_lock(&LOCK_open);
share= get_table_share(thd, &table_list, key,
key_length, OPEN_VIEW, &error);
if (!share)
{ {
share.tmp_table= NO_TMP_TABLE; res= 0;
tbl.s= &share; goto err;
table_list.table= &tbl;
if (schema_table->i_s_requested_object & OPEN_TABLE_FROM_SHARE)
{
if (share.is_view ||
open_table_from_share(thd, &share, table_name->str, 0,
(READ_KEYINFO | COMPUTE_TYPES |
EXTRA_RECORD | OPEN_FRM_FILE_ONLY),
thd->open_options, &tbl, FALSE))
{
share.tmp_table= INTERNAL_TMP_TABLE;
free_table_share(&share);
return (share.is_view &&
!(schema_table->i_s_requested_object &
~(OPEN_TABLE_FROM_SHARE|OPTIMIZE_I_S_TABLE)));
}
}
table_list.view= (st_lex*) share.is_view;
res= schema_table->process_table(thd, &table_list, table,
res, db_name, table_name);
share.tmp_table= INTERNAL_TMP_TABLE;
if (schema_table->i_s_requested_object & OPEN_TABLE_FROM_SHARE)
closefrm(&tbl, true);
else
free_table_share(&share);
} }
if (res) if (share->is_view)
thd->clear_error(); {
return 0; if (schema_table->i_s_requested_object & OPEN_TABLE_ONLY)
{
/* skip view processing */
res= 0;
goto err1;
}
else if (schema_table->i_s_requested_object & OPEN_VIEW_FULL)
{
/*
tell get_all_tables() to fall back to
open_normal_and_derived_tables()
*/
res= 1;
goto err1;
}
}
if (share->is_view ||
!open_table_from_share(thd, share, table_name->str, 0,
(READ_KEYINFO | COMPUTE_TYPES |
EXTRA_RECORD | OPEN_FRM_FILE_ONLY),
thd->open_options, &tbl, FALSE))
{
tbl.s= share;
table_list.table= &tbl;
table_list.view= (st_lex*) share->is_view;
res= schema_table->process_table(thd, &table_list, table,
res, db_name, table_name);
closefrm(&tbl, true);
goto err;
}
err1:
release_table_share(share, RELEASE_NORMAL);
err:
pthread_mutex_unlock(&LOCK_open);
thd->clear_error();
return res;
} }
@ -3033,7 +3059,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
enum enum_schema_tables schema_table_idx; enum enum_schema_tables schema_table_idx;
List<LEX_STRING> db_names; List<LEX_STRING> db_names;
List_iterator_fast<LEX_STRING> it(db_names); List_iterator_fast<LEX_STRING> it(db_names);
COND *partial_cond; COND *partial_cond= 0;
uint derived_tables= lex->derived_tables; uint derived_tables= lex->derived_tables;
int error= 1; int error= 1;
Open_tables_state open_tables_state_backup; Open_tables_state open_tables_state_backup;
@ -3072,20 +3098,35 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
DBUG_PRINT("INDEX VALUES",("db_name='%s', table_name='%s'", DBUG_PRINT("INDEX VALUES",("db_name='%s', table_name='%s'",
lookup_field_vals.db_value.str, lookup_field_vals.db_value.str,
lookup_field_vals.table_value.str)); lookup_field_vals.table_value.str));
if (lookup_field_vals.db_value.length &&
!lookup_field_vals.wild_db_value &&
lookup_field_vals.table_value.length &&
!lookup_field_vals.wild_table_value)
partial_cond= 0;
else
partial_cond= make_cond_for_info_schema(cond, tables);
if (lookup_field_vals.db_value.length && !lookup_field_vals.wild_db_value) if (!lookup_field_vals.wild_db_value && !lookup_field_vals.wild_table_value)
{
/*
if lookup value is empty string then
it's impossible table name or db name
*/
if (lookup_field_vals.db_value.str &&
!lookup_field_vals.db_value.str[0] ||
lookup_field_vals.table_value.str &&
!lookup_field_vals.table_value.str[0])
{
error= 0;
goto err;
}
}
if (lookup_field_vals.db_value.length &&
!lookup_field_vals.wild_db_value)
tables->has_db_lookup_value= TRUE; tables->has_db_lookup_value= TRUE;
if (lookup_field_vals.table_value.length && if (lookup_field_vals.table_value.length &&
!lookup_field_vals.wild_table_value) !lookup_field_vals.wild_table_value)
tables->has_table_lookup_value= TRUE; tables->has_table_lookup_value= TRUE;
if (tables->has_db_lookup_value && tables->has_table_lookup_value)
partial_cond= 0;
else
partial_cond= make_cond_for_info_schema(cond, tables);
tables->table_open_method= table_open_method= tables->table_open_method= table_open_method=
get_table_open_method(tables, schema_table, schema_table_idx); get_table_open_method(tables, schema_table, schema_table_idx);
@ -3250,7 +3291,7 @@ bool store_schema_shemata(THD* thd, TABLE *table, LEX_STRING *db_name,
} }
int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond) int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond)
{ {
/* /*
TODO: fill_schema_shemata() is called when new client is connected. TODO: fill_schema_shemata() is called when new client is connected.
@ -3276,6 +3317,23 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond)
&with_i_schema)) &with_i_schema))
DBUG_RETURN(1); DBUG_RETURN(1);
/*
If we have lookup db value we should check that the database exists
*/
if(lookup_field_vals.db_value.str && !lookup_field_vals.wild_db_value)
{
char path[FN_REFLEN+16];
uint path_len;
MY_STAT stat_info;
if (!lookup_field_vals.db_value.str[0])
DBUG_RETURN(0);
path_len= build_table_filename(path, sizeof(path),
lookup_field_vals.db_value.str, "", "", 0);
path[path_len-1]= 0;
if (!my_stat(path,&stat_info,MYF(0)))
DBUG_RETURN(0);
}
List_iterator_fast<LEX_STRING> it(db_names); List_iterator_fast<LEX_STRING> it(db_names);
while ((db_name=it++)) while ((db_name=it++))
{ {
@ -3393,6 +3451,12 @@ static int get_schema_tables_record(THD *thd, TABLE_LIST *tables,
ptr=strxmov(ptr, " row_format=", ptr=strxmov(ptr, " row_format=",
ha_row_type[(uint) share->row_type], ha_row_type[(uint) share->row_type],
NullS); NullS);
if (share->transactional != HA_CHOICE_UNDEF)
{
ptr= strxmov(ptr, " TRANSACTIONAL=",
(share->transactional == HA_CHOICE_YES ? "1" : "0"),
NullS);
}
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (show_table->s->db_type() == partition_hton && if (show_table->s->db_type() == partition_hton &&
show_table->part_info != NULL && show_table->part_info != NULL &&
@ -3434,7 +3498,7 @@ static int get_schema_tables_record(THD *thd, TABLE_LIST *tables,
case ROW_TYPE_COMPACT: case ROW_TYPE_COMPACT:
tmp_buff= "Compact"; tmp_buff= "Compact";
break; break;
case ROW_TYPE_PAGES: case ROW_TYPE_PAGE:
tmp_buff= "Paged"; tmp_buff= "Paged";
break; break;
} }
@ -6398,7 +6462,7 @@ ST_SCHEMA_TABLE schema_tables[]=
create_schema_table, fill_schema_coll_charset_app, 0, 0, -1, -1, 0, 0}, create_schema_table, fill_schema_coll_charset_app, 0, 0, -1, -1, 0, 0},
{"COLUMNS", columns_fields_info, create_schema_table, {"COLUMNS", columns_fields_info, create_schema_table,
get_all_tables, make_columns_old_format, get_schema_column_record, 1, 2, 0, get_all_tables, make_columns_old_format, get_schema_column_record, 1, 2, 0,
OPEN_TABLE_FROM_SHARE|OPTIMIZE_I_S_TABLE}, OPTIMIZE_I_S_TABLE|OPEN_VIEW_FULL},
{"COLUMN_PRIVILEGES", column_privileges_fields_info, create_schema_table, {"COLUMN_PRIVILEGES", column_privileges_fields_info, create_schema_table,
fill_schema_column_privileges, 0, 0, -1, -1, 0, 0}, fill_schema_column_privileges, 0, 0, -1, -1, 0, 0},
{"ENGINES", engines_fields_info, create_schema_table, {"ENGINES", engines_fields_info, create_schema_table,
@ -6428,7 +6492,7 @@ ST_SCHEMA_TABLE schema_tables[]=
{"ROUTINES", proc_fields_info, create_schema_table, {"ROUTINES", proc_fields_info, create_schema_table,
fill_schema_proc, make_proc_old_format, 0, -1, -1, 0, 0}, fill_schema_proc, make_proc_old_format, 0, -1, -1, 0, 0},
{"SCHEMATA", schema_fields_info, create_schema_table, {"SCHEMATA", schema_fields_info, create_schema_table,
fill_schema_shemata, make_schemata_old_format, 0, 1, -1, 0, 0}, fill_schema_schemata, make_schemata_old_format, 0, 1, -1, 0, 0},
{"SCHEMA_PRIVILEGES", schema_privileges_fields_info, create_schema_table, {"SCHEMA_PRIVILEGES", schema_privileges_fields_info, create_schema_table,
fill_schema_schema_privileges, 0, 0, -1, -1, 0, 0}, fill_schema_schema_privileges, 0, 0, -1, -1, 0, 0},
{"SESSION_STATUS", variables_fields_info, create_schema_table, {"SESSION_STATUS", variables_fields_info, create_schema_table,
@ -6437,7 +6501,7 @@ ST_SCHEMA_TABLE schema_tables[]=
fill_variables, make_old_format, 0, -1, -1, 0, 0}, fill_variables, make_old_format, 0, -1, -1, 0, 0},
{"STATISTICS", stat_fields_info, create_schema_table, {"STATISTICS", stat_fields_info, create_schema_table,
get_all_tables, make_old_format, get_schema_stat_record, 1, 2, 0, get_all_tables, make_old_format, get_schema_stat_record, 1, 2, 0,
OPEN_TABLE_ONLY|OPEN_TABLE_FROM_SHARE|OPTIMIZE_I_S_TABLE}, OPEN_TABLE_ONLY|OPTIMIZE_I_S_TABLE},
{"STATUS", variables_fields_info, create_schema_table, fill_status, {"STATUS", variables_fields_info, create_schema_table, fill_status,
make_old_format, 0, -1, -1, 1, 0}, make_old_format, 0, -1, -1, 1, 0},
{"TABLES", tables_fields_info, create_schema_table, {"TABLES", tables_fields_info, create_schema_table,

View File

@ -795,10 +795,8 @@ copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs,
const uchar *from_end= (const uchar*) from+from_length; const uchar *from_end= (const uchar*) from+from_length;
char *to_start= to; char *to_start= to;
uchar *to_end= (uchar*) to+to_length; uchar *to_end= (uchar*) to+to_length;
int (*mb_wc)(struct charset_info_st *, my_wc_t *, const uchar *, my_charset_conv_mb_wc mb_wc= from_cs->cset->mb_wc;
const uchar *) = from_cs->cset->mb_wc; my_charset_conv_wc_mb wc_mb= to_cs->cset->wc_mb;
int (*wc_mb)(struct charset_info_st *, my_wc_t, uchar *s, uchar *e)=
to_cs->cset->wc_mb;
uint error_count= 0; uint error_count= 0;
while (1) while (1)
@ -940,10 +938,8 @@ well_formed_copy_nchars(CHARSET_INFO *to_cs,
{ {
int cnvres; int cnvres;
my_wc_t wc; my_wc_t wc;
int (*mb_wc)(struct charset_info_st *, my_wc_t *, my_charset_conv_mb_wc mb_wc= from_cs->cset->mb_wc;
const uchar *, const uchar *)= from_cs->cset->mb_wc; my_charset_conv_wc_mb wc_mb= to_cs->cset->wc_mb;
int (*wc_mb)(struct charset_info_st *, my_wc_t,
uchar *s, uchar *e)= to_cs->cset->wc_mb;
const uchar *from_end= (const uchar*) from + from_length; const uchar *from_end= (const uchar*) from + from_length;
uchar *to_end= (uchar*) to + to_length; uchar *to_end= (uchar*) to + to_length;
char *to_start= to; char *to_start= to;

View File

@ -5292,6 +5292,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
} }
if (!(used_fields & HA_CREATE_USED_KEY_BLOCK_SIZE)) if (!(used_fields & HA_CREATE_USED_KEY_BLOCK_SIZE))
create_info->key_block_size= table->s->key_block_size; create_info->key_block_size= table->s->key_block_size;
if (!(used_fields & HA_CREATE_USED_TRANSACTIONAL))
create_info->transactional= table->s->transactional;
if (!create_info->tablespace && create_info->storage_media != HA_SM_MEMORY) if (!create_info->tablespace && create_info->storage_media != HA_SM_MEMORY)
{ {

View File

@ -551,9 +551,10 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name)
goto err; goto err;
table->use_all_columns(); table->use_all_columns();
table->field[0]->store(exact_name_str, exact_name_len, &my_charset_bin); table->field[0]->store(exact_name_str, exact_name_len, &my_charset_bin);
if (!table->file->index_read_idx(table->record[0], 0, if (!table->file->index_read_idx_map(table->record[0], 0,
(uchar*) table->field[0]->ptr, HA_WHOLE_KEY, (uchar*) table->field[0]->ptr,
HA_READ_KEY_EXACT)) HA_WHOLE_KEY,
HA_READ_KEY_EXACT))
{ {
int error; int error;
if ((error = table->file->ha_delete_row(table->record[0]))) if ((error = table->file->ha_delete_row(table->record[0])))

View File

@ -857,6 +857,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token OUT_SYM /* SQL-2003-R */ %token OUT_SYM /* SQL-2003-R */
%token OWNER_SYM %token OWNER_SYM
%token PACK_KEYS_SYM %token PACK_KEYS_SYM
%token PAGE_SYM
%token PARAM_MARKER %token PARAM_MARKER
%token PARSER_SYM %token PARSER_SYM
%token PARTIAL /* SQL-2003-N */ %token PARTIAL /* SQL-2003-N */
@ -1009,6 +1010,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token TO_SYM /* SQL-2003-R */ %token TO_SYM /* SQL-2003-R */
%token TRAILING /* SQL-2003-R */ %token TRAILING /* SQL-2003-R */
%token TRANSACTION_SYM %token TRANSACTION_SYM
%token TRANSACTIONAL_SYM
%token TRIGGERS_SYM %token TRIGGERS_SYM
%token TRIGGER_SYM /* SQL-2003-R */ %token TRIGGER_SYM /* SQL-2003-R */
%token TRIM /* SQL-2003-N */ %token TRIM /* SQL-2003-N */
@ -4364,6 +4366,12 @@ create_table_option:
Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE;
Lex->create_info.key_block_size= $3; Lex->create_info.key_block_size= $3;
} }
| TRANSACTIONAL_SYM opt_equal ulong_num
{
Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL;
Lex->create_info.transactional= ($3 != 0 ? HA_CHOICE_YES :
HA_CHOICE_NO);
}
; ;
default_charset: default_charset:
@ -4442,7 +4450,8 @@ row_types:
| DYNAMIC_SYM { $$= ROW_TYPE_DYNAMIC; } | DYNAMIC_SYM { $$= ROW_TYPE_DYNAMIC; }
| COMPRESSED_SYM { $$= ROW_TYPE_COMPRESSED; } | COMPRESSED_SYM { $$= ROW_TYPE_COMPRESSED; }
| REDUNDANT_SYM { $$= ROW_TYPE_REDUNDANT; } | REDUNDANT_SYM { $$= ROW_TYPE_REDUNDANT; }
| COMPACT_SYM { $$= ROW_TYPE_COMPACT; }; | COMPACT_SYM { $$= ROW_TYPE_COMPACT; }
| PAGE_SYM { $$= ROW_TYPE_PAGE; };
merge_insert_types: merge_insert_types:
NO_SYM { $$= MERGE_INSERT_DISABLED; } NO_SYM { $$= MERGE_INSERT_DISABLED; }
@ -10073,6 +10082,7 @@ keyword_sp:
| ONE_SHOT_SYM {} | ONE_SHOT_SYM {}
| ONE_SYM {} | ONE_SYM {}
| PACK_KEYS_SYM {} | PACK_KEYS_SYM {}
| PAGE_SYM {}
| PARTIAL {} | PARTIAL {}
| PARTITIONING_SYM {} | PARTITIONING_SYM {}
| PARTITIONS_SYM {} | PARTITIONS_SYM {}
@ -10142,6 +10152,7 @@ keyword_sp:
| TEXT_SYM {} | TEXT_SYM {}
| THAN_SYM {} | THAN_SYM {}
| TRANSACTION_SYM {} | TRANSACTION_SYM {}
| TRANSACTIONAL_SYM {}
| TRIGGERS_SYM {} | TRIGGERS_SYM {}
| TIMESTAMP {} | TIMESTAMP {}
| TIMESTAMP_ADD {} | TIMESTAMP_ADD {}

View File

@ -265,10 +265,8 @@ uint strconvert(CHARSET_INFO *from_cs, const char *from,
my_wc_t wc; my_wc_t wc;
char *to_start= to; char *to_start= to;
uchar *to_end= (uchar*) to + to_length - 1; uchar *to_end= (uchar*) to + to_length - 1;
int (*mb_wc)(struct charset_info_st *, my_wc_t *, const uchar *, my_charset_conv_mb_wc mb_wc= from_cs->cset->mb_wc;
const uchar *)= from_cs->cset->mb_wc; my_charset_conv_wc_mb wc_mb= to_cs->cset->wc_mb;
int (*wc_mb)(struct charset_info_st *, my_wc_t, uchar *s, uchar *e)=
to_cs->cset->wc_mb;
uint error_count= 0; uint error_count= 0;
while (1) while (1)

View File

@ -51,11 +51,13 @@ inline bool is_system_table_name(const char *name, uint length);
Object_creation_ctx *Object_creation_ctx::set_n_backup(THD *thd) Object_creation_ctx *Object_creation_ctx::set_n_backup(THD *thd)
{ {
Object_creation_ctx *backup_ctx= create_backup_ctx(thd); Object_creation_ctx *backup_ctx;
DBUG_ENTER("Object_creation_ctx::set_n_backup");
backup_ctx= create_backup_ctx(thd);
change_env(thd); change_env(thd);
return backup_ctx; DBUG_RETURN(backup_ctx);
} }
void Object_creation_ctx::restore_env(THD *thd, Object_creation_ctx *backup_ctx) void Object_creation_ctx::restore_env(THD *thd, Object_creation_ctx *backup_ctx)
@ -84,7 +86,7 @@ Default_object_creation_ctx::Default_object_creation_ctx(
{ } { }
Object_creation_ctx * Object_creation_ctx *
Default_object_creation_ctx::create_backup_ctx(THD *thd) Default_object_creation_ctx::create_backup_ctx(THD *thd) const
{ {
return new Default_object_creation_ctx(thd); return new Default_object_creation_ctx(thd);
} }
@ -703,7 +705,8 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
if (!head[32]) // New frm file in 3.23 if (!head[32]) // New frm file in 3.23
{ {
share->avg_row_length= uint4korr(head+34); share->avg_row_length= uint4korr(head+34);
share-> row_type= (row_type) head[40]; share->transactional= (ha_choice) head[39];
share->row_type= (row_type) head[40];
share->table_charset= get_charset((uint) head[38],MYF(0)); share->table_charset= get_charset((uint) head[38],MYF(0));
share->null_field_first= 1; share->null_field_first= 1;
} }
@ -1750,7 +1753,7 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
} }
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
if (share->partition_info_len) if (share->partition_info_len && outparam->file)
{ {
/* /*
In this execution we must avoid calling thd->change_item_tree since In this execution we must avoid calling thd->change_item_tree since
@ -2433,6 +2436,7 @@ File create_frm(THD *thd, const char *name, const char *db,
int4store(fileinfo+34,create_info->avg_row_length); int4store(fileinfo+34,create_info->avg_row_length);
fileinfo[38]= (create_info->default_table_charset ? fileinfo[38]= (create_info->default_table_charset ?
create_info->default_table_charset->number : 0); create_info->default_table_charset->number : 0);
fileinfo[39]= (uchar) create_info->transactional;
fileinfo[40]= (uchar) create_info->row_type; fileinfo[40]= (uchar) create_info->row_type;
/* Next few bytes were for RAID support */ /* Next few bytes were for RAID support */
fileinfo[41]= 0; fileinfo[41]= 0;
@ -4565,11 +4569,11 @@ Item_subselect *TABLE_LIST::containing_subselect()
FALSE no errors found FALSE no errors found
TRUE found and reported an error. TRUE found and reported an error.
*/ */
bool TABLE_LIST::process_index_hints(TABLE *table) bool TABLE_LIST::process_index_hints(TABLE *tbl)
{ {
/* initialize the result variables */ /* initialize the result variables */
table->keys_in_use_for_query= table->keys_in_use_for_group_by= tbl->keys_in_use_for_query= tbl->keys_in_use_for_group_by=
table->keys_in_use_for_order_by= table->s->keys_in_use; tbl->keys_in_use_for_order_by= tbl->s->keys_in_use;
/* index hint list processing */ /* index hint list processing */
if (index_hints) if (index_hints)
@ -4621,8 +4625,8 @@ bool TABLE_LIST::process_index_hints(TABLE *table)
Check if an index with the given name exists and get his offset in Check if an index with the given name exists and get his offset in
the keys bitmask for the table the keys bitmask for the table
*/ */
if (table->s->keynames.type_names == 0 || if (tbl->s->keynames.type_names == 0 ||
(pos= find_type(&table->s->keynames, hint->key_name.str, (pos= find_type(&tbl->s->keynames, hint->key_name.str,
hint->key_name.length, 1)) <= 0) hint->key_name.length, 1)) <= 0)
{ {
my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), hint->key_name.str, alias); my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), hint->key_name.str, alias);
@ -4658,7 +4662,7 @@ bool TABLE_LIST::process_index_hints(TABLE *table)
!index_order[INDEX_HINT_FORCE].is_clear_all() || !index_order[INDEX_HINT_FORCE].is_clear_all() ||
!index_group[INDEX_HINT_FORCE].is_clear_all()) !index_group[INDEX_HINT_FORCE].is_clear_all())
{ {
table->force_index= TRUE; tbl->force_index= TRUE;
index_join[INDEX_HINT_USE].merge(index_join[INDEX_HINT_FORCE]); index_join[INDEX_HINT_USE].merge(index_join[INDEX_HINT_FORCE]);
index_order[INDEX_HINT_USE].merge(index_order[INDEX_HINT_FORCE]); index_order[INDEX_HINT_USE].merge(index_order[INDEX_HINT_FORCE]);
index_group[INDEX_HINT_USE].merge(index_group[INDEX_HINT_FORCE]); index_group[INDEX_HINT_USE].merge(index_group[INDEX_HINT_FORCE]);
@ -4666,20 +4670,20 @@ bool TABLE_LIST::process_index_hints(TABLE *table)
/* apply USE INDEX */ /* apply USE INDEX */
if (!index_join[INDEX_HINT_USE].is_clear_all() || have_empty_use_join) if (!index_join[INDEX_HINT_USE].is_clear_all() || have_empty_use_join)
table->keys_in_use_for_query.intersect(index_join[INDEX_HINT_USE]); tbl->keys_in_use_for_query.intersect(index_join[INDEX_HINT_USE]);
if (!index_order[INDEX_HINT_USE].is_clear_all() || have_empty_use_order) if (!index_order[INDEX_HINT_USE].is_clear_all() || have_empty_use_order)
table->keys_in_use_for_order_by.intersect (index_order[INDEX_HINT_USE]); tbl->keys_in_use_for_order_by.intersect (index_order[INDEX_HINT_USE]);
if (!index_group[INDEX_HINT_USE].is_clear_all() || have_empty_use_group) if (!index_group[INDEX_HINT_USE].is_clear_all() || have_empty_use_group)
table->keys_in_use_for_group_by.intersect (index_group[INDEX_HINT_USE]); tbl->keys_in_use_for_group_by.intersect (index_group[INDEX_HINT_USE]);
/* apply IGNORE INDEX */ /* apply IGNORE INDEX */
table->keys_in_use_for_query.subtract (index_join[INDEX_HINT_IGNORE]); tbl->keys_in_use_for_query.subtract (index_join[INDEX_HINT_IGNORE]);
table->keys_in_use_for_order_by.subtract (index_order[INDEX_HINT_IGNORE]); tbl->keys_in_use_for_order_by.subtract (index_order[INDEX_HINT_IGNORE]);
table->keys_in_use_for_group_by.subtract (index_group[INDEX_HINT_IGNORE]); tbl->keys_in_use_for_group_by.subtract (index_group[INDEX_HINT_IGNORE]);
} }
/* make sure covering_keys don't include indexes disabled with a hint */ /* make sure covering_keys don't include indexes disabled with a hint */
table->covering_keys.intersect(table->keys_in_use_for_query); tbl->covering_keys.intersect(tbl->keys_in_use_for_query);
return 0; return 0;
} }

View File

@ -310,6 +310,7 @@ typedef struct st_table_share
} }
enum row_type row_type; /* How rows are stored */ enum row_type row_type; /* How rows are stored */
enum tmp_table_type tmp_table; enum tmp_table_type tmp_table;
enum ha_choice transactional;
uint ref_count; /* How many TABLE objects uses this */ uint ref_count; /* How many TABLE objects uses this */
uint open_count; /* Number of tables in open list */ uint open_count; /* Number of tables in open list */

View File

@ -1854,8 +1854,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
*/ */
(void)table->file->ha_index_init(0, 1); (void)table->file->ha_index_init(0, 1);
if (table->file->index_read(table->record[0], table->field[0]->ptr, if (table->file->index_read_map(table->record[0], table->field[0]->ptr,
HA_WHOLE_KEY, HA_READ_KEY_EXACT)) HA_WHOLE_KEY, HA_READ_KEY_EXACT))
{ {
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
/* /*
@ -1881,8 +1881,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
table->field[0]->store((longlong) tzid, TRUE); table->field[0]->store((longlong) tzid, TRUE);
(void)table->file->ha_index_init(0, 1); (void)table->file->ha_index_init(0, 1);
if (table->file->index_read(table->record[0], table->field[0]->ptr, if (table->file->index_read_map(table->record[0], table->field[0]->ptr,
HA_WHOLE_KEY, HA_READ_KEY_EXACT)) HA_WHOLE_KEY, HA_READ_KEY_EXACT))
{ {
sql_print_error("Can't find description of time zone '%u'", tzid); sql_print_error("Can't find description of time zone '%u'", tzid);
goto end; goto end;
@ -1908,8 +1908,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
table->field[0]->store((longlong) tzid, TRUE); table->field[0]->store((longlong) tzid, TRUE);
(void)table->file->ha_index_init(0, 1); (void)table->file->ha_index_init(0, 1);
res= table->file->index_read(table->record[0], table->field[0]->ptr, res= table->file->index_read_map(table->record[0], table->field[0]->ptr,
(key_part_map)1, HA_READ_KEY_EXACT); (key_part_map)1, HA_READ_KEY_EXACT);
while (!res) while (!res)
{ {
ttid= (uint)table->field[1]->val_int(); ttid= (uint)table->field[1]->val_int();
@ -1979,8 +1979,8 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
table->field[0]->store((longlong) tzid, TRUE); table->field[0]->store((longlong) tzid, TRUE);
(void)table->file->ha_index_init(0, 1); (void)table->file->ha_index_init(0, 1);
res= table->file->index_read(table->record[0], table->field[0]->ptr, res= table->file->index_read_map(table->record[0], table->field[0]->ptr,
(key_part_map)1, HA_READ_KEY_EXACT); (key_part_map)1, HA_READ_KEY_EXACT);
while (!res) while (!res)
{ {
ttime= (my_time_t)table->field[1]->val_int(); ttime= (my_time_t)table->field[1]->val_int();

View File

@ -155,11 +155,40 @@
#define OPEN_VIEW 8192 /* Allow open on view */ #define OPEN_VIEW 8192 /* Allow open on view */
#define OPEN_VIEW_NO_PARSE 16384 /* Open frm only if it's a view, #define OPEN_VIEW_NO_PARSE 16384 /* Open frm only if it's a view,
but do not parse view itself */ but do not parse view itself */
#define OPEN_FRM_FILE_ONLY 32768 /* Open frm file only */ /*
#define OPEN_TABLE_ONLY OPEN_FRM_FILE_ONLY*2 /* Open view only */ This flag is used in function get_all_tables() which fills
#define OPEN_VIEW_ONLY OPEN_TABLE_ONLY*2 /* Open table only */ I_S tables with data which are retrieved from frm files and storage engine
#define OPEN_TABLE_FROM_SHARE OPEN_VIEW_ONLY*2 /* For I_S tables*/ The flag means that we need to open FRM file only to get necessary data.
#define OPTIMIZE_I_S_TABLE OPEN_TABLE_FROM_SHARE*2 /* For I_S tables*/ */
#define OPEN_FRM_FILE_ONLY 32768
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine
The flag means that we need to process tables only to get necessary data.
Views are not processed.
*/
#define OPEN_TABLE_ONLY OPEN_FRM_FILE_ONLY*2
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine
The flag means that we need to process views only to get necessary data.
Tables are not processed.
*/
#define OPEN_VIEW_ONLY OPEN_TABLE_ONLY*2
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine.
The flag means that we need to open a view using
open_normal_and_derived_tables() function.
*/
#define OPEN_VIEW_FULL OPEN_VIEW_ONLY*2
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine.
The flag means that I_S table uses optimization algorithm.
*/
#define OPTIMIZE_I_S_TABLE OPEN_VIEW_FULL*2
#define SC_INFO_LENGTH 4 /* Form format constant */ #define SC_INFO_LENGTH 4 /* Form format constant */
#define TE_INFO_LENGTH 3 #define TE_INFO_LENGTH 3
#define MTYP_NOEMPTY_BIT 128 #define MTYP_NOEMPTY_BIT 128

View File

@ -263,7 +263,7 @@ int main(int argc, char *argv[])
frm_file= my_open(argv[1], O_CREAT|O_RDWR|O_BINARY, MYF(0)); frm_file= my_open(argv[1], O_CREAT|O_RDWR|O_BINARY, MYF(0));
ptr= (char *)my_malloc(sizeof(char) * reader_handle.frm_length, MYF(0)); ptr= (char *)my_malloc(sizeof(char) * reader_handle.frm_length, MYF(0));
azread_frm(&reader_handle, ptr); azread_frm(&reader_handle, ptr);
my_write(frm_file, ptr, reader_handle.frm_length, MYF(0)); my_write(frm_file, (uchar*) ptr, reader_handle.frm_length, MYF(0));
my_close(frm_file, MYF(0)); my_close(frm_file, MYF(0));
my_free(ptr, MYF(0)); my_free(ptr, MYF(0));
} }

View File

@ -190,7 +190,8 @@ void write_header(azio_stream *s)
*(ptr + AZ_DIRTY_POS)= (unsigned char)s->dirty; /* Start of Data Block Index Block */ *(ptr + AZ_DIRTY_POS)= (unsigned char)s->dirty; /* Start of Data Block Index Block */
/* Always begin at the begining, and end there as well */ /* Always begin at the begining, and end there as well */
my_pwrite(s->file, buffer, AZHEADER_SIZE + AZMETA_BUFFER_SIZE, 0, MYF(0)); my_pwrite(s->file, (uchar*) buffer, AZHEADER_SIZE + AZMETA_BUFFER_SIZE, 0,
MYF(0));
} }
/* =========================================================================== /* ===========================================================================
@ -821,7 +822,7 @@ int azwrite_frm(azio_stream *s, char *blob, unsigned int length)
s->frm_length= length; s->frm_length= length;
s->start+= length; s->start+= length;
my_pwrite(s->file, blob, s->frm_length, s->frm_start_pos, MYF(0)); my_pwrite(s->file, (uchar*) blob, s->frm_length, s->frm_start_pos, MYF(0));
write_header(s); write_header(s);
my_seek(s->file, 0, MY_SEEK_END, MYF(0)); my_seek(s->file, 0, MY_SEEK_END, MYF(0));
@ -831,7 +832,7 @@ int azwrite_frm(azio_stream *s, char *blob, unsigned int length)
int azread_frm(azio_stream *s, char *blob) int azread_frm(azio_stream *s, char *blob)
{ {
my_pread(s->file, blob, s->frm_length, s->frm_start_pos, MYF(0)); my_pread(s->file, (uchar*) blob, s->frm_length, s->frm_start_pos, MYF(0));
return 0; return 0;
} }
@ -852,7 +853,8 @@ int azwrite_comment(azio_stream *s, char *blob, unsigned int length)
s->comment_length= length; s->comment_length= length;
s->start+= length; s->start+= length;
my_pwrite(s->file, blob, s->comment_length, s->comment_start_pos, MYF(0)); my_pwrite(s->file, (uchar*) blob, s->comment_length, s->comment_start_pos,
MYF(0));
write_header(s); write_header(s);
my_seek(s->file, 0, MY_SEEK_END, MYF(0)); my_seek(s->file, 0, MY_SEEK_END, MYF(0));
@ -862,7 +864,8 @@ int azwrite_comment(azio_stream *s, char *blob, unsigned int length)
int azread_comment(azio_stream *s, char *blob) int azread_comment(azio_stream *s, char *blob)
{ {
my_pread(s->file, blob, s->comment_length, s->comment_start_pos, MYF(0)); my_pread(s->file, (uchar*) blob, s->comment_length, s->comment_start_pos,
MYF(0));
return 0; return 0;
} }

View File

@ -184,8 +184,8 @@ THR_LOCK_DATA **ha_blackhole::store_lock(THD *thd,
} }
int ha_blackhole::index_read(uchar * buf, const uchar * key, int ha_blackhole::index_read_map(uchar * buf, const uchar * key,
key_part_map keypart_map, key_part_map keypart_map,
enum ha_rkey_function find_flag) enum ha_rkey_function find_flag)
{ {
DBUG_ENTER("ha_blackhole::index_read"); DBUG_ENTER("ha_blackhole::index_read");
@ -193,7 +193,7 @@ int ha_blackhole::index_read(uchar * buf, const uchar * key,
} }
int ha_blackhole::index_read_idx(uchar * buf, uint idx, const uchar * key, int ha_blackhole::index_read_idx_map(uchar * buf, uint idx, const uchar * key,
key_part_map keypart_map, key_part_map keypart_map,
enum ha_rkey_function find_flag) enum ha_rkey_function find_flag)
{ {
@ -202,8 +202,8 @@ int ha_blackhole::index_read_idx(uchar * buf, uint idx, const uchar * key,
} }
int ha_blackhole::index_read_last(uchar * buf, const uchar * key, int ha_blackhole::index_read_last_map(uchar * buf, const uchar * key,
key_part_map keypart_map) key_part_map keypart_map)
{ {
DBUG_ENTER("ha_blackhole::index_read_last"); DBUG_ENTER("ha_blackhole::index_read_last");
DBUG_RETURN(HA_ERR_END_OF_FILE); DBUG_RETURN(HA_ERR_END_OF_FILE);

View File

@ -76,11 +76,12 @@ public:
int rnd_init(bool scan); int rnd_init(bool scan);
int rnd_next(uchar *buf); int rnd_next(uchar *buf);
int rnd_pos(uchar * buf, uchar *pos); int rnd_pos(uchar * buf, uchar *pos);
int index_read(uchar * buf, const uchar * key, key_part_map keypart_map, int index_read_map(uchar * buf, const uchar * key, key_part_map keypart_map,
enum ha_rkey_function find_flag); enum ha_rkey_function find_flag);
int index_read_idx(uchar * buf, uint idx, const uchar * key, int index_read_idx_map(uchar * buf, uint idx, const uchar * key,
key_part_map keypart_map, enum ha_rkey_function find_flag); key_part_map keypart_map,
int index_read_last(uchar * buf, const uchar * key, key_part_map keypart_map); enum ha_rkey_function find_flag);
int index_read_last_map(uchar * buf, const uchar * key, key_part_map keypart_map);
int index_next(uchar * buf); int index_next(uchar * buf);
int index_prev(uchar * buf); int index_prev(uchar * buf);
int index_first(uchar * buf); int index_first(uchar * buf);

View File

@ -68,6 +68,10 @@ static int free_share(TINA_SHARE *share);
static int read_meta_file(File meta_file, ha_rows *rows); static int read_meta_file(File meta_file, ha_rows *rows);
static int write_meta_file(File meta_file, ha_rows rows, bool dirty); static int write_meta_file(File meta_file, ha_rows rows, bool dirty);
extern "C" void tina_get_status(void* param, int concurrent_insert);
extern "C" void tina_update_status(void* param);
extern "C" my_bool tina_check_status(void* param);
/* Stuff for shares */ /* Stuff for shares */
pthread_mutex_t tina_mutex; pthread_mutex_t tina_mutex;
static HASH tina_open_tables; static HASH tina_open_tables;

Some files were not shown because too many files have changed in this diff Show More