merge from 5.5 main
This commit is contained in:
commit
6781bc56d5
@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# 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
|
||||
@ -317,6 +317,24 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/include/mysql_version.h.in
|
||||
${CMAKE_BINARY_DIR}/include/mysql_version.h )
|
||||
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc.in
|
||||
${CMAKE_BINARY_DIR}/sql/sql_builtin.cc)
|
||||
CONFIGURE_FILE(
|
||||
${CMAKE_SOURCE_DIR}/cmake/info_macros.cmake.in ${CMAKE_BINARY_DIR}/info_macros.cmake @ONLY)
|
||||
|
||||
# Handle the "INFO_*" files.
|
||||
INCLUDE(${CMAKE_BINARY_DIR}/info_macros.cmake)
|
||||
# Source: This can be done during the cmake phase, all information is
|
||||
# available, but should be repeated on each "make" just in case someone
|
||||
# does "cmake ; make ; bzr pull ; make".
|
||||
CREATE_INFO_SRC(${CMAKE_BINARY_DIR}/Docs)
|
||||
ADD_CUSTOM_TARGET(INFO_SRC ALL
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/info_src.cmake
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
)
|
||||
# Build flags: This must be postponed to the make phase.
|
||||
ADD_CUSTOM_TARGET(INFO_BIN ALL
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/info_bin.cmake
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||
)
|
||||
|
||||
# Packaging
|
||||
IF(WIN32)
|
||||
@ -344,6 +362,7 @@ IF(NOT INSTALL_LAYOUT MATCHES "RPM")
|
||||
OPTIONAL
|
||||
)
|
||||
INSTALL(FILES README DESTINATION ${INSTALL_DOCREADMEDIR} COMPONENT Readme)
|
||||
INSTALL(FILES ${CMAKE_BINARY_DIR}/Docs/INFO_SRC ${CMAKE_BINARY_DIR}/Docs/INFO_BIN DESTINATION ${INSTALL_DOCDIR})
|
||||
IF(UNIX)
|
||||
INSTALL(FILES Docs/INSTALL-BINARY DESTINATION ${INSTALL_DOCREADMEDIR} COMPONENT Readme)
|
||||
ENDIF()
|
||||
|
21
README
21
README
@ -3,18 +3,29 @@ MySQL Server
|
||||
This is a release of MySQL, a dual-license SQL database server.
|
||||
For the avoidance of doubt, this particular copy of the software
|
||||
is released under the version 2 of the GNU General Public License.
|
||||
MySQL is brought to you by the MySQL team at Oracle.
|
||||
MySQL is brought to you by Oracle.
|
||||
|
||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
License information can be found in the COPYING file.
|
||||
|
||||
MySQL FOSS License Exception
|
||||
We want free and open source software applications under certain
|
||||
licenses to be able to use specified GPL-licensed MySQL client
|
||||
libraries despite the fact that not all such FOSS licenses are
|
||||
compatible with version 2 of the GNU General Public License.
|
||||
Therefore there are special exceptions to the terms and conditions
|
||||
of the GPLv2 as applied to these client libraries, which are
|
||||
identified and described in more detail in the FOSS License
|
||||
Exception at
|
||||
<http://www.mysql.com/about/legal/licensing/foss-exception.html>.
|
||||
|
||||
This distribution may include materials developed by third
|
||||
parties. For license and attribution notices for these
|
||||
materials, please refer to the documentation that accompanies
|
||||
this distribution (see the Licenses for Third-Party Components
|
||||
appendix). A copy of the license/notices is also reproduced
|
||||
below.
|
||||
this distribution (see the "Licenses for Third-Party Components"
|
||||
appendix) or view the online documentation at
|
||||
<http://dev.mysql.com/doc/>.
|
||||
|
||||
GPLv2 Disclaimer
|
||||
For the avoidance of doubt, except that if any license choice
|
||||
@ -38,8 +49,6 @@ Some Reference Manual sections of special interest:
|
||||
chapter.
|
||||
- For the new features/bugfix history, see the MySQL Change History
|
||||
appendix.
|
||||
- For currently known bugs, see the Errors and Common Problems
|
||||
appendix.
|
||||
|
||||
You can browse the MySQL Reference Manual online or download it
|
||||
in any of several formats at the URL given earlier in this file.
|
||||
|
2
VERSION
2
VERSION
@ -1,4 +1,4 @@
|
||||
MYSQL_VERSION_MAJOR=5
|
||||
MYSQL_VERSION_MINOR=5
|
||||
MYSQL_VERSION_PATCH=10
|
||||
MYSQL_VERSION_PATCH=11
|
||||
MYSQL_VERSION_EXTRA=
|
||||
|
@ -50,9 +50,6 @@ enum options_client
|
||||
OPT_OPEN_FILES_LIMIT, OPT_SET_CHARSET, OPT_SERVER_ARG,
|
||||
OPT_STOP_POSITION, OPT_START_DATETIME, OPT_STOP_DATETIME,
|
||||
OPT_SIGINT_IGNORE, OPT_HEXBLOB, OPT_ORDER_BY_PRIMARY, OPT_COUNT,
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
OPT_NDBCLUSTER, OPT_NDB_CONNECTSTRING,
|
||||
#endif
|
||||
OPT_TRIGGERS,
|
||||
OPT_MYSQL_ONLY_PRINT,
|
||||
OPT_MYSQL_LOCK_DIRECTORY,
|
||||
|
@ -1127,6 +1127,8 @@ int main(int argc,char *argv[])
|
||||
if (status.batch && !status.line_buff &&
|
||||
!(status.line_buff= batch_readline_init(MAX_BATCH_BUFFER_SIZE, stdin)))
|
||||
{
|
||||
put_info("Can't initialize batch_readline - may be the input source is "
|
||||
"a directory or a block device.", INFO_ERROR, 0);
|
||||
free_defaults(defaults_argv);
|
||||
my_end(0);
|
||||
exit(1);
|
||||
|
@ -1153,6 +1153,9 @@ static int switch_db_collation(FILE *sql_file,
|
||||
{
|
||||
if (strcmp(current_db_cl_name, required_db_cl_name) != 0)
|
||||
{
|
||||
char quoted_db_buf[NAME_LEN * 2 + 3];
|
||||
char *quoted_db_name= quote_name(db_name, quoted_db_buf, FALSE);
|
||||
|
||||
CHARSET_INFO *db_cl= get_charset_by_name(required_db_cl_name, MYF(0));
|
||||
|
||||
if (!db_cl)
|
||||
@ -1160,7 +1163,7 @@ static int switch_db_collation(FILE *sql_file,
|
||||
|
||||
fprintf(sql_file,
|
||||
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
|
||||
(const char *) db_name,
|
||||
(const char *) quoted_db_name,
|
||||
(const char *) db_cl->csname,
|
||||
(const char *) db_cl->name,
|
||||
(const char *) delimiter);
|
||||
@ -1181,6 +1184,9 @@ static int restore_db_collation(FILE *sql_file,
|
||||
const char *delimiter,
|
||||
const char *db_cl_name)
|
||||
{
|
||||
char quoted_db_buf[NAME_LEN * 2 + 3];
|
||||
char *quoted_db_name= quote_name(db_name, quoted_db_buf, FALSE);
|
||||
|
||||
CHARSET_INFO *db_cl= get_charset_by_name(db_cl_name, MYF(0));
|
||||
|
||||
if (!db_cl)
|
||||
@ -1188,7 +1194,7 @@ static int restore_db_collation(FILE *sql_file,
|
||||
|
||||
fprintf(sql_file,
|
||||
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
|
||||
(const char *) db_name,
|
||||
(const char *) quoted_db_name,
|
||||
(const char *) db_cl->csname,
|
||||
(const char *) db_cl->name,
|
||||
(const char *) delimiter);
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <my_global.h>
|
||||
#include <my_sys.h>
|
||||
#include <m_string.h>
|
||||
#include <my_dir.h>
|
||||
#include "my_readline.h"
|
||||
|
||||
static bool init_line_buffer(LINE_BUFFER *buffer,File file,ulong size,
|
||||
@ -30,6 +31,15 @@ static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length);
|
||||
LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
|
||||
{
|
||||
LINE_BUFFER *line_buff;
|
||||
MY_STAT input_file_stat;
|
||||
|
||||
#ifndef __WIN__
|
||||
if (my_fstat(fileno(file), &input_file_stat, MYF(MY_WME)) ||
|
||||
MY_S_ISDIR(input_file_stat.st_mode) ||
|
||||
MY_S_ISBLK(input_file_stat.st_mode))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
if (!(line_buff=(LINE_BUFFER*)
|
||||
my_malloc(sizeof(*line_buff),MYF(MY_WME | MY_ZEROFILL))))
|
||||
return 0;
|
||||
|
30
cmake/info_bin.cmake
Normal file
30
cmake/info_bin.cmake
Normal file
@ -0,0 +1,30 @@
|
||||
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# 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; version 2 of the License.
|
||||
#
|
||||
# This program 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 General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
# The sole purpose of this cmake control file is to create the "INFO_BIN" file.
|
||||
|
||||
# By having a separate cmake file for this, it is ensured this happens
|
||||
# only in the build (Unix: "make") phase, not when cmake runs.
|
||||
# This, in turn, avoids creating stuff in the source directory -
|
||||
# it should get into the binary directory only.
|
||||
|
||||
|
||||
# Get the macros which the "INFO_*" files.
|
||||
INCLUDE(${CMAKE_BINARY_DIR}/info_macros.cmake)
|
||||
|
||||
# Here is where the action is.
|
||||
CREATE_INFO_BIN()
|
||||
|
132
cmake/info_macros.cmake.in
Normal file
132
cmake/info_macros.cmake.in
Normal file
@ -0,0 +1,132 @@
|
||||
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# 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; version 2 of the License.
|
||||
#
|
||||
# This program 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 General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
# Handle/create the "INFO_*" files describing a MySQL (server) binary.
|
||||
# This is part of the fix for bug#42969.
|
||||
|
||||
|
||||
# Several of cmake's variables need to be translated from '@' notation
|
||||
# to '${}', this is done by the "configure" call in top level "CMakeLists.txt".
|
||||
# If further variables are used in this file, add them to this list.
|
||||
|
||||
SET(VERSION "@VERSION@")
|
||||
SET(CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@")
|
||||
SET(CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@")
|
||||
SET(CMAKE_GENERATOR "@CMAKE_GENERATOR@")
|
||||
SET(CMAKE_SIZEOF_VOID_P "@CMAKE_SIZEOF_VOID_P@")
|
||||
SET(BZR_EXECUTABLE "@BZR_EXECUTABLE@")
|
||||
SET(CMAKE_CROSSCOMPILING "@CMAKE_CROSSCOMPILING@")
|
||||
SET(CMAKE_HOST_SYSTEM "@CMAKE_HOST_SYSTEM@")
|
||||
SET(CMAKE_HOST_SYSTEM_PROCESSOR "@CMAKE_HOST_SYSTEM_PROCESSOR@")
|
||||
SET(CMAKE_SYSTEM "@CMAKE_SYSTEM@")
|
||||
SET(CMAKE_SYSTEM_PROCESSOR "@CMAKE_SYSTEM_PROCESSOR@")
|
||||
|
||||
|
||||
# Create an "INFO_SRC" file with information about the source (only).
|
||||
# We use "bzr version-info", if possible, and the "VERSION" contents.
|
||||
#
|
||||
# Outside development (BZR tree), the "INFO_SRC" file will not be modified
|
||||
# provided it exists (from "make dist" or a source tarball creation).
|
||||
|
||||
MACRO(CREATE_INFO_SRC target_dir)
|
||||
SET(INFO_SRC "${target_dir}/INFO_SRC")
|
||||
|
||||
IF(EXISTS ${CMAKE_SOURCE_DIR}/.bzr)
|
||||
# Sources are in a BZR repository: Always update.
|
||||
EXECUTE_PROCESS(
|
||||
COMMAND ${BZR_EXECUTABLE} version-info ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE VERSION_INFO
|
||||
RESULT_VARIABLE RESULT
|
||||
)
|
||||
FILE(WRITE ${INFO_SRC} "${VERSION_INFO}\n")
|
||||
# to debug, add: FILE(APPEND ${INFO_SRC} "\nResult ${RESULT}\n")
|
||||
# For better readability ...
|
||||
FILE(APPEND ${INFO_SRC} "\nMySQL source ${VERSION}\n")
|
||||
ELSEIF(EXISTS ${INFO_SRC})
|
||||
# Outside a BZR tree, there is no need to change an existing "INFO_SRC",
|
||||
# it cannot be improved.
|
||||
ELSEIF(EXISTS ${CMAKE_SOURCE_DIR}/Docs/INFO_SRC)
|
||||
# If we are building from a source distribution, it also contains "INFO_SRC".
|
||||
# Similar, the export used for a release build already has the file.
|
||||
FILE(READ ${CMAKE_SOURCE_DIR}/Docs/INFO_SRC SOURCE_INFO)
|
||||
FILE(WRITE ${INFO_SRC} "${SOURCE_INFO}\n")
|
||||
ELSEIF(EXISTS ${CMAKE_SOURCE_DIR}/INFO_SRC)
|
||||
# This is not the proper location, but who knows ...
|
||||
FILE(READ ${CMAKE_SOURCE_DIR}/INFO_SRC SOURCE_INFO)
|
||||
FILE(WRITE ${INFO_SRC} "${SOURCE_INFO}\n")
|
||||
ELSE()
|
||||
# This is a fall-back.
|
||||
FILE(WRITE ${INFO_SRC} "\nMySQL source ${VERSION}\n")
|
||||
ENDIF()
|
||||
ENDMACRO(CREATE_INFO_SRC)
|
||||
|
||||
|
||||
# This is for the "real" build, must be run again with each cmake run
|
||||
# to make sure we report the current flags (not those of some previous run).
|
||||
|
||||
MACRO(CREATE_INFO_BIN)
|
||||
SET(INFO_BIN "Docs/INFO_BIN")
|
||||
|
||||
FILE(WRITE ${INFO_BIN} "===== Information about the build process: =====\n")
|
||||
IF (WIN32)
|
||||
EXECUTE_PROCESS(COMMAND cmd /c date /T OUTPUT_VARIABLE TMP_DATE)
|
||||
ELSEIF(UNIX)
|
||||
EXECUTE_PROCESS(COMMAND date "+%Y-%m-%d %H:%M:%S" OUTPUT_VARIABLE TMP_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
ELSE()
|
||||
SET(TMP_DATE "(no date command known for this platform)")
|
||||
ENDIF()
|
||||
SITE_NAME(HOSTNAME)
|
||||
FILE(APPEND ${INFO_BIN} "Build was run at ${TMP_DATE} on host '${HOSTNAME}'\n\n")
|
||||
|
||||
# According to the cmake docs, these variables should always be set.
|
||||
# However, they are empty in my tests, using cmake 2.6.4 on Linux, various Unix, and Windows.
|
||||
# Still, include this code, so we will profit if a build environment does provide that info.
|
||||
IF(CMAKE_HOST_SYSTEM)
|
||||
FILE(APPEND ${INFO_BIN} "Build was done on ${CMAKE_HOST_SYSTEM} using ${CMAKE_HOST_SYSTEM_PROCESSOR}\n")
|
||||
ENDIF()
|
||||
IF(CMAKE_CROSSCOMPILING)
|
||||
FILE(APPEND ${INFO_BIN} "Build was done for ${CMAKE_SYSTEM} using ${CMAKE_SYSTEM_PROCESSOR}\n")
|
||||
ENDIF()
|
||||
|
||||
# ${CMAKE_VERSION} doesn't work in 2.6.0, use the separate components.
|
||||
FILE(APPEND ${INFO_BIN} "Build was done using cmake ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} \n\n")
|
||||
|
||||
IF (WIN32)
|
||||
FILE(APPEND ${INFO_BIN} "===== Compiler / generator used: =====\n")
|
||||
FILE(APPEND ${INFO_BIN} ${CMAKE_GENERATOR} "\n\n")
|
||||
ELSEIF(UNIX)
|
||||
FILE(APPEND ${INFO_BIN} "===== Compiler flags used (from the 'sql/' subdirectory): =====\n")
|
||||
IF(EXISTS sql/CMakeFiles/sql.dir/flags.make)
|
||||
EXECUTE_PROCESS(COMMAND egrep "^# compile|^C_|^CXX_" sql/CMakeFiles/sql.dir/flags.make OUTPUT_VARIABLE COMPILE_FLAGS)
|
||||
FILE(APPEND ${INFO_BIN} ${COMPILE_FLAGS} "\n")
|
||||
ELSE()
|
||||
FILE(APPEND ${INFO_BIN} "File 'sql/CMakeFiles/sql.dir/flags.make' is not yet found.\n\n")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
FILE(APPEND ${INFO_BIN} "Pointer size: ${CMAKE_SIZEOF_VOID_P}\n\n")
|
||||
|
||||
FILE(APPEND ${INFO_BIN} "===== Feature flags used: =====\n")
|
||||
IF(EXISTS ${CMAKE_BINARY_DIR}/CMakeCache.txt)
|
||||
# Attention: "-N" prevents cmake from entering a recursion, and it must be a separate flag from "-L".
|
||||
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -N -L ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE FEATURE_FLAGS)
|
||||
FILE(APPEND ${INFO_BIN} ${FEATURE_FLAGS} "\n")
|
||||
ELSE()
|
||||
FILE(APPEND ${INFO_BIN} "File 'CMakeCache.txt' is not yet found.\n\n")
|
||||
ENDIF()
|
||||
|
||||
FILE(APPEND ${INFO_BIN} "===== EOF =====\n")
|
||||
ENDMACRO(CREATE_INFO_BIN)
|
||||
|
31
cmake/info_src.cmake
Normal file
31
cmake/info_src.cmake
Normal file
@ -0,0 +1,31 @@
|
||||
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# 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; version 2 of the License.
|
||||
#
|
||||
# This program 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 General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
# The sole purpose of this cmake control file is to create the "INFO_SRC" file.
|
||||
|
||||
# As long as and "bzr pull" (or "bzr commit") is followed by a "cmake",
|
||||
# the call in top level "CMakeLists.txt" is sufficient.
|
||||
# This file is to provide a separate target for the "make" phase,
|
||||
# to ensure the BZR revision-id is correct even after a sequence
|
||||
# cmake ; make ; bzr pull ; make
|
||||
|
||||
|
||||
# Get the macros which handle the "INFO_*" files.
|
||||
INCLUDE(${CMAKE_BINARY_DIR}/info_macros.cmake)
|
||||
|
||||
# Here is where the action is.
|
||||
CREATE_INFO_SRC(${CMAKE_BINARY_DIR}/Docs)
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright (C) 2009 Sun Microsystems, Inc
|
||||
# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# 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
|
||||
@ -106,6 +106,12 @@ IF(MYSQL_DOCS_LOCATION)
|
||||
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_directory "${MYSQL_DOCS_LOCATION}" "${PACKAGE_DIR}")
|
||||
ENDIF()
|
||||
|
||||
# Ensure there is an "INFO_SRC" file.
|
||||
INCLUDE(${CMAKE_BINARY_DIR}/info_macros.cmake)
|
||||
IF(NOT EXISTS ${PACKAGE_DIR}/Docs/INFO_SRC)
|
||||
CREATE_INFO_SRC(${PACKAGE_DIR}/Docs)
|
||||
ENDIF()
|
||||
|
||||
# In case we used CPack, it could have copied some
|
||||
# extra files that are not usable on different machines.
|
||||
FILE(REMOVE ${PACKAGE_DIR}/CMakeCache.txt)
|
||||
|
@ -219,14 +219,13 @@ static void print_escaped_string(FILE *f, const char *str)
|
||||
|
||||
static int create_header_files(struct errors *error_head)
|
||||
{
|
||||
uint er_last;
|
||||
uint er_last= 0;
|
||||
FILE *er_definef, *sql_statef, *er_namef;
|
||||
struct errors *tmp_error;
|
||||
struct message *er_msg;
|
||||
const char *er_text;
|
||||
|
||||
DBUG_ENTER("create_header_files");
|
||||
LINT_INIT(er_last);
|
||||
|
||||
if (!(er_definef= my_fopen(HEADERFILE, O_WRONLY, MYF(MY_WME))))
|
||||
{
|
||||
|
@ -1,3 +1,18 @@
|
||||
/* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
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; version 2 of the License.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||
|
||||
#ifndef MY_BIT_INCLUDED
|
||||
#define MY_BIT_INCLUDED
|
||||
|
||||
@ -44,9 +59,12 @@ static inline uint my_count_bits(ulonglong v)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline uint my_count_bits_ushort(ushort v)
|
||||
static inline uint my_count_bits_uint32(uint32 v)
|
||||
{
|
||||
return _my_bits_nbits[v];
|
||||
return (uint) (uchar) (_my_bits_nbits[(uchar) v] +
|
||||
_my_bits_nbits[(uchar) (v >> 8)] +
|
||||
_my_bits_nbits[(uchar) (v >> 16)] +
|
||||
_my_bits_nbits[(uchar) (v >> 24)]);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2000 MySQL AB, 2009 Sun Microsystems, Inc
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
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
|
||||
@ -125,9 +125,10 @@ bitmap_is_set(const MY_BITMAP *map,uint bit)
|
||||
|
||||
static inline my_bool bitmap_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2)
|
||||
{
|
||||
*(map1)->last_word_ptr|= (map1)->last_word_mask;
|
||||
*(map2)->last_word_ptr|= (map2)->last_word_mask;
|
||||
return memcmp((map1)->bitmap, (map2)->bitmap, 4*no_words_in_map((map1)))==0;
|
||||
if (memcmp(map1->bitmap, map2->bitmap, 4*(no_words_in_map(map1)-1)) != 0)
|
||||
return FALSE;
|
||||
return ((*map1->last_word_ptr | map1->last_word_mask) ==
|
||||
(*map2->last_word_ptr | map2->last_word_mask));
|
||||
}
|
||||
|
||||
#define bitmap_clear_all(MAP) \
|
||||
|
@ -1476,7 +1476,6 @@ static inline double rint(double x)
|
||||
|
||||
#undef HAVE_OPENSSL
|
||||
#undef HAVE_SMEM /* No shared memory */
|
||||
#undef HAVE_NDBCLUSTER_DB /* No NDB cluster */
|
||||
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
#undef HAVE_DLOPEN /* No udf functions */
|
||||
#undef HAVE_SMEM /* No shared memory */
|
||||
#undef HAVE_NDBCLUSTER_DB /* No NDB cluster */
|
||||
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
#endif /* MYSQL_EMBED_INCLUDED */
|
||||
|
@ -5,8 +5,6 @@ binlog.binlog_multi_engine # joro : NDB tests marked as experiment
|
||||
|
||||
funcs_1.charset_collation_1 # depends on compile-time decisions
|
||||
|
||||
innodb.innodb_information_schema # Bug#48883 2010-05-11 alik Test "innodb_information_schema" takes fewer locks than expected
|
||||
|
||||
main.func_math @freebsd # Bug#43020 2010-05-04 alik main.func_math fails on FreeBSD in PB2
|
||||
main.gis-rtree @freebsd # Bug#38965 2010-05-04 alik test cases gis-rtree, type_float, type_newdecimal fail in embedded server
|
||||
main.lock_multi_bug38499 # Bug#47448 2009-09-19 alik main.lock_multi_bug38499 times out sporadically
|
||||
|
11
mysql-test/collections/default.release
Normal file
11
mysql-test/collections/default.release
Normal file
@ -0,0 +1,11 @@
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=debug --vardir=var-debug --skip-ndbcluster --skip-rpl --report-features --debug-server
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=normal --vardir=var-normal --skip-ndbcluster --report-features
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=ps --vardir=var-ps --skip-ndbcluster --ps-protocol
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=funcs1+ps --vardir=var-funcs_1_ps --suite=funcs_1 --ps-protocol
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=funcs2 --vardir=var-funcs2 --suite=funcs_2
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=partitions --vardir=var-parts --suite=parts
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=stress --vardir=var-stress --suite=stress
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=jp --vardir=var-jp --suite=jp
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=embedded --vardir=var-embedded --embedded-server --skip-rpl --skip-ndbcluster
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=nist --vardir=var-nist --suite=nist
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=nist+ps --vardir=var-nist_ps --suite=nist --ps-protocol
|
@ -1,10 +0,0 @@
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=normal --skip-ndbcluster --report-features --experimental=collections/default.experimental --unit-tests
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=ps --skip-ndbcluster --ps-protocol --experimental=collections/default.experimental
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=funcs1+ps --suite=funcs_1 --ps-protocol --experimental=collections/default.experimental
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=funcs2 --suite=funcs_2 --experimental=collections/default.experimental
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=partitions --suite=parts --experimental=collections/default.experimental
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=stress --suite=stress --experimental=collections/default.experimental
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=jp --suite=jp --experimental=collections/default.experimental
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=embedded --embedded-server --skip-rpl --skip-ndbcluster --experimental=collections/default.experimental
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=nist --suite=nist --experimental=collections/default.experimental
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=nist+ps --suite=nist --ps-protocol --experimental=collections/default.experimental
|
@ -1 +0,0 @@
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=debug --skip-ndbcluster --skip-rpl --report-features --experimental=collections/default.experimental --unit-tests
|
@ -1,2 +0,0 @@
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=ps --skip-ndbcluster --ps-protocol --report-features --experimental=collections/default.experimental --unit-tests
|
||||
perl mysql-test-run.pl --force --timer --parallel=auto --comment=stress --suite=stress --experimental=collections/default.experimental
|
@ -2,22 +2,24 @@
|
||||
|
||||
#
|
||||
# BUG#5551 "Failed OPTIMIZE TABLE is logged to binary log"
|
||||
# Replication should work when OPTIMIZE TABLE timeouts, and
|
||||
# when OPTIMIZE TABLE is executed on a non-existing table
|
||||
# Replication should work when when OPTIMIZE TABLE is
|
||||
# executed on a non-existing table.
|
||||
#
|
||||
# Due to patch for BUG#989, checking that an OPTIMIZE
|
||||
# that fails due to a lock wait timeout on an InnoDB table
|
||||
# is not valid anymore, as an mdl lock is hit before,
|
||||
# thence no timeout occurs, but instead a deadlock.
|
||||
#
|
||||
|
||||
|
||||
eval CREATE TABLE t1 ( a int ) ENGINE=$engine_type;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
connection master1;
|
||||
OPTIMIZE TABLE t1;
|
||||
|
||||
OPTIMIZE TABLE non_existing;
|
||||
sync_slave_with_master;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
connection master;
|
||||
select * from t1;
|
||||
commit;
|
||||
|
@ -1737,6 +1737,35 @@ EXPLAIN SELECT * FROM t1 WHERE date_column BETWEEN '2010-09-01' AND '2010-10-01'
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug #31384 DATE_ADD() and DATE_SUB() return binary data
|
||||
--echo #
|
||||
SELECT @@collation_connection, @@character_set_results;
|
||||
CREATE TABLE t1 AS
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 MINUTE) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--enable_metadata
|
||||
# PS protocol gives different "Max length" value for DATETIME.
|
||||
--disable_ps_protocol
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 DAY) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
--disable_metadata
|
||||
--enable_ps_protocol
|
||||
SELECT
|
||||
HEX(DATE_SUB('2007-08-03', INTERVAL 1 MINUTE)) AS field_str1,
|
||||
HEX(DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE)) AS field1_str2,
|
||||
HEX(DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY)) AS field_date,
|
||||
HEX(DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE)) AS field_datetime;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#52159 returning time type from function and empty left join causes debug assertion
|
||||
--echo #
|
||||
|
@ -1579,12 +1579,6 @@ sub command_line_setup {
|
||||
$debug_d= "d,query,info,error,enter,exit";
|
||||
}
|
||||
|
||||
if ($opt_debug && $opt_debug ne "1")
|
||||
{
|
||||
$debug_d= "d,$opt_debug";
|
||||
$debug_d= "d,query,info,error,enter,exit" if $opt_debug eq "std";
|
||||
}
|
||||
|
||||
mtr_report("Checking supported features...");
|
||||
|
||||
check_ndbcluster_support(\%mysqld_variables);
|
||||
@ -2041,7 +2035,7 @@ sub read_plugin_defs($)
|
||||
|
||||
# Need to check if we will be running mysqld-debug
|
||||
if ($opt_debug_server) {
|
||||
$running_debug= 1 if find_mysqld($basedir) =~ /-debug$/;
|
||||
$running_debug= 1 if find_mysqld($basedir) =~ /mysqld-debug/;
|
||||
}
|
||||
|
||||
while (<PLUGDEF>) {
|
||||
@ -2185,6 +2179,7 @@ sub environment_setup {
|
||||
$ENV{'MYSQL_TMP_DIR'}= $opt_tmpdir;
|
||||
$ENV{'MYSQLTEST_VARDIR'}= $opt_vardir;
|
||||
$ENV{'MYSQL_LIBDIR'}= "$basedir/lib";
|
||||
$ENV{'MYSQL_BINDIR'}= "$bindir";
|
||||
$ENV{'MYSQL_SHAREDIR'}= $path_language;
|
||||
$ENV{'MYSQL_CHARSETSDIR'}= $path_charsetsdir;
|
||||
|
||||
|
@ -1383,3 +1383,11 @@ ALTER TABLE t1 CHANGE a id INT;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#11754461 CANNOT ALTER TABLE WHEN KEY PREFIX TOO LONG
|
||||
#
|
||||
DROP DATABASE IF EXISTS db1;
|
||||
CREATE DATABASE db1 CHARACTER SET utf8;
|
||||
CREATE TABLE db1.t1 (bar TINYTEXT, KEY (bar(100)));
|
||||
ALTER TABLE db1.t1 ADD baz INT;
|
||||
DROP DATABASE db1;
|
||||
|
@ -2767,6 +2767,46 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range date_column date_column 9 NULL 1 Using where
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #31384 DATE_ADD() and DATE_SUB() return binary data
|
||||
#
|
||||
SELECT @@collation_connection, @@character_set_results;
|
||||
@@collation_connection @@character_set_results
|
||||
binary binary
|
||||
CREATE TABLE t1 AS
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 MINUTE) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`field_str1` varbinary(29) DEFAULT NULL,
|
||||
`field1_str2` varbinary(29) DEFAULT NULL,
|
||||
`field_date` date DEFAULT NULL,
|
||||
`field_datetime` datetime DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 DAY) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def field_str1 254 29 10 Y 128 31 63
|
||||
def field1_str2 254 29 19 Y 128 31 63
|
||||
def field_date 10 29 10 Y 128 31 63
|
||||
def field_datetime 12 29 19 Y 128 31 63
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
2007-08-02 2007-08-03 17:32:00 2007-08-02 2007-08-03 17:32:00
|
||||
SELECT
|
||||
HEX(DATE_SUB('2007-08-03', INTERVAL 1 MINUTE)) AS field_str1,
|
||||
HEX(DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE)) AS field1_str2,
|
||||
HEX(DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY)) AS field_date,
|
||||
HEX(DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE)) AS field_datetime;
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
323030372D30382D30322032333A35393A3030 323030372D30382D30332031373A33323A3030 323030372D30382D3032 323030372D30382D30332031373A33323A3030
|
||||
#
|
||||
# Bug#52159 returning time type from function and empty left join causes debug assertion
|
||||
#
|
||||
CREATE FUNCTION f1() RETURNS TIME RETURN 1;
|
||||
|
@ -238,3 +238,6 @@ select a from t1 where a like "abcdefgh
|
||||
a
|
||||
abcdefghá
|
||||
drop table t1;
|
||||
set global LC_MESSAGES=convert((@@global.log_bin_trust_function_creators)
|
||||
using cp1250);
|
||||
ERROR HY000: Unknown locale: '1'
|
||||
|
@ -386,6 +386,8 @@ FD FD FD D18D FD
|
||||
FE FE FE D18E FE
|
||||
FF FF FF D18F FF
|
||||
DROP TABLE t1;
|
||||
set global LC_TIME_NAMES=convert((-8388608) using cp1251);
|
||||
ERROR HY000: Unknown locale: '-8388608'
|
||||
#
|
||||
# End of 5.1 tests
|
||||
#
|
||||
@ -3157,6 +3159,46 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range date_column date_column 9 NULL 1 Using where
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #31384 DATE_ADD() and DATE_SUB() return binary data
|
||||
#
|
||||
SELECT @@collation_connection, @@character_set_results;
|
||||
@@collation_connection @@character_set_results
|
||||
cp1251_general_ci cp1251
|
||||
CREATE TABLE t1 AS
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 MINUTE) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`field_str1` varchar(29) CHARACTER SET cp1251 DEFAULT NULL,
|
||||
`field1_str2` varchar(29) CHARACTER SET cp1251 DEFAULT NULL,
|
||||
`field_date` date DEFAULT NULL,
|
||||
`field_datetime` datetime DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 DAY) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def field_str1 254 29 10 Y 0 31 51
|
||||
def field1_str2 254 29 19 Y 0 31 51
|
||||
def field_date 10 29 10 Y 128 31 63
|
||||
def field_datetime 12 29 19 Y 128 31 63
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
2007-08-02 2007-08-03 17:32:00 2007-08-02 2007-08-03 17:32:00
|
||||
SELECT
|
||||
HEX(DATE_SUB('2007-08-03', INTERVAL 1 MINUTE)) AS field_str1,
|
||||
HEX(DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE)) AS field1_str2,
|
||||
HEX(DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY)) AS field_date,
|
||||
HEX(DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE)) AS field_datetime;
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
323030372D30382D30322032333A35393A3030 323030372D30382D30332031373A33323A3030 323030372D30382D3032 323030372D30382D30332031373A33323A3030
|
||||
#
|
||||
# Bug#52159 returning time type from function and empty left join causes debug assertion
|
||||
#
|
||||
CREATE FUNCTION f1() RETURNS TIME RETURN 1;
|
||||
@ -3177,5 +3219,20 @@ maketime(`a`,`a`,`a`)
|
||||
DROP TABLE t1;
|
||||
SET sql_mode=default;
|
||||
#
|
||||
# Bug#60101 COALESCE with cp1251 tables causes [Err] 1267 - Illegal mix of collations
|
||||
#
|
||||
CREATE TABLE t1 (test1 INT, test2 VARCHAR(255));
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`test1` int(11) DEFAULT NULL,
|
||||
`test2` varchar(255) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
SELECT COALESCE(IF(test1=1, 1, NULL), test2) FROM t1;
|
||||
COALESCE(IF(test1=1, 1, NULL), test2)
|
||||
SELECT COALESCE(IF(test1=1, NULL, 1), test2) FROM t1;
|
||||
COALESCE(IF(test1=1, NULL, 1), test2)
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
@ -9859,6 +9859,8 @@ hex(convert(_eucjpms 0xA5FE41 using ucs2))
|
||||
select hex(convert(_eucjpms 0x8FABF841 using ucs2));
|
||||
hex(convert(_eucjpms 0x8FABF841 using ucs2))
|
||||
003F0041
|
||||
set global LC_TIME_NAMES=convert((convert((0x63) using eucjpms)) using utf8);
|
||||
ERROR HY000: Unknown locale: 'c'
|
||||
#
|
||||
# Start of 5.5 tests
|
||||
#
|
||||
|
@ -3186,6 +3186,46 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range date_column date_column 9 NULL 1 Using where
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #31384 DATE_ADD() and DATE_SUB() return binary data
|
||||
#
|
||||
SELECT @@collation_connection, @@character_set_results;
|
||||
@@collation_connection @@character_set_results
|
||||
latin1_swedish_ci latin1
|
||||
CREATE TABLE t1 AS
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 MINUTE) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`field_str1` varchar(29) DEFAULT NULL,
|
||||
`field1_str2` varchar(29) DEFAULT NULL,
|
||||
`field_date` date DEFAULT NULL,
|
||||
`field_datetime` datetime DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 DAY) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def field_str1 254 29 10 Y 0 31 8
|
||||
def field1_str2 254 29 19 Y 0 31 8
|
||||
def field_date 10 29 10 Y 128 31 63
|
||||
def field_datetime 12 29 19 Y 128 31 63
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
2007-08-02 2007-08-03 17:32:00 2007-08-02 2007-08-03 17:32:00
|
||||
SELECT
|
||||
HEX(DATE_SUB('2007-08-03', INTERVAL 1 MINUTE)) AS field_str1,
|
||||
HEX(DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE)) AS field1_str2,
|
||||
HEX(DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY)) AS field_date,
|
||||
HEX(DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE)) AS field_datetime;
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
323030372D30382D30322032333A35393A3030 323030372D30382D30332031373A33323A3030 323030372D30382D3032 323030372D30382D30332031373A33323A3030
|
||||
#
|
||||
# Bug#52159 returning time type from function and empty left join causes debug assertion
|
||||
#
|
||||
CREATE FUNCTION f1() RETURNS TIME RETURN 1;
|
||||
|
@ -4009,6 +4009,46 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #31384 DATE_ADD() and DATE_SUB() return binary data
|
||||
#
|
||||
SELECT @@collation_connection, @@character_set_results;
|
||||
@@collation_connection @@character_set_results
|
||||
ucs2_general_ci latin1
|
||||
CREATE TABLE t1 AS
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 MINUTE) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`field_str1` varchar(29) CHARACTER SET ucs2 DEFAULT NULL,
|
||||
`field1_str2` varchar(29) CHARACTER SET ucs2 DEFAULT NULL,
|
||||
`field_date` date DEFAULT NULL,
|
||||
`field_datetime` datetime DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 DAY) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def field_str1 254 29 10 Y 0 31 8
|
||||
def field1_str2 254 29 19 Y 0 31 8
|
||||
def field_date 10 29 10 Y 128 31 63
|
||||
def field_datetime 12 29 19 Y 128 31 63
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
2007-08-02 2007-08-03 17:32:00 2007-08-02 2007-08-03 17:32:00
|
||||
SELECT
|
||||
HEX(DATE_SUB('2007-08-03', INTERVAL 1 MINUTE)) AS field_str1,
|
||||
HEX(DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE)) AS field1_str2,
|
||||
HEX(DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY)) AS field_date,
|
||||
HEX(DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE)) AS field_datetime;
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
0032003000300037002D00300038002D00300032002000320033003A00350039003A00300030 0032003000300037002D00300038002D00300033002000310037003A00330032003A00300030 323030372D30382D3032 323030372D30382D30332031373A33323A3030
|
||||
#
|
||||
# Bug#52159 returning time type from function and empty left join causes debug assertion
|
||||
#
|
||||
CREATE FUNCTION f1() RETURNS TIME RETURN 1;
|
||||
|
@ -4898,6 +4898,46 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range date_column date_column 9 NULL 1 Using where
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #31384 DATE_ADD() and DATE_SUB() return binary data
|
||||
#
|
||||
SELECT @@collation_connection, @@character_set_results;
|
||||
@@collation_connection @@character_set_results
|
||||
utf8_general_ci utf8
|
||||
CREATE TABLE t1 AS
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 MINUTE) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`field_str1` varchar(29) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`field1_str2` varchar(29) CHARACTER SET utf8 DEFAULT NULL,
|
||||
`field_date` date DEFAULT NULL,
|
||||
`field_datetime` datetime DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
SELECT
|
||||
DATE_SUB('2007-08-03', INTERVAL 1 DAY) AS field_str1,
|
||||
DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2,
|
||||
DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date,
|
||||
DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def field_str1 254 87 10 Y 0 31 33
|
||||
def field1_str2 254 87 19 Y 0 31 33
|
||||
def field_date 10 29 10 Y 128 31 63
|
||||
def field_datetime 12 29 19 Y 128 31 63
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
2007-08-02 2007-08-03 17:32:00 2007-08-02 2007-08-03 17:32:00
|
||||
SELECT
|
||||
HEX(DATE_SUB('2007-08-03', INTERVAL 1 MINUTE)) AS field_str1,
|
||||
HEX(DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE)) AS field1_str2,
|
||||
HEX(DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY)) AS field_date,
|
||||
HEX(DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE)) AS field_datetime;
|
||||
field_str1 field1_str2 field_date field_datetime
|
||||
323030372D30382D30322032333A35393A3030 323030372D30382D30332031373A33323A3030 323030372D30382D3032 323030372D30382D30332031373A33323A3030
|
||||
#
|
||||
# Bug#52159 returning time type from function and empty left join causes debug assertion
|
||||
#
|
||||
CREATE FUNCTION f1() RETURNS TIME RETURN 1;
|
||||
|
@ -724,7 +724,7 @@ utf8_general_ci utf8_general_ci
|
||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
||||
|
||||
USE `mysqltest1`;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -757,8 +757,8 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -791,7 +791,7 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
|
||||
---> Dumping mysqltest1 to ddl_i18n_koi8r.sp.mysqltest1.sql
|
||||
|
||||
@ -800,7 +800,7 @@ ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
||||
|
||||
USE `mysqltest2`;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -833,8 +833,8 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -867,7 +867,7 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
|
||||
---> Dumping mysqltest2 to ddl_i18n_koi8r.sp.mysqltest2.sql
|
||||
|
||||
@ -1742,7 +1742,7 @@ CREATE TABLE `t1` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
INSERT INTO `t1` VALUES (1),(0),(1);
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -1770,8 +1770,8 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -1799,7 +1799,7 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
|
||||
---> Dumping mysqltest1 to ddl_i18n_koi8r.triggers.mysqltest1.sql
|
||||
|
||||
@ -1821,7 +1821,7 @@ CREATE TABLE `t1` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
INSERT INTO `t1` VALUES (1),(0),(1);
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -1849,8 +1849,8 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -1878,7 +1878,7 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
|
||||
---> Dumping mysqltest2 to ddl_i18n_koi8r.triggers.mysqltest2.sql
|
||||
|
||||
@ -2486,7 +2486,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER
|
||||
USE `mysqltest1`;
|
||||
/*!50106 SET @save_time_zone= @@TIME_ZONE */ ;
|
||||
DELIMITER ;;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
|
||||
@ -2512,9 +2512,9 @@ END */ ;;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
DELIMITER ;;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
|
||||
@ -2540,7 +2540,7 @@ END */ ;;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
DELIMITER ;
|
||||
/*!50106 SET TIME_ZONE= @save_time_zone */ ;
|
||||
|
||||
@ -2553,7 +2553,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER
|
||||
USE `mysqltest2`;
|
||||
/*!50106 SET @save_time_zone= @@TIME_ZONE */ ;
|
||||
DELIMITER ;;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
|
||||
@ -2579,9 +2579,9 @@ END */ ;;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
DELIMITER ;;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
|
||||
@ -2607,7 +2607,7 @@ END */ ;;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
DELIMITER ;
|
||||
/*!50106 SET TIME_ZONE= @save_time_zone */ ;
|
||||
|
||||
|
@ -724,7 +724,7 @@ utf8_general_ci utf8_general_ci
|
||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
||||
|
||||
USE `mysqltest1`;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -757,8 +757,8 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -791,7 +791,7 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
|
||||
---> Dumping mysqltest1 to ddl_i18n_utf8sp.mysqltest1.sql
|
||||
|
||||
@ -800,7 +800,7 @@ ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 */;
|
||||
|
||||
USE `mysqltest2`;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -833,8 +833,8 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -867,7 +867,7 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
|
||||
---> Dumping mysqltest2 to ddl_i18n_utf8sp.mysqltest2.sql
|
||||
|
||||
@ -1742,7 +1742,7 @@ CREATE TABLE `t1` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
INSERT INTO `t1` VALUES (1),(0),(1);
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -1770,8 +1770,8 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -1799,7 +1799,7 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
|
||||
---> Dumping mysqltest1 to ddl_i18n_utf8triggers.mysqltest1.sql
|
||||
|
||||
@ -1821,7 +1821,7 @@ CREATE TABLE `t1` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
INSERT INTO `t1` VALUES (1),(0),(1);
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -1849,8 +1849,8 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
@ -1878,7 +1878,7 @@ DELIMITER ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;
|
||||
|
||||
---> Dumping mysqltest2 to ddl_i18n_utf8triggers.mysqltest2.sql
|
||||
|
||||
@ -2486,7 +2486,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER
|
||||
USE `mysqltest1`;
|
||||
/*!50106 SET @save_time_zone= @@TIME_ZONE */ ;
|
||||
DELIMITER ;;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
|
||||
@ -2512,9 +2512,9 @@ END */ ;;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
DELIMITER ;;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
|
||||
@ -2540,7 +2540,7 @@ END */ ;;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;;
|
||||
ALTER DATABASE mysqltest1 CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
ALTER DATABASE `mysqltest1` CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
DELIMITER ;
|
||||
/*!50106 SET TIME_ZONE= @save_time_zone */ ;
|
||||
|
||||
@ -2553,7 +2553,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER
|
||||
USE `mysqltest2`;
|
||||
/*!50106 SET @save_time_zone= @@TIME_ZONE */ ;
|
||||
DELIMITER ;;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
|
||||
@ -2579,9 +2579,9 @@ END */ ;;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
DELIMITER ;;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
|
||||
@ -2607,7 +2607,7 @@ END */ ;;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;;
|
||||
ALTER DATABASE mysqltest2 CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
ALTER DATABASE `mysqltest2` CHARACTER SET cp866 COLLATE cp866_general_ci ;;
|
||||
DELIMITER ;
|
||||
/*!50106 SET TIME_ZONE= @save_time_zone */ ;
|
||||
|
||||
|
6
mysql-test/r/file_contents.result
Normal file
6
mysql-test/r/file_contents.result
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
Checking 'INFO_SRC' and 'INFO_BIN'
|
||||
INFO_SRC: Found MySQL version number / Found BZR revision id
|
||||
INFO_BIN: Found 'Compiler ... used' line / Found 'Feature flags' line
|
||||
|
||||
End of tests
|
@ -14,3 +14,20 @@ DELETE FROM t1 ORDER BY (f1(10)) LIMIT 1;
|
||||
ERROR 42000: Incorrect number of arguments for FUNCTION test.f1; expected 0, got 1
|
||||
DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
#
|
||||
# Bug #11747102
|
||||
# 30771: LOG MORE INFO ABOUT THREADS KILL'D AND SORT ABORTED MESSAGES
|
||||
#
|
||||
# connection 1
|
||||
CREATE TABLE t1(f0 int auto_increment primary key, f1 int);
|
||||
INSERT INTO t1(f1) VALUES (0),(1),(2),(3),(4),(5);
|
||||
SET DEBUG_SYNC='filesort_start SIGNAL filesort_started WAIT_FOR filesort_killed';
|
||||
# Sending: (not reaped since connection is killed later)
|
||||
SELECT * FROM t1 ORDER BY f1 ASC, f0;
|
||||
# connection 2
|
||||
SET DEBUG_SYNC='now WAIT_FOR filesort_started';
|
||||
KILL @id;
|
||||
SET DEBUG_SYNC='now SIGNAL filesort_killed';
|
||||
# connection default
|
||||
SET DEBUG_SYNC= "RESET";
|
||||
DROP TABLE t1;
|
||||
|
@ -136,7 +136,7 @@ dayname("1962-03-03") dayname("1962-03-03")+0
|
||||
Saturday 5
|
||||
select monthname("1972-03-04"),monthname("1972-03-04")+0;
|
||||
monthname("1972-03-04") monthname("1972-03-04")+0
|
||||
March 3
|
||||
March 0
|
||||
select time_format(19980131000000,'%H|%I|%k|%l|%i|%p|%r|%S|%T');
|
||||
time_format(19980131000000,'%H|%I|%k|%l|%i|%p|%r|%S|%T')
|
||||
00|12|0|12|00|AM|12:00:00 AM|00|00:00:00
|
||||
@ -1368,3 +1368,11 @@ SELECT SUBDATE(STR_TO_DATE(NULL,0), INTERVAL 1 HOUR);
|
||||
SUBDATE(STR_TO_DATE(NULL,0), INTERVAL 1 HOUR)
|
||||
NULL
|
||||
#
|
||||
# BUG#59895 - setting storage engine to null segfaults mysqld
|
||||
#
|
||||
SELECT MONTHNAME(0), MONTHNAME(0) IS NULL, MONTHNAME(0) + 1;
|
||||
MONTHNAME(0) MONTHNAME(0) IS NULL MONTHNAME(0) + 1
|
||||
NULL 1 NULL
|
||||
SET storage_engine=NULL;
|
||||
ERROR 42000: Variable 'storage_engine' can't be set to the value of 'NULL'
|
||||
#
|
||||
|
@ -1034,6 +1034,14 @@ p
|
||||
NULL
|
||||
NULL
|
||||
drop table t1;
|
||||
#
|
||||
# Test for bug #59888 "debug assertion when attempt to create spatial index
|
||||
# on char > 31 bytes".
|
||||
#
|
||||
create table t1(a char(32) not null) engine=myisam;
|
||||
create spatial index i on t1 (a);
|
||||
ERROR 42000: A SPATIAL index may only contain a geometrical type column
|
||||
drop table t1;
|
||||
End of 5.1 tests
|
||||
CREATE TABLE t1(
|
||||
col0 BINARY NOT NULL,
|
||||
|
@ -1856,6 +1856,42 @@ ON 1 WHERE t2.f1 > 1 GROUP BY t2.f1;
|
||||
COUNT(*)
|
||||
2
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#59839: Aggregation followed by subquery yields wrong result
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
a INT,
|
||||
b INT,
|
||||
c INT,
|
||||
KEY (a, b)
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
( 1, 1, 1 ),
|
||||
( 1, 2, 2 ),
|
||||
( 1, 3, 3 ),
|
||||
( 1, 4, 6 ),
|
||||
( 1, 5, 5 ),
|
||||
( 1, 9, 13 ),
|
||||
( 2, 1, 6 ),
|
||||
( 2, 2, 7 ),
|
||||
( 2, 3, 8 );
|
||||
EXPLAIN
|
||||
SELECT a, AVG(t1.b),
|
||||
(SELECT t11.c FROM t1 t11 WHERE t11.a = t1.a AND t11.b = AVG(t1.b)) AS t11c,
|
||||
(SELECT t12.c FROM t1 t12 WHERE t12.a = t1.a AND t12.b = AVG(t1.b)) AS t12c
|
||||
FROM t1 GROUP BY a;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 index NULL a 10 NULL 9 Using index
|
||||
3 DEPENDENT SUBQUERY t12 ref a a 10 func,func 2 Using where
|
||||
2 DEPENDENT SUBQUERY t11 ref a a 10 func,func 2 Using where
|
||||
SELECT a, AVG(t1.b),
|
||||
(SELECT t11.c FROM t1 t11 WHERE t11.a = t1.a AND t11.b = AVG(t1.b)) AS t11c,
|
||||
(SELECT t12.c FROM t1 t12 WHERE t12.a = t1.a AND t12.b = AVG(t1.b)) AS t12c
|
||||
FROM t1 GROUP BY a;
|
||||
a AVG(t1.b) t11c t12c
|
||||
1 4.0000 6 6
|
||||
2 2.0000 7 7
|
||||
DROP TABLE t1;
|
||||
# End of 5.1 tests
|
||||
#
|
||||
# Bug#49771: Incorrect MIN (date) when minimum value is 0000-00-00
|
||||
|
@ -842,7 +842,7 @@ SET max_heap_table_size = 16384;
|
||||
SET @old_myisam_data_pointer_size = @@myisam_data_pointer_size;
|
||||
SET GLOBAL myisam_data_pointer_size = 2;
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
|
||||
call mtr.add_suppression("mysqld: The table '.*#sql.*' is full");
|
||||
call mtr.add_suppression("mysqld.*: The table '.*#sql.*' is full");
|
||||
INSERT IGNORE INTO t1 SELECT t1.a FROM t1,t1 t2,t1 t3,t1 t4,t1 t5,t1 t6,t1 t7;
|
||||
Got one of the listed errors
|
||||
SET GLOBAL myisam_data_pointer_size = @old_myisam_data_pointer_size;
|
||||
|
@ -680,4 +680,21 @@ Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '1'
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# BUG#57373: Multi update+InnoDB reports ER_KEY_NOT_FOUND if a
|
||||
# table is updated twice
|
||||
#
|
||||
CREATE TABLE t1(
|
||||
pk INT,
|
||||
a INT,
|
||||
PRIMARY KEY (pk)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (0,0);
|
||||
UPDATE t1 AS A, t1 AS B SET A.pk = 1, B.a = 2;
|
||||
|
||||
# Should be (1,2)
|
||||
SELECT * FROM t1;
|
||||
pk a
|
||||
1 2
|
||||
DROP TABLE t1;
|
||||
end of tests
|
||||
|
29
mysql-test/r/multi_update_innodb.result
Normal file
29
mysql-test/r/multi_update_innodb.result
Normal file
@ -0,0 +1,29 @@
|
||||
#
|
||||
# BUG#57373: Multi update+InnoDB reports ER_KEY_NOT_FOUND if a
|
||||
# table is updated twice
|
||||
#
|
||||
CREATE TABLE t1(
|
||||
pk INT,
|
||||
a INT,
|
||||
b INT,
|
||||
PRIMARY KEY (pk)
|
||||
) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (0,0,0);
|
||||
UPDATE t1 AS A, t1 AS B SET A.pk = 1, B.a = 2;
|
||||
ERROR HY000: Primary key/partition key update is not allowed since the table is updated both as 'A' and 'B'.
|
||||
SELECT * FROM t1;
|
||||
pk a b
|
||||
0 0 0
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
UPDATE v1 AS A, t1 AS B SET A.pk = 1, B.a = 2;
|
||||
ERROR HY000: Primary key/partition key update is not allowed since the table is updated both as 'A' and 'B'.
|
||||
SELECT * FROM t1;
|
||||
pk a b
|
||||
0 0 0
|
||||
UPDATE t1 AS A, t1 AS B SET A.a = 1, B.b = 2;
|
||||
# Should be (0,1,2)
|
||||
SELECT * FROM t1;
|
||||
pk a b
|
||||
0 1 2
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
12
mysql-test/r/mysqld--defaults-file.result
Normal file
12
mysql-test/r/mysqld--defaults-file.result
Normal file
@ -0,0 +1,12 @@
|
||||
Could not open required defaults file: /path/with/no/extension
|
||||
Fatal error in defaults handling. Program aborted
|
||||
Could not open required defaults file: /path/with.ext
|
||||
Fatal error in defaults handling. Program aborted
|
||||
Could not open required defaults file: MYSQL_TEST_DIR/relative/path/with.ext
|
||||
Fatal error in defaults handling. Program aborted
|
||||
Could not open required defaults file: MYSQL_TEST_DIR/relative/path/without/extension
|
||||
Fatal error in defaults handling. Program aborted
|
||||
Could not open required defaults file: MYSQL_TEST_DIR/with.ext
|
||||
Fatal error in defaults handling. Program aborted
|
||||
Could not open required defaults file: MYSQL_TEST_DIR/no_extension
|
||||
Fatal error in defaults handling. Program aborted
|
@ -4591,5 +4591,41 @@ CREATE TABLE `comment_table` (i INT COMMENT 'FIELD COMMENT') COMMENT = 'TABLE CO
|
||||
</mysqldump>
|
||||
DROP TABLE `comment_table`;
|
||||
#
|
||||
# BUG#11766310 : 59398: MYSQLDUMP 5.1 CAN'T HANDLE A DASH ("-") IN
|
||||
# DATABASE NAMES IN ALTER DATABASE
|
||||
#
|
||||
CREATE DATABASE `test-database`;
|
||||
USE `test-database`;
|
||||
CREATE TABLE `test` (`c1` VARCHAR(10)) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
CREATE TRIGGER `trig` BEFORE INSERT ON `test` FOR EACH ROW BEGIN
|
||||
END |
|
||||
ALTER DATABASE `test-database` CHARACTER SET latin1 COLLATE latin1_swedish_ci;
|
||||
ALTER DATABASE `test-database` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `test` (
|
||||
`c1` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
ALTER DATABASE `test-database` CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
|
||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||
/*!50003 SET character_set_client = latin1 */ ;
|
||||
/*!50003 SET character_set_results = latin1 */ ;
|
||||
/*!50003 SET collation_connection = latin1_swedish_ci */ ;
|
||||
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
|
||||
/*!50003 SET sql_mode = '' */ ;
|
||||
DELIMITER ;;
|
||||
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `trig` BEFORE INSERT ON `test` FOR EACH ROW BEGIN
|
||||
END */;;
|
||||
DELIMITER ;
|
||||
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||
ALTER DATABASE `test-database` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
DROP DATABASE `test-database`;
|
||||
#
|
||||
# End of 5.1 tests
|
||||
#
|
||||
|
@ -2264,3 +2264,51 @@ INSERT INTO t1 VALUES(0);
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL myisam_use_mmap=default;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# BUG#55385: UPDATE statement throws an error, but still updates
|
||||
# the table entries
|
||||
CREATE TABLE t1_part (
|
||||
partkey int,
|
||||
nokey int
|
||||
) PARTITION BY LINEAR HASH(partkey) PARTITIONS 3;
|
||||
INSERT INTO t1_part VALUES (1, 1) , (10, 10);
|
||||
CREATE VIEW v1 AS SELECT * FROM t1_part;
|
||||
|
||||
# Should be (1,1),(10,10)
|
||||
SELECT * FROM t1_part;
|
||||
partkey nokey
|
||||
1 1
|
||||
10 10
|
||||
|
||||
# Case 1
|
||||
# Update is refused because partitioning key is updated
|
||||
UPDATE t1_part AS A NATURAL JOIN t1_part B SET A.partkey = 2, B.nokey = 3;
|
||||
ERROR HY000: Primary key/partition key update is not allowed since the table is updated both as 'A' and 'B'.
|
||||
UPDATE t1_part AS A NATURAL JOIN t1_part B SET A.nokey = 2, B.partkey = 3;
|
||||
ERROR HY000: Primary key/partition key update is not allowed since the table is updated both as 'A' and 'B'.
|
||||
|
||||
# Case 2
|
||||
# Like 1, but partition accessed through a view
|
||||
UPDATE t1_part AS A NATURAL JOIN v1 as B SET A.nokey = 2 , B.partkey = 3;
|
||||
ERROR HY000: Primary key/partition key update is not allowed since the table is updated both as 'A' and 'B'.
|
||||
UPDATE v1 AS A NATURAL JOIN t1_part as B SET A.nokey = 2 , B.partkey = 3;
|
||||
ERROR HY000: Primary key/partition key update is not allowed since the table is updated both as 'A' and 'B'.
|
||||
|
||||
# Should be (1,1),(10,10)
|
||||
SELECT * FROM t1_part;
|
||||
partkey nokey
|
||||
1 1
|
||||
10 10
|
||||
|
||||
# Case 3
|
||||
# Update is accepted because partitioning key is not updated
|
||||
UPDATE t1_part AS A NATURAL JOIN t1_part B SET A.nokey = 2 , B.nokey = 3;
|
||||
|
||||
# Should be (1,3),(10,3)
|
||||
SELECT * FROM t1_part;
|
||||
partkey nokey
|
||||
1 3
|
||||
10 3
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1_part;
|
||||
|
@ -20,16 +20,16 @@ return 0;
|
||||
end $$
|
||||
show procedure code signal_proc;
|
||||
Pos Instruction
|
||||
0 stmt 131 "SIGNAL foo"
|
||||
1 stmt 131 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
||||
2 stmt 132 "RESIGNAL foo"
|
||||
3 stmt 132 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
||||
0 stmt 130 "SIGNAL foo"
|
||||
1 stmt 130 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
||||
2 stmt 131 "RESIGNAL foo"
|
||||
3 stmt 131 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
||||
drop procedure signal_proc;
|
||||
show function code signal_func;
|
||||
Pos Instruction
|
||||
0 stmt 131 "SIGNAL foo"
|
||||
1 stmt 131 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
||||
2 stmt 132 "RESIGNAL foo"
|
||||
3 stmt 132 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
||||
0 stmt 130 "SIGNAL foo"
|
||||
1 stmt 130 "SIGNAL foo SET MESSAGE_TEXT = "This i..."
|
||||
2 stmt 131 "RESIGNAL foo"
|
||||
3 stmt 131 "RESIGNAL foo SET MESSAGE_TEXT = "This..."
|
||||
4 freturn 3 0
|
||||
drop function signal_func;
|
||||
|
@ -155,11 +155,11 @@ Pos Instruction
|
||||
0 stmt 9 "drop temporary table if exists sudoku..."
|
||||
1 stmt 1 "create temporary table sudoku_work ( ..."
|
||||
2 stmt 1 "create temporary table sudoku_schedul..."
|
||||
3 stmt 89 "call sudoku_init()"
|
||||
3 stmt 88 "call sudoku_init()"
|
||||
4 jump_if_not 7(8) p_naive@0
|
||||
5 stmt 4 "update sudoku_work set cnt = 0 where ..."
|
||||
6 jump 8
|
||||
7 stmt 89 "call sudoku_count()"
|
||||
7 stmt 88 "call sudoku_count()"
|
||||
8 stmt 6 "insert into sudoku_schedule (row,col)..."
|
||||
9 set v_scounter@2 0
|
||||
10 set v_i@3 1
|
||||
|
@ -1732,3 +1732,25 @@ set @@session.autocommit=t1_min(), @@session.autocommit=t1_max(),
|
||||
drop table t1;
|
||||
drop function t1_min;
|
||||
drop function t1_max;
|
||||
#
|
||||
# Bug #59884: setting charset to 2048 crashes
|
||||
#
|
||||
set session character_set_results = 2048;
|
||||
ERROR 42000: Unknown character set: '2048'
|
||||
set session character_set_client=2048;
|
||||
ERROR 42000: Unknown character set: '2048'
|
||||
set session character_set_connection=2048;
|
||||
ERROR 42000: Unknown character set: '2048'
|
||||
set session character_set_server=2048;
|
||||
ERROR 42000: Unknown character set: '2048'
|
||||
set session collation_server=2048;
|
||||
ERROR HY000: Unknown collation: '2048'
|
||||
set session character_set_filesystem=2048;
|
||||
ERROR 42000: Unknown character set: '2048'
|
||||
set session character_set_database=2048;
|
||||
ERROR 42000: Unknown character set: '2048'
|
||||
set session collation_connection=2048;
|
||||
ERROR HY000: Unknown collation: '2048'
|
||||
set session collation_database=2048;
|
||||
ERROR HY000: Unknown collation: '2048'
|
||||
End of 5.5 tests
|
||||
|
@ -142,3 +142,27 @@ XA PREPARE 'x';
|
||||
XA PREPARE 'x';
|
||||
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the PREPARED state
|
||||
XA ROLLBACK 'x';
|
||||
#
|
||||
# Bug#59986 Assert in Diagnostics_area::set_ok_status() for XA COMMIT
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a)) engine=InnoDB;
|
||||
INSERT INTO t1 VALUES (1, 1), (2, 2);
|
||||
# Connection con1
|
||||
XA START 'a';
|
||||
UPDATE t1 SET b= 3 WHERE a=1;
|
||||
# Connection default
|
||||
XA START 'b';
|
||||
UPDATE t1 SET b=4 WHERE a=2;
|
||||
# Sending:
|
||||
UPDATE t1 SET b=5 WHERE a=1;
|
||||
# Connection con1
|
||||
UPDATE t1 SET b=6 WHERE a=2;
|
||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||
XA COMMIT 'a';
|
||||
ERROR XA102: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected
|
||||
# Connection default
|
||||
# Reaping: UPDATE t1 SET b=5 WHERE a=1
|
||||
XA END 'b';
|
||||
XA ROLLBACK 'b';
|
||||
DROP TABLE t1;
|
||||
|
118
mysql-test/suite/innodb/r/innodb_bug53756.result
Normal file
118
mysql-test/suite/innodb/r/innodb_bug53756.result
Normal file
@ -0,0 +1,118 @@
|
||||
DROP TABLE IF EXISTS bug_53756 ;
|
||||
CREATE TABLE bug_53756 (pk INT, c1 INT) ENGINE=InnoDB;
|
||||
ALTER TABLE bug_53756 ADD PRIMARY KEY (pk);
|
||||
INSERT INTO bug_53756 VALUES(1, 11), (2, 22), (3, 33), (4, 44);
|
||||
|
||||
# Select a less restrictive isolation level.
|
||||
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
COMMIT;
|
||||
|
||||
# Start a transaction in the default connection for isolation.
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
SELECT * FROM bug_53756;
|
||||
pk c1
|
||||
1 11
|
||||
2 22
|
||||
3 33
|
||||
4 44
|
||||
|
||||
# connection con1 deletes row 1
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
DELETE FROM bug_53756 WHERE pk=1;
|
||||
|
||||
# connection con2 deletes row 2
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
DELETE FROM bug_53756 WHERE pk=2;
|
||||
|
||||
# connection con3 updates row 3
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
UPDATE bug_53756 SET c1=77 WHERE pk=3;
|
||||
|
||||
# connection con4 updates row 4
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
UPDATE bug_53756 SET c1=88 WHERE pk=4;
|
||||
|
||||
# connection con5 inserts row 5
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
INSERT INTO bug_53756 VALUES(5, 55);
|
||||
|
||||
# connection con6 inserts row 6
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
INSERT INTO bug_53756 VALUES(6, 66);
|
||||
|
||||
# connection con1 commits.
|
||||
COMMIT;
|
||||
|
||||
# connection con3 commits.
|
||||
COMMIT;
|
||||
|
||||
# connection con4 rolls back.
|
||||
ROLLBACK;
|
||||
|
||||
# connection con6 rolls back.
|
||||
ROLLBACK;
|
||||
|
||||
# The connections 2 and 5 stay open.
|
||||
|
||||
# connection default selects resulting data.
|
||||
# Delete of row 1 was committed.
|
||||
# Update of row 3 was committed.
|
||||
# Due to isolation level read committed, these should be included.
|
||||
# All other changes should not be included.
|
||||
SELECT * FROM bug_53756;
|
||||
pk c1
|
||||
2 22
|
||||
3 77
|
||||
4 44
|
||||
|
||||
# connection default
|
||||
#
|
||||
# Crash server.
|
||||
START TRANSACTION;
|
||||
INSERT INTO bug_53756 VALUES (666,666);
|
||||
SET SESSION debug="+d,crash_commit_before";
|
||||
COMMIT;
|
||||
ERROR HY000: Lost connection to MySQL server during query
|
||||
|
||||
#
|
||||
# disconnect con1, con2, con3, con4, con5, con6.
|
||||
#
|
||||
# Restart server.
|
||||
|
||||
#
|
||||
# Select recovered data.
|
||||
# Delete of row 1 was committed.
|
||||
# Update of row 3 was committed.
|
||||
# These should be included.
|
||||
# All other changes should not be included.
|
||||
# Delete of row 2 and insert of row 5 should be rolled back
|
||||
SELECT * FROM bug_53756;
|
||||
pk c1
|
||||
2 22
|
||||
3 77
|
||||
4 44
|
||||
|
||||
# Clean up.
|
||||
DROP TABLE bug_53756;
|
28
mysql-test/suite/innodb/r/innodb_bug59307.result
Normal file
28
mysql-test/suite/innodb/r/innodb_bug59307.result
Normal file
@ -0,0 +1,28 @@
|
||||
CREATE TABLE t1 (
|
||||
t1_int INT,
|
||||
t1_time TIME
|
||||
) ENGINE=innodb;
|
||||
CREATE TABLE t2 (
|
||||
t2_int int PRIMARY KEY,
|
||||
t2_int2 INT
|
||||
) ENGINE=INNODB;
|
||||
INSERT INTO t2 VALUES ();
|
||||
Warnings:
|
||||
Warning 1364 Field 't2_int' doesn't have a default value
|
||||
INSERT INTO t1 VALUES ();
|
||||
SELECT *
|
||||
FROM t1 AS t1a
|
||||
WHERE NOT EXISTS
|
||||
(SELECT *
|
||||
FROM t1 AS t1b
|
||||
WHERE t1b.t1_int NOT IN
|
||||
(SELECT t2.t2_int
|
||||
FROM t2
|
||||
WHERE t1b.t1_time LIKE t1b.t1_int
|
||||
OR t1b.t1_time <> t2.t2_int2
|
||||
AND 6=7
|
||||
)
|
||||
)
|
||||
;
|
||||
t1_int t1_time
|
||||
DROP TABLE t1,t2;
|
8
mysql-test/suite/innodb/r/innodb_bug60049.result
Normal file
8
mysql-test/suite/innodb/r/innodb_bug60049.result
Normal file
@ -0,0 +1,8 @@
|
||||
CREATE TABLE t(a INT)ENGINE=InnoDB;
|
||||
RENAME TABLE t TO u;
|
||||
DROP TABLE u;
|
||||
SELECT @@innodb_fast_shutdown;
|
||||
@@innodb_fast_shutdown
|
||||
0
|
||||
Last record of ID_IND root page (9):
|
||||
1808000018050074000000000000000c5359535f464f524549474e5f434f4c53
|
1
mysql-test/suite/innodb/t/innodb_bug53756-master.opt
Normal file
1
mysql-test/suite/innodb/t/innodb_bug53756-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--skip-stack-trace --skip-core-file
|
184
mysql-test/suite/innodb/t/innodb_bug53756.test
Normal file
184
mysql-test/suite/innodb/t/innodb_bug53756.test
Normal file
@ -0,0 +1,184 @@
|
||||
# This is the test case for bug #53756. Alter table operation could
|
||||
# leave a deleted record for the temp table (later renamed to the altered
|
||||
# table) in the SYS_TABLES secondary index, we should ignore this row and
|
||||
# find the first non-deleted row for the specified table_id when load table
|
||||
# metadata in the function dict_load_table_on_id() during crash recovery.
|
||||
|
||||
#
|
||||
# innobackup needs to connect to the server. Not supported in embedded.
|
||||
--source include/not_embedded.inc
|
||||
#
|
||||
# This test case needs to crash the server. Needs a debug server.
|
||||
--source include/have_debug.inc
|
||||
#
|
||||
# Don't test this under valgrind, memory leaks will occur.
|
||||
--source include/not_valgrind.inc
|
||||
#
|
||||
# This test case needs InnoDB.
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
#
|
||||
# Precautionary clean up.
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS bug_53756 ;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# Create test data.
|
||||
#
|
||||
CREATE TABLE bug_53756 (pk INT, c1 INT) ENGINE=InnoDB;
|
||||
ALTER TABLE bug_53756 ADD PRIMARY KEY (pk);
|
||||
INSERT INTO bug_53756 VALUES(1, 11), (2, 22), (3, 33), (4, 44);
|
||||
|
||||
--echo
|
||||
--echo # Select a less restrictive isolation level.
|
||||
# Don't use user variables. They won't survive server crash.
|
||||
--let $global_isolation= `SELECT @@global.tx_isolation`
|
||||
--let $session_isolation= `SELECT @@session.tx_isolation`
|
||||
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
COMMIT;
|
||||
|
||||
--echo
|
||||
--echo # Start a transaction in the default connection for isolation.
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
SELECT * FROM bug_53756;
|
||||
|
||||
--echo
|
||||
--echo # connection con1 deletes row 1
|
||||
--connect (con1,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
DELETE FROM bug_53756 WHERE pk=1;
|
||||
|
||||
--echo
|
||||
--echo # connection con2 deletes row 2
|
||||
--connect (con2,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
DELETE FROM bug_53756 WHERE pk=2;
|
||||
|
||||
--echo
|
||||
--echo # connection con3 updates row 3
|
||||
--connect (con3,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
UPDATE bug_53756 SET c1=77 WHERE pk=3;
|
||||
|
||||
--echo
|
||||
--echo # connection con4 updates row 4
|
||||
--connect (con4,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
UPDATE bug_53756 SET c1=88 WHERE pk=4;
|
||||
|
||||
--echo
|
||||
--echo # connection con5 inserts row 5
|
||||
--connect (con5,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
INSERT INTO bug_53756 VALUES(5, 55);
|
||||
|
||||
--echo
|
||||
--echo # connection con6 inserts row 6
|
||||
--connect (con6,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
INSERT INTO bug_53756 VALUES(6, 66);
|
||||
|
||||
--echo
|
||||
--echo # connection con1 commits.
|
||||
--connection con1
|
||||
COMMIT;
|
||||
|
||||
--echo
|
||||
--echo # connection con3 commits.
|
||||
--connection con3
|
||||
COMMIT;
|
||||
|
||||
--echo
|
||||
--echo # connection con4 rolls back.
|
||||
--connection con4
|
||||
ROLLBACK;
|
||||
|
||||
--echo
|
||||
--echo # connection con6 rolls back.
|
||||
--connection con6
|
||||
ROLLBACK;
|
||||
|
||||
--echo
|
||||
--echo # The connections 2 and 5 stay open.
|
||||
|
||||
--echo
|
||||
--echo # connection default selects resulting data.
|
||||
--echo # Delete of row 1 was committed.
|
||||
--echo # Update of row 3 was committed.
|
||||
--echo # Due to isolation level read committed, these should be included.
|
||||
--echo # All other changes should not be included.
|
||||
--connection default
|
||||
SELECT * FROM bug_53756;
|
||||
|
||||
--echo
|
||||
--echo # connection default
|
||||
--connection default
|
||||
--echo #
|
||||
--echo # Crash server.
|
||||
#
|
||||
# Write file to make mysql-test-run.pl expect the "crash", but don't start
|
||||
# it until it's told to
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
#
|
||||
START TRANSACTION;
|
||||
INSERT INTO bug_53756 VALUES (666,666);
|
||||
#
|
||||
# Request a crash on next execution of commit.
|
||||
SET SESSION debug="+d,crash_commit_before";
|
||||
#
|
||||
# Execute the statement that causes the crash.
|
||||
--error 2013
|
||||
COMMIT;
|
||||
--echo
|
||||
--echo #
|
||||
--echo # disconnect con1, con2, con3, con4, con5, con6.
|
||||
--disconnect con1
|
||||
--disconnect con2
|
||||
--disconnect con3
|
||||
--disconnect con4
|
||||
--disconnect con5
|
||||
--disconnect con6
|
||||
--echo #
|
||||
--echo # Restart server.
|
||||
#
|
||||
# Write file to make mysql-test-run.pl start up the server again
|
||||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
#
|
||||
# Turn on reconnect
|
||||
--enable_reconnect
|
||||
#
|
||||
# Call script that will poll the server waiting for it to be back online again
|
||||
--source include/wait_until_connected_again.inc
|
||||
#
|
||||
# Turn off reconnect again
|
||||
--disable_reconnect
|
||||
--echo
|
||||
|
||||
--echo #
|
||||
--echo # Select recovered data.
|
||||
--echo # Delete of row 1 was committed.
|
||||
--echo # Update of row 3 was committed.
|
||||
--echo # These should be included.
|
||||
--echo # All other changes should not be included.
|
||||
--echo # Delete of row 2 and insert of row 5 should be rolled back
|
||||
SELECT * FROM bug_53756;
|
||||
|
||||
--echo
|
||||
--echo # Clean up.
|
||||
DROP TABLE bug_53756;
|
||||
|
||||
--disable_query_log
|
||||
eval SET GLOBAL tx_isolation= '$global_isolation';
|
||||
eval SET SESSION tx_isolation= '$session_isolation';
|
||||
--enable_query_log
|
||||
|
32
mysql-test/suite/innodb/t/innodb_bug59307.test
Normal file
32
mysql-test/suite/innodb/t/innodb_bug59307.test
Normal file
@ -0,0 +1,32 @@
|
||||
-- source include/have_innodb.inc
|
||||
# Bug #59307 uninitialized value in rw_lock_set_writer_id_and_recursion_flag()
|
||||
# when Valgrind instrumentation (UNIV_DEBUG_VALGRIND) is not enabled
|
||||
|
||||
CREATE TABLE t1 (
|
||||
t1_int INT,
|
||||
t1_time TIME
|
||||
) ENGINE=innodb;
|
||||
|
||||
CREATE TABLE t2 (
|
||||
t2_int int PRIMARY KEY,
|
||||
t2_int2 INT
|
||||
) ENGINE=INNODB;
|
||||
|
||||
INSERT INTO t2 VALUES ();
|
||||
INSERT INTO t1 VALUES ();
|
||||
|
||||
SELECT *
|
||||
FROM t1 AS t1a
|
||||
WHERE NOT EXISTS
|
||||
(SELECT *
|
||||
FROM t1 AS t1b
|
||||
WHERE t1b.t1_int NOT IN
|
||||
(SELECT t2.t2_int
|
||||
FROM t2
|
||||
WHERE t1b.t1_time LIKE t1b.t1_int
|
||||
OR t1b.t1_time <> t2.t2_int2
|
||||
AND 6=7
|
||||
)
|
||||
)
|
||||
;
|
||||
DROP TABLE t1,t2;
|
1
mysql-test/suite/innodb/t/innodb_bug60049-master.opt
Normal file
1
mysql-test/suite/innodb/t/innodb_bug60049-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--innodb_fast_shutdown=0
|
39
mysql-test/suite/innodb/t/innodb_bug60049.test
Normal file
39
mysql-test/suite/innodb/t/innodb_bug60049.test
Normal file
@ -0,0 +1,39 @@
|
||||
# Bug #60049 Verify that purge leaves no garbage in unique secondary indexes
|
||||
# This test requires a fresh server start-up and a slow shutdown.
|
||||
# This was a suspected bug (not a bug).
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
CREATE TABLE t(a INT)ENGINE=InnoDB;
|
||||
RENAME TABLE t TO u;
|
||||
DROP TABLE u;
|
||||
SELECT @@innodb_fast_shutdown;
|
||||
let $MYSQLD_DATADIR=`select @@datadir`;
|
||||
|
||||
# Shut down the server
|
||||
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- shutdown_server 30
|
||||
-- source include/wait_until_disconnected.inc
|
||||
|
||||
# Check the tail of ID_IND (SYS_TABLES.ID)
|
||||
let IBDATA1=$MYSQLD_DATADIR/ibdata1;
|
||||
perl;
|
||||
my $file = $ENV{'IBDATA1'};
|
||||
open(FILE, "<$file") || die "Unable to open $file";
|
||||
# Read DICT_HDR_TABLE_IDS, the root page number of ID_IND (SYS_TABLES.ID).
|
||||
seek(FILE, 7*16384+38+36, 0) || die "Unable to seek $file";
|
||||
die unless read(FILE, $_, 4) == 4;
|
||||
my $sys_tables_id_root = unpack("N", $_);
|
||||
print "Last record of ID_IND root page ($sys_tables_id_root):\n";
|
||||
# This should be the last record in ID_IND. Dump it in hexadecimal.
|
||||
seek(FILE, $sys_tables_id_root*16384 + 152, 0) || die "Unable to seek $file";
|
||||
read(FILE, $_, 32) || die "Unable to read $file";
|
||||
close(FILE);
|
||||
print unpack("H*", $_), "\n";
|
||||
EOF
|
||||
|
||||
# Restart the server.
|
||||
-- exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- enable_reconnect
|
||||
-- source include/wait_until_connected_again.inc
|
@ -118,11 +118,29 @@ SELECT * FROM ```t'\"_str` WHERE c1 = '4' FOR UPDATE;
|
||||
# executes before some of them, resulting in less than expected number
|
||||
# of rows being selected from innodb_locks. If there is a bug and there
|
||||
# are no 14 rows in innodb_locks then this test will fail with timeout.
|
||||
let $count = 14;
|
||||
let $table = INFORMATION_SCHEMA.INNODB_LOCKS;
|
||||
-- source include/wait_until_rows_count.inc
|
||||
# the above enables the query log, re-disable it
|
||||
-- disable_query_log
|
||||
# Notice that if we query INNODB_LOCKS more often than once per 0.1 sec
|
||||
# then its contents will never change because the cache from which it is
|
||||
# filled is updated only if it has not been read for 0.1 seconds. See
|
||||
# CACHE_MIN_IDLE_TIME_US in trx/trx0i_s.c.
|
||||
let $cnt=10;
|
||||
while ($cnt)
|
||||
{
|
||||
let $success=`SELECT COUNT(*) = 14 FROM INFORMATION_SCHEMA.INNODB_LOCKS`;
|
||||
if ($success)
|
||||
{
|
||||
let $cnt=0;
|
||||
}
|
||||
if (!$success)
|
||||
{
|
||||
real_sleep 0.2;
|
||||
dec $cnt;
|
||||
}
|
||||
}
|
||||
if (!$success)
|
||||
{
|
||||
-- echo Timeout waiting for rows in INNODB_LOCKS to appear
|
||||
}
|
||||
|
||||
SELECT lock_mode, lock_type, lock_table, lock_index, lock_rec, lock_data
|
||||
FROM INFORMATION_SCHEMA.INNODB_LOCKS ORDER BY lock_data;
|
||||
|
||||
|
@ -3,13 +3,6 @@ include/master-slave.inc
|
||||
CREATE TABLE t1 ( a int ) ENGINE=InnoDB;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t1 optimize error Lock wait timeout exceeded; try restarting transaction
|
||||
test.t1 optimize status Operation failed
|
||||
Warnings:
|
||||
Error 1205 Lock wait timeout exceeded; try restarting transaction
|
||||
OPTIMIZE TABLE non_existing;
|
||||
Table Op Msg_type Msg_text
|
||||
test.non_existing optimize Error Table 'test.non_existing' doesn't exist
|
||||
|
@ -27,15 +27,26 @@ a
|
||||
2001
|
||||
set global read_only=0;
|
||||
BEGIN;
|
||||
BEGIN;
|
||||
select @@read_only;
|
||||
@@read_only
|
||||
0
|
||||
set global read_only=1;
|
||||
*** On SUPER USER connection ***
|
||||
insert into t1 values(1002);
|
||||
insert into t2 values(2002);
|
||||
BEGIN;
|
||||
*** On regular USER connection ***
|
||||
insert into t1 values(1003);
|
||||
insert into t2 values(2003);
|
||||
set global read_only=1;
|
||||
COMMIT;
|
||||
COMMIT;
|
||||
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
|
||||
insert into t2 values(2003);
|
||||
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
|
||||
*** SUPER USER COMMIT (must succeed) ***
|
||||
COMMIT;
|
||||
*** regular USER COMMIT (must succeed - nothing to commit) ***
|
||||
COMMIT;
|
||||
select @@read_only;
|
||||
@@read_only
|
||||
1
|
||||
set global read_only=0;
|
||||
insert into t1 values(1004);
|
||||
insert into t2 values(2004);
|
||||
@ -48,7 +59,6 @@ select * from t2;
|
||||
a
|
||||
2001
|
||||
2002
|
||||
2003
|
||||
2004
|
||||
select * from t1;
|
||||
a
|
||||
@ -59,7 +69,6 @@ select * from t2;
|
||||
a
|
||||
2001
|
||||
2002
|
||||
2003
|
||||
2004
|
||||
set global read_only=1;
|
||||
select @@read_only;
|
||||
@ -87,7 +96,6 @@ select * from t2;
|
||||
a
|
||||
2001
|
||||
2002
|
||||
2003
|
||||
2004
|
||||
2005
|
||||
select * from t1;
|
||||
@ -100,7 +108,6 @@ select * from t2;
|
||||
a
|
||||
2001
|
||||
2002
|
||||
2003
|
||||
2004
|
||||
2005
|
||||
insert into t1 values(1006);
|
||||
|
@ -10,8 +10,6 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
rpl_failed_optimize : WL#4284: Can't optimize table used by a pending transaction (there is metadata lock on the table).
|
||||
rpl_read_only : WL#4284: Setting Read only won't succeed until all metadata locks are released.
|
||||
rpl_row_create_table : Bug#51574 2010-02-27 andrei failed different way than earlier with bug#45576
|
||||
rpl_spec_variables : BUG#47661 2009-10-27 jasonh rpl_spec_variables fails on PB2 hpux
|
||||
rpl_get_master_version_and_clock : Bug#59178 Jan 05 2011 joro Valgrind warnings rpl_get_master_version_and_clock
|
||||
|
@ -1 +0,0 @@
|
||||
--loose-innodb-lock-wait-timeout=1
|
@ -41,30 +41,39 @@ set global read_only=0;
|
||||
|
||||
connection master1;
|
||||
BEGIN;
|
||||
|
||||
connection master2;
|
||||
BEGIN;
|
||||
|
||||
connection master;
|
||||
select @@read_only;
|
||||
set global read_only=1;
|
||||
|
||||
connection master1;
|
||||
-- echo *** On SUPER USER connection ***
|
||||
insert into t1 values(1002);
|
||||
--disable_warnings
|
||||
insert into t2 values(2002);
|
||||
--enable_warnings
|
||||
|
||||
connection master2;
|
||||
BEGIN;
|
||||
-- echo *** On regular USER connection ***
|
||||
--error ER_OPTION_PREVENTS_STATEMENT
|
||||
insert into t1 values(1003);
|
||||
--disable_warnings
|
||||
--error ER_OPTION_PREVENTS_STATEMENT
|
||||
insert into t2 values(2003);
|
||||
--enable_warnings
|
||||
|
||||
connection master;
|
||||
set global read_only=1;
|
||||
|
||||
connection master1;
|
||||
## works even with read_only=1, because master1 is root
|
||||
-- echo *** SUPER USER COMMIT (must succeed) ***
|
||||
COMMIT;
|
||||
|
||||
connection master2;
|
||||
--error ER_OPTION_PREVENTS_STATEMENT
|
||||
-- echo *** regular USER COMMIT (must succeed - nothing to commit) ***
|
||||
COMMIT;
|
||||
|
||||
connection master;
|
||||
select @@read_only;
|
||||
set global read_only=0;
|
||||
|
||||
connection master1;
|
||||
|
@ -13,6 +13,7 @@
|
||||
--source include/have_debug.inc
|
||||
--source include/master-slave.inc
|
||||
--source include/not_embedded.inc
|
||||
--source include/not_var_link.inc
|
||||
|
||||
##########################################################################
|
||||
# Loading data
|
||||
|
@ -11,8 +11,10 @@ There should be *no* long test name listed below:
|
||||
select variable_name as `There should be *no* variables listed below:` from t2
|
||||
left join t1 on variable_name=test_name where test_name is null;
|
||||
There should be *no* variables listed below:
|
||||
INNODB_ROLLBACK_SEGMENTS
|
||||
INNODB_STATS_METHOD
|
||||
INNODB_FILE_FORMAT_MAX
|
||||
INNODB_ROLLBACK_SEGMENTS
|
||||
INNODB_STATS_METHOD
|
||||
INNODB_FILE_FORMAT_MAX
|
||||
drop table t1;
|
||||
|
@ -1144,3 +1144,18 @@ INSERT INTO t1 VALUES (1, 1), (2, 2);
|
||||
ALTER TABLE t1 CHANGE a id INT;
|
||||
--disable_info
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11754461 CANNOT ALTER TABLE WHEN KEY PREFIX TOO LONG
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS db1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE DATABASE db1 CHARACTER SET utf8;
|
||||
CREATE TABLE db1.t1 (bar TINYTEXT, KEY (bar(100)));
|
||||
ALTER TABLE db1.t1 ADD baz INT;
|
||||
|
||||
DROP DATABASE db1;
|
||||
|
@ -72,3 +72,13 @@ select a from t1 where a like "abcdefgh
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
# Bug #48053 String::c_ptr has a race and/or does an invalid
|
||||
# memory reference
|
||||
# (triggered by Valgrind tests)
|
||||
# (see also ctype_eucjpms.test, ctype_cp1250.test, ctype_cp1251.test)
|
||||
#
|
||||
--error 1649
|
||||
set global LC_MESSAGES=convert((@@global.log_bin_trust_function_creators)
|
||||
using cp1250);
|
||||
|
@ -65,6 +65,16 @@ DROP TABLE t1;
|
||||
|
||||
--source include/ctype_8bit.inc
|
||||
|
||||
#
|
||||
# Bug #48053 String::c_ptr has a race and/or does an invalid
|
||||
# memory reference
|
||||
# (triggered by Valgrind tests)
|
||||
# (see also ctype_eucjpms.test, ctype_cp1250.test, ctype_cp1251.test)
|
||||
#
|
||||
--error 1649
|
||||
set global LC_TIME_NAMES=convert((-8388608) using cp1251);
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.1 tests
|
||||
--echo #
|
||||
@ -75,6 +85,16 @@ DROP TABLE t1;
|
||||
|
||||
--source include/ctype_numconv.inc
|
||||
|
||||
--echo #
|
||||
--echo # Bug#60101 COALESCE with cp1251 tables causes [Err] 1267 - Illegal mix of collations
|
||||
--echo #
|
||||
CREATE TABLE t1 (test1 INT, test2 VARCHAR(255));
|
||||
SHOW CREATE TABLE t1;
|
||||
SELECT COALESCE(IF(test1=1, 1, NULL), test2) FROM t1;
|
||||
SELECT COALESCE(IF(test1=1, NULL, 1), test2) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
@ -382,6 +382,16 @@ select hex(convert(_eucjpms 0xA5FE41 using ucs2));
|
||||
select hex(convert(_eucjpms 0x8FABF841 using ucs2));
|
||||
|
||||
|
||||
#
|
||||
# Bug #48053 String::c_ptr has a race and/or does an invalid
|
||||
# memory reference
|
||||
# (triggered by Valgrind tests)
|
||||
# (see also ctype_eucjpms.test, ctype_cp1250.test, ctype_cp1251.test)
|
||||
#
|
||||
--error 1649
|
||||
set global LC_TIME_NAMES=convert((convert((0x63) using eucjpms)) using utf8);
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Start of 5.5 tests
|
||||
--echo #
|
||||
|
56
mysql-test/t/file_contents.test
Normal file
56
mysql-test/t/file_contents.test
Normal file
@ -0,0 +1,56 @@
|
||||
#
|
||||
# Testing files that were built to be packaged, both for existence and for contents
|
||||
#
|
||||
|
||||
#
|
||||
# Bug #42969: Create MANIFEST files
|
||||
#
|
||||
# Use a Perl script to verify that files "docs/INFO_BIN" and "docs/INFO_SRC" do exist
|
||||
# and have the expected contents.
|
||||
|
||||
--perl
|
||||
print "\nChecking 'INFO_SRC' and 'INFO_BIN'\n";
|
||||
$dir_docs = $ENV{'MYSQL_BINDIR'};
|
||||
if($dir_docs =~ m|/usr/|) {
|
||||
# RPM package
|
||||
$dir_docs =~ s|/lib|/share/doc|;
|
||||
if(-d "$dir_docs/packages/MySQL-server") {
|
||||
# SuSE
|
||||
$dir_docs = "$dir_docs/packages/MySQL-server";
|
||||
} else {
|
||||
# RedHat: version number in directory name
|
||||
$dir_docs = glob "$dir_docs/MySQL-server*";
|
||||
}
|
||||
} else {
|
||||
# tar.gz package, Windows, or developer work (in BZR)
|
||||
$dir_docs =~ s|/lib||;
|
||||
if(-d "$dir_docs/docs") {
|
||||
$dir_docs = "$dir_docs/docs"; # package
|
||||
} else {
|
||||
$dir_docs = "$dir_docs/Docs"; # development tree
|
||||
}
|
||||
}
|
||||
$found_version = "No line 'MySQL source #.#.#'";
|
||||
$found_revision = "No line 'revision-id: .....'";
|
||||
open(I_SRC,"<","$dir_docs/INFO_SRC") or print "Cannot open 'INFO_SRC' in '$dir_docs'\n";
|
||||
while(defined ($line = <I_SRC>)) {
|
||||
if ($line =~ m|^MySQL source \d\.\d\.\d+|) {$found_version = "Found MySQL version number";}
|
||||
if ($line =~ m|^revision-id: .*@.*-2\d{13}-\w+$|) {$found_revision = "Found BZR revision id";}
|
||||
}
|
||||
close I_SRC;
|
||||
print "INFO_SRC: $found_version / $found_revision\n";
|
||||
$found_compiler = "No line about compiler information";
|
||||
$found_features = "No line 'Feature flags'";
|
||||
open(I_BIN,"<","$dir_docs/INFO_BIN") or print "Cannot open 'INFO_BIN' in '$dir_docs'\n";
|
||||
while(defined ($line = <I_BIN>)) {
|
||||
# "generator" on Windows, "flags" on Unix:
|
||||
if (($line =~ m| Compiler / generator used: |) ||
|
||||
($line =~ m| Compiler flags used |)) {$found_compiler = "Found 'Compiler ... used' line";}
|
||||
if ($line =~ m| Feature flags used:|) {$found_features = "Found 'Feature flags' line";}
|
||||
}
|
||||
close I_BIN;
|
||||
print "INFO_BIN: $found_compiler / $found_features\n";
|
||||
EOF
|
||||
|
||||
--echo
|
||||
--echo End of tests
|
@ -1,4 +1,6 @@
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/count_sessions.inc
|
||||
|
||||
SET @old_debug= @@session.debug;
|
||||
|
||||
@ -21,3 +23,37 @@ DELETE FROM t1 ORDER BY (f1(10)) LIMIT 1;
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #11747102
|
||||
--echo # 30771: LOG MORE INFO ABOUT THREADS KILL'D AND SORT ABORTED MESSAGES
|
||||
--echo #
|
||||
|
||||
connect (con1, localhost, root);
|
||||
connect (con2, localhost, root);
|
||||
|
||||
--echo # connection 1
|
||||
connection con1;
|
||||
CREATE TABLE t1(f0 int auto_increment primary key, f1 int);
|
||||
INSERT INTO t1(f1) VALUES (0),(1),(2),(3),(4),(5);
|
||||
|
||||
let $ID= `SELECT @id := CONNECTION_ID()`;
|
||||
|
||||
SET DEBUG_SYNC='filesort_start SIGNAL filesort_started WAIT_FOR filesort_killed';
|
||||
--echo # Sending: (not reaped since connection is killed later)
|
||||
--send SELECT * FROM t1 ORDER BY f1 ASC, f0
|
||||
|
||||
--echo # connection 2
|
||||
connection con2;
|
||||
let $ignore= `SELECT @id := $ID`;
|
||||
SET DEBUG_SYNC='now WAIT_FOR filesort_started';
|
||||
KILL @id;
|
||||
SET DEBUG_SYNC='now SIGNAL filesort_killed';
|
||||
|
||||
--echo # connection default
|
||||
connection default;
|
||||
disconnect con1;
|
||||
disconnect con2;
|
||||
--source include/wait_until_count_sessions.inc
|
||||
SET DEBUG_SYNC= "RESET";
|
||||
DROP TABLE t1;
|
||||
|
@ -881,4 +881,11 @@ SELECT WEEK(STR_TO_DATE(NULL,0));
|
||||
SELECT SUBDATE(STR_TO_DATE(NULL,0), INTERVAL 1 HOUR);
|
||||
|
||||
--echo #
|
||||
--echo # BUG#59895 - setting storage engine to null segfaults mysqld
|
||||
--echo #
|
||||
SELECT MONTHNAME(0), MONTHNAME(0) IS NULL, MONTHNAME(0) + 1;
|
||||
--error ER_WRONG_VALUE_FOR_VAR
|
||||
SET storage_engine=NULL;
|
||||
|
||||
--echo #
|
||||
|
||||
|
@ -757,6 +757,17 @@ insert into t1 values (geomfromtext("point(1 0)"));
|
||||
select * from (select polygon(t1.a) as p from t1 order by t1.a) d;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Test for bug #59888 "debug assertion when attempt to create spatial index
|
||||
--echo # on char > 31 bytes".
|
||||
--echo #
|
||||
create table t1(a char(32) not null) engine=myisam;
|
||||
--error ER_SPATIAL_MUST_HAVE_GEOM_COL
|
||||
create spatial index i on t1 (a);
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
#
|
||||
|
@ -1248,6 +1248,43 @@ ON 1 WHERE t2.f1 > 1 GROUP BY t2.f1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#59839: Aggregation followed by subquery yields wrong result
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (
|
||||
a INT,
|
||||
b INT,
|
||||
c INT,
|
||||
KEY (a, b)
|
||||
);
|
||||
|
||||
INSERT INTO t1 VALUES
|
||||
( 1, 1, 1 ),
|
||||
( 1, 2, 2 ),
|
||||
( 1, 3, 3 ),
|
||||
( 1, 4, 6 ),
|
||||
( 1, 5, 5 ),
|
||||
( 1, 9, 13 ),
|
||||
|
||||
( 2, 1, 6 ),
|
||||
( 2, 2, 7 ),
|
||||
( 2, 3, 8 );
|
||||
|
||||
EXPLAIN
|
||||
SELECT a, AVG(t1.b),
|
||||
(SELECT t11.c FROM t1 t11 WHERE t11.a = t1.a AND t11.b = AVG(t1.b)) AS t11c,
|
||||
(SELECT t12.c FROM t1 t12 WHERE t12.a = t1.a AND t12.b = AVG(t1.b)) AS t12c
|
||||
FROM t1 GROUP BY a;
|
||||
|
||||
SELECT a, AVG(t1.b),
|
||||
(SELECT t11.c FROM t1 t11 WHERE t11.a = t1.a AND t11.b = AVG(t1.b)) AS t11c,
|
||||
(SELECT t12.c FROM t1 t12 WHERE t12.a = t1.a AND t12.b = AVG(t1.b)) AS t12c
|
||||
FROM t1 GROUP BY a;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo # End of 5.1 tests
|
||||
|
||||
--echo #
|
||||
|
@ -407,7 +407,7 @@ SET GLOBAL myisam_data_pointer_size = 2;
|
||||
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
|
||||
|
||||
call mtr.add_suppression("mysqld: The table '.*#sql.*' is full");
|
||||
call mtr.add_suppression("mysqld.*: The table '.*#sql.*' is full");
|
||||
--error ER_RECORD_FILE_FULL,ER_RECORD_FILE_FULL
|
||||
INSERT IGNORE INTO t1 SELECT t1.a FROM t1,t1 t2,t1 t3,t1 t4,t1 t5,t1 t6,t1 t7;
|
||||
|
||||
|
@ -683,4 +683,24 @@ UPDATE (SELECT 1 FROM t1 WHERE f1 = (SELECT f1() FROM t1)) x, t1 SET f1 = 1;
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # BUG#57373: Multi update+InnoDB reports ER_KEY_NOT_FOUND if a
|
||||
--echo # table is updated twice
|
||||
--echo #
|
||||
|
||||
# Results differ between storage engines.
|
||||
# See multi_update_innodb.test for the InnoDB variant of this test
|
||||
CREATE TABLE t1(
|
||||
pk INT,
|
||||
a INT,
|
||||
PRIMARY KEY (pk)
|
||||
) ENGINE=MyISAM;
|
||||
|
||||
INSERT INTO t1 VALUES (0,0);
|
||||
UPDATE t1 AS A, t1 AS B SET A.pk = 1, B.a = 2;
|
||||
--echo
|
||||
--echo # Should be (1,2)
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo end of tests
|
||||
|
33
mysql-test/t/multi_update_innodb.test
Normal file
33
mysql-test/t/multi_update_innodb.test
Normal file
@ -0,0 +1,33 @@
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--echo #
|
||||
--echo # BUG#57373: Multi update+InnoDB reports ER_KEY_NOT_FOUND if a
|
||||
--echo # table is updated twice
|
||||
--echo #
|
||||
|
||||
# Results differ between storage engines.
|
||||
# See multi_update.test for the MyISAM variant of this test
|
||||
CREATE TABLE t1(
|
||||
pk INT,
|
||||
a INT,
|
||||
b INT,
|
||||
PRIMARY KEY (pk)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
INSERT INTO t1 VALUES (0,0,0);
|
||||
--error ER_MULTI_UPDATE_KEY_CONFLICT
|
||||
UPDATE t1 AS A, t1 AS B SET A.pk = 1, B.a = 2;
|
||||
SELECT * FROM t1;
|
||||
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
--error ER_MULTI_UPDATE_KEY_CONFLICT
|
||||
UPDATE v1 AS A, t1 AS B SET A.pk = 1, B.a = 2;
|
||||
SELECT * FROM t1;
|
||||
|
||||
UPDATE t1 AS A, t1 AS B SET A.a = 1, B.b = 2;
|
||||
--echo # Should be (0,1,2)
|
||||
SELECT * FROM t1;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
47
mysql-test/t/mysqld--defaults-file.test
Normal file
47
mysql-test/t/mysqld--defaults-file.test
Normal file
@ -0,0 +1,47 @@
|
||||
# BUG#58455
|
||||
# Starting mysqld with defaults file without extension cause
|
||||
# segmentation fault
|
||||
|
||||
source include/not_embedded.inc;
|
||||
source include/not_windows.inc;
|
||||
|
||||
# We need to use a plain "mysqld" without any other options to trigger
|
||||
# the bug. In particular, it seems that passing --bootstrap does not
|
||||
# trigger the bug. To do that, we extract the "command name" from the
|
||||
# MYSQLD_BOOTSTRAP_CMD variable and store that in a file, which we
|
||||
# then load into the test case.
|
||||
|
||||
perl;
|
||||
my ($mysqld)= split " ", $ENV{MYSQLD_BOOTSTRAP_CMD};
|
||||
open(FILE, ">", "$ENV{MYSQL_TMP_DIR}/mysqld.inc") or die;
|
||||
print FILE "let \$MYSQLD= $mysqld;\n";
|
||||
close FILE;
|
||||
EOF
|
||||
|
||||
source $MYSQL_TMP_DIR/mysqld.inc;
|
||||
|
||||
# All these tests refer to configuration files that do not exist
|
||||
|
||||
--error 1
|
||||
exec $MYSQLD --defaults-file=/path/with/no/extension --print-defaults 2>&1;
|
||||
|
||||
--error 1
|
||||
exec $MYSQLD --defaults-file=/path/with.ext --print-defaults 2>&1;
|
||||
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
--error 1
|
||||
exec $MYSQLD --defaults-file=relative/path/with.ext --print-defaults 2>&1;
|
||||
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
--error 1
|
||||
exec $MYSQLD --defaults-file=relative/path/without/extension --print-defaults 2>&1;
|
||||
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
--error 1
|
||||
exec $MYSQLD --defaults-file=with.ext --print-defaults 2>&1;
|
||||
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
--error 1
|
||||
exec $MYSQLD --defaults-file=no_extension --print-defaults 2>&1;
|
||||
|
||||
remove_file $MYSQL_TMP_DIR/mysqld.inc;
|
@ -2178,6 +2178,27 @@ CREATE TABLE `comment_table` (i INT COMMENT 'FIELD COMMENT') COMMENT = 'TABLE CO
|
||||
--exec $MYSQL_DUMP --compact --skip-create --xml test
|
||||
DROP TABLE `comment_table`;
|
||||
|
||||
--echo #
|
||||
--echo # BUG#11766310 : 59398: MYSQLDUMP 5.1 CAN'T HANDLE A DASH ("-") IN
|
||||
--echo # DATABASE NAMES IN ALTER DATABASE
|
||||
--echo #
|
||||
|
||||
CREATE DATABASE `test-database`;
|
||||
USE `test-database`;
|
||||
CREATE TABLE `test` (`c1` VARCHAR(10)) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
|
||||
DELIMITER |;
|
||||
CREATE TRIGGER `trig` BEFORE INSERT ON `test` FOR EACH ROW BEGIN
|
||||
END |
|
||||
DELIMITER ;|
|
||||
|
||||
ALTER DATABASE `test-database` CHARACTER SET latin1 COLLATE latin1_swedish_ci;
|
||||
ALTER DATABASE `test-database` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
||||
|
||||
--exec $MYSQL_DUMP --quote-names --compact test-database
|
||||
|
||||
DROP DATABASE `test-database`;
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.1 tests
|
||||
--echo #
|
||||
|
@ -2267,3 +2267,53 @@ DROP TABLE t1;
|
||||
SET GLOBAL myisam_use_mmap=default;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
--echo #
|
||||
--echo # BUG#55385: UPDATE statement throws an error, but still updates
|
||||
--echo # the table entries
|
||||
|
||||
CREATE TABLE t1_part (
|
||||
partkey int,
|
||||
nokey int
|
||||
) PARTITION BY LINEAR HASH(partkey) PARTITIONS 3;
|
||||
|
||||
INSERT INTO t1_part VALUES (1, 1) , (10, 10);
|
||||
CREATE VIEW v1 AS SELECT * FROM t1_part;
|
||||
|
||||
--echo
|
||||
--echo # Should be (1,1),(10,10)
|
||||
SELECT * FROM t1_part;
|
||||
|
||||
--echo
|
||||
--echo # Case 1
|
||||
--echo # Update is refused because partitioning key is updated
|
||||
--error ER_MULTI_UPDATE_KEY_CONFLICT
|
||||
UPDATE t1_part AS A NATURAL JOIN t1_part B SET A.partkey = 2, B.nokey = 3;
|
||||
--error ER_MULTI_UPDATE_KEY_CONFLICT
|
||||
UPDATE t1_part AS A NATURAL JOIN t1_part B SET A.nokey = 2, B.partkey = 3;
|
||||
|
||||
--echo
|
||||
--echo # Case 2
|
||||
--echo # Like 1, but partition accessed through a view
|
||||
--error ER_MULTI_UPDATE_KEY_CONFLICT
|
||||
UPDATE t1_part AS A NATURAL JOIN v1 as B SET A.nokey = 2 , B.partkey = 3;
|
||||
--error ER_MULTI_UPDATE_KEY_CONFLICT
|
||||
UPDATE v1 AS A NATURAL JOIN t1_part as B SET A.nokey = 2 , B.partkey = 3;
|
||||
|
||||
--echo
|
||||
--echo # Should be (1,1),(10,10)
|
||||
SELECT * FROM t1_part;
|
||||
|
||||
--echo
|
||||
--echo # Case 3
|
||||
--echo # Update is accepted because partitioning key is not updated
|
||||
UPDATE t1_part AS A NATURAL JOIN t1_part B SET A.nokey = 2 , B.nokey = 3;
|
||||
|
||||
--echo
|
||||
--echo # Should be (1,3),(10,3)
|
||||
SELECT * FROM t1_part;
|
||||
|
||||
--echo
|
||||
# Cleanup
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1_part;
|
||||
|
@ -1476,3 +1476,29 @@ drop function t1_max;
|
||||
|
||||
|
||||
###########################################################################
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug #59884: setting charset to 2048 crashes
|
||||
--echo #
|
||||
|
||||
--error ER_UNKNOWN_CHARACTER_SET
|
||||
set session character_set_results = 2048;
|
||||
--error ER_UNKNOWN_CHARACTER_SET
|
||||
set session character_set_client=2048;
|
||||
--error ER_UNKNOWN_CHARACTER_SET
|
||||
set session character_set_connection=2048;
|
||||
--error ER_UNKNOWN_CHARACTER_SET
|
||||
set session character_set_server=2048;
|
||||
--error ER_UNKNOWN_COLLATION
|
||||
set session collation_server=2048;
|
||||
--error ER_UNKNOWN_CHARACTER_SET
|
||||
set session character_set_filesystem=2048;
|
||||
--error ER_UNKNOWN_CHARACTER_SET
|
||||
set session character_set_database=2048;
|
||||
--error ER_UNKNOWN_COLLATION
|
||||
set session collation_connection=2048;
|
||||
--error ER_UNKNOWN_COLLATION
|
||||
set session collation_database=2048;
|
||||
|
||||
--echo End of 5.5 tests
|
||||
|
@ -245,6 +245,48 @@ XA PREPARE 'x';
|
||||
XA ROLLBACK 'x';
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#59986 Assert in Diagnostics_area::set_ok_status() for XA COMMIT
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a)) engine=InnoDB;
|
||||
INSERT INTO t1 VALUES (1, 1), (2, 2);
|
||||
|
||||
--echo # Connection con1
|
||||
connect (con1, localhost, root);
|
||||
XA START 'a';
|
||||
UPDATE t1 SET b= 3 WHERE a=1;
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
XA START 'b';
|
||||
UPDATE t1 SET b=4 WHERE a=2;
|
||||
--echo # Sending:
|
||||
--send UPDATE t1 SET b=5 WHERE a=1
|
||||
|
||||
--echo # Connection con1
|
||||
connection con1;
|
||||
--sleep 1
|
||||
--error ER_LOCK_DEADLOCK
|
||||
UPDATE t1 SET b=6 WHERE a=2;
|
||||
# This used to trigger the assert
|
||||
--error ER_XA_RBDEADLOCK
|
||||
XA COMMIT 'a';
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
--echo # Reaping: UPDATE t1 SET b=5 WHERE a=1
|
||||
--reap
|
||||
XA END 'b';
|
||||
XA ROLLBACK 'b';
|
||||
DROP TABLE t1;
|
||||
disconnect con1;
|
||||
|
||||
|
||||
# Wait till all disconnects are completed
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
||||
|
@ -875,5 +875,4 @@
|
||||
fun:buf_buddy_relocate
|
||||
fun:buf_buddy_free_low
|
||||
fun:buf_buddy_free
|
||||
fun:buf_LRU_block_remove_hashed_page
|
||||
}
|
||||
|
@ -419,6 +419,7 @@ CHARSET_INFO *default_charset_info = &my_charset_latin1;
|
||||
|
||||
void add_compiled_collation(CHARSET_INFO *cs)
|
||||
{
|
||||
DBUG_ASSERT(cs->number < array_elements(all_charsets));
|
||||
all_charsets[cs->number]= cs;
|
||||
cs->state|= MY_CS_AVAILABLE;
|
||||
}
|
||||
@ -529,14 +530,17 @@ uint get_charset_number(const char *charset_name, uint cs_flags)
|
||||
|
||||
const char *get_charset_name(uint charset_number)
|
||||
{
|
||||
CHARSET_INFO *cs;
|
||||
my_pthread_once(&charsets_initialized, init_available_charsets);
|
||||
|
||||
cs=all_charsets[charset_number];
|
||||
if (cs && (cs->number == charset_number) && cs->name )
|
||||
return (char*) cs->name;
|
||||
if (charset_number < array_elements(all_charsets))
|
||||
{
|
||||
CHARSET_INFO *cs= all_charsets[charset_number];
|
||||
|
||||
if (cs && (cs->number == charset_number) && cs->name)
|
||||
return (char*) cs->name;
|
||||
}
|
||||
|
||||
return (char*) "?"; /* this mimics find_type() */
|
||||
return "?"; /* this mimics find_type() */
|
||||
}
|
||||
|
||||
|
||||
@ -545,6 +549,8 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags)
|
||||
char buf[FN_REFLEN];
|
||||
CHARSET_INFO *cs;
|
||||
|
||||
DBUG_ASSERT(cs_number < array_elements(all_charsets));
|
||||
|
||||
if ((cs= all_charsets[cs_number]))
|
||||
{
|
||||
if (cs->state & MY_CS_READY) /* if CS is already initialized */
|
||||
@ -589,8 +595,8 @@ CHARSET_INFO *get_charset(uint cs_number, myf flags)
|
||||
return default_charset_info;
|
||||
|
||||
my_pthread_once(&charsets_initialized, init_available_charsets);
|
||||
|
||||
if (!cs_number || cs_number > array_elements(all_charsets))
|
||||
|
||||
if (cs_number >= array_elements(all_charsets))
|
||||
return NULL;
|
||||
|
||||
cs=get_internal_charset(cs_number, flags);
|
||||
|
@ -179,7 +179,7 @@ fn_expand(const char *filename, char *result_buf)
|
||||
if (my_getwd(dir, sizeof(dir), MYF(0)))
|
||||
DBUG_RETURN(3);
|
||||
DBUG_PRINT("debug", ("dir: %s", dir));
|
||||
if (fn_format(result_buf, filename, dir, NULL, flags) == NULL)
|
||||
if (fn_format(result_buf, filename, dir, "", flags) == NULL)
|
||||
DBUG_RETURN(2);
|
||||
DBUG_PRINT("return", ("result: %s", result_buf));
|
||||
DBUG_RETURN(0);
|
||||
|
@ -31,6 +31,8 @@ char * fn_format(char * to, const char *name, const char *dir,
|
||||
reg1 size_t length;
|
||||
size_t dev_length;
|
||||
DBUG_ENTER("fn_format");
|
||||
DBUG_ASSERT(name != NULL);
|
||||
DBUG_ASSERT(extension != NULL);
|
||||
DBUG_PRINT("enter",("name: %s dir: %s extension: %s flag: %d",
|
||||
name,dir,extension,flag));
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2000 MySQL AB, 2008-2009 Sun Microsystems, Inc
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
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
|
||||
@ -86,6 +86,7 @@ static inline void bitmap_lock(MY_BITMAP *map __attribute__((unused)))
|
||||
mysql_mutex_lock(map->mutex);
|
||||
}
|
||||
|
||||
|
||||
static inline void bitmap_unlock(MY_BITMAP *map __attribute__((unused)))
|
||||
{
|
||||
if (map->mutex)
|
||||
@ -93,6 +94,46 @@ static inline void bitmap_unlock(MY_BITMAP *map __attribute__((unused)))
|
||||
}
|
||||
|
||||
|
||||
static inline uint get_first_set(uint32 value, uint word_pos)
|
||||
{
|
||||
uchar *byte_ptr= (uchar*)&value;
|
||||
uchar byte_value;
|
||||
uint byte_pos, bit_pos;
|
||||
|
||||
for (byte_pos=0; byte_pos < 4; byte_pos++, byte_ptr++)
|
||||
{
|
||||
byte_value= *byte_ptr;
|
||||
if (byte_value)
|
||||
{
|
||||
for (bit_pos=0; ; bit_pos++)
|
||||
if (byte_value & (1 << bit_pos))
|
||||
return (word_pos*32) + (byte_pos*8) + bit_pos;
|
||||
}
|
||||
}
|
||||
return MY_BIT_NONE;
|
||||
}
|
||||
|
||||
|
||||
static inline uint get_first_not_set(uint32 value, uint word_pos)
|
||||
{
|
||||
uchar *byte_ptr= (uchar*)&value;
|
||||
uchar byte_value;
|
||||
uint byte_pos, bit_pos;
|
||||
|
||||
for (byte_pos=0; byte_pos < 4; byte_pos++, byte_ptr++)
|
||||
{
|
||||
byte_value= *byte_ptr;
|
||||
if (byte_value != 0xFF)
|
||||
{
|
||||
for (bit_pos=0; ; bit_pos++)
|
||||
if (!(byte_value & (1 << bit_pos)))
|
||||
return (word_pos*32) + (byte_pos*8) + bit_pos;
|
||||
}
|
||||
}
|
||||
return MY_BIT_NONE;
|
||||
}
|
||||
|
||||
|
||||
my_bool bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits,
|
||||
my_bool thread_safe __attribute__((unused)))
|
||||
{
|
||||
@ -251,7 +292,7 @@ void bitmap_set_prefix(MY_BITMAP *map, uint prefix_size)
|
||||
memset(m, 0xff, prefix_bytes);
|
||||
m+= prefix_bytes;
|
||||
if ((prefix_bits= prefix_size & 7))
|
||||
*m++= (1 << prefix_bits)-1;
|
||||
*(m++)= (1 << prefix_bits)-1;
|
||||
if ((d= no_bytes_in_map(map)-prefix_bytes))
|
||||
bzero(m, d);
|
||||
}
|
||||
@ -259,28 +300,43 @@ void bitmap_set_prefix(MY_BITMAP *map, uint prefix_size)
|
||||
|
||||
my_bool bitmap_is_prefix(const MY_BITMAP *map, uint prefix_size)
|
||||
{
|
||||
uint prefix_bits= prefix_size & 0x7, res;
|
||||
uchar *m= (uchar*)map->bitmap;
|
||||
uchar *end_prefix= m+prefix_size/8;
|
||||
uchar *end;
|
||||
DBUG_ASSERT(m && prefix_size <= map->n_bits);
|
||||
end= m+no_bytes_in_map(map);
|
||||
uint prefix_bits= prefix_size % 32;
|
||||
my_bitmap_map *word_ptr= map->bitmap, last_word;
|
||||
my_bitmap_map *end_prefix= word_ptr + prefix_size / 32;
|
||||
DBUG_ASSERT(word_ptr && prefix_size <= map->n_bits);
|
||||
|
||||
while (m < end_prefix)
|
||||
if (*m++ != 0xff)
|
||||
return 0;
|
||||
/* 1: Words that should be filled with 1 */
|
||||
for (; word_ptr < end_prefix; word_ptr++)
|
||||
if (*word_ptr != 0xFFFFFFFF)
|
||||
return FALSE;
|
||||
|
||||
*map->last_word_ptr&= ~map->last_word_mask; /*Clear bits*/
|
||||
res= 0;
|
||||
if (prefix_bits && *m++ != (1 << prefix_bits)-1)
|
||||
goto ret;
|
||||
last_word= *map->last_word_ptr & ~map->last_word_mask;
|
||||
|
||||
while (m < end)
|
||||
if (*m++ != 0)
|
||||
goto ret;
|
||||
res= 1;
|
||||
ret:
|
||||
return res;
|
||||
/* 2: Word which contains the end of the prefix (if any) */
|
||||
if (prefix_bits)
|
||||
{
|
||||
if (word_ptr == map->last_word_ptr)
|
||||
return uint4korr((uchar*)&last_word) == (uint32)((1 << prefix_bits) - 1);
|
||||
else if (uint4korr((uchar*)word_ptr) != (uint32)((1 << prefix_bits) - 1))
|
||||
return FALSE;
|
||||
word_ptr++;
|
||||
}
|
||||
|
||||
/* 3: Words that should be filled with 0 */
|
||||
for (; word_ptr < map->last_word_ptr; word_ptr++)
|
||||
if (*word_ptr != 0)
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
We can end up here in two situations:
|
||||
1) We went through the whole bitmap in step 1. This will happen if the
|
||||
whole bitmap is filled with 1 and prefix_size is a multiple of 32
|
||||
(i.e. the prefix does not end in the middle of a word).
|
||||
In this case word_ptr will be larger than map->last_word_ptr.
|
||||
2) We have gone through steps 1-3 and just need to check that also
|
||||
the last word is 0.
|
||||
*/
|
||||
return word_ptr > map->last_word_ptr || last_word == 0;
|
||||
}
|
||||
|
||||
|
||||
@ -288,10 +344,12 @@ my_bool bitmap_is_set_all(const MY_BITMAP *map)
|
||||
{
|
||||
my_bitmap_map *data_ptr= map->bitmap;
|
||||
my_bitmap_map *end= map->last_word_ptr;
|
||||
*map->last_word_ptr |= map->last_word_mask;
|
||||
for (; data_ptr <= end; data_ptr++)
|
||||
|
||||
for (; data_ptr < end; data_ptr++)
|
||||
if (*data_ptr != 0xFFFFFFFF)
|
||||
return FALSE;
|
||||
if ((*map->last_word_ptr | map->last_word_mask) != 0xFFFFFFFF)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -299,13 +357,13 @@ my_bool bitmap_is_set_all(const MY_BITMAP *map)
|
||||
my_bool bitmap_is_clear_all(const MY_BITMAP *map)
|
||||
{
|
||||
my_bitmap_map *data_ptr= map->bitmap;
|
||||
my_bitmap_map *end;
|
||||
if (*map->last_word_ptr & ~map->last_word_mask)
|
||||
return FALSE;
|
||||
end= map->last_word_ptr;
|
||||
my_bitmap_map *end= map->last_word_ptr;
|
||||
|
||||
for (; data_ptr < end; data_ptr++)
|
||||
if (*data_ptr)
|
||||
return FALSE;
|
||||
if (*map->last_word_ptr & ~map->last_word_mask)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -319,14 +377,14 @@ my_bool bitmap_is_subset(const MY_BITMAP *map1, const MY_BITMAP *map2)
|
||||
map1->n_bits==map2->n_bits);
|
||||
|
||||
end= map1->last_word_ptr;
|
||||
*map1->last_word_ptr &= ~map1->last_word_mask;
|
||||
*map2->last_word_ptr &= ~map2->last_word_mask;
|
||||
while (m1 <= end)
|
||||
{
|
||||
if ((*m1++) & ~(*m2++))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
for (; m1 < end; m1++, m2++)
|
||||
if (*m1 & ~(*m2))
|
||||
return FALSE;
|
||||
|
||||
if ((*map1->last_word_ptr & ~map1->last_word_mask) &
|
||||
~(*map2->last_word_ptr & ~map2->last_word_mask))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* True if bitmaps has any common bits */
|
||||
@ -339,14 +397,14 @@ my_bool bitmap_is_overlapping(const MY_BITMAP *map1, const MY_BITMAP *map2)
|
||||
map1->n_bits==map2->n_bits);
|
||||
|
||||
end= map1->last_word_ptr;
|
||||
*map1->last_word_ptr &= ~map1->last_word_mask;
|
||||
*map2->last_word_ptr &= ~map2->last_word_mask;
|
||||
while (m1 <= end)
|
||||
{
|
||||
if ((*m1++) & (*m2++))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
for (; m1 < end; m1++, m2++)
|
||||
if (*m1 & *m2)
|
||||
return TRUE;
|
||||
|
||||
if ((*map1->last_word_ptr & ~map1->last_word_mask) &
|
||||
(*map2->last_word_ptr & ~map2->last_word_mask))
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@ -358,15 +416,17 @@ void bitmap_intersect(MY_BITMAP *map, const MY_BITMAP *map2)
|
||||
DBUG_ASSERT(map->bitmap && map2->bitmap);
|
||||
|
||||
end= to+min(len,len2);
|
||||
*map2->last_word_ptr&= ~map2->last_word_mask; /*Clear last bits in map2*/
|
||||
while (to < end)
|
||||
*to++ &= *from++;
|
||||
for (; to < end; to++, from++)
|
||||
*to &= *from;
|
||||
|
||||
if (len >= len2)
|
||||
map->bitmap[len2 - 1] &= ~map2->last_word_mask;
|
||||
|
||||
if (len2 < len)
|
||||
{
|
||||
end+=len-len2;
|
||||
while (to < end)
|
||||
*to++=0;
|
||||
for (; to < end; to++)
|
||||
*to= 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -397,8 +457,8 @@ void bitmap_set_above(MY_BITMAP *map, uint from_byte, uint use_bit)
|
||||
uchar *to= (uchar *)map->bitmap + from_byte;
|
||||
uchar *end= (uchar *)map->bitmap + (map->n_bits+7)/8;
|
||||
|
||||
while (to < end)
|
||||
*to++= use_byte;
|
||||
for (; to < end; to++)
|
||||
*to= use_byte;
|
||||
}
|
||||
|
||||
|
||||
@ -407,59 +467,60 @@ void bitmap_subtract(MY_BITMAP *map, const MY_BITMAP *map2)
|
||||
my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end;
|
||||
DBUG_ASSERT(map->bitmap && map2->bitmap &&
|
||||
map->n_bits==map2->n_bits);
|
||||
|
||||
end= map->last_word_ptr;
|
||||
|
||||
while (to <= end)
|
||||
*to++ &= ~(*from++);
|
||||
for (; to <= end; to++, from++)
|
||||
*to &= ~(*from);
|
||||
}
|
||||
|
||||
|
||||
void bitmap_union(MY_BITMAP *map, const MY_BITMAP *map2)
|
||||
{
|
||||
my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end;
|
||||
|
||||
DBUG_ASSERT(map->bitmap && map2->bitmap &&
|
||||
map->n_bits==map2->n_bits);
|
||||
end= map->last_word_ptr;
|
||||
|
||||
while (to <= end)
|
||||
*to++ |= *from++;
|
||||
for (; to <= end; to++, from++)
|
||||
*to |= *from;
|
||||
}
|
||||
|
||||
|
||||
void bitmap_xor(MY_BITMAP *map, const MY_BITMAP *map2)
|
||||
{
|
||||
my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end= map->last_word_ptr;
|
||||
my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end;
|
||||
DBUG_ASSERT(map->bitmap && map2->bitmap &&
|
||||
map->n_bits==map2->n_bits);
|
||||
while (to <= end)
|
||||
*to++ ^= *from++;
|
||||
end= map->last_word_ptr;
|
||||
|
||||
for (; to <= end; to++, from++)
|
||||
*to ^= *from;
|
||||
}
|
||||
|
||||
|
||||
void bitmap_invert(MY_BITMAP *map)
|
||||
{
|
||||
my_bitmap_map *to= map->bitmap, *end;
|
||||
|
||||
DBUG_ASSERT(map->bitmap);
|
||||
end= map->last_word_ptr;
|
||||
|
||||
while (to <= end)
|
||||
*to++ ^= 0xFFFFFFFF;
|
||||
for (; to <= end; to++)
|
||||
*to ^= 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
|
||||
uint bitmap_bits_set(const MY_BITMAP *map)
|
||||
{
|
||||
uchar *m= (uchar*)map->bitmap;
|
||||
uchar *end= m + no_bytes_in_map(map);
|
||||
{
|
||||
my_bitmap_map *data_ptr= map->bitmap;
|
||||
my_bitmap_map *end= map->last_word_ptr;
|
||||
uint res= 0;
|
||||
|
||||
DBUG_ASSERT(map->bitmap);
|
||||
*map->last_word_ptr&= ~map->last_word_mask; /*Reset last bits to zero*/
|
||||
while (m < end)
|
||||
res+= my_count_bits_ushort(*m++);
|
||||
|
||||
for (; data_ptr < end; data_ptr++)
|
||||
res+= my_count_bits_uint32(*data_ptr);
|
||||
|
||||
/*Reset last bits to zero*/
|
||||
res+= my_count_bits_uint32(*map->last_word_ptr & ~map->last_word_mask);
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -467,76 +528,44 @@ uint bitmap_bits_set(const MY_BITMAP *map)
|
||||
void bitmap_copy(MY_BITMAP *map, const MY_BITMAP *map2)
|
||||
{
|
||||
my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end;
|
||||
|
||||
DBUG_ASSERT(map->bitmap && map2->bitmap &&
|
||||
map->n_bits==map2->n_bits);
|
||||
end= map->last_word_ptr;
|
||||
while (to <= end)
|
||||
*to++ = *from++;
|
||||
|
||||
for (; to <= end; to++, from++)
|
||||
*to = *from;
|
||||
}
|
||||
|
||||
|
||||
uint bitmap_get_first_set(const MY_BITMAP *map)
|
||||
{
|
||||
uchar *byte_ptr;
|
||||
uint i,j,k;
|
||||
uint word_pos;
|
||||
my_bitmap_map *data_ptr, *end= map->last_word_ptr;
|
||||
|
||||
DBUG_ASSERT(map->bitmap);
|
||||
data_ptr= map->bitmap;
|
||||
*map->last_word_ptr &= ~map->last_word_mask;
|
||||
|
||||
for (i=0; data_ptr <= end; data_ptr++, i++)
|
||||
{
|
||||
for (word_pos=0; data_ptr < end; data_ptr++, word_pos++)
|
||||
if (*data_ptr)
|
||||
{
|
||||
byte_ptr= (uchar*)data_ptr;
|
||||
for (j=0; ; j++, byte_ptr++)
|
||||
{
|
||||
if (*byte_ptr)
|
||||
{
|
||||
for (k=0; ; k++)
|
||||
{
|
||||
if (*byte_ptr & (1 << k))
|
||||
return (i*32) + (j*8) + k;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return MY_BIT_NONE;
|
||||
return get_first_set(*data_ptr, word_pos);
|
||||
|
||||
return get_first_set(*map->last_word_ptr & ~map->last_word_mask, word_pos);
|
||||
}
|
||||
|
||||
|
||||
uint bitmap_get_first(const MY_BITMAP *map)
|
||||
{
|
||||
uchar *byte_ptr;
|
||||
uint i,j,k;
|
||||
uint word_pos;
|
||||
my_bitmap_map *data_ptr, *end= map->last_word_ptr;
|
||||
|
||||
DBUG_ASSERT(map->bitmap);
|
||||
data_ptr= map->bitmap;
|
||||
*map->last_word_ptr|= map->last_word_mask;
|
||||
|
||||
for (i=0; data_ptr <= end; data_ptr++, i++)
|
||||
{
|
||||
for (word_pos=0; data_ptr < end; data_ptr++, word_pos++)
|
||||
if (*data_ptr != 0xFFFFFFFF)
|
||||
{
|
||||
byte_ptr= (uchar*)data_ptr;
|
||||
for (j=0; ; j++, byte_ptr++)
|
||||
{
|
||||
if (*byte_ptr != 0xFF)
|
||||
{
|
||||
for (k=0; ; k++)
|
||||
{
|
||||
if (!(*byte_ptr & (1 << k)))
|
||||
return (i*32) + (j*8) + k;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return MY_BIT_NONE;
|
||||
return get_first_not_set(*data_ptr, word_pos);
|
||||
|
||||
return get_first_not_set(*map->last_word_ptr | map->last_word_mask, word_pos);
|
||||
}
|
||||
|
||||
|
||||
@ -557,376 +586,3 @@ void bitmap_lock_clear_bit(MY_BITMAP *map, uint bitmap_bit)
|
||||
bitmap_clear_bit(map, bitmap_bit);
|
||||
bitmap_unlock(map);
|
||||
}
|
||||
|
||||
#ifdef MAIN
|
||||
|
||||
uint get_rand_bit(uint bitsize)
|
||||
{
|
||||
return (rand() % bitsize);
|
||||
}
|
||||
|
||||
bool test_set_get_clear_bit(MY_BITMAP *map, uint bitsize)
|
||||
{
|
||||
uint i, test_bit;
|
||||
uint no_loops= bitsize > 128 ? 128 : bitsize;
|
||||
for (i=0; i < no_loops; i++)
|
||||
{
|
||||
test_bit= get_rand_bit(bitsize);
|
||||
bitmap_set_bit(map, test_bit);
|
||||
if (!bitmap_is_set(map, test_bit))
|
||||
goto error1;
|
||||
bitmap_clear_bit(map, test_bit);
|
||||
if (bitmap_is_set(map, test_bit))
|
||||
goto error2;
|
||||
}
|
||||
return FALSE;
|
||||
error1:
|
||||
printf("Error in set bit, bit %u, bitsize = %u", test_bit, bitsize);
|
||||
return TRUE;
|
||||
error2:
|
||||
printf("Error in clear bit, bit %u, bitsize = %u", test_bit, bitsize);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool test_flip_bit(MY_BITMAP *map, uint bitsize)
|
||||
{
|
||||
uint i, test_bit;
|
||||
uint no_loops= bitsize > 128 ? 128 : bitsize;
|
||||
for (i=0; i < no_loops; i++)
|
||||
{
|
||||
test_bit= get_rand_bit(bitsize);
|
||||
bitmap_flip_bit(map, test_bit);
|
||||
if (!bitmap_is_set(map, test_bit))
|
||||
goto error1;
|
||||
bitmap_flip_bit(map, test_bit);
|
||||
if (bitmap_is_set(map, test_bit))
|
||||
goto error2;
|
||||
}
|
||||
return FALSE;
|
||||
error1:
|
||||
printf("Error in flip bit 1, bit %u, bitsize = %u", test_bit, bitsize);
|
||||
return TRUE;
|
||||
error2:
|
||||
printf("Error in flip bit 2, bit %u, bitsize = %u", test_bit, bitsize);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool test_operators(MY_BITMAP *map __attribute__((unused)),
|
||||
uint bitsize __attribute__((unused)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool test_get_all_bits(MY_BITMAP *map, uint bitsize)
|
||||
{
|
||||
uint i;
|
||||
bitmap_set_all(map);
|
||||
if (!bitmap_is_set_all(map))
|
||||
goto error1;
|
||||
if (!bitmap_is_prefix(map, bitsize))
|
||||
goto error5;
|
||||
bitmap_clear_all(map);
|
||||
if (!bitmap_is_clear_all(map))
|
||||
goto error2;
|
||||
if (!bitmap_is_prefix(map, 0))
|
||||
goto error6;
|
||||
for (i=0; i<bitsize;i++)
|
||||
bitmap_set_bit(map, i);
|
||||
if (!bitmap_is_set_all(map))
|
||||
goto error3;
|
||||
for (i=0; i<bitsize;i++)
|
||||
bitmap_clear_bit(map, i);
|
||||
if (!bitmap_is_clear_all(map))
|
||||
goto error4;
|
||||
return FALSE;
|
||||
error1:
|
||||
printf("Error in set_all, bitsize = %u", bitsize);
|
||||
return TRUE;
|
||||
error2:
|
||||
printf("Error in clear_all, bitsize = %u", bitsize);
|
||||
return TRUE;
|
||||
error3:
|
||||
printf("Error in bitmap_is_set_all, bitsize = %u", bitsize);
|
||||
return TRUE;
|
||||
error4:
|
||||
printf("Error in bitmap_is_clear_all, bitsize = %u", bitsize);
|
||||
return TRUE;
|
||||
error5:
|
||||
printf("Error in set_all through set_prefix, bitsize = %u", bitsize);
|
||||
return TRUE;
|
||||
error6:
|
||||
printf("Error in clear_all through set_prefix, bitsize = %u", bitsize);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool test_compare_operators(MY_BITMAP *map, uint bitsize)
|
||||
{
|
||||
uint i, j, test_bit1, test_bit2, test_bit3,test_bit4;
|
||||
uint no_loops= bitsize > 128 ? 128 : bitsize;
|
||||
MY_BITMAP map2_obj, map3_obj;
|
||||
MY_BITMAP *map2= &map2_obj, *map3= &map3_obj;
|
||||
my_bitmap_map map2buf[1024];
|
||||
my_bitmap_map map3buf[1024];
|
||||
bitmap_init(&map2_obj, map2buf, bitsize, FALSE);
|
||||
bitmap_init(&map3_obj, map3buf, bitsize, FALSE);
|
||||
bitmap_clear_all(map2);
|
||||
bitmap_clear_all(map3);
|
||||
for (i=0; i < no_loops; i++)
|
||||
{
|
||||
test_bit1=get_rand_bit(bitsize);
|
||||
bitmap_set_prefix(map, test_bit1);
|
||||
test_bit2=get_rand_bit(bitsize);
|
||||
bitmap_set_prefix(map2, test_bit2);
|
||||
bitmap_intersect(map, map2);
|
||||
test_bit3= test_bit2 < test_bit1 ? test_bit2 : test_bit1;
|
||||
bitmap_set_prefix(map3, test_bit3);
|
||||
if (!bitmap_cmp(map, map3))
|
||||
goto error1;
|
||||
bitmap_clear_all(map);
|
||||
bitmap_clear_all(map2);
|
||||
bitmap_clear_all(map3);
|
||||
test_bit1=get_rand_bit(bitsize);
|
||||
test_bit2=get_rand_bit(bitsize);
|
||||
test_bit3=get_rand_bit(bitsize);
|
||||
bitmap_set_prefix(map, test_bit1);
|
||||
bitmap_set_prefix(map2, test_bit2);
|
||||
test_bit3= test_bit2 > test_bit1 ? test_bit2 : test_bit1;
|
||||
bitmap_set_prefix(map3, test_bit3);
|
||||
bitmap_union(map, map2);
|
||||
if (!bitmap_cmp(map, map3))
|
||||
goto error2;
|
||||
bitmap_clear_all(map);
|
||||
bitmap_clear_all(map2);
|
||||
bitmap_clear_all(map3);
|
||||
test_bit1=get_rand_bit(bitsize);
|
||||
test_bit2=get_rand_bit(bitsize);
|
||||
test_bit3=get_rand_bit(bitsize);
|
||||
bitmap_set_prefix(map, test_bit1);
|
||||
bitmap_set_prefix(map2, test_bit2);
|
||||
bitmap_xor(map, map2);
|
||||
test_bit3= test_bit2 > test_bit1 ? test_bit2 : test_bit1;
|
||||
test_bit4= test_bit2 < test_bit1 ? test_bit2 : test_bit1;
|
||||
bitmap_set_prefix(map3, test_bit3);
|
||||
for (j=0; j < test_bit4; j++)
|
||||
bitmap_clear_bit(map3, j);
|
||||
if (!bitmap_cmp(map, map3))
|
||||
goto error3;
|
||||
bitmap_clear_all(map);
|
||||
bitmap_clear_all(map2);
|
||||
bitmap_clear_all(map3);
|
||||
test_bit1=get_rand_bit(bitsize);
|
||||
test_bit2=get_rand_bit(bitsize);
|
||||
test_bit3=get_rand_bit(bitsize);
|
||||
bitmap_set_prefix(map, test_bit1);
|
||||
bitmap_set_prefix(map2, test_bit2);
|
||||
bitmap_subtract(map, map2);
|
||||
if (test_bit2 < test_bit1)
|
||||
{
|
||||
bitmap_set_prefix(map3, test_bit1);
|
||||
for (j=0; j < test_bit2; j++)
|
||||
bitmap_clear_bit(map3, j);
|
||||
}
|
||||
if (!bitmap_cmp(map, map3))
|
||||
goto error4;
|
||||
bitmap_clear_all(map);
|
||||
bitmap_clear_all(map2);
|
||||
bitmap_clear_all(map3);
|
||||
test_bit1=get_rand_bit(bitsize);
|
||||
bitmap_set_prefix(map, test_bit1);
|
||||
bitmap_invert(map);
|
||||
bitmap_set_all(map3);
|
||||
for (j=0; j < test_bit1; j++)
|
||||
bitmap_clear_bit(map3, j);
|
||||
if (!bitmap_cmp(map, map3))
|
||||
goto error5;
|
||||
bitmap_clear_all(map);
|
||||
bitmap_clear_all(map3);
|
||||
}
|
||||
return FALSE;
|
||||
error1:
|
||||
printf("intersect error bitsize=%u,size1=%u,size2=%u", bitsize,
|
||||
test_bit1,test_bit2);
|
||||
return TRUE;
|
||||
error2:
|
||||
printf("union error bitsize=%u,size1=%u,size2=%u", bitsize,
|
||||
test_bit1,test_bit2);
|
||||
return TRUE;
|
||||
error3:
|
||||
printf("xor error bitsize=%u,size1=%u,size2=%u", bitsize,
|
||||
test_bit1,test_bit2);
|
||||
return TRUE;
|
||||
error4:
|
||||
printf("subtract error bitsize=%u,size1=%u,size2=%u", bitsize,
|
||||
test_bit1,test_bit2);
|
||||
return TRUE;
|
||||
error5:
|
||||
printf("invert error bitsize=%u,size=%u", bitsize,
|
||||
test_bit1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool test_count_bits_set(MY_BITMAP *map, uint bitsize)
|
||||
{
|
||||
uint i, bit_count=0, test_bit;
|
||||
uint no_loops= bitsize > 128 ? 128 : bitsize;
|
||||
for (i=0; i < no_loops; i++)
|
||||
{
|
||||
test_bit=get_rand_bit(bitsize);
|
||||
if (!bitmap_is_set(map, test_bit))
|
||||
{
|
||||
bitmap_set_bit(map, test_bit);
|
||||
bit_count++;
|
||||
}
|
||||
}
|
||||
if (bit_count==0 && bitsize > 0)
|
||||
goto error1;
|
||||
if (bitmap_bits_set(map) != bit_count)
|
||||
goto error2;
|
||||
return FALSE;
|
||||
error1:
|
||||
printf("No bits set bitsize = %u", bitsize);
|
||||
return TRUE;
|
||||
error2:
|
||||
printf("Wrong count of bits set, bitsize = %u", bitsize);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool test_get_first_bit(MY_BITMAP *map, uint bitsize)
|
||||
{
|
||||
uint i, test_bit;
|
||||
uint no_loops= bitsize > 128 ? 128 : bitsize;
|
||||
for (i=0; i < no_loops; i++)
|
||||
{
|
||||
test_bit=get_rand_bit(bitsize);
|
||||
bitmap_set_bit(map, test_bit);
|
||||
if (bitmap_get_first_set(map) != test_bit)
|
||||
goto error1;
|
||||
bitmap_set_all(map);
|
||||
bitmap_clear_bit(map, test_bit);
|
||||
if (bitmap_get_first(map) != test_bit)
|
||||
goto error2;
|
||||
bitmap_clear_all(map);
|
||||
}
|
||||
return FALSE;
|
||||
error1:
|
||||
printf("get_first_set error bitsize=%u,prefix_size=%u",bitsize,test_bit);
|
||||
return TRUE;
|
||||
error2:
|
||||
printf("get_first error bitsize= %u, prefix_size= %u",bitsize,test_bit);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool test_get_next_bit(MY_BITMAP *map, uint bitsize)
|
||||
{
|
||||
uint i, j, test_bit;
|
||||
uint no_loops= bitsize > 128 ? 128 : bitsize;
|
||||
for (i=0; i < no_loops; i++)
|
||||
{
|
||||
test_bit=get_rand_bit(bitsize);
|
||||
for (j=0; j < test_bit; j++)
|
||||
bitmap_set_next(map);
|
||||
if (!bitmap_is_prefix(map, test_bit))
|
||||
goto error1;
|
||||
bitmap_clear_all(map);
|
||||
}
|
||||
return FALSE;
|
||||
error1:
|
||||
printf("get_next error bitsize= %u, prefix_size= %u", bitsize,test_bit);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool test_prefix(MY_BITMAP *map, uint bitsize)
|
||||
{
|
||||
uint i, j, test_bit;
|
||||
uint no_loops= bitsize > 128 ? 128 : bitsize;
|
||||
for (i=0; i < no_loops; i++)
|
||||
{
|
||||
test_bit=get_rand_bit(bitsize);
|
||||
bitmap_set_prefix(map, test_bit);
|
||||
if (!bitmap_is_prefix(map, test_bit))
|
||||
goto error1;
|
||||
bitmap_clear_all(map);
|
||||
for (j=0; j < test_bit; j++)
|
||||
bitmap_set_bit(map, j);
|
||||
if (!bitmap_is_prefix(map, test_bit))
|
||||
goto error2;
|
||||
bitmap_set_all(map);
|
||||
for (j=bitsize - 1; ~(j-test_bit); j--)
|
||||
bitmap_clear_bit(map, j);
|
||||
if (!bitmap_is_prefix(map, test_bit))
|
||||
goto error3;
|
||||
bitmap_clear_all(map);
|
||||
}
|
||||
return FALSE;
|
||||
error1:
|
||||
printf("prefix1 error bitsize = %u, prefix_size = %u", bitsize,test_bit);
|
||||
return TRUE;
|
||||
error2:
|
||||
printf("prefix2 error bitsize = %u, prefix_size = %u", bitsize,test_bit);
|
||||
return TRUE;
|
||||
error3:
|
||||
printf("prefix3 error bitsize = %u, prefix_size = %u", bitsize,test_bit);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
bool do_test(uint bitsize)
|
||||
{
|
||||
MY_BITMAP map;
|
||||
my_bitmap_map buf[1024];
|
||||
if (bitmap_init(&map, buf, bitsize, FALSE))
|
||||
{
|
||||
printf("init error for bitsize %d", bitsize);
|
||||
goto error;
|
||||
}
|
||||
if (test_set_get_clear_bit(&map,bitsize))
|
||||
goto error;
|
||||
bitmap_clear_all(&map);
|
||||
if (test_flip_bit(&map,bitsize))
|
||||
goto error;
|
||||
bitmap_clear_all(&map);
|
||||
if (test_operators(&map,bitsize))
|
||||
goto error;
|
||||
bitmap_clear_all(&map);
|
||||
if (test_get_all_bits(&map, bitsize))
|
||||
goto error;
|
||||
bitmap_clear_all(&map);
|
||||
if (test_compare_operators(&map,bitsize))
|
||||
goto error;
|
||||
bitmap_clear_all(&map);
|
||||
if (test_count_bits_set(&map,bitsize))
|
||||
goto error;
|
||||
bitmap_clear_all(&map);
|
||||
if (test_get_first_bit(&map,bitsize))
|
||||
goto error;
|
||||
bitmap_clear_all(&map);
|
||||
if (test_get_next_bit(&map,bitsize))
|
||||
goto error;
|
||||
if (test_prefix(&map,bitsize))
|
||||
goto error;
|
||||
return FALSE;
|
||||
error:
|
||||
printf("\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
for (i= 1; i < 4096; i++)
|
||||
{
|
||||
printf("Start test for bitsize=%u\n",i);
|
||||
if (do_test(i))
|
||||
return -1;
|
||||
}
|
||||
printf("OK\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
In directory mysys:
|
||||
make test_bitmap
|
||||
will build the bitmap tests and ./test_bitmap will execute it
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
@ -79,7 +79,7 @@ mysql_declare_plugin(socket_auth)
|
||||
{
|
||||
MYSQL_AUTHENTICATION_PLUGIN,
|
||||
&socket_auth_handler,
|
||||
"socket_peercred",
|
||||
"auth_socket",
|
||||
"Sergei Golubchik",
|
||||
"Unix Socket based authentication",
|
||||
PLUGIN_LICENSE_GPL,
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "probes_mysql.h"
|
||||
#include "sql_test.h" // TEST_filesort
|
||||
#include "opt_range.h" // SQL_SELECT
|
||||
#include "debug_sync.h"
|
||||
|
||||
/// How to write record_ref.
|
||||
#define WRITE_REF(file,from) \
|
||||
@ -123,6 +124,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
|
||||
Item_subselect *subselect= tab ? tab->containing_subselect() : 0;
|
||||
|
||||
MYSQL_FILESORT_START(table->s->db.str, table->s->table_name.str);
|
||||
DEBUG_SYNC(thd, "filesort_start");
|
||||
|
||||
/*
|
||||
Release InnoDB's adaptive hash index latch (if holding) before
|
||||
@ -325,12 +327,13 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
|
||||
}
|
||||
if (error)
|
||||
{
|
||||
DBUG_ASSERT(thd->is_error());
|
||||
int kill_errno= thd->killed_errno();
|
||||
DBUG_ASSERT(thd->is_error() || kill_errno);
|
||||
my_printf_error(ER_FILSORT_ABORT,
|
||||
"%s: %s",
|
||||
MYF(ME_ERROR + ME_WAITTANG),
|
||||
ER_THD(thd, ER_FILSORT_ABORT),
|
||||
thd->stmt_da->message());
|
||||
kill_errno ? ER(kill_errno) : thd->stmt_da->message());
|
||||
|
||||
if (global_system_variables.log_warnings > 1)
|
||||
{
|
||||
|
@ -1472,4 +1472,4 @@ int ha_ndbcluster_cond::generate_scan_filter_from_key(NdbScanOperation *op,
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
#endif /* HAVE_NDBCLUSTER_DB */
|
||||
#endif
|
||||
|
@ -2700,6 +2700,7 @@ void handler::print_error(int error, myf errflag)
|
||||
break;
|
||||
case HA_ERR_KEY_NOT_FOUND:
|
||||
case HA_ERR_NO_ACTIVE_RECORD:
|
||||
case HA_ERR_RECORD_DELETED:
|
||||
case HA_ERR_END_OF_FILE:
|
||||
textno=ER_KEY_NOT_FOUND;
|
||||
break;
|
||||
|
@ -2640,7 +2640,7 @@ Item_func_if::fix_length_and_dec()
|
||||
if (null1)
|
||||
{
|
||||
cached_result_type= arg2_type;
|
||||
collation.set(args[2]->collation.collation);
|
||||
collation.set(args[2]->collation);
|
||||
cached_field_type= args[2]->field_type();
|
||||
max_length= args[2]->max_length;
|
||||
return;
|
||||
@ -2649,7 +2649,7 @@ Item_func_if::fix_length_and_dec()
|
||||
if (null2)
|
||||
{
|
||||
cached_result_type= arg1_type;
|
||||
collation.set(args[1]->collation.collation);
|
||||
collation.set(args[1]->collation);
|
||||
cached_field_type= args[1]->field_type();
|
||||
max_length= args[1]->max_length;
|
||||
return;
|
||||
|
@ -70,7 +70,7 @@ String my_empty_string("",default_charset_info);
|
||||
Normally conversion does not happen, and val_str_ascii() is immediately
|
||||
returned instead.
|
||||
*/
|
||||
String *Item_str_ascii_func::val_str(String *str)
|
||||
String *Item_str_func::val_str_from_val_str_ascii(String *str, String *str2)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
|
||||
@ -82,19 +82,19 @@ String *Item_str_ascii_func::val_str(String *str)
|
||||
return res;
|
||||
}
|
||||
|
||||
DBUG_ASSERT(str != &ascii_buf);
|
||||
DBUG_ASSERT(str != str2);
|
||||
|
||||
uint errors;
|
||||
String *res= val_str_ascii(&ascii_buf);
|
||||
String *res= val_str_ascii(str);
|
||||
if (!res)
|
||||
return 0;
|
||||
|
||||
if ((null_value= str->copy(res->ptr(), res->length(),
|
||||
&my_charset_latin1, collation.collation,
|
||||
&errors)))
|
||||
if ((null_value= str2->copy(res->ptr(), res->length(),
|
||||
&my_charset_latin1, collation.collation,
|
||||
&errors)))
|
||||
return 0;
|
||||
|
||||
return str;
|
||||
return str2;
|
||||
}
|
||||
|
||||
|
||||
|
@ -51,6 +51,7 @@ public:
|
||||
enum Item_result result_type () const { return STRING_RESULT; }
|
||||
void left_right_max_length();
|
||||
bool fix_fields(THD *thd, Item **ref);
|
||||
String *val_str_from_val_str_ascii(String *str, String *str2);
|
||||
};
|
||||
|
||||
|
||||
@ -66,8 +67,10 @@ public:
|
||||
Item_str_ascii_func(Item *a) :Item_str_func(a) {}
|
||||
Item_str_ascii_func(Item *a,Item *b) :Item_str_func(a,b) {}
|
||||
Item_str_ascii_func(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
|
||||
String *val_str_convert_from_ascii(String *str, String *ascii_buf);
|
||||
String *val_str(String *str);
|
||||
String *val_str(String *str)
|
||||
{
|
||||
return val_str_from_val_str_ascii(str, &ascii_buf);
|
||||
}
|
||||
virtual String *val_str_ascii(String *)= 0;
|
||||
};
|
||||
|
||||
|
@ -1133,16 +1133,13 @@ String* Item_func_monthname::val_str(String* str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
const char *month_name;
|
||||
uint month= (uint) val_int();
|
||||
uint err;
|
||||
MYSQL_TIME ltime;
|
||||
|
||||
if (null_value || !month)
|
||||
{
|
||||
null_value=1;
|
||||
return (String*) 0;
|
||||
}
|
||||
null_value=0;
|
||||
month_name= locale->month_names->type_names[month-1];
|
||||
if ((null_value= (get_arg0_date(<ime, TIME_FUZZY_DATE) || !ltime.month)))
|
||||
return (String *) 0;
|
||||
|
||||
month_name= locale->month_names->type_names[ltime.month - 1];
|
||||
str->copy(month_name, (uint) strlen(month_name), &my_charset_utf8_bin,
|
||||
collation.collation, &err);
|
||||
return str;
|
||||
@ -2205,8 +2202,6 @@ void Item_date_add_interval::fix_length_and_dec()
|
||||
enum_field_types arg0_field_type;
|
||||
|
||||
maybe_null=1;
|
||||
fix_length_and_charset_datetime(MAX_DATETIME_FULL_WIDTH);
|
||||
value.alloc(max_length);
|
||||
|
||||
/*
|
||||
The field type for the result of an Item_date function is defined as
|
||||
@ -2231,6 +2226,21 @@ void Item_date_add_interval::fix_length_and_dec()
|
||||
else
|
||||
cached_field_type= MYSQL_TYPE_DATETIME;
|
||||
}
|
||||
|
||||
if (cached_field_type == MYSQL_TYPE_STRING)
|
||||
{
|
||||
/* Behave as a usual string function when return type is VARCHAR. */
|
||||
fix_length_and_charset(MAX_DATETIME_FULL_WIDTH, default_charset());
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Follow the "Number-to-string conversion" rules as in WorkLog 2649
|
||||
when return type is DATE or DATETIME.
|
||||
*/
|
||||
fix_length_and_charset_datetime(MAX_DATETIME_FULL_WIDTH);
|
||||
}
|
||||
value.alloc(max_length);
|
||||
}
|
||||
|
||||
|
||||
@ -2253,7 +2263,7 @@ bool Item_date_add_interval::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
|
||||
}
|
||||
|
||||
|
||||
String *Item_date_add_interval::val_str(String *str)
|
||||
String *Item_date_add_interval::val_str_ascii(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
MYSQL_TIME ltime;
|
||||
|
@ -163,16 +163,19 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class Item_func_monthname :public Item_func_month
|
||||
class Item_func_monthname :public Item_str_func
|
||||
{
|
||||
MY_LOCALE *locale;
|
||||
public:
|
||||
Item_func_monthname(Item *a) :Item_func_month(a) {}
|
||||
Item_func_monthname(Item *a) :Item_str_func(a) {}
|
||||
const char *func_name() const { return "monthname"; }
|
||||
String *val_str(String *str);
|
||||
enum Item_result result_type () const { return STRING_RESULT; }
|
||||
void fix_length_and_dec();
|
||||
bool check_partition_func_processor(uchar *int_arg) {return TRUE;}
|
||||
bool check_valid_arguments_processor(uchar *int_arg)
|
||||
{
|
||||
return !has_date_args();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -773,16 +776,32 @@ class Item_date_add_interval :public Item_date_func
|
||||
{
|
||||
String value;
|
||||
enum_field_types cached_field_type;
|
||||
|
||||
String ascii_buf;
|
||||
public:
|
||||
const interval_type int_type; // keep it public
|
||||
const bool date_sub_interval; // keep it public
|
||||
Item_date_add_interval(Item *a,Item *b,interval_type type_arg,bool neg_arg)
|
||||
:Item_date_func(a,b),int_type(type_arg), date_sub_interval(neg_arg) {}
|
||||
String *val_str(String *);
|
||||
String *val_str_ascii(String *str);
|
||||
String *val_str(String *str)
|
||||
{
|
||||
return val_str_from_val_str_ascii(str, &ascii_buf);
|
||||
}
|
||||
const char *func_name() const { return "date_add_interval"; }
|
||||
void fix_length_and_dec();
|
||||
enum_field_types field_type() const { return cached_field_type; }
|
||||
CHARSET_INFO *charset_for_protocol(void) const
|
||||
{
|
||||
/*
|
||||
DATE_ADD() can return DATE, DATETIME or VARCHAR depending on arguments.
|
||||
Send using "binary" when DATE or DATETIME,
|
||||
or using collation.collation when VARCHAR
|
||||
(which was fixed from @collation_connection in fix_length_and_dec).
|
||||
*/
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
return cached_field_type == MYSQL_TYPE_STRING ?
|
||||
collation.collation : &my_charset_bin;
|
||||
}
|
||||
longlong val_int();
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
bool eq(const Item *item, bool binary_cmp) const;
|
||||
|
@ -3028,7 +3028,6 @@ SHOW_VAR com_status_vars[]= {
|
||||
{"show_grants", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_GRANTS]), SHOW_LONG_STATUS},
|
||||
{"show_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_KEYS]), SHOW_LONG_STATUS},
|
||||
{"show_master_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_MASTER_STAT]), SHOW_LONG_STATUS},
|
||||
{"show_new_master", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_NEW_MASTER]), SHOW_LONG_STATUS},
|
||||
{"show_open_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_OPEN_TABLES]), SHOW_LONG_STATUS},
|
||||
{"show_plugins", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PLUGINS]), SHOW_LONG_STATUS},
|
||||
{"show_privileges", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PRIVILEGES]), SHOW_LONG_STATUS},
|
||||
|
@ -56,10 +56,6 @@ const char* rpl_status_type[]=
|
||||
"RECOVERY_CAPTAIN","NULL",NullS
|
||||
};
|
||||
|
||||
static Slave_log_event* find_slave_event(IO_CACHE* log,
|
||||
const char* log_file_name,
|
||||
char* errmsg);
|
||||
|
||||
/*
|
||||
All of the functions defined in this file which are not used (the ones to
|
||||
handle failsafe) are not used; their code has not been updated for more than
|
||||
@ -91,13 +87,6 @@ void change_rpl_status(ulong from_status, ulong to_status)
|
||||
}\
|
||||
|
||||
|
||||
static inline int cmp_master_pos(Slave_log_event* sev, LEX_MASTER_INFO* mi)
|
||||
{
|
||||
return cmp_master_pos(sev->master_log, sev->master_pos, mi->log_file_name,
|
||||
mi->pos);
|
||||
}
|
||||
|
||||
|
||||
void unregister_slave(THD* thd, bool only_mine, bool need_mutex)
|
||||
{
|
||||
if (thd->server_id)
|
||||
@ -228,361 +217,6 @@ void end_slave_list()
|
||||
}
|
||||
}
|
||||
|
||||
static int find_target_pos(LEX_MASTER_INFO *mi, IO_CACHE *log, char *errmsg)
|
||||
{
|
||||
my_off_t log_pos = (my_off_t) mi->pos;
|
||||
uint32 target_server_id = mi->server_id;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
Log_event* ev;
|
||||
if (!(ev= Log_event::read_log_event(log, (mysql_mutex_t*) 0, 0)))
|
||||
{
|
||||
if (log->error > 0)
|
||||
strmov(errmsg, "Binary log truncated in the middle of event");
|
||||
else if (log->error < 0)
|
||||
strmov(errmsg, "I/O error reading binary log");
|
||||
else
|
||||
strmov(errmsg, "Could not find target event in the binary log");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ev->log_pos >= log_pos && ev->server_id == target_server_id)
|
||||
{
|
||||
delete ev;
|
||||
mi->pos = my_b_tell(log);
|
||||
return 0;
|
||||
}
|
||||
delete ev;
|
||||
}
|
||||
/* Impossible */
|
||||
}
|
||||
|
||||
/**
|
||||
@details
|
||||
Before 4.0.15 we had a member of THD called log_pos, it was meant for
|
||||
failsafe replication code in repl_failsafe.cc which is disabled until
|
||||
it is reworked. Event's log_pos used to be preserved through
|
||||
log-slave-updates to make code in repl_failsafe.cc work (this
|
||||
function, SHOW NEW MASTER); but on the other side it caused unexpected
|
||||
values in Exec_Master_Log_Pos in A->B->C replication setup,
|
||||
synchronization problems in master_pos_wait(), ... So we
|
||||
(Dmitri & Guilhem) removed it.
|
||||
|
||||
So for now this function is broken.
|
||||
*/
|
||||
|
||||
int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg)
|
||||
{
|
||||
LOG_INFO linfo;
|
||||
char last_log_name[FN_REFLEN];
|
||||
IO_CACHE log;
|
||||
File file = -1, last_file = -1;
|
||||
mysql_mutex_t *log_lock;
|
||||
const char* errmsg_p;
|
||||
Slave_log_event* sev = 0;
|
||||
my_off_t last_pos = 0;
|
||||
int error = 1;
|
||||
int cmp_res;
|
||||
LINT_INIT(cmp_res);
|
||||
DBUG_ENTER("translate_master");
|
||||
|
||||
if (!mysql_bin_log.is_open())
|
||||
{
|
||||
strmov(errmsg,"Binary log is not open");
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (!server_id_supplied)
|
||||
{
|
||||
strmov(errmsg, "Misconfigured master - server id was not set");
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (mysql_bin_log.find_log_pos(&linfo, NullS, 1))
|
||||
{
|
||||
strmov(errmsg,"Could not find first log");
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
thd->current_linfo = &linfo;
|
||||
|
||||
bzero((char*) &log,sizeof(log));
|
||||
log_lock = mysql_bin_log.get_log_lock();
|
||||
mysql_mutex_lock(log_lock);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if ((file=open_binlog(&log, linfo.log_file_name, &errmsg_p)) < 0)
|
||||
{
|
||||
strmov(errmsg, errmsg_p);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!(sev = find_slave_event(&log, linfo.log_file_name, errmsg)))
|
||||
goto err;
|
||||
|
||||
cmp_res = cmp_master_pos(sev, mi);
|
||||
delete sev;
|
||||
|
||||
if (!cmp_res)
|
||||
{
|
||||
/* Copy basename */
|
||||
fn_format(mi->log_file_name, linfo.log_file_name, "","",1);
|
||||
mi->pos = my_b_tell(&log);
|
||||
goto mi_inited;
|
||||
}
|
||||
else if (cmp_res > 0)
|
||||
{
|
||||
if (!last_pos)
|
||||
{
|
||||
strmov(errmsg,
|
||||
"Slave event in first log points past the target position");
|
||||
goto err;
|
||||
}
|
||||
end_io_cache(&log);
|
||||
mysql_file_close(file, MYF(MY_WME));
|
||||
if (init_io_cache(&log, (file = last_file), IO_SIZE, READ_CACHE, 0, 0,
|
||||
MYF(MY_WME)))
|
||||
{
|
||||
errmsg[0] = 0;
|
||||
goto err;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
strmov(last_log_name, linfo.log_file_name);
|
||||
last_pos = my_b_tell(&log);
|
||||
|
||||
switch (mysql_bin_log.find_next_log(&linfo, 1)) {
|
||||
case LOG_INFO_EOF:
|
||||
if (last_file >= 0)
|
||||
mysql_file_close(last_file, MYF(MY_WME));
|
||||
last_file = -1;
|
||||
goto found_log;
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
strmov(errmsg, "Error reading log index");
|
||||
goto err;
|
||||
}
|
||||
|
||||
end_io_cache(&log);
|
||||
if (last_file >= 0)
|
||||
mysql_file_close(last_file, MYF(MY_WME));
|
||||
last_file = file;
|
||||
}
|
||||
|
||||
found_log:
|
||||
my_b_seek(&log, last_pos);
|
||||
if (find_target_pos(mi,&log,errmsg))
|
||||
goto err;
|
||||
fn_format(mi->log_file_name, last_log_name, "","",1); /* Copy basename */
|
||||
|
||||
mi_inited:
|
||||
error = 0;
|
||||
err:
|
||||
mysql_mutex_unlock(log_lock);
|
||||
end_io_cache(&log);
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
thd->current_linfo = 0;
|
||||
mysql_mutex_unlock(&LOCK_thread_count);
|
||||
if (file >= 0)
|
||||
mysql_file_close(file, MYF(MY_WME));
|
||||
if (last_file >= 0 && last_file != file)
|
||||
mysql_file_close(last_file, MYF(MY_WME));
|
||||
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Caller must delete result when done.
|
||||
*/
|
||||
|
||||
static Slave_log_event* find_slave_event(IO_CACHE* log,
|
||||
const char* log_file_name,
|
||||
char* errmsg)
|
||||
{
|
||||
Log_event* ev;
|
||||
int i;
|
||||
bool slave_event_found = 0;
|
||||
LINT_INIT(ev);
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
if (!(ev= Log_event::read_log_event(log, (mysql_mutex_t*)0, 0)))
|
||||
{
|
||||
my_snprintf(errmsg, SLAVE_ERRMSG_SIZE,
|
||||
"Error reading event in log '%s'",
|
||||
(char*)log_file_name);
|
||||
return 0;
|
||||
}
|
||||
if (ev->get_type_code() == SLAVE_EVENT)
|
||||
{
|
||||
slave_event_found = 1;
|
||||
break;
|
||||
}
|
||||
delete ev;
|
||||
}
|
||||
if (!slave_event_found)
|
||||
{
|
||||
my_snprintf(errmsg, SLAVE_ERRMSG_SIZE,
|
||||
"Could not find slave event in log '%s'",
|
||||
(char*)log_file_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (Slave_log_event*)ev;
|
||||
}
|
||||
|
||||
/**
|
||||
This function is broken now.
|
||||
|
||||
@seealso translate_master()
|
||||
*/
|
||||
|
||||
bool show_new_master(THD* thd)
|
||||
{
|
||||
Protocol *protocol= thd->protocol;
|
||||
DBUG_ENTER("show_new_master");
|
||||
List<Item> field_list;
|
||||
char errmsg[SLAVE_ERRMSG_SIZE];
|
||||
LEX_MASTER_INFO* lex_mi= &thd->lex->mi;
|
||||
|
||||
errmsg[0]=0; // Safety
|
||||
if (translate_master(thd, lex_mi, errmsg))
|
||||
{
|
||||
if (errmsg[0])
|
||||
my_error(ER_ERROR_WHEN_EXECUTING_COMMAND, MYF(0),
|
||||
"SHOW NEW MASTER", errmsg);
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
field_list.push_back(new Item_empty_string("Log_name", 20));
|
||||
field_list.push_back(new Item_return_int("Log_pos", 10,
|
||||
MYSQL_TYPE_LONGLONG));
|
||||
if (protocol->send_result_set_metadata(&field_list,
|
||||
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
||||
DBUG_RETURN(TRUE);
|
||||
protocol->prepare_for_resend();
|
||||
protocol->store(lex_mi->log_file_name, &my_charset_bin);
|
||||
protocol->store((ulonglong) lex_mi->pos);
|
||||
if (protocol->write())
|
||||
DBUG_RETURN(TRUE);
|
||||
my_eof(thd);
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Asks the master for the list of its other connected slaves.
|
||||
|
||||
This is for failsafe replication:
|
||||
in order for failsafe replication to work, the servers involved in
|
||||
replication must know of each other. We accomplish this by having each
|
||||
slave report to the master how to reach it, and on connection, each
|
||||
slave receives information about where the other slaves are.
|
||||
|
||||
@param mysql pre-existing connection to the master
|
||||
@param mi master info
|
||||
|
||||
@note
|
||||
mi is used only to give detailed error messages which include the
|
||||
hostname/port of the master, the username used by the slave to connect to
|
||||
the master.
|
||||
If the user used by the slave to connect to the master does not have the
|
||||
REPLICATION SLAVE privilege, it will pop in this function because
|
||||
SHOW SLAVE HOSTS will fail on the master.
|
||||
|
||||
@retval
|
||||
1 error
|
||||
@retval
|
||||
0 success
|
||||
*/
|
||||
|
||||
int update_slave_list(MYSQL* mysql, Master_info* mi)
|
||||
{
|
||||
MYSQL_RES* res=0;
|
||||
MYSQL_ROW row;
|
||||
const char* error=0;
|
||||
bool have_auth_info;
|
||||
int port_ind;
|
||||
DBUG_ENTER("update_slave_list");
|
||||
|
||||
if (mysql_real_query(mysql, STRING_WITH_LEN("SHOW SLAVE HOSTS")) ||
|
||||
!(res = mysql_store_result(mysql)))
|
||||
{
|
||||
error= mysql_error(mysql);
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch (mysql_num_fields(res)) {
|
||||
case 5:
|
||||
have_auth_info = 0;
|
||||
port_ind=2;
|
||||
break;
|
||||
case 7:
|
||||
have_auth_info = 1;
|
||||
port_ind=4;
|
||||
break;
|
||||
default:
|
||||
error= "the master returned an invalid number of fields for SHOW SLAVE \
|
||||
HOSTS";
|
||||
goto err;
|
||||
}
|
||||
|
||||
mysql_mutex_lock(&LOCK_slave_list);
|
||||
|
||||
while ((row= mysql_fetch_row(res)))
|
||||
{
|
||||
uint32 log_server_id;
|
||||
SLAVE_INFO* si, *old_si;
|
||||
log_server_id = atoi(row[0]);
|
||||
if ((old_si= (SLAVE_INFO*)my_hash_search(&slave_list,
|
||||
(uchar*)&log_server_id,4)))
|
||||
si = old_si;
|
||||
else
|
||||
{
|
||||
if (!(si = (SLAVE_INFO*)my_malloc(sizeof(SLAVE_INFO), MYF(MY_WME))))
|
||||
{
|
||||
error= "the slave is out of memory";
|
||||
mysql_mutex_unlock(&LOCK_slave_list);
|
||||
goto err;
|
||||
}
|
||||
si->server_id = log_server_id;
|
||||
if (my_hash_insert(&slave_list, (uchar*)si))
|
||||
{
|
||||
error= "the slave is out of memory";
|
||||
mysql_mutex_unlock(&LOCK_slave_list);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
strmake(si->host, row[1], sizeof(si->host)-1);
|
||||
si->port = atoi(row[port_ind]);
|
||||
si->rpl_recovery_rank = atoi(row[port_ind+1]);
|
||||
si->master_id = atoi(row[port_ind+2]);
|
||||
if (have_auth_info)
|
||||
{
|
||||
strmake(si->user, row[2], sizeof(si->user)-1);
|
||||
strmake(si->password, row[3], sizeof(si->password)-1);
|
||||
}
|
||||
}
|
||||
mysql_mutex_unlock(&LOCK_slave_list);
|
||||
|
||||
err:
|
||||
if (res)
|
||||
mysql_free_result(res);
|
||||
if (error)
|
||||
{
|
||||
sql_print_error("While trying to obtain the list of slaves from the master "
|
||||
"'%s:%d', user '%s' got the following error: '%s'",
|
||||
mi->host, mi->port, mi->user, error);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Execute a SHOW SLAVE HOSTS statement.
|
||||
|
@ -33,19 +33,12 @@ extern mysql_cond_t COND_rpl_status;
|
||||
extern TYPELIB rpl_role_typelib;
|
||||
extern const char* rpl_role_type[], *rpl_status_type[];
|
||||
|
||||
pthread_handler_t handle_failsafe_rpl(void *arg);
|
||||
void change_rpl_status(ulong from_status, ulong to_status);
|
||||
int find_recovery_captain(THD* thd, MYSQL* mysql);
|
||||
int update_slave_list(MYSQL* mysql, Master_info* mi);
|
||||
|
||||
extern HASH slave_list;
|
||||
|
||||
bool load_master_data(THD* thd);
|
||||
int connect_to_master(THD *thd, MYSQL* mysql, Master_info* mi);
|
||||
|
||||
bool show_new_master(THD* thd);
|
||||
bool show_slave_hosts(THD* thd);
|
||||
int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg);
|
||||
void init_slave_list();
|
||||
void end_slave_list();
|
||||
int register_slave(THD* thd, uchar* packet, uint packet_length);
|
||||
|
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