merge
This commit is contained in:
commit
75b72ce798
@ -278,6 +278,7 @@ ENDIF()
|
||||
SET(MYSQL_DOCS_LOCATION "" CACHE PATH "Location from where documentation is copied")
|
||||
MARK_AS_ADVANCED(MYSQL_DOCS_LOCATION)
|
||||
INSTALL(DIRECTORY Docs/ DESTINATION ${INSTALL_DOCDIR}
|
||||
PATTERN "INSTALL-BINARY" EXCLUDE
|
||||
PATTERN "Makefile.*" EXCLUDE
|
||||
PATTERN "myisam.txt" EXCLUDE
|
||||
PATTERN "glibc*" EXCLUDE
|
||||
|
@ -4460,12 +4460,13 @@ typedef struct
|
||||
{
|
||||
const char *name;
|
||||
uint code;
|
||||
const char *text;
|
||||
} st_error;
|
||||
|
||||
static st_error global_error_names[] =
|
||||
{
|
||||
#include <mysqld_ername.h>
|
||||
{ 0, 0 }
|
||||
{ 0, 0, 0 }
|
||||
};
|
||||
|
||||
uint get_errcode_from_name(char *error_name, char *error_end)
|
||||
|
@ -1,5 +1,6 @@
|
||||
EXTRA_DIST = \
|
||||
cmake_parse_arguments.cmake \
|
||||
cpack_source_ignore_files.cmake \
|
||||
package_name.cmake \
|
||||
configurable_file_content.in \
|
||||
check_minimal_version.cmake \
|
||||
|
@ -80,6 +80,8 @@ IF(FEATURE_SET)
|
||||
ENDFOREACH()
|
||||
ENDIF()
|
||||
|
||||
SET(WITHOUT_AUDIT_NULL ON CACHE BOOL "")
|
||||
SET(WITHOUT_DAEMON_EXAMPLE ON CACHE BOOL "")
|
||||
|
||||
OPTION(ENABLE_LOCAL_INFILE "" ON)
|
||||
SET(WITH_SSL bundled CACHE STRING "")
|
||||
|
@ -130,12 +130,12 @@ foreach my $option (@ARGV)
|
||||
}
|
||||
if($option =~ /with-ssl=/)
|
||||
{
|
||||
$cmakeargs = $cmakeargs." -DWITH_SSL=bundled";
|
||||
$cmakeargs = $cmakeargs." -DWITH_SSL=yes";
|
||||
next;
|
||||
}
|
||||
if($option =~ /with-ssl/)
|
||||
{
|
||||
$cmakeargs = $cmakeargs." -DWITH_SSL=yes";
|
||||
$cmakeargs = $cmakeargs." -DWITH_SSL=bundled";
|
||||
next;
|
||||
}
|
||||
if($option =~ /prefix=/)
|
||||
|
40
cmake/cpack_source_ignore_files.cmake
Normal file
40
cmake/cpack_source_ignore_files.cmake
Normal file
@ -0,0 +1,40 @@
|
||||
SET(CPACK_SOURCE_IGNORE_FILES
|
||||
\\\\.bzr/
|
||||
\\\\.bzr-mysql
|
||||
\\\\.bzrignore
|
||||
CMakeCache\\\\.txt
|
||||
cmake_dist\\\\.cmake
|
||||
CPackSourceConfig\\\\.cmake
|
||||
CPackConfig.cmake
|
||||
/cmake_install\\\\.cmake
|
||||
/CTestTestfile\\\\.cmake
|
||||
/CMakeFiles/
|
||||
/version_resources/
|
||||
/_CPack_Packages/
|
||||
$\\\\.gz
|
||||
$\\\\.zip
|
||||
/CMakeFiles/
|
||||
/version_resources/
|
||||
/_CPack_Packages/
|
||||
scripts/make_binary_distribution$
|
||||
scripts/msql2mysql$
|
||||
scripts/mysql_config$
|
||||
scripts/mysql_convert_table_format$
|
||||
scripts/mysql_find_rows$
|
||||
scripts/mysql_fix_extensions$
|
||||
scripts/mysql_install_db$
|
||||
scripts/mysql_secure_installation$
|
||||
scripts/mysql_setpermission$
|
||||
scripts/mysql_zap$
|
||||
scripts/mysqlaccess$
|
||||
scripts/mysqld_multi$
|
||||
scripts/mysqld_safe$
|
||||
scripts/mysqldumpslow$
|
||||
scripts/mysqlhotcopy$
|
||||
Makefile$
|
||||
include/config\\\\.h$
|
||||
include/my_config\\\\.h$
|
||||
/autom4te\\\\.cache/
|
||||
errmsg\\\\.sys$
|
||||
#
|
||||
)
|
@ -72,8 +72,29 @@ IF(ENABLE_DTRACE)
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND CMAKE_COMPILER_IS_GNUCXX
|
||||
AND CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
IF(NOT DEFINED BUGGY_GCC_NO_DTRACE_MODULES)
|
||||
EXECUTE_PROCESS(
|
||||
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1} --version
|
||||
OUTPUT_VARIABLE out)
|
||||
IF(out MATCHES "3.4.6")
|
||||
# This gcc causes crashes in dlopen() for dtraced shared libs,
|
||||
# while standard shipped with Solaris10 3.4.3 is ok
|
||||
SET(BUGGY_GCC_NO_DTRACE_MODULES 1 CACHE INTERNAL "")
|
||||
ELSE()
|
||||
SET(BUGGY_GCC_NO_DTRACE_MODULES 0 CACHE INTERNAL "")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
MACRO(DTRACE_INSTRUMENT target)
|
||||
FUNCTION(DTRACE_INSTRUMENT target)
|
||||
IF(BUGGY_GCC_NO_DTRACE_MODULES)
|
||||
GET_TARGET_PROPERTY(target_type ${target} TYPE)
|
||||
IF(target_type MATCHES "MODULE_LIBRARY")
|
||||
RETURN()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
IF(ENABLE_DTRACE)
|
||||
ADD_DEPENDENCIES(${target} gen_dtrace_header)
|
||||
|
||||
@ -119,7 +140,7 @@ MACRO(DTRACE_INSTRUMENT target)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ENDMACRO()
|
||||
ENDFUNCTION()
|
||||
|
||||
|
||||
# Ugly workaround for Solaris' DTrace inability to use probes
|
||||
|
@ -80,7 +80,7 @@ ENDIF()
|
||||
SET(INSTALL_LIBDIR_STANDALONE "lib")
|
||||
SET(INSTALL_INCLUDEDIR_STANDALONE "include")
|
||||
SET(INSTALL_PLUGINDIR_STANDALONE "lib/plugin")
|
||||
SET(INSTALL_DOCDIR_STANDALONE "doc")
|
||||
SET(INSTALL_DOCDIR_STANDALONE "docs")
|
||||
SET(INSTALL_MANDIR_STANDALONE "man")
|
||||
SET(INSTALL_MYSQLSHAREDIR_STANDALONE "share")
|
||||
SET(INSTALL_SHAREDIR_STANDALONE "share")
|
||||
|
@ -108,17 +108,7 @@ IF(NOT CPACK_SOURCE_PACKAGE_FILE_NAME)
|
||||
ENDIF()
|
||||
SET(CPACK_PACKAGE_VENDOR "Sun Microsystems, Inc")
|
||||
SET(CPACK_SOURCE_GENERATOR "TGZ")
|
||||
SET(CPACK_SOURCE_IGNORE_FILES
|
||||
\\\\.bzr/
|
||||
\\\\.bzr-mysql
|
||||
.bzrignore
|
||||
CMakeCache.txt
|
||||
/CMakeFiles/
|
||||
/version_resources/
|
||||
/_CPack_Packages/
|
||||
$.gz
|
||||
$.zip
|
||||
)
|
||||
INCLUDE(cpack_source_ignore_files)
|
||||
|
||||
# Defintions for windows version resources
|
||||
SET(PRODUCTNAME "MySQL Server")
|
||||
|
@ -30,7 +30,7 @@ SET(LIBM m)
|
||||
|
||||
# CMake defined -lthread as thread flag. This crashes in dlopen
|
||||
# when trying to load plugins workaround with -lpthread
|
||||
SET(CMAKE_THREADS_LIBS_INIT -lpthread CACHE INTERNAL "")
|
||||
SET(CMAKE_THREADS_LIBS_INIT -lpthread CACHE INTERNAL "" FORCE)
|
||||
|
||||
# Solaris specific large page support
|
||||
CHECK_SYMBOL_EXISTS(MHA_MAPSIZE_VA sys/mman.h HAVE_DECL_MHA_MAPSIZE_VA)
|
||||
|
@ -199,11 +199,34 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
|
||||
static void print_escaped_string(FILE *f, const char *str)
|
||||
{
|
||||
const char *tmp = str;
|
||||
|
||||
while (tmp[0] != 0)
|
||||
{
|
||||
switch (tmp[0])
|
||||
{
|
||||
case '\\': fprintf(f, "\\\\"); break;
|
||||
case '\'': fprintf(f, "\\\'"); break;
|
||||
case '\"': fprintf(f, "\\\""); break;
|
||||
case '\n': fprintf(f, "\\n"); break;
|
||||
case '\r': fprintf(f, "\\r"); break;
|
||||
default: fprintf(f, "%c", tmp[0]);
|
||||
}
|
||||
tmp++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int create_header_files(struct errors *error_head)
|
||||
{
|
||||
uint er_last;
|
||||
FILE *er_definef, *sql_statef, *er_namef;
|
||||
struct errors *tmp_error;
|
||||
struct message *er_msg;
|
||||
const char *er_text;
|
||||
|
||||
DBUG_ENTER("create_header_files");
|
||||
LINT_INIT(er_last);
|
||||
|
||||
@ -245,9 +268,12 @@ static int create_header_files(struct errors *error_head)
|
||||
"{ %-40s,\"%s\", \"%s\" },\n", tmp_error->er_name,
|
||||
tmp_error->sql_code1, tmp_error->sql_code2);
|
||||
/*generating er_name file */
|
||||
fprintf(er_namef, "{ \"%s\", %d },\n", tmp_error->er_name,
|
||||
tmp_error->d_code);
|
||||
|
||||
er_msg= find_message(tmp_error, default_language, 0);
|
||||
er_text = (er_msg ? er_msg->text : "");
|
||||
fprintf(er_namef, "{ \"%s\", %d, \"", tmp_error->er_name,
|
||||
tmp_error->d_code);
|
||||
print_escaped_string(er_namef, er_text);
|
||||
fprintf(er_namef, "\" },\n");
|
||||
}
|
||||
/* finishing off with mysqld_error.h */
|
||||
fprintf(er_definef, "#define ER_ERROR_LAST %d\n", er_last);
|
||||
|
@ -184,6 +184,45 @@ static const char *get_ha_error_msg(int code)
|
||||
return NullS;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *name;
|
||||
uint code;
|
||||
const char *text;
|
||||
} st_error;
|
||||
|
||||
static st_error global_error_names[] =
|
||||
{
|
||||
#include <mysqld_ername.h>
|
||||
{ 0, 0, 0 }
|
||||
};
|
||||
|
||||
/**
|
||||
Lookup an error by code in the global_error_names array.
|
||||
@param code the code to lookup
|
||||
@param [out] name_ptr the error name, when found
|
||||
@param [out] msg_ptr the error text, when found
|
||||
@return 1 when found, otherwise 0
|
||||
*/
|
||||
int get_ER_error_msg(uint code, const char **name_ptr, const char **msg_ptr)
|
||||
{
|
||||
st_error *tmp_error;
|
||||
|
||||
tmp_error= & global_error_names[0];
|
||||
|
||||
while (tmp_error->name != NULL)
|
||||
{
|
||||
if (tmp_error->code == code)
|
||||
{
|
||||
*name_ptr= tmp_error->name;
|
||||
*msg_ptr= tmp_error->text;
|
||||
return 1;
|
||||
}
|
||||
tmp_error++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(__WIN__)
|
||||
static my_bool print_win_error_msg(DWORD error, my_bool verbose)
|
||||
@ -211,6 +250,7 @@ int main(int argc,char *argv[])
|
||||
{
|
||||
int error,code,found;
|
||||
const char *msg;
|
||||
const char *name;
|
||||
char *unknown_error = 0;
|
||||
#if defined(__WIN__)
|
||||
my_bool skip_win_message= 0;
|
||||
@ -316,6 +356,14 @@ int main(int argc,char *argv[])
|
||||
else
|
||||
puts(msg);
|
||||
}
|
||||
if (get_ER_error_msg(code, & name, & msg))
|
||||
{
|
||||
found= 1;
|
||||
if (verbose)
|
||||
printf("MySQL error code %3d (%s): %s\n", code, name, msg);
|
||||
else
|
||||
puts(msg);
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
#if defined(__WIN__)
|
||||
|
@ -88,7 +88,7 @@
|
||||
*/
|
||||
#define make_atomic_add_body64 \
|
||||
int64 tmp=*a; \
|
||||
while (!my_atomic_cas64(a, &tmp, tmp+v)); \
|
||||
while (!my_atomic_cas64(a, &tmp, tmp+v)) ; \
|
||||
v=tmp;
|
||||
|
||||
/*
|
||||
|
@ -77,13 +77,13 @@
|
||||
#ifndef make_atomic_add_body
|
||||
#define make_atomic_add_body(S) \
|
||||
int ## S tmp=*a; \
|
||||
while (!my_atomic_cas ## S(a, &tmp, tmp+v)); \
|
||||
while (!my_atomic_cas ## S(a, &tmp, tmp+v)) ; \
|
||||
v=tmp;
|
||||
#endif
|
||||
#ifndef make_atomic_fas_body
|
||||
#define make_atomic_fas_body(S) \
|
||||
int ## S tmp=*a; \
|
||||
while (!my_atomic_cas ## S(a, &tmp, v)); \
|
||||
while (!my_atomic_cas ## S(a, &tmp, v)) ; \
|
||||
v=tmp;
|
||||
#endif
|
||||
#ifndef make_atomic_load_body
|
||||
|
@ -83,12 +83,6 @@
|
||||
#endif
|
||||
#endif /* _WIN32... */
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
#ifdef WITH_PERFSCHEMA_STORAGE_ENGINE
|
||||
#undef WITH_PERFSCHEMA_STORAGE_ENGINE
|
||||
#endif
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
|
||||
#ifdef WITH_PERFSCHEMA_STORAGE_ENGINE
|
||||
#define HAVE_PSI_INTERFACE
|
||||
#endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */
|
||||
|
@ -118,6 +118,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
net_clear_error(net);
|
||||
thd->current_stmt= stmt;
|
||||
|
||||
thd->thread_stack= (char*) &thd;
|
||||
thd->store_globals(); // Fix if more than one connect
|
||||
/*
|
||||
We have to call free_old_query before we start to fill mysql->fields
|
||||
|
@ -23,6 +23,7 @@ INSTALL(
|
||||
PATTERN "mtr.out*" EXCLUDE
|
||||
PATTERN ".cvsignore" EXCLUDE
|
||||
PATTERN "*.am" EXCLUDE
|
||||
PATTERN "*.in" EXCLUDE
|
||||
)
|
||||
|
||||
|
||||
|
@ -1704,3 +1704,56 @@ unlock tables;
|
||||
--echo # already released by commit.
|
||||
handler t1 close;
|
||||
drop tables t1, t2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#51355 handler stmt cause assertion in
|
||||
--echo # bool MDL_context::try_acquire_lock(MDL_request*)
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
connect(con51355, localhost, root);
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
CREATE TABLE t1(id INT, KEY id(id));
|
||||
HANDLER t1 OPEN;
|
||||
|
||||
--echo # Connection con51355
|
||||
connection con51355;
|
||||
--echo # Sending:
|
||||
--send DROP TABLE t1
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
--echo # This I_S query will cause the handler table to be closed and
|
||||
--echo # the metadata lock to be released. This will allow DROP TABLE
|
||||
--echo # to proceed. Waiting for the table to be removed.
|
||||
let $wait_condition=
|
||||
SELECT COUNT(*) = 0 FROM information_schema.tables WHERE table_name = "t1";
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--echo # Connection con51355
|
||||
connection con51355;
|
||||
--echo # Reaping: DROP TABLE t1
|
||||
--reap
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
--error ER_NO_SUCH_TABLE
|
||||
HANDLER t1 READ id NEXT;
|
||||
# This caused an assertion
|
||||
--error ER_NO_SUCH_TABLE
|
||||
HANDLER t1 READ id NEXT;
|
||||
|
||||
HANDLER t1 CLOSE;
|
||||
--echo # Connection con51355
|
||||
connection con51355;
|
||||
disconnect con51355;
|
||||
--source include/wait_until_disconnected.inc
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
|
||||
|
@ -201,6 +201,8 @@ INSERT INTO global_suppressions VALUES
|
||||
("==[0-9]*== For more details"),
|
||||
/* This comes with innodb plugin tests */
|
||||
("==[0-9]*== Warning: set address range perms: large range"),
|
||||
/* valgrind-3.5.0 dumps this */
|
||||
("==[0-9]*== Command: "),
|
||||
|
||||
/* valgrind warnings: invalid file descriptor -1 in syscall
|
||||
write()/read(). Bug #50414 */
|
||||
|
@ -61,10 +61,10 @@ create table t1 (a int unique);
|
||||
create table t2 (a int);
|
||||
drop function if exists f1;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION f1 does not exist
|
||||
Note 1305 FUNCTION test.f1 does not exist
|
||||
drop function if exists f2;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION f2 does not exist
|
||||
Note 1305 FUNCTION test.f2 does not exist
|
||||
create function f1() returns int
|
||||
begin
|
||||
insert into t1 (a) values (1);
|
||||
|
@ -1231,7 +1231,7 @@ Warnings:
|
||||
Note 1051 Unknown table 'test'
|
||||
drop function if exists test_function;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION test_function does not exist
|
||||
Note 1305 FUNCTION test.test_function does not exist
|
||||
drop view if exists v1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 'test.v1'
|
||||
|
@ -1685,3 +1685,28 @@ unlock tables;
|
||||
# already released by commit.
|
||||
handler t1 close;
|
||||
drop tables t1, t2;
|
||||
#
|
||||
# Bug#51355 handler stmt cause assertion in
|
||||
# bool MDL_context::try_acquire_lock(MDL_request*)
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
# Connection default
|
||||
CREATE TABLE t1(id INT, KEY id(id));
|
||||
HANDLER t1 OPEN;
|
||||
# Connection con51355
|
||||
# Sending:
|
||||
DROP TABLE t1;
|
||||
# Connection default
|
||||
# This I_S query will cause the handler table to be closed and
|
||||
# the metadata lock to be released. This will allow DROP TABLE
|
||||
# to proceed. Waiting for the table to be removed.
|
||||
# Connection con51355
|
||||
# Reaping: DROP TABLE t1
|
||||
# Connection default
|
||||
HANDLER t1 READ id NEXT;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
HANDLER t1 READ id NEXT;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
HANDLER t1 CLOSE;
|
||||
# Connection con51355
|
||||
# Connection default
|
||||
|
@ -1682,6 +1682,31 @@ unlock tables;
|
||||
handler t1 close;
|
||||
drop tables t1, t2;
|
||||
#
|
||||
# Bug#51355 handler stmt cause assertion in
|
||||
# bool MDL_context::try_acquire_lock(MDL_request*)
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
# Connection default
|
||||
CREATE TABLE t1(id INT, KEY id(id));
|
||||
HANDLER t1 OPEN;
|
||||
# Connection con51355
|
||||
# Sending:
|
||||
DROP TABLE t1;
|
||||
# Connection default
|
||||
# This I_S query will cause the handler table to be closed and
|
||||
# the metadata lock to be released. This will allow DROP TABLE
|
||||
# to proceed. Waiting for the table to be removed.
|
||||
# Connection con51355
|
||||
# Reaping: DROP TABLE t1
|
||||
# Connection default
|
||||
HANDLER t1 READ id NEXT;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
HANDLER t1 READ id NEXT;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
HANDLER t1 CLOSE;
|
||||
# Connection con51355
|
||||
# Connection default
|
||||
#
|
||||
# BUG #46456: HANDLER OPEN + TRUNCATE + DROP (temporary) TABLE, crash
|
||||
#
|
||||
CREATE TABLE t1 AS SELECT 1 AS f1;
|
||||
|
@ -658,6 +658,11 @@ YES
|
||||
#
|
||||
# SQLCOM_RESET
|
||||
#
|
||||
INSERT INTO db1.trans (a) VALUES (1);
|
||||
reset query cache;
|
||||
CALL db1.test_if_commit();
|
||||
IMPLICIT COMMIT
|
||||
YES
|
||||
#
|
||||
# SQLCOM_PURGE
|
||||
#
|
||||
|
@ -2297,3 +2297,28 @@ t2 CREATE TABLE `t2` (
|
||||
CONSTRAINT `x` FOREIGN KEY (`fk`) REFERENCES `t1` (`pk`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
drop table t2, t1;
|
||||
#
|
||||
# Bug#44613 SELECT statement inside FUNCTION takes a shared lock
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
CREATE TABLE t1(x INT PRIMARY KEY, y INT) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1, 0), (2, 0);
|
||||
CREATE FUNCTION f1(z INT) RETURNS INT READS SQL DATA
|
||||
RETURN (SELECT x FROM t1 WHERE x = z);
|
||||
# Connection default
|
||||
START TRANSACTION;
|
||||
SELECT f1(1);
|
||||
f1(1)
|
||||
1
|
||||
# Connection con2
|
||||
START TRANSACTION;
|
||||
SELECT f1(1);
|
||||
f1(1)
|
||||
1
|
||||
UPDATE t1 SET y = 1 WHERE x = 1;
|
||||
COMMIT;
|
||||
# Connection default
|
||||
COMMIT;
|
||||
DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
|
@ -462,3 +462,17 @@ ERROR 70100: Query execution was interrupted
|
||||
unlock tables;
|
||||
# Switching to connection 'default'
|
||||
drop table t3;
|
||||
#
|
||||
# Test for the bug where upgradable metadata locks was acquired
|
||||
# even if the table to altered was temporary.
|
||||
# Bug found while working on the related bug #51240.
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (id INT);
|
||||
LOCK TABLE t1 WRITE;
|
||||
# Connection con1
|
||||
CREATE TEMPORARY TABLE t1 (id INT);
|
||||
ALTER TABLE t1 ADD COLUMN j INT;
|
||||
# Connection default
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1;
|
||||
|
@ -2605,4 +2605,14 @@ ERROR 42000: FUNCTION test.f1 does not exist
|
||||
execute stmt;
|
||||
ERROR 42000: FUNCTION test.f1 does not exist
|
||||
drop table t4, t3, t2, t1;
|
||||
#
|
||||
# Bug#51240 ALTER TABLE of a locked MERGE table fails
|
||||
#
|
||||
DROP TABLE IF EXISTS m1, t1;
|
||||
CREATE TABLE t1 (c1 INT);
|
||||
CREATE TABLE m1 (c1 INT) ENGINE=MRG_MyISAM UNION=(t1);
|
||||
LOCK TABLE m1 WRITE;
|
||||
ALTER TABLE m1 ADD INDEX (c1);
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE m1, t1;
|
||||
End of 6.0 tests
|
||||
|
@ -2,5 +2,6 @@ MySQL error code 150: Foreign key constraint is incorrectly formed
|
||||
Win32 error code 150: System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed.
|
||||
OS error code 23: Too many open files in system
|
||||
Win32 error code 23: Data error (cyclic redundancy check).
|
||||
MySQL error code 1062 (ER_DUP_ENTRY): Duplicate entry '%-.192s' for key %d
|
||||
Win32 error code 1062: The service has not been started.
|
||||
Illegal error code: 30000
|
||||
|
@ -1 +1,6 @@
|
||||
Illegal error code: 10000
|
||||
MySQL error code 1062 (ER_DUP_ENTRY): Duplicate entry '%-.192s' for key %d
|
||||
MySQL error code 1076 (ER_READY): %s: ready for connections.
|
||||
Version: '%s' socket: '%s' port: %d
|
||||
MySQL error code 1459 (ER_TABLE_NEEDS_UPGRADE): Table upgrade required. Please do "REPAIR TABLE `%-.32s`" or dump/reload to fix it!
|
||||
MySQL error code 1461 (ER_MAX_PREPARED_STMT_COUNT_REACHED): Can't create more than max_prepared_stmt_count statements (current value: %lu)
|
||||
|
@ -1721,3 +1721,14 @@ SELECT SQL_CACHE * FROM t1 WHERE a IN
|
||||
ERROR 42S22: Unknown column 'SQL_NO_CACHE' in 'field list'
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# Bug#51336 Assert in reload_acl_and_cache during RESET QUERY CACHE
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1(id INT);
|
||||
START TRANSACTION;
|
||||
SELECT * FROM t1;
|
||||
id
|
||||
RESET QUERY CACHE;
|
||||
COMMIT;
|
||||
DROP TABLE t1;
|
||||
|
@ -2181,7 +2181,7 @@ drop procedure peter_p1 $$
|
||||
drop procedure peter_p2 $$
|
||||
drop procedure if exists peter_p3 $$
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE peter_p3 does not exist
|
||||
Note 1305 PROCEDURE test.peter_p3 does not exist
|
||||
create procedure peter_p3()
|
||||
begin
|
||||
declare continue handler for sqlexception
|
||||
|
@ -46,7 +46,7 @@ call foo()|
|
||||
ERROR 42000: PROCEDURE test.foo does not exist
|
||||
drop procedure if exists foo|
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE foo does not exist
|
||||
Note 1305 PROCEDURE test.foo does not exist
|
||||
show create procedure foo|
|
||||
ERROR 42000: PROCEDURE foo does not exist
|
||||
show create function foo|
|
||||
@ -1028,7 +1028,7 @@ drop table t1|
|
||||
drop function bug_13627_f|
|
||||
drop function if exists bug12329;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION bug12329 does not exist
|
||||
Note 1305 FUNCTION test.bug12329 does not exist
|
||||
create table t1 as select 1 a;
|
||||
create table t2 as select 1 a;
|
||||
create function bug12329() returns int return (select a from t1);
|
||||
|
@ -394,10 +394,10 @@ CASE expression tests.
|
||||
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE p1 does not exist
|
||||
Note 1305 PROCEDURE test.p1 does not exist
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE p2 does not exist
|
||||
Note 1305 PROCEDURE test.p2 does not exist
|
||||
DROP TABLE IF EXISTS t1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
|
@ -2695,10 +2695,10 @@ delete from t3|
|
||||
insert into t3 values(1)|
|
||||
drop procedure if exists bug7992_1|
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE bug7992_1 does not exist
|
||||
Note 1305 PROCEDURE test.bug7992_1 does not exist
|
||||
drop procedure if exists bug7992_2|
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE bug7992_2 does not exist
|
||||
Note 1305 PROCEDURE test.bug7992_2 does not exist
|
||||
create procedure bug7992_1()
|
||||
begin
|
||||
declare i int;
|
||||
|
@ -21,11 +21,11 @@ end|
|
||||
call bug4902_2()|
|
||||
show warnings|
|
||||
Level Code Message
|
||||
Note 1305 PROCEDURE bug4902_2 does not exist
|
||||
Note 1305 PROCEDURE test.bug4902_2 does not exist
|
||||
call bug4902_2()|
|
||||
show warnings|
|
||||
Level Code Message
|
||||
Note 1305 PROCEDURE bug4902_2 does not exist
|
||||
Note 1305 PROCEDURE test.bug4902_2 does not exist
|
||||
drop procedure bug4902_2|
|
||||
drop table if exists t1|
|
||||
create table t1 (
|
||||
|
@ -1183,7 +1183,7 @@ drop table t1;
|
||||
create table t1 (col1 tinyint);
|
||||
drop procedure if exists t1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE t1 does not exist
|
||||
Note 1305 PROCEDURE test.t1 does not exist
|
||||
create procedure t1 () begin declare exit handler for sqlexception
|
||||
select'a'; insert into t1 values (200); end;|
|
||||
call t1();
|
||||
|
@ -392,6 +392,52 @@ a
|
||||
4
|
||||
DROP FUNCTION sequence;
|
||||
DROP TABLE t1,t2;
|
||||
drop function if exists test.metaphon;
|
||||
drop function if exists metaphon;
|
||||
CREATE FUNCTION metaphon RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
|
||||
select metaphon("Hello");
|
||||
metaphon("Hello")
|
||||
HL
|
||||
drop function if exists test.metaphon;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION test.metaphon does not exist
|
||||
select metaphon("Hello");
|
||||
metaphon("Hello")
|
||||
HL
|
||||
drop function metaphon;
|
||||
CREATE FUNCTION test.metaphon(a TEXT) RETURNS TEXT return "This is a SF";
|
||||
create database db_31767;
|
||||
use db_31767;
|
||||
CREATE FUNCTION metaphon RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
|
||||
use test;
|
||||
select metaphon("Hello");
|
||||
metaphon("Hello")
|
||||
HL
|
||||
select test.metaphon("Hello");
|
||||
test.metaphon("Hello")
|
||||
This is a SF
|
||||
drop function metaphon;
|
||||
select metaphon("Hello");
|
||||
metaphon("Hello")
|
||||
This is a SF
|
||||
drop function metaphon;
|
||||
use db_31767;
|
||||
drop database db_31767;
|
||||
drop function if exists no_such_func;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION (UDF) no_such_func does not exist
|
||||
drop function no_such_func;
|
||||
ERROR 42000: FUNCTION (UDF) no_such_func does not exist
|
||||
drop function if exists test.no_such_func;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION test.no_such_func does not exist
|
||||
drop function test.no_such_func;
|
||||
ERROR 42000: FUNCTION test.no_such_func does not exist
|
||||
drop procedure if exists no_such_proc;
|
||||
ERROR 3D000: No database selected
|
||||
drop procedure no_such_proc;
|
||||
ERROR 3D000: No database selected
|
||||
use test;
|
||||
#
|
||||
# Bug#46259: 5.0.83 -> 5.1.36, query doesn't work
|
||||
#
|
||||
|
@ -2086,7 +2086,7 @@ CREATE TABLE t1 ( bug_table_seq INTEGER NOT NULL);
|
||||
CREATE OR REPLACE VIEW v1 AS SELECT * from t1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE p1 does not exist
|
||||
Note 1305 PROCEDURE test.p1 does not exist
|
||||
CREATE PROCEDURE p1 ( )
|
||||
BEGIN
|
||||
DO (SELECT @next := IFNULL(max(bug_table_seq),0) + 1 FROM v1);
|
||||
@ -4004,3 +4004,36 @@ CREATE VIEW t2 AS SELECT * FROM t1;
|
||||
ERROR HY000: Can't execute the query because you have a conflicting read lock
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# Bug#48315 Metadata lock is not taken for merged views that
|
||||
# use an INFORMATION_SCHEMA table
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
# Connection default
|
||||
CREATE VIEW v1 AS SELECT schema_name FROM information_schema.schemata;
|
||||
CREATE TABLE t1 (str VARCHAR(50));
|
||||
CREATE PROCEDURE p1() INSERT INTO t1 SELECT * FROM v1;
|
||||
# CALL p1() so the view is merged.
|
||||
CALL p1();
|
||||
# Connection 3
|
||||
LOCK TABLE t1 READ;
|
||||
# Connection default
|
||||
# Try to CALL p1() again, this time it should block for t1.
|
||||
# Sending:
|
||||
CALL p1();
|
||||
# Connection 2
|
||||
# ... then try to drop the view. This should block.
|
||||
# Sending:
|
||||
DROP VIEW v1;
|
||||
# Connection 3
|
||||
# Now allow CALL p1() to complete
|
||||
UNLOCK TABLES;
|
||||
# Connection default
|
||||
# Reaping: CALL p1()
|
||||
# Connection 2
|
||||
# Reaping: DROP VIEW v1
|
||||
# Connection default
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
|
@ -228,13 +228,13 @@ INSERT INTO t2 VALUES ( 'a`', 'a`' );
|
||||
INSERT INTO t3 VALUES ( 'a`', 'a`', '1000-01-1' );
|
||||
DROP PROCEDURE IF EXISTS sp1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE sp1 does not exist
|
||||
Note 1305 PROCEDURE test.sp1 does not exist
|
||||
DROP PROCEDURE IF EXISTS sp2;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE sp2 does not exist
|
||||
Note 1305 PROCEDURE test.sp2 does not exist
|
||||
DROP PROCEDURE IF EXISTS sp3;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE sp3 does not exist
|
||||
Note 1305 PROCEDURE test.sp3 does not exist
|
||||
CREATE PROCEDURE sp1()
|
||||
BEGIN
|
||||
DECLARE x NUMERIC ZEROFILL;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -787,6 +787,7 @@ f1 f2 f3
|
||||
222222 bbbbbb 2
|
||||
drop table t1;
|
||||
Illegal ndb error code: 1186
|
||||
MySQL error code 1186 (ER_FLUSH_MASTER_BINLOG_CLOSED): Binlog closed, cannot RESET MASTER
|
||||
CREATE TABLE t1 (
|
||||
a VARBINARY(40) NOT NULL,
|
||||
b VARCHAR (256) CHARACTER SET UTF8 NOT NULL,
|
||||
|
@ -3,6 +3,10 @@ source include/not_embedded.inc;
|
||||
source include/have_innodb.inc;
|
||||
source include/master-slave.inc;
|
||||
|
||||
# -- [DISABLED Bug#49557]
|
||||
# This test case fails on Windows due to Bug#49557.
|
||||
source include/not_windows.inc;
|
||||
|
||||
let $engine_type= InnoDB;
|
||||
#let $engine_type= MyISAM;
|
||||
|
||||
|
@ -66,7 +66,7 @@ SET GLOBAL max_prepared_stmt_count=3;
|
||||
** Creating procedure **
|
||||
DROP PROCEDURE IF EXISTS sp_checkstmts;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE sp_checkstmts does not exist
|
||||
Note 1305 PROCEDURE test.sp_checkstmts does not exist
|
||||
CREATE PROCEDURE sp_checkstmts ()
|
||||
BEGIN
|
||||
PREPARE newstmt from "SELECT * FROM information_schema.CHARACTER_SETS C";
|
||||
|
@ -697,6 +697,10 @@ source include/implicit_commit_helper.inc;
|
||||
--echo # SQLCOM_RESET
|
||||
--echo #
|
||||
|
||||
let $statement=
|
||||
reset query cache;
|
||||
source include/implicit_commit_helper.inc;
|
||||
|
||||
--echo #
|
||||
--echo # SQLCOM_PURGE
|
||||
--echo #
|
||||
|
@ -555,3 +555,42 @@ create table t2 (fk int, key x (fk),
|
||||
constraint x foreign key (FK) references t1 (PK)) engine=InnoDB;
|
||||
show create table t2;
|
||||
drop table t2, t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#44613 SELECT statement inside FUNCTION takes a shared lock
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1(x INT PRIMARY KEY, y INT) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1, 0), (2, 0);
|
||||
|
||||
CREATE FUNCTION f1(z INT) RETURNS INT READS SQL DATA
|
||||
RETURN (SELECT x FROM t1 WHERE x = z);
|
||||
|
||||
--echo # Connection default
|
||||
START TRANSACTION;
|
||||
SELECT f1(1);
|
||||
|
||||
--echo # Connection con2
|
||||
--disable_query_log
|
||||
connect (con2, localhost, root);
|
||||
--enable_query_log
|
||||
START TRANSACTION;
|
||||
SELECT f1(1);
|
||||
# This next statement used to block.
|
||||
UPDATE t1 SET y = 1 WHERE x = 1;
|
||||
|
||||
COMMIT;
|
||||
|
||||
disconnect con2;
|
||||
--source include/wait_until_disconnected.inc
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
COMMIT;
|
||||
DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
|
@ -1092,5 +1092,31 @@ disconnect con2;
|
||||
drop table t3;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Test for the bug where upgradable metadata locks was acquired
|
||||
--echo # even if the table to altered was temporary.
|
||||
--echo # Bug found while working on the related bug #51240.
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (id INT);
|
||||
LOCK TABLE t1 WRITE;
|
||||
|
||||
--echo # Connection con1
|
||||
connect (con1, localhost, root);
|
||||
CREATE TEMPORARY TABLE t1 (id INT);
|
||||
# This alter should not block and timeout.
|
||||
ALTER TABLE t1 ADD COLUMN j INT;
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
disconnect con1;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
# Wait till all disconnects are completed
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
@ -2089,5 +2089,24 @@ execute stmt;
|
||||
execute stmt;
|
||||
drop table t4, t3, t2, t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#51240 ALTER TABLE of a locked MERGE table fails
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS m1, t1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (c1 INT);
|
||||
CREATE TABLE m1 (c1 INT) ENGINE=MRG_MyISAM UNION=(t1);
|
||||
LOCK TABLE m1 WRITE;
|
||||
# This used to cause an error.
|
||||
ALTER TABLE m1 ADD INDEX (c1);
|
||||
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE m1, t1;
|
||||
|
||||
|
||||
--echo End of 6.0 tests
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
--source include/not_windows.inc
|
||||
#
|
||||
# Check if the variable MY_PERROR is set
|
||||
#
|
||||
@ -17,3 +18,17 @@ enable_query_log;
|
||||
# As there is no error code defined for 10000, expect error
|
||||
--error 1
|
||||
--exec $MY_PERROR 10000 2>&1
|
||||
|
||||
#
|
||||
# Bug#10143 (Perror not showing error description)
|
||||
#
|
||||
|
||||
# test reported case
|
||||
--exec $MY_PERROR 1062 2>&1
|
||||
|
||||
# test errors that contain characters to escape in the text.
|
||||
--exec $MY_PERROR 1076 2>&1
|
||||
--exec $MY_PERROR 1459 2>&1
|
||||
--exec $MY_PERROR 1461 2>&1
|
||||
|
||||
|
||||
|
@ -1363,3 +1363,22 @@ SELECT SQL_CACHE * FROM t1 WHERE a IN
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#51336 Assert in reload_acl_and_cache during RESET QUERY CACHE
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1(id INT);
|
||||
|
||||
START TRANSACTION;
|
||||
SELECT * FROM t1;
|
||||
# This caused an assert
|
||||
RESET QUERY CACHE;
|
||||
|
||||
COMMIT;
|
||||
DROP TABLE t1;
|
||||
|
@ -436,6 +436,75 @@ SELECT * FROM t2 WHERE a = sequence();
|
||||
DROP FUNCTION sequence;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
#
|
||||
# Bug#31767 (DROP FUNCTION name resolution)
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop function if exists test.metaphon;
|
||||
drop function if exists metaphon;
|
||||
--enable_warnings
|
||||
|
||||
--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
|
||||
eval CREATE FUNCTION metaphon RETURNS STRING SONAME "$UDF_EXAMPLE_LIB";
|
||||
|
||||
select metaphon("Hello");
|
||||
|
||||
# The UDF should not be dropped
|
||||
drop function if exists test.metaphon;
|
||||
|
||||
select metaphon("Hello");
|
||||
|
||||
drop function metaphon;
|
||||
|
||||
CREATE FUNCTION test.metaphon(a TEXT) RETURNS TEXT return "This is a SF";
|
||||
|
||||
create database db_31767;
|
||||
use db_31767;
|
||||
|
||||
--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
|
||||
eval CREATE FUNCTION metaphon RETURNS STRING SONAME "$UDF_EXAMPLE_LIB";
|
||||
|
||||
use test;
|
||||
|
||||
# Uses the UDF
|
||||
select metaphon("Hello");
|
||||
|
||||
# Uses the SF
|
||||
select test.metaphon("Hello");
|
||||
|
||||
# Should drop the UDF, resolving the name the same way select does.
|
||||
drop function metaphon;
|
||||
|
||||
# Should call the SF
|
||||
select metaphon("Hello");
|
||||
|
||||
# Drop the SF
|
||||
drop function metaphon;
|
||||
|
||||
# Change the current database to none.
|
||||
use db_31767;
|
||||
drop database db_31767;
|
||||
|
||||
drop function if exists no_such_func;
|
||||
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
drop function no_such_func;
|
||||
|
||||
drop function if exists test.no_such_func;
|
||||
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
drop function test.no_such_func;
|
||||
|
||||
--error ER_NO_DB_ERROR
|
||||
drop procedure if exists no_such_proc;
|
||||
|
||||
--error ER_NO_DB_ERROR
|
||||
drop procedure no_such_proc;
|
||||
|
||||
use test;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#46259: 5.0.83 -> 5.1.36, query doesn't work
|
||||
--echo #
|
||||
|
@ -6,6 +6,9 @@ drop database if exists mysqltest;
|
||||
--enable_warnings
|
||||
use test;
|
||||
|
||||
# Save the initial number of concurrent sessions.
|
||||
--source include/count_sessions.inc
|
||||
|
||||
#
|
||||
# some basic test of views and its functionality
|
||||
#
|
||||
@ -3975,3 +3978,79 @@ CREATE VIEW t2 AS SELECT * FROM t1;
|
||||
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#48315 Metadata lock is not taken for merged views that
|
||||
--echo # use an INFORMATION_SCHEMA table
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
--enable_warnings
|
||||
|
||||
connect (con2, localhost, root);
|
||||
connect (con3, localhost, root);
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
|
||||
CREATE VIEW v1 AS SELECT schema_name FROM information_schema.schemata;
|
||||
CREATE TABLE t1 (str VARCHAR(50));
|
||||
CREATE PROCEDURE p1() INSERT INTO t1 SELECT * FROM v1;
|
||||
|
||||
--echo # CALL p1() so the view is merged.
|
||||
CALL p1();
|
||||
|
||||
--echo # Connection 3
|
||||
connection con3;
|
||||
LOCK TABLE t1 READ;
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
--echo # Try to CALL p1() again, this time it should block for t1.
|
||||
--echo # Sending:
|
||||
--send CALL p1()
|
||||
|
||||
--echo # Connection 2
|
||||
connection con2;
|
||||
let $wait_condition=
|
||||
SELECT COUNT(*) = 1 from information_schema.processlist
|
||||
WHERE state = "Table lock" AND info = "INSERT INTO t1 SELECT * FROM v1";
|
||||
--source include/wait_condition.inc
|
||||
--echo # ... then try to drop the view. This should block.
|
||||
--echo # Sending:
|
||||
--send DROP VIEW v1
|
||||
|
||||
--echo # Connection 3
|
||||
connection con3;
|
||||
let $wait_condition=
|
||||
SELECT COUNT(*) = 1 from information_schema.processlist
|
||||
WHERE state = "Waiting for table" AND info = "DROP VIEW v1";
|
||||
--source include/wait_condition.inc
|
||||
--echo # Now allow CALL p1() to complete
|
||||
UNLOCK TABLES;
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
--echo # Reaping: CALL p1()
|
||||
--reap
|
||||
|
||||
--echo # Connection 2
|
||||
connection con2;
|
||||
--echo # Reaping: DROP VIEW v1
|
||||
--reap
|
||||
|
||||
--echo # Connection default
|
||||
connection default;
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
disconnect con2;
|
||||
disconnect con3;
|
||||
|
||||
|
||||
# Check that all connections opened by test cases in this file are really
|
||||
# gone so execution of other tests won't be affected by their presence.
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
@ -11,7 +11,7 @@
|
||||
#
|
||||
# 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 02
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
|
||||
|
@ -103,9 +103,9 @@ ENDIF()
|
||||
IF(NOT FIND_PROC)
|
||||
# BSD style
|
||||
EXECUTE_PROCESS(COMMAND ps -uaxww OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE result)
|
||||
IF(result MATCHES 0)
|
||||
IF(result MATCHES 0)
|
||||
SET( FIND_PROC
|
||||
"ps -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- "\$MYSQLD\" | grep \" $PID \" > /dev/null")
|
||||
"ps -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"$MYSQLD\" | grep \" $PID \" > /dev/null")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
@ -113,20 +113,15 @@ IF(NOT FIND_PROC)
|
||||
# SysV style
|
||||
EXECUTE_PROCESS(COMMAND ps -ef OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE result)
|
||||
IF(result MATCHES 0)
|
||||
SET( FIND_PROC "ps -ef | grep -v \" grep\" | grep -v mysqld_safe | grep -- "\$MYSQLD\" | grep \" $PID \" > /dev/null")
|
||||
SET( FIND_PROC "ps -ef | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"$MYSQLD\" | grep \" $PID \" > /dev/null")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
EXECUTE_PROCESS(COMMAND sh -c "kill -0 $$" OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE result2)
|
||||
IF(result3 MATCHES 0)
|
||||
EXECUTE_PROCESS(COMMAND sh -c "kill -0 $$" OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE result)
|
||||
IF(result MATCHES 0)
|
||||
SET(CHECK_PID "kill -0 $PID > /dev/null 2> /dev/null")
|
||||
ELSE()
|
||||
EXECUTE_PROCESS(COMMAND sh -c "kill -s 0 $$" OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE result3)
|
||||
IF(result4 MATCHES 0)
|
||||
SET(CHECK_PID "kill -s 0 $PID > /dev/null 2> /dev/null")
|
||||
ELSE()
|
||||
SET(CHECK_PID "kill -s SIGCONT $PID > /dev/null 2> /dev/null")
|
||||
ENDIF()
|
||||
SET(CHECK_PID "kill -s SIGCONT $PID > /dev/null 2> /dev/null")
|
||||
ENDIF()
|
||||
|
||||
ENDIF(UNIX)
|
||||
|
@ -191,7 +191,14 @@ ADD_CUSTOM_COMMAND(
|
||||
COMMAND ${CMAKE_COMMAND} -E remove -f lex_hash.h.tmp
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/gen_lex_hash.cc)
|
||||
|
||||
|
||||
MYSQL_ADD_EXECUTABLE(mysql_tzinfo_to_sql tztime.cc)
|
||||
SET_TARGET_PROPERTIES(mysql_tzinfo_to_sql PROPERTIES COMPILE_FLAGS "-DTZINFO2SQL")
|
||||
TARGET_LINK_LIBRARIES(mysql_tzinfo_to_sql ${MYSQLD_STATIC_PLUGIN_LIBS}
|
||||
mysys dbug strings vio regex
|
||||
${LIBWRAP} ${LIBCRYPT} ${LIBDL}
|
||||
${SSL_LIBRARIES})
|
||||
|
||||
ADD_CUSTOM_TARGET(
|
||||
GenServerSource
|
||||
DEPENDS ${GEN_SOURCES}
|
||||
|
@ -574,7 +574,7 @@ Event_db_repository::open_event_table(THD *thd, enum thr_lock_type lock_type,
|
||||
|
||||
tables.init_one_table("mysql", 5, "event", 5, "event", lock_type);
|
||||
|
||||
if (simple_open_n_lock_tables(thd, &tables))
|
||||
if (open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
close_thread_tables(thd);
|
||||
DBUG_RETURN(TRUE);
|
||||
@ -1129,11 +1129,10 @@ Event_db_repository::check_system_tables(THD *thd)
|
||||
DBUG_ENTER("Event_db_repository::check_system_tables");
|
||||
DBUG_PRINT("enter", ("thd: 0x%lx", (long) thd));
|
||||
|
||||
|
||||
/* Check mysql.db */
|
||||
tables.init_one_table("mysql", 5, "db", 2, "db", TL_READ);
|
||||
|
||||
if (simple_open_n_lock_tables(thd, &tables))
|
||||
if (open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
ret= 1;
|
||||
sql_print_error("Cannot open mysql.db");
|
||||
@ -1148,7 +1147,7 @@ Event_db_repository::check_system_tables(THD *thd)
|
||||
/* Check mysql.user */
|
||||
tables.init_one_table("mysql", 5, "user", 4, "user", TL_READ);
|
||||
|
||||
if (simple_open_n_lock_tables(thd, &tables))
|
||||
if (open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
ret= 1;
|
||||
sql_print_error("Cannot open mysql.user");
|
||||
@ -1168,7 +1167,7 @@ Event_db_repository::check_system_tables(THD *thd)
|
||||
/* Check mysql.event */
|
||||
tables.init_one_table("mysql", 5, "event", 5, "event", TL_READ);
|
||||
|
||||
if (simple_open_n_lock_tables(thd, &tables))
|
||||
if (open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
ret= 1;
|
||||
sql_print_error("Cannot open mysql.event");
|
||||
|
@ -203,6 +203,9 @@ pre_init_event_thread(THD* thd)
|
||||
thd->version= refresh_version;
|
||||
thd->set_time();
|
||||
|
||||
/* Do not use user-supplied timeout value for system threads. */
|
||||
thd->variables.lock_wait_timeout= LONG_TIMEOUT;
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -9504,6 +9504,8 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused)))
|
||||
my_net_init(&thd->net, 0);
|
||||
thd->main_security_ctx.master_access= ~0;
|
||||
thd->main_security_ctx.priv_user = 0;
|
||||
/* Do not use user-supplied timeout value for system threads. */
|
||||
thd->variables.lock_wait_timeout= LONG_TIMEOUT;
|
||||
|
||||
CHARSET_INFO *charset_connection;
|
||||
charset_connection= get_charset_by_csname("utf8",
|
||||
|
@ -2348,7 +2348,7 @@ static int open_ndb_binlog_index(THD *thd, TABLE **ndb_binlog_index)
|
||||
tables->required_type= FRMTYPE_TABLE;
|
||||
uint counter;
|
||||
thd->clear_error();
|
||||
if (simple_open_n_lock_tables(thd, tables))
|
||||
if (open_and_lock_tables(thd, tables, FALSE, 0))
|
||||
{
|
||||
if (thd->killed)
|
||||
sql_print_error("NDB Binlog: Opening ndb_binlog_index: killed");
|
||||
@ -3675,6 +3675,8 @@ pthread_handler_t ndb_binlog_thread_func(void *arg)
|
||||
my_net_init(&thd->net, 0);
|
||||
thd->main_security_ctx.master_access= ~0;
|
||||
thd->main_security_ctx.priv_user= 0;
|
||||
/* Do not use user-supplied timeout value for system threads. */
|
||||
thd->variables.lock_wait_timeout= LONG_TIMEOUT;
|
||||
|
||||
/*
|
||||
Set up ndb binlog
|
||||
|
@ -251,6 +251,7 @@ static void reset_lock_data_and_free(MYSQL_LOCK **mysql_lock)
|
||||
MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK Ignore a global read lock
|
||||
MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY Ignore SET GLOBAL READ_ONLY
|
||||
MYSQL_LOCK_IGNORE_FLUSH Ignore a flush tables.
|
||||
MYSQL_LOCK_IGNORE_TIMEOUT Use maximum timeout value.
|
||||
@param need_reopen Out parameter, TRUE if some tables were altered
|
||||
or deleted and should be reopened by caller.
|
||||
|
||||
@ -277,6 +278,9 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
|
||||
if (mysql_lock_tables_check(thd, tables, count, flags))
|
||||
DBUG_RETURN (NULL);
|
||||
|
||||
ulong timeout= (flags & MYSQL_LOCK_IGNORE_TIMEOUT) ?
|
||||
LONG_TIMEOUT : thd->variables.lock_wait_timeout;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (! (sql_lock= get_lock_data(thd, tables, count, GET_LOCK_STORE_LOCKS,
|
||||
@ -336,8 +340,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
|
||||
rc= thr_lock_errno_to_mysql[(int) thr_multi_lock(sql_lock->locks +
|
||||
sql_lock->lock_count,
|
||||
sql_lock->lock_count,
|
||||
thd->lock_id,
|
||||
thd->variables.lock_wait_timeout)];
|
||||
thd->lock_id, timeout)];
|
||||
if (rc > 1) /* a timeout or a deadlock */
|
||||
{
|
||||
if (sql_lock->table_count)
|
||||
|
@ -2521,6 +2521,7 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
|
||||
case SQLCOM_ASSIGN_TO_KEYCACHE:
|
||||
case SQLCOM_PRELOAD_KEYS:
|
||||
case SQLCOM_FLUSH:
|
||||
case SQLCOM_RESET:
|
||||
case SQLCOM_CHECK:
|
||||
implicit_commit= TRUE;
|
||||
break;
|
||||
@ -7480,7 +7481,7 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
/* A small test to verify that objects have consistent types */
|
||||
DBUG_ASSERT(sizeof(thd->variables.option_bits) == sizeof(OPTION_RELAXED_UNIQUE_CHECKS));
|
||||
|
||||
if (simple_open_n_lock_tables(thd, rli->tables_to_lock))
|
||||
if (open_and_lock_tables(thd, rli->tables_to_lock, FALSE, 0))
|
||||
{
|
||||
uint actual_error= thd->stmt_da->sql_errno();
|
||||
if (thd->is_slave_error || thd->is_fatal_error)
|
||||
|
@ -73,7 +73,7 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
|
||||
*/
|
||||
thd->lex->set_stmt_row_injection();
|
||||
|
||||
if (simple_open_n_lock_tables(thd, rli->tables_to_lock))
|
||||
if (open_and_lock_tables(thd, rli->tables_to_lock, FALSE, 0))
|
||||
{
|
||||
uint actual_error= thd->stmt_da->sql_errno();
|
||||
if (thd->is_slave_error || thd->is_fatal_error)
|
||||
|
@ -1562,26 +1562,16 @@ open_tables(THD *thd, TABLE_LIST **tables, uint *counter, uint flags)
|
||||
return open_tables(thd, tables, counter, flags, &prelocking_strategy);
|
||||
}
|
||||
/* open_and_lock_tables with optional derived handling */
|
||||
bool open_and_lock_tables_derived(THD *thd, TABLE_LIST *tables,
|
||||
bool derived, uint flags,
|
||||
Prelocking_strategy *prelocking_strategy);
|
||||
inline bool open_and_lock_tables_derived(THD *thd, TABLE_LIST *tables,
|
||||
bool derived, uint flags)
|
||||
bool open_and_lock_tables(THD *thd, TABLE_LIST *tables,
|
||||
bool derived, uint flags,
|
||||
Prelocking_strategy *prelocking_strategy);
|
||||
inline bool open_and_lock_tables(THD *thd, TABLE_LIST *tables,
|
||||
bool derived, uint flags)
|
||||
{
|
||||
DML_prelocking_strategy prelocking_strategy;
|
||||
|
||||
return open_and_lock_tables_derived(thd, tables, derived, flags,
|
||||
&prelocking_strategy);
|
||||
}
|
||||
/* simple open_and_lock_tables without derived handling */
|
||||
inline bool simple_open_n_lock_tables(THD *thd, TABLE_LIST *tables)
|
||||
{
|
||||
return open_and_lock_tables_derived(thd, tables, FALSE, 0);
|
||||
}
|
||||
/* open_and_lock_tables with derived handling */
|
||||
inline bool open_and_lock_tables(THD *thd, TABLE_LIST *tables)
|
||||
{
|
||||
return open_and_lock_tables_derived(thd, tables, TRUE, 0);
|
||||
return open_and_lock_tables(thd, tables, derived, flags,
|
||||
&prelocking_strategy);
|
||||
}
|
||||
/* simple open_and_lock_tables without derived handling for single table */
|
||||
TABLE *open_n_lock_single_table(THD *thd, TABLE_LIST *table_l,
|
||||
@ -2171,11 +2161,17 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count,
|
||||
in parser.
|
||||
*/
|
||||
#define MYSQL_OPEN_FORCE_SHARED_HIGH_PRIO_MDL 0x0800
|
||||
/**
|
||||
When opening or locking the table, use the maximum timeout
|
||||
(LONG_TIMEOUT = 1 year) rather than the user-supplied timeout value.
|
||||
*/
|
||||
#define MYSQL_LOCK_IGNORE_TIMEOUT 0x1000
|
||||
|
||||
/** Please refer to the internals manual. */
|
||||
#define MYSQL_OPEN_REOPEN (MYSQL_LOCK_IGNORE_FLUSH |\
|
||||
MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK |\
|
||||
MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY |\
|
||||
MYSQL_LOCK_IGNORE_TIMEOUT |\
|
||||
MYSQL_OPEN_GET_NEW_TABLE |\
|
||||
MYSQL_OPEN_SKIP_TEMPORARY |\
|
||||
MYSQL_OPEN_HAS_MDL_LOCK)
|
||||
|
@ -47,6 +47,8 @@ FOREACH (dir ${dirs})
|
||||
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${dir}
|
||||
DESTINATION ${INSTALL_MYSQLSHAREDIR})
|
||||
ENDFOREACH()
|
||||
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/charsets DESTINATION ${INSTALL_MYSQLSHAREDIR})
|
||||
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/charsets DESTINATION ${INSTALL_MYSQLSHAREDIR}
|
||||
PATTERN "languages.html" EXCLUDE
|
||||
)
|
||||
|
||||
INSTALL(FILES ${files} DESTINATION ${INSTALL_MYSQLSHAREDIR})
|
||||
|
@ -2030,6 +2030,8 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
|
||||
thd_proc_info(thd, "Waiting for master update");
|
||||
thd->version=refresh_version;
|
||||
thd->set_time();
|
||||
/* Do not use user-supplied timeout value for system threads. */
|
||||
thd->variables.lock_wait_timeout= LONG_TIMEOUT;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -2825,7 +2825,7 @@ int sp_instr::exec_open_and_lock_tables(THD *thd, TABLE_LIST *tables)
|
||||
and open and lock them before executing instructions core function.
|
||||
*/
|
||||
if (check_table_access(thd, SELECT_ACL, tables, FALSE, UINT_MAX, FALSE)
|
||||
|| open_and_lock_tables(thd, tables))
|
||||
|| open_and_lock_tables(thd, tables, TRUE, 0))
|
||||
result= -1;
|
||||
else
|
||||
result= 0;
|
||||
|
@ -675,7 +675,7 @@ my_bool acl_reload(THD *thd)
|
||||
tables[0].open_type= tables[1].open_type= tables[2].open_type= OT_BASE_ONLY;
|
||||
init_mdl_requests(tables);
|
||||
|
||||
if (simple_open_n_lock_tables(thd, tables))
|
||||
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
/*
|
||||
Execution might have been interrupted; only print the error message
|
||||
@ -1602,7 +1602,7 @@ bool change_password(THD *thd, const char *host, const char *user,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!(table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
if (!(table= open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
mysql_mutex_lock(&acl_cache->lock);
|
||||
@ -3040,7 +3040,7 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
||||
class LEX_COLUMN *column;
|
||||
List_iterator <LEX_COLUMN> column_iter(columns);
|
||||
|
||||
if (open_and_lock_tables(thd, table_list))
|
||||
if (open_and_lock_tables(thd, table_list, TRUE, 0))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
while ((column = column_iter++))
|
||||
@ -3146,7 +3146,7 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
||||
*/
|
||||
Query_tables_list backup;
|
||||
thd->lex->reset_n_backup_query_tables_list(&backup);
|
||||
if (simple_open_n_lock_tables(thd,tables))
|
||||
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{ // Should never happen
|
||||
close_thread_tables(thd); /* purecov: deadcode */
|
||||
/* Restore the state of binlog format */
|
||||
@ -3374,7 +3374,7 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (simple_open_n_lock_tables(thd,tables))
|
||||
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{ // Should never happen
|
||||
close_thread_tables(thd);
|
||||
/* Restore the state of binlog format */
|
||||
@ -3531,7 +3531,7 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (simple_open_n_lock_tables(thd,tables))
|
||||
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{ // This should never happen
|
||||
close_thread_tables(thd); /* purecov: deadcode */
|
||||
/* Restore the state of binlog format */
|
||||
@ -3853,7 +3853,7 @@ static my_bool grant_reload_procs_priv(THD *thd)
|
||||
TL_READ);
|
||||
table.open_type= OT_BASE_ONLY;
|
||||
|
||||
if (simple_open_n_lock_tables(thd, &table))
|
||||
if (open_and_lock_tables(thd, &table, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
close_thread_tables(thd);
|
||||
DBUG_RETURN(TRUE);
|
||||
@ -3924,7 +3924,7 @@ my_bool grant_reload(THD *thd)
|
||||
To avoid deadlocks we should obtain table locks before
|
||||
obtaining LOCK_grant rwlock.
|
||||
*/
|
||||
if (simple_open_n_lock_tables(thd, tables))
|
||||
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
goto end;
|
||||
|
||||
mysql_rwlock_wrlock(&LOCK_grant);
|
||||
@ -5227,7 +5227,7 @@ int open_grant_tables(THD *thd, TABLE_LIST *tables)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (simple_open_n_lock_tables(thd, tables))
|
||||
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{ // This should never happen
|
||||
close_thread_tables(thd);
|
||||
DBUG_RETURN(-1);
|
||||
|
188
sql/sql_base.cc
188
sql/sql_base.cc
@ -122,7 +122,8 @@ static bool open_table_entry_fini(THD *thd, TABLE_SHARE *share, TABLE *entry);
|
||||
static bool auto_repair_table(THD *thd, TABLE_LIST *table_list);
|
||||
static void free_cache_entry(TABLE *entry);
|
||||
static bool tdc_wait_for_old_versions(THD *thd,
|
||||
MDL_request_list *mdl_requests);
|
||||
MDL_request_list *mdl_requests,
|
||||
ulong timeout);
|
||||
static bool
|
||||
has_write_table_with_auto_increment(TABLE_LIST *tables);
|
||||
|
||||
@ -2363,8 +2364,7 @@ open_table_get_mdl_lock(THD *thd, TABLE_LIST *table_list,
|
||||
mdl_requests.push_front(mdl_request);
|
||||
mdl_requests.push_front(global_request);
|
||||
|
||||
if (thd->mdl_context.acquire_locks(&mdl_requests,
|
||||
thd->variables.lock_wait_timeout))
|
||||
if (thd->mdl_context.acquire_locks(&mdl_requests, ot_ctx->get_timeout()))
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
@ -2555,16 +2555,6 @@ bool open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
||||
int distance= ((int) table->reginfo.lock_type -
|
||||
(int) table_list->lock_type);
|
||||
|
||||
/*
|
||||
If we are performing DDL operation we also should ensure
|
||||
that we will find TABLE instance with upgradable metadata
|
||||
lock,
|
||||
*/
|
||||
if ((flags & MYSQL_OPEN_TAKE_UPGRADABLE_MDL) &&
|
||||
table_list->lock_type >= TL_WRITE_ALLOW_WRITE &&
|
||||
! table->mdl_ticket->is_upgradable_or_exclusive())
|
||||
distance= -1;
|
||||
|
||||
/*
|
||||
Find a table that either has the exact lock type requested,
|
||||
or has the best suitable lock. In case there is no locked
|
||||
@ -2598,13 +2588,6 @@ bool open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
||||
}
|
||||
if (best_table)
|
||||
{
|
||||
if ((flags & MYSQL_OPEN_TAKE_UPGRADABLE_MDL) &&
|
||||
table_list->lock_type >= TL_WRITE_ALLOW_WRITE &&
|
||||
! best_table->mdl_ticket->is_upgradable_or_exclusive())
|
||||
{
|
||||
my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE, MYF(0), alias);
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
table= best_table;
|
||||
table->query_id= thd->query_id;
|
||||
DBUG_PRINT("info",("Using locked table"));
|
||||
@ -3308,7 +3291,7 @@ unlink_all_closed_tables(THD *thd, MYSQL_LOCK *lock, size_t reopen_count)
|
||||
bool
|
||||
Locked_tables_list::reopen_tables(THD *thd)
|
||||
{
|
||||
Open_table_context ot_ctx_unused(thd);
|
||||
Open_table_context ot_ctx_unused(thd, LONG_TIMEOUT);
|
||||
bool lt_refresh_unused;
|
||||
size_t reopen_count= 0;
|
||||
MYSQL_LOCK *lock;
|
||||
@ -3744,13 +3727,14 @@ end_with_lock_open:
|
||||
|
||||
/** Open_table_context */
|
||||
|
||||
Open_table_context::Open_table_context(THD *thd)
|
||||
Open_table_context::Open_table_context(THD *thd, ulong timeout)
|
||||
:m_action(OT_NO_ACTION),
|
||||
m_start_of_statement_svp(thd->mdl_context.mdl_savepoint()),
|
||||
m_has_locks((thd->in_multi_stmt_transaction() &&
|
||||
thd->mdl_context.has_locks()) ||
|
||||
thd->mdl_context.trans_sentinel()),
|
||||
m_global_mdl_request(NULL)
|
||||
m_global_mdl_request(NULL),
|
||||
m_timeout(timeout)
|
||||
{}
|
||||
|
||||
|
||||
@ -3845,11 +3829,10 @@ recover_from_failed_open(THD *thd, MDL_request *mdl_request,
|
||||
switch (m_action)
|
||||
{
|
||||
case OT_WAIT_MDL_LOCK:
|
||||
result= thd->mdl_context.wait_for_lock(mdl_request,
|
||||
thd->variables.lock_wait_timeout);
|
||||
result= thd->mdl_context.wait_for_lock(mdl_request, get_timeout());
|
||||
break;
|
||||
case OT_WAIT_TDC:
|
||||
result= tdc_wait_for_old_versions(thd, &m_mdl_requests);
|
||||
result= tdc_wait_for_old_versions(thd, &m_mdl_requests, get_timeout());
|
||||
DBUG_ASSERT(thd->mysys_var->current_mutex == NULL);
|
||||
break;
|
||||
case OT_DISCOVER:
|
||||
@ -3866,8 +3849,7 @@ recover_from_failed_open(THD *thd, MDL_request *mdl_request,
|
||||
mdl_requests.push_front(&mdl_global_request);
|
||||
|
||||
if ((result=
|
||||
thd->mdl_context.acquire_locks(&mdl_requests,
|
||||
thd->variables.lock_wait_timeout)))
|
||||
thd->mdl_context.acquire_locks(&mdl_requests, get_timeout())))
|
||||
break;
|
||||
|
||||
DBUG_ASSERT(mdl_request->key.mdl_namespace() == MDL_key::TABLE);
|
||||
@ -3899,8 +3881,7 @@ recover_from_failed_open(THD *thd, MDL_request *mdl_request,
|
||||
mdl_requests.push_front(&mdl_global_request);
|
||||
|
||||
if ((result=
|
||||
thd->mdl_context.acquire_locks(&mdl_requests,
|
||||
thd->variables.lock_wait_timeout)))
|
||||
thd->mdl_context.acquire_locks(&mdl_requests, get_timeout())))
|
||||
break;
|
||||
|
||||
DBUG_ASSERT(mdl_request->key.mdl_namespace() == MDL_key::TABLE);
|
||||
@ -4168,9 +4149,18 @@ open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
|
||||
TABLE_LIST is processed. This code works only during re-execution.
|
||||
*/
|
||||
if (tables->view)
|
||||
goto process_view_routines;
|
||||
if (!mysql_schema_table(thd, lex, tables) &&
|
||||
!check_and_update_table_version(thd, tables, tables->table->s))
|
||||
{
|
||||
/*
|
||||
We still need to take a MDL lock on the merged view to protect
|
||||
it from concurrent changes.
|
||||
*/
|
||||
if (!open_table_get_mdl_lock(thd, tables, &tables->mdl_request,
|
||||
ot_ctx, flags))
|
||||
goto process_view_routines;
|
||||
/* Fall-through to return error. */
|
||||
}
|
||||
else if (!mysql_schema_table(thd, lex, tables) &&
|
||||
!check_and_update_table_version(thd, tables, tables->table->s))
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
@ -4347,7 +4337,8 @@ end:
|
||||
|
||||
/**
|
||||
Acquire upgradable (SNW, SNRW) metadata locks on tables to be opened
|
||||
for LOCK TABLES or a DDL statement.
|
||||
for LOCK TABLES or a DDL statement. Under LOCK TABLES, we can't take
|
||||
new locks, so use open_tables_check_upgradable_mdl() instead.
|
||||
|
||||
@param thd Thread context.
|
||||
@param tables_start Start of list of tables on which upgradable locks
|
||||
@ -4367,10 +4358,15 @@ open_tables_acquire_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
|
||||
MDL_request_list mdl_requests;
|
||||
TABLE_LIST *table;
|
||||
|
||||
DBUG_ASSERT(!thd->locked_tables_mode);
|
||||
|
||||
for (table= tables_start; table && table != tables_end;
|
||||
table= table->next_global)
|
||||
{
|
||||
if (table->lock_type >= TL_WRITE_ALLOW_WRITE)
|
||||
if (table->lock_type >= TL_WRITE_ALLOW_WRITE &&
|
||||
!(table->open_type == OT_TEMPORARY_ONLY ||
|
||||
(table->open_type != OT_BASE_ONLY &&
|
||||
find_temporary_table(thd, table))))
|
||||
{
|
||||
table->mdl_request.set_type(table->lock_type > TL_WRITE_ALLOW_READ ?
|
||||
MDL_SHARED_NO_READ_WRITE :
|
||||
@ -4388,8 +4384,7 @@ open_tables_acquire_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
|
||||
mdl_requests.push_front(global_request);
|
||||
}
|
||||
|
||||
if (thd->mdl_context.acquire_locks(&mdl_requests,
|
||||
thd->variables.lock_wait_timeout))
|
||||
if (thd->mdl_context.acquire_locks(&mdl_requests, ot_ctx->get_timeout()))
|
||||
return TRUE;
|
||||
|
||||
for (table= tables_start; table && table != tables_end;
|
||||
@ -4406,6 +4401,58 @@ open_tables_acquire_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check for upgradable (SNW, SNRW) metadata locks on tables to be opened
|
||||
for a DDL statement. Under LOCK TABLES, we can't take new locks, so we
|
||||
must check if appropriate locks were pre-acquired.
|
||||
|
||||
@param thd Thread context.
|
||||
@param tables_start Start of list of tables on which upgradable locks
|
||||
should be searched for.
|
||||
@param tables_end End of list of tables.
|
||||
|
||||
@retval FALSE Success.
|
||||
@retval TRUE Failure (e.g. connection was killed)
|
||||
*/
|
||||
|
||||
static bool
|
||||
open_tables_check_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
|
||||
TABLE_LIST *tables_end)
|
||||
{
|
||||
TABLE_LIST *table;
|
||||
|
||||
DBUG_ASSERT(thd->locked_tables_mode);
|
||||
|
||||
for (table= tables_start; table && table != tables_end;
|
||||
table= table->next_global)
|
||||
{
|
||||
if (table->lock_type >= TL_WRITE_ALLOW_WRITE &&
|
||||
!(table->open_type == OT_TEMPORARY_ONLY ||
|
||||
(table->open_type != OT_BASE_ONLY &&
|
||||
find_temporary_table(thd, table))))
|
||||
{
|
||||
/*
|
||||
We don't need to do anything about the found TABLE instance as it
|
||||
will be handled later in open_tables(), we only need to check that
|
||||
an upgradable lock is already acquired. When we enter LOCK TABLES
|
||||
mode, SNRW locks are acquired before all other locks. So if under
|
||||
LOCK TABLES we find that there is TABLE instance with upgradeable
|
||||
lock, all other instances of TABLE for the same table will have the
|
||||
same ticket.
|
||||
|
||||
Note that find_table_for_mdl_upgrade() will report an error if a
|
||||
ticket is not found.
|
||||
*/
|
||||
if (!find_table_for_mdl_upgrade(thd->open_tables, table->db,
|
||||
table->table_name, FALSE))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Open all tables in list
|
||||
|
||||
@ -4448,7 +4495,8 @@ bool open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags,
|
||||
TABLE_LIST **table_to_open;
|
||||
Sroutine_hash_entry **sroutine_to_open;
|
||||
TABLE_LIST *tables;
|
||||
Open_table_context ot_ctx(thd);
|
||||
Open_table_context ot_ctx(thd, (flags & MYSQL_LOCK_IGNORE_TIMEOUT) ?
|
||||
LONG_TIMEOUT : thd->variables.lock_wait_timeout);
|
||||
bool error= FALSE;
|
||||
MEM_ROOT new_frm_mem;
|
||||
bool has_prelocking_list;
|
||||
@ -4491,12 +4539,31 @@ restart:
|
||||
lock will be reused (thanks to the fact that in recursive case
|
||||
metadata locks are acquired without waiting).
|
||||
*/
|
||||
if ((flags & MYSQL_OPEN_TAKE_UPGRADABLE_MDL) &&
|
||||
! thd->locked_tables_mode)
|
||||
if (flags & MYSQL_OPEN_TAKE_UPGRADABLE_MDL)
|
||||
{
|
||||
if (open_tables_acquire_upgradable_mdl(thd, *start,
|
||||
thd->lex->first_not_own_table(),
|
||||
&ot_ctx))
|
||||
/*
|
||||
open_tables_acquire_upgradable_mdl() does not currenly handle
|
||||
these two flags. At this point, that does not matter as they
|
||||
are not used together with MYSQL_OPEN_TAKE_UPGRADABLE_MDL.
|
||||
*/
|
||||
DBUG_ASSERT(!(flags & (MYSQL_OPEN_SKIP_TEMPORARY |
|
||||
MYSQL_OPEN_TEMPORARY_ONLY)));
|
||||
if (thd->locked_tables_mode)
|
||||
{
|
||||
/*
|
||||
Under LOCK TABLES, we can't acquire new locks, so we instead
|
||||
need to check if appropriate locks were pre-acquired.
|
||||
*/
|
||||
if (open_tables_check_upgradable_mdl(thd, *start,
|
||||
thd->lex->first_not_own_table()))
|
||||
{
|
||||
error= TRUE;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else if (open_tables_acquire_upgradable_mdl(thd, *start,
|
||||
thd->lex->first_not_own_table(),
|
||||
&ot_ctx))
|
||||
{
|
||||
error= TRUE;
|
||||
goto err;
|
||||
@ -4952,7 +5019,7 @@ TABLE *open_n_lock_single_table(THD *thd, TABLE_LIST *table_l,
|
||||
table_l->required_type= FRMTYPE_TABLE;
|
||||
|
||||
/* Open the table. */
|
||||
if (open_and_lock_tables_derived(thd, table_l, FALSE, flags))
|
||||
if (open_and_lock_tables(thd, table_l, FALSE, flags))
|
||||
table_l->table= NULL; /* Just to be sure. */
|
||||
|
||||
/* Restore list. */
|
||||
@ -4990,7 +5057,8 @@ TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type,
|
||||
uint lock_flags)
|
||||
{
|
||||
TABLE *table;
|
||||
Open_table_context ot_ctx(thd);
|
||||
Open_table_context ot_ctx(thd, (lock_flags & MYSQL_LOCK_IGNORE_TIMEOUT) ?
|
||||
LONG_TIMEOUT : thd->variables.lock_wait_timeout);
|
||||
bool refresh;
|
||||
bool error;
|
||||
DBUG_ENTER("open_ltable");
|
||||
@ -5089,20 +5157,13 @@ end:
|
||||
@note
|
||||
The lock will automaticaly be freed by close_thread_tables()
|
||||
|
||||
@note
|
||||
There are several convenience functions, e.g. :
|
||||
- simple_open_n_lock_tables(thd, tables) without derived handling
|
||||
- open_and_lock_tables(thd, tables) with derived handling
|
||||
Both inline functions call open_and_lock_tables_derived() with
|
||||
the third argument set appropriately.
|
||||
|
||||
@retval FALSE OK.
|
||||
@retval TRUE Error
|
||||
*/
|
||||
|
||||
bool open_and_lock_tables_derived(THD *thd, TABLE_LIST *tables,
|
||||
bool derived, uint flags,
|
||||
Prelocking_strategy *prelocking_strategy)
|
||||
bool open_and_lock_tables(THD *thd, TABLE_LIST *tables,
|
||||
bool derived, uint flags,
|
||||
Prelocking_strategy *prelocking_strategy)
|
||||
{
|
||||
uint counter;
|
||||
bool need_reopen;
|
||||
@ -5116,7 +5177,7 @@ bool open_and_lock_tables_derived(THD *thd, TABLE_LIST *tables,
|
||||
statement.
|
||||
*/
|
||||
MDL_ticket *start_of_statement_svp= thd->mdl_context.mdl_savepoint();
|
||||
DBUG_ENTER("open_and_lock_tables_derived");
|
||||
DBUG_ENTER("open_and_lock_tables");
|
||||
DBUG_PRINT("enter", ("derived handling: %d", derived));
|
||||
|
||||
for ( ; ; )
|
||||
@ -8527,16 +8588,18 @@ void tdc_remove_table(THD *thd, enum_tdc_remove_table_type remove_type,
|
||||
|
||||
@param thd Thread context
|
||||
@param context Metadata locking context with locks.
|
||||
@param timeout Seconds to wait before reporting ER_LOCK_WAIT_TIMEOUT.
|
||||
*/
|
||||
|
||||
static bool
|
||||
tdc_wait_for_old_versions(THD *thd, MDL_request_list *mdl_requests)
|
||||
tdc_wait_for_old_versions(THD *thd, MDL_request_list *mdl_requests,
|
||||
ulong timeout)
|
||||
{
|
||||
TABLE_SHARE *share;
|
||||
const char *old_msg;
|
||||
MDL_request *mdl_request;
|
||||
struct timespec abstime;
|
||||
set_timespec(abstime, thd->variables.lock_wait_timeout);
|
||||
set_timespec(abstime, timeout);
|
||||
int wait_result= 0;
|
||||
|
||||
while (!thd->killed)
|
||||
@ -8803,8 +8866,9 @@ open_system_tables_for_read(THD *thd, TABLE_LIST *table_list,
|
||||
lex->reset_n_backup_query_tables_list(&query_tables_list_backup);
|
||||
thd->reset_n_backup_open_tables_state(backup);
|
||||
|
||||
if (open_and_lock_tables_derived(thd, table_list, FALSE,
|
||||
MYSQL_LOCK_IGNORE_FLUSH))
|
||||
if (open_and_lock_tables(thd, table_list, FALSE,
|
||||
MYSQL_LOCK_IGNORE_FLUSH |
|
||||
MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
lex->restore_backup_query_tables_list(&query_tables_list_backup);
|
||||
goto error;
|
||||
@ -8866,7 +8930,8 @@ open_system_table_for_update(THD *thd, TABLE_LIST *one_table)
|
||||
{
|
||||
DBUG_ENTER("open_system_table_for_update");
|
||||
|
||||
TABLE *table= open_ltable(thd, one_table, one_table->lock_type, 0);
|
||||
TABLE *table= open_ltable(thd, one_table, one_table->lock_type,
|
||||
MYSQL_LOCK_IGNORE_TIMEOUT);
|
||||
if (table)
|
||||
{
|
||||
DBUG_ASSERT(table->s->table_category == TABLE_CATEGORY_SYSTEM);
|
||||
@ -8893,6 +8958,7 @@ open_log_table(THD *thd, TABLE_LIST *one_table, Open_tables_backup *backup)
|
||||
uint flags= ( MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK |
|
||||
MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY |
|
||||
MYSQL_LOCK_IGNORE_FLUSH |
|
||||
MYSQL_LOCK_IGNORE_TIMEOUT |
|
||||
MYSQL_LOCK_PERF_SCHEMA);
|
||||
TABLE *table;
|
||||
/* Save value that is changed in mysql_lock_tables() */
|
||||
|
@ -1280,7 +1280,7 @@ public:
|
||||
OT_DISCOVER,
|
||||
OT_REPAIR
|
||||
};
|
||||
Open_table_context(THD *thd);
|
||||
Open_table_context(THD *thd, ulong timeout);
|
||||
|
||||
bool recover_from_failed_open(THD *thd, MDL_request *mdl_request,
|
||||
TABLE_LIST *table);
|
||||
@ -1305,6 +1305,11 @@ public:
|
||||
|
||||
MDL_request *get_global_mdl_request(THD *thd);
|
||||
|
||||
inline ulong get_timeout() const
|
||||
{
|
||||
return m_timeout;
|
||||
}
|
||||
|
||||
private:
|
||||
/** List of requests for all locks taken so far. Used for waiting on locks. */
|
||||
MDL_request_list m_mdl_requests;
|
||||
@ -1322,6 +1327,11 @@ private:
|
||||
opening tables for statements which take upgradable shared metadata locks.
|
||||
*/
|
||||
MDL_request *m_global_mdl_request;
|
||||
/**
|
||||
Lock timeout in seconds. Initialized to LONG_TIMEOUT when opening system
|
||||
tables or to the "lock_wait_timeout" system variable for regular tables.
|
||||
*/
|
||||
uint m_timeout;
|
||||
};
|
||||
|
||||
|
||||
|
@ -57,7 +57,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
||||
THD::STMT_QUERY_TYPE :
|
||||
THD::ROW_QUERY_TYPE;
|
||||
|
||||
if (open_and_lock_tables(thd, table_list))
|
||||
if (open_and_lock_tables(thd, table_list, TRUE, 0))
|
||||
DBUG_RETURN(TRUE);
|
||||
if (!(table= table_list->table))
|
||||
{
|
||||
|
@ -311,7 +311,11 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
|
||||
if (!reopen)
|
||||
my_hash_delete(&thd->handler_tables_hash, (uchar*) hash_tables);
|
||||
else
|
||||
{
|
||||
hash_tables->table= NULL;
|
||||
/* Safety, cleanup the pointer to satisfy MDL assertions. */
|
||||
hash_tables->mdl_request.ticket= NULL;
|
||||
}
|
||||
DBUG_PRINT("exit",("ERROR"));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
@ -545,7 +545,7 @@ bool open_and_lock_for_insert_delayed(THD *thd, TABLE_LIST *table_list)
|
||||
Open tables used for sub-selects or in stored functions, will also
|
||||
cache these functions.
|
||||
*/
|
||||
if (open_and_lock_tables(thd, table_list->next_global))
|
||||
if (open_and_lock_tables(thd, table_list->next_global, TRUE, 0))
|
||||
{
|
||||
end_delayed_insert(thd);
|
||||
DBUG_RETURN(TRUE);
|
||||
@ -569,7 +569,7 @@ bool open_and_lock_for_insert_delayed(THD *thd, TABLE_LIST *table_list)
|
||||
Use a normal insert.
|
||||
*/
|
||||
table_list->lock_type= TL_WRITE;
|
||||
DBUG_RETURN(open_and_lock_tables(thd, table_list));
|
||||
DBUG_RETURN(open_and_lock_tables(thd, table_list, TRUE, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -646,7 +646,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
}
|
||||
else
|
||||
{
|
||||
if (open_and_lock_tables(thd, table_list))
|
||||
if (open_and_lock_tables(thd, table_list, TRUE, 0))
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
lock_type= table_list->lock_type;
|
||||
@ -3619,7 +3619,7 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
||||
|
||||
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
|
||||
{
|
||||
Open_table_context ot_ctx_unused(thd);
|
||||
Open_table_context ot_ctx_unused(thd, LONG_TIMEOUT);
|
||||
/*
|
||||
Here we open the destination table, on which we already have
|
||||
an exclusive metadata lock.
|
||||
@ -3638,7 +3638,7 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
||||
}
|
||||
else
|
||||
{
|
||||
Open_table_context ot_ctx_unused(thd);
|
||||
Open_table_context ot_ctx_unused(thd, LONG_TIMEOUT);
|
||||
if (open_table(thd, create_table, thd->mem_root, &ot_ctx_unused,
|
||||
MYSQL_OPEN_TEMPORARY_ONLY))
|
||||
{
|
||||
|
@ -195,7 +195,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
||||
ER(WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED));
|
||||
}
|
||||
|
||||
if (open_and_lock_tables(thd, table_list))
|
||||
if (open_and_lock_tables(thd, table_list, TRUE, 0))
|
||||
DBUG_RETURN(TRUE);
|
||||
if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context,
|
||||
&thd->lex->select_lex.top_join_list,
|
||||
|
@ -325,6 +325,7 @@ void init_update_queries(void)
|
||||
sql_command_flags[SQLCOM_PRELOAD_KEYS]= CF_AUTO_COMMIT_TRANS;
|
||||
|
||||
sql_command_flags[SQLCOM_FLUSH]= CF_AUTO_COMMIT_TRANS;
|
||||
sql_command_flags[SQLCOM_RESET]= CF_AUTO_COMMIT_TRANS;
|
||||
sql_command_flags[SQLCOM_CHECK]= CF_AUTO_COMMIT_TRANS;
|
||||
}
|
||||
|
||||
@ -2077,7 +2078,7 @@ case SQLCOM_PREPARE:
|
||||
}
|
||||
case SQLCOM_DO:
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE)
|
||||
|| open_and_lock_tables(thd, all_tables))
|
||||
|| open_and_lock_tables(thd, all_tables, TRUE, 0))
|
||||
goto error;
|
||||
|
||||
res= mysql_do(thd, *lex->insert_list);
|
||||
@ -2414,7 +2415,7 @@ case SQLCOM_PREPARE:
|
||||
create_table->open_type= OT_BASE_ONLY;
|
||||
}
|
||||
|
||||
if (!(res= open_and_lock_tables_derived(thd, lex->query_tables, TRUE, 0)))
|
||||
if (!(res= open_and_lock_tables(thd, lex->query_tables, TRUE, 0)))
|
||||
{
|
||||
/*
|
||||
Is table which we are changing used somewhere in other parts
|
||||
@ -3007,7 +3008,7 @@ end_with_restore_list:
|
||||
|
||||
unit->set_limit(select_lex);
|
||||
|
||||
if (!(res= open_and_lock_tables(thd, all_tables)))
|
||||
if (!(res= open_and_lock_tables(thd, all_tables, TRUE, 0)))
|
||||
{
|
||||
MYSQL_INSERT_SELECT_START(thd->query());
|
||||
/* Skip first table, which is the table we are inserting in */
|
||||
@ -3109,7 +3110,7 @@ end_with_restore_list:
|
||||
goto error;
|
||||
|
||||
thd_proc_info(thd, "init");
|
||||
if ((res= open_and_lock_tables(thd, all_tables)))
|
||||
if ((res= open_and_lock_tables(thd, all_tables, TRUE, 0)))
|
||||
break;
|
||||
|
||||
MYSQL_MULTI_DELETE_START(thd->query());
|
||||
@ -3237,7 +3238,7 @@ end_with_restore_list:
|
||||
List<set_var_base> *lex_var_list= &lex->var_list;
|
||||
|
||||
if ((check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE)
|
||||
|| open_and_lock_tables(thd, all_tables)))
|
||||
|| open_and_lock_tables(thd, all_tables, TRUE, 0)))
|
||||
goto error;
|
||||
if (!(res= sql_set_variables(thd, lex_var_list)))
|
||||
{
|
||||
@ -3303,9 +3304,9 @@ end_with_restore_list:
|
||||
{
|
||||
Lock_tables_prelocking_strategy lock_tables_prelocking_strategy;
|
||||
|
||||
res= (open_and_lock_tables_derived(thd, all_tables, FALSE,
|
||||
MYSQL_OPEN_TAKE_UPGRADABLE_MDL,
|
||||
&lock_tables_prelocking_strategy) ||
|
||||
res= (open_and_lock_tables(thd, all_tables, FALSE,
|
||||
MYSQL_OPEN_TAKE_UPGRADABLE_MDL,
|
||||
&lock_tables_prelocking_strategy) ||
|
||||
thd->locked_tables_list.init_locked_tables(thd));
|
||||
}
|
||||
|
||||
@ -4008,7 +4009,7 @@ create_sp_error:
|
||||
*/
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, FALSE,
|
||||
UINT_MAX, FALSE) ||
|
||||
open_and_lock_tables(thd, all_tables))
|
||||
open_and_lock_tables(thd, all_tables, TRUE, 0))
|
||||
goto error;
|
||||
|
||||
/*
|
||||
@ -4132,6 +4133,47 @@ create_sp_error:
|
||||
case SQLCOM_DROP_PROCEDURE:
|
||||
case SQLCOM_DROP_FUNCTION:
|
||||
{
|
||||
#ifdef HAVE_DLOPEN
|
||||
if (lex->sql_command == SQLCOM_DROP_FUNCTION &&
|
||||
! lex->spname->m_explicit_name)
|
||||
{
|
||||
/* DROP FUNCTION <non qualified name> */
|
||||
udf_func *udf = find_udf(lex->spname->m_name.str,
|
||||
lex->spname->m_name.length);
|
||||
if (udf)
|
||||
{
|
||||
if (check_access(thd, DELETE_ACL, "mysql", NULL, NULL, 1, 0))
|
||||
goto error;
|
||||
|
||||
if (!(res = mysql_drop_function(thd, &lex->spname->m_name)))
|
||||
{
|
||||
my_ok(thd);
|
||||
break;
|
||||
}
|
||||
my_error(ER_SP_DROP_FAILED, MYF(0),
|
||||
"FUNCTION (UDF)", lex->spname->m_name.str);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (lex->spname->m_db.str == NULL)
|
||||
{
|
||||
if (lex->drop_if_exists)
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||
ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST),
|
||||
"FUNCTION (UDF)", lex->spname->m_name.str);
|
||||
res= FALSE;
|
||||
my_ok(thd);
|
||||
break;
|
||||
}
|
||||
my_error(ER_SP_DOES_NOT_EXIST, MYF(0),
|
||||
"FUNCTION (UDF)", lex->spname->m_name.str);
|
||||
goto error;
|
||||
}
|
||||
/* Fall thought to test for a stored function */
|
||||
}
|
||||
#endif
|
||||
|
||||
int sp_result;
|
||||
int type= (lex->sql_command == SQLCOM_DROP_PROCEDURE ?
|
||||
TYPE_ENUM_PROCEDURE : TYPE_ENUM_FUNCTION);
|
||||
@ -4178,34 +4220,6 @@ create_sp_error:
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef HAVE_DLOPEN
|
||||
if (lex->sql_command == SQLCOM_DROP_FUNCTION)
|
||||
{
|
||||
udf_func *udf = find_udf(lex->spname->m_name.str,
|
||||
lex->spname->m_name.length);
|
||||
if (udf)
|
||||
{
|
||||
if (check_access(thd, DELETE_ACL, "mysql", NULL, NULL, 1, 0))
|
||||
goto error;
|
||||
|
||||
if (!(res = mysql_drop_function(thd, &lex->spname->m_name)))
|
||||
{
|
||||
my_ok(thd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (lex->spname->m_db.str)
|
||||
sp_result= SP_KEY_NOT_FOUND;
|
||||
else
|
||||
{
|
||||
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
res= sp_result;
|
||||
switch (sp_result) {
|
||||
case SP_OK:
|
||||
@ -4217,7 +4231,7 @@ create_sp_error:
|
||||
res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||
ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST),
|
||||
SP_COM_STRING(lex), lex->spname->m_name.str);
|
||||
SP_COM_STRING(lex), lex->spname->m_qname.str);
|
||||
if (!res)
|
||||
my_ok(thd);
|
||||
break;
|
||||
@ -4510,7 +4524,7 @@ static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables)
|
||||
param->select_limit=
|
||||
new Item_int((ulonglong) thd->variables.select_limit);
|
||||
}
|
||||
if (!(res= open_and_lock_tables(thd, all_tables)))
|
||||
if (!(res= open_and_lock_tables(thd, all_tables, TRUE, 0)))
|
||||
{
|
||||
if (lex->describe)
|
||||
{
|
||||
|
@ -1469,7 +1469,7 @@ static void plugin_load(MEM_ROOT *tmp_root, int *argc, char **argv)
|
||||
goto end;
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
|
||||
if (simple_open_n_lock_tables(new_thd, &tables))
|
||||
if (open_and_lock_tables(new_thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
DBUG_PRINT("error",("Can't open plugin table"));
|
||||
sql_print_error("Can't open the mysql.plugin table. Please "
|
||||
@ -1746,7 +1746,8 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, const LEX_STRING *dl
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
/* need to open before acquiring LOCK_plugin or it will deadlock */
|
||||
if (! (table = open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
if (! (table = open_ltable(thd, &tables, TL_WRITE,
|
||||
MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
mysql_mutex_lock(&LOCK_plugin);
|
||||
@ -1817,7 +1818,7 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name)
|
||||
tables.init_one_table("mysql", 5, "plugin", 6, "plugin", TL_WRITE);
|
||||
|
||||
/* need to open before acquiring LOCK_plugin or it will deadlock */
|
||||
if (! (table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
if (! (table= open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
mysql_mutex_lock(&LOCK_plugin);
|
||||
|
@ -253,7 +253,7 @@ bool servers_reload(THD *thd)
|
||||
|
||||
tables[0].init_one_table("mysql", 5, "servers", 7, "servers", TL_READ);
|
||||
|
||||
if (simple_open_n_lock_tables(thd, tables))
|
||||
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
/*
|
||||
Execution might have been interrupted; only print the error message
|
||||
@ -390,7 +390,7 @@ insert_server(THD *thd, FOREIGN_SERVER *server)
|
||||
tables.init_one_table("mysql", 5, "servers", 7, "servers", TL_WRITE);
|
||||
|
||||
/* need to open before acquiring THR_LOCK_plugin or it will deadlock */
|
||||
if (! (table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
if (! (table= open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
goto end;
|
||||
|
||||
/* insert the server into the table */
|
||||
@ -611,7 +611,7 @@ int drop_server(THD *thd, LEX_SERVER_OPTIONS *server_options)
|
||||
if ((error= delete_server_record_in_cache(server_options)))
|
||||
goto end;
|
||||
|
||||
if (! (table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
if (! (table= open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
{
|
||||
error= my_errno;
|
||||
goto end;
|
||||
@ -728,7 +728,7 @@ int update_server(THD *thd, FOREIGN_SERVER *existing, FOREIGN_SERVER *altered)
|
||||
tables.init_one_table("mysql", 5, "servers", 7, "servers",
|
||||
TL_WRITE);
|
||||
|
||||
if (!(table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
if (!(table= open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
{
|
||||
error= my_errno;
|
||||
goto end;
|
||||
|
@ -4227,8 +4227,7 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table,
|
||||
/*
|
||||
Open or obtain an exclusive metadata lock on table being created.
|
||||
*/
|
||||
if (open_and_lock_tables_derived(thd, thd->lex->query_tables, FALSE,
|
||||
0))
|
||||
if (open_and_lock_tables(thd, thd->lex->query_tables, FALSE, 0))
|
||||
{
|
||||
result= TRUE;
|
||||
goto unlock;
|
||||
@ -4427,7 +4426,7 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list,
|
||||
char from[FN_REFLEN],tmp[FN_REFLEN+32];
|
||||
const char **ext;
|
||||
MY_STAT stat_info;
|
||||
Open_table_context ot_ctx_unused(thd);
|
||||
Open_table_context ot_ctx_unused(thd, LONG_TIMEOUT);
|
||||
DBUG_ENTER("prepare_for_repair");
|
||||
uint reopen_for_repair_flags= (MYSQL_LOCK_IGNORE_FLUSH |
|
||||
MYSQL_OPEN_HAS_MDL_LOCK);
|
||||
@ -4679,8 +4678,8 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||
if (view_operator_func == NULL)
|
||||
table->required_type=FRMTYPE_TABLE;
|
||||
|
||||
open_error= open_and_lock_tables_derived(thd, table, TRUE,
|
||||
MYSQL_OPEN_TAKE_UPGRADABLE_MDL);
|
||||
open_error= open_and_lock_tables(thd, table, TRUE,
|
||||
MYSQL_OPEN_TAKE_UPGRADABLE_MDL);
|
||||
thd->no_warnings_for_error= 0;
|
||||
table->next_global= save_next_global;
|
||||
table->next_local= save_next_local;
|
||||
@ -5349,7 +5348,7 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
|
||||
char buf[2048];
|
||||
String query(buf, sizeof(buf), system_charset_info);
|
||||
query.length(0); // Have to zero it since constructor doesn't
|
||||
Open_table_context ot_ctx_unused(thd);
|
||||
Open_table_context ot_ctx_unused(thd, LONG_TIMEOUT);
|
||||
|
||||
/*
|
||||
The condition avoids a crash as described in BUG#48506. Other
|
||||
@ -6558,9 +6557,9 @@ view_err:
|
||||
|
||||
Alter_table_prelocking_strategy alter_prelocking_strategy(alter_info);
|
||||
|
||||
error= open_and_lock_tables_derived(thd, table_list, FALSE,
|
||||
MYSQL_OPEN_TAKE_UPGRADABLE_MDL,
|
||||
&alter_prelocking_strategy);
|
||||
error= open_and_lock_tables(thd, table_list, FALSE,
|
||||
MYSQL_OPEN_TAKE_UPGRADABLE_MDL,
|
||||
&alter_prelocking_strategy);
|
||||
|
||||
if (error)
|
||||
{
|
||||
@ -7148,7 +7147,7 @@ view_err:
|
||||
{
|
||||
if (table->s->tmp_table)
|
||||
{
|
||||
Open_table_context ot_ctx_unused(thd);
|
||||
Open_table_context ot_ctx_unused(thd, LONG_TIMEOUT);
|
||||
TABLE_LIST tbl;
|
||||
bzero((void*) &tbl, sizeof(tbl));
|
||||
tbl.db= new_db;
|
||||
@ -7433,7 +7432,7 @@ view_err:
|
||||
To do this we need to obtain a handler object for it.
|
||||
NO need to tamper with MERGE tables. The real open is done later.
|
||||
*/
|
||||
Open_table_context ot_ctx_unused(thd);
|
||||
Open_table_context ot_ctx_unused(thd, LONG_TIMEOUT);
|
||||
TABLE *t_table;
|
||||
if (new_name != table_name || new_db != db)
|
||||
{
|
||||
|
@ -163,7 +163,7 @@ void udf_init()
|
||||
|
||||
tables.init_one_table(db, sizeof(db)-1, "func", 4, "func", TL_READ);
|
||||
|
||||
if (simple_open_n_lock_tables(new_thd, &tables))
|
||||
if (open_and_lock_tables(new_thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
DBUG_PRINT("error",("Can't open udf table"));
|
||||
sql_print_error("Can't open the mysql.func table. Please "
|
||||
@ -505,7 +505,7 @@ int mysql_create_function(THD *thd,udf_func *udf)
|
||||
|
||||
tables.init_one_table("mysql", 5, "func", 4, "func", TL_WRITE);
|
||||
/* Allow creation of functions even if we can't open func table */
|
||||
if (!(table = open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
if (!(table = open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
goto err;
|
||||
table->use_all_columns();
|
||||
restore_record(table, s->default_values); // Default values for fields
|
||||
@ -596,7 +596,7 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name)
|
||||
|
||||
tables.init_one_table("mysql", 5, "func", 4, "func", TL_WRITE);
|
||||
|
||||
if (!(table = open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
if (!(table = open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT)))
|
||||
goto err;
|
||||
table->use_all_columns();
|
||||
table->field[0]->store(exact_name_str, exact_name_len, &my_charset_bin);
|
||||
|
@ -396,7 +396,7 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
|
||||
view->lock_strategy= TABLE_LIST::EXCLUSIVE_MDL;
|
||||
view->open_type= OT_BASE_ONLY;
|
||||
|
||||
if (open_and_lock_tables(thd, lex->query_tables))
|
||||
if (open_and_lock_tables(thd, lex->query_tables, TRUE, 0))
|
||||
{
|
||||
view= lex->unlink_first_table(&link_to_local);
|
||||
res= TRUE;
|
||||
|
@ -1667,8 +1667,8 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
|
||||
We need to open only mysql.time_zone_leap_second, but we try to
|
||||
open all time zone tables to see if they exist.
|
||||
*/
|
||||
if (open_and_lock_tables_derived(thd, tz_tables, FALSE,
|
||||
MYSQL_LOCK_IGNORE_FLUSH))
|
||||
if (open_and_lock_tables(thd, tz_tables, FALSE,
|
||||
MYSQL_LOCK_IGNORE_FLUSH | MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
sql_print_warning("Can't open and lock time zone table: %s "
|
||||
"trying to live without them", thd->stmt_da->message());
|
||||
|
@ -78,8 +78,8 @@ IF(NOT CMAKE_CROSSCOMPILING)
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_IBGCC_ATOMIC_BUILTINS)
|
||||
ADD_DEFINITIONS(-DHAVE_IBGCCC_ATOMIC_BUILTINS=1)
|
||||
IF(HAVE_IB_GCC_ATOMIC_BUILTINS)
|
||||
ADD_DEFINITIONS(-DHAVE_IB_GCC_ATOMIC_BUILTINS=1)
|
||||
ENDIF()
|
||||
|
||||
# either define HAVE_IB_ATOMIC_PTHREAD_T_GCC or not
|
||||
|
@ -128,7 +128,7 @@ void PFS_engine_table_share::check_one_table(THD *thd)
|
||||
thd->lex= &dummy_lex;
|
||||
lex_start(thd);
|
||||
|
||||
if (! simple_open_n_lock_tables(thd, &tables))
|
||||
if (! open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||
{
|
||||
PFS_check_intact checker;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user