mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Manual merge from mysql-trunk-bugfixing.
Conflicts: - BUILD/SETUP.sh - mysql-test/mysql-test-run.pl - mysql-test/r/partition_error.result - mysql-test/t/disabled.def - mysql-test/t/partition_error.test - sql/share/errmsg-utf8.txt
This commit is contained in:
commit
8a247e963d
571 changed files with 28513 additions and 24883 deletions
|
@ -1,4 +1,4 @@
|
|||
[MYSQL]
|
||||
post_commit_to = "commits@lists.mysql.com"
|
||||
post_push_to = "commits@lists.mysql.com"
|
||||
tree_name = "mysql-trunk"
|
||||
tree_name = "mysql-trunk-bugfixing"
|
||||
|
|
10
.bzrignore
10
.bzrignore
|
@ -3085,3 +3085,13 @@ client/dtoa.c
|
|||
libmysqld/sql_audit.cc
|
||||
configure.am
|
||||
libmysqld/des_key_file.cc
|
||||
CPackConfig.cmake
|
||||
CPackSourceConfig.cmake
|
||||
make_dist.cmake
|
||||
client/echo
|
||||
libmysql/libmysql_exports_file.cc
|
||||
libmysql/merge_archives_mysqlclient.cmake
|
||||
libmysqld/merge_archives_mysqlserver.cmake
|
||||
libmysqld/mysqlserver_depends.c
|
||||
libmysqld/examples/mysql_embedded
|
||||
sql/.empty
|
||||
|
|
|
@ -25,8 +25,6 @@ EXTRA_DIST = FINISH.sh \
|
|||
check-cpu \
|
||||
cleanup \
|
||||
compile-alpha \
|
||||
compile-alpha-ccc \
|
||||
compile-alpha-cxx \
|
||||
compile-alpha-debug \
|
||||
compile-amd64-debug-max \
|
||||
compile-amd64-debug-max-no-ndb \
|
||||
|
|
|
@ -122,8 +122,9 @@ fi
|
|||
# Override -DFORCE_INIT_OF_VARS from debug_cflags. It enables the macro
|
||||
# LINT_INIT(), which is only useful for silencing spurious warnings
|
||||
# of static analysis tools. We want LINT_INIT() to be a no-op in Valgrind.
|
||||
valgrind_flags="-USAFEMALLOC -UFORCE_INIT_OF_VARS -DHAVE_purify "
|
||||
valgrind_flags="-UFORCE_INIT_OF_VARS -DHAVE_purify "
|
||||
valgrind_flags="$valgrind_flags -DMYSQL_SERVER_SUFFIX=-valgrind-max"
|
||||
valgrind_configs="--with-valgrind"
|
||||
#
|
||||
# Used in -debug builds
|
||||
debug_cflags="-DUNIV_MUST_NOT_INLINE -DEXTRA_DEBUG -DFORCE_INIT_OF_VARS "
|
||||
|
|
|
@ -1010,9 +1010,10 @@ set_ccache_usage()
|
|||
set_valgrind_flags()
|
||||
{
|
||||
if test "x$valgrind_flag" = "xyes" ; then
|
||||
loc_valgrind_flags="-USAFEMALLOC -UFORCE_INIT_OF_VARS -DHAVE_purify "
|
||||
loc_valgrind_flags="-UFORCE_INIT_OF_VARS -DHAVE_purify "
|
||||
loc_valgrind_flags="$loc_valgrind_flags -DMYSQL_SERVER_SUFFIX=-valgrind-max"
|
||||
compiler_flags="$compiler_flags $loc_valgrind_flags"
|
||||
with_flags="$with_flags --with-valgrind"
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
@ -1,41 +0,0 @@
|
|||
#! /bin/sh
|
||||
|
||||
/bin/rm -f */.deps/*.P */*.o
|
||||
make -k maintainer-clean
|
||||
/bin/rm -f */.deps/*.P */*.o
|
||||
/bin/rm -f config.cache mysql-*.tar.gz
|
||||
|
||||
path=`dirname $0`
|
||||
. "$path/autorun.sh"
|
||||
|
||||
CC=ccc CFLAGS="-fast -O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -mcpu=ev6 -Wa,-mev6" CXXLDFLAGS='/usr/lib/compaq/libots-2.2.7/libots.so /usr/lib/compaq/cpml-5.0.0/libcpml_ev6.a' ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-thread-safe-client
|
||||
make
|
||||
rm */.deps/*
|
||||
make
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
rm */.deps/*
|
||||
bin/mysqladmin shutdown
|
||||
sur make install
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
scripts/make_binary_distribution
|
||||
fi
|
||||
fi
|
||||
|
||||
exit
|
||||
|
||||
# This should give better performance by compiling many files at once, but
|
||||
# according to our benchmarks there isn't any real difference.
|
||||
|
||||
pwd=`pwd`
|
||||
for i in */make-ccc
|
||||
do
|
||||
cd `dirname $i`
|
||||
make-ccc
|
||||
cd $pwd
|
||||
done
|
||||
cd sql
|
||||
rm mysqld .deps/*.P
|
||||
make mysqld
|
||||
cd $pwd
|
|
@ -1,43 +0,0 @@
|
|||
#! /bin/sh
|
||||
|
||||
/bin/rm -f */.deps/*.P */*.o
|
||||
make -k maintainer-clean
|
||||
/bin/rm -f */.deps/*.P */*.o
|
||||
/bin/rm -f */.deps/*.P config.cache storage/innobase/config.cache mysql-*.tar.gz
|
||||
|
||||
path=`dirname $0`
|
||||
. "$path/autorun.sh"
|
||||
|
||||
CC=ccc CFLAGS="-fast" CXX=cxx CXXFLAGS="-fast -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared --without-extra-tools --disable-dependency-tracking
|
||||
|
||||
make -j2
|
||||
find . -name ".deps" | xargs rm -r
|
||||
make
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
find . -name ".deps" | xargs rm -r
|
||||
bin/mysqladmin shutdown
|
||||
sur make install
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
scripts/make_binary_distribution
|
||||
fi
|
||||
make test
|
||||
fi
|
||||
|
||||
exit
|
||||
|
||||
# This should give better performance by compiling many files at once, but
|
||||
# according to our benchmarks there isn't any real difference.
|
||||
|
||||
pwd=`pwd`
|
||||
for i in */make-ccc
|
||||
do
|
||||
cd `dirname $i`
|
||||
make-ccc
|
||||
cd $pwd
|
||||
done
|
||||
cd sql
|
||||
rm mysqld .deps/*.P
|
||||
make mysqld
|
||||
cd $pwd
|
|
@ -4,7 +4,7 @@ path=`dirname $0`
|
|||
. "$path/SETUP.sh"
|
||||
|
||||
extra_flags="$amd64_cflags $debug_cflags $valgrind_flags"
|
||||
extra_configs="$amd64_configs $debug_configs $max_configs"
|
||||
extra_configs="$amd64_configs $debug_configs $valgrind_configs $max_configs"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
||||
|
|
|
@ -29,6 +29,6 @@ extra_flags="$pentium_cflags $debug_cflags $valgrind_flags"
|
|||
c_warnings="-Wall -Wcheck -wd161,444,279,810,981,1292,1469,1572"
|
||||
cxx_warnings="$c_warnings -wd869,874"
|
||||
base_cxxflags="-fno-exceptions -fno-rtti"
|
||||
extra_configs="$pentium_configs $debug_configs"
|
||||
extra_configs="$pentium_configs $debug_configs $valgrind_configs"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
|
|
@ -4,7 +4,7 @@ path=`dirname $0`
|
|||
. "$path/SETUP.sh"
|
||||
|
||||
extra_flags="$pentium_cflags $debug_cflags $valgrind_flags"
|
||||
extra_configs="$pentium_configs $debug_configs $max_configs"
|
||||
extra_configs="$pentium_configs $debug_configs $valgrind_configs $max_configs"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ path=`dirname $0`
|
|||
. "$path/SETUP.sh"
|
||||
|
||||
extra_flags="$pentium_cflags $debug_cflags $valgrind_flags"
|
||||
extra_configs="$pentium_configs $debug_configs $max_no_ndb_configs"
|
||||
extra_configs="$pentium_configs $debug_configs $valgrind_configs $max_no_ndb_configs"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ path=`dirname $0`
|
|||
. "$path/SETUP.sh"
|
||||
|
||||
extra_flags="$pentium64_cflags $debug_cflags $valgrind_flags"
|
||||
extra_configs="$pentium_configs $debug_configs $max_configs"
|
||||
extra_configs="$pentium_configs $debug_configs $valgrind_configs $max_configs"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
||||
|
|
|
@ -262,6 +262,7 @@ IF(NOT WITHOUT_SERVER)
|
|||
ENDIF()
|
||||
|
||||
INCLUDE(cmake/abi_check.cmake)
|
||||
INCLUDE(cmake/tags.cmake)
|
||||
|
||||
CONFIGURE_FILE(config.h.cmake ${CMAKE_BINARY_DIR}/include/my_config.h)
|
||||
CONFIGURE_FILE(config.h.cmake ${CMAKE_BINARY_DIR}/include/config.h)
|
||||
|
|
|
@ -59,8 +59,6 @@ static char *server_version= NULL;
|
|||
/* Array of options to pass to libemysqld */
|
||||
#define MAX_SERVER_ARGS 64
|
||||
|
||||
void* sql_alloc(unsigned size); // Don't use mysqld alloc for these
|
||||
void sql_element_free(void *ptr);
|
||||
#include "sql_string.h"
|
||||
|
||||
extern "C" {
|
||||
|
@ -2318,8 +2316,10 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
|||
|
||||
#ifdef HAVE_READLINE
|
||||
|
||||
C_MODE_START
|
||||
static char *new_command_generator(const char *text, int);
|
||||
extern "C" char **new_mysql_completion (const char *text, int start, int end);
|
||||
static char **new_mysql_completion(const char *text, int start, int end);
|
||||
C_MODE_END
|
||||
|
||||
/*
|
||||
Tell the GNU Readline library how to complete. We want to try to complete
|
||||
|
@ -2451,9 +2451,9 @@ static void initialize_readline (char *name)
|
|||
array of matches, or NULL if there aren't any.
|
||||
*/
|
||||
|
||||
char **new_mysql_completion (const char *text,
|
||||
int start __attribute__((unused)),
|
||||
int end __attribute__((unused)))
|
||||
static char **new_mysql_completion(const char *text,
|
||||
int start __attribute__((unused)),
|
||||
int end __attribute__((unused)))
|
||||
{
|
||||
if (!status.batch && !quick)
|
||||
#if defined(USE_NEW_READLINE_INTERFACE)
|
||||
|
@ -4963,17 +4963,3 @@ static int com_prompt(String *buffer, char *line)
|
|||
tee_fprintf(stdout, "PROMPT set to '%s'\n", current_prompt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
/* Keep sql_string library happy */
|
||||
|
||||
void *sql_alloc(size_t Size)
|
||||
{
|
||||
return my_malloc(Size,MYF(MY_WME));
|
||||
}
|
||||
|
||||
void sql_element_free(void *ptr)
|
||||
{
|
||||
my_free(ptr,MYF(0));
|
||||
}
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
|
|
|
@ -77,11 +77,17 @@
|
|||
static int setenv(const char *name, const char *value, int overwrite);
|
||||
#endif
|
||||
|
||||
C_MODE_START
|
||||
static sig_handler signal_handler(int sig);
|
||||
static my_bool get_one_option(int optid, const struct my_option *,
|
||||
char *argument);
|
||||
C_MODE_END
|
||||
|
||||
enum {
|
||||
OPT_SKIP_SAFEMALLOC=OPT_MAX_CLIENT_OPTION,
|
||||
OPT_PS_PROTOCOL, OPT_SP_PROTOCOL, OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL,
|
||||
OPT_MAX_CONNECT_RETRIES, OPT_MAX_CONNECTIONS, OPT_MARK_PROGRESS,
|
||||
OPT_LOG_DIR, OPT_TAIL_LINES, OPT_RESULT_FORMAT_VERSION,
|
||||
OPT_LOG_DIR, OPT_TAIL_LINES, OPT_RESULT_FORMAT_VERSION
|
||||
};
|
||||
|
||||
static int record= 0, opt_sleep= -1;
|
||||
|
@ -462,7 +468,6 @@ void log_msg(const char *fmt, ...)
|
|||
VAR* var_from_env(const char *, const char *);
|
||||
VAR* var_init(VAR* v, const char *name, int name_len, const char *val,
|
||||
int val_len);
|
||||
void var_free(void* v);
|
||||
VAR* var_get(const char *var_name, const char** var_name_end,
|
||||
my_bool raw, my_bool ignore_not_existing);
|
||||
void eval_expr(VAR* v, const char *p, const char** p_end);
|
||||
|
@ -1914,6 +1919,8 @@ static void strip_parentheses(struct st_command *command)
|
|||
}
|
||||
|
||||
|
||||
C_MODE_START
|
||||
|
||||
static uchar *get_var_key(const uchar* var, size_t *len,
|
||||
my_bool __attribute__((unused)) t)
|
||||
{
|
||||
|
@ -1924,6 +1931,16 @@ static uchar *get_var_key(const uchar* var, size_t *len,
|
|||
}
|
||||
|
||||
|
||||
static void var_free(void *v)
|
||||
{
|
||||
my_free(((VAR*) v)->str_val, MYF(MY_WME));
|
||||
if (((VAR*)v)->alloced)
|
||||
my_free(v, MYF(MY_WME));
|
||||
}
|
||||
|
||||
C_MODE_END
|
||||
|
||||
|
||||
VAR *var_init(VAR *v, const char *name, int name_len, const char *val,
|
||||
int val_len)
|
||||
{
|
||||
|
@ -1966,14 +1983,6 @@ VAR *var_init(VAR *v, const char *name, int name_len, const char *val,
|
|||
}
|
||||
|
||||
|
||||
void var_free(void *v)
|
||||
{
|
||||
my_free(((VAR*) v)->str_val, MYF(MY_WME));
|
||||
if (((VAR*)v)->alloced)
|
||||
my_free(v, MYF(MY_WME));
|
||||
}
|
||||
|
||||
|
||||
VAR* var_from_env(const char *name, const char *def_val)
|
||||
{
|
||||
const char *tmp;
|
||||
|
@ -6070,8 +6079,7 @@ void read_embedded_server_arguments(const char *name)
|
|||
|
||||
|
||||
static my_bool
|
||||
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||
char *argument)
|
||||
get_one_option(int optid, const struct my_option *, char *argument)
|
||||
{
|
||||
switch(optid) {
|
||||
case '#':
|
||||
|
|
|
@ -24,13 +24,6 @@
|
|||
#include <m_string.h>
|
||||
#include <m_ctype.h>
|
||||
#include <mysql_com.h>
|
||||
/*
|
||||
The following extern declarations are ok as these are interface functions
|
||||
required by the string function
|
||||
*/
|
||||
|
||||
extern void sql_alloc(size_t size);
|
||||
extern void sql_element_free(void *ptr);
|
||||
|
||||
#include "sql_string.h"
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ EXTRA_DIST = \
|
|||
dtrace_prelink.cmake \
|
||||
versioninfo.rc.in \
|
||||
mysql_add_executable.cmake \
|
||||
tags.cmake \
|
||||
install_layout.cmake \
|
||||
build_configurations/mysql_release.cmake \
|
||||
os/Windows.cmake \
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
# Copyright (C) 2010 Sun Microsystems, Inc
|
||||
# Copyright (c) 2010, 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
|
||||
|
@ -15,6 +15,9 @@
|
|||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
# This file includes FreeBSD specific options and quirks, related to system checks
|
||||
#Legacy option, maybe not needed anymore , taken as is from autotools build
|
||||
ADD_DEFINITIONS(-DNET_RETRY_COUNT=1000000)
|
||||
|
||||
# Should not be needed any more, but kept for easy resurrection if needed
|
||||
# #Legacy option, maybe not needed anymore , taken as is from autotools build
|
||||
# ADD_DEFINITIONS(-DNET_RETRY_COUNT=1000000)
|
||||
|
||||
ADD_DEFINITIONS(-DHAVE_BROKEN_REALPATH)
|
||||
|
|
26
cmake/tags.cmake
Normal file
26
cmake/tags.cmake
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Copyright (c) 2010, 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
|
||||
|
||||
# Generate tag files
|
||||
IF(UNIX)
|
||||
ADD_CUSTOM_TARGET (tags
|
||||
COMMAND support-files/build-tags
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
ADD_CUSTOM_TARGET (ctags
|
||||
COMMAND ctags -R -f CTAGS
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
ENDIF()
|
|
@ -95,10 +95,9 @@ static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
|
|||
char *
|
||||
fn_tilde_expand(const char *txt)
|
||||
{
|
||||
struct passwd pwres, *pass;
|
||||
struct passwd *pass;
|
||||
char *temp;
|
||||
size_t len = 0;
|
||||
char pwbuf[1024];
|
||||
|
||||
if (txt[0] != '~')
|
||||
return (strdup(txt));
|
||||
|
|
|
@ -318,7 +318,9 @@ _rl_input_available ()
|
|||
return (_kbhit ());
|
||||
#endif
|
||||
|
||||
#if !defined (HAVE_SELECT)
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -282,6 +282,8 @@
|
|||
#cmakedefine HAVE_NETINET_IN6_H 1
|
||||
#cmakedefine HAVE_IPV6 1
|
||||
#cmakedefine ss_family @ss_family@
|
||||
#cmakedefine HAVE_SOCKADDR_IN_SIN_LEN 1
|
||||
#cmakedefine HAVE_SOCKADDR_IN6_SIN6_LEN 1
|
||||
#cmakedefine HAVE_TIMESPEC_TS_SEC 1
|
||||
#cmakedefine STRUCT_DIRENT_HAS_D_INO 1
|
||||
#cmakedefine STRUCT_DIRENT_HAS_D_NAMLEN 1
|
||||
|
|
|
@ -54,6 +54,15 @@ IF(NOT SYSTEM_TYPE)
|
|||
ENDIF()
|
||||
|
||||
|
||||
# Always enable -Wall for gnu C/C++
|
||||
IF(CMAKE_COMPILER_IS_GNUCXX)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unused-parameter")
|
||||
ENDIF()
|
||||
IF(CMAKE_COMPILER_IS_GNUCC)
|
||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
|
||||
ENDIF()
|
||||
|
||||
|
||||
IF(CMAKE_COMPILER_IS_GNUCXX)
|
||||
# MySQL "canonical" GCC flags. At least -fno-rtti flag affects
|
||||
# ABI and cannot be simply removed.
|
||||
|
@ -1000,6 +1009,21 @@ IF(NOT HAVE_SOCKADDR_STORAGE_SS_FAMILY)
|
|||
SET(ss_family __ss_family)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
#
|
||||
# Check if struct sockaddr_in::sin_len is available.
|
||||
#
|
||||
|
||||
CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in" sin_len
|
||||
"${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN_SIN_LEN)
|
||||
|
||||
#
|
||||
# Check if struct sockaddr_in6::sin6_len is available.
|
||||
#
|
||||
|
||||
CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_len
|
||||
"${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN6_SIN6_LEN)
|
||||
|
||||
SET(CMAKE_EXTRA_INCLUDE_FILES)
|
||||
|
||||
CHECK_STRUCT_HAS_MEMBER("struct dirent" d_ino "dirent.h" STRUCT_DIRENT_HAS_D_INO)
|
||||
|
|
86
configure.in
86
configure.in
|
@ -1,7 +1,7 @@
|
|||
dnl -*- ksh -*-
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
# Copyright (C) 2008-2009 Sun Microsystems, Inc
|
||||
# Copyright (c) 2000, 2010, 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
|
||||
|
@ -1013,6 +1013,66 @@ else
|
|||
AC_MSG_RESULT([yes])
|
||||
fi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Check if struct sockaddr_in::sin_len is available
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
AC_CACHE_CHECK(
|
||||
[if sockaddr_in::sin_len is available],
|
||||
mysql_cv_have_sockaddr_in_sin_len,
|
||||
AC_TRY_COMPILE(
|
||||
[
|
||||
#ifdef WIN32
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
],
|
||||
[unsigned int i = sizeof(((struct sockaddr_in *) 0)->sin_len)],
|
||||
mysql_cv_have_sockaddr_in_sin_len=yes,
|
||||
mysql_cv_have_sockaddr_in_sin_len=no))
|
||||
|
||||
if test "$mysql_cv_have_sockaddr_in_sin_len" = "yes"; then
|
||||
AC_DEFINE(
|
||||
[HAVE_SOCKADDR_IN_SIN_LEN],
|
||||
[1],
|
||||
[If sockaddr_in::sin_len is available])
|
||||
fi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Check if struct sockaddr_in6::sin6_len is available
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
AC_CACHE_CHECK(
|
||||
[if sockaddr_in6::sin6_len is available],
|
||||
mysql_cv_have_sockaddr_in6_sin6_len,
|
||||
AC_TRY_COMPILE(
|
||||
[
|
||||
#ifdef WIN32
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_NETINET_IN6_H
|
||||
#include <netinet/in6.h>
|
||||
#endif
|
||||
],
|
||||
[unsigned int i = sizeof(((struct sockaddr_in6 *) 0)->sin6_len)],
|
||||
mysql_cv_have_sockaddr_in6_sin6_len=yes,
|
||||
mysql_cv_have_sockaddr_in6_sin6_len=no))
|
||||
|
||||
if test "$mysql_cv_have_sockaddr_in_sin6_len" = "yes"; then
|
||||
AC_DEFINE(
|
||||
[HAVE_SOCKADDR_IN6_SIN6_LEN],
|
||||
[1],
|
||||
[If sockaddr_in6::sin6_len is available])
|
||||
fi
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
# Check for TCP wrapper support
|
||||
#--------------------------------------------------------------------
|
||||
|
@ -1236,14 +1296,22 @@ case $SYSTEM_TYPE in
|
|||
fi
|
||||
;;
|
||||
*freebsd*|*dragonfly*)
|
||||
AC_MSG_WARN([Adding fix for interrupted reads])
|
||||
dnl These dependencies have not really been checked for some time
|
||||
OSVERSION=`sysctl -a | grep osreldate | awk '{ print $2 }'`
|
||||
if test "$OSVERSION" -gt "480100" && \
|
||||
if test "$OSVERSION" -gt "600000"
|
||||
then
|
||||
# Post user-level threads, MYSQLD_NET_RETRY_COUNT is not needed any more
|
||||
AC_MSG_WARN([Adding fix for broken realpath])
|
||||
CFLAGS="$CFLAGS -DHAVE_BROKEN_REALPATH"
|
||||
CXXFLAGS="$CXXFLAGS -DHAVE_BROKEN_REALPATH"
|
||||
elif test "$OSVERSION" -gt "480100" && \
|
||||
test "$OSVERSION" -lt "500000" || \
|
||||
test "$OSVERSION" -gt "500109"
|
||||
then
|
||||
AC_MSG_WARN([Adding fix for interrupted reads])
|
||||
CXXFLAGS="$CXXFLAGS -DMYSQLD_NET_RETRY_COUNT=1000000"
|
||||
else
|
||||
AC_MSG_WARN([Adding fix for interrupted reads and broken realpath])
|
||||
CFLAGS="$CFLAGS -DHAVE_BROKEN_REALPATH"
|
||||
CXXFLAGS="$CXXFLAGS -DMYSQLD_NET_RETRY_COUNT=1000000 -DHAVE_BROKEN_REALPATH"
|
||||
fi
|
||||
|
@ -1845,6 +1913,17 @@ else
|
|||
CXXFLAGS="$OPTIMIZE_CXXFLAGS $CXXFLAGS"
|
||||
fi
|
||||
|
||||
AC_ARG_WITH([valgrind],
|
||||
[AS_HELP_STRING([--with-valgrind],
|
||||
[Valgrind instrumentation @<:@default=no@:>@])],
|
||||
[], [with_valgrind=no])
|
||||
|
||||
if test "$with_valgrind" != "no"
|
||||
then
|
||||
AC_CHECK_HEADERS([valgrind/valgrind.h valgrind/memcheck.h],
|
||||
[AC_DEFINE([HAVE_VALGRIND], [1], [Define for Valgrind support])])
|
||||
fi
|
||||
|
||||
# Debug Sync Facility. NOTE: depends on 'with_debug'. Must be behind it.
|
||||
AC_MSG_CHECKING(if Debug Sync Facility should be enabled.)
|
||||
AC_ARG_ENABLE(debug_sync,
|
||||
|
@ -3122,6 +3201,7 @@ esac
|
|||
|
||||
AC_SUBST([RDTSC_SPARC_ASSEMBLY])
|
||||
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
# Output results
|
||||
#--------------------------------------------------------------------
|
||||
|
|
|
@ -686,7 +686,7 @@ static ha_checksum checksum_format_specifier(const char* msg)
|
|||
case 'u':
|
||||
case 'x':
|
||||
case 's':
|
||||
chksum= my_checksum(chksum, start, (uint) (p + 1 - start));
|
||||
chksum= my_checksum(chksum, (uchar*) start, (uint) (p + 1 - start));
|
||||
start= 0; /* Not in format specifier anymore */
|
||||
break;
|
||||
|
||||
|
|
|
@ -269,7 +269,7 @@ int main(int argc,char *argv[])
|
|||
HA_ERRORS *ha_err_ptr;
|
||||
for (code=1 ; code < sys_nerr ; code++)
|
||||
{
|
||||
if (sys_errlist[code][0])
|
||||
if (sys_errlist[code] && sys_errlist[code][0])
|
||||
{ /* Skip if no error-text */
|
||||
printf("%3d = %s\n",code,sys_errlist[code]);
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ static int __cxa_pure_virtual() __attribute__((noinline, used));
|
|||
static int __cxa_pure_virtual()
|
||||
{
|
||||
// oops, pure virtual called!
|
||||
assert("Pure virtual method called." == "Aborted");
|
||||
assert(!"Pure virtual method called. Aborted");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -127,9 +127,6 @@ extern size_t bcmp(const uchar *s1,const uchar *s2,size_t len);
|
|||
extern size_t my_bcmp(const uchar *s1,const uchar *s2,size_t len);
|
||||
#undef bcmp
|
||||
#define bcmp(A,B,C) my_bcmp((A),(B),(C))
|
||||
#define bzero_if_purify(A,B) bzero(A,B)
|
||||
#else
|
||||
#define bzero_if_purify(A,B)
|
||||
#endif /* HAVE_purify */
|
||||
|
||||
#ifndef bmove512
|
||||
|
|
|
@ -23,6 +23,10 @@
|
|||
#define ALLOC_MAX_BLOCK_TO_DROP 4096
|
||||
#define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP 10
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct st_used_mem
|
||||
{ /* struct for once_alloc (block) */
|
||||
struct st_used_mem *next; /* Next block in use */
|
||||
|
@ -48,4 +52,9 @@ typedef struct st_mem_root
|
|||
|
||||
void (*error_handler)(void);
|
||||
} MEM_ROOT;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -562,6 +562,8 @@ typedef ulong ha_rows;
|
|||
#define HA_VARCHAR_PACKLENGTH(field_length) ((field_length) < 256 ? 1 :2)
|
||||
|
||||
/* invalidator function reference for Query Cache */
|
||||
C_MODE_START
|
||||
typedef void (* invalidator_by_filename)(const char * filename);
|
||||
C_MODE_END
|
||||
|
||||
#endif /* _my_base_h */
|
||||
|
|
|
@ -77,6 +77,11 @@
|
|||
#define C_MODE_END
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define CPP_UNNAMED_NS_START namespace {
|
||||
#define CPP_UNNAMED_NS_END }
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <my_config.h>
|
||||
#elif defined(__NETWARE__)
|
||||
|
@ -1074,6 +1079,17 @@ typedef long long my_ptrdiff_t;
|
|||
#define MY_DIV_UP(A, B) (((A) + (B) - 1) / (B))
|
||||
#define MY_ALIGNED_BYTE_ARRAY(N, S, T) T N[MY_DIV_UP(S, sizeof(T))]
|
||||
|
||||
#ifdef __cplusplus
|
||||
template <size_t sz> struct Aligned_char_array
|
||||
{
|
||||
union {
|
||||
void *v; // Ensures alignment.
|
||||
char arr[sz]; // The actual buffer.
|
||||
} u;
|
||||
void* arr() { return &u.arr[0]; }
|
||||
};
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/*
|
||||
Custom version of standard offsetof() macro which can be used to get
|
||||
offsets of members in class for non-POD types (according to the current
|
||||
|
|
|
@ -712,7 +712,6 @@ extern my_bool my_thread_init(void);
|
|||
extern void my_thread_end(void);
|
||||
extern const char *my_thread_name(void);
|
||||
extern my_thread_id my_thread_dbug_id(void);
|
||||
extern int pthread_no_free(void *);
|
||||
extern int pthread_dummy(int);
|
||||
|
||||
/* All thread specific variables are in the following struct */
|
||||
|
|
|
@ -28,6 +28,19 @@ typedef struct my_aio_result {
|
|||
} my_aio_result;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_VALGRIND
|
||||
# include <valgrind/memcheck.h>
|
||||
# define MEM_UNDEFINED(a,len) VALGRIND_MAKE_MEM_UNDEFINED(a,len)
|
||||
# define MEM_NOACCESS(a,len) VALGRIND_MAKE_MEM_NOACCESS(a,len)
|
||||
# define MEM_CHECK_ADDRESSABLE(a,len) VALGRIND_CHECK_MEM_IS_ADDRESSABLE(a,len)
|
||||
# define MEM_CHECK_DEFINED(a,len) VALGRIND_CHECK_MEM_IS_DEFINED(a,len)
|
||||
#else /* HAVE_VALGRIND */
|
||||
# define MEM_UNDEFINED(a,len) ((void) 0)
|
||||
# define MEM_NOACCESS(a,len) ((void) 0)
|
||||
# define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0)
|
||||
# define MEM_CHECK_DEFINED(a,len) ((void) 0)
|
||||
#endif /* HAVE_VALGRIND */
|
||||
|
||||
#ifndef THREAD
|
||||
extern int NEAR my_errno; /* Last error in mysys */
|
||||
#else
|
||||
|
@ -41,8 +54,6 @@ extern int NEAR my_errno; /* Last error in mysys */
|
|||
#include <malloc.h> /*for alloca*/
|
||||
#endif
|
||||
|
||||
#define MYSYS_PROGRAM_USES_CURSES() { error_handler_hook = my_message_curses; mysys_uses_curses=1; }
|
||||
#define MYSYS_PROGRAM_DONT_USE_CURSES() { error_handler_hook = my_message_no_curses; mysys_uses_curses=0;}
|
||||
#define MY_INIT(name); { my_progname= name; my_init(); }
|
||||
|
||||
/**
|
||||
|
@ -156,7 +167,7 @@ extern int NEAR my_errno; /* Last error in mysys */
|
|||
#define my_memdup(A,B,C) _my_memdup((A),(B), __FILE__,__LINE__,C)
|
||||
#define my_strdup(A,C) _my_strdup((A), __FILE__,__LINE__,C)
|
||||
#define my_strndup(A,B,C) _my_strndup((A),(B),__FILE__,__LINE__,C)
|
||||
#define TRASH(A,B) bfill(A, B, 0x8F)
|
||||
#define TRASH(A,B) do { bfill(A, B, 0x8F); MEM_UNDEFINED(A, B); } while (0)
|
||||
#define QUICK_SAFEMALLOC sf_malloc_quick=1
|
||||
#define NORMAL_SAFEMALLOC sf_malloc_quick=0
|
||||
extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick;
|
||||
|
@ -184,7 +195,7 @@ extern char *my_strndup(const char *from, size_t length,
|
|||
#define CALLER_INFO_PROTO /* nothing */
|
||||
#define CALLER_INFO /* nothing */
|
||||
#define ORIG_CALLER_INFO /* nothing */
|
||||
#define TRASH(A,B) /* nothing */
|
||||
#define TRASH(A,B) do{MEM_CHECK_ADDRESSABLE(A,B);MEM_UNDEFINED(A,B);} while (0)
|
||||
#endif
|
||||
|
||||
#if defined(ENABLED_DEBUG_SYNC)
|
||||
|
@ -272,7 +283,7 @@ extern int NEAR my_umask_dir,
|
|||
NEAR my_recived_signals, /* Signals we have got */
|
||||
NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
|
||||
NEAR my_dont_interrupt; /* call remember_intr when set */
|
||||
extern my_bool NEAR mysys_uses_curses, my_use_symdir;
|
||||
extern my_bool NEAR my_use_symdir;
|
||||
extern size_t sf_malloc_cur_memory, sf_malloc_max_memory;
|
||||
|
||||
extern ulong my_default_record_cache_size;
|
||||
|
@ -669,7 +680,6 @@ extern int nt_share_delete(const char *name,myf MyFlags);
|
|||
|
||||
#ifdef _WIN32
|
||||
/* Windows-only functions (CRT equivalents)*/
|
||||
extern File my_sopen(const char *path, int oflag, int shflag, int pmode);
|
||||
extern HANDLE my_get_osfhandle(File fd);
|
||||
extern void my_osmaperr(unsigned long last_error);
|
||||
#endif
|
||||
|
@ -698,8 +708,7 @@ extern int my_error_register(const char** (*get_errmsgs) (),
|
|||
int first, int last);
|
||||
extern const char **my_error_unregister(int first, int last);
|
||||
extern void my_message(uint my_err, const char *str,myf MyFlags);
|
||||
extern void my_message_no_curses(uint my_err, const char *str,myf MyFlags);
|
||||
extern void my_message_curses(uint my_err, const char *str,myf MyFlags);
|
||||
extern void my_message_stderr(uint my_err, const char *str, myf MyFlags);
|
||||
extern my_bool my_basic_init(void);
|
||||
extern my_bool my_init(void);
|
||||
extern void my_end(int infoflag);
|
||||
|
|
|
@ -197,7 +197,14 @@ enum enum_server_command
|
|||
& ~CLIENT_COMPRESS) \
|
||||
& ~CLIENT_SSL_VERIFY_SERVER_CERT)
|
||||
|
||||
#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */
|
||||
/**
|
||||
Is raised when a multi-statement transaction
|
||||
has been started, either explicitly, by means
|
||||
of BEGIN or COMMIT AND CHAIN, or
|
||||
implicitly, by the first transactional
|
||||
statement, when autocommit=off.
|
||||
*/
|
||||
#define SERVER_STATUS_IN_TRANS 1
|
||||
#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */
|
||||
#define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */
|
||||
#define SERVER_QUERY_NO_GOOD_INDEX_USED 16
|
||||
|
|
|
@ -56,7 +56,7 @@ mysysobjects1 = my_init.lo my_static.lo my_malloc.lo my_realloc.lo \
|
|||
my_create.lo my_delete.lo mf_tempfile.lo my_open.lo \
|
||||
my_file.lo my_read.lo my_write.lo errors.lo \
|
||||
my_error.lo my_getwd.lo my_div.lo \
|
||||
mf_pack.lo my_messnc.lo mf_dirname.lo mf_fn_ext.lo\
|
||||
mf_pack.lo my_mess.lo mf_dirname.lo mf_fn_ext.lo\
|
||||
mf_wcomp.lo typelib.lo safemalloc.lo my_alloc.lo \
|
||||
mf_format.lo mf_path.lo mf_unixpath.lo my_fopen.lo \
|
||||
my_symlink.lo my_fstream.lo mf_arr_appstr.lo \
|
||||
|
|
|
@ -953,7 +953,8 @@ bool Protocol::send_result_set_metadata(List<Item> *list, uint flags)
|
|||
server_field.type <= (int) MYSQL_TYPE_BLOB) ?
|
||||
server_field.length / item->collation.collation->mbminlen :
|
||||
server_field.length / item->collation.collation->mbmaxlen;
|
||||
client_field->length= max_char_len * thd_cs->mbmaxlen;
|
||||
client_field->length= char_to_byte_length_safe(max_char_len,
|
||||
thd_cs->mbmaxlen);
|
||||
}
|
||||
client_field->type= server_field.type;
|
||||
client_field->flags= server_field.flags;
|
||||
|
|
96
mysql-test/include/check_concurrent_insert.inc
Normal file
96
mysql-test/include/check_concurrent_insert.inc
Normal file
|
@ -0,0 +1,96 @@
|
|||
#
|
||||
# SUMMARY
|
||||
# Check if statement reading table '$table' allows concurrent
|
||||
# inserts in it.
|
||||
#
|
||||
# PARAMETERS
|
||||
# $table Table in which concurrent inserts should be allowed.
|
||||
# $con_aux1 Name of the first auxiliary connection to be used by this
|
||||
# script.
|
||||
# $con_aux2 Name of the second auxiliary connection to be used by this
|
||||
# script.
|
||||
# $statement Statement to be checked.
|
||||
# $restore_table Table which might be modified affected by statement to be
|
||||
# checked and thus needs backing up before its execution
|
||||
# and restoring after it (can be empty).
|
||||
#
|
||||
# EXAMPLE
|
||||
# lock_sync.test
|
||||
#
|
||||
--disable_result_log
|
||||
--disable_query_log
|
||||
|
||||
# Reset DEBUG_SYNC facility for safety.
|
||||
set debug_sync= "RESET";
|
||||
|
||||
if (`SELECT '$restore_table' <> ''`)
|
||||
{
|
||||
--eval create table t_backup select * from $restore_table;
|
||||
}
|
||||
|
||||
connection $con_aux1;
|
||||
set debug_sync='after_lock_tables_takes_lock SIGNAL parked WAIT_FOR go';
|
||||
--send_eval $statement;
|
||||
|
||||
connection $con_aux2;
|
||||
set debug_sync='now WAIT_FOR parked';
|
||||
--send_eval insert into $table values (0);
|
||||
|
||||
--enable_result_log
|
||||
--enable_query_log
|
||||
connection default;
|
||||
# Wait until concurrent insert is successfully executed while
|
||||
# statement being checked has its tables locked.
|
||||
# We use wait_condition.inc instead of simply executing
|
||||
# concurrent insert here in order to avoid deadlocks if test
|
||||
# fails and timing out instead.
|
||||
let $wait_condition=
|
||||
select count(*) = 0 from information_schema.processlist
|
||||
where info = "insert into $table values (0)";
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--disable_result_log
|
||||
--disable_query_log
|
||||
|
||||
if ($success)
|
||||
{
|
||||
# Apparently concurrent insert was successfully executed.
|
||||
# To be safe against wait_condition.inc succeeding due to
|
||||
# races let us first reap concurrent insert to ensure that
|
||||
# it has really been successfully executed.
|
||||
connection $con_aux2;
|
||||
--reap
|
||||
connection default;
|
||||
set debug_sync= 'now SIGNAL go';
|
||||
connection $con_aux1;
|
||||
--reap
|
||||
connection default;
|
||||
--echo Success: '$statement' allows concurrent inserts into '$table'.
|
||||
}
|
||||
if (!$success)
|
||||
{
|
||||
# Waiting has timed out. Apparently concurrent insert was blocked.
|
||||
# So to be able to continue we need to end our statement first.
|
||||
set debug_sync= 'now SIGNAL go';
|
||||
connection $con_aux1;
|
||||
--reap
|
||||
connection $con_aux2;
|
||||
--reap
|
||||
connection default;
|
||||
--echo Error: '$statement' doesn't allow concurrent inserts into '$table'!
|
||||
}
|
||||
|
||||
--eval delete from $table where i = 0;
|
||||
|
||||
if (`SELECT '$restore_table' <> ''`)
|
||||
{
|
||||
--eval truncate table $restore_table;
|
||||
--eval insert into $restore_table select * from t_backup;
|
||||
drop table t_backup;
|
||||
}
|
||||
|
||||
# Clean-up. Reset DEBUG_SYNC facility after use.
|
||||
set debug_sync= "RESET";
|
||||
|
||||
--enable_result_log
|
||||
--enable_query_log
|
81
mysql-test/include/check_no_concurrent_insert.inc
Normal file
81
mysql-test/include/check_no_concurrent_insert.inc
Normal file
|
@ -0,0 +1,81 @@
|
|||
#
|
||||
# SUMMARY
|
||||
# Check that statement reading table '$table' doesn't allow concurrent
|
||||
# inserts in it.
|
||||
#
|
||||
# PARAMETERS
|
||||
# $table Table in which concurrent inserts should be disallowed.
|
||||
# $con_aux1 Name of the first auxiliary connection to be used by this
|
||||
# script.
|
||||
# $con_aux2 Name of the second auxiliary connection to be used by this
|
||||
# script.
|
||||
# $statement Statement to be checked.
|
||||
# $restore_table Table which might be modified affected by statement to be
|
||||
# checked and thus needs backing up before its execution
|
||||
# and restoring after it (can be empty).
|
||||
#
|
||||
# EXAMPLE
|
||||
# lock_sync.test
|
||||
#
|
||||
--disable_result_log
|
||||
--disable_query_log
|
||||
|
||||
# Reset DEBUG_SYNC facility for safety.
|
||||
set debug_sync= "RESET";
|
||||
|
||||
if (`SELECT '$restore_table' <> ''`)
|
||||
{
|
||||
--eval create table t_backup select * from $restore_table;
|
||||
}
|
||||
|
||||
connection $con_aux1;
|
||||
set debug_sync='after_lock_tables_takes_lock SIGNAL parked WAIT_FOR go';
|
||||
--send_eval $statement;
|
||||
|
||||
connection $con_aux2;
|
||||
set debug_sync='now WAIT_FOR parked';
|
||||
--send_eval insert into $table values (0);
|
||||
|
||||
--enable_result_log
|
||||
--enable_query_log
|
||||
connection default;
|
||||
# Wait until concurrent insert is successfully blocked because
|
||||
# of our statement.
|
||||
let $wait_condition=
|
||||
select count(*) = 1 from information_schema.processlist
|
||||
where state = "Table lock" and info = "insert into $table values (0)";
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--disable_result_log
|
||||
--disable_query_log
|
||||
|
||||
set debug_sync= 'now SIGNAL go';
|
||||
connection $con_aux1;
|
||||
--reap
|
||||
connection $con_aux2;
|
||||
--reap
|
||||
connection default;
|
||||
|
||||
if ($success)
|
||||
{
|
||||
--echo Success: '$statement' doesn't allow concurrent inserts into '$table'.
|
||||
}
|
||||
if (!$success)
|
||||
{
|
||||
--echo Error: '$statement' allows concurrent inserts into '$table'!
|
||||
}
|
||||
|
||||
--eval delete from $table where i = 0;
|
||||
|
||||
if (`SELECT '$restore_table' <> ''`)
|
||||
{
|
||||
--eval truncate table $restore_table;
|
||||
--eval insert into $restore_table select * from t_backup;
|
||||
drop table t_backup;
|
||||
}
|
||||
|
||||
# Clean-up. Reset DEBUG_SYNC facility after use.
|
||||
set debug_sync= "RESET";
|
||||
|
||||
--enable_result_log
|
||||
--enable_query_log
|
71
mysql-test/include/check_no_row_lock.inc
Normal file
71
mysql-test/include/check_no_row_lock.inc
Normal file
|
@ -0,0 +1,71 @@
|
|||
#
|
||||
# SUMMARY
|
||||
# Check if statement affecting or reading table '$table' doesn't
|
||||
# take any kind of locks on its rows.
|
||||
#
|
||||
# PARAMETERS
|
||||
# $table Table for which presence of row locks should be checked.
|
||||
# $con_aux Name of auxiliary connection to be used by this script.
|
||||
# $statement Statement to be checked.
|
||||
#
|
||||
# EXAMPLE
|
||||
# innodb_mysql_lock2.test
|
||||
#
|
||||
--disable_result_log
|
||||
--disable_query_log
|
||||
|
||||
connection default;
|
||||
begin;
|
||||
--eval select * from $table for update;
|
||||
|
||||
connection $con_aux;
|
||||
begin;
|
||||
--send_eval $statement;
|
||||
|
||||
--enable_result_log
|
||||
--enable_query_log
|
||||
|
||||
connection default;
|
||||
# Wait until statement is successfully executed while
|
||||
# all rows in table are X-locked. This means that it
|
||||
# does not acquire any row locks.
|
||||
# We use wait_condition.inc instead of simply executing
|
||||
# statement here in order to avoid deadlocks if test
|
||||
# fails and timing out instead.
|
||||
let $wait_condition=
|
||||
select count(*) = 0 from information_schema.processlist
|
||||
where info = "$statement";
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--disable_result_log
|
||||
--disable_query_log
|
||||
|
||||
if ($success)
|
||||
{
|
||||
# Apparently statement was successfully executed and thus it
|
||||
# has not required any row locks.
|
||||
# To be safe against wait_condition.inc succeeding due to
|
||||
# races let us first reap the statement being checked to
|
||||
# ensure that it has been successfully executed.
|
||||
connection $con_aux;
|
||||
--reap
|
||||
rollback;
|
||||
connection default;
|
||||
rollback;
|
||||
--echo Success: '$statement' doesn't take row locks on '$table'.
|
||||
}
|
||||
if (!$success)
|
||||
{
|
||||
# Waiting has timed out. Apparently statement was blocked on
|
||||
# some row lock. So to be able to continue we need to unlock
|
||||
# rows first.
|
||||
rollback;
|
||||
connection $con_aux;
|
||||
--reap
|
||||
rollback;
|
||||
connection default;
|
||||
--echo Error: '$statement' takes some row locks on '$table'!
|
||||
}
|
||||
|
||||
--enable_result_log
|
||||
--enable_query_log
|
61
mysql-test/include/check_shared_row_lock.inc
Normal file
61
mysql-test/include/check_shared_row_lock.inc
Normal file
|
@ -0,0 +1,61 @@
|
|||
#
|
||||
# SUMMARY
|
||||
# Check if statement reading table '$table' takes shared locks
|
||||
# on some of its rows.
|
||||
#
|
||||
# PARAMETERS
|
||||
# $table Table for which presence of row locks should be checked.
|
||||
# $con_aux Name of auxiliary connection to be used by this script.
|
||||
# $statement Statement to be checked.
|
||||
# $wait_statement Sub-statement which is supposed to acquire locks (should
|
||||
# be the same as $statement for ordinary statements).
|
||||
#
|
||||
# EXAMPLE
|
||||
# innodb_mysql_lock2.test
|
||||
#
|
||||
--disable_result_log
|
||||
--disable_query_log
|
||||
|
||||
connection default;
|
||||
begin;
|
||||
--eval select * from $table for update;
|
||||
|
||||
connection $con_aux;
|
||||
begin;
|
||||
--send_eval $statement;
|
||||
|
||||
--enable_result_log
|
||||
--enable_query_log
|
||||
|
||||
connection default;
|
||||
# Wait until statement is successfully blocked because
|
||||
# all rows in table are X-locked. This means that at
|
||||
# least it acquires S-locks on some of rows.
|
||||
let $wait_condition=
|
||||
select count(*) = 1 from information_schema.processlist
|
||||
where state in ("Sending data","statistics", "preparing") and
|
||||
info = "$wait_statement";
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--disable_result_log
|
||||
--disable_query_log
|
||||
|
||||
rollback;
|
||||
|
||||
connection $con_aux;
|
||||
--reap
|
||||
rollback;
|
||||
|
||||
connection default;
|
||||
--enable_result_log
|
||||
--enable_query_log
|
||||
|
||||
if ($success)
|
||||
{
|
||||
--echo Success: '$statement' takes shared row locks on '$table'.
|
||||
}
|
||||
|
||||
if (!$success)
|
||||
{
|
||||
--echo Error: '$statement' hasn't taken shared row locks on '$table'!
|
||||
}
|
|
@ -1,6 +1,11 @@
|
|||
# Test if MYSQLTEST_VARDIR is a soft link
|
||||
# If we run in parallel, we have a suffix "/$child_num", so chop off that.
|
||||
|
||||
perl;
|
||||
my $path= $ENV{'MYSQLTEST_VARDIR'};
|
||||
$path=~ s|/\d+$||;
|
||||
open (ISLINK, ">" . $ENV{'MYSQL_TMP_DIR'} . "/mtr_var_link");
|
||||
my $mvr= -l $ENV{'MYSQLTEST_VARDIR'} ? 1 : 0;
|
||||
my $mvr= -l $path ? 1 : 0;
|
||||
print ISLINK "let \$mtr_var_link= $mvr;\n";
|
||||
close ISLINK;
|
||||
EOF
|
||||
|
|
|
@ -2114,7 +2114,7 @@ sub environment_setup {
|
|||
# mysqlhotcopy
|
||||
# ----------------------------------------------------
|
||||
my $mysqlhotcopy=
|
||||
mtr_pl_maybe_exists("$basedir/scripts/mysqlhotcopy");
|
||||
mtr_pl_maybe_exists("$bindir/scripts/mysqlhotcopy");
|
||||
# Since mysqltest interprets the real path as "false" in an if,
|
||||
# use 1 ("true") to indicate "not exists" so it can be tested for
|
||||
$ENV{'MYSQLHOTCOPY'}= $mysqlhotcopy || 1;
|
||||
|
|
|
@ -1366,3 +1366,7 @@ ERROR HY000: Incorrect prefix key; the used key part isn't a string, the used le
|
|||
CREATE INDEX i2 ON t1 (a(20));
|
||||
ERROR HY000: Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (id int);
|
||||
INSERT INTO t1 VALUES (1), (2);
|
||||
ALTER TABLE t1 ADD COLUMN (f1 INT), ADD COLUMN (f2 INT), ADD KEY f2k(f2);
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -12,7 +12,7 @@ INSERT INTO t2 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
|
|||
START TRANSACTION;
|
||||
# in thread2
|
||||
REPLACE INTO t2 VALUES (-17);
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d);
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d) LOCK IN SHARE MODE;
|
||||
d
|
||||
# in thread1
|
||||
REPLACE INTO t1(a,b) VALUES (67,20);
|
||||
|
@ -21,10 +21,10 @@ COMMIT;
|
|||
START TRANSACTION;
|
||||
REPLACE INTO t1(a,b) VALUES (65,-50);
|
||||
REPLACE INTO t2 VALUES (-91);
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d);
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d) LOCK IN SHARE MODE;
|
||||
# in thread1
|
||||
# should not crash
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d);
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d) LOCK IN SHARE MODE;
|
||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||
# in thread2
|
||||
d
|
||||
|
|
|
@ -1977,3 +1977,59 @@ CREATE TABLE t1 LIKE t2;
|
|||
ERROR 42S01: Table 't1' already exists
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #48800 CREATE TABLE t...SELECT fails if t is a
|
||||
# temporary table
|
||||
#
|
||||
CREATE TEMPORARY TABLE t1 (a INT);
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TEMPORARY TABLE t2 (a INT);
|
||||
CREATE VIEW t2 AS SELECT 1;
|
||||
CREATE TABLE t3 (a INT);
|
||||
CREATE TEMPORARY TABLE t3 SELECT 1;
|
||||
CREATE TEMPORARY TABLE t4 (a INT);
|
||||
CREATE TABLE t4 AS SELECT 1;
|
||||
DROP TEMPORARY TABLE t1, t2, t3, t4;
|
||||
DROP TABLE t1, t3, t4;
|
||||
DROP VIEW t2;
|
||||
#
|
||||
# Bug #49193 CREATE TABLE reacts differently depending
|
||||
# on whether data is selected or not
|
||||
#
|
||||
CREATE TEMPORARY TABLE t2 (ID INT);
|
||||
INSERT INTO t2 VALUES (1),(2),(3);
|
||||
CREATE TEMPORARY TABLE t1 (ID INT);
|
||||
CREATE TABLE IF NOT EXISTS t1 (ID INT);
|
||||
INSERT INTO t1 SELECT * FROM t2;
|
||||
SELECT * FROM t1;
|
||||
ID
|
||||
1
|
||||
2
|
||||
3
|
||||
DROP TEMPORARY TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
ID
|
||||
DROP TABLE t1;
|
||||
CREATE TEMPORARY TABLE t1 (ID INT);
|
||||
CREATE TABLE IF NOT EXISTS t1 SELECT * FROM t2;
|
||||
SELECT * FROM t1;
|
||||
ID
|
||||
DROP TEMPORARY TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
ID
|
||||
1
|
||||
2
|
||||
3
|
||||
DROP TABLE t1;
|
||||
CREATE TEMPORARY TABLE t1 (ID INT);
|
||||
CREATE TABLE t1 SELECT * FROM t2;
|
||||
SELECT * FROM t1;
|
||||
ID
|
||||
DROP TEMPORARY TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
ID
|
||||
1
|
||||
2
|
||||
3
|
||||
DROP TABLE t1;
|
||||
DROP TEMPORARY TABLE t2;
|
||||
|
|
|
@ -1034,5 +1034,48 @@ DROP TABLE t1;
|
|||
SET max_sort_length=DEFAULT;
|
||||
SET NAMES latin1;
|
||||
#
|
||||
# Bug#52520 Difference in tinytext utf column metadata
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
s1 TINYTEXT CHARACTER SET utf16,
|
||||
s2 TEXT CHARACTER SET utf16,
|
||||
s3 MEDIUMTEXT CHARACTER SET utf16,
|
||||
s4 LONGTEXT CHARACTER SET utf16
|
||||
);
|
||||
SET NAMES utf8, @@character_set_results=NULL;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 255 0 Y 16 0 54
|
||||
def test t1 t1 s2 s2 252 65535 0 Y 16 0 54
|
||||
def test t1 t1 s3 s3 252 16777215 0 Y 16 0 54
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 54
|
||||
def HEX(s1) 253 6120 0 Y 0 0 33
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
SET NAMES latin1;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 127 0 Y 16 0 8
|
||||
def test t1 t1 s2 s2 252 32767 0 Y 16 0 8
|
||||
def test t1 t1 s3 s3 252 8388607 0 Y 16 0 8
|
||||
def test t1 t1 s4 s4 252 2147483647 0 Y 16 0 8
|
||||
def HEX(s1) 253 2040 0 Y 0 0 8
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
SET NAMES utf8;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 381 0 Y 16 0 33
|
||||
def test t1 t1 s2 s2 252 98301 0 Y 16 0 33
|
||||
def test t1 t1 s3 s3 252 25165821 0 Y 16 0 33
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 33
|
||||
def HEX(s1) 253 6120 0 Y 0 0 33
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
CREATE TABLE t2 AS SELECT CONCAT(s1) FROM t1;
|
||||
SHOW CREATE TABLE t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`CONCAT(s1)` varchar(255) CHARACTER SET utf16 DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
|
|
@ -1048,5 +1048,48 @@ DROP TABLE t1;
|
|||
SET max_sort_length=DEFAULT;
|
||||
SET NAMES latin1;
|
||||
#
|
||||
# Bug#52520 Difference in tinytext utf column metadata
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
s1 TINYTEXT CHARACTER SET utf32,
|
||||
s2 TEXT CHARACTER SET utf32,
|
||||
s3 MEDIUMTEXT CHARACTER SET utf32,
|
||||
s4 LONGTEXT CHARACTER SET utf32
|
||||
);
|
||||
SET NAMES utf8mb4, @@character_set_results=NULL;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 255 0 Y 16 0 60
|
||||
def test t1 t1 s2 s2 252 65535 0 Y 16 0 60
|
||||
def test t1 t1 s3 s3 252 16777215 0 Y 16 0 60
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 60
|
||||
def HEX(s1) 253 8160 0 Y 0 0 45
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
SET NAMES latin1;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 63 0 Y 16 0 8
|
||||
def test t1 t1 s2 s2 252 16383 0 Y 16 0 8
|
||||
def test t1 t1 s3 s3 252 4194303 0 Y 16 0 8
|
||||
def test t1 t1 s4 s4 252 1073741823 0 Y 16 0 8
|
||||
def HEX(s1) 253 2040 0 Y 0 0 8
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
SET NAMES utf8mb4;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 252 0 Y 16 0 45
|
||||
def test t1 t1 s2 s2 252 65532 0 Y 16 0 45
|
||||
def test t1 t1 s3 s3 252 16777212 0 Y 16 0 45
|
||||
def test t1 t1 s4 s4 252 4294967292 0 Y 16 0 45
|
||||
def HEX(s1) 253 8160 0 Y 0 0 45
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
CREATE TABLE t2 AS SELECT CONCAT(s1) FROM t1;
|
||||
SHOW CREATE TABLE t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`CONCAT(s1)` varchar(255) CHARACTER SET utf32 DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
|
|
@ -2041,3 +2041,52 @@ predicted_order hex(utf8_encoding)
|
|||
101 E0B78AE2808DE0B6BB
|
||||
DROP TABLE t1;
|
||||
End of 5.4 tests
|
||||
#
|
||||
# Start of 5.5 tests
|
||||
#
|
||||
#
|
||||
# Bug#52520 Difference in tinytext utf column metadata
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
s1 TINYTEXT CHARACTER SET utf8,
|
||||
s2 TEXT CHARACTER SET utf8,
|
||||
s3 MEDIUMTEXT CHARACTER SET utf8,
|
||||
s4 LONGTEXT CHARACTER SET utf8
|
||||
);
|
||||
SET NAMES utf8, @@character_set_results=NULL;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 255 0 Y 16 0 33
|
||||
def test t1 t1 s2 s2 252 65535 0 Y 16 0 33
|
||||
def test t1 t1 s3 s3 252 16777215 0 Y 16 0 33
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 33
|
||||
def HEX(s1) 253 4590 0 Y 0 0 33
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
SET NAMES latin1;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 255 0 Y 16 0 8
|
||||
def test t1 t1 s2 s2 252 65535 0 Y 16 0 8
|
||||
def test t1 t1 s3 s3 252 16777215 0 Y 16 0 8
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 8
|
||||
def HEX(s1) 253 1530 0 Y 0 0 8
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
SET NAMES utf8;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 765 0 Y 16 0 33
|
||||
def test t1 t1 s2 s2 252 196605 0 Y 16 0 33
|
||||
def test t1 t1 s3 s3 252 50331645 0 Y 16 0 33
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 33
|
||||
def HEX(s1) 253 4590 0 Y 0 0 33
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
CREATE TABLE t2 AS SELECT CONCAT(s1) FROM t1;
|
||||
SHOW CREATE TABLE t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`CONCAT(s1)` varchar(255) CHARACTER SET utf8 DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
|
|
@ -2471,6 +2471,49 @@ abc𐐀def
|
|||
𐐀
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#52520 Difference in tinytext utf column metadata
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
s1 TINYTEXT CHARACTER SET utf8mb4,
|
||||
s2 TEXT CHARACTER SET utf8mb4,
|
||||
s3 MEDIUMTEXT CHARACTER SET utf8mb4,
|
||||
s4 LONGTEXT CHARACTER SET utf8mb4
|
||||
);
|
||||
SET NAMES utf8mb4, @@character_set_results=NULL;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 255 0 Y 16 0 45
|
||||
def test t1 t1 s2 s2 252 65535 0 Y 16 0 45
|
||||
def test t1 t1 s3 s3 252 16777215 0 Y 16 0 45
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 45
|
||||
def HEX(s1) 253 8160 0 Y 0 0 45
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
SET NAMES latin1;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 255 0 Y 16 0 8
|
||||
def test t1 t1 s2 s2 252 65535 0 Y 16 0 8
|
||||
def test t1 t1 s3 s3 252 16777215 0 Y 16 0 8
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 8
|
||||
def HEX(s1) 253 2040 0 Y 0 0 8
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
SET NAMES utf8mb4;
|
||||
SELECT *, HEX(s1) FROM t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def test t1 t1 s1 s1 252 1020 0 Y 16 0 45
|
||||
def test t1 t1 s2 s2 252 262140 0 Y 16 0 45
|
||||
def test t1 t1 s3 s3 252 67108860 0 Y 16 0 45
|
||||
def test t1 t1 s4 s4 252 4294967295 0 Y 16 0 45
|
||||
def HEX(s1) 253 8160 0 Y 0 0 45
|
||||
s1 s2 s3 s4 HEX(s1)
|
||||
CREATE TABLE t2 AS SELECT CONCAT(s1) FROM t1;
|
||||
SHOW CREATE TABLE t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`CONCAT(s1)` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -120,3 +120,17 @@ SET sql_quote_show_create= _utf8 x'5452C39C45';
|
|||
ERROR 42000: Variable 'sql_quote_show_create' can't be set to the value of 'TRÜE'
|
||||
SET sql_quote_show_create=_latin1 x'5452DC45';
|
||||
ERROR 42000: Variable 'sql_quote_show_create' can't be set to the value of 'TRÜE'
|
||||
#
|
||||
# Bug#52430 Incorrect key in the error message for duplicate key error involving BINARY type
|
||||
#
|
||||
CREATE TABLE t1(c1 BINARY(10), c2 BINARY(10), c3 BINARY(10),
|
||||
PRIMARY KEY(c1,c2,c3));
|
||||
INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc');
|
||||
INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc');
|
||||
ERROR 23000: Duplicate entry 'abc-abc-abc' for key 'PRIMARY'
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f1 VARBINARY(19) PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES ('abc\0\0');
|
||||
INSERT INTO t1 VALUES ('abc\0\0');
|
||||
ERROR 23000: Duplicate entry 'abc\x00\x00' for key 'PRIMARY'
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -37,9 +37,9 @@ partitions 3;
|
|||
select * from information_schema.partitions where table_schema="test"
|
||||
and table_name="t4";
|
||||
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
|
||||
def test t4 p0 NULL 1 NULL KEY NULL f1,f2 NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL
|
||||
def test t4 p1 NULL 2 NULL KEY NULL f1,f2 NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL
|
||||
def test t4 p2 NULL 3 NULL KEY NULL f1,f2 NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL
|
||||
def test t4 p0 NULL 1 NULL KEY NULL `f1`,`f2` NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL
|
||||
def test t4 p1 NULL 2 NULL KEY NULL `f1`,`f2` NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL
|
||||
def test t4 p2 NULL 3 NULL KEY NULL `f1`,`f2` NULL NULL 0 0 0 # 1024 0 # # NULL NULL default NULL
|
||||
drop table t1,t2,t3,t4;
|
||||
create table t1 (a int not null,b int not null,c int not null,primary key (a,b))
|
||||
partition by range (a)
|
||||
|
@ -67,10 +67,10 @@ def test t1 x1 x11 1 1 RANGE HASH a a+b 1 0 0 0 # 1024 0 # # NULL NULL default
|
|||
def test t1 x1 x12 1 2 RANGE HASH a a+b 1 0 0 0 # 1024 0 # # NULL NULL default t2
|
||||
def test t1 x2 x21 2 1 RANGE HASH a a+b 5 0 0 0 # 1024 0 # # NULL NULL default t1
|
||||
def test t1 x2 x22 2 2 RANGE HASH a a+b 5 0 0 0 # 1024 0 # # NULL NULL default t2
|
||||
def test t2 x1 x11 1 1 RANGE KEY a a 1 0 0 0 # 1024 0 # # NULL NULL default t1
|
||||
def test t2 x1 x12 1 2 RANGE KEY a a 1 0 0 0 # 1024 0 # # NULL NULL default t2
|
||||
def test t2 x2 x21 2 1 RANGE KEY a a 5 0 0 0 # 1024 0 # # NULL NULL default t1
|
||||
def test t2 x2 x22 2 2 RANGE KEY a a 5 0 0 0 # 1024 0 # # NULL NULL default t2
|
||||
def test t2 x1 x11 1 1 RANGE KEY a `a` 1 0 0 0 # 1024 0 # # NULL NULL default t1
|
||||
def test t2 x1 x12 1 2 RANGE KEY a `a` 1 0 0 0 # 1024 0 # # NULL NULL default t2
|
||||
def test t2 x2 x21 2 1 RANGE KEY a `a` 5 0 0 0 # 1024 0 # # NULL NULL default t1
|
||||
def test t2 x2 x22 2 2 RANGE KEY a `a` 5 0 0 0 # 1024 0 # # NULL NULL default t2
|
||||
drop table t1,t2;
|
||||
create table t1 (
|
||||
a int not null,
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
#
|
||||
# Bug#21704: Renaming column does not update FK definition.
|
||||
#
|
||||
|
||||
# Test that it's not possible to rename columns participating in a
|
||||
# foreign key (either in the referencing or referenced table).
|
||||
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
DROP TABLE IF EXISTS t3;
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ROW_FORMAT=COMPACT ENGINE=INNODB;
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT,
|
||||
CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1(a))
|
||||
ROW_FORMAT=COMPACT ENGINE=INNODB;
|
||||
CREATE TABLE t3 (a INT PRIMARY KEY, b INT, KEY(b), C INT,
|
||||
CONSTRAINT fk2 FOREIGN KEY (b) REFERENCES t3 (a))
|
||||
ROW_FORMAT=COMPACT ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
|
||||
INSERT INTO t2 VALUES (1,1),(2,2),(3,3);
|
||||
INSERT INTO t3 VALUES (1,1,1),(2,2,2),(3,3,3);
|
||||
|
||||
# Test renaming the column in the referenced table.
|
||||
|
||||
ALTER TABLE t1 CHANGE a c INT;
|
||||
ERROR HY000: Error on rename of '#sql-temporary' to './test/t1' (errno: 150)
|
||||
# Ensure that online column rename works.
|
||||
ALTER TABLE t1 CHANGE b c INT;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
|
||||
# Test renaming the column in the referencing table
|
||||
|
||||
ALTER TABLE t2 CHANGE a c INT;
|
||||
ERROR HY000: Error on rename of '#sql-temporary' to './test/t2' (errno: 150)
|
||||
# Ensure that online column rename works.
|
||||
ALTER TABLE t2 CHANGE b c INT;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
|
||||
# Test with self-referential constraints
|
||||
|
||||
ALTER TABLE t3 CHANGE a d INT;
|
||||
ERROR HY000: Error on rename of '#sql-temporary' to './test/t3' (errno: 150)
|
||||
ALTER TABLE t3 CHANGE b d INT;
|
||||
ERROR HY000: Error on rename of '#sql-temporary' to './test/t3' (errno: 150)
|
||||
# Ensure that online column rename works.
|
||||
ALTER TABLE t3 CHANGE c d INT;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
|
||||
# Cleanup.
|
||||
|
||||
DROP TABLE t3;
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
|
@ -1,11 +0,0 @@
|
|||
SET storage_engine=InnoDB;
|
||||
INSERT INTO bug38231 VALUES (1), (10), (300);
|
||||
SET autocommit=0;
|
||||
SELECT * FROM bug38231 FOR UPDATE;
|
||||
a
|
||||
1
|
||||
10
|
||||
300
|
||||
TRUNCATE TABLE bug38231;
|
||||
COMMIT;
|
||||
DROP TABLE bug38231;
|
|
@ -1,9 +0,0 @@
|
|||
CREATE TABLE bug44571 (foo INT) ENGINE=InnoDB;
|
||||
ALTER TABLE bug44571 CHANGE foo bar INT;
|
||||
ALTER TABLE bug44571 ADD INDEX bug44571b (foo);
|
||||
ERROR 42000: Key column 'foo' doesn't exist in table
|
||||
ALTER TABLE bug44571 ADD INDEX bug44571b (bar);
|
||||
ERROR HY000: Incorrect key file for table 'bug44571'; try to repair it
|
||||
CREATE INDEX bug44571b ON bug44571 (bar);
|
||||
ERROR HY000: Incorrect key file for table 'bug44571'; try to repair it
|
||||
DROP TABLE bug44571;
|
|
@ -86,3 +86,33 @@ release_lock('bug42147_lock')
|
|||
UNLOCK TABLES;
|
||||
# Connection 1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#53798 OPTIMIZE TABLE breaks repeatable read
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (a INT) engine=innodb;
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
# Connection con1
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
# Connection default
|
||||
# This should block
|
||||
# Sending:
|
||||
OPTIMIZE TABLE t1;
|
||||
# Connection con1
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
COMMIT;
|
||||
# Connection default
|
||||
# Reaping 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 status OK
|
||||
DROP TABLE t1;
|
||||
|
|
564
mysql-test/r/innodb_mysql_lock2.result
Normal file
564
mysql-test/r/innodb_mysql_lock2.result
Normal file
|
@ -0,0 +1,564 @@
|
|||
#
|
||||
# Test how do we handle locking in various cases when
|
||||
# we read data from InnoDB tables.
|
||||
#
|
||||
# In fact by performing this test we check two things:
|
||||
# 1) That SQL-layer correctly determine type of thr_lock.c
|
||||
# lock to be acquired/passed to InnoDB engine.
|
||||
# 2) That InnoDB engine correctly interprets this lock
|
||||
# type and takes necessary row locks or does not
|
||||
# take them if they are not necessary.
|
||||
#
|
||||
# This test makes sense only in REPEATABLE-READ mode as
|
||||
# in SERIALIZABLE mode all statements that read data take
|
||||
# shared lock on them to enforce its semantics.
|
||||
select @@session.tx_isolation;
|
||||
@@session.tx_isolation
|
||||
REPEATABLE-READ
|
||||
# Prepare playground by creating tables, views,
|
||||
# routines and triggers used in tests.
|
||||
drop table if exists t0, t1, t2, t3, t4, t5;
|
||||
drop view if exists v1, v2;
|
||||
drop procedure if exists p1;
|
||||
drop procedure if exists p2;
|
||||
drop function if exists f1;
|
||||
drop function if exists f2;
|
||||
drop function if exists f3;
|
||||
drop function if exists f4;
|
||||
drop function if exists f5;
|
||||
drop function if exists f6;
|
||||
drop function if exists f7;
|
||||
drop function if exists f8;
|
||||
drop function if exists f9;
|
||||
drop function if exists f10;
|
||||
drop function if exists f11;
|
||||
drop function if exists f12;
|
||||
drop function if exists f13;
|
||||
drop function if exists f14;
|
||||
drop function if exists f15;
|
||||
create table t1 (i int primary key) engine=innodb;
|
||||
insert into t1 values (1), (2), (3), (4), (5);
|
||||
create table t2 (j int primary key) engine=innodb;
|
||||
insert into t2 values (1), (2), (3), (4), (5);
|
||||
create table t3 (k int primary key) engine=innodb;
|
||||
insert into t3 values (1), (2), (3);
|
||||
create table t4 (l int primary key) engine=innodb;
|
||||
insert into t4 values (1);
|
||||
create table t5 (l int primary key) engine=innodb;
|
||||
insert into t5 values (1);
|
||||
create view v1 as select i from t1;
|
||||
create view v2 as select j from t2 where j in (select i from t1);
|
||||
create procedure p1(k int) insert into t2 values (k);
|
||||
create function f1() returns int
|
||||
begin
|
||||
declare j int;
|
||||
select i from t1 where i = 1 into j;
|
||||
return j;
|
||||
end|
|
||||
create function f2() returns int
|
||||
begin
|
||||
declare k int;
|
||||
select i from t1 where i = 1 into k;
|
||||
insert into t2 values (k + 5);
|
||||
return 0;
|
||||
end|
|
||||
create function f3() returns int
|
||||
begin
|
||||
return (select i from t1 where i = 3);
|
||||
end|
|
||||
create function f4() returns int
|
||||
begin
|
||||
if (select i from t1 where i = 3) then
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
end if;
|
||||
end|
|
||||
create function f5() returns int
|
||||
begin
|
||||
insert into t2 values ((select i from t1 where i = 1) + 5);
|
||||
return 0;
|
||||
end|
|
||||
create function f6() returns int
|
||||
begin
|
||||
declare k int;
|
||||
select i from v1 where i = 1 into k;
|
||||
return k;
|
||||
end|
|
||||
create function f7() returns int
|
||||
begin
|
||||
declare k int;
|
||||
select j from v2 where j = 1 into k;
|
||||
return k;
|
||||
end|
|
||||
create function f8() returns int
|
||||
begin
|
||||
declare k int;
|
||||
select i from v1 where i = 1 into k;
|
||||
insert into t2 values (k+5);
|
||||
return k;
|
||||
end|
|
||||
create function f9() returns int
|
||||
begin
|
||||
update v2 set j=j+10 where j=1;
|
||||
return 1;
|
||||
end|
|
||||
create function f10() returns int
|
||||
begin
|
||||
return f1();
|
||||
end|
|
||||
create function f11() returns int
|
||||
begin
|
||||
declare k int;
|
||||
set k= f1();
|
||||
insert into t2 values (k+5);
|
||||
return k;
|
||||
end|
|
||||
create function f12(p int) returns int
|
||||
begin
|
||||
insert into t2 values (p);
|
||||
return p;
|
||||
end|
|
||||
create function f13(p int) returns int
|
||||
begin
|
||||
return p;
|
||||
end|
|
||||
create procedure p2(inout p int)
|
||||
begin
|
||||
select i from t1 where i = 1 into p;
|
||||
end|
|
||||
create function f14() returns int
|
||||
begin
|
||||
declare k int;
|
||||
call p2(k);
|
||||
insert into t2 values (k+5);
|
||||
return k;
|
||||
end|
|
||||
create function f15() returns int
|
||||
begin
|
||||
declare k int;
|
||||
call p2(k);
|
||||
return k;
|
||||
end|
|
||||
create trigger t4_bi before insert on t4 for each row
|
||||
begin
|
||||
declare k int;
|
||||
select i from t1 where i=1 into k;
|
||||
set new.l= k+1;
|
||||
end|
|
||||
create trigger t4_bu before update on t4 for each row
|
||||
begin
|
||||
if (select i from t1 where i=1) then
|
||||
set new.l= 2;
|
||||
end if;
|
||||
end|
|
||||
create trigger t4_bd before delete on t4 for each row
|
||||
begin
|
||||
if !(select i from v1 where i=1) then
|
||||
signal sqlstate '45000';
|
||||
end if;
|
||||
end|
|
||||
create trigger t5_bi before insert on t5 for each row
|
||||
begin
|
||||
set new.l= f1()+1;
|
||||
end|
|
||||
create trigger t5_bu before update on t5 for each row
|
||||
begin
|
||||
declare j int;
|
||||
call p2(j);
|
||||
set new.l= j + 1;
|
||||
end|
|
||||
#
|
||||
# Set common variables to be used by scripts called below.
|
||||
#
|
||||
#
|
||||
# 1. Statements that read tables and do not use subqueries.
|
||||
#
|
||||
#
|
||||
# 1.1 Simple SELECT statement.
|
||||
#
|
||||
# No locks are necessary as this statement won't be written
|
||||
# to the binary log and thanks to how MyISAM works SELECT
|
||||
# will see version of the table prior to concurrent insert.
|
||||
Success: 'select * from t1' doesn't take row locks on 't1'.
|
||||
#
|
||||
# 1.2 Multi-UPDATE statement.
|
||||
#
|
||||
# Has to take shared locks on rows in the table being read as this
|
||||
# statement will be written to the binary log and therefore should
|
||||
# be serialized with concurrent statements.
|
||||
Success: 'update t2, t1 set j= j - 1 where i = j' takes shared row locks on 't1'.
|
||||
#
|
||||
# 1.3 Multi-DELETE statement.
|
||||
#
|
||||
# The above is true for this statement as well.
|
||||
Success: 'delete t2 from t1, t2 where i = j' takes shared row locks on 't1'.
|
||||
#
|
||||
# 1.4 DESCRIBE statement.
|
||||
#
|
||||
# This statement does not really read data from the
|
||||
# target table and thus does not take any lock on it.
|
||||
# We check this for completeness of coverage.
|
||||
Success: 'describe t1' doesn't take row locks on 't1'.
|
||||
#
|
||||
# 1.5 SHOW statements.
|
||||
#
|
||||
# The above is true for SHOW statements as well.
|
||||
Success: 'show create table t1' doesn't take row locks on 't1'.
|
||||
Success: 'show keys from t1' doesn't take row locks on 't1'.
|
||||
#
|
||||
# 2. Statements which read tables through subqueries.
|
||||
#
|
||||
#
|
||||
# 2.1 CALL with a subquery.
|
||||
#
|
||||
# A strong lock is not necessary as this statement is not
|
||||
# written to the binary log as a whole (it is written
|
||||
# statement-by-statement) and thanks to MVCC we can always get
|
||||
# versions of rows prior to the update that has locked them.
|
||||
# But in practice InnoDB does locking reads for all statements
|
||||
# other than SELECT (unless it is a READ-COMITTED mode or
|
||||
# innodb_locks_unsafe_for_binlog is ON).
|
||||
Success: 'call p1((select i + 5 from t1 where i = 1))' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.2 CREATE TABLE with a subquery.
|
||||
#
|
||||
# Has to take shared locks on rows in the table being read as
|
||||
# this statement is written to the binary log and therefore
|
||||
# should be serialized with concurrent statements.
|
||||
Success: 'create table t0 engine=innodb select * from t1' takes shared row locks on 't1'.
|
||||
drop table t0;
|
||||
Success: 'create table t0 engine=innodb select j from t2 where j in (select i from t1)' takes shared row locks on 't1'.
|
||||
drop table t0;
|
||||
#
|
||||
# 2.3 DELETE with a subquery.
|
||||
#
|
||||
# The above is true for this statement as well.
|
||||
Success: 'delete from t2 where j in (select i from t1)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.4 MULTI-DELETE with a subquery.
|
||||
#
|
||||
# Same is true for this statement as well.
|
||||
Success: 'delete t2 from t3, t2 where k = j and j in (select i from t1)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.5 DO with a subquery.
|
||||
#
|
||||
# In theory should not take row locks as it is not logged.
|
||||
# In practice InnoDB takes shared row locks.
|
||||
Success: 'do (select i from t1 where i = 1)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.6 INSERT with a subquery.
|
||||
#
|
||||
# Has to take shared locks on rows in the table being read as
|
||||
# this statement is written to the binary log and therefore
|
||||
# should be serialized with concurrent statements.
|
||||
Success: 'insert into t2 select i+5 from t1' takes shared row locks on 't1'.
|
||||
Success: 'insert into t2 values ((select i+5 from t1 where i = 4))' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.7 LOAD DATA with a subquery.
|
||||
#
|
||||
# The above is true for this statement as well.
|
||||
Success: 'load data infile '../../std_data/rpl_loaddata.dat' into table t2 (@a, @b) set j= @b + (select i from t1 where i = 1)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.8 REPLACE with a subquery.
|
||||
#
|
||||
# Same is true for this statement as well.
|
||||
Success: 'replace into t2 select i+5 from t1' takes shared row locks on 't1'.
|
||||
Success: 'replace into t2 values ((select i+5 from t1 where i = 4))' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.9 SELECT with a subquery.
|
||||
#
|
||||
# Locks are not necessary as this statement is not written
|
||||
# to the binary log and thanks to MVCC we can always get
|
||||
# versions of rows prior to the update that has locked them.
|
||||
#
|
||||
# Also serves as a test case for bug #46947 "Embedded SELECT
|
||||
# without FOR UPDATE is causing a lock".
|
||||
Success: 'select * from t2 where j in (select i from t1)' doesn't take row locks on 't1'.
|
||||
#
|
||||
# 2.10 SET with a subquery.
|
||||
#
|
||||
# In theory should not require locking as it is not written
|
||||
# to the binary log. In practice InnoDB acquires shared row
|
||||
# locks.
|
||||
Success: 'set @a:= (select i from t1 where i = 1)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.11 SHOW with a subquery.
|
||||
#
|
||||
# Similarly to the previous case, in theory should not require locking
|
||||
# as it is not written to the binary log. In practice InnoDB
|
||||
# acquires shared row locks.
|
||||
Success: 'show tables from test where Tables_in_test = 't2' and (select i from t1 where i = 1)' takes shared row locks on 't1'.
|
||||
Success: 'show columns from t2 where (select i from t1 where i = 1)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.12 UPDATE with a subquery.
|
||||
#
|
||||
# Has to take shared locks on rows in the table being read as
|
||||
# this statement is written to the binary log and therefore
|
||||
# should be serialized with concurrent statements.
|
||||
Success: 'update t2 set j= j-10 where j in (select i from t1)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 2.13 MULTI-UPDATE with a subquery.
|
||||
#
|
||||
# Same is true for this statement as well.
|
||||
Success: 'update t2, t3 set j= j -10 where j=k and j in (select i from t1)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 3. Statements which read tables through a view.
|
||||
#
|
||||
#
|
||||
# 3.1 SELECT statement which uses some table through a view.
|
||||
#
|
||||
# Since this statement is not written to the binary log
|
||||
# and old version of rows are accessible thanks to MVCC,
|
||||
# no locking is necessary.
|
||||
Success: 'select * from v1' doesn't take row locks on 't1'.
|
||||
Success: 'select * from v2' doesn't take row locks on 't1'.
|
||||
Success: 'select * from t2 where j in (select i from v1)' doesn't take row locks on 't1'.
|
||||
Success: 'select * from t3 where k in (select j from v2)' doesn't take row locks on 't1'.
|
||||
#
|
||||
# 3.2 Statements which modify a table and use views.
|
||||
#
|
||||
# Since such statements are going to be written to the binary
|
||||
# log they need to be serialized against concurrent statements
|
||||
# and therefore should take shared row locks on data read.
|
||||
Success: 'update t2 set j= j-10 where j in (select i from v1)' takes shared row locks on 't1'.
|
||||
Success: 'update t3 set k= k-10 where k in (select j from v2)' takes shared row locks on 't1'.
|
||||
Success: 'update t2, v1 set j= j-10 where j = i' takes shared row locks on 't1'.
|
||||
Success: 'update v2 set j= j-10 where j = 3' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4. Statements which read tables through stored functions.
|
||||
#
|
||||
#
|
||||
# 4.1 SELECT/SET with a stored function which does not
|
||||
# modify data and uses SELECT in its turn.
|
||||
#
|
||||
# In theory there is no need to take row locks on the table
|
||||
# being selected from in SF as the call to such function
|
||||
# won't get into the binary log. In practice, however, we
|
||||
# discover that fact too late in the process to be able to
|
||||
# affect the decision what locks should be taken.
|
||||
# Hence, strong locks are taken in this case.
|
||||
Success: 'select f1()' takes shared row locks on 't1'.
|
||||
Success: 'set @a:= f1()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.2 INSERT (or other statement which modifies data) with
|
||||
# a stored function which does not modify data and uses
|
||||
# SELECT.
|
||||
#
|
||||
# Since such statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting the data
|
||||
# it uses. Therefore it should take row locks on the data
|
||||
# it reads.
|
||||
Success: 'insert into t2 values (f1() + 5)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.3 SELECT/SET with a stored function which
|
||||
# reads and modifies data.
|
||||
#
|
||||
# Since a call to such function is written to the binary log,
|
||||
# it should be serialized with concurrent statements affecting
|
||||
# the data it uses. Hence, row locks on the data read
|
||||
# should be taken.
|
||||
Success: 'select f2()' takes shared row locks on 't1'.
|
||||
Success: 'set @a:= f2()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.4. SELECT/SET with a stored function which does not
|
||||
# modify data and reads a table through subselect
|
||||
# in a control construct.
|
||||
#
|
||||
# Again, in theory a call to this function won't get to the
|
||||
# binary log and thus no locking is needed. But in practice
|
||||
# we don't detect this fact early enough (get_lock_type_for_table())
|
||||
# to avoid taking row locks.
|
||||
Success: 'select f3()' takes shared row locks on 't1'.
|
||||
Success: 'set @a:= f3()' takes shared row locks on 't1'.
|
||||
Success: 'select f4()' takes shared row locks on 't1'.
|
||||
Success: 'set @a:= f4()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.5. INSERT (or other statement which modifies data) with
|
||||
# a stored function which does not modify data and reads
|
||||
# the table through a subselect in one of its control
|
||||
# constructs.
|
||||
#
|
||||
# Since such statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting data it
|
||||
# uses. Therefore it should take row locks on the data
|
||||
# it reads.
|
||||
Success: 'insert into t2 values (f3() + 5)' takes shared row locks on 't1'.
|
||||
Success: 'insert into t2 values (f4() + 6)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.6 SELECT/SET which uses a stored function with
|
||||
# DML which reads a table via a subquery.
|
||||
#
|
||||
# Since call to such function is written to the binary log
|
||||
# it should be serialized with concurrent statements.
|
||||
# Hence reads should take row locks.
|
||||
Success: 'select f5()' takes shared row locks on 't1'.
|
||||
Success: 'set @a:= f5()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.7 SELECT/SET which uses a stored function which
|
||||
# doesn't modify data and reads tables through
|
||||
# a view.
|
||||
#
|
||||
# Once again, in theory, calls to such functions won't
|
||||
# get into the binary log and thus don't need row
|
||||
# locks. But in practice this fact is discovered
|
||||
# too late to have any effect.
|
||||
Success: 'select f6()' takes shared row locks on 't1'.
|
||||
Success: 'set @a:= f6()' takes shared row locks on 't1'.
|
||||
Success: 'select f7()' takes shared row locks on 't1'.
|
||||
Success: 'set @a:= f7()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.8 INSERT which uses stored function which
|
||||
# doesn't modify data and reads a table
|
||||
# through a view.
|
||||
#
|
||||
# Since such statement is written to the binary log and
|
||||
# should be serialized with concurrent statements affecting
|
||||
# the data it uses. Therefore it should take row locks on
|
||||
# the rows it reads.
|
||||
Success: 'insert into t3 values (f6() + 5)' takes shared row locks on 't1'.
|
||||
Success: 'insert into t3 values (f7() + 5)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.9 SELECT which uses a stored function which
|
||||
# modifies data and reads tables through a view.
|
||||
#
|
||||
# Since a call to such function is written to the binary log
|
||||
# it should be serialized with concurrent statements.
|
||||
# Hence, reads should take row locks.
|
||||
Success: 'select f8()' takes shared row locks on 't1'.
|
||||
Success: 'select f9()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.10 SELECT which uses stored function which doesn't modify
|
||||
# data and reads a table indirectly, by calling another
|
||||
# function.
|
||||
#
|
||||
# In theory, calls to such functions won't get into the binary
|
||||
# log and thus don't need to acquire row locks. But in practice
|
||||
# this fact is discovered too late to have any effect.
|
||||
Success: 'select f10()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.11 INSERT which uses a stored function which doesn't modify
|
||||
# data and reads a table indirectly, by calling another
|
||||
# function.
|
||||
#
|
||||
# Since such statement is written to the binary log, it should
|
||||
# be serialized with concurrent statements affecting the data it
|
||||
# uses. Therefore it should take row locks on data it reads.
|
||||
Success: 'insert into t2 values (f10() + 5)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.12 SELECT which uses a stored function which modifies
|
||||
# data and reads a table indirectly, by calling another
|
||||
# function.
|
||||
#
|
||||
# Since a call to such function is written to the binary log
|
||||
# it should be serialized from concurrent statements.
|
||||
# Hence, reads should take row locks.
|
||||
Success: 'select f11()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 4.13 SELECT that reads a table through a subquery passed
|
||||
# as a parameter to a stored function which modifies
|
||||
# data.
|
||||
#
|
||||
# Even though a call to this function is written to the
|
||||
# binary log, values of its parameters are written as literals.
|
||||
# So there is no need to acquire row locks on rows used in
|
||||
# the subquery.
|
||||
Success: 'select f12((select i+10 from t1 where i=1))' doesn't take row locks on 't1'.
|
||||
#
|
||||
# 4.14 INSERT that reads a table via a subquery passed
|
||||
# as a parameter to a stored function which doesn't
|
||||
# modify data.
|
||||
#
|
||||
# Since this statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting the data it
|
||||
# uses. Therefore it should take row locks on the data it reads.
|
||||
Success: 'insert into t2 values (f13((select i+10 from t1 where i=1)))' takes shared row locks on 't1'.
|
||||
#
|
||||
# 5. Statements that read tables through stored procedures.
|
||||
#
|
||||
#
|
||||
# 5.1 CALL statement which reads a table via SELECT.
|
||||
#
|
||||
# Since neither this statement nor its components are
|
||||
# written to the binary log, there is no need to take
|
||||
# row locks on the data it reads.
|
||||
Success: 'call p2(@a)' doesn't take row locks on 't1'.
|
||||
#
|
||||
# 5.2 Function that modifes data and uses CALL,
|
||||
# which reads a table through SELECT.
|
||||
#
|
||||
# Since a call to such function is written to the binary
|
||||
# log, it should be serialized with concurrent statements.
|
||||
# Hence, in this case reads should take row locks on data.
|
||||
Success: 'select f14()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 5.3 SELECT that calls a function that doesn't modify data and
|
||||
# uses a CALL statement that reads a table via SELECT.
|
||||
#
|
||||
# In theory, calls to such functions won't get into the binary
|
||||
# log and thus don't need to acquire row locks. But in practice
|
||||
# this fact is discovered too late to have any effect.
|
||||
Success: 'select f15()' takes shared row locks on 't1'.
|
||||
#
|
||||
# 5.4 INSERT which calls function which doesn't modify data and
|
||||
# uses CALL statement which reads table through SELECT.
|
||||
#
|
||||
# Since such statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting data it
|
||||
# uses. Therefore it should take row locks on data it reads.
|
||||
Success: 'insert into t2 values (f15()+5)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 6. Statements that use triggers.
|
||||
#
|
||||
#
|
||||
# 6.1 Statement invoking a trigger that reads table via SELECT.
|
||||
#
|
||||
# Since this statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting the data
|
||||
# it uses. Therefore, it should take row locks on the data
|
||||
# it reads.
|
||||
Success: 'insert into t4 values (2)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 6.2 Statement invoking a trigger that reads table through
|
||||
# a subquery in a control construct.
|
||||
#
|
||||
# The above is true for this statement as well.
|
||||
Success: 'update t4 set l= 2 where l = 1' takes shared row locks on 't1'.
|
||||
#
|
||||
# 6.3 Statement invoking a trigger that reads a table through
|
||||
# a view.
|
||||
#
|
||||
# And for this statement.
|
||||
Success: 'delete from t4 where l = 1' takes shared row locks on 't1'.
|
||||
#
|
||||
# 6.4 Statement invoking a trigger that reads a table through
|
||||
# a stored function.
|
||||
#
|
||||
# And for this statement.
|
||||
Success: 'insert into t5 values (2)' takes shared row locks on 't1'.
|
||||
#
|
||||
# 6.5 Statement invoking a trigger that reads a table through
|
||||
# stored procedure.
|
||||
#
|
||||
# And for this statement.
|
||||
Success: 'update t5 set l= 2 where l = 1' takes shared row locks on 't1'.
|
||||
# Clean-up.
|
||||
drop function f1;
|
||||
drop function f2;
|
||||
drop function f3;
|
||||
drop function f4;
|
||||
drop function f5;
|
||||
drop function f6;
|
||||
drop function f7;
|
||||
drop function f8;
|
||||
drop function f9;
|
||||
drop function f10;
|
||||
drop function f11;
|
||||
drop function f12;
|
||||
drop function f13;
|
||||
drop function f14;
|
||||
drop function f15;
|
||||
drop view v1, v2;
|
||||
drop procedure p1;
|
||||
drop procedure p2;
|
||||
drop table t1, t2, t3, t4, t5;
|
|
@ -1,4 +1,596 @@
|
|||
#
|
||||
# Test how we handle locking in various cases when
|
||||
# we read data from MyISAM tables.
|
||||
#
|
||||
# In this test we mostly check that the SQL-layer correctly
|
||||
# determines the type of thr_lock.c lock for a table being
|
||||
# read.
|
||||
# I.e. that it disallows concurrent inserts when the statement
|
||||
# is going to be written to the binary log and therefore
|
||||
# should be serialized, and allows concurrent inserts when
|
||||
# such serialization is not necessary (e.g. when
|
||||
# the statement is not written to binary log).
|
||||
#
|
||||
# Force concurrent inserts to be performed even if the table
|
||||
# has gaps. This allows to simplify clean up in scripts
|
||||
# used below (instead of backing up table being inserted
|
||||
# into and then restoring it from backup at the end of the
|
||||
# script we can simply delete rows which were inserted).
|
||||
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||
set @@global.concurrent_insert= 2;
|
||||
select @@global.concurrent_insert;
|
||||
@@global.concurrent_insert
|
||||
ALWAYS
|
||||
# Prepare playground by creating tables, views,
|
||||
# routines and triggers used in tests.
|
||||
drop table if exists t0, t1, t2, t3, t4, t5;
|
||||
drop view if exists v1, v2;
|
||||
drop procedure if exists p1;
|
||||
drop procedure if exists p2;
|
||||
drop function if exists f1;
|
||||
drop function if exists f2;
|
||||
drop function if exists f3;
|
||||
drop function if exists f4;
|
||||
drop function if exists f5;
|
||||
drop function if exists f6;
|
||||
drop function if exists f7;
|
||||
drop function if exists f8;
|
||||
drop function if exists f9;
|
||||
drop function if exists f10;
|
||||
drop function if exists f11;
|
||||
drop function if exists f12;
|
||||
drop function if exists f13;
|
||||
drop function if exists f14;
|
||||
drop function if exists f15;
|
||||
create table t1 (i int primary key);
|
||||
insert into t1 values (1), (2), (3), (4), (5);
|
||||
create table t2 (j int primary key);
|
||||
insert into t2 values (1), (2), (3), (4), (5);
|
||||
create table t3 (k int primary key);
|
||||
insert into t3 values (1), (2), (3);
|
||||
create table t4 (l int primary key);
|
||||
insert into t4 values (1);
|
||||
create table t5 (l int primary key);
|
||||
insert into t5 values (1);
|
||||
create view v1 as select i from t1;
|
||||
create view v2 as select j from t2 where j in (select i from t1);
|
||||
create procedure p1(k int) insert into t2 values (k);
|
||||
create function f1() returns int
|
||||
begin
|
||||
declare j int;
|
||||
select i from t1 where i = 1 into j;
|
||||
return j;
|
||||
end|
|
||||
create function f2() returns int
|
||||
begin
|
||||
declare k int;
|
||||
select i from t1 where i = 1 into k;
|
||||
insert into t2 values (k + 5);
|
||||
return 0;
|
||||
end|
|
||||
create function f3() returns int
|
||||
begin
|
||||
return (select i from t1 where i = 3);
|
||||
end|
|
||||
create function f4() returns int
|
||||
begin
|
||||
if (select i from t1 where i = 3) then
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
end if;
|
||||
end|
|
||||
create function f5() returns int
|
||||
begin
|
||||
insert into t2 values ((select i from t1 where i = 1) + 5);
|
||||
return 0;
|
||||
end|
|
||||
create function f6() returns int
|
||||
begin
|
||||
declare k int;
|
||||
select i from v1 where i = 1 into k;
|
||||
return k;
|
||||
end|
|
||||
create function f7() returns int
|
||||
begin
|
||||
declare k int;
|
||||
select j from v2 where j = 1 into k;
|
||||
return k;
|
||||
end|
|
||||
create function f8() returns int
|
||||
begin
|
||||
declare k int;
|
||||
select i from v1 where i = 1 into k;
|
||||
insert into t2 values (k+5);
|
||||
return k;
|
||||
end|
|
||||
create function f9() returns int
|
||||
begin
|
||||
update v2 set j=j+10 where j=1;
|
||||
return 1;
|
||||
end|
|
||||
create function f10() returns int
|
||||
begin
|
||||
return f1();
|
||||
end|
|
||||
create function f11() returns int
|
||||
begin
|
||||
declare k int;
|
||||
set k= f1();
|
||||
insert into t2 values (k+5);
|
||||
return k;
|
||||
end|
|
||||
create function f12(p int) returns int
|
||||
begin
|
||||
insert into t2 values (p);
|
||||
return p;
|
||||
end|
|
||||
create function f13(p int) returns int
|
||||
begin
|
||||
return p;
|
||||
end|
|
||||
create procedure p2(inout p int)
|
||||
begin
|
||||
select i from t1 where i = 1 into p;
|
||||
end|
|
||||
create function f14() returns int
|
||||
begin
|
||||
declare k int;
|
||||
call p2(k);
|
||||
insert into t2 values (k+5);
|
||||
return k;
|
||||
end|
|
||||
create function f15() returns int
|
||||
begin
|
||||
declare k int;
|
||||
call p2(k);
|
||||
return k;
|
||||
end|
|
||||
create trigger t4_bi before insert on t4 for each row
|
||||
begin
|
||||
declare k int;
|
||||
select i from t1 where i=1 into k;
|
||||
set new.l= k+1;
|
||||
end|
|
||||
create trigger t4_bu before update on t4 for each row
|
||||
begin
|
||||
if (select i from t1 where i=1) then
|
||||
set new.l= 2;
|
||||
end if;
|
||||
end|
|
||||
create trigger t4_bd before delete on t4 for each row
|
||||
begin
|
||||
if !(select i from v1 where i=1) then
|
||||
signal sqlstate '45000';
|
||||
end if;
|
||||
end|
|
||||
create trigger t5_bi before insert on t5 for each row
|
||||
begin
|
||||
set new.l= f1()+1;
|
||||
end|
|
||||
create trigger t5_bu before update on t5 for each row
|
||||
begin
|
||||
declare j int;
|
||||
call p2(j);
|
||||
set new.l= j + 1;
|
||||
end|
|
||||
#
|
||||
# Set common variables to be used by the scripts
|
||||
# called below.
|
||||
#
|
||||
# Switch to connection 'con1'.
|
||||
# Cache all functions used in the tests below so statements
|
||||
# calling them won't need to open and lock mysql.proc table
|
||||
# and we can assume that each statement locks its tables
|
||||
# once during its execution.
|
||||
show create procedure p1;
|
||||
show create procedure p2;
|
||||
show create function f1;
|
||||
show create function f2;
|
||||
show create function f3;
|
||||
show create function f4;
|
||||
show create function f5;
|
||||
show create function f6;
|
||||
show create function f7;
|
||||
show create function f8;
|
||||
show create function f9;
|
||||
show create function f10;
|
||||
show create function f11;
|
||||
show create function f12;
|
||||
show create function f13;
|
||||
show create function f14;
|
||||
show create function f15;
|
||||
# Switch back to connection 'default'.
|
||||
#
|
||||
# 1. Statements that read tables and do not use subqueries.
|
||||
#
|
||||
#
|
||||
# 1.1 Simple SELECT statement.
|
||||
#
|
||||
# No locks are necessary as this statement won't be written
|
||||
# to the binary log and thanks to how MyISAM works SELECT
|
||||
# will see version of the table prior to concurrent insert.
|
||||
Success: 'select * from t1' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 1.2 Multi-UPDATE statement.
|
||||
#
|
||||
# Has to take shared locks on rows in the table being read as this
|
||||
# statement will be written to the binary log and therefore should
|
||||
# be serialized with concurrent statements.
|
||||
Success: 'update t2, t1 set j= j - 1 where i = j' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 1.3 Multi-DELETE statement.
|
||||
#
|
||||
# The above is true for this statement as well.
|
||||
Success: 'delete t2 from t1, t2 where i = j' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 1.4 DESCRIBE statement.
|
||||
#
|
||||
# This statement does not really read data from the
|
||||
# target table and thus does not take any lock on it.
|
||||
# We check this for completeness of coverage.
|
||||
lock table t1 write;
|
||||
# Switching to connection 'con1'.
|
||||
# This statement should not be blocked.
|
||||
describe t1;
|
||||
# Switching to connection 'default'.
|
||||
unlock tables;
|
||||
#
|
||||
# 1.5 SHOW statements.
|
||||
#
|
||||
# The above is true for SHOW statements as well.
|
||||
lock table t1 write;
|
||||
# Switching to connection 'con1'.
|
||||
# These statements should not be blocked.
|
||||
show keys from t1;
|
||||
# Switching to connection 'default'.
|
||||
unlock tables;
|
||||
#
|
||||
# 2. Statements which read tables through subqueries.
|
||||
#
|
||||
#
|
||||
# 2.1 CALL with a subquery.
|
||||
#
|
||||
# A strong lock is not necessary as this statement is not
|
||||
# written to the binary log as a whole (it is written
|
||||
# statement-by-statement).
|
||||
Success: 'call p1((select i + 5 from t1 where i = 1))' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.2 CREATE TABLE with a subquery.
|
||||
#
|
||||
# Has to take a strong lock on the table being read as
|
||||
# this statement is written to the binary log and therefore
|
||||
# should be serialized with concurrent statements.
|
||||
Success: 'create table t0 select * from t1' doesn't allow concurrent inserts into 't1'.
|
||||
drop table t0;
|
||||
Success: 'create table t0 select j from t2 where j in (select i from t1)' doesn't allow concurrent inserts into 't1'.
|
||||
drop table t0;
|
||||
#
|
||||
# 2.3 DELETE with a subquery.
|
||||
#
|
||||
# The above is true for this statement as well.
|
||||
Success: 'delete from t2 where j in (select i from t1)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.4 MULTI-DELETE with a subquery.
|
||||
#
|
||||
# Same is true for this statement as well.
|
||||
Success: 'delete t2 from t3, t2 where k = j and j in (select i from t1)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.5 DO with a subquery.
|
||||
#
|
||||
# A strong lock is not necessary as it is not logged.
|
||||
Success: 'do (select i from t1 where i = 1)' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.6 INSERT with a subquery.
|
||||
#
|
||||
# Has to take a strong lock on the table being read as
|
||||
# this statement is written to the binary log and therefore
|
||||
# should be serialized with concurrent inserts.
|
||||
Success: 'insert into t2 select i+5 from t1' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'insert into t2 values ((select i+5 from t1 where i = 4))' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.7 LOAD DATA with a subquery.
|
||||
#
|
||||
# The above is true for this statement as well.
|
||||
Success: 'load data infile '../../std_data/rpl_loaddata.dat' into table t2 (@a, @b) set j= @b + (select i from t1 where i = 1)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.8 REPLACE with a subquery.
|
||||
#
|
||||
# Same is true for this statement as well.
|
||||
Success: 'replace into t2 select i+5 from t1' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'replace into t2 values ((select i+5 from t1 where i = 4))' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.9 SELECT with a subquery.
|
||||
#
|
||||
# Strong locks are not necessary as this statement is not written
|
||||
# to the binary log and thanks to how MyISAM works this statement
|
||||
# sees a version of the table prior to the concurrent insert.
|
||||
Success: 'select * from t2 where j in (select i from t1)' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.10 SET with a subquery.
|
||||
#
|
||||
# The same is true for this statement as well.
|
||||
Success: 'set @a:= (select i from t1 where i = 1)' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.11 SHOW with a subquery.
|
||||
#
|
||||
# And for this statement too.
|
||||
Success: 'show tables from test where Tables_in_test = 't2' and (select i from t1 where i = 1)' allows concurrent inserts into 't1'.
|
||||
Success: 'show columns from t2 where (select i from t1 where i = 1)' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.12 UPDATE with a subquery.
|
||||
#
|
||||
# Has to take a strong lock on the table being read as
|
||||
# this statement is written to the binary log and therefore
|
||||
# should be serialized with concurrent inserts.
|
||||
Success: 'update t2 set j= j-10 where j in (select i from t1)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 2.13 MULTI-UPDATE with a subquery.
|
||||
#
|
||||
# Same is true for this statement as well.
|
||||
Success: 'update t2, t3 set j= j -10 where j=k and j in (select i from t1)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 3. Statements which read tables through a view.
|
||||
#
|
||||
#
|
||||
# 3.1 SELECT statement which uses some table through a view.
|
||||
#
|
||||
# Since this statement is not written to the binary log and
|
||||
# an old version of the table is accessible thanks to how MyISAM
|
||||
# handles concurrent insert, no locking is necessary.
|
||||
Success: 'select * from v1' allows concurrent inserts into 't1'.
|
||||
Success: 'select * from v2' allows concurrent inserts into 't1'.
|
||||
Success: 'select * from t2 where j in (select i from v1)' allows concurrent inserts into 't1'.
|
||||
Success: 'select * from t3 where k in (select j from v2)' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 3.2 Statements which modify a table and use views.
|
||||
#
|
||||
# Since such statements are going to be written to the binary
|
||||
# log they need to be serialized against concurrent statements
|
||||
# and therefore should take strong locks on the data read.
|
||||
Success: 'update t2 set j= j-10 where j in (select i from v1)' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'update t3 set k= k-10 where k in (select j from v2)' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'update t2, v1 set j= j-10 where j = i' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'update v2 set j= j-10 where j = 3' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4. Statements which read tables through stored functions.
|
||||
#
|
||||
#
|
||||
# 4.1 SELECT/SET with a stored function which does not
|
||||
# modify data and uses SELECT in its turn.
|
||||
#
|
||||
# In theory there is no need to take strong locks on the table
|
||||
# being selected from in SF as the call to such function
|
||||
# won't get into the binary log. In practice, however, we
|
||||
# discover that fact too late in the process to be able to
|
||||
# affect the decision what locks should be taken.
|
||||
# Hence, strong locks are taken in this case.
|
||||
Success: 'select f1()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'set @a:= f1()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.2 INSERT (or other statement which modifies data) with
|
||||
# a stored function which does not modify data and uses
|
||||
# SELECT.
|
||||
#
|
||||
# Since such statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting the data
|
||||
# it uses. Therefore it should take strong lock on the data
|
||||
# it reads.
|
||||
Success: 'insert into t2 values (f1() + 5)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.3 SELECT/SET with a stored function which
|
||||
# reads and modifies data.
|
||||
#
|
||||
# Since a call to such function is written to the binary log,
|
||||
# it should be serialized with concurrent statements affecting
|
||||
# the data it uses. Hence, a strong lock on the data read
|
||||
# should be taken.
|
||||
Success: 'select f2()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'set @a:= f2()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.4. SELECT/SET with a stored function which does not
|
||||
# modify data and reads a table through subselect
|
||||
# in a control construct.
|
||||
#
|
||||
# Again, in theory a call to this function won't get to the
|
||||
# binary log and thus no strong lock is needed. But in practice
|
||||
# we don't detect this fact early enough (get_lock_type_for_table())
|
||||
# to avoid taking a strong lock.
|
||||
Success: 'select f3()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'set @a:= f3()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'select f4()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'set @a:= f4()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.5. INSERT (or other statement which modifies data) with
|
||||
# a stored function which does not modify data and reads
|
||||
# the table through a subselect in one of its control
|
||||
# constructs.
|
||||
#
|
||||
# Since such statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting data it
|
||||
# uses. Therefore it should take a strong lock on the data
|
||||
# it reads.
|
||||
Success: 'insert into t2 values (f3() + 5)' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'insert into t2 values (f4() + 6)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.6 SELECT/SET which uses a stored function with
|
||||
# DML which reads a table via a subquery.
|
||||
#
|
||||
# Since call to such function is written to the binary log
|
||||
# it should be serialized with concurrent statements.
|
||||
# Hence reads should take a strong lock.
|
||||
Success: 'select f5()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'set @a:= f5()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.7 SELECT/SET which uses a stored function which
|
||||
# doesn't modify data and reads tables through
|
||||
# a view.
|
||||
#
|
||||
# Once again, in theory, calls to such functions won't
|
||||
# get into the binary log and thus don't need strong
|
||||
# locks. But in practice this fact is discovered
|
||||
# too late to have any effect.
|
||||
Success: 'select f6()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'set @a:= f6()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'select f7()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'set @a:= f7()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.8 INSERT which uses stored function which
|
||||
# doesn't modify data and reads a table
|
||||
# through a view.
|
||||
#
|
||||
# Since such statement is written to the binary log and
|
||||
# should be serialized with concurrent statements affecting
|
||||
# the data it uses. Therefore it should take a strong lock on
|
||||
# the table it reads.
|
||||
Success: 'insert into t3 values (f6() + 5)' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'insert into t3 values (f7() + 5)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.9 SELECT which uses a stored function which
|
||||
# modifies data and reads tables through a view.
|
||||
#
|
||||
# Since a call to such function is written to the binary log
|
||||
# it should be serialized with concurrent statements.
|
||||
# Hence, reads should take strong locks.
|
||||
Success: 'select f8()' doesn't allow concurrent inserts into 't1'.
|
||||
Success: 'select f9()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.10 SELECT which uses a stored function which doesn't modify
|
||||
# data and reads a table indirectly, by calling another
|
||||
# function.
|
||||
#
|
||||
# In theory, calls to such functions won't get into the binary
|
||||
# log and thus don't need to acquire strong locks. But in practice
|
||||
# this fact is discovered too late to have any effect.
|
||||
Success: 'select f10()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.11 INSERT which uses a stored function which doesn't modify
|
||||
# data and reads a table indirectly, by calling another
|
||||
# function.
|
||||
#
|
||||
# Since such statement is written to the binary log, it should
|
||||
# be serialized with concurrent statements affecting the data it
|
||||
# uses. Therefore it should take strong locks on data it reads.
|
||||
Success: 'insert into t2 values (f10() + 5)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.12 SELECT which uses a stored function which modifies
|
||||
# data and reads a table indirectly, by calling another
|
||||
# function.
|
||||
#
|
||||
# Since a call to such function is written to the binary log
|
||||
# it should be serialized from concurrent statements.
|
||||
# Hence, read should take a strong lock.
|
||||
Success: 'select f11()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.13 SELECT that reads a table through a subquery passed
|
||||
# as a parameter to a stored function which modifies
|
||||
# data.
|
||||
#
|
||||
# Even though a call to this function is written to the
|
||||
# binary log, values of its parameters are written as literals.
|
||||
# So there is no need to acquire strong locks for tables used in
|
||||
# the subquery.
|
||||
Success: 'select f12((select i+10 from t1 where i=1))' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 4.14 INSERT that reads a table via a subquery passed
|
||||
# as a parameter to a stored function which doesn't
|
||||
# modify data.
|
||||
#
|
||||
# Since this statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting the data it
|
||||
# uses. Therefore it should take strong locks on the data it reads.
|
||||
Success: 'insert into t2 values (f13((select i+10 from t1 where i=1)))' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 5. Statements that read tables through stored procedures.
|
||||
#
|
||||
#
|
||||
# 5.1 CALL statement which reads a table via SELECT.
|
||||
#
|
||||
# Since neither this statement nor its components are
|
||||
# written to the binary log, there is no need to take
|
||||
# strong locks on the data it reads.
|
||||
Success: 'call p2(@a)' allows concurrent inserts into 't1'.
|
||||
#
|
||||
# 5.2 Function that modifes data and uses CALL,
|
||||
# which reads a table through SELECT.
|
||||
#
|
||||
# Since a call to such function is written to the binary
|
||||
# log, it should be serialized with concurrent statements.
|
||||
# Hence, in this case reads should take strong locks on data.
|
||||
Success: 'select f14()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 5.3 SELECT that calls a function that doesn't modify data and
|
||||
# uses a CALL statement that reads a table via SELECT.
|
||||
#
|
||||
# In theory, calls to such functions won't get into the binary
|
||||
# log and thus don't need to acquire strong locks. But in practice
|
||||
# this fact is discovered too late to have any effect.
|
||||
Success: 'select f15()' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 5.4 INSERT which calls function which doesn't modify data and
|
||||
# uses CALL statement which reads table through SELECT.
|
||||
#
|
||||
# Since such statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting data it
|
||||
# uses. Therefore it should take strong locks on data it reads.
|
||||
Success: 'insert into t2 values (f15()+5)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 6. Statements that use triggers.
|
||||
#
|
||||
#
|
||||
# 6.1 Statement invoking a trigger that reads table via SELECT.
|
||||
#
|
||||
# Since this statement is written to the binary log it should
|
||||
# be serialized with concurrent statements affecting the data
|
||||
# it uses. Therefore, it should take strong locks on the data
|
||||
# it reads.
|
||||
Success: 'insert into t4 values (2)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 6.2 Statement invoking a trigger that reads table through
|
||||
# a subquery in a control construct.
|
||||
#
|
||||
# The above is true for this statement as well.
|
||||
Success: 'update t4 set l= 2 where l = 1' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 6.3 Statement invoking a trigger that reads a table through
|
||||
# a view.
|
||||
#
|
||||
# And for this statement.
|
||||
Success: 'delete from t4 where l = 1' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 6.4 Statement invoking a trigger that reads a table through
|
||||
# a stored function.
|
||||
#
|
||||
# And for this statement.
|
||||
Success: 'insert into t5 values (2)' doesn't allow concurrent inserts into 't1'.
|
||||
#
|
||||
# 6.5 Statement invoking a trigger that reads a table through
|
||||
# stored procedure.
|
||||
#
|
||||
# And for this statement.
|
||||
Success: 'update t5 set l= 2 where l = 1' doesn't allow concurrent inserts into 't1'.
|
||||
# Clean-up.
|
||||
drop function f1;
|
||||
drop function f2;
|
||||
drop function f3;
|
||||
drop function f4;
|
||||
drop function f5;
|
||||
drop function f6;
|
||||
drop function f7;
|
||||
drop function f8;
|
||||
drop function f9;
|
||||
drop function f10;
|
||||
drop function f11;
|
||||
drop function f12;
|
||||
drop function f13;
|
||||
drop function f14;
|
||||
drop function f15;
|
||||
drop view v1, v2;
|
||||
drop procedure p1;
|
||||
drop procedure p2;
|
||||
drop table t1, t2, t3, t4, t5;
|
||||
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||
#
|
||||
# Test for bug #45143 "All connections hang on concurrent ALTER TABLE".
|
||||
#
|
||||
# Concurrent execution of statements which required weak write lock
|
||||
|
|
|
@ -2381,3 +2381,17 @@ commit;
|
|||
# Reap ALTER TABLE.
|
||||
set debug_sync= 'RESET';
|
||||
drop table t1;
|
||||
#
|
||||
# Bug#52856 concurrent show columns or show full columns causes a crash!!!
|
||||
#
|
||||
CREATE TABLE t1(a CHAR(255));
|
||||
SET DEBUG_SYNC= "get_schema_column SIGNAL waiting WAIT_FOR completed";
|
||||
SHOW FULL COLUMNS FROM t1;
|
||||
SET DEBUG_SYNC= "now WAIT_FOR waiting";
|
||||
SHOW FULL COLUMNS FROM t1;
|
||||
Field Type Collation Null Key Default Extra Privileges Comment
|
||||
a char(255) latin1_swedish_ci YES NULL #
|
||||
SET DEBUG_SYNC= "now SIGNAL completed";
|
||||
Field Type Collation Null Key Default Extra Privileges Comment
|
||||
a char(255) latin1_swedish_ci YES NULL #
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -277,7 +277,7 @@ t3 CREATE TABLE `t3` (
|
|||
drop table t3,t2,t1;
|
||||
create table t1 (a int not null, key(a)) engine=merge;
|
||||
select * from t1;
|
||||
ERROR HY000: Got error 124 from storage engine
|
||||
a
|
||||
drop table t1;
|
||||
create table t1 (a int not null, b int not null, key(a,b));
|
||||
create table t2 (a int not null, b int not null, key(a,b));
|
||||
|
@ -988,6 +988,11 @@ m1 CREATE TABLE `m1` (
|
|||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1, m1;
|
||||
CREATE TABLE t1(a INT, KEY(a)) ENGINE=merge;
|
||||
SELECT MAX(a) FROM t1;
|
||||
MAX(a)
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(a INT);
|
||||
CREATE TABLE t2(a VARCHAR(10));
|
||||
CREATE TABLE m1(a INT) ENGINE=MERGE UNION=(t1, t2);
|
||||
|
|
|
@ -109,13 +109,20 @@ Database: information_schema
|
|||
| TRIGGERS |
|
||||
| USER_PRIVILEGES |
|
||||
| VIEWS |
|
||||
| INNODB_CMP_RESET |
|
||||
| INNODB_SYS_FIELDS |
|
||||
| INNODB_TRX |
|
||||
| INNODB_CMPMEM_RESET |
|
||||
| INNODB_SYS_INDEXES |
|
||||
| INNODB_LOCK_WAITS |
|
||||
| INNODB_CMPMEM |
|
||||
| INNODB_SYS_TABLESTATS |
|
||||
| INNODB_CMP |
|
||||
| INNODB_SYS_COLUMNS |
|
||||
| INNODB_CMP_RESET |
|
||||
| INNODB_SYS_FOREIGN_COLS |
|
||||
| INNODB_LOCKS |
|
||||
| INNODB_CMPMEM_RESET |
|
||||
| INNODB_CMPMEM |
|
||||
| INNODB_SYS_FOREIGN |
|
||||
| INNODB_SYS_TABLES |
|
||||
+---------------------------------------+
|
||||
Database: INFORMATION_SCHEMA
|
||||
+---------------------------------------+
|
||||
|
@ -151,13 +158,20 @@ Database: INFORMATION_SCHEMA
|
|||
| TRIGGERS |
|
||||
| USER_PRIVILEGES |
|
||||
| VIEWS |
|
||||
| INNODB_CMP_RESET |
|
||||
| INNODB_SYS_FIELDS |
|
||||
| INNODB_TRX |
|
||||
| INNODB_CMPMEM_RESET |
|
||||
| INNODB_SYS_INDEXES |
|
||||
| INNODB_LOCK_WAITS |
|
||||
| INNODB_CMPMEM |
|
||||
| INNODB_SYS_TABLESTATS |
|
||||
| INNODB_CMP |
|
||||
| INNODB_SYS_COLUMNS |
|
||||
| INNODB_CMP_RESET |
|
||||
| INNODB_SYS_FOREIGN_COLS |
|
||||
| INNODB_LOCKS |
|
||||
| INNODB_CMPMEM_RESET |
|
||||
| INNODB_CMPMEM |
|
||||
| INNODB_SYS_FOREIGN |
|
||||
| INNODB_SYS_TABLES |
|
||||
+---------------------------------------+
|
||||
Wildcard: inf_rmation_schema
|
||||
+--------------------+
|
||||
|
|
|
@ -1618,3 +1618,32 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 SIMPLE t2 ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
DROP TABLE t1, t2;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# Bug #38745: MySQL 5.1 optimizer uses filesort for ORDER BY
|
||||
# when it should use index
|
||||
#
|
||||
CREATE TABLE t1 (i1 integer NOT NULL PRIMARY KEY);
|
||||
CREATE TABLE t2 (i2 integer NOT NULL PRIMARY KEY);
|
||||
CREATE TABLE t3 (i3 integer);
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12);
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
EXPLAIN EXTENDED
|
||||
SELECT t1.*, t2.* FROM t1 JOIN t2 ON t1.i1 = t2.i2
|
||||
LEFT JOIN t3 ON t2.i2 = t3.i3
|
||||
ORDER BY t1.i1 LIMIT 5;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t3 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 5 240.00 Using index
|
||||
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.i1 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`i1` AS `i1`,`test`.`t2`.`i2` AS `i2` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`i2` = `test`.`t1`.`i1`) order by `test`.`t1`.`i1` limit 5
|
||||
SELECT t1.*, t2.* FROM t1 JOIN t2 ON t1.i1 = t2.i2
|
||||
LEFT JOIN t3 ON t2.i2 = t3.i3
|
||||
ORDER BY t1.i1 LIMIT 5;
|
||||
i1 i2
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
|
|
@ -1,4 +1,46 @@
|
|||
drop table if exists t1, t2;
|
||||
# Bug#39338: Fieldnames in
|
||||
# INFORMATIONSCHEMA.PARTITIONS.PARTITION_EXPRESSION become unescaped
|
||||
# NOTE: the partition expression is saved as a string, so changing from
|
||||
# normal quotes to ansi quotes does not change the expression, only
|
||||
# for partition by KEY.
|
||||
CREATE TABLE t1 (
|
||||
ID int(11) NOT NULL,
|
||||
`aaaa,aaaaa` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
ddddddddd int(11) NOT NULL DEFAULT '0',
|
||||
new_field0 varchar(50),
|
||||
PRIMARY KEY(ID, `aaaa,aaaaa`, ddddddddd))
|
||||
PARTITION BY RANGE(ID)
|
||||
PARTITIONS 3
|
||||
SUBPARTITION BY LINEAR KEY(ID,`aaaa,aaaaa`)
|
||||
SUBPARTITIONS 2 (
|
||||
PARTITION p01 VALUES LESS THAN(100),
|
||||
PARTITION p11 VALUES LESS THAN(200),
|
||||
PARTITION p21 VALUES LESS THAN MAXVALUE);
|
||||
SELECT PARTITION_EXPRESSION, SUBPARTITION_EXPRESSION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
|
||||
PARTITION_EXPRESSION SUBPARTITION_EXPRESSION
|
||||
ID `ID`,`aaaa,aaaaa`
|
||||
ID `ID`,`aaaa,aaaaa`
|
||||
ID `ID`,`aaaa,aaaaa`
|
||||
ID `ID`,`aaaa,aaaaa`
|
||||
ID `ID`,`aaaa,aaaaa`
|
||||
ID `ID`,`aaaa,aaaaa`
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`ID` int(11) NOT NULL,
|
||||
`aaaa,aaaaa` tinyint(3) unsigned NOT NULL DEFAULT '0',
|
||||
`ddddddddd` int(11) NOT NULL DEFAULT '0',
|
||||
`new_field0` varchar(50) DEFAULT NULL,
|
||||
PRIMARY KEY (`ID`,`aaaa,aaaaa`,`ddddddddd`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (ID)
|
||||
SUBPARTITION BY LINEAR KEY (ID,`aaaa,aaaaa`)
|
||||
SUBPARTITIONS 2
|
||||
(PARTITION p01 VALUES LESS THAN (100) ENGINE = MyISAM,
|
||||
PARTITION p11 VALUES LESS THAN (200) ENGINE = MyISAM,
|
||||
PARTITION p21 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a INT, b INT)
|
||||
PARTITION BY LIST (a)
|
||||
SUBPARTITION BY HASH (b)
|
||||
|
|
13
mysql-test/r/partition_binlog_stmt.result
Normal file
13
mysql-test/r/partition_binlog_stmt.result
Normal file
|
@ -0,0 +1,13 @@
|
|||
DROP TABLE IF EXISTS t1;
|
||||
#
|
||||
# Bug#51851: Server with SBR locks mutex twice on LOAD DATA into
|
||||
# partitioned MyISAM table
|
||||
CREATE TABLE t1
|
||||
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
name TINYBLOB NOT NULL,
|
||||
modified TIMESTAMP DEFAULT '0000-00-00 00:00:00',
|
||||
INDEX namelocs (name(255))) ENGINE = MyISAM
|
||||
PARTITION BY HASH(id) PARTITIONS 2;
|
||||
LOAD DATA LOCAL INFILE 'init_file.txt'
|
||||
INTO TABLE t1 (name);
|
||||
DROP TABLE t1;
|
|
@ -1,4 +1,44 @@
|
|||
drop table if exists t1;
|
||||
#
|
||||
# Bug#52815: LIST COLUMNS doesn't insert rows in correct partition
|
||||
# if muliple columns used
|
||||
CREATE TABLE t1 (
|
||||
id INT NOT NULL,
|
||||
name VARCHAR(255),
|
||||
department VARCHAR(10),
|
||||
country VARCHAR(255)
|
||||
) PARTITION BY LIST COLUMNS (department, country) (
|
||||
PARTITION first_office VALUES IN (('dep1', 'Russia'), ('dep1', 'Croatia')),
|
||||
PARTITION second_office VALUES IN (('dep2', 'Russia'))
|
||||
);
|
||||
INSERT INTO t1 VALUES(1, 'Ann', 'dep1', 'Russia');
|
||||
INSERT INTO t1 VALUES(2, 'Bob', 'dep1', 'Croatia');
|
||||
INSERT INTO t1 VALUES(3, 'Cecil', 'dep2', 'Russia');
|
||||
INSERT INTO t1 VALUES(3, 'Dan', 'dep2', 'Croatia');
|
||||
ERROR HY000: Table has no partition for value from column_list
|
||||
SELECT PARTITION_NAME,TABLE_ROWS
|
||||
FROM INFORMATION_SCHEMA.PARTITIONS
|
||||
WHERE TABLE_NAME = 't1';
|
||||
PARTITION_NAME TABLE_ROWS
|
||||
first_office 2
|
||||
second_office 1
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` int(11) NOT NULL,
|
||||
`name` varchar(255) DEFAULT NULL,
|
||||
`department` varchar(10) DEFAULT NULL,
|
||||
`country` varchar(255) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
/*!50500 PARTITION BY LIST COLUMNS(department,country)
|
||||
(PARTITION first_office VALUES IN (('dep1','Russia'),('dep1','Croatia')) ENGINE = MyISAM,
|
||||
PARTITION second_office VALUES IN (('dep2','Russia')) ENGINE = MyISAM) */
|
||||
SELECT * FROM t1 WHERE department = 'dep2' and country = 'Croatia';
|
||||
id name department country
|
||||
SELECT * FROM t1 WHERE department = 'dep1' and country = 'Croatia';
|
||||
id name department country
|
||||
2 Bob dep1 Croatia
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a DECIMAL)
|
||||
PARTITION BY RANGE COLUMNS (a)
|
||||
(PARTITION p0 VALUES LESS THAN (0));
|
||||
|
@ -168,22 +208,22 @@ partition p3 values less than (1, MAXVALUE, MAXVALUE, MAXVALUE));
|
|||
select partition_method, partition_expression, partition_description
|
||||
from information_schema.partitions where table_name = "t1";
|
||||
partition_method partition_expression partition_description
|
||||
RANGE COLUMNS a,b,c,d 1,'0',MAXVALUE,'1900-01-01'
|
||||
RANGE COLUMNS a,b,c,d 1,'0',MAXVALUE,'1900-01-01'
|
||||
RANGE COLUMNS a,b,c,d 1,'0',MAXVALUE,'1900-01-01'
|
||||
RANGE COLUMNS a,b,c,d 1,'0',MAXVALUE,'1900-01-01'
|
||||
RANGE COLUMNS a,b,c,d 1,'a',MAXVALUE,'1999-01-01'
|
||||
RANGE COLUMNS a,b,c,d 1,'a',MAXVALUE,'1999-01-01'
|
||||
RANGE COLUMNS a,b,c,d 1,'a',MAXVALUE,'1999-01-01'
|
||||
RANGE COLUMNS a,b,c,d 1,'a',MAXVALUE,'1999-01-01'
|
||||
RANGE COLUMNS a,b,c,d 1,'b',MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS a,b,c,d 1,'b',MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS a,b,c,d 1,'b',MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS a,b,c,d 1,'b',MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS a,b,c,d 1,MAXVALUE,MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS a,b,c,d 1,MAXVALUE,MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS a,b,c,d 1,MAXVALUE,MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS a,b,c,d 1,MAXVALUE,MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'0',MAXVALUE,'1900-01-01'
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'0',MAXVALUE,'1900-01-01'
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'0',MAXVALUE,'1900-01-01'
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'0',MAXVALUE,'1900-01-01'
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'a',MAXVALUE,'1999-01-01'
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'a',MAXVALUE,'1999-01-01'
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'a',MAXVALUE,'1999-01-01'
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'a',MAXVALUE,'1999-01-01'
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'b',MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'b',MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'b',MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,'b',MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,MAXVALUE,MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,MAXVALUE,MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,MAXVALUE,MAXVALUE,MAXVALUE
|
||||
RANGE COLUMNS `a`,`b`,`c`,`d` 1,MAXVALUE,MAXVALUE,MAXVALUE
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
|
@ -266,9 +306,9 @@ partition p2 values in ((3, NULL), (NULL, 1)));
|
|||
select partition_method, partition_expression, partition_description
|
||||
from information_schema.partitions where table_name = "t1";
|
||||
partition_method partition_expression partition_description
|
||||
LIST COLUMNS a,b (1,NULL),(2,NULL),(NULL,NULL)
|
||||
LIST COLUMNS a,b (1,1),(2,2)
|
||||
LIST COLUMNS a,b (3,NULL),(NULL,1)
|
||||
LIST COLUMNS `a`,`b` (1,NULL),(2,NULL),(NULL,NULL)
|
||||
LIST COLUMNS `a`,`b` (1,1),(2,2)
|
||||
LIST COLUMNS `a`,`b` (3,NULL),(NULL,1)
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
|
@ -298,11 +338,11 @@ select * from t1 where a > 8;
|
|||
a b
|
||||
select * from t1 where a not between 8 and 8;
|
||||
a b
|
||||
1 NULL
|
||||
2 NULL
|
||||
1 1
|
||||
2 2
|
||||
3 NULL
|
||||
1 NULL
|
||||
1 1
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
|
@ -356,8 +396,8 @@ partition p1 values in (4, NULL, 3));
|
|||
select partition_method, partition_expression, partition_description
|
||||
from information_schema.partitions where table_name = "t1";
|
||||
partition_method partition_expression partition_description
|
||||
LIST COLUMNS a 2,1
|
||||
LIST COLUMNS a 4,NULL,3
|
||||
LIST COLUMNS `a` 2,1
|
||||
LIST COLUMNS `a` 4,NULL,3
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
|
@ -393,18 +433,18 @@ partition p3 values less than (4,'abc','abc'));
|
|||
select partition_method, partition_expression, partition_description
|
||||
from information_schema.partitions where table_name = "t1";
|
||||
partition_method partition_expression partition_description
|
||||
RANGE COLUMNS a,b,c 1,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 1,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 1,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 2,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 2,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 2,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 3,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 3,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 3,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 4,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 4,'abc','abc'
|
||||
RANGE COLUMNS a,b,c 4,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 1,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 1,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 1,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 2,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 2,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 2,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 3,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 3,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 3,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 4,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 4,'abc','abc'
|
||||
RANGE COLUMNS `a`,`b`,`c` 4,'abc','abc'
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
|
@ -437,8 +477,8 @@ partition p1 values less than (1, 'B', 1));
|
|||
select partition_method, partition_expression, partition_description
|
||||
from information_schema.partitions where table_name = "t1";
|
||||
partition_method partition_expression partition_description
|
||||
RANGE COLUMNS a,b,c 1,'A',1
|
||||
RANGE COLUMNS a,b,c 1,'B',1
|
||||
RANGE COLUMNS `a`,`b`,`c` 1,'A',1
|
||||
RANGE COLUMNS `a`,`b`,`c` 1,'B',1
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
|
|
|
@ -24,6 +24,76 @@ CREATE TEMPORARY TABLE tmp_t1 LIKE t1;
|
|||
ERROR HY000: Cannot create temporary table with partitions
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#42954: SQL MODE 'NO_DIR_IN_CREATE' does not work with
|
||||
# subpartitions
|
||||
SET @org_mode=@@sql_mode;
|
||||
SET @@sql_mode='NO_DIR_IN_CREATE';
|
||||
SELECT @@sql_mode;
|
||||
@@sql_mode
|
||||
NO_DIR_IN_CREATE
|
||||
CREATE TABLE t1 (id INT, purchased DATE)
|
||||
PARTITION BY RANGE(YEAR(purchased))
|
||||
SUBPARTITION BY HASH(TO_DAYS(purchased))
|
||||
(PARTITION p0 VALUES LESS THAN MAXVALUE
|
||||
DATA DIRECTORY = '/tmp/not-existing'
|
||||
INDEX DIRECTORY = '/tmp/not-existing');
|
||||
Warnings:
|
||||
Warning 1618 <DATA DIRECTORY> option ignored
|
||||
Warning 1618 <INDEX DIRECTORY> option ignored
|
||||
Warning 1618 <DATA DIRECTORY> option ignored
|
||||
Warning 1618 <INDEX DIRECTORY> option ignored
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` int(11) DEFAULT NULL,
|
||||
`purchased` date DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (YEAR(purchased))
|
||||
SUBPARTITION BY HASH (TO_DAYS(purchased))
|
||||
(PARTITION p0 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (id INT, purchased DATE)
|
||||
PARTITION BY RANGE(YEAR(purchased))
|
||||
SUBPARTITION BY HASH(TO_DAYS(purchased)) SUBPARTITIONS 2
|
||||
(PARTITION p0 VALUES LESS THAN MAXVALUE
|
||||
(SUBPARTITION sp0
|
||||
DATA DIRECTORY = '/tmp/not-existing'
|
||||
INDEX DIRECTORY = '/tmp/not-existing',
|
||||
SUBPARTITION sp1));
|
||||
Warnings:
|
||||
Warning 1618 <DATA DIRECTORY> option ignored
|
||||
Warning 1618 <INDEX DIRECTORY> option ignored
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` int(11) DEFAULT NULL,
|
||||
`purchased` date DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (YEAR(purchased))
|
||||
SUBPARTITION BY HASH (TO_DAYS(purchased))
|
||||
(PARTITION p0 VALUES LESS THAN MAXVALUE
|
||||
(SUBPARTITION sp0 ENGINE = MyISAM,
|
||||
SUBPARTITION sp1 ENGINE = MyISAM)) */
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (id INT, purchased DATE)
|
||||
PARTITION BY RANGE(YEAR(purchased))
|
||||
(PARTITION p0 VALUES LESS THAN MAXVALUE
|
||||
DATA DIRECTORY = '/tmp/not-existing'
|
||||
INDEX DIRECTORY = '/tmp/not-existing');
|
||||
Warnings:
|
||||
Warning 1618 <DATA DIRECTORY> option ignored
|
||||
Warning 1618 <INDEX DIRECTORY> option ignored
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` int(11) DEFAULT NULL,
|
||||
`purchased` date DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (YEAR(purchased))
|
||||
(PARTITION p0 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
|
||||
DROP TABLE t1;
|
||||
SET @@sql_mode= @org_mode;
|
||||
#
|
||||
# Bug#50392: insert_id is not reset for partitioned tables
|
||||
# auto_increment on duplicate entry
|
||||
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY);
|
||||
|
|
|
@ -1436,6 +1436,7 @@ DROP PROCEDURE p1;
|
|||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
DROP EVENT ev1;
|
||||
SHOW STORAGE ENGINES;
|
||||
CREATE USER test_u@localhost;
|
||||
GRANT PROCESS ON *.* TO test_u@localhost;
|
||||
SHOW ENGINE MYISAM MUTEX;
|
||||
|
|
|
@ -47,7 +47,7 @@ create table t1 (s1 binary(2) primary key);
|
|||
insert into t1 values (0x01);
|
||||
insert into t1 values (0x0120);
|
||||
insert into t1 values (0x0100);
|
||||
ERROR 23000: Duplicate entry '\x01\x00' for key 'PRIMARY'
|
||||
ERROR 23000: Duplicate entry '\x01' for key 'PRIMARY'
|
||||
select hex(s1) from t1 order by s1;
|
||||
hex(s1)
|
||||
0100
|
||||
|
|
|
@ -966,3 +966,31 @@ max(case 1 when 1 then c else null end)
|
|||
300.00
|
||||
drop table t1;
|
||||
End of 5.0 tests
|
||||
CREATE TABLE t1 (a INTEGER);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
CREATE TABLE t2 (b INTEGER);
|
||||
INSERT INTO t2 VALUES (NULL), (NULL);
|
||||
SELECT b FROM t1 JOIN t2 WHERE CONVERT(a, DECIMAL)|CONVERT(b, DECIMAL);
|
||||
b
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1 (col0 INTEGER, col1 REAL);
|
||||
CREATE TABLE t2 (col0 INTEGER);
|
||||
INSERT INTO t1 VALUES (0, 0.0), (NULL, NULL);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
SELECT 1 FROM t1
|
||||
JOIN
|
||||
(
|
||||
SELECT t2.col0 FROM t2 RIGHT JOIN t1 USING(col0)
|
||||
GROUP BY t2.col0
|
||||
) AS subq
|
||||
WHERE t1.col1 + CAST(subq.col0 AS DECIMAL);
|
||||
1
|
||||
SELECT 1 FROM t1
|
||||
JOIN
|
||||
(
|
||||
SELECT t2.col0 FROM t2 RIGHT JOIN t1 USING(col0)
|
||||
GROUP BY t2.col0
|
||||
) AS subq
|
||||
WHERE CONCAT(t1.col1, CAST(subq.col0 AS DECIMAL));
|
||||
1
|
||||
DROP TABLE t1, t2;
|
||||
|
|
|
@ -8,14 +8,14 @@ INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|||
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
||||
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
The last event before the COMMIT is use `test`; UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c
|
||||
*** Please look in binlog_multi_engine.test if you have a diff here ****
|
||||
START TRANSACTION;
|
||||
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
||||
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
|
||||
COMMIT;
|
||||
TRUNCATE t1m;
|
||||
|
|
|
@ -412,13 +412,41 @@ master-bin.000001 # Table_map # # table_id: # (test.t1)
|
|||
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t2` (
|
||||
`a` int(11) NOT NULL DEFAULT '0',
|
||||
`b` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t2` (
|
||||
`a` int(11) NOT NULL DEFAULT '0',
|
||||
`b` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB
|
||||
master-bin.000001 # Query # # ROLLBACK
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t2` (
|
||||
`a` int(11) NOT NULL DEFAULT '0',
|
||||
`b` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE IF NOT EXISTS `t2` (
|
||||
`a` int(11) NOT NULL DEFAULT '0',
|
||||
`b` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB
|
||||
master-bin.000001 # Query # # ROLLBACK
|
||||
master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
|
||||
master-bin.000001 # Query # # use `test`; DROP TEMPORARY TABLE IF EXISTS `t2` /* generated by server */
|
||||
reset master;
|
||||
|
|
53
mysql-test/suite/binlog/r/binlog_spurious_ddl_errors.result
Normal file
53
mysql-test/suite/binlog/r/binlog_spurious_ddl_errors.result
Normal file
|
@ -0,0 +1,53 @@
|
|||
SET @old_binlog_format= @@global.binlog_format;
|
||||
INSTALL PLUGIN example SONAME 'ha_example.so';
|
||||
################################################################################
|
||||
# Verifies if ER_BINLOG_STMT_MODE_AND_ROW_ENGINE happens by setting the binlog
|
||||
# format to STATEMENT and the transaction isolation level to READ COMMITTED as
|
||||
# such changes force Innodb to accept changes in the row format.
|
||||
#
|
||||
# When CREATE TABLE, ALTER TABLE, CREATE INDEX and CREATE TRIGGER are executed
|
||||
# any error should be triggered.
|
||||
#
|
||||
# In contrast, CREATE TABLE ... SELECT should trigger the following error:
|
||||
# ER_BINLOG_STMT_MODE_AND_ROW_ENGINE.
|
||||
################################################################################
|
||||
SET binlog_format = STATEMENT;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
CREATE TABLE t_row (a VARCHAR(100)) ENGINE = InnoDB;
|
||||
ALTER TABLE t_row ADD COLUMN b INT;
|
||||
CREATE TRIGGER trig_row BEFORE INSERT ON t_row FOR EACH ROW INSERT INTO t_stmt VALUES (1);
|
||||
CREATE INDEX i ON t_row(a);
|
||||
CREATE TABLE t_row_new ENGINE = InnoDB SELECT * FROM t_row;
|
||||
ERROR HY000: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.
|
||||
DROP TABLE t_row;
|
||||
|
||||
|
||||
################################################################################
|
||||
# Verifies if ER_BINLOG_ROW_MODE_AND_STMT_ENGINE happens by setting the binlog
|
||||
# format to ROW and using a engine, i.e. EXAMPLE, that only supports STATEMENT.
|
||||
#
|
||||
# When CREATE TABLE, ALTER TABLE, CREATE INDEX and CREATE TRIGGER are executed
|
||||
# the error ER_BINLOG_ROW_MODE_AND_STMT_ENGINE is not triggered. Note that other
|
||||
# errors are triggered due to restrictions in the engine.
|
||||
#
|
||||
# In contrast, CREATE TABLE ... SELECT should trigger the following error:
|
||||
# ER_BINLOG_ROW_MODE_AND_STMT_ENGINE.
|
||||
################################################################################
|
||||
SET binlog_format = ROW;
|
||||
CREATE TABLE t_stmt (a VARCHAR(100)) ENGINE = EXAMPLE;
|
||||
ALTER TABLE t_stmt ADD COLUMN b INT;
|
||||
ERROR 42000: This version of MySQL doesn't yet support 'ALTER TABLE'
|
||||
CREATE TRIGGER trig_stmt BEFORE INSERT ON t_stmt FOR EACH ROW INSERT INTO t_stmt VALUES (1);
|
||||
CREATE INDEX i ON t_stmt(a);
|
||||
ERROR 42000: Too many key parts specified; max 0 parts allowed
|
||||
CREATE TABLE t_stmt_new ENGINE = EXAMPLE SELECT * FROM t_stmt;
|
||||
ERROR HY000: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.
|
||||
DROP TABLE t_stmt;
|
||||
|
||||
|
||||
################################################################################
|
||||
# CLEAN UP #
|
||||
################################################################################
|
||||
UNINSTALL PLUGIN example;
|
||||
SET @@global.binlog_format = @old_binlog_format;
|
||||
SET @@session.binlog_format = @old_binlog_format;
|
|
@ -8,7 +8,7 @@ begin;
|
|||
insert into t1 values(1);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
commit;
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
|
@ -23,7 +23,7 @@ begin;
|
|||
insert into t1 values(2);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
rollback;
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
|
@ -42,7 +42,7 @@ savepoint my_savepoint;
|
|||
insert into t1 values(4);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
rollback to savepoint my_savepoint;
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
|
@ -65,7 +65,7 @@ savepoint my_savepoint;
|
|||
insert into t1 values(6);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
rollback to savepoint my_savepoint;
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
|
@ -95,7 +95,7 @@ begin;
|
|||
insert into t1 values(8);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
select get_lock("a",10);
|
||||
get_lock("a",10)
|
||||
1
|
||||
|
@ -111,7 +111,7 @@ reset master;
|
|||
insert into t1 values(9);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
|
@ -127,7 +127,7 @@ insert into t1 values(10);
|
|||
begin;
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
|
@ -246,7 +246,7 @@ Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
|||
create table t0 (n int);
|
||||
insert t0 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
set autocommit=1;
|
||||
insert into t0 select GET_LOCK("lock1",null);
|
||||
Warnings:
|
||||
|
@ -418,6 +418,9 @@ master-bin.000001 # Query # # COMMIT
|
|||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t2 values (100,100)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO t2 values (101,101)
|
||||
master-bin.000001 # Query # # ROLLBACK
|
||||
master-bin.000001 # Query # # use `test`; DROP TABLE t1,t2
|
||||
reset master;
|
||||
create table t1 (a int) engine=innodb;
|
||||
|
@ -429,7 +432,7 @@ begin;
|
|||
insert into t1 values(8);
|
||||
insert into t2 select * from t1;
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements that read from both transactional (or a temporary table of any engine type) and non-transactional tables and write to any of them are unsafe.
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.
|
||||
select get_lock("a",10);
|
||||
get_lock("a",10)
|
||||
1
|
||||
|
|
|
@ -67,11 +67,8 @@ Note 1592 Unsafe statement written to the binary log using statement format sinc
|
|||
SELECT sf_bug50192();
|
||||
sf_bug50192()
|
||||
1
|
||||
Warnings:
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly.
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly.
|
||||
DROP FUNCTION sf_bug50192;
|
||||
DROP TRIGGER tr_bug50192;
|
||||
DROP TABLE t1, t2;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
set @save_binlog_format= @@global.binlog_format;
|
||||
set @save_binlog_dirct= @@global.binlog_direct_non_transactional_updates;
|
||||
set @save_sql_log_bin= @@global.sql_log_bin;
|
||||
create table t1 (a int) engine= myisam;
|
||||
create table t2 (a int) engine= innodb;
|
||||
SELECT @@session.binlog_format;
|
||||
|
@ -8,116 +9,148 @@ ROW
|
|||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
1
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
SET AUTOCOMMIT=1;
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# writable outside a transaction.
|
||||
# Current session values are ROW and FALSE, respectively.
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin'
|
||||
# are writable outside a transaction.
|
||||
# Current session values are ROW, FALSE, TRUE, respectively.
|
||||
set @@session.binlog_format= statement;
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
SELECT @@session.binlog_format;
|
||||
@@session.binlog_format
|
||||
STATEMENT
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
1
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
0
|
||||
begin;
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside a transaction with no preceding updates.
|
||||
# Current session values are STATEMENT and TRUE, respectively.
|
||||
# Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
set @@session.binlog_format= mixed;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
insert into t2 values (1);
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside a transaction with preceding transactional updates.
|
||||
# Current session values are STATEMENT and TRUE, respectively.
|
||||
# Current session values are STATEMENT, TRUE and FALSE, respectively.
|
||||
set @@session.binlog_format= row;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
commit;
|
||||
begin;
|
||||
insert into t1 values (2);
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format'
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside a transaction with preceding non-transactional updates.
|
||||
# Current session values are STATEMENT and TRUE, respectively.
|
||||
# Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
set @@session.binlog_format= mixed;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
commit;
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# writable when AUTOCOMMIT=0, before a transaction has started.
|
||||
# Current session values are STATEMENT and TRUE, respectively.
|
||||
# Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
set AUTOCOMMIT=0;
|
||||
set @@session.binlog_format= row;
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
set @@session.sql_log_bin= TRUE;
|
||||
SELECT @@session.binlog_format;
|
||||
@@session.binlog_format
|
||||
ROW
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
0
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
insert into t1 values (3);
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside an AUTOCOMMIT=0 transaction
|
||||
# with preceding non-transactional updates.
|
||||
# Current session values are ROW and FALSE, respectively.
|
||||
# Current session values are ROW, FALSE, TRUE, respectively.
|
||||
set @@session.binlog_format= statement;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
SELECT @@session.binlog_format;
|
||||
@@session.binlog_format
|
||||
ROW
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
0
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
commit;
|
||||
insert into t2 values (4);
|
||||
# Test that the session variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# Test that the session variable 'binlog_format',
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# read-only inside an AUTOCOMMIT=0 transaction with
|
||||
# preceding transactional updates.
|
||||
# Current session values are ROW and FALSE, respectively.
|
||||
# Current session values are ROW, FALSE, TRUE, respectively.
|
||||
set @@session.binlog_format= statement;
|
||||
ERROR HY000: Cannot modify @@session.binlog_format inside a transaction
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
ERROR HY000: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
ERROR HY000: Cannot modify @@session.sql_log_bin inside a transaction
|
||||
SELECT @@session.binlog_format;
|
||||
@@session.binlog_format
|
||||
ROW
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
0
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
commit;
|
||||
begin;
|
||||
insert into t2 values (5);
|
||||
# Test that the global variable 'binlog_format' and
|
||||
# 'binlog_direct_non_transactional_updates' are
|
||||
# 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
# writable inside a transaction.
|
||||
# Current session values are ROW and FALSE, respectively.
|
||||
# Current session values are ROW, FALSE, TRUE respectively.
|
||||
SELECT @@global.binlog_format;
|
||||
@@global.binlog_format
|
||||
ROW
|
||||
set @@global.binlog_format= statement;
|
||||
set @@global.binlog_direct_non_transactional_updates= TRUE;
|
||||
set @@global.sql_log_bin= FALSE;
|
||||
SELECT @@global.binlog_format;
|
||||
@@global.binlog_format
|
||||
STATEMENT
|
||||
SELECT @@global.binlog_direct_non_transactional_updates;
|
||||
@@global.binlog_direct_non_transactional_updates
|
||||
1
|
||||
SELECT @@global.sql_log_bin;
|
||||
@@global.sql_log_bin
|
||||
0
|
||||
commit;
|
||||
set @@global.binlog_format= @save_binlog_format;
|
||||
set @@global.binlog_direct_non_transactional_updates= @save_binlog_dirct;
|
||||
set @@global.sql_log_bin= @save_sql_log_bin;
|
||||
create table t3(a int, b int) engine= innodb;
|
||||
create table t4(a int) engine= innodb;
|
||||
create table t5(a int) engine= innodb;
|
||||
|
@ -153,6 +186,23 @@ ERROR HY000: Cannot change the binlog direct flag inside a stored function or tr
|
|||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
@@session.binlog_direct_non_transactional_updates
|
||||
0
|
||||
create table t9(a int, b int) engine= innodb;
|
||||
create table t10(a int) engine= innodb;
|
||||
create table t11(a int) engine= innodb;
|
||||
create trigger tr3 after insert on t9 for each row begin
|
||||
insert into t10(a) values(1);
|
||||
set @@session.sql_log_bin= TRUE;
|
||||
insert into t10(a) values(2);
|
||||
insert into t11(a) values(3);
|
||||
end |
|
||||
# Test that the session variable 'sql_log_bin' is
|
||||
# read-only in sub-statements.
|
||||
# Current session value is FALSE.
|
||||
insert into t9(a,b) values(1,1);
|
||||
ERROR HY000: Cannot change the sql_log_bin inside a stored function or trigger
|
||||
SELECT @@session.sql_log_bin;
|
||||
@@session.sql_log_bin
|
||||
1
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
drop table t3;
|
||||
|
@ -161,3 +211,6 @@ drop table t5;
|
|||
drop table t6;
|
||||
drop table t7;
|
||||
drop table t8;
|
||||
drop table t9;
|
||||
drop table t10;
|
||||
drop table t11;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
--innodb $EXAMPLE_PLUGIN_OPT
|
95
mysql-test/suite/binlog/t/binlog_spurious_ddl_errors.test
Normal file
95
mysql-test/suite/binlog/t/binlog_spurious_ddl_errors.test
Normal file
|
@ -0,0 +1,95 @@
|
|||
################################################################################
|
||||
# BUG#50479 DDL stmt on row-only/stmt-only tables generate spurious
|
||||
# binlog_format errors
|
||||
#
|
||||
# In the fix of BUG#39934 in 5.1-rep+3, errors are generated when
|
||||
# binlog_format=row and a statement modifies a table restricted to
|
||||
# statement-logging (ER_BINLOG_ROW_MODE_AND_STMT_ENGINE); or if
|
||||
# binlog_format=statement and a statement modifies a table limited to
|
||||
# row-logging (ER_BINLOG_STMT_MODE_AND_ROW_ENGINE).
|
||||
#
|
||||
# In this test case, we check if some DDL statements that lock tables do not
|
||||
# trigger errors as they do not generate rows events and as such are harmless
|
||||
# from the point of view of conflicts between the engine's supported logging
|
||||
# format and the value of binlog_format.
|
||||
#
|
||||
# In particular, we check if:
|
||||
# 1 - ALTER TABLE, CREATE INDEX and CREATE TRIGGER do not generate either
|
||||
# ER_BINLOG_STMT_MODE_AND_ROW_ENGINE or ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
|
||||
#
|
||||
# 2 - CREATE TABLE ... SELECT generates an error because the command can
|
||||
# generate row events but CREATE TABLE without SELECT does not generate
|
||||
# an error.
|
||||
################################################################################
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_example_plugin.inc
|
||||
--source include/have_log_bin.inc
|
||||
|
||||
SET @old_binlog_format= @@global.binlog_format;
|
||||
INSTALL PLUGIN example SONAME 'ha_example.so';
|
||||
|
||||
--echo ################################################################################
|
||||
--echo # Verifies if ER_BINLOG_STMT_MODE_AND_ROW_ENGINE happens by setting the binlog
|
||||
--echo # format to STATEMENT and the transaction isolation level to READ COMMITTED as
|
||||
--echo # such changes force Innodb to accept changes in the row format.
|
||||
--echo #
|
||||
--echo # When CREATE TABLE, ALTER TABLE, CREATE INDEX and CREATE TRIGGER are executed
|
||||
--echo # any error should be triggered.
|
||||
--echo #
|
||||
--echo # In contrast, CREATE TABLE ... SELECT should trigger the following error:
|
||||
--echo # ER_BINLOG_STMT_MODE_AND_ROW_ENGINE.
|
||||
--echo ################################################################################
|
||||
SET binlog_format = STATEMENT;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
CREATE TABLE t_row (a VARCHAR(100)) ENGINE = InnoDB;
|
||||
|
||||
ALTER TABLE t_row ADD COLUMN b INT;
|
||||
|
||||
CREATE TRIGGER trig_row BEFORE INSERT ON t_row FOR EACH ROW INSERT INTO t_stmt VALUES (1);
|
||||
|
||||
CREATE INDEX i ON t_row(a);
|
||||
|
||||
--error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
|
||||
CREATE TABLE t_row_new ENGINE = InnoDB SELECT * FROM t_row;
|
||||
|
||||
DROP TABLE t_row;
|
||||
|
||||
--echo
|
||||
--echo
|
||||
|
||||
--echo ################################################################################
|
||||
--echo # Verifies if ER_BINLOG_ROW_MODE_AND_STMT_ENGINE happens by setting the binlog
|
||||
--echo # format to ROW and using a engine, i.e. EXAMPLE, that only supports STATEMENT.
|
||||
--echo #
|
||||
--echo # When CREATE TABLE, ALTER TABLE, CREATE INDEX and CREATE TRIGGER are executed
|
||||
--echo # the error ER_BINLOG_ROW_MODE_AND_STMT_ENGINE is not triggered. Note that other
|
||||
--echo # errors are triggered due to restrictions in the engine.
|
||||
--echo #
|
||||
--echo # In contrast, CREATE TABLE ... SELECT should trigger the following error:
|
||||
--echo # ER_BINLOG_ROW_MODE_AND_STMT_ENGINE.
|
||||
--echo ################################################################################
|
||||
SET binlog_format = ROW;
|
||||
CREATE TABLE t_stmt (a VARCHAR(100)) ENGINE = EXAMPLE;
|
||||
|
||||
--error ER_NOT_SUPPORTED_YET
|
||||
ALTER TABLE t_stmt ADD COLUMN b INT;
|
||||
|
||||
CREATE TRIGGER trig_stmt BEFORE INSERT ON t_stmt FOR EACH ROW INSERT INTO t_stmt VALUES (1);
|
||||
|
||||
--error ER_TOO_MANY_KEY_PARTS
|
||||
CREATE INDEX i ON t_stmt(a);
|
||||
|
||||
--error ER_BINLOG_ROW_MODE_AND_STMT_ENGINE
|
||||
CREATE TABLE t_stmt_new ENGINE = EXAMPLE SELECT * FROM t_stmt;
|
||||
|
||||
DROP TABLE t_stmt;
|
||||
|
||||
--echo
|
||||
--echo
|
||||
|
||||
--echo ################################################################################
|
||||
--echo # CLEAN UP #
|
||||
--echo ################################################################################
|
||||
UNINSTALL PLUGIN example;
|
||||
SET @@global.binlog_format = @old_binlog_format;
|
||||
SET @@session.binlog_format = @old_binlog_format;
|
|
@ -10,107 +10,128 @@ source include/have_binlog_format_row.inc;
|
|||
|
||||
set @save_binlog_format= @@global.binlog_format;
|
||||
set @save_binlog_dirct= @@global.binlog_direct_non_transactional_updates;
|
||||
set @save_sql_log_bin= @@global.sql_log_bin;
|
||||
create table t1 (a int) engine= myisam;
|
||||
create table t2 (a int) engine= innodb;
|
||||
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
SET AUTOCOMMIT=1;
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # writable outside a transaction.
|
||||
--echo # Current session values are ROW and FALSE, respectively.
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin'
|
||||
--echo # are writable outside a transaction.
|
||||
--echo # Current session values are ROW, FALSE, TRUE, respectively.
|
||||
set @@session.binlog_format= statement;
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
|
||||
begin;
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside a transaction with no preceding updates.
|
||||
--echo # Current session values are STATEMENT and TRUE, respectively.
|
||||
--echo # Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
||||
set @@session.binlog_format= mixed;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
|
||||
insert into t2 values (1);
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside a transaction with preceding transactional updates.
|
||||
--echo # Current session values are STATEMENT and TRUE, respectively.
|
||||
--echo # Current session values are STATEMENT, TRUE and FALSE, respectively.
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
||||
set @@session.binlog_format= row;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
commit;
|
||||
|
||||
begin;
|
||||
insert into t1 values (2);
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format'
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside a transaction with preceding non-transactional updates.
|
||||
--echo # Current session values are STATEMENT and TRUE, respectively.
|
||||
--echo # Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
||||
set @@session.binlog_format= mixed;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
commit;
|
||||
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # writable when AUTOCOMMIT=0, before a transaction has started.
|
||||
--echo # Current session values are STATEMENT and TRUE, respectively.
|
||||
--echo # Current session values are STATEMENT, TRUE, FALSE, respectively.
|
||||
set AUTOCOMMIT=0;
|
||||
set @@session.binlog_format= row;
|
||||
set @@session.binlog_direct_non_transactional_updates= FALSE;
|
||||
set @@session.sql_log_bin= TRUE;
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
|
||||
insert into t1 values (3);
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside an AUTOCOMMIT=0 transaction
|
||||
--echo # with preceding non-transactional updates.
|
||||
--echo # Current session values are ROW and FALSE, respectively.
|
||||
--echo # Current session values are ROW, FALSE, TRUE, respectively.
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
||||
set @@session.binlog_format= statement;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
commit;
|
||||
|
||||
insert into t2 values (4);
|
||||
--echo # Test that the session variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # Test that the session variable 'binlog_format',
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # read-only inside an AUTOCOMMIT=0 transaction with
|
||||
--echo # preceding transactional updates.
|
||||
--echo # Current session values are ROW and FALSE, respectively.
|
||||
--echo # Current session values are ROW, FALSE, TRUE, respectively.
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT
|
||||
set @@session.binlog_format= statement;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT
|
||||
set @@session.binlog_direct_non_transactional_updates= TRUE;
|
||||
--error ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
set @@session.sql_log_bin= FALSE;
|
||||
SELECT @@session.binlog_format;
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
SELECT @@session.sql_log_bin;
|
||||
commit;
|
||||
|
||||
begin;
|
||||
insert into t2 values (5);
|
||||
--echo # Test that the global variable 'binlog_format' and
|
||||
--echo # 'binlog_direct_non_transactional_updates' are
|
||||
--echo # 'binlog_direct_non_transactional_updates' and 'sql_log_bin' are
|
||||
--echo # writable inside a transaction.
|
||||
--echo # Current session values are ROW and FALSE, respectively.
|
||||
--echo # Current session values are ROW, FALSE, TRUE respectively.
|
||||
SELECT @@global.binlog_format;
|
||||
set @@global.binlog_format= statement;
|
||||
set @@global.binlog_direct_non_transactional_updates= TRUE;
|
||||
set @@global.sql_log_bin= FALSE;
|
||||
SELECT @@global.binlog_format;
|
||||
SELECT @@global.binlog_direct_non_transactional_updates;
|
||||
SELECT @@global.sql_log_bin;
|
||||
commit;
|
||||
|
||||
set @@global.binlog_format= @save_binlog_format;
|
||||
set @@global.binlog_direct_non_transactional_updates= @save_binlog_dirct;
|
||||
set @@global.sql_log_bin= @save_sql_log_bin;
|
||||
|
||||
create table t3(a int, b int) engine= innodb;
|
||||
create table t4(a int) engine= innodb;
|
||||
|
@ -151,6 +172,25 @@ delimiter ;|
|
|||
insert into t6(a,b) values(1,1);
|
||||
SELECT @@session.binlog_direct_non_transactional_updates;
|
||||
|
||||
create table t9(a int, b int) engine= innodb;
|
||||
create table t10(a int) engine= innodb;
|
||||
create table t11(a int) engine= innodb;
|
||||
delimiter |;
|
||||
eval create trigger tr3 after insert on t9 for each row begin
|
||||
insert into t10(a) values(1);
|
||||
set @@session.sql_log_bin= TRUE;
|
||||
insert into t10(a) values(2);
|
||||
insert into t11(a) values(3);
|
||||
end |
|
||||
delimiter ;|
|
||||
|
||||
--echo # Test that the session variable 'sql_log_bin' is
|
||||
--echo # read-only in sub-statements.
|
||||
--echo # Current session value is FALSE.
|
||||
--error ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN
|
||||
insert into t9(a,b) values(1,1);
|
||||
SELECT @@session.sql_log_bin;
|
||||
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
drop table t3;
|
||||
|
@ -159,3 +199,6 @@ drop table t5;
|
|||
drop table t6;
|
||||
drop table t7;
|
||||
drop table t8;
|
||||
drop table t9;
|
||||
drop table t10;
|
||||
drop table t11;
|
||||
|
|
|
@ -9,6 +9,6 @@
|
|||
# Do not use any TAB characters for whitespace.
|
||||
#
|
||||
##############################################################################
|
||||
binlog_truncate_innodb : BUG#42643 2009-02-06 mats Changes to InnoDB requires to complete fix for BUG#36763
|
||||
binlog_unsafe : BUG#50312 2010-01-13 lsoares Warnings for unsafe sub-statement not returned to client
|
||||
|
||||
binlog_truncate_innodb : BUG#42643 2009-02-06 mats Changes to InnoDB requires to complete fix for BUG#36763
|
||||
binlog_unsafe : BUG#50312 2010-01-13 lsoares Warnings for unsafe sub-statement not returned to client
|
||||
binlog_spurious_ddl_errors : BUG#54195 2010-06-03 alik binlog_spurious_ddl_errors.test fails, thus disabled
|
||||
|
|
30
mysql-test/suite/innodb/r/innodb-autoinc-44030.result
Normal file
30
mysql-test/suite/innodb/r/innodb-autoinc-44030.result
Normal file
|
@ -0,0 +1,30 @@
|
|||
drop table if exists t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (null);
|
||||
INSERT INTO t1 VALUES (null);
|
||||
ALTER TABLE t1 CHANGE c1 d1 INT NOT NULL AUTO_INCREMENT;
|
||||
SELECT * FROM t1;
|
||||
d1
|
||||
1
|
||||
2
|
||||
SELECT * FROM t1;
|
||||
d1
|
||||
1
|
||||
2
|
||||
INSERT INTO t1 VALUES(null);
|
||||
ALTER TABLE t1 AUTO_INCREMENT = 3;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`d1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`d1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 VALUES(null);
|
||||
SELECT * FROM t1;
|
||||
d1
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
DROP TABLE t1;
|
|
@ -868,35 +868,6 @@ Got one of the listed errors
|
|||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (null);
|
||||
INSERT INTO t1 VALUES (null);
|
||||
ALTER TABLE t1 CHANGE c1 d1 INT NOT NULL AUTO_INCREMENT;
|
||||
SELECT * FROM t1;
|
||||
d1
|
||||
1
|
||||
2
|
||||
SELECT * FROM t1;
|
||||
d1
|
||||
1
|
||||
2
|
||||
INSERT INTO t1 VALUES(null);
|
||||
Got one of the listed errors
|
||||
ALTER TABLE t1 AUTO_INCREMENT = 3;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`d1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`d1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 VALUES(null);
|
||||
SELECT * FROM t1;
|
||||
d1
|
||||
1
|
||||
2
|
||||
3
|
||||
DROP TABLE t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
SHOW VARIABLES LIKE "%auto_inc%";
|
||||
Variable_name Value
|
||||
auto_increment_increment 1
|
||||
|
@ -1111,18 +1082,165 @@ c1 c2
|
|||
3 innodb
|
||||
4 NULL
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE T1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) AUTO_INCREMENT=10 ENGINE=InnoDB;
|
||||
CREATE INDEX i1 on T1(c2);
|
||||
SHOW CREATE TABLE T1;
|
||||
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) AUTO_INCREMENT=10 ENGINE=InnoDB;
|
||||
CREATE INDEX i1 on t1(c2);
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
T1 CREATE TABLE `T1` (
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`c2` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`c1`),
|
||||
KEY `i1` (`c2`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
|
||||
INSERT INTO T1 (c2) values (0);
|
||||
SELECT * FROM T1;
|
||||
INSERT INTO t1 (c2) values (0);
|
||||
SELECT * FROM t1;
|
||||
c1 c2
|
||||
10 0
|
||||
DROP TABLE T1;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
CREATE TABLE t1(C1 DOUBLE AUTO_INCREMENT KEY, C2 CHAR(10)) ENGINE=InnoDB;
|
||||
INSERT INTO t1(C1, C2) VALUES (1, 'innodb'), (3, 'innodb');
|
||||
INSERT INTO t1(C2) VALUES ('innodb');
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`C1` double NOT NULL AUTO_INCREMENT,
|
||||
`C2` char(10) DEFAULT NULL,
|
||||
PRIMARY KEY (`C1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(C1 FLOAT AUTO_INCREMENT KEY, C2 CHAR(10)) ENGINE=InnoDB;
|
||||
INSERT INTO t1(C1, C2) VALUES (1, 'innodb'), (3, 'innodb');
|
||||
INSERT INTO t1(C2) VALUES ('innodb');
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`C1` float NOT NULL AUTO_INCREMENT,
|
||||
`C2` char(10) DEFAULT NULL,
|
||||
PRIMARY KEY (`C1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
CREATE TABLE t1 (c1 INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 SET c1 = 1;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
|
||||
INSERT INTO t1 SET c1 = 2;
|
||||
INSERT INTO t1 SET c1 = -1;
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
-1
|
||||
1
|
||||
2
|
||||
INSERT INTO t1 SET c1 = -1;
|
||||
Got one of the listed errors
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
|
||||
REPLACE INTO t1 VALUES (-1);
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
-1
|
||||
1
|
||||
2
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (-685113344), (1), (NULL), (NULL);
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
-685113344
|
||||
1
|
||||
2
|
||||
3
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (-685113344), (2), (NULL), (NULL);
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
-685113344
|
||||
2
|
||||
3
|
||||
4
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (NULL), (2), (-685113344), (NULL);
|
||||
INSERT INTO t1 VALUES (4), (5), (6), (NULL);
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
-685113344
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (NULL), (2), (-685113344), (5);
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
-685113344
|
||||
1
|
||||
2
|
||||
5
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1), (2), (-685113344), (NULL);
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
-685113344
|
||||
1
|
||||
2
|
||||
3
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`c1`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
|
@ -46,13 +46,6 @@ t1 CREATE TABLE `t1` (
|
|||
KEY `d2` (`d`),
|
||||
KEY `b` (`b`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
CREATE TABLE `t1#1`(a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
alter table t1 add unique index (c), add index (d);
|
||||
ERROR HY000: Table 'test.t1#1' already exists
|
||||
rename table `t1#1` to `t1#2`;
|
||||
alter table t1 add unique index (c), add index (d);
|
||||
ERROR HY000: Table 'test.t1#2' already exists
|
||||
drop table `t1#2`;
|
||||
alter table t1 add unique index (c), add index (d);
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
|
@ -441,6 +434,7 @@ t3 CREATE TABLE `t3` (
|
|||
KEY `c` (`c`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
alter table t2 drop index b, add index (b);
|
||||
ERROR 42000: Incorrect index name 'b'
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
|
@ -451,8 +445,8 @@ t2 CREATE TABLE `t2` (
|
|||
`e` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`),
|
||||
UNIQUE KEY `dc` (`d`,`c`),
|
||||
KEY `c` (`c`),
|
||||
KEY `b` (`b`),
|
||||
KEY `c` (`c`),
|
||||
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t1` (`b`) ON DELETE CASCADE,
|
||||
CONSTRAINT `t2_ibfk_2` FOREIGN KEY (`c`) REFERENCES `t3` (`c`),
|
||||
CONSTRAINT `t2_ibfk_3` FOREIGN KEY (`d`) REFERENCES `t4` (`d`)
|
||||
|
@ -841,48 +835,6 @@ test.t1 check status OK
|
|||
explain select * from t1 where b like 'adfd%';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL b NULL NULL NULL 15 Using where
|
||||
create table t2(a int, b varchar(255), primary key(a,b)) engine=innodb;
|
||||
insert into t2 select a,left(b,255) from t1;
|
||||
drop table t1;
|
||||
rename table t2 to t1;
|
||||
set innodb_lock_wait_timeout=1;
|
||||
begin;
|
||||
select a from t1 limit 1 for update;
|
||||
a
|
||||
22
|
||||
set innodb_lock_wait_timeout=1;
|
||||
create index t1ba on t1 (b,a);
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
commit;
|
||||
begin;
|
||||
select a from t1 limit 1 lock in share mode;
|
||||
a
|
||||
22
|
||||
create index t1ba on t1 (b,a);
|
||||
drop index t1ba on t1;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
commit;
|
||||
explain select a from t1 order by b;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index NULL t1ba 261 NULL 15 Using index
|
||||
select a,sleep(2+a/100) from t1 order by b limit 3;
|
||||
select sleep(1);
|
||||
sleep(1)
|
||||
0
|
||||
drop index t1ba on t1;
|
||||
a sleep(2+a/100)
|
||||
22 0
|
||||
44 0
|
||||
66 0
|
||||
explain select a from t1 order by b;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index NULL PRIMARY 261 NULL 15 Using index; Using filesort
|
||||
select a from t1 order by b limit 3;
|
||||
a
|
||||
22
|
||||
66
|
||||
44
|
||||
commit;
|
||||
drop table t1;
|
||||
set global innodb_file_per_table=on;
|
||||
set global innodb_file_format='Barracuda';
|
||||
|
@ -1133,39 +1085,3 @@ t2 CREATE TABLE `t2` (
|
|||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT, b CHAR(1)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (3,'a'),(3,'b'),(1,'c'),(0,'d'),(1,'e');
|
||||
BEGIN;
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
3 a
|
||||
3 b
|
||||
1 c
|
||||
0 d
|
||||
1 e
|
||||
CREATE INDEX t1a ON t1(a);
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
3 a
|
||||
3 b
|
||||
1 c
|
||||
0 d
|
||||
1 e
|
||||
SELECT * FROM t1 FORCE INDEX(t1a) ORDER BY a;
|
||||
ERROR HY000: Table definition has changed, please retry transaction
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
3 a
|
||||
3 b
|
||||
1 c
|
||||
0 d
|
||||
1 e
|
||||
COMMIT;
|
||||
SELECT * FROM t1 FORCE INDEX(t1a) ORDER BY a;
|
||||
a b
|
||||
0 d
|
||||
1 c
|
||||
1 e
|
||||
3 a
|
||||
3 b
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -27,9 +27,10 @@ commit;
|
|||
drop table t1;
|
||||
#
|
||||
# Old lock method (where LOCK TABLE was ignored by InnoDB) no longer
|
||||
# works due to fix for bugs #46272 "MySQL 5.4.4, new MDL: unnecessary
|
||||
# deadlock" and bug #37346 "innodb does not detect deadlock between
|
||||
# update and alter table".
|
||||
# works when LOCK TABLE ... WRITE is used due to fix for bugs #46272
|
||||
# "MySQL 5.4.4, new MDL: unnecessary and bug #37346 "innodb does not
|
||||
# detect deadlock between update and alter table". But it still works
|
||||
# for LOCK TABLE ... READ.
|
||||
#
|
||||
set @@innodb_table_locks=0;
|
||||
create table t1 (id integer primary key, x integer) engine=INNODB;
|
||||
|
@ -61,4 +62,30 @@ commit;
|
|||
# Reap LOCK TABLE.
|
||||
unlock tables;
|
||||
# Connection 'con1'.
|
||||
select * from t1 where id = 0 for update;
|
||||
id x
|
||||
0 1
|
||||
# Connection 'con2'.
|
||||
# The below statement should not be blocked as LOCK TABLES ... READ
|
||||
# does not take strong SQL-level lock on t1. SELECTs which do not
|
||||
# conflict with transaction in the first connections should not be
|
||||
# blocked.
|
||||
lock table t1 read;
|
||||
select * from t1;
|
||||
id x
|
||||
0 1
|
||||
1 1
|
||||
2 2
|
||||
select * from t1 where id = 1 lock in share mode;
|
||||
id x
|
||||
1 1
|
||||
unlock tables;
|
||||
select * from t1;
|
||||
id x
|
||||
0 1
|
||||
1 1
|
||||
2 2
|
||||
commit;
|
||||
# Connection 'con1'.
|
||||
commit;
|
||||
drop table t1;
|
110
mysql-test/suite/innodb/r/innodb-system-table-view.result
Normal file
110
mysql-test/suite/innodb/r/innodb-system-table-view.result
Normal file
|
@ -0,0 +1,110 @@
|
|||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;
|
||||
TABLE_ID NAME FLAG N_COLS SPACE
|
||||
11 SYS_FOREIGN 0 7 0
|
||||
12 SYS_FOREIGN_COLS 0 7 0
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES;
|
||||
INDEX_ID NAME TABLE_ID TYPE N_FIELDS PAGE_NO SPACE
|
||||
11 ID_IND 11 3 1 302 0
|
||||
12 FOR_IND 11 0 1 303 0
|
||||
13 REF_IND 11 0 1 304 0
|
||||
14 ID_IND 12 3 2 305 0
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS;
|
||||
TABLE_ID NAME POS MTYPE PRTYPE LEN
|
||||
11 ID 0 1 524292 0
|
||||
11 FOR_NAME 1 1 524292 0
|
||||
11 REF_NAME 2 1 524292 0
|
||||
11 N_COLS 3 6 0 4
|
||||
12 ID 0 1 524292 0
|
||||
12 POS 1 6 0 4
|
||||
12 FOR_COL_NAME 2 1 524292 0
|
||||
12 REF_COL_NAME 3 1 524292 0
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS;
|
||||
INDEX_ID NAME POS
|
||||
11 ID 0
|
||||
12 FOR_NAME 0
|
||||
13 REF_NAME 0
|
||||
14 ID 0
|
||||
14 POS 1
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN;
|
||||
ID FOR_NAME REF_NAME N_COLS TYPE
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS;
|
||||
ID FOR_COL_NAME REF_COL_NAME POS
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS;
|
||||
TABLE_ID NAME STATS_INITIALIZED NUM_ROWS CLUST_INDEX_SIZE OTHER_INDEX_SIZE MODIFIED_COUNTER AUTOINC MYSQL_HANDLES_OPENED
|
||||
11 SYS_FOREIGN Uninitialized 0 0 0 0 0 0
|
||||
12 SYS_FOREIGN_COLS Uninitialized 0 0 0 0 0 0
|
||||
CREATE TABLE parent (id INT NOT NULL,
|
||||
PRIMARY KEY (id)) ENGINE=INNODB;
|
||||
CREATE TABLE child (id INT, parent_id INT,
|
||||
INDEX par_ind (parent_id),
|
||||
CONSTRAINT constraint_test
|
||||
FOREIGN KEY (parent_id) REFERENCES parent(id)
|
||||
ON DELETE CASCADE) ENGINE=INNODB;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN;
|
||||
ID FOR_NAME REF_NAME N_COLS TYPE
|
||||
test/constraint_test test/child test/parent 1 1
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS;
|
||||
ID FOR_COL_NAME REF_COL_NAME POS
|
||||
test/constraint_test parent_id id 0
|
||||
INSERT INTO parent VALUES(1);
|
||||
SELECT name, num_rows, mysql_handles_opened
|
||||
FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS
|
||||
WHERE name LIKE "%parent";
|
||||
name num_rows mysql_handles_opened
|
||||
test/parent 1 1
|
||||
SELECT NAME, FLAG, N_COLS, SPACE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;
|
||||
NAME FLAG N_COLS SPACE
|
||||
SYS_FOREIGN 0 7 0
|
||||
SYS_FOREIGN_COLS 0 7 0
|
||||
test/child 1 5 0
|
||||
test/parent 1 4 0
|
||||
SELECT name, n_fields
|
||||
from INFORMATION_SCHEMA.INNODB_SYS_INDEXES
|
||||
WHERE table_id In (SELECT table_id from
|
||||
INFORMATION_SCHEMA.INNODB_SYS_TABLES
|
||||
WHERE name LIKE "%parent%");
|
||||
name n_fields
|
||||
PRIMARY 1
|
||||
SELECT name, n_fields
|
||||
from INFORMATION_SCHEMA.INNODB_SYS_INDEXES
|
||||
WHERE table_id In (SELECT table_id from
|
||||
INFORMATION_SCHEMA.INNODB_SYS_TABLES
|
||||
WHERE name LIKE "%child%");
|
||||
name n_fields
|
||||
GEN_CLUST_INDEX 0
|
||||
par_ind 1
|
||||
SELECT name, pos, mtype, len
|
||||
from INFORMATION_SCHEMA.INNODB_SYS_COLUMNS
|
||||
WHERE table_id In (SELECT table_id from
|
||||
INFORMATION_SCHEMA.INNODB_SYS_TABLES
|
||||
WHERE name LIKE "%child%");
|
||||
name pos mtype len
|
||||
id 0 6 4
|
||||
parent_id 1 6 4
|
||||
DROP TABLE child;
|
||||
DROP TABLE parent;
|
||||
CREATE TABLE parent (id INT NOT NULL, newid INT NOT NULL,
|
||||
PRIMARY KEY (id, newid)) ENGINE=INNODB;
|
||||
CREATE TABLE child (id INT, parent_id INT,
|
||||
INDEX par_ind (parent_id),
|
||||
CONSTRAINT constraint_test
|
||||
FOREIGN KEY (id, parent_id) REFERENCES parent(id, newid)
|
||||
ON DELETE CASCADE) ENGINE=INNODB;
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN;
|
||||
ID FOR_NAME REF_NAME N_COLS TYPE
|
||||
test/constraint_test test/child test/parent 2 1
|
||||
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS;
|
||||
ID FOR_COL_NAME REF_COL_NAME POS
|
||||
test/constraint_test id id 0
|
||||
test/constraint_test parent_id newid 1
|
||||
INSERT INTO parent VALUES(1, 9);
|
||||
SELECT * FROM parent WHERE id IN (SELECT id FROM parent);
|
||||
id newid
|
||||
1 9
|
||||
SELECT name, num_rows, mysql_handles_opened
|
||||
FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS
|
||||
WHERE name LIKE "%parent";
|
||||
name num_rows mysql_handles_opened
|
||||
test/parent 1 2
|
||||
DROP TABLE child;
|
||||
DROP TABLE parent;
|
|
@ -169,10 +169,10 @@ Table Op Msg_type Msg_text
|
|||
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t1 optimize status OK
|
||||
show keys from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 PRIMARY 1 id A # NULL NULL BTREE
|
||||
t1 1 parent_id 1 parent_id A # NULL NULL BTREE
|
||||
t1 1 level 1 level A # NULL NULL BTREE
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
|
||||
t1 0 PRIMARY 1 id A # NULL NULL BTREE
|
||||
t1 1 parent_id 1 parent_id A # NULL NULL BTREE
|
||||
t1 1 level 1 level A # NULL NULL BTREE
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
gesuchnr int(11) DEFAULT '0' NOT NULL,
|
||||
|
@ -213,8 +213,8 @@ analyze table t1;
|
|||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status OK
|
||||
show keys from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 skr 1 a A # NULL NULL YES BTREE
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
|
||||
t1 1 skr 1 a A # NULL NULL YES BTREE
|
||||
drop table t1;
|
||||
create table t1 (a int,b varchar(20),key(a)) engine=innodb;
|
||||
insert into t1 values (1,""), (2,"testing");
|
||||
|
@ -401,13 +401,13 @@ drop table t1;
|
|||
CREATE TABLE t1 (a int not null, b int not null,c int not null,
|
||||
key(a),primary key(a,b), unique(c),key(a),unique(b));
|
||||
show index from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 PRIMARY 1 a A # NULL NULL BTREE
|
||||
t1 0 PRIMARY 2 b A # NULL NULL BTREE
|
||||
t1 0 c 1 c A # NULL NULL BTREE
|
||||
t1 0 b 1 b A # NULL NULL BTREE
|
||||
t1 1 a 1 a A # NULL NULL BTREE
|
||||
t1 1 a_2 1 a A # NULL NULL BTREE
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
|
||||
t1 0 PRIMARY 1 a A # NULL NULL BTREE
|
||||
t1 0 PRIMARY 2 b A # NULL NULL BTREE
|
||||
t1 0 c 1 c A # NULL NULL BTREE
|
||||
t1 0 b 1 b A # NULL NULL BTREE
|
||||
t1 1 a 1 a A # NULL NULL BTREE
|
||||
t1 1 a_2 1 a A # NULL NULL BTREE
|
||||
drop table t1;
|
||||
create table t1 (col1 int not null, col2 char(4) not null, primary key(col1));
|
||||
alter table t1 engine=innodb;
|
||||
|
@ -692,6 +692,8 @@ select count(*) from t1 where sca_pic is null;
|
|||
count(*)
|
||||
2
|
||||
alter table t1 drop index sca_pic, add index sca_pic (cat_code, sca_pic);
|
||||
alter table t1 drop index sca_pic;
|
||||
alter table t1 add index sca_pic (cat_code, sca_pic);
|
||||
select count(*) from t1 where sca_code='PD' and sca_pic is null;
|
||||
count(*)
|
||||
1
|
||||
|
@ -699,6 +701,9 @@ select count(*) from t1 where cat_code='E';
|
|||
count(*)
|
||||
0
|
||||
alter table t1 drop index sca_pic, add index (sca_pic, cat_code);
|
||||
ERROR 42000: Incorrect index name 'sca_pic'
|
||||
alter table t1 drop index sca_pic;
|
||||
alter table t1 add index (sca_pic, cat_code);
|
||||
select count(*) from t1 where sca_code='PD' and sca_pic is null;
|
||||
count(*)
|
||||
1
|
||||
|
@ -743,8 +748,8 @@ Table Op Msg_type Msg_text
|
|||
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t1 optimize status OK
|
||||
show keys from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 PRIMARY 1 a A # NULL NULL BTREE
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
|
||||
t1 0 PRIMARY 1 a A # NULL NULL BTREE
|
||||
drop table t1;
|
||||
create table t1 (i int, j int ) ENGINE=innodb;
|
||||
insert into t1 values (1,2);
|
||||
|
@ -1179,82 +1184,6 @@ a b
|
|||
8 8
|
||||
9 9
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) engine=innodb;
|
||||
CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) engine=innodb;
|
||||
INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10),(11,11),(12,12);
|
||||
INSERT INTO t2 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9);
|
||||
update t1,t2 set t1.a=t1.a+100;
|
||||
select * from t1;
|
||||
a b
|
||||
101 1
|
||||
102 2
|
||||
103 3
|
||||
104 4
|
||||
105 5
|
||||
106 6
|
||||
107 7
|
||||
108 8
|
||||
109 9
|
||||
110 10
|
||||
111 11
|
||||
112 12
|
||||
update t1,t2 set t1.a=t1.a+100 where t1.a=101;
|
||||
select * from t1;
|
||||
a b
|
||||
201 1
|
||||
102 2
|
||||
103 3
|
||||
104 4
|
||||
105 5
|
||||
106 6
|
||||
107 7
|
||||
108 8
|
||||
109 9
|
||||
110 10
|
||||
111 11
|
||||
112 12
|
||||
update t1,t2 set t1.b=t1.b+10 where t1.b=2;
|
||||
select * from t1;
|
||||
a b
|
||||
201 1
|
||||
103 3
|
||||
104 4
|
||||
105 5
|
||||
106 6
|
||||
107 7
|
||||
108 8
|
||||
109 9
|
||||
110 10
|
||||
111 11
|
||||
102 12
|
||||
112 12
|
||||
update t1,t2 set t1.b=t1.b+2,t2.b=t1.b+10 where t1.b between 3 and 5 and t1.a=t2.a+100;
|
||||
select * from t1;
|
||||
a b
|
||||
201 1
|
||||
103 5
|
||||
104 6
|
||||
106 6
|
||||
105 7
|
||||
107 7
|
||||
108 8
|
||||
109 9
|
||||
110 10
|
||||
111 11
|
||||
102 12
|
||||
112 12
|
||||
select * from t2;
|
||||
a b
|
||||
1 1
|
||||
2 2
|
||||
6 6
|
||||
7 7
|
||||
8 8
|
||||
9 9
|
||||
3 13
|
||||
4 14
|
||||
5 15
|
||||
drop table t1,t2;
|
||||
CREATE TABLE t2 ( NEXT_T BIGINT NOT NULL PRIMARY KEY) ENGINE=MyISAM;
|
||||
CREATE TABLE t1 ( B_ID INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB;
|
||||
SET AUTOCOMMIT=0;
|
||||
|
@ -1643,12 +1572,6 @@ ERROR 42S21: Duplicate column name 'c1'
|
|||
alter table t1 add key (c1,c1,c2);
|
||||
ERROR 42S21: Duplicate column name 'c1'
|
||||
drop table t1;
|
||||
create table t1(a int(1) , b int(1)) engine=innodb;
|
||||
insert into t1 values ('1111', '3333');
|
||||
select distinct concat(a, b) from t1;
|
||||
concat(a, b)
|
||||
11113333
|
||||
drop table t1;
|
||||
CREATE TABLE t1 ( a char(10) ) ENGINE=InnoDB;
|
||||
SELECT a FROM t1 WHERE MATCH (a) AGAINST ('test' IN BOOLEAN MODE);
|
||||
ERROR HY000: The used table type doesn't support FULLTEXT indexes
|
||||
|
@ -1738,7 +1661,7 @@ count(*)
|
|||
drop table t1;
|
||||
SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_buffer_pool_pages_total';
|
||||
variable_value
|
||||
512
|
||||
511
|
||||
SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_page_size';
|
||||
variable_value
|
||||
16384
|
||||
|
@ -1747,10 +1670,10 @@ variable_value - @innodb_rows_deleted_orig
|
|||
71
|
||||
SELECT variable_value - @innodb_rows_inserted_orig FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_rows_inserted';
|
||||
variable_value - @innodb_rows_inserted_orig
|
||||
1084
|
||||
1065
|
||||
SELECT variable_value - @innodb_rows_updated_orig FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_rows_updated';
|
||||
variable_value - @innodb_rows_updated_orig
|
||||
885
|
||||
865
|
||||
SELECT variable_value - @innodb_row_lock_waits_orig FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_row_lock_waits';
|
||||
variable_value - @innodb_row_lock_waits_orig
|
||||
0
|
||||
|
@ -1833,6 +1756,7 @@ show variables like "innodb_thread_sleep_delay";
|
|||
Variable_name Value
|
||||
innodb_thread_sleep_delay 10000
|
||||
set storage_engine=INNODB;
|
||||
set session old_alter_table=1;
|
||||
drop table if exists t1,t2,t3;
|
||||
--- Testing varchar ---
|
||||
--- Testing varchar ---
|
||||
|
@ -1970,7 +1894,7 @@ explain select count(*) from t1 where v between 'a' and 'a ' and v between 'a '
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref v v 13 const # Using where; Using index
|
||||
alter table t1 add unique(v);
|
||||
ERROR 23000: Duplicate entry 'v' for key 'v_2'
|
||||
ERROR 23000: Duplicate entry '{ ' for key 'v_2'
|
||||
alter table t1 add key(v);
|
||||
select concat('*',v,'*',c,'*',t,'*') as qq from t1 where v='a';
|
||||
qq
|
||||
|
@ -2406,6 +2330,7 @@ select * from t1 where a=20 and b is null;
|
|||
a b
|
||||
20 NULL
|
||||
drop table t1;
|
||||
set session old_alter_table=0;
|
||||
create table t1 (v varchar(65530), key(v));
|
||||
Warnings:
|
||||
Warning 1071 Specified key was too long; max key length is 767 bytes
|
||||
|
@ -2723,7 +2648,7 @@ create table t3 (s1 varchar(2) binary,primary key (s1)) engine=innodb;
|
|||
create table t4 (s1 char(2) binary,primary key (s1)) engine=innodb;
|
||||
insert into t1 values (0x41),(0x4120),(0x4100);
|
||||
insert into t2 values (0x41),(0x4120),(0x4100);
|
||||
ERROR 23000: Duplicate entry 'A\x00' for key 'PRIMARY'
|
||||
ERROR 23000: Duplicate entry 'A' for key 'PRIMARY'
|
||||
insert into t2 values (0x41),(0x4120);
|
||||
insert into t3 values (0x41),(0x4120),(0x4100);
|
||||
ERROR 23000: Duplicate entry 'A ' for key 'PRIMARY'
|
||||
|
@ -2832,65 +2757,6 @@ t2 CREATE TABLE `t2` (
|
|||
KEY `t2_ibfk_0` (`a`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
DROP TABLE t2,t1;
|
||||
create table t1(a int not null, b int, c int, d int, primary key(a)) engine=innodb;
|
||||
insert into t1(a) values (1),(2),(3);
|
||||
create trigger t1t before insert on t1 for each row begin set NEW.b = NEW.a * 10 + 5, NEW.c = NEW.a / 10; end |
|
||||
commit;
|
||||
set autocommit = 0;
|
||||
update t1 set b = 5 where a = 2;
|
||||
set autocommit = 0;
|
||||
insert into t1(a) values (10),(20),(30),(40),(50),(60),(70),(80),(90),(100),
|
||||
(11),(21),(31),(41),(51),(61),(71),(81),(91),(101),
|
||||
(12),(22),(32),(42),(52),(62),(72),(82),(92),(102),
|
||||
(13),(23),(33),(43),(53),(63),(73),(83),(93),(103),
|
||||
(14),(24),(34),(44),(54),(64),(74),(84),(94),(104);
|
||||
commit;
|
||||
commit;
|
||||
drop trigger t1t;
|
||||
drop table t1;
|
||||
create table t1(a int not null, b int, c int, d int, primary key(a)) engine=innodb;
|
||||
create table t2(a int not null, b int, c int, d int, primary key(a)) engine=innodb;
|
||||
create table t3(a int not null, b int, c int, d int, primary key(a)) engine=innodb;
|
||||
create table t4(a int not null, b int, c int, d int, primary key(a)) engine=innodb;
|
||||
create table t5(a int not null, b int, c int, d int, primary key(a)) engine=innodb;
|
||||
insert into t1(a) values (1),(2),(3);
|
||||
insert into t2(a) values (1),(2),(3);
|
||||
insert into t3(a) values (1),(2),(3);
|
||||
insert into t4(a) values (1),(2),(3);
|
||||
insert into t3(a) values (5),(7),(8);
|
||||
insert into t4(a) values (5),(7),(8);
|
||||
insert into t5(a) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);
|
||||
create trigger t1t before insert on t1 for each row begin
|
||||
INSERT INTO t2 SET a = NEW.a;
|
||||
end |
|
||||
create trigger t2t before insert on t2 for each row begin
|
||||
DELETE FROM t3 WHERE a = NEW.a;
|
||||
end |
|
||||
create trigger t3t before delete on t3 for each row begin
|
||||
UPDATE t4 SET b = b + 1 WHERE a = OLD.a;
|
||||
end |
|
||||
create trigger t4t before update on t4 for each row begin
|
||||
UPDATE t5 SET b = b + 1 where a = NEW.a;
|
||||
end |
|
||||
commit;
|
||||
set autocommit = 0;
|
||||
update t1 set b = b + 5 where a = 1;
|
||||
update t2 set b = b + 5 where a = 1;
|
||||
update t3 set b = b + 5 where a = 1;
|
||||
update t4 set b = b + 5 where a = 1;
|
||||
insert into t5(a) values(20);
|
||||
set autocommit = 0;
|
||||
insert into t1(a) values(7);
|
||||
insert into t2(a) values(8);
|
||||
delete from t2 where a = 3;
|
||||
update t4 set b = b + 1 where a = 3;
|
||||
commit;
|
||||
commit;
|
||||
drop trigger t1t;
|
||||
drop trigger t2t;
|
||||
drop trigger t3t;
|
||||
drop trigger t4t;
|
||||
drop table t1, t2, t3, t4, t5;
|
||||
CREATE TABLE t1 (
|
||||
field1 varchar(8) NOT NULL DEFAULT '',
|
||||
field2 varchar(8) NOT NULL DEFAULT '',
|
|
@ -25,8 +25,8 @@ ALTER TABLE t1 CHANGE a c INT;
|
|||
ERROR HY000: Error on rename of '#sql-temporary' to './test/t1' (errno: 150)
|
||||
# Ensure that online column rename works.
|
||||
ALTER TABLE t1 CHANGE b c INT;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
affected rows: 3
|
||||
info: Records: 3 Duplicates: 0 Warnings: 0
|
||||
|
||||
# Test renaming the column in the referencing table
|
||||
|
||||
|
@ -34,8 +34,8 @@ ALTER TABLE t2 CHANGE a c INT;
|
|||
ERROR HY000: Error on rename of '#sql-temporary' to './test/t2' (errno: 150)
|
||||
# Ensure that online column rename works.
|
||||
ALTER TABLE t2 CHANGE b c INT;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
affected rows: 3
|
||||
info: Records: 3 Duplicates: 0 Warnings: 0
|
||||
|
||||
# Test with self-referential constraints
|
||||
|
||||
|
@ -45,8 +45,8 @@ ALTER TABLE t3 CHANGE b d INT;
|
|||
ERROR HY000: Error on rename of '#sql-temporary' to './test/t3' (errno: 150)
|
||||
# Ensure that online column rename works.
|
||||
ALTER TABLE t3 CHANGE c d INT;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
affected rows: 3
|
||||
info: Records: 3 Duplicates: 0 Warnings: 0
|
||||
|
||||
# Cleanup.
|
||||
|
11
mysql-test/suite/innodb/r/innodb_bug38231.result
Normal file
11
mysql-test/suite/innodb/r/innodb_bug38231.result
Normal file
|
@ -0,0 +1,11 @@
|
|||
SET storage_engine=InnoDB;
|
||||
INSERT INTO bug38231_2 VALUES (1), (10), (300);
|
||||
SET autocommit=0;
|
||||
SELECT * FROM bug38231_2 FOR UPDATE;
|
||||
a
|
||||
1
|
||||
10
|
||||
300
|
||||
TRUNCATE TABLE bug38231_2;
|
||||
COMMIT;
|
||||
DROP TABLE bug38231_2;
|
8
mysql-test/suite/innodb/r/innodb_bug44571.result
Normal file
8
mysql-test/suite/innodb/r/innodb_bug44571.result
Normal file
|
@ -0,0 +1,8 @@
|
|||
CREATE TABLE bug44571 (foo INT) ENGINE=InnoDB;
|
||||
ALTER TABLE bug44571 CHANGE foo bar INT;
|
||||
ALTER TABLE bug44571 ADD INDEX bug44571b (foo);
|
||||
ERROR 42000: Key column 'foo' doesn't exist in table
|
||||
ALTER TABLE bug44571 ADD INDEX bug44571c (bar);
|
||||
DROP INDEX bug44571c ON bug44571;
|
||||
CREATE INDEX bug44571c ON bug44571 (bar);
|
||||
DROP TABLE bug44571;
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue