mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 19:11:46 +01:00
Merge jlindstrom@build.mysql.com:/home/bk/mysql-4.1
into hundin.mysql.fi:/home/jan/mysql-4.1
This commit is contained in:
commit
9cae7b0885
145 changed files with 1163 additions and 356 deletions
|
@ -907,3 +907,4 @@ ndb/test/tools/hugoScanUpdate
|
|||
ndb/test/tools/ndb_cpcc
|
||||
ndb/test/tools/restart
|
||||
ndb/test/tools/verify_index
|
||||
EXCEPTIONS-CLIENT
|
||||
|
|
|
@ -28,8 +28,8 @@ else
|
|||
# Some predefined settings
|
||||
$build_command= "BUILD/compile-pentium-max";
|
||||
$PWD= cwd();
|
||||
$LOGFILE= $PWD . "/Bootstrap.log";
|
||||
$opt_docdir= $PWD . "/mysqldoc";
|
||||
$opt_archive_log= undef;
|
||||
$opt_build_command= undef;
|
||||
$opt_changelog= undef;
|
||||
$opt_delete= undef;
|
||||
|
@ -51,6 +51,7 @@ $version= "unknown";
|
|||
$major=$minor=$release=0;
|
||||
|
||||
GetOptions(
|
||||
"archive-log|a",
|
||||
"build-command|b=s",
|
||||
"changelog|c:s",
|
||||
"directory|d=s",
|
||||
|
@ -72,6 +73,17 @@ GetOptions(
|
|||
"quiet|q",
|
||||
) || print_help("");
|
||||
|
||||
#
|
||||
# Override predefined build command
|
||||
#
|
||||
if (defined $opt_build_command)
|
||||
{
|
||||
$build_command= $opt_build_command;
|
||||
}
|
||||
|
||||
print_help("") if ($opt_help);
|
||||
defined($REPO=$ARGV[0]) || print_help("Please enter the BK repository to be used!");
|
||||
|
||||
#
|
||||
# Override predefined Log file name
|
||||
#
|
||||
|
@ -90,16 +102,7 @@ if (defined $opt_log)
|
|||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Override predefined build command
|
||||
#
|
||||
if (defined $opt_build_command)
|
||||
{
|
||||
$build_command= $opt_build_command;
|
||||
}
|
||||
|
||||
print_help("") if ($opt_help);
|
||||
defined($REPO=$ARGV[0]) || print_help("Please enter the BK repository to be used!");
|
||||
$LOGFILE= $PWD . "/Bootstrap-" . $REPO . ".log" unless ($LOGFILE);
|
||||
|
||||
&logger("Starting build");
|
||||
&abort("The directory \"$REPO\" could not be found!") if (!-d $REPO);
|
||||
|
@ -351,6 +354,21 @@ if (!$opt_skip_check)
|
|||
# All done when we came down here
|
||||
#
|
||||
&logger("SUCCESS: Build finished successfully.") if (!$opt_dry_run);
|
||||
|
||||
#
|
||||
# Move the log file into the Log dir of the target dir
|
||||
#
|
||||
if ($opt_archive_log)
|
||||
{
|
||||
my $logdir= $target_dir . "/Logs";
|
||||
&logger("Moving $LOGFILE to $logdir");
|
||||
mkdir "$logdir" if (! -d $logdir);
|
||||
$command= "mv ";
|
||||
$command.= "-v " if ($opt_verbose || defined $opt_log);
|
||||
$command.= "$LOGFILE $logdir";
|
||||
&run_command($command, "Could not move $LOGFILE to $logdir!");
|
||||
}
|
||||
|
||||
exit 0;
|
||||
|
||||
#
|
||||
|
@ -378,6 +396,8 @@ distribution check can be run before the source archive is being created.
|
|||
|
||||
Options:
|
||||
|
||||
-a, --archive-log Move the log file into the Logs directory of
|
||||
the exported tree after a successful build
|
||||
-b, --build-command=<cmd> Use <cmd> to compile the sources before packing
|
||||
the distribution.
|
||||
(default is "$build_command")
|
||||
|
@ -398,7 +418,7 @@ Options:
|
|||
do not build or test the source distribution
|
||||
-h, --help Print this help message
|
||||
-l, --log[=<filename>] Write a log file [to <filename>]
|
||||
(default is "$LOGFILE")
|
||||
(default is "./Bootstrap-<bk repository>.log")
|
||||
-m, --mail=<address> Mail a failure report to the given address (and
|
||||
include a log file snippet, if logging is enabled)
|
||||
Note that the \@-Sign needs to be quoted!
|
||||
|
|
|
@ -101,6 +101,7 @@ sub main
|
|||
# on the toplevel of the directory instead. file 'PUBLIC' shouldn't
|
||||
# exist in the new mysql distributions, but let's be sure..
|
||||
unlink("$destdir/PUBLIC", "$destdir/README");
|
||||
unlink("$destdir/COPYING", "$destdir/EXCEPTIONS-CLIENT");
|
||||
copy("$WD/Docs/MySQLEULA.txt", "$destdir");
|
||||
|
||||
# remove readline, bdb subdirs and update 'configure'
|
||||
|
|
|
@ -26,7 +26,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) $(BUILT_SOURCES) mysqld_error.txt \
|
|||
|
||||
all: $(targets) txt_files
|
||||
|
||||
txt_files: ../INSTALL-SOURCE ../COPYING ../INSTALL-WIN-SOURCE \
|
||||
txt_files: ../INSTALL-SOURCE ../COPYING ../INSTALL-WIN-SOURCE ../EXCEPTIONS-CLIENT \
|
||||
INSTALL-BINARY ../support-files/MacOSX/ReadMe.txt
|
||||
|
||||
CLEAN_FILES: $(BUILD_SOURCES)
|
||||
|
@ -204,7 +204,10 @@ INSTALL-BINARY: mysql.info $(GT)
|
|||
perl -w $(GT) mysql.info "Installing binary" "Installing source" > $@
|
||||
|
||||
../COPYING: mysql.info $(GT)
|
||||
perl -w $(GT) mysql.info "GPL license" "Function Index" > $@
|
||||
perl -w $(GT) mysql.info "GPL license" "MySQL FLOSS License Exception" > $@
|
||||
|
||||
../EXCEPTIONS-CLIENT: mysql.info $(GT)
|
||||
perl -w $(GT) mysql.info "MySQL FLOSS License Exception" "Function Index" > $@
|
||||
|
||||
../support-files/MacOSX/ReadMe.txt: mysql.info $(GT)
|
||||
perl -w $(GT) mysql.info "Mac OS X installation" "NetWare installation" > $@
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
AUTOMAKE_OPTIONS = foreign
|
||||
|
||||
# These are built from source in the Docs directory
|
||||
EXTRA_DIST = INSTALL-SOURCE README COPYING
|
||||
EXTRA_DIST = INSTALL-SOURCE README COPYING EXCEPTIONS-CLIENT
|
||||
SUBDIRS = . include @docs_dirs@ @zlib_dir@ \
|
||||
@readline_topdir@ sql-common \
|
||||
@thread_dirs@ pstack @sql_client_dirs@ \
|
||||
|
|
|
@ -187,7 +187,7 @@ LINK32=xilink6.exe
|
|||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /G6 /MT /W3 /O2 /I "../include" /I "../regex" /I "../zlib" /D "DBUG_OFF" /D "MYSQL_SERVER" /D "_WINDOWS" /D "_CONSOLE" /D "_MBCS" /D "USE_SYMDIR" /D "HAVE_DLOPEN" /D "NDEBUG" /FD /c
|
||||
# SUBTRACT BASE CPP /YX
|
||||
# ADD CPP /nologo /G6 /MT /W3 /O2 /I "../include" /I "../regex" /I "../zlib" /D LICENSE=Commercial /D "MYSQL_SERVER" /D "_WINDOWS" /D "_CONSOLE" /D "HAVE_DLOPEN" /D "DBUG_OFF" /D "_MBCS" /D "NDEBUG" /FD /c
|
||||
# ADD CPP /nologo /G6 /MT /W3 /O2 /I "../include" /I "../regex" /I "../zlib" /D LICENSE=Commercial /D "MYSQL_SERVER" /D "_WINDOWS" /D "_CONSOLE" /D "HAVE_DLOPEN" /D "DBUG_OFF" /D "_MBCS" /D "NDEBUG" /FD /D MYSQL_SERVER_SUFFIX=-classic /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
|
@ -243,7 +243,7 @@ LINK32=xilink6.exe
|
|||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /G6 /MT /W3 /O2 /I "../include" /I "../regex" /I "../zlib" /D "DBUG_OFF" /D "MYSQL_SERVER" /D "_WINDOWS" /D "_CONSOLE" /D "_MBCS" /D "USE_SYMDIR" /D "HAVE_DLOPEN" /D "NDEBUG" /FD /c
|
||||
# SUBTRACT BASE CPP /YX
|
||||
# ADD CPP /nologo /G6 /MT /W3 /O2 /I "../include" /I "../regex" /I "../zlib" /D "__NT__" /D "DBUG_OFF" /D "NDEBUG" /D "MYSQL_SERVER" /D "_WINDOWS" /D "_CONSOLE" /D "_MBCS" /D "HAVE_DLOPEN" /D LICENSE=Commercial /D MYSQL_SERVER_SUFFIX=-nt /FD /c
|
||||
# ADD CPP /nologo /G6 /MT /W3 /O2 /I "../include" /I "../regex" /I "../zlib" /D "__NT__" /D "DBUG_OFF" /D "NDEBUG" /D "MYSQL_SERVER" /D "_WINDOWS" /D "_CONSOLE" /D "_MBCS" /D "HAVE_DLOPEN" /FD /D LICENSE=Commercial /D MYSQL_SERVER_SUFFIX=-classic-nt /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
|
|
|
@ -155,25 +155,32 @@ enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY,
|
|||
#define FIELD_TYPE_CHAR FIELD_TYPE_TINY /* For compability */
|
||||
#define FIELD_TYPE_INTERVAL FIELD_TYPE_ENUM /* For compability */
|
||||
|
||||
|
||||
/* Shutdown/kill enums and constants */
|
||||
|
||||
/* Bits for THD::killable. */
|
||||
#define KILLABLE_CONNECT (unsigned char)(1 << 0)
|
||||
#define KILLABLE_TRANS (unsigned char)(1 << 1)
|
||||
#define KILLABLE_LOCK_TABLE (unsigned char)(1 << 2)
|
||||
#define KILLABLE_UPDATE (unsigned char)(1 << 3)
|
||||
|
||||
enum enum_shutdown_level {
|
||||
/*
|
||||
We want levels to be in growing order of hardness. So we leave room
|
||||
for future intermediate levels. For now, escalating one level is += 10;
|
||||
later if we insert new levels in between we will need a function
|
||||
next_shutdown_level(level). Note that DEFAULT does not respect the
|
||||
growing property.
|
||||
We want levels to be in growing order of hardness (because we use number
|
||||
comparisons). Note that DEFAULT does not respect the growing property, but
|
||||
it's ok.
|
||||
*/
|
||||
SHUTDOWN_DEFAULT= 0, /* mapped to WAIT_ALL_BUFFERS for now */
|
||||
/*
|
||||
Here is the list in growing order (the next does the previous plus
|
||||
something). WAIT_ALL_BUFFERS is what we have now. Others are "this MySQL
|
||||
server does not support this shutdown level yet".
|
||||
*/
|
||||
SHUTDOWN_WAIT_CONNECTIONS= 10, /* wait for existing connections to finish */
|
||||
SHUTDOWN_WAIT_TRANSACTIONS= 20, /* wait for existing trans to finish */
|
||||
SHUTDOWN_WAIT_STATEMENTS= 30, /* wait for existing updating stmts to finish */
|
||||
SHUTDOWN_WAIT_ALL_BUFFERS= 40, /* flush InnoDB buffers */
|
||||
SHUTDOWN_WAIT_CRITICAL_BUFFERS= 50, /* flush MyISAM buffs (no corruption) */
|
||||
SHUTDOWN_DEFAULT= 0,
|
||||
/* wait for existing connections to finish */
|
||||
SHUTDOWN_WAIT_CONNECTIONS= KILLABLE_CONNECT,
|
||||
/* wait for existing trans to finish */
|
||||
SHUTDOWN_WAIT_TRANSACTIONS= KILLABLE_TRANS,
|
||||
/* wait for existing updates to finish (=> no partial MyISAM update) */
|
||||
SHUTDOWN_WAIT_UPDATES= KILLABLE_UPDATE,
|
||||
/* flush InnoDB buffers and other storage engines' buffers*/
|
||||
SHUTDOWN_WAIT_ALL_BUFFERS= (KILLABLE_UPDATE << 1),
|
||||
/* don't flush InnoDB buffers, flush other storage engines' buffers*/
|
||||
SHUTDOWN_WAIT_CRITICAL_BUFFERS= (KILLABLE_UPDATE << 1) + 1,
|
||||
/* Now the 2 levels of the KILL command */
|
||||
#if MYSQL_VERSION_ID >= 50000
|
||||
KILL_QUERY= 254,
|
||||
|
@ -181,6 +188,10 @@ enum enum_shutdown_level {
|
|||
KILL_CONNECTION= 255
|
||||
};
|
||||
|
||||
/* Same value and type (0, enum_shutdown_level) but not same meaning */
|
||||
#define NOT_KILLED SHUTDOWN_DEFAULT
|
||||
|
||||
|
||||
extern unsigned long max_allowed_packet;
|
||||
extern unsigned long net_buffer_length;
|
||||
|
||||
|
|
|
@ -2836,13 +2836,16 @@ com_status(String *buffer __attribute__((unused)),
|
|||
MYSQL_RES *result;
|
||||
LINT_INIT(result);
|
||||
tee_fprintf(stdout, "\nConnection id:\t\t%lu\n",mysql_thread_id(&mysql));
|
||||
if (!mysql_query(&mysql,"select DATABASE(),USER()") &&
|
||||
if (!mysql_query(&mysql,"select DATABASE(), USER() limit 1") &&
|
||||
(result=mysql_use_result(&mysql)))
|
||||
{
|
||||
MYSQL_ROW cur=mysql_fetch_row(result);
|
||||
tee_fprintf(stdout, "Current database:\t%s\n", cur[0] ? cur[0] : "");
|
||||
tee_fprintf(stdout, "Current user:\t\t%s\n",cur[1]);
|
||||
(void) mysql_fetch_row(result); // Read eof
|
||||
if (cur)
|
||||
{
|
||||
tee_fprintf(stdout, "Current database:\t%s\n", cur[0] ? cur[0] : "");
|
||||
tee_fprintf(stdout, "Current user:\t\t%s\n", cur[1]);
|
||||
}
|
||||
mysql_free_result(result);
|
||||
}
|
||||
#ifdef HAVE_OPENSSL
|
||||
if (mysql.net.vio && mysql.net.vio->ssl_arg &&
|
||||
|
|
16
configure.in
16
configure.in
|
@ -969,6 +969,16 @@ esac
|
|||
MAX_C_OPTIMIZE="-O3"
|
||||
MAX_CXX_OPTIMIZE="-O3"
|
||||
|
||||
# workaround for Sun Forte/x86 see BUG#4681
|
||||
case $SYSTEM_TYPE-$MACHINE_TYPE-$ac_cv_prog_gcc in
|
||||
*solaris*-i?86-no)
|
||||
CFLAGS="$CFLAGS -DBIG_FILES"
|
||||
CXXFLAGS="$CXXFLAGS -DBIG_FILES"
|
||||
;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
|
||||
case $SYSTEM_TYPE in
|
||||
*solaris2.7*)
|
||||
# Solaris 2.7 has a broken /usr/include/widec.h
|
||||
|
@ -1072,10 +1082,11 @@ case $SYSTEM_TYPE in
|
|||
MAX_C_OPTIMIZE="-O"
|
||||
fi
|
||||
;;
|
||||
*darwin7*)
|
||||
*darwin[[7-8]]*)
|
||||
# don't forget to escape [] like above
|
||||
if test "$ac_cv_prog_gcc" = "yes"
|
||||
then
|
||||
FLAGS="-DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ"
|
||||
FLAGS="-DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT"
|
||||
CFLAGS="$CFLAGS $FLAGS"
|
||||
CXXFLAGS="$CXXFLAGS $FLAGS"
|
||||
MAX_C_OPTIMIZE="-O"
|
||||
|
@ -1319,6 +1330,7 @@ then
|
|||
with_named_thread="-lgthreads -lsocket -lgthreads"
|
||||
# sched.h conflicts with fsu-threads
|
||||
touch ./include/sched.h
|
||||
touch ./include/semaphore.h
|
||||
|
||||
# We must have gcc
|
||||
if expr "$CC" : ".*gcc.*"
|
||||
|
|
|
@ -42,7 +42,7 @@ static struct my_option my_long_options[] =
|
|||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
{"ndb", 0, "Ndbcluster storage engine specific error codes.", (gptr*) &ndb_code,
|
||||
(gptr*) &ndb_code, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
(gptr*) &ndb_code, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
#ifdef HAVE_SYS_ERRLIST
|
||||
{"all", 'a', "Print all the error messages and the number.",
|
||||
|
@ -222,7 +222,7 @@ int main(int argc,char *argv[])
|
|||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
if (ndb_code)
|
||||
{
|
||||
if (ndb_error_string(code, ndb_string, 1024) < 0)
|
||||
if (ndb_error_string(code, ndb_string, sizeof(ndb_string)) < 0)
|
||||
msg= 0;
|
||||
else
|
||||
msg= ndb_string;
|
||||
|
|
|
@ -645,21 +645,27 @@ typedef SOCKET_SIZE_TYPE size_socket;
|
|||
#endif /* defined (HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)*/
|
||||
|
||||
#if SIZEOF_LONG == 4
|
||||
#define INT_MIN32 (long) 0x80000000L
|
||||
#define INT_MAX32 (long) 0x7FFFFFFFL
|
||||
#define INT_MIN24 ((long) 0xff800000L)
|
||||
#define INT_MAX24 0x007fffffL
|
||||
#define INT_MIN16 ((short int) 0x8000)
|
||||
#define INT_MAX16 0x7FFF
|
||||
#define INT_MIN8 ((char) 0x80)
|
||||
#define INT_MAX8 ((char) 0x7F)
|
||||
#define INT_MIN32 ((long) 0x80000000L)
|
||||
#define INT_MAX32 ((long) 0x7FFFFFFFL)
|
||||
#define UINT_MAX32 ((long) 0xFFFFFFFFL)
|
||||
#define INT_MIN24 ((long) 0xFF800000L)
|
||||
#define INT_MAX24 0x007FFFFFL
|
||||
#define UINT_MAX24 0x00FFFFFFL
|
||||
#define INT_MIN16 ((short int) 0x8000)
|
||||
#define INT_MAX16 0x7FFF
|
||||
#define UINT_MAX16 0xFFFF
|
||||
#define INT_MIN8 ((char) 0x80)
|
||||
#define INT_MAX8 ((char) 0x7F)
|
||||
#else /* Probably Alpha */
|
||||
#define INT_MIN32 ((long) (int) 0x80000000)
|
||||
#define INT_MAX32 ((long) (int) 0x7FFFFFFF)
|
||||
#define INT_MIN24 ((long) (int) 0xff800000)
|
||||
#define INT_MAX24 ((long) (int) 0x007fffff)
|
||||
#define INT_MIN16 ((short int) 0xffff8000)
|
||||
#define UINT_MAX32 ((long) (int) 0xFFFFFFFF)
|
||||
#define INT_MIN24 ((long) (int) 0xFF800000)
|
||||
#define INT_MAX24 ((long) (int) 0x007FFFFF)
|
||||
#define UINT_MAX24 ((long) (int) 0x00FFFFFF)
|
||||
#define INT_MIN16 ((short int) 0xFFFF8000)
|
||||
#define INT_MAX16 ((short int) 0x00007FFF)
|
||||
#define UINT_MAX16 ((short int) 0x0000FFFF)
|
||||
#endif
|
||||
|
||||
/* From limits.h instead */
|
||||
|
|
|
@ -223,25 +223,32 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
|
|||
#define FIELD_TYPE_INTERVAL MYSQL_TYPE_ENUM
|
||||
#define FIELD_TYPE_GEOMETRY MYSQL_TYPE_GEOMETRY
|
||||
|
||||
|
||||
/* Shutdown/kill enums and constants */
|
||||
|
||||
/* Bits for THD::killable. */
|
||||
#define KILLABLE_CONNECT (unsigned char)(1 << 0)
|
||||
#define KILLABLE_TRANS (unsigned char)(1 << 1)
|
||||
#define KILLABLE_LOCK_TABLE (unsigned char)(1 << 2)
|
||||
#define KILLABLE_UPDATE (unsigned char)(1 << 3)
|
||||
|
||||
enum enum_shutdown_level {
|
||||
/*
|
||||
We want levels to be in growing order of hardness. So we leave room
|
||||
for future intermediate levels. For now, escalating one level is += 10;
|
||||
later if we insert new levels in between we will need a function
|
||||
next_shutdown_level(level). Note that DEFAULT does not respect the
|
||||
growing property.
|
||||
We want levels to be in growing order of hardness (because we use number
|
||||
comparisons). Note that DEFAULT does not respect the growing property, but
|
||||
it's ok.
|
||||
*/
|
||||
SHUTDOWN_DEFAULT= 0, /* mapped to WAIT_ALL_BUFFERS for now */
|
||||
/*
|
||||
Here is the list in growing order (the next does the previous plus
|
||||
something). WAIT_ALL_BUFFERS is what we have now. Others are "this MySQL
|
||||
server does not support this shutdown level yet".
|
||||
*/
|
||||
SHUTDOWN_WAIT_CONNECTIONS= 10, /* wait for existing connections to finish */
|
||||
SHUTDOWN_WAIT_TRANSACTIONS= 20, /* wait for existing trans to finish */
|
||||
SHUTDOWN_WAIT_STATEMENTS= 30, /* wait for existing updating stmts to finish */
|
||||
SHUTDOWN_WAIT_ALL_BUFFERS= 40, /* flush InnoDB buffers */
|
||||
SHUTDOWN_WAIT_CRITICAL_BUFFERS= 50, /* flush MyISAM buffs (no corruption) */
|
||||
SHUTDOWN_DEFAULT= 0,
|
||||
/* wait for existing connections to finish */
|
||||
SHUTDOWN_WAIT_CONNECTIONS= KILLABLE_CONNECT,
|
||||
/* wait for existing trans to finish */
|
||||
SHUTDOWN_WAIT_TRANSACTIONS= KILLABLE_TRANS,
|
||||
/* wait for existing updates to finish (=> no partial MyISAM update) */
|
||||
SHUTDOWN_WAIT_UPDATES= KILLABLE_UPDATE,
|
||||
/* flush InnoDB buffers and other storage engines' buffers*/
|
||||
SHUTDOWN_WAIT_ALL_BUFFERS= (KILLABLE_UPDATE << 1),
|
||||
/* don't flush InnoDB buffers, flush other storage engines' buffers*/
|
||||
SHUTDOWN_WAIT_CRITICAL_BUFFERS= (KILLABLE_UPDATE << 1) + 1,
|
||||
/* Now the 2 levels of the KILL command */
|
||||
#if MYSQL_VERSION_ID >= 50000
|
||||
KILL_QUERY= 254,
|
||||
|
@ -249,6 +256,10 @@ enum enum_shutdown_level {
|
|||
KILL_CONNECTION= 255
|
||||
};
|
||||
|
||||
/* Same value and type (0, enum_shutdown_level) but not same meaning */
|
||||
#define NOT_KILLED SHUTDOWN_DEFAULT
|
||||
|
||||
|
||||
/* options for mysql_set_option */
|
||||
enum enum_mysql_set_option
|
||||
{
|
||||
|
|
|
@ -217,7 +217,9 @@ buf_flush_buffered_writes(void)
|
|||
/*===========================*/
|
||||
{
|
||||
buf_block_t* block;
|
||||
byte* write_buf;
|
||||
ulint len;
|
||||
ulint len2;
|
||||
ulint i;
|
||||
|
||||
if (trx_doublewrite == NULL) {
|
||||
|
@ -244,6 +246,16 @@ buf_flush_buffered_writes(void)
|
|||
block = trx_doublewrite->buf_block_arr[i];
|
||||
ut_a(block->state == BUF_BLOCK_FILE_PAGE);
|
||||
|
||||
if (mach_read_from_4(block->frame + FIL_PAGE_LSN + 4)
|
||||
!= mach_read_from_4(block->frame + UNIV_PAGE_SIZE
|
||||
- FIL_PAGE_END_LSN_OLD_CHKSUM + 4)) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: ERROR: The page to be written seems corrupt!\n"
|
||||
"InnoDB: The lsn fields do not match! Noticed in the buffer pool\n"
|
||||
"InnoDB: before posting to the doublewrite buffer.\n");
|
||||
}
|
||||
|
||||
if (block->check_index_page_at_flush
|
||||
&& !page_simple_validate(block->frame)) {
|
||||
|
||||
|
@ -272,6 +284,19 @@ buf_flush_buffered_writes(void)
|
|||
trx_doublewrite->block1, 0, len,
|
||||
(void*)trx_doublewrite->write_buf, NULL);
|
||||
|
||||
write_buf = trx_doublewrite->write_buf;
|
||||
|
||||
for (len2 = 0; len2 + UNIV_PAGE_SIZE <= len; len2 += UNIV_PAGE_SIZE) {
|
||||
if (mach_read_from_4(write_buf + len2 + FIL_PAGE_LSN + 4)
|
||||
!= mach_read_from_4(write_buf + len2 + UNIV_PAGE_SIZE
|
||||
- FIL_PAGE_END_LSN_OLD_CHKSUM + 4)) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: ERROR: The page to be written seems corrupt!\n"
|
||||
"InnoDB: The lsn fields do not match! Noticed in the doublewrite block1.\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (trx_doublewrite->first_free > TRX_SYS_DOUBLEWRITE_BLOCK_SIZE) {
|
||||
len = (trx_doublewrite->first_free
|
||||
- TRX_SYS_DOUBLEWRITE_BLOCK_SIZE) * UNIV_PAGE_SIZE;
|
||||
|
@ -282,6 +307,22 @@ buf_flush_buffered_writes(void)
|
|||
(void*)(trx_doublewrite->write_buf
|
||||
+ TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * UNIV_PAGE_SIZE),
|
||||
NULL);
|
||||
|
||||
write_buf = trx_doublewrite->write_buf
|
||||
+ TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * UNIV_PAGE_SIZE;
|
||||
for (len2 = 0; len2 + UNIV_PAGE_SIZE <= len;
|
||||
len2 += UNIV_PAGE_SIZE) {
|
||||
if (mach_read_from_4(write_buf + len2
|
||||
+ FIL_PAGE_LSN + 4)
|
||||
!= mach_read_from_4(write_buf + len2
|
||||
+ UNIV_PAGE_SIZE
|
||||
- FIL_PAGE_END_LSN_OLD_CHKSUM + 4)) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: ERROR: The page to be written seems corrupt!\n"
|
||||
"InnoDB: The lsn fields do not match! Noticed in the doublewrite block2.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Now flush the doublewrite buffer data to disk */
|
||||
|
@ -295,6 +336,18 @@ buf_flush_buffered_writes(void)
|
|||
for (i = 0; i < trx_doublewrite->first_free; i++) {
|
||||
block = trx_doublewrite->buf_block_arr[i];
|
||||
|
||||
if (mach_read_from_4(block->frame + FIL_PAGE_LSN + 4)
|
||||
!= mach_read_from_4(block->frame + UNIV_PAGE_SIZE
|
||||
- FIL_PAGE_END_LSN_OLD_CHKSUM + 4)) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: ERROR: The page to be written seems corrupt!\n"
|
||||
"InnoDB: The lsn fields do not match! Noticed in the buffer pool\n"
|
||||
"InnoDB: after posting and flushing the doublewrite buffer.\n"
|
||||
"InnoDB: Page buf fix count %lu, io fix %lu, state %lu\n",
|
||||
(ulong)block->buf_fix_count, (ulong)block->io_fix,
|
||||
(ulong)block->state);
|
||||
}
|
||||
ut_a(block->state == BUF_BLOCK_FILE_PAGE);
|
||||
|
||||
fil_io(OS_FILE_WRITE | OS_AIO_SIMULATED_WAKE_LATER,
|
||||
|
|
|
@ -32,6 +32,7 @@ static
|
|||
dtuple_t*
|
||||
dict_create_sys_tables_tuple(
|
||||
/*=========================*/
|
||||
/* out: the tuple which should be inserted */
|
||||
dict_table_t* table, /* in: table */
|
||||
mem_heap_t* heap) /* in: memory heap from which the memory for
|
||||
the built tuple is allocated */
|
||||
|
|
|
@ -682,6 +682,7 @@ dict_init(void)
|
|||
rw_lock_set_level(&dict_operation_lock, SYNC_DICT_OPERATION);
|
||||
|
||||
dict_foreign_err_file = os_file_create_tmpfile();
|
||||
ut_a(dict_foreign_err_file);
|
||||
mutex_create(&dict_foreign_err_mutex);
|
||||
mutex_set_level(&dict_foreign_err_mutex, SYNC_ANY_LATCH);
|
||||
}
|
||||
|
|
|
@ -47,7 +47,8 @@ dyn_array_open(
|
|||
/*===========*/
|
||||
/* out: pointer to the buffer */
|
||||
dyn_array_t* arr, /* in: dynamic array */
|
||||
ulint size); /* in: size in bytes of the buffer */
|
||||
ulint size); /* in: size in bytes of the buffer; MUST be
|
||||
smaller than DYN_ARRAY_DATA_SIZE! */
|
||||
/*************************************************************************
|
||||
Closes the buffer returned by dyn_array_open. */
|
||||
UNIV_INLINE
|
||||
|
|
|
@ -111,7 +111,8 @@ mlog_open(
|
|||
/*======*/
|
||||
/* out: buffer, NULL if log mode MTR_LOG_NONE */
|
||||
mtr_t* mtr, /* in: mtr */
|
||||
ulint size); /* in: buffer size in bytes */
|
||||
ulint size); /* in: buffer size in bytes; MUST be
|
||||
smaller than DYN_ARRAY_DATA_SIZE! */
|
||||
/************************************************************
|
||||
Closes a buffer opened to mlog. */
|
||||
UNIV_INLINE
|
||||
|
|
|
@ -18,7 +18,8 @@ mlog_open(
|
|||
/*======*/
|
||||
/* out: buffer, NULL if log mode MTR_LOG_NONE */
|
||||
mtr_t* mtr, /* in: mtr */
|
||||
ulint size) /* in: buffer size in bytes */
|
||||
ulint size) /* in: buffer size in bytes; MUST be
|
||||
smaller than DYN_ARRAY_DATA_SIZE! */
|
||||
{
|
||||
dyn_array_t* mlog;
|
||||
|
||||
|
|
|
@ -169,12 +169,12 @@ void
|
|||
os_io_init_simple(void);
|
||||
/*===================*/
|
||||
/***************************************************************************
|
||||
Creates a temporary file. In case of error, causes abnormal termination. */
|
||||
Creates a temporary file. */
|
||||
|
||||
FILE*
|
||||
os_file_create_tmpfile(void);
|
||||
/*========================*/
|
||||
/* out: temporary file handle (never NULL) */
|
||||
/* out: temporary file handle (never NULL) */
|
||||
/***************************************************************************
|
||||
The os_file_opendir() function opens a directory stream corresponding to the
|
||||
directory named by the dirname argument. The directory stream is positioned
|
||||
|
|
|
@ -479,7 +479,20 @@ page_rec_get_next(
|
|||
|
||||
offs = rec_get_next_offs(rec);
|
||||
|
||||
ut_a(offs < UNIV_PAGE_SIZE);
|
||||
if (offs >= UNIV_PAGE_SIZE) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Next record offset is nonsensical %lu in record at offset %lu\n",
|
||||
(ulong)offs, (ulong)(rec - page));
|
||||
fprintf(stderr,
|
||||
"\nInnoDB: rec address %lx, first buffer frame %lx\n"
|
||||
"InnoDB: buffer pool high end %lx, buf fix count %lu\n",
|
||||
(ulong)rec, (ulong)buf_pool->frame_zero,
|
||||
(ulong)buf_pool->high_end,
|
||||
(ulong)buf_block_align(rec)->buf_fix_count);
|
||||
buf_page_print(page);
|
||||
|
||||
ut_a(0);
|
||||
}
|
||||
|
||||
if (offs == 0) {
|
||||
|
||||
|
|
|
@ -99,6 +99,8 @@ extern lint srv_conc_n_threads;
|
|||
|
||||
extern ibool srv_fast_shutdown;
|
||||
|
||||
extern ibool srv_innodb_status;
|
||||
|
||||
extern ibool srv_use_doublewrite_buf;
|
||||
|
||||
extern ibool srv_set_thread_priorities;
|
||||
|
|
|
@ -64,15 +64,17 @@ innobase_start_or_create_for_mysql(void);
|
|||
/* out: DB_SUCCESS or error code */
|
||||
/********************************************************************
|
||||
Shuts down the Innobase database. */
|
||||
|
||||
int
|
||||
innobase_shutdown_for_mysql(void);
|
||||
/*=============================*/
|
||||
/* out: DB_SUCCESS or error code */
|
||||
|
||||
extern dulint srv_shutdown_lsn;
|
||||
extern dulint srv_start_lsn;
|
||||
|
||||
#ifdef __NETWARE__
|
||||
void set_panic_flag_for_netware(void);
|
||||
#endif
|
||||
|
||||
extern ulint srv_sizeof_trx_t_in_ha_innodb_cc;
|
||||
|
||||
extern ibool srv_is_being_started;
|
||||
|
|
|
@ -22,7 +22,38 @@ extern ulint* ut_dbg_null_ptr;
|
|||
extern const char* ut_dbg_msg_assert_fail;
|
||||
extern const char* ut_dbg_msg_trap;
|
||||
extern const char* ut_dbg_msg_stop;
|
||||
|
||||
/* Have a graceful exit on NetWare rather than a segfault to avoid abends */
|
||||
#ifdef __NETWARE__
|
||||
extern ibool panic_shutdown;
|
||||
#define ut_a(EXPR) do {\
|
||||
if (!((ulint)(EXPR) + ut_dbg_zero)) {\
|
||||
ut_print_timestamp(stderr);\
|
||||
fprintf(stderr, ut_dbg_msg_assert_fail,\
|
||||
os_thread_pf(os_thread_get_curr_id()), __FILE__,\
|
||||
(ulint)__LINE__);\
|
||||
fputs("InnoDB: Failing assertion: " #EXPR "\n", stderr);\
|
||||
fputs(ut_dbg_msg_trap, stderr);\
|
||||
ut_dbg_stop_threads = TRUE;\
|
||||
if (ut_dbg_stop_threads) {\
|
||||
fprintf(stderr, ut_dbg_msg_stop,\
|
||||
os_thread_pf(os_thread_get_curr_id()), __FILE__, (ulint)__LINE__);\
|
||||
}\
|
||||
if(!panic_shutdown){\
|
||||
panic_shutdown = TRUE;\
|
||||
innobase_shutdown_for_mysql();}\
|
||||
exit(1);\
|
||||
}\
|
||||
} while (0)
|
||||
#define ut_error do {\
|
||||
ut_print_timestamp(stderr);\
|
||||
fprintf(stderr, ut_dbg_msg_assert_fail,\
|
||||
os_thread_pf(os_thread_get_curr_id()), __FILE__, (ulint)__LINE__);\
|
||||
fprintf(stderr, ut_dbg_msg_trap);\
|
||||
ut_dbg_stop_threads = TRUE;\
|
||||
if(!panic_shutdown){panic_shutdown = TRUE;\
|
||||
innobase_shutdown_for_mysql();}\
|
||||
} while (0)
|
||||
#else
|
||||
#define ut_a(EXPR) do {\
|
||||
if (!((ulint)(EXPR) + ut_dbg_zero)) {\
|
||||
ut_print_timestamp(stderr);\
|
||||
|
@ -49,6 +80,7 @@ extern const char* ut_dbg_msg_stop;
|
|||
ut_dbg_stop_threads = TRUE;\
|
||||
if (*(ut_dbg_null_ptr)) ut_dbg_null_ptr = NULL;\
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
#define ut_ad(EXPR) ut_a(EXPR)
|
||||
|
|
|
@ -509,6 +509,7 @@ lock_sys_create(
|
|||
/* hash_create_mutexes(lock_sys->rec_hash, 2, SYNC_REC_LOCK); */
|
||||
|
||||
lock_latest_err_file = os_file_create_tmpfile();
|
||||
ut_a(lock_latest_err_file);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
|
|
@ -478,22 +478,72 @@ os_io_init_simple(void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/*************************************************************************
|
||||
Creates a temporary file. This function is defined in ha_innodb.cc. */
|
||||
|
||||
int
|
||||
innobase_mysql_tmpfile(void);
|
||||
/*========================*/
|
||||
/* out: temporary file descriptor, or < 0 on error */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/***************************************************************************
|
||||
Creates a temporary file. In case of error, causes abnormal termination. */
|
||||
Creates a temporary file. */
|
||||
|
||||
FILE*
|
||||
os_file_create_tmpfile(void)
|
||||
/*========================*/
|
||||
/* out: temporary file handle (never NULL) */
|
||||
/* out: temporary file handle, or NULL on error */
|
||||
{
|
||||
FILE* file = tmpfile();
|
||||
if (file == NULL) {
|
||||
FILE* file = NULL;
|
||||
int fd = -1;
|
||||
#ifdef UNIV_HOTBACKUP
|
||||
int tries;
|
||||
for (tries = 10; tries--; ) {
|
||||
char* name = tempnam(fil_path_to_mysql_datadir, "ib");
|
||||
if (!name) {
|
||||
break;
|
||||
}
|
||||
|
||||
fd = open(name,
|
||||
# ifdef __WIN__
|
||||
O_SEQUENTIAL | O_SHORT_LIVED | O_TEMPORARY |
|
||||
# endif /* __WIN__ */
|
||||
O_CREAT | O_EXCL | O_RDWR,
|
||||
S_IREAD | S_IWRITE);
|
||||
if (fd >= 0) {
|
||||
# ifndef __WIN__
|
||||
unlink(name);
|
||||
# endif /* !__WIN__ */
|
||||
free(name);
|
||||
break;
|
||||
}
|
||||
|
||||
ut_print_timestamp(stderr);
|
||||
fputs(" InnoDB: Error: unable to create temporary file\n",
|
||||
stderr);
|
||||
os_file_handle_error(NULL, "tmpfile");
|
||||
ut_error;
|
||||
fprintf(stderr, " InnoDB: Warning: "
|
||||
"unable to create temporary file %s, retrying\n",
|
||||
name);
|
||||
free(name);
|
||||
}
|
||||
#else /* UNIV_HOTBACKUP */
|
||||
fd = innobase_mysql_tmpfile();
|
||||
#endif /* UNIV_HOTBACKUP */
|
||||
|
||||
if (fd >= 0) {
|
||||
file = fdopen(fd, "w+b");
|
||||
}
|
||||
|
||||
if (!file) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: Error: unable to create temporary file;"
|
||||
" errno: %d\n", errno);
|
||||
if (fd >= 0) {
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
|
||||
return(file);
|
||||
}
|
||||
|
||||
|
@ -3623,6 +3673,9 @@ consecutive_loop:
|
|||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: ERROR: The page to be written seems corrupt!\n");
|
||||
fprintf(stderr,
|
||||
"InnoDB: Writing a block of %lu bytes, currently writing at offset %lu\n",
|
||||
(ulong)total_len, (ulong)len2);
|
||||
buf_page_print(combined_buf + len2);
|
||||
fprintf(stderr,
|
||||
"InnoDB: ERROR: The page to be written seems corrupt!\n");
|
||||
|
|
|
@ -3010,6 +3010,30 @@ row_rename_table_for_mysql(
|
|||
NULL);
|
||||
trx->error_state = DB_SUCCESS;
|
||||
}
|
||||
} else {
|
||||
err = dict_load_foreigns(new_name);
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
ut_print_timestamp(stderr);
|
||||
|
||||
fputs(
|
||||
" InnoDB: Error: in RENAME TABLE table ",
|
||||
stderr);
|
||||
ut_print_name(stderr, new_name);
|
||||
fputs("\n"
|
||||
"InnoDB: is referenced in foreign key constraints\n"
|
||||
"InnoDB: which are not compatible with the new table definition.\n",
|
||||
stderr);
|
||||
|
||||
ut_a(dict_table_rename_in_cache(table,
|
||||
old_name, FALSE));
|
||||
|
||||
trx->error_state = DB_SUCCESS;
|
||||
trx_general_rollback_for_mysql(trx, FALSE,
|
||||
NULL);
|
||||
trx->error_state = DB_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
funct_exit:
|
||||
|
|
|
@ -3224,8 +3224,15 @@ rec_loop:
|
|||
|
||||
if (srv_force_recovery == 0 || moves_up == FALSE) {
|
||||
ut_print_timestamp(stderr);
|
||||
buf_page_print(buf_frame_align(rec));
|
||||
fprintf(stderr,
|
||||
" InnoDB: Index corruption: rec offs %lu next offs %lu, page no %lu,\n"
|
||||
"\nInnoDB: rec address %lx, first buffer frame %lx\n"
|
||||
"InnoDB: buffer pool high end %lx, buf block fix count %lu\n",
|
||||
(ulong)rec, (ulong)buf_pool->frame_zero,
|
||||
(ulong)buf_pool->high_end,
|
||||
(ulong)buf_block_align(rec)->buf_fix_count);
|
||||
fprintf(stderr,
|
||||
"InnoDB: Index corruption: rec offs %lu next offs %lu, page no %lu,\n"
|
||||
"InnoDB: ",
|
||||
(ulong) (rec - buf_frame_align(rec)),
|
||||
(ulong) next_offs,
|
||||
|
|
|
@ -242,6 +242,9 @@ merge to completion before shutdown */
|
|||
|
||||
ibool srv_fast_shutdown = FALSE;
|
||||
|
||||
/* Generate a innodb_status.<pid> file */
|
||||
ibool srv_innodb_status = FALSE;
|
||||
|
||||
ibool srv_use_doublewrite_buf = TRUE;
|
||||
|
||||
ibool srv_set_thread_priorities = TRUE;
|
||||
|
|
|
@ -1112,16 +1112,24 @@ NetWare. */
|
|||
|
||||
mutex_create(&srv_monitor_file_mutex);
|
||||
mutex_set_level(&srv_monitor_file_mutex, SYNC_NO_ORDER_CHECK);
|
||||
srv_monitor_file_name = mem_alloc(
|
||||
strlen(fil_path_to_mysql_datadir) +
|
||||
20 + sizeof "/innodb_status.");
|
||||
sprintf(srv_monitor_file_name, "%s/innodb_status.%lu",
|
||||
fil_path_to_mysql_datadir, os_proc_get_number());
|
||||
srv_monitor_file = fopen(srv_monitor_file_name, "w+");
|
||||
if (!srv_monitor_file) {
|
||||
fprintf(stderr, "InnoDB: unable to create %s: %s\n",
|
||||
srv_monitor_file_name, strerror(errno));
|
||||
return(DB_ERROR);
|
||||
if (srv_innodb_status) {
|
||||
srv_monitor_file_name = mem_alloc(
|
||||
strlen(fil_path_to_mysql_datadir) +
|
||||
20 + sizeof "/innodb_status.");
|
||||
sprintf(srv_monitor_file_name, "%s/innodb_status.%lu",
|
||||
fil_path_to_mysql_datadir, os_proc_get_number());
|
||||
srv_monitor_file = fopen(srv_monitor_file_name, "w+");
|
||||
if (!srv_monitor_file) {
|
||||
fprintf(stderr, "InnoDB: unable to create %s: %s\n",
|
||||
srv_monitor_file_name, strerror(errno));
|
||||
return(DB_ERROR);
|
||||
}
|
||||
} else {
|
||||
srv_monitor_file_name = NULL;
|
||||
srv_monitor_file = os_file_create_tmpfile();
|
||||
if (!srv_monitor_file) {
|
||||
return(DB_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/* Restrict the maximum number of file i/o threads */
|
||||
|
@ -1177,6 +1185,7 @@ NetWare. */
|
|||
|
||||
for (i = 0; i < srv_n_file_io_threads; i++) {
|
||||
n[i] = i;
|
||||
|
||||
os_thread_create(io_handler_thread, n + i, thread_ids + i);
|
||||
}
|
||||
|
||||
|
@ -1606,7 +1615,9 @@ innobase_shutdown_for_mysql(void)
|
|||
/* out: DB_SUCCESS or error code */
|
||||
{
|
||||
ulint i;
|
||||
|
||||
#ifdef __NETWARE__
|
||||
extern ibool panic_shutdown;
|
||||
#endif
|
||||
if (!srv_was_started) {
|
||||
if (srv_is_being_started) {
|
||||
ut_print_timestamp(stderr);
|
||||
|
@ -1623,8 +1634,11 @@ innobase_shutdown_for_mysql(void)
|
|||
The step 1 is the real InnoDB shutdown. The remaining steps 2 - ...
|
||||
just free data structures after the shutdown. */
|
||||
|
||||
#ifdef __NETWARE__
|
||||
if(!panic_shutdown)
|
||||
#endif
|
||||
logs_empty_and_mark_files_at_shutdown();
|
||||
|
||||
|
||||
if (srv_conc_n_threads != 0) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Warning: query counter shows %ld queries still\n"
|
||||
|
@ -1687,15 +1701,16 @@ innobase_shutdown_for_mysql(void)
|
|||
if (srv_monitor_file) {
|
||||
fclose(srv_monitor_file);
|
||||
srv_monitor_file = 0;
|
||||
unlink(srv_monitor_file_name);
|
||||
mem_free(srv_monitor_file_name);
|
||||
if (srv_monitor_file_name) {
|
||||
unlink(srv_monitor_file_name);
|
||||
mem_free(srv_monitor_file_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mutex_free(&srv_monitor_file_mutex);
|
||||
|
||||
/* 3. Free all InnoDB's own mutexes and the os_fast_mutexes inside
|
||||
them */
|
||||
|
||||
sync_close();
|
||||
|
||||
/* 4. Free the os_conc_mutex and all os_events and os_mutexes */
|
||||
|
@ -1706,7 +1721,7 @@ innobase_shutdown_for_mysql(void)
|
|||
/* 5. Free all allocated memory and the os_fast_mutex created in
|
||||
ut0mem.c */
|
||||
|
||||
ut_free_all_mem();
|
||||
ut_free_all_mem();
|
||||
|
||||
if (os_thread_count != 0
|
||||
|| os_event_count != 0
|
||||
|
@ -1736,3 +1751,11 @@ innobase_shutdown_for_mysql(void)
|
|||
|
||||
return((int) DB_SUCCESS);
|
||||
}
|
||||
|
||||
#ifdef __NETWARE__
|
||||
void set_panic_flag_for_netware()
|
||||
{
|
||||
extern ibool panic_shutdown;
|
||||
panic_shutdown = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -14,7 +14,12 @@ ulint ut_dbg_zero = 0;
|
|||
/* If this is set to TRUE all threads will stop into the next assertion
|
||||
and assert */
|
||||
ibool ut_dbg_stop_threads = FALSE;
|
||||
|
||||
#ifdef __NETWARE__
|
||||
ibool panic_shutdown = FALSE; /* This is set to TRUE when on NetWare there
|
||||
happens an InnoDB assertion failure or other
|
||||
fatal error condition that requires an
|
||||
immediate shutdown. */
|
||||
#endif
|
||||
/* Null pointer used to generate memory trap */
|
||||
|
||||
ulint* ut_dbg_null_ptr = NULL;
|
||||
|
|
|
@ -107,7 +107,13 @@ ut_malloc_low(
|
|||
|
||||
/* Make an intentional seg fault so that we get a stack
|
||||
trace */
|
||||
/* Intentional segfault on NetWare causes an abend. Avoid this
|
||||
by graceful exit handling in ut_a(). */
|
||||
#if (!defined __NETWARE__)
|
||||
if (*ut_mem_null_ptr) ut_mem_null_ptr = 0;
|
||||
#else
|
||||
ut_a(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (set_to_zero) {
|
||||
|
|
|
@ -43,7 +43,7 @@ mkdirprog="${MKDIRPROG-mkdir}"
|
|||
|
||||
transformbasename=""
|
||||
transform_arg=""
|
||||
instcmd="$mvprog"
|
||||
instcmd="$cpprog"
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=""
|
||||
chgrpcmd=""
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
# Copyright (C) 2000-2004 MySQL AB
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of version 2 GNU General Public License as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# There are special exceptions to the terms and conditions of the GPL as it
|
||||
# is applied to this software. View the full text of the exception in file
|
||||
# EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
@ -14,7 +17,7 @@
|
|||
# License along with this library; if not, write to the Free
|
||||
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
# MA 02111-1307, USA
|
||||
|
||||
#
|
||||
# This file is public domain and comes with NO WARRANTY of any kind
|
||||
|
||||
target = libmysqlclient.la
|
||||
|
|
|
@ -1,21 +1,24 @@
|
|||
## Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
##
|
||||
## This library is free software; you can redistribute it and/or
|
||||
## modify it under the terms of the GNU Library General Public
|
||||
## License as published by the Free Software Foundation; either
|
||||
## version 2 of the License, or (at your option) any later version.
|
||||
##
|
||||
## This library is distributed in the hope that it will be useful,
|
||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
## Library General Public License for more details.
|
||||
##
|
||||
## You should have received a copy of the GNU Library General Public
|
||||
## License along with this library; if not, write to the Free
|
||||
## Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
## MA 02111-1307, USA
|
||||
##
|
||||
## This file is public domain and comes with NO WARRANTY of any kind
|
||||
# Copyright (C) 2000-2004 MySQL AB
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of version 2 GNU General Public License as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# There are special exceptions to the terms and conditions of the GPL as it
|
||||
# is applied to this software. View the full text of the exception in file
|
||||
# EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Library General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Library General Public
|
||||
# License along with this library; if not, write to the Free
|
||||
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
# MA 02111-1307, USA
|
||||
#
|
||||
# This file is public domain and comes with NO WARRANTY of any kind
|
||||
|
||||
MYSQLDATAdir = $(localstatedir)
|
||||
MYSQLSHAREdir = $(pkgdatadir)
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
/* Copyright (C) 2000 MySQL AB
|
||||
/* Copyright (C) 2000-2004 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
the Free Software Foundation.
|
||||
|
||||
There are special exceptions to the terms and conditions of the GPL as it
|
||||
is applied to this software. View the full text of the exception in file
|
||||
EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
/* Copyright (C) 2000 MySQL AB
|
||||
/* Copyright (C) 2000-2004 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
the Free Software Foundation.
|
||||
|
||||
There are special exceptions to the terms and conditions of the GPL as it
|
||||
is applied to this software. View the full text of the exception in file
|
||||
EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
/* Copyright (C) 2000 MySQL AB
|
||||
/* Copyright (C) 2000-2004 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
the Free Software Foundation.
|
||||
|
||||
There are special exceptions to the terms and conditions of the GPL as it
|
||||
is applied to this software. View the full text of the exception in file
|
||||
EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
/* Copyright (C) 2000-2003 MySQL AB
|
||||
/* Copyright (C) 2000-2004 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
the Free Software Foundation.
|
||||
|
||||
There are special exceptions to the terms and conditions of the GPL as it
|
||||
is applied to this software. View the full text of the exception in file
|
||||
EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
/* Copyright (C) 2000-2003 MySQL AB
|
||||
/* Copyright (C) 2000-2004 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
the Free Software Foundation.
|
||||
|
||||
There are special exceptions to the terms and conditions of the GPL as it
|
||||
is applied to this software. View the full text of the exception in file
|
||||
EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
/* Copyright (C) 2000 MySQL AB
|
||||
/* Copyright (C) 2000-2004 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
the Free Software Foundation.
|
||||
|
||||
There are special exceptions to the terms and conditions of the GPL as it
|
||||
is applied to this software. View the full text of the exception in file
|
||||
EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
# Copyright (C) 2000-2004 MySQL AB
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of version 2 GNU General Public License as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# There are special exceptions to the terms and conditions of the GPL as it
|
||||
# is applied to this software. View the full text of the exception in file
|
||||
# EXCEPTIONS-CLIENT in the directory of this software distribution.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
@ -14,8 +17,8 @@
|
|||
# License along with this library; if not, write to the Free
|
||||
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
# MA 02111-1307, USA
|
||||
|
||||
|
||||
#
|
||||
# This file is public domain and comes with NO WARRANTY of any kind
|
||||
|
||||
target = libmysqlclient_r.la
|
||||
target_defs = -DDONT_USE_RAID -DMYSQL_CLIENT @LIB_EXTRA_CCFLAGS@
|
||||
|
|
|
@ -23,7 +23,7 @@ man_MANS = mysql.1 isamchk.1 isamlog.1 mysql_zap.1 mysqlaccess.1 \
|
|||
|
||||
EXTRA_DIST = mysql.1.in isamchk.1.in isamlog.1.in mysql_zap.1.in \
|
||||
mysqlaccess.1.in mysqladmin.1.in mysqld.1.in mysqld_multi.1.in \
|
||||
mysqldump.1.in mysqlshow.1.in perror.1.in replace.1.in \
|
||||
mysqldump.1.in mysqlshow.1.in perror.1.in replace.1.in mysqlman.1.in \
|
||||
mysqld_safe.1.in mysql_fix_privilege_tables.1.in
|
||||
|
||||
CLEANFILES = $(man_MANS)
|
||||
|
|
15
man/mysqlman.1.in
Normal file
15
man/mysqlman.1.in
Normal file
|
@ -0,0 +1,15 @@
|
|||
.TH mysqlman 1 "20 July 2004" "MySQL @MYSQL_BASE_VERSION@" "MySQL database"
|
||||
.SH NAME
|
||||
mysqlman \- default man page for mysql
|
||||
.SH "DESCRIPTION"
|
||||
Certain executables distributed with the MySQL database management system do
|
||||
not have specific man pages.
|
||||
.SH "SEE ALSO"
|
||||
In most cases, you can run the executable from the command line with a "--help"
|
||||
argument to display a brief summary of the executable's arguments and function.
|
||||
For more information about MySQL, please refer to the MySQL reference manual,
|
||||
which may already be installed locally and which is also available online at
|
||||
http://dev.mysql.com/doc/
|
||||
.SH BUGS
|
||||
Please refer to http://bugs.mysql.com/ to report bugs.
|
||||
.\" end of man page
|
|
@ -212,6 +212,8 @@ uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old,
|
|||
if (!(*key++= (char) 1-*old++)) /* Copy null marker */
|
||||
{
|
||||
k_length-=length;
|
||||
if (keyseg->flag & (HA_VAR_LENGTH | HA_BLOB_PART))
|
||||
k_length-=2; /* Skip length */
|
||||
continue; /* Found NULL */
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,8 +63,8 @@ int _mi_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
uchar *keypos,*maxpos;
|
||||
uchar lastkey[MI_MAX_KEY_BUFF],*buff;
|
||||
DBUG_ENTER("_mi_search");
|
||||
DBUG_PRINT("enter",("pos: %ld nextflag: %d lastpos: %ld",
|
||||
pos,nextflag,info->lastpos));
|
||||
DBUG_PRINT("enter",("pos: %lu nextflag: %u lastpos: %lu",
|
||||
(ulong) pos, nextflag, (ulong) info->lastpos));
|
||||
DBUG_EXECUTE("key",_mi_print_key(DBUG_FILE,keyinfo->seg,key,key_len););
|
||||
|
||||
if (pos == HA_OFFSET_ERROR)
|
||||
|
@ -235,15 +235,15 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
|
|||
if (length == 0 || page > end)
|
||||
{
|
||||
my_errno=HA_ERR_CRASHED;
|
||||
DBUG_PRINT("error",("Found wrong key: length: %d page: %lx end: %lx",
|
||||
length,page,end));
|
||||
DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p",
|
||||
length, page, end));
|
||||
DBUG_RETURN(MI_FOUND_WRONG_KEY);
|
||||
}
|
||||
if ((flag=ha_key_cmp(keyinfo->seg,t_buff,key,key_len,comp_flag,
|
||||
¬_used)) >= 0)
|
||||
break;
|
||||
#ifdef EXTRA_DEBUG
|
||||
DBUG_PRINT("loop",("page: %lx key: '%s' flag: %d",page,t_buff,flag));
|
||||
DBUG_PRINT("loop",("page: %p key: '%s' flag: %d", page, t_buff, flag));
|
||||
#endif
|
||||
memcpy(buff,t_buff,length);
|
||||
*ret_pos=page;
|
||||
|
@ -251,7 +251,7 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
|
|||
if (flag == 0)
|
||||
memcpy(buff,t_buff,length); /* Result is first key */
|
||||
*last_key= page == end;
|
||||
DBUG_PRINT("exit",("flag: %d ret_pos: %lx",flag,*ret_pos));
|
||||
DBUG_PRINT("exit",("flag: %d ret_pos: %p", flag, *ret_pos));
|
||||
DBUG_RETURN(flag);
|
||||
} /* _mi_seq_search */
|
||||
|
||||
|
@ -381,8 +381,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
|
|||
if (page > end)
|
||||
{
|
||||
my_errno=HA_ERR_CRASHED;
|
||||
DBUG_PRINT("error",("Found wrong key: length: %d page: %lx end: %lx",
|
||||
length,page,end));
|
||||
DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p",
|
||||
length, page, end));
|
||||
DBUG_RETURN(MI_FOUND_WRONG_KEY);
|
||||
}
|
||||
|
||||
|
@ -502,7 +502,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
|
|||
|
||||
*last_key= page == end;
|
||||
|
||||
DBUG_PRINT("exit",("flag: %d ret_pos: %lx",flag,*ret_pos));
|
||||
DBUG_PRINT("exit",("flag: %d ret_pos: %p", flag, *ret_pos));
|
||||
DBUG_RETURN(flag);
|
||||
} /* _mi_prefix_search */
|
||||
|
||||
|
@ -579,7 +579,7 @@ my_off_t _mi_dpos(MI_INFO *info, uint nod_flag, uchar *after_key)
|
|||
after_key-=(nod_flag + info->s->rec_reflength);
|
||||
switch (info->s->rec_reflength) {
|
||||
#if SIZEOF_OFF_T > 4
|
||||
case 8: pos= (my_off_t) mi_uint5korr(after_key); break;
|
||||
case 8: pos= (my_off_t) mi_uint8korr(after_key); break;
|
||||
case 7: pos= (my_off_t) mi_uint7korr(after_key); break;
|
||||
case 6: pos= (my_off_t) mi_uint6korr(after_key); break;
|
||||
case 5: pos= (my_off_t) mi_uint5korr(after_key); break;
|
||||
|
@ -750,8 +750,9 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
|
|||
key+= length; /* Same diff_key as prev */
|
||||
if (length > keyseg->length)
|
||||
{
|
||||
DBUG_PRINT("error",("Found too long null packed key: %d of %d at %lx",
|
||||
length, keyseg->length, *page_pos));
|
||||
DBUG_PRINT("error",
|
||||
("Found too long null packed key: %u of %u at %p",
|
||||
length, keyseg->length, *page_pos));
|
||||
DBUG_DUMP("key",(char*) *page_pos,16);
|
||||
my_errno=HA_ERR_CRASHED;
|
||||
return 0;
|
||||
|
@ -806,7 +807,7 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
|
|||
}
|
||||
if (length > (uint) keyseg->length)
|
||||
{
|
||||
DBUG_PRINT("error",("Found too long packed key: %d of %d at %lx",
|
||||
DBUG_PRINT("error",("Found too long packed key: %u of %u at %p",
|
||||
length, keyseg->length, *page_pos));
|
||||
DBUG_DUMP("key",(char*) *page_pos,16);
|
||||
my_errno=HA_ERR_CRASHED;
|
||||
|
@ -861,7 +862,7 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
|
|||
{
|
||||
if (length > keyinfo->maxlength)
|
||||
{
|
||||
DBUG_PRINT("error",("Found too long binary packed key: %d of %d at %lx",
|
||||
DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %p",
|
||||
length, keyinfo->maxlength, *page_pos));
|
||||
DBUG_DUMP("key",(char*) *page_pos,16);
|
||||
my_errno=HA_ERR_CRASHED;
|
||||
|
@ -908,7 +909,7 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
|
|||
length-=tmp;
|
||||
from=page; from_end=page_end;
|
||||
}
|
||||
DBUG_PRINT("info",("key: %lx from: %lx length: %u",
|
||||
DBUG_PRINT("info",("key: %p from: %p length: %u",
|
||||
key, from, length));
|
||||
memcpy_overlap((byte*) key, (byte*) from, (size_t) length);
|
||||
key+=length;
|
||||
|
@ -964,7 +965,7 @@ uchar *_mi_get_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page,
|
|||
}
|
||||
}
|
||||
}
|
||||
DBUG_PRINT("exit",("page: %lx length: %d",page,*return_key_length));
|
||||
DBUG_PRINT("exit",("page: %p length: %u", page, *return_key_length));
|
||||
DBUG_RETURN(page);
|
||||
} /* _mi_get_key */
|
||||
|
||||
|
@ -1015,7 +1016,7 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page,
|
|||
uint nod_flag;
|
||||
uchar *lastpos;
|
||||
DBUG_ENTER("_mi_get_last_key");
|
||||
DBUG_PRINT("enter",("page: %lx endpos: %lx",page,endpos));
|
||||
DBUG_PRINT("enter",("page: %p endpos: %p", page, endpos));
|
||||
|
||||
nod_flag=mi_test_if_nod(page);
|
||||
if (! (keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY)))
|
||||
|
@ -1035,13 +1036,13 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page,
|
|||
*return_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&page,lastkey);
|
||||
if (*return_key_length == 0)
|
||||
{
|
||||
DBUG_PRINT("error",("Couldn't find last key: page: %lx",page));
|
||||
DBUG_PRINT("error",("Couldn't find last key: page: %p", page));
|
||||
my_errno=HA_ERR_CRASHED;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
DBUG_PRINT("exit",("lastpos: %lx length: %d",lastpos,*return_key_length));
|
||||
DBUG_PRINT("exit",("lastpos: %p length: %u", lastpos, *return_key_length));
|
||||
DBUG_RETURN(lastpos);
|
||||
} /* _mi_get_last_key */
|
||||
|
||||
|
@ -1126,8 +1127,9 @@ int _mi_search_next(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
uint nod_flag;
|
||||
uchar lastkey[MI_MAX_KEY_BUFF];
|
||||
DBUG_ENTER("_mi_search_next");
|
||||
DBUG_PRINT("enter",("nextflag: %d lastpos: %ld int_keypos: %lx",
|
||||
nextflag,(long) info->lastpos,info->int_keypos));
|
||||
DBUG_PRINT("enter",("nextflag: %u lastpos: %lu int_keypos: %lu",
|
||||
nextflag, (ulong) info->lastpos,
|
||||
(ulong) info->int_keypos));
|
||||
DBUG_EXECUTE("key",_mi_print_key(DBUG_FILE,keyinfo->seg,key,key_length););
|
||||
|
||||
/* Force full read if we are at last key or if we are not on a leaf
|
||||
|
@ -1234,7 +1236,7 @@ int _mi_search_first(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
info->page_changed=info->buff_used=0;
|
||||
info->lastpos=_mi_dpos(info,0,info->lastkey+info->lastkey_length);
|
||||
|
||||
DBUG_PRINT("exit",("found key at %ld",(ulong) info->lastpos));
|
||||
DBUG_PRINT("exit",("found key at %lu", (ulong) info->lastpos));
|
||||
DBUG_RETURN(0);
|
||||
} /* _mi_search_first */
|
||||
|
||||
|
@ -1468,8 +1470,8 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key,
|
|||
}
|
||||
s_temp->totlength=(uint) length;
|
||||
s_temp->prev_length=0;
|
||||
DBUG_PRINT("test",("tot_length: %d length: %d uniq_key_length: %d",
|
||||
key_length,length,s_temp->key_length));
|
||||
DBUG_PRINT("test",("tot_length: %u length: %d uniq_key_length: %u",
|
||||
key_length, length, s_temp->key_length));
|
||||
|
||||
/* If something after that hasn't length=0, test if we can combine */
|
||||
if ((s_temp->next_key_pos=next_key))
|
||||
|
@ -1575,7 +1577,7 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key,
|
|||
ref_length=0;
|
||||
next_length_pack=0;
|
||||
}
|
||||
DBUG_PRINT("test",("length: %d next_key: %lx",length,next_key));
|
||||
DBUG_PRINT("test",("length: %d next_key: %p", length, next_key));
|
||||
|
||||
{
|
||||
uint tmp_length;
|
||||
|
|
|
@ -62,6 +62,7 @@ install-data-local:
|
|||
$(INSTALL_DATA) $(srcdir)/r/*.require $(DESTDIR)$(testdir)/r
|
||||
$(INSTALL_DATA) $(srcdir)/include/*.inc $(DESTDIR)$(testdir)/include
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.dat $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.*001 $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.pem $(DESTDIR)$(testdir)/std_data
|
||||
|
||||
|
|
|
@ -612,6 +612,7 @@ show_failed_diff ()
|
|||
echo "Please follow the instructions outlined at"
|
||||
echo "http://www.mysql.com/doc/en/Reporting_mysqltest_bugs.html"
|
||||
echo "to find the reason to this problem and how to report this."
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
@ -476,3 +476,9 @@ alter table t1 drop key no_such_key;
|
|||
ERROR 42000: Can't DROP 'no_such_key'; check that column/key exists
|
||||
alter table t1 drop key a;
|
||||
drop table t1;
|
||||
create table t1 (a int);
|
||||
alter table t1 rename to `t1\\`;
|
||||
ERROR 42000: Incorrect table name 't1\\'
|
||||
rename table t1 to `t1\\`;
|
||||
ERROR 42000: Incorrect table name 't1\\'
|
||||
drop table t1;
|
||||
|
|
|
@ -155,3 +155,6 @@ select * from t1 where a like '%ESKA%';
|
|||
a
|
||||
PPUH PESKA-I Maria Struniarska
|
||||
DROP TABLE t1;
|
||||
select _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin;
|
||||
_cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin
|
||||
1
|
||||
|
|
|
@ -43,7 +43,7 @@ Warnings:
|
|||
Note 1003 select abs(-(10)) AS `abs(-10)`,sign(-(5)) AS `sign(-5)`,sign(5) AS `sign(5)`,sign(0) AS `sign(0)`
|
||||
select log(exp(10)),exp(log(sqrt(10))*2),log(-1),log(NULL),log(1,1),log(3,9),log(-1,2),log(NULL,2);
|
||||
log(exp(10)) exp(log(sqrt(10))*2) log(-1) log(NULL) log(1,1) log(3,9) log(-1,2) log(NULL,2)
|
||||
10.000000 10.000000 NULL NULL NULL 2.000000 NULL NULL
|
||||
10 10 NULL NULL NULL 2 NULL NULL
|
||||
explain extended select log(exp(10)),exp(log(sqrt(10))*2),log(-1),log(NULL),log(1,1),log(3,9),log(-1,2),log(NULL,2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
@ -51,7 +51,7 @@ Warnings:
|
|||
Note 1003 select log(exp(10)) AS `log(exp(10))`,exp((log(sqrt(10)) * 2)) AS `exp(log(sqrt(10))*2)`,log(-(1)) AS `log(-1)`,log(NULL) AS `log(NULL)`,log(1,1) AS `log(1,1)`,log(3,9) AS `log(3,9)`,log(-(1),2) AS `log(-1,2)`,log(NULL,2) AS `log(NULL,2)`
|
||||
select ln(exp(10)),exp(ln(sqrt(10))*2),ln(-1),ln(0),ln(NULL);
|
||||
ln(exp(10)) exp(ln(sqrt(10))*2) ln(-1) ln(0) ln(NULL)
|
||||
10.000000 10.000000 NULL NULL NULL
|
||||
10 10 NULL NULL NULL
|
||||
explain extended select ln(exp(10)),exp(ln(sqrt(10))*2),ln(-1),ln(0),ln(NULL);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
@ -59,7 +59,7 @@ Warnings:
|
|||
Note 1003 select ln(exp(10)) AS `ln(exp(10))`,exp((ln(sqrt(10)) * 2)) AS `exp(ln(sqrt(10))*2)`,ln(-(1)) AS `ln(-1)`,ln(0) AS `ln(0)`,ln(NULL) AS `ln(NULL)`
|
||||
select log2(8),log2(15),log2(-2),log2(0),log2(NULL);
|
||||
log2(8) log2(15) log2(-2) log2(0) log2(NULL)
|
||||
3.000000 3.906891 NULL NULL NULL
|
||||
3 3.9068905956085 NULL NULL NULL
|
||||
explain extended select log2(8),log2(15),log2(-2),log2(0),log2(NULL);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
@ -67,7 +67,7 @@ Warnings:
|
|||
Note 1003 select log2(8) AS `log2(8)`,log2(15) AS `log2(15)`,log2(-(2)) AS `log2(-2)`,log2(0) AS `log2(0)`,log2(NULL) AS `log2(NULL)`
|
||||
select log10(100),log10(18),log10(-4),log10(0),log10(NULL);
|
||||
log10(100) log10(18) log10(-4) log10(0) log10(NULL)
|
||||
2.000000 1.255273 NULL NULL NULL
|
||||
2 1.2552725051033 NULL NULL NULL
|
||||
explain extended select log10(100),log10(18),log10(-4),log10(0),log10(NULL);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
@ -75,7 +75,7 @@ Warnings:
|
|||
Note 1003 select log10(100) AS `log10(100)`,log10(18) AS `log10(18)`,log10(-(4)) AS `log10(-4)`,log10(0) AS `log10(0)`,log10(NULL) AS `log10(NULL)`
|
||||
select pow(10,log10(10)),power(2,4);
|
||||
pow(10,log10(10)) power(2,4)
|
||||
10.000000 16.000000
|
||||
10 16
|
||||
explain extended select pow(10,log10(10)),power(2,4);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
@ -90,35 +90,35 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select sql_no_cache rand(999999) AS `rand(999999)`,rand() AS `rand()`
|
||||
select pi(),sin(pi()/2),cos(pi()/2),abs(tan(pi())),cot(1),asin(1),acos(0),atan(1);
|
||||
pi() sin(pi()/2) cos(pi()/2) abs(tan(pi())) cot(1) asin(1) acos(0) atan(1)
|
||||
3.141593 1.000000 0.000000 0.000000 0.64209262 1.570796 1.570796 0.785398
|
||||
explain extended select pi(),sin(pi()/2),cos(pi()/2),abs(tan(pi())),cot(1),asin(1),acos(0),atan(1);
|
||||
select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6);
|
||||
pi() format(sin(pi()/2),6) format(cos(pi()/2),6) format(abs(tan(pi())),6) format(cot(1),6) format(asin(1),6) format(acos(0),6) format(atan(1),6)
|
||||
3.141593 1.000000 0.000000 0.000000 0.642093 1.570796 1.570796 0.785398
|
||||
explain extended select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select pi() AS `pi()`,sin((pi() / 2)) AS `sin(pi()/2)`,cos((pi() / 2)) AS `cos(pi()/2)`,abs(tan(pi())) AS `abs(tan(pi()))`,(1 / tan(1)) AS `cot(1)`,asin(1) AS `asin(1)`,acos(0) AS `acos(0)`,atan(1) AS `atan(1)`
|
||||
Note 1003 select pi() AS `pi()`,format(sin((pi() / 2)),6) AS `format(sin(pi()/2),6)`,format(cos((pi() / 2)),6) AS `format(cos(pi()/2),6)`,format(abs(tan(pi())),6) AS `format(abs(tan(pi())),6)`,format((1 / tan(1)),6) AS `format(cot(1),6)`,format(asin(1),6) AS `format(asin(1),6)`,format(acos(0),6) AS `format(acos(0),6)`,format(atan(1),6) AS `format(atan(1),6)`
|
||||
select degrees(pi()),radians(360);
|
||||
degrees(pi()) radians(360)
|
||||
180 6.2831853071796
|
||||
SELECT ACOS(1.0);
|
||||
ACOS(1.0)
|
||||
0.000000
|
||||
0
|
||||
SELECT ASIN(1.0);
|
||||
ASIN(1.0)
|
||||
1.570796
|
||||
1.5707963267949
|
||||
SELECT ACOS(0.2*5.0);
|
||||
ACOS(0.2*5.0)
|
||||
0.000000
|
||||
0
|
||||
SELECT ACOS(0.5*2.0);
|
||||
ACOS(0.5*2.0)
|
||||
0.000000
|
||||
0
|
||||
SELECT ASIN(0.8+0.2);
|
||||
ASIN(0.8+0.2)
|
||||
1.570796
|
||||
1.5707963267949
|
||||
SELECT ASIN(1.2-0.2);
|
||||
ASIN(1.2-0.2)
|
||||
1.570796
|
||||
1.5707963267949
|
||||
explain extended select degrees(pi()),radians(360);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
|
|
|
@ -229,3 +229,22 @@ GRANT SELECT (
|
|||
REVOKE SELECT (ËÏÌ) ON ÂÄ.ÔÁÂ FROM ÀÚÅÒ@localhost;
|
||||
DROP DATABASE ÂÄ;
|
||||
SET NAMES latin1;
|
||||
insert into mysql.user (host, user) values ('localhost', 'test11');
|
||||
insert into mysql.db (host, db, user, select_priv) values
|
||||
('localhost', 'a%', 'test11', 'Y'), ('localhost', 'ab%', 'test11', 'Y');
|
||||
alter table mysql.db order by db asc;
|
||||
flush privileges;
|
||||
show grants for test11@localhost;
|
||||
Grants for test11@localhost
|
||||
GRANT USAGE ON *.* TO 'test11'@'localhost'
|
||||
GRANT SELECT ON `ab%`.* TO 'test11'@'localhost'
|
||||
GRANT SELECT ON `a%`.* TO 'test11'@'localhost'
|
||||
alter table mysql.db order by db desc;
|
||||
flush privileges;
|
||||
show grants for test11@localhost;
|
||||
Grants for test11@localhost
|
||||
GRANT USAGE ON *.* TO 'test11'@'localhost'
|
||||
GRANT SELECT ON `ab%`.* TO 'test11'@'localhost'
|
||||
GRANT SELECT ON `a%`.* TO 'test11'@'localhost'
|
||||
delete from mysql.user where user='test11';
|
||||
delete from mysql.db where user='test11';
|
||||
|
|
|
@ -87,3 +87,43 @@ sqty
|
|||
5
|
||||
9
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`description` text
|
||||
) ENGINE=MyISAM;
|
||||
CREATE TABLE t2 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`description` varchar(20)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (1, 'test');
|
||||
INSERT INTO t2 VALUES (1, 'test');
|
||||
CREATE TABLE t3 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`order_id` bigint(20) NOT NULL default '0'
|
||||
) ENGINE=MyISAM;
|
||||
select
|
||||
a.id, a.description,
|
||||
count(b.id) as c
|
||||
from t1 a left join t3 b on a.id=b.order_id
|
||||
group by a.id, a.description
|
||||
having (a.description is not null) and (c=0);
|
||||
id description c
|
||||
1 test 0
|
||||
select
|
||||
a.*,
|
||||
count(b.id) as c
|
||||
from t2 a left join t3 b on a.id=b.order_id
|
||||
group by a.id, a.description
|
||||
having (a.description is not null) and (c=0);
|
||||
id description c
|
||||
1 test 0
|
||||
INSERT INTO t1 VALUES (2, 'test2');
|
||||
select
|
||||
a.id, a.description,
|
||||
count(b.id) as c
|
||||
from t1 a left join t3 b on a.id=b.order_id
|
||||
group by a.id, a.description
|
||||
having (a.description is not null) and (c=0);
|
||||
id description c
|
||||
1 test 0
|
||||
2 test2 0
|
||||
|
|
|
@ -217,3 +217,13 @@ DELETE from t1 where a < 100;
|
|||
SELECT * from t1;
|
||||
a
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE `job_titles` (
|
||||
`job_title_id` int(6) unsigned NOT NULL default '0',
|
||||
`job_title` char(18) NOT NULL default '',
|
||||
PRIMARY KEY (`job_title_id`),
|
||||
UNIQUE KEY `job_title_id` (`job_title_id`,`job_title`)
|
||||
) ENGINE=HEAP;
|
||||
SELECT MAX(job_title_id) FROM job_titles;
|
||||
MAX(job_title_id)
|
||||
NULL
|
||||
DROP TABLE job_titles;
|
||||
|
|
|
@ -529,3 +529,12 @@ show keys from t1;
|
|||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a NULL NULL NULL NULL YES HASH
|
||||
drop table t1,t2;
|
||||
create table t1 ( a tinytext, b char(1), index idx (a(1),b) );
|
||||
insert into t1 values (null,''), (null,'');
|
||||
explain select count(*) from t1 where a is null;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref idx idx 4 const 1 Using where
|
||||
select count(*) from t1 where a is null;
|
||||
count(*)
|
||||
2
|
||||
drop table t1;
|
||||
|
|
|
@ -79,3 +79,20 @@ SELECT DATE_FORMAT(f1, "%l.%i %p") , DATE_FORMAT(f2, "%l.%i %p") FROM t1;
|
|||
DATE_FORMAT(f1, "%l.%i %p") DATE_FORMAT(f2, "%l.%i %p")
|
||||
9.00 AM 12.00 PM
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f1 DATE);
|
||||
CREATE TABLE t2 (f2 VARCHAR(8));
|
||||
CREATE TABLE t3 (f2 CHAR(8));
|
||||
INSERT INTO t1 VALUES ('1978-11-26');
|
||||
INSERT INTO t2 SELECT f1+0 FROM t1;
|
||||
INSERT INTO t2 SELECT f1+0 FROM t1 UNION SELECT f1+0 FROM t1;
|
||||
INSERT INTO t3 SELECT f1+0 FROM t1;
|
||||
INSERT INTO t3 SELECT f1+0 FROM t1 UNION SELECT f1+0 FROM t1;
|
||||
SELECT * FROM t2;
|
||||
f2
|
||||
19781126
|
||||
19781126
|
||||
SELECT * FROM t3;
|
||||
f2
|
||||
19781126
|
||||
19781126
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
|
|
@ -75,14 +75,17 @@ insert t1 values (121,"16");
|
|||
select c1 + c1 * (c2 / 100) as col from t1;
|
||||
col
|
||||
140.36
|
||||
create table t2 select c1 + c1 * (c2 / 100) as col from t1;
|
||||
create table t2 select c1 + c1 * (c2 / 100) as col1, round(c1, 5) as col2, round(c1, 35) as col3, sqrt(c1*1e-15) col4 from t1;
|
||||
select * from t2;
|
||||
col
|
||||
140.36
|
||||
col1 col2 col3 col4
|
||||
140.36 121.00000 121 3.47850542618522e-07
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`col` double default NULL
|
||||
`col1` double default NULL,
|
||||
`col2` double(22,5) default NULL,
|
||||
`col3` double default NULL,
|
||||
`col4` double default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1,t2;
|
||||
create table t1 (a float);
|
||||
|
|
|
@ -5,8 +5,12 @@ insert into t1 values (1);
|
|||
insert into t1 values (-1);
|
||||
Warnings:
|
||||
Warning 1264 Data truncated; out of range for column 'this' at row 1
|
||||
insert into t1 values ('5000000000');
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'this' at row 1
|
||||
select * from t1;
|
||||
this
|
||||
1
|
||||
0
|
||||
4294967295
|
||||
drop table t1;
|
||||
|
|
|
@ -312,3 +312,14 @@ insert into t1 values (1,1), (2,2);
|
|||
alter table t1 drop key no_such_key;
|
||||
alter table t1 drop key a;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# BUG#4717 - check for valid table names
|
||||
#
|
||||
create table t1 (a int);
|
||||
--error 1103
|
||||
alter table t1 rename to `t1\\`;
|
||||
--error 1103
|
||||
rename table t1 to `t1\\`;
|
||||
drop table t1;
|
||||
|
||||
|
|
|
@ -90,3 +90,9 @@ select * from t1 where a like '%PES%';
|
|||
select * from t1 where a like '%PESKA%';
|
||||
select * from t1 where a like '%ESKA%';
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# LIKE crashed for binary collations in some cases
|
||||
#
|
||||
select _cp866'aaaaaaaaa' like _cp866'%aaaa%' collate cp866_bin;
|
||||
|
||||
|
|
|
@ -26,8 +26,8 @@ explain extended select pow(10,log10(10)),power(2,4);
|
|||
set @@rand_seed1=10000000,@@rand_seed2=1000000;
|
||||
select rand(999999),rand();
|
||||
explain extended select rand(999999),rand();
|
||||
select pi(),sin(pi()/2),cos(pi()/2),abs(tan(pi())),cot(1),asin(1),acos(0),atan(1);
|
||||
explain extended select pi(),sin(pi()/2),cos(pi()/2),abs(tan(pi())),cot(1),asin(1),acos(0),atan(1);
|
||||
select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6);
|
||||
explain extended select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6);
|
||||
select degrees(pi()),radians(360);
|
||||
|
||||
#
|
||||
|
|
|
@ -173,3 +173,19 @@ REVOKE SELECT (
|
|||
|
||||
DROP DATABASE 薩;
|
||||
SET NAMES latin1;
|
||||
|
||||
#
|
||||
# Bug #4898: User privileges depending on ORDER BY Settings of table db
|
||||
#
|
||||
insert into mysql.user (host, user) values ('localhost', 'test11');
|
||||
insert into mysql.db (host, db, user, select_priv) values
|
||||
('localhost', 'a%', 'test11', 'Y'), ('localhost', 'ab%', 'test11', 'Y');
|
||||
alter table mysql.db order by db asc;
|
||||
flush privileges;
|
||||
show grants for test11@localhost;
|
||||
alter table mysql.db order by db desc;
|
||||
flush privileges;
|
||||
show grants for test11@localhost;
|
||||
delete from mysql.user where user='test11';
|
||||
delete from mysql.db where user='test11';
|
||||
|
||||
|
|
|
@ -75,3 +75,49 @@ select id, sum(qty) as sqty from t1 group by id having sqty>2;
|
|||
select sum(qty) as sqty from t1 group by id having count(id) > 0;
|
||||
select sum(qty) as sqty from t1 group by id having count(distinct id) > 0;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Test case for Bug #4358 Problem with HAVING clause that uses alias from the
|
||||
# select list and TEXT field
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`description` text
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
CREATE TABLE t2 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`description` varchar(20)
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
INSERT INTO t1 VALUES (1, 'test');
|
||||
INSERT INTO t2 VALUES (1, 'test');
|
||||
|
||||
CREATE TABLE t3 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`order_id` bigint(20) NOT NULL default '0'
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
select
|
||||
a.id, a.description,
|
||||
count(b.id) as c
|
||||
from t1 a left join t3 b on a.id=b.order_id
|
||||
group by a.id, a.description
|
||||
having (a.description is not null) and (c=0);
|
||||
|
||||
select
|
||||
a.*,
|
||||
count(b.id) as c
|
||||
from t2 a left join t3 b on a.id=b.order_id
|
||||
group by a.id, a.description
|
||||
having (a.description is not null) and (c=0);
|
||||
|
||||
INSERT INTO t1 VALUES (2, 'test2');
|
||||
|
||||
select
|
||||
a.id, a.description,
|
||||
count(b.id) as c
|
||||
from t1 a left join t3 b on a.id=b.order_id
|
||||
group by a.id, a.description
|
||||
having (a.description is not null) and (c=0);
|
||||
|
|
|
@ -150,3 +150,17 @@ INSERT into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11);
|
|||
DELETE from t1 where a < 100;
|
||||
SELECT * from t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#4411 Server hangs when trying to SELECT MAX(id) from an empty HEAP table
|
||||
#
|
||||
CREATE TABLE `job_titles` (
|
||||
`job_title_id` int(6) unsigned NOT NULL default '0',
|
||||
`job_title` char(18) NOT NULL default '',
|
||||
PRIMARY KEY (`job_title_id`),
|
||||
UNIQUE KEY `job_title_id` (`job_title_id`,`job_title`)
|
||||
) ENGINE=HEAP;
|
||||
|
||||
SELECT MAX(job_title_id) FROM job_titles;
|
||||
|
||||
DROP TABLE job_titles;
|
||||
|
|
|
@ -502,3 +502,12 @@ alter table t1 disable keys;
|
|||
show keys from t1;
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# index search for NULL in blob. Bug #4816
|
||||
#
|
||||
create table t1 ( a tinytext, b char(1), index idx (a(1),b) );
|
||||
insert into t1 values (null,''), (null,'');
|
||||
explain select count(*) from t1 where a is null;
|
||||
select count(*) from t1 where a is null;
|
||||
drop table t1;
|
||||
|
||||
|
|
|
@ -88,3 +88,22 @@ CREATE TABLE t1 (f1 time default NULL, f2 time default NULL);
|
|||
INSERT INTO t1 (f1, f2) VALUES ('09:00', '12:00');
|
||||
SELECT DATE_FORMAT(f1, "%l.%i %p") , DATE_FORMAT(f2, "%l.%i %p") FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug 4937: different date -> string conversion when using SELECT ... UNION
|
||||
# and INSERT ... SELECT ... UNION
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (f1 DATE);
|
||||
CREATE TABLE t2 (f2 VARCHAR(8));
|
||||
CREATE TABLE t3 (f2 CHAR(8));
|
||||
|
||||
INSERT INTO t1 VALUES ('1978-11-26');
|
||||
INSERT INTO t2 SELECT f1+0 FROM t1;
|
||||
INSERT INTO t2 SELECT f1+0 FROM t1 UNION SELECT f1+0 FROM t1;
|
||||
INSERT INTO t3 SELECT f1+0 FROM t1;
|
||||
INSERT INTO t3 SELECT f1+0 FROM t1 UNION SELECT f1+0 FROM t1;
|
||||
SELECT * FROM t2;
|
||||
SELECT * FROM t3;
|
||||
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
|
|
@ -31,10 +31,14 @@ select a from t1 order by a;
|
|||
select min(a) from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# BUG#3612, BUG#4393, BUG#4356, BUG#4394
|
||||
#
|
||||
|
||||
create table t1 (c1 double, c2 varchar(20));
|
||||
insert t1 values (121,"16");
|
||||
select c1 + c1 * (c2 / 100) as col from t1;
|
||||
create table t2 select c1 + c1 * (c2 / 100) as col from t1;
|
||||
create table t2 select c1 + c1 * (c2 / 100) as col1, round(c1, 5) as col2, round(c1, 35) as col3, sqrt(c1*1e-15) col4 from t1;
|
||||
select * from t2;
|
||||
show create table t2;
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -10,5 +10,6 @@ SET SQL_WARNINGS=1;
|
|||
create table t1 (this int unsigned);
|
||||
insert into t1 values (1);
|
||||
insert into t1 values (-1);
|
||||
insert into t1 values ('5000000000');
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
|
|
@ -83,7 +83,7 @@ public:
|
|||
static Uint32 LoadConst64(Uint32 Register); // Value in next 2 words
|
||||
static Uint32 Add(Uint32 DstReg, Uint32 SrcReg1, Uint32 SrcReg2);
|
||||
static Uint32 Sub(Uint32 DstReg, Uint32 SrcReg1, Uint32 SrcReg2);
|
||||
static Uint32 Branch(Uint32 Inst, Uint32 R1, Uint32 R2);
|
||||
static Uint32 Branch(Uint32 Inst, Uint32 Reg1, Uint32 Reg2);
|
||||
static Uint32 ExitOK();
|
||||
|
||||
/**
|
||||
|
@ -184,8 +184,8 @@ Interpreter::Sub(Uint32 Dcoleg, Uint32 SrcReg1, Uint32 SrcReg2){
|
|||
|
||||
inline
|
||||
Uint32
|
||||
Interpreter::Branch(Uint32 Inst, Uint32 R1, Uint32 R2){
|
||||
return (R1 << 9) + (R2 << 6) + Inst;
|
||||
Interpreter::Branch(Uint32 Inst, Uint32 Reg1, Uint32 Reg2){
|
||||
return (Reg1 << 9) + (Reg2 << 6) + Inst;
|
||||
}
|
||||
|
||||
inline
|
||||
|
|
|
@ -176,7 +176,7 @@ public:
|
|||
/**
|
||||
* Trim string from <i>delim</i>
|
||||
*/
|
||||
static char* trim(char * src, const char * delim = " \t");
|
||||
static char* trim(char * src, const char * delim);
|
||||
private:
|
||||
char* m_chr;
|
||||
unsigned m_len;
|
||||
|
|
|
@ -280,3 +280,5 @@ LocalConfig::readConnectString(const char * connectString){
|
|||
}
|
||||
return return_value;
|
||||
}
|
||||
|
||||
template class Vector<MgmtSrvrId>;
|
||||
|
|
|
@ -382,3 +382,5 @@ CPCDAPISession::listProcesses(Parser_t::Context & /* unused */,
|
|||
|
||||
m_cpcd.m_processes.unlock();
|
||||
}
|
||||
|
||||
template class Vector<ParserRow<CPCDAPISession> const*>;
|
||||
|
|
|
@ -431,3 +431,5 @@ CPCD::report(int id, CPCEvent::EventType t){
|
|||
}
|
||||
m_subscribers.unlock();
|
||||
}
|
||||
|
||||
template class MutexVector<EventSubscriber*>;
|
||||
|
|
|
@ -75,3 +75,5 @@ void
|
|||
CPCD::Monitor::signal() {
|
||||
NdbCondition_Signal(m_changeCondition);
|
||||
}
|
||||
|
||||
template class MutexVector<CPCD::Process*>;
|
||||
|
|
|
@ -937,3 +937,8 @@ operator<<(NdbOut& ndbout, const TableS & table){
|
|||
} // for
|
||||
return ndbout;
|
||||
}
|
||||
|
||||
template class Vector<TableS*>;
|
||||
template class Vector<AttributeS*>;
|
||||
template class Vector<AttributeDesc*>;
|
||||
|
||||
|
|
|
@ -353,3 +353,4 @@ main(int argc, const char** argv)
|
|||
return 1;
|
||||
} // main
|
||||
|
||||
template class Vector<BackupConsumer*>;
|
||||
|
|
|
@ -1013,3 +1013,4 @@ BLOCK_FUNCTIONS(Ndbfs);
|
|||
template class Vector<AsyncFile*>;
|
||||
template class Vector<OpenFiles::OpenFileItem>;
|
||||
template class MemoryChannel<Request>;
|
||||
template class Pool<Request>;
|
||||
|
|
|
@ -2023,3 +2023,5 @@ CmdBackupCallback(const MgmtSrvr::BackupEvent & event){
|
|||
ndbout << str << endl;
|
||||
}
|
||||
#endif
|
||||
|
||||
template class Vector<char const*>;
|
||||
|
|
|
@ -559,3 +559,4 @@ SimpleCpcClient::ParserDummy::ParserDummy(NDB_SOCKET_TYPE sock)
|
|||
}
|
||||
|
||||
template class Vector<SimpleCpcClient::Process>;
|
||||
template class Vector<ParserRow<SimpleCpcClient::ParserDummy> const*>;
|
||||
|
|
|
@ -2883,3 +2883,6 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value,
|
|||
msg.assign("Success");
|
||||
return 0;
|
||||
}
|
||||
|
||||
template class Vector<SigMatch>;
|
||||
template bool SignalQueue::waitFor<SigMatch>(Vector<SigMatch>&, SigMatch*&, NdbApiSignal*&, unsigned);
|
||||
|
|
|
@ -1271,3 +1271,7 @@ MgmApiSession::setParameter(Parser_t::Context &,
|
|||
m_output->println("result: %d", ret);
|
||||
m_output->println("");
|
||||
}
|
||||
|
||||
template class MutexVector<int>;
|
||||
template class Vector<ParserRow<MgmApiSession> const*>;
|
||||
template class Vector<unsigned short>;
|
||||
|
|
|
@ -316,6 +316,7 @@ TransporterFacade::getIsNodeSendable(NodeId n) const {
|
|||
"%d of node: %d",
|
||||
node.m_info.m_type, n);
|
||||
abort();
|
||||
return false; // to remove compiler warning
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -307,3 +307,5 @@ waitClusterStatus(const char* _addr,
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
template class Vector<ndb_mgm_node_state>;
|
||||
|
|
|
@ -88,7 +88,7 @@ do
|
|||
done
|
||||
|
||||
for i in COPYING COPYING.LIB README Docs/INSTALL-BINARY \
|
||||
MySQLEULA.txt LICENSE.doc README.NW
|
||||
EXCEPTIONS-CLIENT MySQLEULA.txt LICENSE.doc README.NW
|
||||
do
|
||||
if [ -f $i ]
|
||||
then
|
||||
|
|
|
@ -45,8 +45,10 @@ fi
|
|||
mkdir -p $BASE/lib
|
||||
|
||||
for i in \
|
||||
libmysql/.libs/libmysqlclient.so* \
|
||||
libmysql_r/.libs/libmysqlclient_r.so*
|
||||
libmysql/.libs/libmysqlclient.s{l,o}* \
|
||||
libmysql/.libs/libmysqlclient*.dylib \
|
||||
libmysql_r/.libs/libmysqlclient_r.s{l,o}* \
|
||||
libmysql_r/.libs/libmysqlclient_r*.dylib
|
||||
do
|
||||
if [ -f $i ]
|
||||
then
|
||||
|
|
|
@ -275,7 +275,7 @@ touch $BASE/innobase/ib_config.h
|
|||
#
|
||||
|
||||
cd $SOURCE
|
||||
for i in COPYING ChangeLog README \
|
||||
for i in COPYING ChangeLog README EXCEPTIONS-CLIENT\
|
||||
INSTALL-SOURCE INSTALL-WIN \
|
||||
INSTALL-WIN-SOURCE \
|
||||
Docs/manual_toc.html Docs/manual.html \
|
||||
|
|
|
@ -1037,7 +1037,7 @@ void mysql_read_default_options(struct st_mysql_options *options,
|
|||
options->client_flag&= ~CLIENT_LOCAL_FILES;
|
||||
break;
|
||||
case 22:
|
||||
options->client_flag&= CLIENT_LOCAL_FILES;
|
||||
options->client_flag&= ~CLIENT_LOCAL_FILES;
|
||||
break;
|
||||
case 23: /* replication probe */
|
||||
#ifndef TO_BE_DELETED
|
||||
|
|
|
@ -45,6 +45,7 @@ mysqld_LDADD = @MYSQLD_EXTRA_LDFLAGS@ \
|
|||
@innodb_system_libs@ \
|
||||
@ndbcluster_libs@ @ndbcluster_system_libs@ \
|
||||
$(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ @openssl_libs@
|
||||
mysqld_DEPENDENCIES = @ndbcluster_libs@ @ndbcluster_system_libs@
|
||||
noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
||||
item_strfunc.h item_timefunc.h item_uniq.h \
|
||||
item_create.h item_subselect.h item_row.h \
|
||||
|
@ -153,8 +154,8 @@ sql_lex.o: lex_hash.h
|
|||
udf_example.so: udf_example.cc
|
||||
$(CXXCOMPILE) -shared -o $@ $<
|
||||
|
||||
#distclean:
|
||||
# rm -f lex_hash.h
|
||||
distclean:
|
||||
rm -f lex_hash.h
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
|
94
sql/field.cc
94
sql/field.cc
|
@ -46,6 +46,8 @@ template class List_iterator<create_field>;
|
|||
uchar Field_null::null[1]={1};
|
||||
const char field_separator=',';
|
||||
|
||||
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE 320
|
||||
|
||||
/*****************************************************************************
|
||||
Static help functions
|
||||
*****************************************************************************/
|
||||
|
@ -876,7 +878,7 @@ int Field_decimal::store(double nr)
|
|||
|
||||
reg4 uint i,length;
|
||||
char fyllchar,*to;
|
||||
char buff[320];
|
||||
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
|
||||
|
||||
fyllchar = zerofill ? (char) '0' : (char) ' ';
|
||||
#ifdef HAVE_SNPRINTF
|
||||
|
@ -1751,13 +1753,14 @@ void Field_medium::sql_type(String &res) const
|
|||
int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
{
|
||||
long tmp;
|
||||
int error= 0;
|
||||
int error= 0, cuted_fields= 0;
|
||||
char *end;
|
||||
|
||||
tmp= cs->cset->scan(cs, from, from+len, MY_SEQ_SPACES);
|
||||
len-= tmp;
|
||||
from+= tmp;
|
||||
my_errno=0;
|
||||
|
||||
if (unsigned_flag)
|
||||
{
|
||||
if (!len || *from == '-')
|
||||
|
@ -1774,6 +1777,34 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
|
|||
if (error ||
|
||||
(from+len != end && table->in_use->count_cuted_fields &&
|
||||
!test_if_int(from,len,end,cs)))
|
||||
error= 1;
|
||||
#if SIZEOF_LONG > 4
|
||||
if (unsigned_flag)
|
||||
{
|
||||
if (tmp > UINT_MAX32)
|
||||
{
|
||||
tmp= UINT_MAX32;
|
||||
error= 1;
|
||||
my_errno=ERANGE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tmp > INT_MAX32)
|
||||
{
|
||||
tmp= INT_MAX32;
|
||||
error= 1;
|
||||
my_errno=ERANGE;
|
||||
}
|
||||
else if (tmp < INT_MIN32)
|
||||
{
|
||||
tmp= INT_MIN32;
|
||||
error= 1;
|
||||
my_errno=ERANGE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (error)
|
||||
{
|
||||
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
|
||||
error= 1;
|
||||
|
@ -2695,7 +2726,7 @@ String *Field_double::val_str(String *val_buffer,
|
|||
#endif
|
||||
doubleget(nr,ptr);
|
||||
|
||||
uint to_length=max(field_length,320);
|
||||
uint to_length=max(field_length, DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE);
|
||||
val_buffer->alloc(to_length);
|
||||
char *to=(char*) val_buffer->ptr();
|
||||
|
||||
|
@ -2707,7 +2738,8 @@ String *Field_double::val_str(String *val_buffer,
|
|||
else
|
||||
{
|
||||
#ifdef HAVE_FCONVERT
|
||||
char buff[320],*pos=buff;
|
||||
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
|
||||
char *pos= buff;
|
||||
int decpt,sign,tmp_dec=dec;
|
||||
|
||||
VOID(fconvert(nr,tmp_dec,&decpt,&sign,buff));
|
||||
|
@ -4232,15 +4264,43 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
|
|||
}
|
||||
|
||||
|
||||
int Field_string::store(double nr)
|
||||
{
|
||||
char buff[MAX_FIELD_WIDTH],*end;
|
||||
int width=min(field_length,DBL_DIG+5);
|
||||
sprintf(buff,"%-*.*g",width,max(width-5,0),nr);
|
||||
end=strcend(buff,' ');
|
||||
return Field_string::store(buff,(uint) (end - buff), &my_charset_bin);
|
||||
}
|
||||
/*
|
||||
Store double value in Field_string or Field_varstring.
|
||||
|
||||
SYNOPSIS
|
||||
store(double nr)
|
||||
nr number
|
||||
|
||||
DESCRIPTION
|
||||
Pretty prints double number into field_length characters buffer.
|
||||
*/
|
||||
|
||||
int Field_str::store(double nr)
|
||||
{
|
||||
bool use_scientific_notation=TRUE;
|
||||
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
|
||||
int length;
|
||||
if (field_length < 32 && nr > 1) // TODO: negative numbers
|
||||
{
|
||||
if (ceiling == 0)
|
||||
{
|
||||
static double e[]= {1e1, 1e2, 1e4, 1e8, 1e16 };
|
||||
double p= 1;
|
||||
for (int i= sizeof(e)/sizeof(e[0]), j= 1<<i ; j; i--, j>>= 1 )
|
||||
{
|
||||
if (field_length & j)
|
||||
p*= e[i];
|
||||
}
|
||||
ceiling= p-1;
|
||||
}
|
||||
use_scientific_notation= (ceiling < nr);
|
||||
}
|
||||
length= sprintf(buff, "%-.*g",
|
||||
use_scientific_notation ? max(0,field_length-5) : field_length,
|
||||
nr);
|
||||
DBUG_ASSERT(length <= field_length);
|
||||
return store((const char *)buff, (uint) length, charset());
|
||||
}
|
||||
|
||||
int Field_string::store(longlong nr)
|
||||
{
|
||||
|
@ -4410,16 +4470,6 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
|
|||
}
|
||||
|
||||
|
||||
int Field_varstring::store(double nr)
|
||||
{
|
||||
char buff[MAX_FIELD_WIDTH],*end;
|
||||
int width=min(field_length,DBL_DIG+5);
|
||||
sprintf(buff,"%-*.*g",width,max(width-5,0),nr);
|
||||
end=strcend(buff,' ');
|
||||
return Field_varstring::store(buff,(uint) (end - buff), &my_charset_bin);
|
||||
}
|
||||
|
||||
|
||||
int Field_varstring::store(longlong nr)
|
||||
{
|
||||
char buff[64];
|
||||
|
|
|
@ -336,20 +336,23 @@ public:
|
|||
class Field_str :public Field {
|
||||
protected:
|
||||
CHARSET_INFO *field_charset;
|
||||
double ceiling; // for ::store(double nr)
|
||||
public:
|
||||
Field_str(char *ptr_arg,uint32 len_arg, uchar *null_ptr_arg,
|
||||
uchar null_bit_arg, utype unireg_check_arg,
|
||||
const char *field_name_arg,
|
||||
struct st_table *table_arg,CHARSET_INFO *charset)
|
||||
:Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
|
||||
unireg_check_arg, field_name_arg, table_arg)
|
||||
{
|
||||
unireg_check_arg, field_name_arg, table_arg), ceiling(0.0)
|
||||
{
|
||||
field_charset=charset;
|
||||
if (charset->state & MY_CS_BINSORT)
|
||||
flags|=BINARY_FLAG;
|
||||
}
|
||||
Item_result result_type () const { return STRING_RESULT; }
|
||||
uint decimals() const { return NOT_FIXED_DEC; }
|
||||
int store(double nr);
|
||||
int store(const char *to,uint length,CHARSET_INFO *cs)=0;
|
||||
void make_field(Send_field *);
|
||||
uint size_of() const { return sizeof(*this); }
|
||||
CHARSET_INFO *charset(void) const { return field_charset; }
|
||||
|
@ -904,7 +907,6 @@ public:
|
|||
bool zero_pack() const { return 0; }
|
||||
void reset(void) { charset()->cset->fill(charset(),ptr,field_length,' '); }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr);
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
|
@ -950,7 +952,6 @@ public:
|
|||
uint32 pack_length() const { return (uint32) field_length+2; }
|
||||
uint32 key_length() const { return (uint32) field_length; }
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr);
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
|
|
|
@ -360,7 +360,8 @@ THR_LOCK_DATA **ha_heap::store_lock(THD *thd,
|
|||
|
||||
int ha_heap::delete_table(const char *name)
|
||||
{
|
||||
int error=heap_delete_table(name);
|
||||
char buff[FN_REFLEN];
|
||||
int error= heap_delete_table(fn_format(buff,name,"","",4+2));
|
||||
return error == ENOENT ? 0 : error;
|
||||
}
|
||||
|
||||
|
|
|
@ -118,6 +118,7 @@ my_bool innobase_use_native_aio = FALSE;
|
|||
my_bool innobase_fast_shutdown = TRUE;
|
||||
my_bool innobase_file_per_table = FALSE;
|
||||
my_bool innobase_locks_unsafe_for_binlog = FALSE;
|
||||
my_bool innobase_create_status_file = FALSE;
|
||||
|
||||
static char *internal_innobase_data_file_path = NULL;
|
||||
|
||||
|
@ -135,6 +136,10 @@ char innodb_dummy_stmt_trx_handle = 'D';
|
|||
|
||||
static HASH innobase_open_tables;
|
||||
|
||||
#ifdef __NETWARE__ /* some special cleanup for NetWare */
|
||||
bool nw_panic = FALSE;
|
||||
#endif
|
||||
|
||||
static mysql_byte* innobase_get_key(INNOBASE_SHARE *share,uint *length,
|
||||
my_bool not_used __attribute__((unused)));
|
||||
static INNOBASE_SHARE *get_share(const char *table_name);
|
||||
|
@ -419,6 +424,30 @@ innobase_mysql_print_thd(
|
|||
putc('\n', f);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Creates a temporary file. */
|
||||
extern "C"
|
||||
int
|
||||
innobase_mysql_tmpfile(void)
|
||||
/*========================*/
|
||||
/* out: temporary file descriptor, or < 0 on error */
|
||||
{
|
||||
char filename[FN_REFLEN];
|
||||
File fd = create_temp_file(filename, NullS, "ib",
|
||||
#ifdef __WIN__
|
||||
O_BINARY | O_TRUNC | O_SEQUENTIAL |
|
||||
O_TEMPORARY | O_SHORT_LIVED |
|
||||
#endif /* __WIN__ */
|
||||
O_CREAT | O_EXCL | O_RDWR,
|
||||
MYF(MY_WME));
|
||||
#ifndef __WIN__
|
||||
if (fd >= 0) {
|
||||
unlink(filename);
|
||||
}
|
||||
#endif /* !__WIN__ */
|
||||
return(fd);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the InnoDB transaction handle for a MySQL handler object, creates
|
||||
an InnoDB transaction struct if the corresponding MySQL thread struct still
|
||||
|
@ -912,6 +941,7 @@ innobase_init(void)
|
|||
srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog;
|
||||
|
||||
srv_max_n_open_files = (ulint) innobase_open_files;
|
||||
srv_innodb_status = (ibool) innobase_create_status_file;
|
||||
|
||||
srv_print_verbose_log = mysql_embedded ? 0 : 1;
|
||||
|
||||
|
@ -982,6 +1012,11 @@ innobase_end(void)
|
|||
|
||||
DBUG_ENTER("innobase_end");
|
||||
|
||||
#ifdef __NETWARE__ /* some special cleanup for NetWare */
|
||||
if (nw_panic) {
|
||||
set_panic_flag_for_netware();
|
||||
}
|
||||
#endif
|
||||
if (innodb_inited)
|
||||
{
|
||||
innodb_inited= 0;
|
||||
|
@ -4403,7 +4438,7 @@ ha_innobase::update_table_comment(
|
|||
trx_search_latch_release_if_reserved(prebuilt->trx);
|
||||
str = NULL;
|
||||
|
||||
if (FILE* file = tmpfile()) {
|
||||
if (FILE* file = os_file_create_tmpfile()) {
|
||||
long flen;
|
||||
|
||||
/* output the data to a temporary file */
|
||||
|
@ -4465,7 +4500,7 @@ ha_innobase::get_foreign_key_create_info(void)
|
|||
|
||||
update_thd(current_thd);
|
||||
|
||||
if (FILE* file = tmpfile()) {
|
||||
if (FILE* file = os_file_create_tmpfile()) {
|
||||
long flen;
|
||||
|
||||
prebuilt->trx->op_info = (char*)"getting info on foreign keys";
|
||||
|
|
|
@ -189,7 +189,8 @@ extern char *innobase_unix_file_flush_method;
|
|||
/* The following variables have to be my_bool for SHOW VARIABLES to work */
|
||||
extern my_bool innobase_log_archive,
|
||||
innobase_use_native_aio, innobase_fast_shutdown,
|
||||
innobase_file_per_table, innobase_locks_unsafe_for_binlog;
|
||||
innobase_file_per_table, innobase_locks_unsafe_for_binlog,
|
||||
innobase_create_status_file;
|
||||
extern "C" {
|
||||
extern ulong srv_max_buf_pool_modified_pct;
|
||||
}
|
||||
|
|
|
@ -2459,7 +2459,7 @@ void Item_func_like::turboBM_compute_suffixes(int *suff)
|
|||
|
||||
*splm1 = pattern_len;
|
||||
|
||||
if (cs == &my_charset_bin)
|
||||
if (!cs->sort_order)
|
||||
{
|
||||
int i;
|
||||
for (i = pattern_len - 2; i >= 0; i--)
|
||||
|
@ -2562,7 +2562,7 @@ void Item_func_like::turboBM_compute_bad_character_shifts()
|
|||
for (i = bmBc; i < end; i++)
|
||||
*i = pattern_len;
|
||||
|
||||
if (cs == &my_charset_bin)
|
||||
if (!cs->sort_order)
|
||||
{
|
||||
for (j = 0; j < plm1; j++)
|
||||
bmBc[(uint) (uchar) pattern[j]] = plm1 - j;
|
||||
|
@ -2593,7 +2593,7 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
|
|||
const int tlmpl= text_len - pattern_len;
|
||||
|
||||
/* Searching */
|
||||
if (cs == &my_charset_bin)
|
||||
if (!cs->sort_order)
|
||||
{
|
||||
while (j <= tlmpl)
|
||||
{
|
||||
|
|
|
@ -969,7 +969,7 @@ void Item_func_round::fix_length_and_dec()
|
|||
if (tmp < 0)
|
||||
decimals=0;
|
||||
else
|
||||
decimals=tmp;
|
||||
decimals=min(tmp,NOT_FIXED_DEC);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1639,7 +1639,7 @@ udf_handler::fix_fields(THD *thd, TABLE_LIST *tables, Item_result_field *func,
|
|||
func->max_length=min(initid.max_length,MAX_BLOB_WIDTH);
|
||||
func->maybe_null=initid.maybe_null;
|
||||
const_item_cache=initid.const_item;
|
||||
func->decimals=min(initid.decimals,31);
|
||||
func->decimals=min(initid.decimals,NOT_FIXED_DEC);
|
||||
}
|
||||
initialized=1;
|
||||
if (error)
|
||||
|
|
|
@ -335,7 +335,7 @@ class Item_dec_func :public Item_real_func
|
|||
Item_dec_func(Item *a,Item *b) :Item_real_func(a,b) {}
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
decimals=6; max_length=float_length(decimals);
|
||||
decimals=NOT_FIXED_DEC; max_length=float_length(decimals);
|
||||
maybe_null=1;
|
||||
}
|
||||
inline double fix_result(double value)
|
||||
|
|
|
@ -282,7 +282,11 @@ public:
|
|||
|
||||
class Item_sum_avg :public Item_sum_num
|
||||
{
|
||||
void fix_length_and_dec() { decimals+=4; maybe_null=1; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
decimals=min(decimals+4, NOT_FIXED_DEC);
|
||||
maybe_null=1;
|
||||
}
|
||||
|
||||
double sum;
|
||||
ulonglong count;
|
||||
|
@ -337,7 +341,11 @@ class Item_sum_variance : public Item_sum_num
|
|||
{
|
||||
double sum, sum_sqr;
|
||||
ulonglong count;
|
||||
void fix_length_and_dec() { decimals+=4; maybe_null=1; }
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
decimals=min(decimals+4, NOT_FIXED_DEC);
|
||||
maybe_null=1;
|
||||
}
|
||||
|
||||
public:
|
||||
Item_sum_variance(Item *item_par) :Item_sum_num(item_par),count(0) {}
|
||||
|
|
16
sql/lock.cc
16
sql/lock.cc
|
@ -732,15 +732,14 @@ bool lock_global_read_lock(THD *thd)
|
|||
while (protect_against_global_read_lock && !thd->killed)
|
||||
pthread_cond_wait(&COND_refresh, &LOCK_open);
|
||||
waiting_for_read_lock--;
|
||||
thd->exit_cond(old_message);
|
||||
if (thd->killed)
|
||||
{
|
||||
(void) pthread_mutex_unlock(&LOCK_open);
|
||||
thd->exit_cond(old_message);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
thd->global_read_lock=1;
|
||||
global_read_lock++;
|
||||
(void) pthread_mutex_unlock(&LOCK_open);
|
||||
thd->exit_cond(old_message);
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
@ -761,11 +760,12 @@ void unlock_global_read_lock(THD *thd)
|
|||
bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh)
|
||||
{
|
||||
const char *old_message;
|
||||
bool result=0;
|
||||
bool result= 0, need_exit_cond;
|
||||
DBUG_ENTER("wait_if_global_read_lock");
|
||||
|
||||
LINT_INIT(old_message);
|
||||
(void) pthread_mutex_lock(&LOCK_open);
|
||||
if (global_read_lock)
|
||||
if (need_exit_cond= (bool)global_read_lock)
|
||||
{
|
||||
if (thd->global_read_lock) // This thread had the read locks
|
||||
{
|
||||
|
@ -780,11 +780,13 @@ bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh)
|
|||
(void) pthread_cond_wait(&COND_refresh,&LOCK_open);
|
||||
if (thd->killed)
|
||||
result=1;
|
||||
thd->exit_cond(old_message);
|
||||
}
|
||||
if (!abort_on_refresh && !result)
|
||||
protect_against_global_read_lock++;
|
||||
pthread_mutex_unlock(&LOCK_open);
|
||||
if (unlikely(need_exit_cond)) // global read locks are rare
|
||||
thd->exit_cond(old_message);
|
||||
else
|
||||
pthread_mutex_unlock(&LOCK_open);
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
||||
|
|
10
sql/log.cc
10
sql/log.cc
|
@ -1782,17 +1782,12 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
|
|||
|
||||
NOTES
|
||||
One must have a lock on LOCK_log before calling this function.
|
||||
This lock will be freed before return!
|
||||
|
||||
The reason for the above is that for enter_cond() / exit_cond() to
|
||||
work the mutex must be got before enter_cond() but releases before
|
||||
exit_cond().
|
||||
If you don't do it this way, you will get a deadlock in THD::awake()
|
||||
This lock will be freed before return! That's required by
|
||||
THD::enter_cond() (see NOTES in sql_class.h).
|
||||
*/
|
||||
|
||||
void MYSQL_LOG:: wait_for_update(THD* thd, bool master_or_slave)
|
||||
{
|
||||
safe_mutex_assert_owner(&LOCK_log);
|
||||
const char* old_msg = thd->enter_cond(&update_cond, &LOCK_log,
|
||||
master_or_slave ?
|
||||
"Has read all relay log; waiting for \
|
||||
|
@ -1800,7 +1795,6 @@ the slave I/O thread to update it" :
|
|||
"Has sent all binlog to slave; \
|
||||
waiting for binlog to be updated");
|
||||
pthread_cond_wait(&update_cond, &LOCK_log);
|
||||
pthread_mutex_unlock(&LOCK_log); // See NOTES
|
||||
thd->exit_cond(old_msg);
|
||||
}
|
||||
|
||||
|
|
|
@ -1590,6 +1590,8 @@ static void registerwithneb()
|
|||
ulong neb_event_callback(struct EventBlock *eblock)
|
||||
{
|
||||
EventChangeVolStateEnter_s *voldata;
|
||||
extern bool nw_panic;
|
||||
|
||||
voldata= (EventChangeVolStateEnter_s *)eblock->EBEventData;
|
||||
|
||||
/* Deactivation of a volume */
|
||||
|
@ -1602,6 +1604,7 @@ ulong neb_event_callback(struct EventBlock *eblock)
|
|||
if (!memcmp(&voldata->volID, &datavolid, sizeof(VolumeID_t)))
|
||||
{
|
||||
consoleprintf("MySQL data volume is deactivated, shutting down MySQL Server \n");
|
||||
nw_panic = TRUE;
|
||||
kill_server(0);
|
||||
}
|
||||
}
|
||||
|
@ -1879,9 +1882,11 @@ static void init_signals(void)
|
|||
sigaddset(&set,SIGPIPE);
|
||||
#endif
|
||||
sigaddset(&set,SIGINT);
|
||||
#ifndef IGNORE_SIGHUP_SIGQUIT
|
||||
sigaddset(&set,SIGQUIT);
|
||||
sigaddset(&set,SIGTERM);
|
||||
sigaddset(&set,SIGHUP);
|
||||
#endif
|
||||
sigaddset(&set,SIGTERM);
|
||||
|
||||
/* Fix signals if blocked by parents (can happen on Mac OS X) */
|
||||
sigemptyset(&sa.sa_mask);
|
||||
|
@ -1965,11 +1970,13 @@ extern "C" void *signal_hand(void *arg __attribute__((unused)))
|
|||
#ifdef USE_ONE_SIGNAL_HAND
|
||||
(void) sigaddset(&set,THR_SERVER_ALARM); // For alarms
|
||||
#endif
|
||||
#ifndef IGNORE_SIGHUP_SIGQUIT
|
||||
(void) sigaddset(&set,SIGQUIT);
|
||||
(void) sigaddset(&set,SIGTERM);
|
||||
#if THR_CLIENT_ALARM != SIGHUP
|
||||
(void) sigaddset(&set,SIGHUP);
|
||||
#endif
|
||||
#endif
|
||||
(void) sigaddset(&set,SIGTERM);
|
||||
(void) sigaddset(&set,SIGTSTP);
|
||||
|
||||
/* Save pid to this process (or thread on Linux) */
|
||||
|
@ -2925,6 +2932,9 @@ we force server id to 2, but this MySQL server will not act as a slave.");
|
|||
printf(ER(ER_READY),my_progname,server_version,
|
||||
((unix_sock == INVALID_SOCKET) ? (char*) "" : mysqld_unix_port),
|
||||
mysqld_port);
|
||||
if (MYSQL_COMPILATION_COMMENT[0] != '\0')
|
||||
fputs(" " MYSQL_COMPILATION_COMMENT, stdout);
|
||||
putchar('\n');
|
||||
fflush(stdout);
|
||||
|
||||
#if defined(__NT__) || defined(HAVE_SMEM)
|
||||
|
@ -3942,6 +3952,7 @@ enum options_mysqld
|
|||
OPT_INNODB_LOCK_WAIT_TIMEOUT,
|
||||
OPT_INNODB_THREAD_CONCURRENCY,
|
||||
OPT_INNODB_FORCE_RECOVERY,
|
||||
OPT_INNODB_STATUS_FILE,
|
||||
OPT_INNODB_MAX_DIRTY_PAGES_PCT,
|
||||
OPT_INNODB_OPEN_FILES,
|
||||
OPT_BDB_CACHE_SIZE,
|
||||
|
@ -4171,6 +4182,10 @@ Disable with --skip-innodb (will save memory).",
|
|||
{"innodb_max_dirty_pages_pct", OPT_INNODB_MAX_DIRTY_PAGES_PCT,
|
||||
"Percentage of dirty pages allowed in bufferpool.", (gptr*) &srv_max_buf_pool_modified_pct,
|
||||
(gptr*) &srv_max_buf_pool_modified_pct, 0, GET_ULONG, REQUIRED_ARG, 90, 0, 100, 0, 0, 0},
|
||||
{"innodb_status_file", OPT_INNODB_STATUS_FILE,
|
||||
"Enable SHOW INNODB STATUS output in the innodb_status.<pid> file",
|
||||
(gptr*) &innobase_create_status_file, (gptr*) &innobase_create_status_file,
|
||||
0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif /* End HAVE_INNOBASE_DB */
|
||||
{"isam", OPT_ISAM, "Enable ISAM (if this version of MySQL supports it). \
|
||||
Disable with --skip-isam.",
|
||||
|
|
|
@ -200,11 +200,13 @@ net_printf(THD *thd, uint errcode, ...)
|
|||
2+SQLSTATE_LENGTH+1 : 2) : 0);
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
text_pos=(char*) net->buff + head_length + offset + 1;
|
||||
length=(char*)net->buff_end-text_pos;
|
||||
#else
|
||||
length=sizeof(text_pos)-1;
|
||||
#endif
|
||||
(void) vsprintf(my_const_cast(char*) (text_pos),format,args);
|
||||
length=(uint) strlen((char*) text_pos);
|
||||
if (length >= sizeof(net->last_error))
|
||||
length=sizeof(net->last_error)-1; /* purecov: inspected */
|
||||
length=my_vsnprintf(my_const_cast(char*) (text_pos),
|
||||
min(length, sizeof(net->last_error)),
|
||||
format,args);
|
||||
va_end(args);
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue