Commit 5044dae2 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.0 into 10.1

parents 4b05d60e 78e6fafc
...@@ -283,7 +283,7 @@ ENDIF() ...@@ -283,7 +283,7 @@ ENDIF()
# Set commonly used variables # Set commonly used variables
IF(WIN32) IF(WIN32)
SET(DEFAULT_MYSQL_HOME "C:/MariaDB${MYSQL_BASE_VERSION}") SET(DEFAULT_MYSQL_HOME "C:/Program Files/MariaDB ${MYSQL_BASE_VERSION}")
SET(SHAREDIR share) SET(SHAREDIR share)
ELSE() ELSE()
SET(DEFAULT_MYSQL_HOME ${CMAKE_INSTALL_PREFIX}) SET(DEFAULT_MYSQL_HOME ${CMAKE_INSTALL_PREFIX})
......
...@@ -2086,6 +2086,21 @@ tab1 CREATE TABLE `tab1` ( ...@@ -2086,6 +2086,21 @@ tab1 CREATE TABLE `tab1` (
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE `tab1`; DROP TABLE `tab1`;
# #
# MDEV-11548 Reproducible server crash after the 2nd ALTER TABLE ADD FOREIGN KEY IF NOT EXISTS
#
CREATE TABLE t1 (id INT UNSIGNED NOT NULL PRIMARY KEY);
CREATE TABLE t2 (id1 INT UNSIGNED NOT NULL);
ALTER TABLE t2
ADD FOREIGN KEY IF NOT EXISTS (id1)
REFERENCES t1 (id);
ALTER TABLE t2
ADD FOREIGN KEY IF NOT EXISTS (id1)
REFERENCES t1 (id);
Warnings:
Note 1061 Duplicate key name 'id1'
DROP TABLE t2;
DROP TABLE t1;
#
# Start of 10.1 tests # Start of 10.1 tests
# #
# #
......
...@@ -340,3 +340,26 @@ f1() ...@@ -340,3 +340,26 @@ f1()
DROP FUNCTION f1; DROP FUNCTION f1;
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1,t2; DROP TABLE t1,t2;
#
# Bug #16672723 "CAN'T FIND TEMPORARY TABLE".
#
CREATE FUNCTION f1() RETURNS INT RETURN 1;
CREATE TEMPORARY TABLE tmp1(a INT);
PREPARE stmt1 FROM "CREATE TEMPORARY TABLE tmp2 AS SELECT b FROM (SELECT f1() AS b FROM tmp1) AS t";
# The below statement failed before the fix.
EXECUTE stmt1;
DROP TEMPORARY TABLES tmp1, tmp2;
DEALLOCATE PREPARE stmt1;
DROP FUNCTION f1;
create procedure sp1()
begin
drop table if exists t1, t2;
create temporary table t1 select 1 v;
create table t2 (col varchar(45)) select distinct col from (select sf1() as col from t1) t;
end$$
create function sf1() returns text return 'blah';
call test.sp1();
call test.sp1();
drop procedure sp1;
drop function sf1;
drop table t2;
...@@ -139,3 +139,10 @@ flush tables; ...@@ -139,3 +139,10 @@ flush tables;
create table t1 (a int) engine=archive; create table t1 (a int) engine=archive;
ERROR 42S01: Table 't1' already exists ERROR 42S01: Table 't1' already exists
drop table t1; drop table t1;
CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
SELECT * FROM t1;
pk
DROP TABLE t1;
...@@ -132,3 +132,13 @@ flush tables; ...@@ -132,3 +132,13 @@ flush tables;
create table t1 (a int) engine=archive; create table t1 (a int) engine=archive;
drop table t1; drop table t1;
#
# MDEV-11317: Error in deleting non existing .frm for tables with disocvery
#
CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
DROP TABLE t1;
CREATE OR REPLACE TABLE t1 ( pk INT AUTO_INCREMENT PRIMARY KEY ) ENGINE = ARCHIVE;
SELECT * FROM t1;
DROP TABLE t1;
...@@ -1737,6 +1737,25 @@ SHOW CREATE TABLE `tab1`; ...@@ -1737,6 +1737,25 @@ SHOW CREATE TABLE `tab1`;
ALTER TABLE `tab1` CHANGE COLUMN v_col `v_col` varchar(128) AS (IF(field11='option1',CONCAT_WS(":","field1",field2,field3,field4,field5,field6,field7,field8,field9,field10), CONCAT_WS(":","field1",field11,field2,field3,field4,field5,field6,field7,field8,field9,field10))) PERSISTENT; ALTER TABLE `tab1` CHANGE COLUMN v_col `v_col` varchar(128) AS (IF(field11='option1',CONCAT_WS(":","field1",field2,field3,field4,field5,field6,field7,field8,field9,field10), CONCAT_WS(":","field1",field11,field2,field3,field4,field5,field6,field7,field8,field9,field10))) PERSISTENT;
SHOW CREATE TABLE `tab1`; SHOW CREATE TABLE `tab1`;
DROP TABLE `tab1`; DROP TABLE `tab1`;
--echo #
--echo # MDEV-11548 Reproducible server crash after the 2nd ALTER TABLE ADD FOREIGN KEY IF NOT EXISTS
--echo #
CREATE TABLE t1 (id INT UNSIGNED NOT NULL PRIMARY KEY);
CREATE TABLE t2 (id1 INT UNSIGNED NOT NULL);
ALTER TABLE t2
ADD FOREIGN KEY IF NOT EXISTS (id1)
REFERENCES t1 (id);
ALTER TABLE t2
ADD FOREIGN KEY IF NOT EXISTS (id1)
REFERENCES t1 (id);
DROP TABLE t2;
DROP TABLE t1;
--echo # --echo #
--echo # Start of 10.1 tests --echo # Start of 10.1 tests
--echo # --echo #
......
...@@ -414,3 +414,33 @@ SELECT f1(); ...@@ -414,3 +414,33 @@ SELECT f1();
DROP FUNCTION f1; DROP FUNCTION f1;
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1,t2; DROP TABLE t1,t2;
--echo #
--echo # Bug #16672723 "CAN'T FIND TEMPORARY TABLE".
--echo #
CREATE FUNCTION f1() RETURNS INT RETURN 1;
CREATE TEMPORARY TABLE tmp1(a INT);
PREPARE stmt1 FROM "CREATE TEMPORARY TABLE tmp2 AS SELECT b FROM (SELECT f1() AS b FROM tmp1) AS t";
--echo # The below statement failed before the fix.
EXECUTE stmt1;
DROP TEMPORARY TABLES tmp1, tmp2;
DEALLOCATE PREPARE stmt1;
DROP FUNCTION f1;
#
# MDEV-9084 Calling a stored function from a nested select from temporary table causes unpredictable behavior
#
delimiter $$;
create procedure sp1()
begin
drop table if exists t1, t2;
create temporary table t1 select 1 v;
create table t2 (col varchar(45)) select distinct col from (select sf1() as col from t1) t;
end$$
delimiter ;$$
create function sf1() returns text return 'blah';
call test.sp1();
call test.sp1();
drop procedure sp1;
drop function sf1;
drop table t2;
...@@ -357,6 +357,19 @@ ...@@ -357,6 +357,19 @@
fun:_dl_init fun:_dl_init
} }
# This one is on OpenSuse 10.3 with gcc 5.4
{
memory "loss" from _dl_init 2
Memcheck:Leak
fun:malloc
fun:pool
...
fun:call_init*
fun:_dl_init
}
# #
# dlclose can allocate memory for error message, the memory will be # dlclose can allocate memory for error message, the memory will be
# freed by dlerror or other dl* function. # freed by dlerror or other dl* function.
......
...@@ -90,7 +90,7 @@ static my_bool defaults_already_read= FALSE; ...@@ -90,7 +90,7 @@ static my_bool defaults_already_read= FALSE;
/* Which directories are searched for options (and in which order) */ /* Which directories are searched for options (and in which order) */
#define MAX_DEFAULT_DIRS 6 #define MAX_DEFAULT_DIRS 7
#define DEFAULT_DIRS_SIZE (MAX_DEFAULT_DIRS + 1) /* Terminate with NULL */ #define DEFAULT_DIRS_SIZE (MAX_DEFAULT_DIRS + 1) /* Terminate with NULL */
static const char **default_directories = NULL; static const char **default_directories = NULL;
...@@ -1218,7 +1218,12 @@ static const char **init_default_directories(MEM_ROOT *alloc) ...@@ -1218,7 +1218,12 @@ static const char **init_default_directories(MEM_ROOT *alloc)
errors += add_directory(alloc, "C:/", dirs); errors += add_directory(alloc, "C:/", dirs);
if (my_get_module_parent(fname_buffer, sizeof(fname_buffer)) != NULL) if (my_get_module_parent(fname_buffer, sizeof(fname_buffer)) != NULL)
{
errors += add_directory(alloc, fname_buffer, dirs);
strncat(fname_buffer, "/data", sizeof(fname_buffer));
errors += add_directory(alloc, fname_buffer, dirs); errors += add_directory(alloc, fname_buffer, dirs);
}
} }
#else #else
......
...@@ -415,6 +415,7 @@ IF(WIN32) ...@@ -415,6 +415,7 @@ IF(WIN32)
${CMAKE_CURRENT_BINARY_DIR}/mysql_bootstrap_sql.c ${CMAKE_CURRENT_BINARY_DIR}/mysql_bootstrap_sql.c
COMPONENT Server COMPONENT Server
) )
SET_TARGET_PROPERTIES(mysql_install_db PROPERTIES COMPILE_FLAGS -DINSTALL_PLUGINDIR=${INSTALL_PLUGINDIR})
TARGET_LINK_LIBRARIES(mysql_install_db mysys) TARGET_LINK_LIBRARIES(mysql_install_db mysys)
ADD_LIBRARY(winservice STATIC winservice.c) ADD_LIBRARY(winservice STATIC winservice.c)
......
...@@ -233,6 +233,20 @@ static void get_basedir(char *basedir, int size, const char *mysqld_path) ...@@ -233,6 +233,20 @@ static void get_basedir(char *basedir, int size, const char *mysqld_path)
} }
} }
#define STR(s) _STR(s)
#define _STR(s) #s
static char *get_plugindir()
{
static char plugin_dir[2*MAX_PATH];
get_basedir(plugin_dir, sizeof(plugin_dir), mysqld_path);
strcat(plugin_dir, "/" STR(INSTALL_PLUGINDIR));
if (access(plugin_dir, 0) == 0)
return plugin_dir;
return NULL;
}
/** /**
Allocate and initialize command line for mysqld --bootstrap. Allocate and initialize command line for mysqld --bootstrap.
...@@ -313,6 +327,10 @@ static int create_myini() ...@@ -313,6 +327,10 @@ static int create_myini()
fprintf(myini,"protocol=pipe\n"); fprintf(myini,"protocol=pipe\n");
else if (opt_port) else if (opt_port)
fprintf(myini,"port=%d\n",opt_port); fprintf(myini,"port=%d\n",opt_port);
char *plugin_dir = get_plugindir();
if (plugin_dir)
fprintf(myini, "plugin-dir=%s\n", plugin_dir);
fclose(myini); fclose(myini);
return 0; return 0;
} }
......
...@@ -4796,11 +4796,11 @@ pthread_handler_t handle_slave_sql(void *arg) ...@@ -4796,11 +4796,11 @@ pthread_handler_t handle_slave_sql(void *arg)
{ {
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL, rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL,
"Error initializing relay log position: %s", errmsg); "Error initializing relay log position: %s", errmsg);
goto err; goto err_before_start;
} }
rli->reset_inuse_relaylog(); rli->reset_inuse_relaylog();
if (rli->alloc_inuse_relaylog(rli->group_relay_log_name)) if (rli->alloc_inuse_relaylog(rli->group_relay_log_name))
goto err; goto err_before_start;
strcpy(rli->future_event_master_log_name, rli->group_master_log_name); strcpy(rli->future_event_master_log_name, rli->group_master_log_name);
THD_CHECK_SENTRY(thd); THD_CHECK_SENTRY(thd);
...@@ -4977,6 +4977,7 @@ pthread_handler_t handle_slave_sql(void *arg) ...@@ -4977,6 +4977,7 @@ pthread_handler_t handle_slave_sql(void *arg)
} }
} }
err:
if (mi->using_parallel()) if (mi->using_parallel())
rli->parallel.wait_for_done(thd, rli); rli->parallel.wait_for_done(thd, rli);
...@@ -4994,15 +4995,7 @@ pthread_handler_t handle_slave_sql(void *arg) ...@@ -4994,15 +4995,7 @@ pthread_handler_t handle_slave_sql(void *arg)
rli->group_master_log_pos, tmp.c_ptr_safe()); rli->group_master_log_pos, tmp.c_ptr_safe());
} }
err: err_before_start:
/*
Once again, in case we aborted with an error and skipped the first one.
(We want the first one to be before the printout of stop position to
get the correct position printed.)
*/
if (mi->using_parallel())
rli->parallel.wait_for_done(thd, rli);
/* /*
Some events set some playgrounds, which won't be cleared because thread Some events set some playgrounds, which won't be cleared because thread
......
...@@ -3379,6 +3379,9 @@ void LEX::first_lists_tables_same() ...@@ -3379,6 +3379,9 @@ void LEX::first_lists_tables_same()
if (query_tables_last == &first_table->next_global) if (query_tables_last == &first_table->next_global)
query_tables_last= first_table->prev_global; query_tables_last= first_table->prev_global;
if (query_tables_own_last == &first_table->next_global)
query_tables_own_last= first_table->prev_global;
if ((next= *first_table->prev_global= first_table->next_global)) if ((next= *first_table->prev_global= first_table->next_global))
next->prev_global= first_table->prev_global; next->prev_global= first_table->prev_global;
/* include in new place */ /* include in new place */
......
...@@ -2473,7 +2473,19 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, ...@@ -2473,7 +2473,19 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
int frm_delete_error, trigger_drop_error= 0; int frm_delete_error, trigger_drop_error= 0;
/* Delete the table definition file */ /* Delete the table definition file */
strmov(end,reg_ext); strmov(end,reg_ext);
frm_delete_error= mysql_file_delete(key_file_frm, path, MYF(MY_WME)); if (table_type && table_type != view_pseudo_hton &&
table_type->discover_table)
{
/*
Table type is using discovery and may not need a .frm file.
Delete it silently if it exists
*/
(void) mysql_file_delete(key_file_frm, path, MYF(0));
frm_delete_error= 0;
}
else
frm_delete_error= mysql_file_delete(key_file_frm, path,
MYF(MY_WME));
if (frm_delete_error) if (frm_delete_error)
frm_delete_error= my_errno; frm_delete_error= my_errno;
else else
...@@ -2489,7 +2501,7 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists, ...@@ -2489,7 +2501,7 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
else if (frm_delete_error && if_exists) else if (frm_delete_error && if_exists)
thd->clear_error(); thd->clear_error();
} }
non_tmp_error= error ? TRUE : non_tmp_error; non_tmp_error|= MY_TEST(error);
} }
if (error) if (error)
{ {
...@@ -5932,7 +5944,7 @@ handle_if_exists_options(THD *thd, TABLE *table, Alter_info *alter_info) ...@@ -5932,7 +5944,7 @@ handle_if_exists_options(THD *thd, TABLE *table, Alter_info *alter_info)
while ((f_key= fk_key_it++)) while ((f_key= fk_key_it++))
{ {
if (my_strcasecmp(system_charset_info, f_key->foreign_id->str, if (my_strcasecmp(system_charset_info, f_key->foreign_id->str,
key->name.str) == 0) keyname) == 0)
goto remove_key; goto remove_key;
} }
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
Copyright (c) 2013, 2016, MariaDB Corporation. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -396,12 +396,6 @@ recv_sys_init( ...@@ -396,12 +396,6 @@ recv_sys_init(
} }
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
/* Initialize red-black tree for fast insertions into the
flush_list during recovery process.
As this initialization is done while holding the buffer pool
mutex we perform it before acquiring recv_sys->mutex. */
buf_flush_init_flush_rbt();
mutex_enter(&(recv_sys->mutex)); mutex_enter(&(recv_sys->mutex));
recv_sys->heap = mem_heap_create_typed(256, recv_sys->heap = mem_heap_create_typed(256,
...@@ -3051,6 +3045,11 @@ recv_recovery_from_checkpoint_start_func( ...@@ -3051,6 +3045,11 @@ recv_recovery_from_checkpoint_start_func(
byte* buf; byte* buf;
byte log_hdr_buf[LOG_FILE_HDR_SIZE]; byte log_hdr_buf[LOG_FILE_HDR_SIZE];
dberr_t err; dberr_t err;
/* Initialize red-black tree for fast insertions into the
flush_list during recovery process. */
buf_flush_init_flush_rbt();
ut_when_dtor<recv_dblwr_t> tmp(recv_sys->dblwr); ut_when_dtor<recv_dblwr_t> tmp(recv_sys->dblwr);
#ifdef UNIV_LOG_ARCHIVE #ifdef UNIV_LOG_ARCHIVE
......
...@@ -16,13 +16,26 @@ sub locate_sphinx_binary { ...@@ -16,13 +16,26 @@ sub locate_sphinx_binary {
for (@list) { return $_ if -x $_; } for (@list) { return $_ if -x $_; }
} }
# Look for Sphinx binaries. # Look for Sphinx binaries
my $exe_sphinx_indexer = &locate_sphinx_binary('indexer'); my $exe_sphinx_indexer = &locate_sphinx_binary('indexer');
unless ($exe_sphinx_indexer) {
mtr_report("Sphinx 'indexer' binary not found, sphinx suite will be skipped");
return "No Sphinx";
}
my $exe_sphinx_searchd = &locate_sphinx_binary('searchd'); my $exe_sphinx_searchd = &locate_sphinx_binary('searchd');
return "No Sphinx" unless $exe_sphinx_indexer and $exe_sphinx_searchd; unless ($exe_sphinx_searchd) {
return "No SphinxSE" unless $ENV{HA_SPHINX_SO} or mtr_report("Sphinx 'searchd' binary not found, sphinx suite will be skipped");
$::mysqld_variables{'sphinx'} eq "ON"; return "No Sphinx";
}
# Check for Sphinx engine
unless ($ENV{HA_SPHINX_SO} or $::mysqld_variables{'sphinx'} eq "ON") {
mtr_report("Sphinx engine not found, sphinx suite will be skipped");
return "No SphinxSE";
}
{ {
local $_ = `"$exe_sphinx_searchd" --help`; local $_ = `"$exe_sphinx_searchd" --help`;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment