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

Merge 10.3 into 10.4

parents dc6bc85c e835cc85
...@@ -211,7 +211,7 @@ fi ...@@ -211,7 +211,7 @@ fi
max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max" max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max"
max_no_qc_configs="$SSL_LIBRARY --with-plugins=max --without-query-cache" max_no_qc_configs="$SSL_LIBRARY --with-plugins=max --without-query-cache"
max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent --without-plugin=plugin_file_key_management --with-plugin-rocksdb=dynamic --with-plugin-test_sql_discovery=DYNAMIC --with-plugin-file_key_management=DYNAMIC" max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent --without-plugin=plugin_file_key_management --with-plugin-rocksdb=dynamic --without-plugin-tokudb --with-plugin-test_sql_discovery=DYNAMIC --with-plugin-file_key_management=DYNAMIC"
all_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-innodb_plugin --with-libevent" all_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-innodb_plugin --with-libevent"
# #
......
...@@ -3402,7 +3402,7 @@ static void xb_load_single_table_tablespace(const char *dirname, ...@@ -3402,7 +3402,7 @@ static void xb_load_single_table_tablespace(const char *dirname,
delete file; delete file;
if (err != DB_SUCCESS && xtrabackup_backup && !is_empty_file) { if (err != DB_SUCCESS && xtrabackup_backup && !is_empty_file) {
die("Failed to not validate first page of the file %s, error %d",name, (int)err); die("Failed to validate first page of the file %s, error %d",name, (int)err);
} }
ut_free(name); ut_free(name);
......
...@@ -1149,7 +1149,7 @@ typedef void (*register_socket_v1_t) ...@@ -1149,7 +1149,7 @@ typedef void (*register_socket_v1_t)
@return an instrumented mutex @return an instrumented mutex
*/ */
typedef struct PSI_mutex* (*init_mutex_v1_t) typedef struct PSI_mutex* (*init_mutex_v1_t)
(PSI_mutex_key key, const void *identity); (PSI_mutex_key key, void *identity);
/** /**
Mutex instrumentation destruction API. Mutex instrumentation destruction API.
...@@ -1164,7 +1164,7 @@ typedef void (*destroy_mutex_v1_t)(struct PSI_mutex *mutex); ...@@ -1164,7 +1164,7 @@ typedef void (*destroy_mutex_v1_t)(struct PSI_mutex *mutex);
@return an instrumented rwlock @return an instrumented rwlock
*/ */
typedef struct PSI_rwlock* (*init_rwlock_v1_t) typedef struct PSI_rwlock* (*init_rwlock_v1_t)
(PSI_rwlock_key key, const void *identity); (PSI_rwlock_key key, void *identity);
/** /**
Rwlock instrumentation destruction API. Rwlock instrumentation destruction API.
...@@ -1179,7 +1179,7 @@ typedef void (*destroy_rwlock_v1_t)(struct PSI_rwlock *rwlock); ...@@ -1179,7 +1179,7 @@ typedef void (*destroy_rwlock_v1_t)(struct PSI_rwlock *rwlock);
@return an instrumented cond @return an instrumented cond
*/ */
typedef struct PSI_cond* (*init_cond_v1_t) typedef struct PSI_cond* (*init_cond_v1_t)
(PSI_cond_key key, const void *identity); (PSI_cond_key key, void *identity);
/** /**
Cond instrumentation destruction API. Cond instrumentation destruction API.
......
...@@ -300,13 +300,13 @@ typedef void (*register_statement_v1_t) ...@@ -300,13 +300,13 @@ typedef void (*register_statement_v1_t)
typedef void (*register_socket_v1_t) typedef void (*register_socket_v1_t)
(const char *category, struct PSI_socket_info_v1 *info, int count); (const char *category, struct PSI_socket_info_v1 *info, int count);
typedef struct PSI_mutex* (*init_mutex_v1_t) typedef struct PSI_mutex* (*init_mutex_v1_t)
(PSI_mutex_key key, const void *identity); (PSI_mutex_key key, void *identity);
typedef void (*destroy_mutex_v1_t)(struct PSI_mutex *mutex); typedef void (*destroy_mutex_v1_t)(struct PSI_mutex *mutex);
typedef struct PSI_rwlock* (*init_rwlock_v1_t) typedef struct PSI_rwlock* (*init_rwlock_v1_t)
(PSI_rwlock_key key, const void *identity); (PSI_rwlock_key key, void *identity);
typedef void (*destroy_rwlock_v1_t)(struct PSI_rwlock *rwlock); typedef void (*destroy_rwlock_v1_t)(struct PSI_rwlock *rwlock);
typedef struct PSI_cond* (*init_cond_v1_t) typedef struct PSI_cond* (*init_cond_v1_t)
(PSI_cond_key key, const void *identity); (PSI_cond_key key, void *identity);
typedef void (*destroy_cond_v1_t)(struct PSI_cond *cond); typedef void (*destroy_cond_v1_t)(struct PSI_cond *cond);
typedef struct PSI_socket* (*init_socket_v1_t) typedef struct PSI_socket* (*init_socket_v1_t)
(PSI_socket_key key, const my_socket *fd, (PSI_socket_key key, const my_socket *fd,
......
Subproject commit 0cc16f18c1d87bbe6e360eaf578fcedeb9479114 Subproject commit 42cb1e442c43902e2866bea38d15f2ed1f5d38b3
...@@ -140,24 +140,16 @@ sub diff { ...@@ -140,24 +140,16 @@ sub diff {
} }
sub is_set { sub is_subset {
my ($opts, $set_opts)= @_; my ($set, $subset)= @_;
my %cache = map { _split_option($_) } @$set;
foreach my $opt (@$opts){ for (@$subset){
my ($name, $value)= _split_option($_);
my ($opt_name1, $value1)= _split_option($opt); return 0 unless exists $cache{$name} and $cache{$name} eq $value;
foreach my $set_opt (@$set_opts){
my ($opt_name2, $value2)= _split_option($set_opt);
if ($opt_name1 eq $opt_name2 and $value1 eq $value2){
# Option already set
return 1;
}
}
} }
return 0; return 1;
} }
......
...@@ -626,8 +626,10 @@ sub make_combinations($$@) ...@@ -626,8 +626,10 @@ sub make_combinations($$@)
{ {
# Skip all other combinations if the values they change # Skip all other combinations if the values they change
# are already fixed in master_opt or slave_opt # are already fixed in master_opt or slave_opt
if (My::Options::is_set($test->{master_opt}, $comb->{comb_opt}) && # (empty combinations are not considered a subset of anything)
My::Options::is_set($test->{slave_opt}, $comb->{comb_opt}) ){ if (@{$comb->{comb_opt}} &&
My::Options::is_subset($test->{master_opt}, $comb->{comb_opt}) &&
My::Options::is_subset($test->{slave_opt}, $comb->{comb_opt}) ){
$test_combs->{$comb->{name}} = 2; $test_combs->{$comb->{name}} = 2;
......
...@@ -29,12 +29,5 @@ CREATE TABLE t1 (i INT) ENGINE=Aria; ...@@ -29,12 +29,5 @@ CREATE TABLE t1 (i INT) ENGINE=Aria;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
SET max_session_mem_used=50000; SET max_session_mem_used=50000;
REPAIR LOCAL TABLE t1 USE_FRM; REPAIR LOCAL TABLE t1 USE_FRM;
Table Op Msg_type Msg_text
t1 repair error Failed to open partially repaired table
Warnings:
Error 1290 The MariaDB server is running with the --max-thread-mem-used=50000 option so it cannot execute this statement
REPAIR LOCAL TABLE t1; REPAIR LOCAL TABLE t1;
Table Op Msg_type Msg_text
test.t1 repair Error The MariaDB server is running with the --max-thread-mem-used=50000 option so it cannot execute this statement
test.t1 repair error Corrupt
DROP TABLE t1; DROP TABLE t1;
...@@ -36,6 +36,8 @@ DROP TABLE t1; ...@@ -36,6 +36,8 @@ DROP TABLE t1;
CREATE TABLE t1 (i INT) ENGINE=Aria; CREATE TABLE t1 (i INT) ENGINE=Aria;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
SET max_session_mem_used=50000; SET max_session_mem_used=50000;
--disable_result_log
REPAIR LOCAL TABLE t1 USE_FRM; REPAIR LOCAL TABLE t1 USE_FRM;
REPAIR LOCAL TABLE t1; REPAIR LOCAL TABLE t1;
--enable_result_log
DROP TABLE t1; DROP TABLE t1;
...@@ -185,3 +185,13 @@ ALTER TABLE t1 add column d int default next value for s_not_exits; ...@@ -185,3 +185,13 @@ ALTER TABLE t1 add column d int default next value for s_not_exits;
ERROR 42S02: Table 'test.s_not_exits' doesn't exist ERROR 42S02: Table 'test.s_not_exits' doesn't exist
drop table t1; drop table t1;
drop sequence s1; drop sequence s1;
#
# MDEV 22785 Crash with prepared statements and NEXTVAL()
#
CREATE SEQUENCE s;
CREATE TABLE t1 (id int NOT NULL DEFAULT NEXTVAL(s), PRIMARY KEY (id));
PREPARE stmt FROM " INSERT INTO t1 () values ()";
INSERT INTO t1 () values ();
EXECUTE stmt;
DROP TABLE t1;
DROP SEQUENCE s;
...@@ -123,3 +123,15 @@ ALTER TABLE t1 add column c int; ...@@ -123,3 +123,15 @@ ALTER TABLE t1 add column c int;
ALTER TABLE t1 add column d int default next value for s_not_exits; ALTER TABLE t1 add column d int default next value for s_not_exits;
drop table t1; drop table t1;
drop sequence s1; drop sequence s1;
--echo #
--echo # MDEV 22785 Crash with prepared statements and NEXTVAL()
--echo #
CREATE SEQUENCE s;
CREATE TABLE t1 (id int NOT NULL DEFAULT NEXTVAL(s), PRIMARY KEY (id));
PREPARE stmt FROM " INSERT INTO t1 () values ()";
INSERT INTO t1 () values ();
EXECUTE stmt;
# Cleanup
DROP TABLE t1;
DROP SEQUENCE s;
...@@ -86,7 +86,7 @@ static void register_socket_noop(const char *category NNN, ...@@ -86,7 +86,7 @@ static void register_socket_noop(const char *category NNN,
} }
static PSI_mutex* static PSI_mutex*
init_mutex_noop(PSI_mutex_key key NNN, const void *identity NNN) init_mutex_noop(PSI_mutex_key key NNN, void *identity NNN)
{ {
return NULL; return NULL;
} }
...@@ -97,7 +97,7 @@ static void destroy_mutex_noop(PSI_mutex* mutex NNN) ...@@ -97,7 +97,7 @@ static void destroy_mutex_noop(PSI_mutex* mutex NNN)
} }
static PSI_rwlock* static PSI_rwlock*
init_rwlock_noop(PSI_rwlock_key key NNN, const void *identity NNN) init_rwlock_noop(PSI_rwlock_key key NNN, void *identity NNN)
{ {
return NULL; return NULL;
} }
...@@ -108,7 +108,7 @@ static void destroy_rwlock_noop(PSI_rwlock* rwlock NNN) ...@@ -108,7 +108,7 @@ static void destroy_rwlock_noop(PSI_rwlock* rwlock NNN)
} }
static PSI_cond* static PSI_cond*
init_cond_noop(PSI_cond_key key NNN, const void *identity NNN) init_cond_noop(PSI_cond_key key NNN, void *identity NNN)
{ {
return NULL; return NULL;
} }
......
...@@ -52,6 +52,7 @@ use strict; ...@@ -52,6 +52,7 @@ use strict;
use vars qw($dbh $sth $hostname $opt_user $opt_password $opt_help $opt_host use vars qw($dbh $sth $hostname $opt_user $opt_password $opt_help $opt_host
$opt_socket $opt_port $host $version); $opt_socket $opt_port $host $version);
my $sqlport = "";
my $sqlhost = ""; my $sqlhost = "";
my $user = ""; my $user = "";
...@@ -84,9 +85,13 @@ if ($opt_password eq '') ...@@ -84,9 +85,13 @@ if ($opt_password eq '')
print "\n"; print "\n";
} }
# Using port argument with 'localhost' will cause an error
if ($sqlhost ne "localhost") {
$sqlport = ":port=$opt_port";
}
# make the connection to MariaDB # make the connection to MariaDB
$dbh= DBI->connect("DBI:mysql:mysql:host=$sqlhost:port=$opt_port:mysql_socket=$opt_socket",$opt_user,$opt_password, {PrintError => 0}) || $dbh= DBI->connect("DBI:mysql:mysql:host=$sqlhost$sqlport:mysql_socket=$opt_socket",$opt_user,$opt_password, {PrintError => 0}) ||
die("Can't make a connection to the mysql server.\n The error: $DBI::errstr"); die("Can't make a connection to the mysql server.\n The error: $DBI::errstr");
# the start of the program # the start of the program
...@@ -278,7 +283,6 @@ sub addall { ...@@ -278,7 +283,6 @@ sub addall {
$sth = $dbh->do("REVOKE ALL ON $db.* FROM \'$user\'\@\'$host\'") || die $dbh->errstr; $sth = $dbh->do("REVOKE ALL ON $db.* FROM \'$user\'\@\'$host\'") || die $dbh->errstr;
} }
} }
$dbh->do("FLUSH PRIVILEGES") || print STDERR "Can't flush privileges\n";
print "Everything is inserted and mysql privileges have been reloaded.\n\n"; print "Everything is inserted and mysql privileges have been reloaded.\n\n";
} }
......
...@@ -4638,13 +4638,13 @@ bool table_already_fk_prelocked(TABLE_LIST *tl, LEX_CSTRING *db, ...@@ -4638,13 +4638,13 @@ bool table_already_fk_prelocked(TABLE_LIST *tl, LEX_CSTRING *db,
} }
static bool internal_table_exists(TABLE_LIST *global_list, static TABLE_LIST *internal_table_exists(TABLE_LIST *global_list,
const char *table_name) const char *table_name)
{ {
do do
{ {
if (global_list->table_name.str == table_name) if (global_list->table_name.str == table_name)
return 1; return global_list;
} while ((global_list= global_list->next_global)); } while ((global_list= global_list->next_global));
return 0; return 0;
} }
...@@ -4659,13 +4659,23 @@ add_internal_tables(THD *thd, Query_tables_list *prelocking_ctx, ...@@ -4659,13 +4659,23 @@ add_internal_tables(THD *thd, Query_tables_list *prelocking_ctx,
do do
{ {
TABLE_LIST *tmp __attribute__((unused));
DBUG_PRINT("info", ("table name: %s", tables->table_name.str)); DBUG_PRINT("info", ("table name: %s", tables->table_name.str));
/* /*
Skip table if already in the list. Can happen with prepared statements Skip table if already in the list. Can happen with prepared statements
*/ */
if (tables->next_local && if ((tmp= internal_table_exists(global_table_list,
internal_table_exists(global_table_list, tables->table_name.str)) tables->table_name.str)))
{
/*
Use the original value for the next local, used by the
original prepared statement. We cannot trust the original
next_local value as it may have been changed by a previous
statement using the same table.
*/
tables->next_local= tmp;
continue; continue;
}
TABLE_LIST *tl= (TABLE_LIST *) thd->alloc(sizeof(TABLE_LIST)); TABLE_LIST *tl= (TABLE_LIST *) thd->alloc(sizeof(TABLE_LIST));
if (!tl) if (!tl)
......
...@@ -4249,12 +4249,9 @@ class THD: public THD_count, /* this must be first */ ...@@ -4249,12 +4249,9 @@ class THD: public THD_count, /* this must be first */
for any CTE references. for any CTE references.
*/ */
if (!lex->with_cte_resolution) if (!lex->with_cte_resolution)
{
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
return TRUE; return TRUE;
} }
return FALSE;
}
to->str= strmake(db.str, db.length); to->str= strmake(db.str, db.length);
to->length= db.length; to->length= db.length;
......
...@@ -1496,7 +1496,7 @@ static void register_socket_v1(const char *category, ...@@ -1496,7 +1496,7 @@ static void register_socket_v1(const char *category,
@sa PSI_v1::init_mutex. @sa PSI_v1::init_mutex.
*/ */
static PSI_mutex* static PSI_mutex*
init_mutex_v1(PSI_mutex_key key, const void *identity) init_mutex_v1(PSI_mutex_key key, void *identity)
{ {
INIT_BODY_V1(mutex, key, identity); INIT_BODY_V1(mutex, key, identity);
} }
...@@ -1519,7 +1519,7 @@ static void destroy_mutex_v1(PSI_mutex* mutex) ...@@ -1519,7 +1519,7 @@ static void destroy_mutex_v1(PSI_mutex* mutex)
@sa PSI_v1::init_rwlock. @sa PSI_v1::init_rwlock.
*/ */
static PSI_rwlock* static PSI_rwlock*
init_rwlock_v1(PSI_rwlock_key key, const void *identity) init_rwlock_v1(PSI_rwlock_key key, void *identity)
{ {
INIT_BODY_V1(rwlock, key, identity); INIT_BODY_V1(rwlock, key, identity);
} }
...@@ -1542,7 +1542,7 @@ static void destroy_rwlock_v1(PSI_rwlock* rwlock) ...@@ -1542,7 +1542,7 @@ static void destroy_rwlock_v1(PSI_rwlock* rwlock)
@sa PSI_v1::init_cond. @sa PSI_v1::init_cond.
*/ */
static PSI_cond* static PSI_cond*
init_cond_v1(PSI_cond_key key, const void *identity) init_cond_v1(PSI_cond_key key, void *identity)
{ {
INIT_BODY_V1(cond, key, identity); INIT_BODY_V1(cond, key, identity);
} }
......
...@@ -44,6 +44,15 @@ IF (WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 4) ...@@ -44,6 +44,15 @@ IF (WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 4)
SKIP_ROCKSDB_PLUGIN("32-Bit Windows are temporarily disabled") SKIP_ROCKSDB_PLUGIN("32-Bit Windows are temporarily disabled")
ENDIF() ENDIF()
#
# Also, disable on ARM64 when not Linux
# Requires submodule update to v6.16.3
# containing commit https://github.com/facebook/rocksdb/commit/ee4bd4780b321ddb5f92a0f4eb956f2a2ebd60dc
#
IF(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm64|aarch64)" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
SKIP_ROCKSDB_PLUGIN("ARM64 disabled on all except Linux")
ENDIF()
# This plugin needs recent C++ compilers (it is using C++11 features) # This plugin needs recent C++ compilers (it is using C++11 features)
# Skip build for the old compilers # Skip build for the old compilers
SET(CXX11_FLAGS) SET(CXX11_FLAGS)
......
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