manually merged
BitKeeper/etc/logging_ok: auto-union BitKeeper/deleted/.del-mytest-old.c~5237697b30cf59e4: Auto merged Build-tools/Bootstrap: Auto merged Build-tools/mysql-copyright: Auto merged configure.in: Auto merged BitKeeper/deleted/.del-mysql_fix_privilege_tables.sql: Auto merged VC++Files/innobase/innobase.dsp: Auto merged client/mysql.cc: Auto merged include/my_global.h: Auto merged innobase/dict/dict0crea.c: Auto merged innobase/dict/dict0dict.c: Auto merged innobase/include/mtr0log.h: Auto merged innobase/include/mtr0log.ic: Auto merged innobase/include/srv0srv.h: Auto merged innobase/include/ut0dbg.h: Auto merged innobase/lock/lock0lock.c: Auto merged innobase/os/os0file.c: Auto merged innobase/row/row0mysql.c: Auto merged innobase/row/row0sel.c: Auto merged innobase/srv/srv0srv.c: Auto merged innobase/ut/ut0dbg.c: Auto merged innobase/ut/ut0mem.c: Auto merged libmysql/Makefile.am: Auto merged libmysql/Makefile.shared: Auto merged libmysql/conf_to_src.c: Auto merged libmysql/dll.c: Auto merged libmysql/errmsg.c: Auto merged libmysql/manager.c: Auto merged libmysql_r/Makefile.am: Auto merged myisam/mi_key.c: Auto merged mysql-test/Makefile.am: Auto merged mysql-test/mysql-test-run.sh: Auto merged mysql-test/r/having.result: Auto merged mysql-test/r/heap.result: Auto merged mysql-test/r/type_date.result: Auto merged mysql-test/r/type_float.result: Auto merged mysql-test/t/having.test: Auto merged mysql-test/t/heap.test: Auto merged mysql-test/t/type_date.test: Auto merged mysql-test/t/type_float.test: Auto merged mysql-test/t/type_uint.test: Auto merged scripts/make_binary_distribution.sh: Auto merged scripts/make_win_src_distribution.sh: Auto merged sql/Makefile.am: Auto merged sql/field.h: Auto merged sql/ha_heap.cc: Auto merged sql/item_func.cc: Auto merged sql/item_func.h: Auto merged sql/item_sum.h: Auto merged sql/lock.cc: Auto merged sql/log.cc: Auto merged sql/protocol.cc: Auto merged sql/repl_failsafe.cc: Auto merged sql/sql_acl.cc: Auto merged sql/sql_analyse.cc: Auto merged sql/sql_class.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_parse.cc: Auto merged sql/share/czech/errmsg.txt: Auto merged sql/share/danish/errmsg.txt: Auto merged sql/share/dutch/errmsg.txt: Auto merged sql/share/english/errmsg.txt: Auto merged sql/share/estonian/errmsg.txt: Auto merged sql/share/french/errmsg.txt: Auto merged sql/sql_select.cc: Auto merged sql/sql_table.cc: Auto merged sql/share/greek/errmsg.txt: Auto merged sql/share/hungarian/errmsg.txt: Auto merged sql/share/japanese/errmsg.txt: Auto merged sql/share/korean/errmsg.txt: Auto merged sql/share/norwegian-ny/errmsg.txt: Auto merged sql/share/norwegian/errmsg.txt: Auto merged sql/share/polish/errmsg.txt: Auto merged sql/share/portuguese/errmsg.txt: Auto merged sql/share/romanian/errmsg.txt: Auto merged sql/share/russian/errmsg.txt: Auto merged sql/share/slovak/errmsg.txt: Auto merged sql/share/spanish/errmsg.txt: Auto merged sql/share/swedish/errmsg.txt: Auto merged sql/share/ukrainian/errmsg.txt: Auto merged
This commit is contained in:
commit
945625ebaa
@ -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"
|
||||
|
@ -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.*"
|
||||
|
@ -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 */
|
||||
|
@ -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,8 @@ 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 ""
|
||||
echo "Test $1 failed!"
|
||||
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\\`;
|
||||
Incorrect table name 't1\\'
|
||||
rename table t1 to `t1\\`;
|
||||
Incorrect table name 't1\\'
|
||||
drop table t1;
|
||||
|
@ -87,3 +87,43 @@ sqty
|
||||
5
|
||||
9
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`description` text
|
||||
) TYPE=MyISAM;
|
||||
CREATE TABLE t2 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`description` varchar(20)
|
||||
) TYPE=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'
|
||||
) TYPE=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`)
|
||||
) TYPE=HEAP;
|
||||
SELECT MAX(job_title_id) FROM job_titles;
|
||||
MAX(job_title_id)
|
||||
NULL
|
||||
DROP TABLE job_titles;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
) TYPE=MyISAM;
|
||||
|
||||
CREATE TABLE t2 (
|
||||
`id` bigint(20) NOT NULL default '0',
|
||||
`description` varchar(20)
|
||||
) TYPE=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'
|
||||
) TYPE=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`)
|
||||
) TYPE=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;
|
||||
|
@ -234,3 +234,14 @@ alter table t1 add i int default 10;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Test for bug #4491, TIMESTAMP(19) should be possible to create and not
|
||||
# only read in 4.0
|
||||
#
|
||||
create table t1 (ts timestamp(19));
|
||||
show create table t1;
|
||||
set TIMESTAMP=1000000000;
|
||||
insert into t1 values ();
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 \
|
||||
|
@ -154,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.%
|
||||
|
95
sql/field.cc
95
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,13 +4264,50 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
|
||||
}
|
||||
|
||||
|
||||
int Field_string::store(double nr)
|
||||
/*
|
||||
Store double value in Field_string or Field_varstring.
|
||||
|
||||
SYNOPSIS
|
||||
store_double_in_string_field()
|
||||
field field to store value in
|
||||
field_length number of characters in the field
|
||||
nr number
|
||||
|
||||
DESCRIPTION
|
||||
Pretty prints double number into field_length characters buffer.
|
||||
*/
|
||||
|
||||
static int store_double_in_string_field(Field_str *field, uint32 field_length,
|
||||
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);
|
||||
bool use_scientific_notation=TRUE;
|
||||
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
|
||||
int length;
|
||||
if (field_length < 32 && nr > 1)
|
||||
{
|
||||
if (field->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];
|
||||
}
|
||||
field->ceiling= p-1;
|
||||
}
|
||||
use_scientific_notation= (field->ceiling < nr);
|
||||
}
|
||||
length= sprintf(buff, "%-.*g",
|
||||
use_scientific_notation ? max(0,field_length-5) : field_length,
|
||||
nr);
|
||||
DBUG_ASSERT(length <= field_length);
|
||||
return field->store(buff, (uint) length);
|
||||
}
|
||||
|
||||
int Field_string::store(double nr)
|
||||
{
|
||||
return store_double_in_string_field(this, field_length, nr);
|
||||
}
|
||||
|
||||
|
||||
@ -4412,11 +4481,7 @@ 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);
|
||||
return store_double_in_string_field(this, field_length, nr);
|
||||
}
|
||||
|
||||
|
||||
|
@ -337,12 +337,13 @@ class Field_str :public Field {
|
||||
protected:
|
||||
CHARSET_INFO *field_charset;
|
||||
public:
|
||||
double ceiling; // for ::store(double nr)
|
||||
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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.",
|
||||
|
@ -201,7 +201,9 @@ net_printf(THD *thd, uint errcode, ...)
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
text_pos=(char*) net->buff + head_length + offset + 1;
|
||||
#endif
|
||||
(void) vsprintf(my_const_cast(char*) (text_pos),format,args);
|
||||
(void) my_vsnprintf(my_const_cast(char*) (text_pos),
|
||||
(char*)net->buff_end-text_pos,
|
||||
format,args);
|
||||
length=(uint) strlen((char*) text_pos);
|
||||
if (length >= sizeof(net->last_error))
|
||||
length=sizeof(net->last_error)-1; /* purecov: inspected */
|
||||
|
@ -589,6 +589,8 @@ pthread_handler_decl(handle_failsafe_rpl,arg)
|
||||
THD *thd = new THD;
|
||||
thd->thread_stack = (char*)&thd;
|
||||
MYSQL* recovery_captain = 0;
|
||||
const char* msg;
|
||||
|
||||
pthread_detach_this_thread();
|
||||
if (init_failsafe_rpl_thread(thd) || !(recovery_captain=mysql_init(0)))
|
||||
{
|
||||
@ -596,11 +598,11 @@ pthread_handler_decl(handle_failsafe_rpl,arg)
|
||||
goto err;
|
||||
}
|
||||
pthread_mutex_lock(&LOCK_rpl_status);
|
||||
msg= thd->enter_cond(&COND_rpl_status,
|
||||
&LOCK_rpl_status, "Waiting for request");
|
||||
while (!thd->killed && !abort_loop)
|
||||
{
|
||||
bool break_req_chain = 0;
|
||||
const char* msg = thd->enter_cond(&COND_rpl_status,
|
||||
&LOCK_rpl_status, "Waiting for request");
|
||||
pthread_cond_wait(&COND_rpl_status, &LOCK_rpl_status);
|
||||
thd->proc_info="Processing request";
|
||||
while (!break_req_chain)
|
||||
@ -618,9 +620,8 @@ pthread_handler_decl(handle_failsafe_rpl,arg)
|
||||
break;
|
||||
}
|
||||
}
|
||||
thd->exit_cond(msg);
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_rpl_status);
|
||||
thd->exit_cond(msg);
|
||||
err:
|
||||
if (recovery_captain)
|
||||
mysql_close(recovery_captain);
|
||||
|
@ -88,7 +88,7 @@ character-set=latin2
|
||||
"Blob sloupec '%-.64s' nem-Bůže být použit jako klíč",
|
||||
"P-Bříliš velká délka sloupce '%-.64s' (nejvíce %d). Použijte BLOB",
|
||||
"M-Bůžete mít pouze jedno AUTO pole a to musí být definováno jako klíč",
|
||||
"%s: p-Břipraven na spojení\n",
|
||||
"%s: p-Břipraven na spojení",
|
||||
"%s: norm-Bální ukončení\n",
|
||||
"%s: p-Břijat signal %d, končím\n",
|
||||
"%s: ukon-Bčení práce hotovo\n",
|
||||
|
@ -82,7 +82,7 @@ character-set=latin1
|
||||
"BLOB feltet '%-.64s' kan ikke bruges ved specifikation af indeks",
|
||||
"For stor feltlængde for kolonne '%-.64s' (maks = %d). Brug BLOB i stedet",
|
||||
"Der kan kun specificeres eet AUTO_INCREMENT-felt, og det skal være indekseret",
|
||||
"%s: klar til tilslutninger\n",
|
||||
"%s: klar til tilslutninger",
|
||||
"%s: Normal nedlukning\n",
|
||||
"%s: Fangede signal %d. Afslutter!!\n",
|
||||
"%s: Server lukket\n",
|
||||
|
@ -90,7 +90,7 @@ character-set=latin1
|
||||
"BLOB kolom '%-.64s' kan niet gebruikt worden bij zoeksleutel specificatie",
|
||||
"Te grote kolomlengte voor '%-.64s' (max = %d). Maak hiervoor gebruik van het type BLOB",
|
||||
"Er kan slechts 1 autofield zijn en deze moet als zoeksleutel worden gedefinieerd.",
|
||||
"%s: klaar voor verbindingen\n",
|
||||
"%s: klaar voor verbindingen",
|
||||
"%s: Normaal afgesloten \n",
|
||||
"%s: Signaal %d. Systeem breekt af!\n",
|
||||
"%s: Afsluiten afgerond\n",
|
||||
|
@ -79,7 +79,7 @@ character-set=latin1
|
||||
"BLOB column '%-.64s' can't be used in key specification with the used table type",
|
||||
"Column length too big for column '%-.64s' (max = %d); use BLOB instead",
|
||||
"Incorrect table definition; there can be only one auto column and it must be defined as a key",
|
||||
"%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d\n",
|
||||
"%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d",
|
||||
"%s: Normal shutdown\n",
|
||||
"%s: Got signal %d. Aborting!\n",
|
||||
"%s: Shutdown complete\n",
|
||||
|
@ -84,7 +84,7 @@ character-set=latin7
|
||||
"BLOB-tüüpi tulpa '%-.64s' ei saa kasutada võtmena",
|
||||
"Tulba '%-.64s' pikkus on liiga pikk (maksimaalne pikkus: %d). Kasuta BLOB väljatüüpi",
|
||||
"Vigane tabelikirjeldus; Tabelis tohib olla üks auto_increment tüüpi tulp ning see peab olema defineeritud võtmena",
|
||||
"%s: ootab ühendusi\n",
|
||||
"%s: ootab ühendusi",
|
||||
"%s: MySQL lõpetas\n",
|
||||
"%s: sain signaali %d. Lõpetan!\n",
|
||||
"%s: Lõpp\n",
|
||||
|
@ -79,7 +79,7 @@ character-set=latin1
|
||||
"Champ BLOB '%-.64s' ne peut être utilisé dans une clé",
|
||||
"Champ '%-.64s' trop long (max = %d). Utilisez un BLOB",
|
||||
"Un seul champ automatique est permis et il doit être indexé",
|
||||
"%s: Prêt pour des connections\n",
|
||||
"%s: Prêt pour des connections",
|
||||
"%s: Arrêt normal du serveur\n",
|
||||
"%s: Reçu le signal %d. Abandonne!\n",
|
||||
"%s: Arrêt du serveur terminé\n",
|
||||
|
@ -91,7 +91,7 @@ character-set=latin1
|
||||
"BLOB-Feld '%-.64s' kann beim verwendeten Tabellentyp nicht als Schlüssel verwendet werden",
|
||||
"Feldlänge für Feld '%-.64s' zu groß (maximal %d). BLOB-Feld verwenden!",
|
||||
"Falsche Tabellendefinition. Es darf nur ein Auto-Feld geben und dieses muss als Schlüssel definiert werden",
|
||||
"%-.64s: Bereit für Verbindungen\n",
|
||||
"%-.64s: Bereit für Verbindungen",
|
||||
"%-.64s: Normal heruntergefahren\n",
|
||||
"%-.64s: Signal %d erhalten. Abbruch!\n",
|
||||
"%-.64s: Heruntergefahren (shutdown)\n",
|
||||
|
@ -79,7 +79,7 @@ character-set=greek
|
||||
"Πεδίο τύπου Blob '%-.64s' δεν μπορεί να χρησιμοποιηθεί στον ορισμό ενός κλειδιού (key specification)",
|
||||
"Πολύ μεγάλο μήκος για το πεδίο '%-.64s' (max = %d). Παρακαλώ χρησιμοποιείστε τον τύπο BLOB",
|
||||
"Μπορεί να υπάρχει μόνο ένα auto field και πρέπει να έχει ορισθεί σαν key",
|
||||
"%s: σε αναμονή συνδέσεων\n",
|
||||
"%s: σε αναμονή συνδέσεων",
|
||||
"%s: Φυσιολογική διαδικασία shutdown\n",
|
||||
"%s: Ελήφθη το μήνυμα %d. Η διαδικασία εγκαταλείπεται!\n",
|
||||
"%s: Η διαδικασία Shutdown ολοκληρώθηκε\n",
|
||||
|
@ -81,7 +81,7 @@ character-set=latin2
|
||||
"Blob objektum '%-.64s' nem hasznalhato kulcskent",
|
||||
"A(z) '%-.64s' oszlop tul hosszu. (maximum = %d). Hasznaljon BLOB tipust inkabb.",
|
||||
"Csak egy auto mezo lehetseges, es azt kulcskent kell definialni.",
|
||||
"%s: kapcsolatra kesz\n",
|
||||
"%s: kapcsolatra kesz",
|
||||
"%s: Normal leallitas\n",
|
||||
"%s: %d jelzes. Megszakitva!\n",
|
||||
"%s: A leallitas kesz\n",
|
||||
|
@ -81,7 +81,7 @@ character-set=ujis
|
||||
"BLOB column '%-.64s' can't be used in key specification with the used table type",
|
||||
"column '%-.64s' は,確保する column の大きさが多すぎます. (最大 %d まで). BLOB をかわりに使用してください.",
|
||||
"テーブルの定義が違います; there can be only one auto column and it must be defined as a key",
|
||||
"%s: ½àÈ÷´°Î»\n",
|
||||
"%s: ス猜<EFBFBD>ーホサ",
|
||||
"%s: Normal shutdown\n",
|
||||
"%s: Got signal %d. 中断!\n",
|
||||
"%s: Shutdown 完了\n",
|
||||
|
@ -79,7 +79,7 @@ character-set=euckr
|
||||
"BLOB 칼럼 '%-.64s'는 키 정의에서 사용될 수 없습니다.",
|
||||
"칼럼 '%-.64s'의 칼럼 길이가 너무 깁니다 (최대 = %d). 대신에 BLOB를 사용하세요.",
|
||||
"부정확한 테이블 정의; 테이블은 하나의 auto 칼럼이 존재하고 키로 정의되어져야 합니다.",
|
||||
"%s: 연결 준비중입니다.\n",
|
||||
"%s: 연결 준비중입니다",
|
||||
"%s: 정상적인 shutdown\n",
|
||||
"%s: %d 신호가 들어왔음. 중지!\n",
|
||||
"%s: Shutdown 이 완료됨!\n",
|
||||
|
@ -81,7 +81,7 @@ character-set=latin1
|
||||
"Blob kolonne '%-.64s' kan ikkje brukast ved spesifikasjon av nyklar",
|
||||
"For stor nykkellengde for felt '%-.64s' (maks = %d). Bruk BLOB istadenfor",
|
||||
"Bare eitt auto felt kan være definert som nøkkel.",
|
||||
"%s: klar for tilkoblingar\n",
|
||||
"%s: klar for tilkoblingar",
|
||||
"%s: Normal nedkopling\n",
|
||||
"%s: Oppdaga signal %d. Avsluttar!\n",
|
||||
"%s: Nedkopling komplett\n",
|
||||
|
@ -81,7 +81,7 @@ character-set=latin1
|
||||
"Blob felt '%-.64s' kan ikke brukes ved spesifikasjon av nøkler",
|
||||
"For stor nøkkellengde for kolonne '%-.64s' (maks = %d). Bruk BLOB istedenfor",
|
||||
"Bare ett auto felt kan være definert som nøkkel.",
|
||||
"%s: klar for tilkoblinger\n",
|
||||
"%s: klar for tilkoblinger",
|
||||
"%s: Normal avslutning\n",
|
||||
"%s: Oppdaget signal %d. Avslutter!\n",
|
||||
"%s: Avslutning komplett\n",
|
||||
|
@ -83,7 +83,7 @@ character-set=latin2
|
||||
"Kolumna typu Blob '%-.64s' nie może być użyta w specyfikacji klucza",
|
||||
"Zbyt duża długo?ć kolumny '%-.64s' (maks. = %d). W zamian użyj typu BLOB",
|
||||
"W tabeli może być tylko jedno pole auto i musi ono być zdefiniowane jako klucz",
|
||||
"%s: gotowe do poł?czenia\n",
|
||||
"%s: gotowe do poł?czenia",
|
||||
"%s: Standardowe zakończenie działania\n",
|
||||
"%s: Otrzymano sygnał %d. Kończenie działania!\n",
|
||||
"%s: Zakończenie działania wykonane\n",
|
||||
|
@ -80,7 +80,7 @@ character-set=latin1
|
||||
"Coluna BLOB '%-.64s' não pode ser utilizada na especificação de chave para o tipo de tabela usado",
|
||||
"Comprimento da coluna '%-.64s' grande demais (max = %d); use BLOB em seu lugar",
|
||||
"Definição incorreta de tabela. Somente é permitido um único campo auto-incrementado e ele tem que ser definido como chave",
|
||||
"%s: Pronto para conexões\n",
|
||||
"%s: Pronto para conexões",
|
||||
"%s: 'Shutdown' normal\n",
|
||||
"%s: Obteve sinal %d. Abortando!\n",
|
||||
"%s: 'Shutdown' completo\n",
|
||||
|
@ -83,7 +83,7 @@ character-set=latin2
|
||||
"Coloana de tip BLOB '%-.64s' nu poate fi folosita in specificarea cheii cu tipul de tabla folosit",
|
||||
"Lungimea coloanei '%-.64s' este prea lunga (maximum = %d). Foloseste BLOB mai bine",
|
||||
"Definitia tabelei este incorecta; Nu pot fi mai mult de o singura coloana de tip auto si aceasta trebuie definita ca cheie",
|
||||
"%s: sint gata pentru conectii\n",
|
||||
"%s: sint gata pentru conectii",
|
||||
"%s: Terminare normala\n",
|
||||
"%s: Semnal %d obtinut. Aborting!\n",
|
||||
"%s: Terminare completa\n",
|
||||
|
@ -81,7 +81,7 @@ character-set=koi8r
|
||||
"Столбец типа BLOB '%-.64s' не может быть использован как значение ключа в таблице такого типа",
|
||||
"Слишком большая длина столбца '%-.64s' (максимум = %d). Используйте тип BLOB вместо текущего",
|
||||
"Некорректное определение таблицы: может существовать только один автоинкрементный столбец, и он должен быть определен как ключ",
|
||||
"%s: Готов принимать соединения.\nВерсия: '%s' сокет: '%s' порт: %d\n",
|
||||
"%s: Готов принимать соединения.\nВерсия: '%s' сокет: '%s' порт: %d",
|
||||
"%s: Корректная остановка\n",
|
||||
"%s: Получен сигнал %d. Прекращаем!\n",
|
||||
"%s: Остановка завершена\n",
|
||||
|
@ -87,7 +87,7 @@ character-set=latin2
|
||||
"Blob pole '%-.64s' nemôže byť použité ako kľúč",
|
||||
"Príliš veľká dĺžka pre pole '%-.64s' (maximum = %d). Použite BLOB",
|
||||
"Môžete mať iba jedno AUTO pole a to musí byť definované ako kľúč",
|
||||
"%s: pripravený na spojenie\n",
|
||||
"%s: pripravený na spojenie",
|
||||
"%s: normálne ukončenie\n",
|
||||
"%s: prijatý signál %d, ukončenie (Abort)!\n",
|
||||
"%s: práca ukončená\n",
|
||||
|
@ -81,7 +81,7 @@ character-set=latin1
|
||||
"La columna Blob '%-.64s' no puede ser usada en una declaracion de clave",
|
||||
"Longitud de columna demasiado grande para la columna '%-.64s' (maximo = %d).Usar BLOB en su lugar",
|
||||
"Puede ser solamente un campo automatico y este debe ser definido como una clave",
|
||||
"%s: preparado para conexiones\n",
|
||||
"%s: preparado para conexiones",
|
||||
"%s: Apagado normal\n",
|
||||
"%s: Recibiendo signal %d. Abortando!\n",
|
||||
"%s: Apagado completado\n",
|
||||
|
@ -79,7 +79,7 @@ character-set=latin1
|
||||
"En BLOB '%-.64s' kan inte vara nyckel med den använda tabelltypen",
|
||||
"För stor kolumnlängd angiven för '%-.64s' (max= %d). Använd en BLOB instället",
|
||||
"Det får finnas endast ett AUTO_INCREMENT-fält och detta måste vara en nyckel",
|
||||
"%s: klar att ta emot klienter\n",
|
||||
"%s: klar att ta emot klienter",
|
||||
"%s: Normal avslutning\n",
|
||||
"%s: Fick signal %d. Avslutar!\n",
|
||||
"%s: Avslutning klar\n",
|
||||
|
@ -84,7 +84,7 @@ character-set=koi8u
|
||||
"BLOB стовбець '%-.64s' не може бути використаний у визначенн╕ ключа в цьому тип╕ таблиц╕",
|
||||
"Задовга довжина стовбця '%-.64s' (max = %d). Використайте тип BLOB",
|
||||
"Нев╕рне визначення таблиц╕; Може бути лише один автоматичний стовбець, що повинен бути визначений як ключ",
|
||||
"%s: çÏÔÏ×ÉÊ ÄÌÑ Ú'¤ÄÎÁÎØ!\n",
|
||||
"%s: зПФПЧЙК ДМС Ъ'¤ДОБОШ!",
|
||||
"%s: Нормальне завершення\n",
|
||||
"%s: Отримано сигнал %d. Перериваюсь!\n",
|
||||
"%s: Роботу завершено\n",
|
||||
|
18
sql/slave.cc
18
sql/slave.cc
@ -623,7 +623,7 @@ int start_slave_thread(pthread_handler h_func, pthread_mutex_t *start_lock,
|
||||
pthread_mutex_unlock(start_lock);
|
||||
DBUG_RETURN(ER_SLAVE_THREAD);
|
||||
}
|
||||
if (start_cond && cond_lock)
|
||||
if (start_cond && cond_lock) // caller has cond_lock
|
||||
{
|
||||
THD* thd = current_thd;
|
||||
while (start_id == *slave_run_id)
|
||||
@ -633,11 +633,9 @@ int start_slave_thread(pthread_handler h_func, pthread_mutex_t *start_lock,
|
||||
"Waiting for slave thread to start");
|
||||
pthread_cond_wait(start_cond,cond_lock);
|
||||
thd->exit_cond(old_msg);
|
||||
pthread_mutex_lock(cond_lock); // re-acquire it as exit_cond() released
|
||||
if (thd->killed)
|
||||
{
|
||||
pthread_mutex_unlock(cond_lock);
|
||||
DBUG_RETURN(ER_SERVER_SHUTDOWN);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (start_lock)
|
||||
@ -1705,7 +1703,6 @@ Waiting for the slave SQL thread to free enough relay log space");
|
||||
!rli->ignore_log_space_limit)
|
||||
pthread_cond_wait(&rli->log_space_cond, &rli->log_space_lock);
|
||||
thd->exit_cond(save_proc_info);
|
||||
pthread_mutex_unlock(&rli->log_space_lock);
|
||||
DBUG_RETURN(slave_killed);
|
||||
}
|
||||
|
||||
@ -2381,6 +2378,9 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name,
|
||||
(long) timeout));
|
||||
|
||||
pthread_mutex_lock(&data_lock);
|
||||
const char *msg= thd->enter_cond(&data_cond, &data_lock,
|
||||
"Waiting for the slave SQL thread to "
|
||||
"advance position");
|
||||
/*
|
||||
This function will abort when it notices that some CHANGE MASTER or
|
||||
RESET MASTER has changed the master info.
|
||||
@ -2482,9 +2482,6 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name,
|
||||
//wait for master update, with optional timeout.
|
||||
|
||||
DBUG_PRINT("info",("Waiting for master update"));
|
||||
const char* msg = thd->enter_cond(&data_cond, &data_lock,
|
||||
"Waiting for the slave SQL thread to \
|
||||
advance position");
|
||||
/*
|
||||
We are going to pthread_cond_(timed)wait(); if the SQL thread stops it
|
||||
will wake us up.
|
||||
@ -2506,8 +2503,7 @@ advance position");
|
||||
}
|
||||
else
|
||||
pthread_cond_wait(&data_cond, &data_lock);
|
||||
DBUG_PRINT("info",("Got signal of master update"));
|
||||
thd->exit_cond(msg);
|
||||
DBUG_PRINT("info",("Got signal of master update or timed out"));
|
||||
if (error == ETIMEDOUT || error == ETIME)
|
||||
{
|
||||
error= -1;
|
||||
@ -2519,7 +2515,7 @@ advance position");
|
||||
}
|
||||
|
||||
err:
|
||||
pthread_mutex_unlock(&data_lock);
|
||||
thd->exit_cond(msg);
|
||||
DBUG_PRINT("exit",("killed: %d abort: %d slave_running: %d \
|
||||
improper_arguments: %d timed_out: %d",
|
||||
(int) thd->killed,
|
||||
|
@ -542,22 +542,30 @@ static ulong get_sort(uint count,...)
|
||||
va_start(args,count);
|
||||
ulong sort=0;
|
||||
|
||||
/* Should not use this function with more than 4 arguments for compare. */
|
||||
DBUG_ASSERT(count <= 4);
|
||||
|
||||
while (count--)
|
||||
{
|
||||
char *str=va_arg(args,char*);
|
||||
uint chars=0,wild=0;
|
||||
char *start, *str= va_arg(args,char*);
|
||||
uint chars= 0;
|
||||
uint wild_pos= 0; /* first wildcard position */
|
||||
|
||||
if (str)
|
||||
if (start= str)
|
||||
{
|
||||
for (; *str ; str++)
|
||||
{
|
||||
if (*str == wild_many || *str == wild_one || *str == wild_prefix)
|
||||
wild++;
|
||||
{
|
||||
wild_pos= str - start + 1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
chars++;
|
||||
}
|
||||
}
|
||||
sort= (sort << 8) + (wild ? 1 : chars ? 2 : 0);
|
||||
sort= (sort << 8) + (wild_pos ? (wild_pos > 127 ? 127 : wild_pos) :
|
||||
(chars ? 128 : 0));
|
||||
}
|
||||
va_end(args);
|
||||
return sort;
|
||||
|
@ -34,9 +34,6 @@
|
||||
|
||||
#define MAX_TREEMEM 8192
|
||||
#define MAX_TREE_ELEMENTS 256
|
||||
#define UINT_MAX16 0xffff
|
||||
#define UINT_MAX24 0xffffff
|
||||
#define UINT_MAX32 0xffffffff
|
||||
|
||||
int sortcmp2(void* cmp_arg __attribute__((unused)),
|
||||
const String *a,const String *b)
|
||||
|
@ -434,8 +434,18 @@ void THD::awake(bool prepare_to_die)
|
||||
exits the cond in the time between read and broadcast, but that is
|
||||
ok since all we want to do is to make the victim thread get out
|
||||
of waiting on current_cond.
|
||||
If we see a non-zero current_cond: it cannot be an old value (because
|
||||
then exit_cond() should have run and it can't because we have mutex); so
|
||||
it is the true value but maybe current_mutex is not yet non-zero (we're
|
||||
in the middle of enter_cond() and there is a "memory order
|
||||
inversion"). So we test the mutex too to not lock 0.
|
||||
Note that there is a small chance we fail to kill. If victim has locked
|
||||
current_mutex, and hasn't entered enter_cond(), then we don't know it's
|
||||
going to wait on cond. Then victim goes into its cond "forever" (until
|
||||
we issue a second KILL). True we have set its thd->killed but it may not
|
||||
see it immediately and so may have time to reach the cond_wait().
|
||||
*/
|
||||
if (mysys_var->current_cond)
|
||||
if (mysys_var->current_cond && mysys_var->current_mutex)
|
||||
{
|
||||
pthread_mutex_lock(mysys_var->current_mutex);
|
||||
pthread_cond_broadcast(mysys_var->current_cond);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user