Commit ad436d92 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.5 into 10.6

parents 8c68b549 39378e13
...@@ -302,9 +302,7 @@ ENDIF() ...@@ -302,9 +302,7 @@ ENDIF()
IF(CMAKE_VERSION VERSION_GREATER "3.9.99") IF(CMAKE_VERSION VERSION_GREATER "3.9.99")
SET(CPACK_SOURCE_GENERATOR "RPM") SET(CPACK_SOURCE_GENERATOR "RPM")
SETA(CPACK_RPM_SOURCE_PKG_BUILD_PARAMS SETA(CPACK_RPM_SOURCE_PKG_BUILD_PARAMS "-DRPM=${RPM}")
"-DRPM=${RPM}"
)
MACRO(ADDIF var) MACRO(ADDIF var)
IF(DEFINED ${var}) IF(DEFINED ${var})
......
...@@ -19,19 +19,21 @@ INCLUDE(CMakeParseArguments) ...@@ -19,19 +19,21 @@ INCLUDE(CMakeParseArguments)
# MYSQL_ADD_PLUGIN(plugin_name source1...sourceN # MYSQL_ADD_PLUGIN(plugin_name source1...sourceN
# [STORAGE_ENGINE] # [STORAGE_ENGINE]
# [CLIENT] # [STATIC_ONLY|MODULE_ONLY]
# [MANDATORY|DEFAULT] # [MANDATORY|DEFAULT]
# [STATIC_ONLY|DYNAMIC_ONLY] # [DISABLED]
# [NOT_EMBEDDED|RECOMPILE_FOR_EMBEDDED]
# [CLIENT]
# [MODULE_OUTPUT_NAME module_name] # [MODULE_OUTPUT_NAME module_name]
# [STATIC_OUTPUT_NAME static_name] # [STATIC_OUTPUT_NAME static_name]
# [RECOMPILE_FOR_EMBEDDED] # [COMPONENT component]
# [NOT_EMBEDDED] # [CONFIG cnf_file_name]
# [LINK_LIBRARIES lib1...libN] # [LINK_LIBRARIES lib1...libN]
# [DEPENDENCIES target1...targetN] # [DEPENDENCIES target1...targetN]
MACRO(MYSQL_ADD_PLUGIN) MACRO(MYSQL_ADD_PLUGIN)
CMAKE_PARSE_ARGUMENTS(ARG CMAKE_PARSE_ARGUMENTS(ARG
"STORAGE_ENGINE;STATIC_ONLY;MODULE_ONLY;MANDATORY;DEFAULT;DISABLED;NOT_EMBEDDED;RECOMPILE_FOR_EMBEDDED;CLIENT;EXPORT_SYMBOLS" "STORAGE_ENGINE;STATIC_ONLY;MODULE_ONLY;MANDATORY;DEFAULT;DISABLED;NOT_EMBEDDED;RECOMPILE_FOR_EMBEDDED;CLIENT"
"MODULE_OUTPUT_NAME;STATIC_OUTPUT_NAME;COMPONENT;CONFIG" "MODULE_OUTPUT_NAME;STATIC_OUTPUT_NAME;COMPONENT;CONFIG"
"LINK_LIBRARIES;DEPENDENCIES" "LINK_LIBRARIES;DEPENDENCIES"
${ARGN} ${ARGN}
...@@ -140,9 +142,7 @@ MACRO(MYSQL_ADD_PLUGIN) ...@@ -140,9 +142,7 @@ MACRO(MYSQL_ADD_PLUGIN)
ADD_LIBRARY(${target} STATIC ${SOURCES}) ADD_LIBRARY(${target} STATIC ${SOURCES})
DTRACE_INSTRUMENT(${target}) DTRACE_INSTRUMENT(${target})
ADD_DEPENDENCIES(${target} GenError ${ARG_DEPENDENCIES}) ADD_DEPENDENCIES(${target} GenError ${ARG_DEPENDENCIES})
IF(NOT ARG_EXPORT_SYMBOLS) RESTRICT_SYMBOL_EXPORTS(${target})
RESTRICT_SYMBOL_EXPORTS(${target})
ENDIF()
IF(WITH_EMBEDDED_SERVER AND (NOT ARG_NOT_EMBEDDED)) IF(WITH_EMBEDDED_SERVER AND (NOT ARG_NOT_EMBEDDED))
# Embedded library should contain PIC code and be linkable # Embedded library should contain PIC code and be linkable
# to shared libraries (on systems that need PIC) # to shared libraries (on systems that need PIC)
......
...@@ -55,6 +55,14 @@ innodb_redundant CREATE TABLE `innodb_redundant` ( ...@@ -55,6 +55,14 @@ innodb_redundant CREATE TABLE `innodb_redundant` (
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT `page_compressed`=1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT `page_compressed`=1
drop table innodb_redundant; drop table innodb_redundant;
#
# MDEV-24455 Assertion `!m_freed_space' failed in mtr_t::start
#
CREATE TABLE t1 (a TEXT, b TEXT) ENGINE=InnoDB PAGE_COMPRESSED='ON';
BEGIN;
INSERT INTO t1 VALUES(REPEAT('x',81),REPEAT('x',8034));
ROLLBACK;
DROP TABLE t1;
create procedure innodb_insert_proc (repeat_count int) create procedure innodb_insert_proc (repeat_count int)
begin begin
declare current_num int; declare current_num int;
......
...@@ -30,6 +30,13 @@ alter table innodb_redundant row_format=compact page_compressed=1; ...@@ -30,6 +30,13 @@ alter table innodb_redundant row_format=compact page_compressed=1;
show create table innodb_redundant; show create table innodb_redundant;
drop table innodb_redundant; drop table innodb_redundant;
--echo #
--echo # MDEV-24455 Assertion `!m_freed_space' failed in mtr_t::start
--echo #
CREATE TABLE t1 (a TEXT, b TEXT) ENGINE=InnoDB PAGE_COMPRESSED='ON';
BEGIN; INSERT INTO t1 VALUES(REPEAT('x',81),REPEAT('x',8034)); ROLLBACK;
DROP TABLE t1;
delimiter //; delimiter //;
create procedure innodb_insert_proc (repeat_count int) create procedure innodb_insert_proc (repeat_count int)
begin begin
......
...@@ -24,7 +24,7 @@ PLUGIN_TYPE DATA TYPE ...@@ -24,7 +24,7 @@ PLUGIN_TYPE DATA TYPE
PLUGIN_AUTHOR MariaDB Corporation PLUGIN_AUTHOR MariaDB Corporation
PLUGIN_DESCRIPTION Data type INET6 PLUGIN_DESCRIPTION Data type INET6
PLUGIN_LICENSE GPL PLUGIN_LICENSE GPL
PLUGIN_MATURITY Beta PLUGIN_MATURITY Gamma
PLUGIN_AUTH_VERSION 1.0 PLUGIN_AUTH_VERSION 1.0
# #
# End of 10.5 tests # End of 10.5 tests
......
...@@ -186,7 +186,7 @@ maria_declare_plugin(type_inet) ...@@ -186,7 +186,7 @@ maria_declare_plugin(type_inet)
NULL, // Status variables NULL, // Status variables
NULL, // System variables NULL, // System variables
"1.0", // String version representation "1.0", // String version representation
MariaDB_PLUGIN_MATURITY_BETA // Maturity(see include/mysql/plugin.h)*/ MariaDB_PLUGIN_MATURITY_GAMMA // Maturity(see include/mysql/plugin.h)*/
}, },
{ {
MariaDB_FUNCTION_PLUGIN, // the plugin type (see include/mysql/plugin.h) MariaDB_FUNCTION_PLUGIN, // the plugin type (see include/mysql/plugin.h)
......
...@@ -36,7 +36,14 @@ IF(WITH_WSREP AND NOT EMBEDDED_LIBRARY) ...@@ -36,7 +36,14 @@ IF(WITH_WSREP AND NOT EMBEDDED_LIBRARY)
wsrep_plugin.cc wsrep_plugin.cc
service_wsrep.cc service_wsrep.cc
) )
MYSQL_ADD_PLUGIN(wsrep ${WSREP_SOURCES} MANDATORY NOT_EMBEDDED EXPORT_SYMBOLS LINK_LIBRARIES wsrep-lib wsrep_api_v26) MYSQL_ADD_PLUGIN(wsrep ${WSREP_SOURCES} MANDATORY NOT_EMBEDDED LINK_LIBRARIES wsrep-lib wsrep_api_v26)
IF(VISIBILITY_HIDDEN_FLAG AND TARGET wsrep)
# wsrep_info plugin needs some wsrep symbols from inside mysqld
# we have to remove -fvisibility=hidden from wsrep
GET_TARGET_PROPERTY(f wsrep COMPILE_FLAGS)
STRING(REPLACE "${VISIBILITY_HIDDEN_FLAG}" "" f ${f})
SET_TARGET_PROPERTIES(wsrep PROPERTIES COMPILE_FLAGS "${f}")
ENDIF()
ELSE() ELSE()
ADD_LIBRARY(wsrep STATIC wsrep_dummy.cc) ADD_LIBRARY(wsrep STATIC wsrep_dummy.cc)
ADD_DEPENDENCIES(wsrep GenError) ADD_DEPENDENCIES(wsrep GenError)
......
...@@ -5613,61 +5613,6 @@ void Item_func_like::print(String *str, enum_query_type query_type) ...@@ -5613,61 +5613,6 @@ void Item_func_like::print(String *str, enum_query_type query_type)
} }
static bool fix_escape_item_now(THD *thd, Item *escape_item, String *tmp_str,
bool escape_used_in_parsing, CHARSET_INFO *cmp_cs,
int *escape)
{
String *escape_str= escape_item->val_str(tmp_str);
if (escape_str)
{
const char *escape_str_ptr= escape_str->ptr();
if (escape_used_in_parsing &&
((((thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) &&
escape_str->numchars() != 1) ||
escape_str->numchars() > 1)))
{
my_error(ER_WRONG_ARGUMENTS,MYF(0),"ESCAPE");
return TRUE;
}
if (cmp_cs->use_mb())
{
CHARSET_INFO *cs= escape_str->charset();
my_wc_t wc;
int rc= cs->mb_wc(&wc,
(const uchar*) escape_str_ptr,
(const uchar*) escape_str_ptr +
escape_str->length());
*escape= (int) (rc > 0 ? wc : '\\');
}
else
{
/*
In the case of 8bit character set, we pass native
code instead of Unicode code as "escape" argument.
Convert to "cs" if charset of escape differs.
*/
uint32 unused;
if (escape_str->needs_conversion(escape_str->length(),
escape_str->charset(),cmp_cs,&unused))
{
char ch;
uint errors;
uint32 cnvlen= copy_and_convert(&ch, 1, cmp_cs, escape_str_ptr,
escape_str->length(),
escape_str->charset(), &errors);
*escape= cnvlen ? ch : '\\';
}
else
*escape= escape_str_ptr ? *escape_str_ptr : '\\';
}
}
else
*escape= '\\';
return FALSE;
}
longlong Item_func_like::val_int() longlong Item_func_like::val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
...@@ -5686,17 +5631,6 @@ longlong Item_func_like::val_int() ...@@ -5686,17 +5631,6 @@ longlong Item_func_like::val_int()
null_value=0; null_value=0;
if (canDoTurboBM) if (canDoTurboBM)
return turboBM_matches(res->ptr(), res->length()) ? !negated : negated; return turboBM_matches(res->ptr(), res->length()) ? !negated : negated;
if (unlikely(!escape_item_evaluated))
{
if (fix_escape_item_now(current_thd, escape_item, &cmp_value1,
escape_used_in_parsing,
cmp_collation.collation, &escape))
{
null_value= 1;
return 0;
}
escape_item_evaluated= 1;
}
return cmp_collation.collation->wildcmp( return cmp_collation.collation->wildcmp(
res->ptr(),res->ptr()+res->length(), res->ptr(),res->ptr()+res->length(),
res2->ptr(),res2->ptr()+res2->length(), res2->ptr(),res2->ptr()+res2->length(),
...@@ -5777,13 +5711,58 @@ bool fix_escape_item(THD *thd, Item *escape_item, String *tmp_str, ...@@ -5777,13 +5711,58 @@ bool fix_escape_item(THD *thd, Item *escape_item, String *tmp_str,
if (escape_item->const_item()) if (escape_item->const_item())
{ {
/* If we are on execution stage */ /* If we are on execution stage */
return fix_escape_item_now(thd, escape_item, tmp_str, escape_used_in_parsing, String *escape_str= escape_item->val_str(tmp_str);
cmp_cs, escape); if (escape_str)
{
const char *escape_str_ptr= escape_str->ptr();
if (escape_used_in_parsing && (
(((thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) &&
escape_str->numchars() != 1) ||
escape_str->numchars() > 1)))
{
my_error(ER_WRONG_ARGUMENTS,MYF(0),"ESCAPE");
return TRUE;
}
if (cmp_cs->use_mb())
{
CHARSET_INFO *cs= escape_str->charset();
my_wc_t wc;
int rc= cs->mb_wc(&wc,
(const uchar*) escape_str_ptr,
(const uchar*) escape_str_ptr +
escape_str->length());
*escape= (int) (rc > 0 ? wc : '\\');
}
else
{
/*
In the case of 8bit character set, we pass native
code instead of Unicode code as "escape" argument.
Convert to "cs" if charset of escape differs.
*/
uint32 unused;
if (escape_str->needs_conversion(escape_str->length(),
escape_str->charset(),cmp_cs,&unused))
{
char ch;
uint errors;
uint32 cnvlen= copy_and_convert(&ch, 1, cmp_cs, escape_str_ptr,
escape_str->length(),
escape_str->charset(), &errors);
*escape= cnvlen ? ch : '\\';
}
else
*escape= escape_str_ptr ? *escape_str_ptr : '\\';
}
}
else
*escape= '\\';
} }
return FALSE; return FALSE;
} }
bool Item_func_like::fix_fields(THD *thd, Item **ref) bool Item_func_like::fix_fields(THD *thd, Item **ref)
{ {
DBUG_ASSERT(fixed == 0); DBUG_ASSERT(fixed == 0);
...@@ -5793,10 +5772,8 @@ bool Item_func_like::fix_fields(THD *thd, Item **ref) ...@@ -5793,10 +5772,8 @@ bool Item_func_like::fix_fields(THD *thd, Item **ref)
cmp_collation.collation, &escape)) cmp_collation.collation, &escape))
return TRUE; return TRUE;
escape_item_evaluated= 0;
if (escape_item->const_item()) if (escape_item->const_item())
{ {
escape_item_evaluated= 1;
/* /*
We could also do boyer-more for non-const items, but as we would have to We could also do boyer-more for non-const items, but as we would have to
recompute the tables for each row it's not worth it. recompute the tables for each row it's not worth it.
......
...@@ -2672,24 +2672,14 @@ class Item_func_isnotnull :public Item_func_null_predicate ...@@ -2672,24 +2672,14 @@ class Item_func_isnotnull :public Item_func_null_predicate
class Item_func_like :public Item_bool_func2 class Item_func_like :public Item_bool_func2
{ {
// Turbo Boyer-Moore data
bool canDoTurboBM; // pattern is '%abcd%' case
const char* pattern; const char* pattern;
Item *escape_item; int pattern_len;
DTCollation cmp_collation;
String cmp_value1, cmp_value2;
// Turbo Boyer-Moore data
// TurboBM buffers, *this is owner // TurboBM buffers, *this is owner
int *bmGs; // good suffix shift table, size is pattern_len + 1 int* bmGs; // good suffix shift table, size is pattern_len + 1
int *bmBc; // bad character shift table, size is alphabet_size int* bmBc; // bad character shift table, size is alphabet_size
int pattern_len;
public:
int escape;
bool negated;
private:
bool canDoTurboBM; // pattern is '%abcd%' case
bool escape_item_evaluated;
bool escape_used_in_parsing;
bool use_sampling;
void turboBM_compute_suffixes(int* suff); void turboBM_compute_suffixes(int* suff);
void turboBM_compute_good_suffix_shifts(int* suff); void turboBM_compute_good_suffix_shifts(int* suff);
...@@ -2697,6 +2687,13 @@ class Item_func_like :public Item_bool_func2 ...@@ -2697,6 +2687,13 @@ class Item_func_like :public Item_bool_func2
bool turboBM_matches(const char* text, int text_len) const; bool turboBM_matches(const char* text, int text_len) const;
enum { alphabet_size = 256 }; enum { alphabet_size = 256 };
Item *escape_item;
bool escape_used_in_parsing;
bool use_sampling;
DTCollation cmp_collation;
String cmp_value1, cmp_value2;
bool with_sargable_pattern() const; bool with_sargable_pattern() const;
protected: protected:
SEL_TREE *get_func_mm_tree(RANGE_OPT_PARAM *param, SEL_TREE *get_func_mm_tree(RANGE_OPT_PARAM *param,
...@@ -2709,13 +2706,13 @@ class Item_func_like :public Item_bool_func2 ...@@ -2709,13 +2706,13 @@ class Item_func_like :public Item_bool_func2
KEY_PART *key_part, KEY_PART *key_part,
Item_func::Functype type, Item *value); Item_func::Functype type, Item *value);
public: public:
int escape;
bool negated;
Item_func_like(THD *thd, Item *a, Item *b, Item *escape_arg, bool escape_used): Item_func_like(THD *thd, Item *a, Item *b, Item *escape_arg, bool escape_used):
Item_bool_func2(thd, a, b), pattern(0), escape_item(escape_arg), Item_bool_func2(thd, a, b), canDoTurboBM(FALSE), pattern(0), pattern_len(0),
bmGs(0), bmBc(0), pattern_len(0), negated(0), canDoTurboBM(FALSE), bmGs(0), bmBc(0), escape_item(escape_arg),
escape_item_evaluated(0), escape_used_in_parsing(escape_used), escape_used_in_parsing(escape_used), use_sampling(0), negated(0) {}
use_sampling(0)
{}
bool get_negated() const { return negated; } // Used by ColumnStore bool get_negated() const { return negated; } // Used by ColumnStore
......
...@@ -393,12 +393,12 @@ class binlog_cache_data ...@@ -393,12 +393,12 @@ class binlog_cache_data
In the future, we can refactor this and change it to avoid In the future, we can refactor this and change it to avoid
the set_binlog_info. the set_binlog_info.
*/ */
DBUG_ASSERT(saved_max_binlog_cache_size == 0 && DBUG_ASSERT(saved_max_binlog_cache_size == 0);
param_max_binlog_cache_size != 0 && DBUG_ASSERT(param_max_binlog_cache_size != 0);
ptr_binlog_cache_use == 0 && DBUG_ASSERT(ptr_binlog_cache_use == 0);
param_ptr_binlog_cache_use != 0 && DBUG_ASSERT(param_ptr_binlog_cache_use != 0);
ptr_binlog_cache_disk_use == 0 && DBUG_ASSERT(ptr_binlog_cache_disk_use == 0);
param_ptr_binlog_cache_disk_use != 0); DBUG_ASSERT(param_ptr_binlog_cache_disk_use != 0);
saved_max_binlog_cache_size= param_max_binlog_cache_size; saved_max_binlog_cache_size= param_max_binlog_cache_size;
ptr_binlog_cache_use= param_ptr_binlog_cache_use; ptr_binlog_cache_use= param_ptr_binlog_cache_use;
...@@ -1814,8 +1814,8 @@ binlog_flush_cache(THD *thd, binlog_cache_mngr *cache_mngr, ...@@ -1814,8 +1814,8 @@ binlog_flush_cache(THD *thd, binlog_cache_mngr *cache_mngr,
} }
cache_mngr->reset(using_stmt, using_trx); cache_mngr->reset(using_stmt, using_trx);
DBUG_ASSERT((!using_stmt || cache_mngr->stmt_cache.empty()) && DBUG_ASSERT(!using_stmt || cache_mngr->stmt_cache.empty());
(!using_trx || cache_mngr->trx_cache.empty())); DBUG_ASSERT(!using_trx || cache_mngr->trx_cache.empty());
DBUG_RETURN(error); DBUG_RETURN(error);
} }
...@@ -9273,7 +9273,8 @@ int TC_LOG_MMAP::log_and_order(THD *thd, my_xid xid, bool all, ...@@ -9273,7 +9273,8 @@ int TC_LOG_MMAP::log_and_order(THD *thd, my_xid xid, bool all,
prev= queue; prev= queue;
queue= next; queue= next;
} }
DBUG_ASSERT(prev == &entry && prev->thd == thd); DBUG_ASSERT(prev == &entry);
DBUG_ASSERT(prev->thd == thd);
} }
else else
{ {
...@@ -9367,7 +9368,8 @@ int TC_LOG_MMAP::open(const char *opt_name) ...@@ -9367,7 +9368,8 @@ int TC_LOG_MMAP::open(const char *opt_name)
PAGE *pg; PAGE *pg;
DBUG_ASSERT(total_ha_2pc > 1); DBUG_ASSERT(total_ha_2pc > 1);
DBUG_ASSERT(opt_name && opt_name[0]); DBUG_ASSERT(opt_name);
DBUG_ASSERT(opt_name[0]);
tc_log_page_size= my_getpagesize(); tc_log_page_size= my_getpagesize();
...@@ -9786,7 +9788,8 @@ int TC_LOG_MMAP::delete_entry(ulong cookie) ...@@ -9786,7 +9788,8 @@ int TC_LOG_MMAP::delete_entry(ulong cookie)
PAGE *p=pages+(cookie/tc_log_page_size); PAGE *p=pages+(cookie/tc_log_page_size);
my_xid *x=(my_xid *)(data+cookie); my_xid *x=(my_xid *)(data+cookie);
DBUG_ASSERT(x >= p->start && x < p->end); DBUG_ASSERT(x >= p->start);
DBUG_ASSERT(x < p->end);
mysql_mutex_lock(&p->lock); mysql_mutex_lock(&p->lock);
*x=0; *x=0;
...@@ -9931,7 +9934,8 @@ int TC_LOG_BINLOG::open(const char *opt_name) ...@@ -9931,7 +9934,8 @@ int TC_LOG_BINLOG::open(const char *opt_name)
int error= 1; int error= 1;
DBUG_ASSERT(total_ha_2pc > 1); DBUG_ASSERT(total_ha_2pc > 1);
DBUG_ASSERT(opt_name && opt_name[0]); DBUG_ASSERT(opt_name);
DBUG_ASSERT(opt_name[0]);
if (!my_b_inited(&index_file)) if (!my_b_inited(&index_file))
{ {
......
...@@ -2739,14 +2739,24 @@ void recv_sys_t::apply(bool last_batch) ...@@ -2739,14 +2739,24 @@ void recv_sys_t::apply(bool last_batch)
buf_pool.free_block(free_block); buf_pool.free_block(free_block);
/* Wait until all the pages have been processed */ /* Wait until all the pages have been processed */
while (!pages.empty()) for (;;)
{ {
const bool empty= pages.empty();
if (empty && !buf_pool.n_pend_reads)
break;
if (!is_corrupt_fs() && !is_corrupt_log()) if (!is_corrupt_fs() && !is_corrupt_log())
{ {
if (last_batch) if (last_batch)
{ {
mysql_mutex_assert_not_owner(&log_sys.mutex); mysql_mutex_assert_not_owner(&log_sys.mutex);
mysql_cond_wait(&cond, &mutex); if (!empty)
mysql_cond_wait(&cond, &mutex);
else
{
set_timespec_nsec(abstime, 100000ULL); /* 100ms */
mysql_cond_timedwait(&cond, &mutex, &abstime);
}
} }
else else
{ {
......
...@@ -434,6 +434,7 @@ void mtr_t::commit() ...@@ -434,6 +434,7 @@ void mtr_t::commit()
m_freed_space->clear_freed_ranges(); m_freed_space->clear_freed_ranges();
delete m_freed_pages; delete m_freed_pages;
m_freed_pages= nullptr; m_freed_pages= nullptr;
m_freed_space= nullptr;
/* mtr_t::start() will reset m_trim_pages */ /* mtr_t::start() will reset m_trim_pages */
} }
else else
......
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