mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
Merge 10.4 into 10.5
This commit is contained in:
commit
b30a013142
53 changed files with 836 additions and 754 deletions
|
@ -148,7 +148,7 @@ static struct my_option my_long_options[]=
|
||||||
&opt_systables_only, &opt_systables_only, 0,
|
&opt_systables_only, &opt_systables_only, 0,
|
||||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#define USER_OPT (array_elements(my_long_options) - 6)
|
#define USER_OPT (array_elements(my_long_options) - 6)
|
||||||
{"user", 'u', "User for login if not current user.", &opt_user,
|
{"user", 'u', "User for login.", &opt_user,
|
||||||
&opt_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
&opt_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"verbose", 'v', "Display more output about the process; Using it twice will print connection argument; Using it 3 times will print out all CHECK, RENAME and ALTER TABLE during the check phase.",
|
{"verbose", 'v', "Display more output about the process; Using it twice will print connection argument; Using it 3 times will print out all CHECK, RENAME and ALTER TABLE during the check phase.",
|
||||||
&opt_not_used, &opt_not_used, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
&opt_not_used, &opt_not_used, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||||
|
|
|
@ -466,17 +466,21 @@ sub mtr_report_stats ($$$$) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$test_time = sprintf("%.3f", $test->{timer} / 1000);
|
$test_time = sprintf("%.3f", $test->{timer} / 1000);
|
||||||
|
$test->{'name'} =~ s/$current_suite\.//;
|
||||||
$xml_report .= qq(\t\t<testcase assertions="" classname="$current_suite" name="$test->{'name'}" status="$test->{'result'}" time="$test_time");
|
$xml_report .= qq(\t\t<testcase assertions="" classname="$current_suite" name="$test->{'name'}" status="$test->{'result'}" time="$test_time");
|
||||||
|
|
||||||
my $comment = $test->{'comment'};
|
my $comment = $test->{'comment'};
|
||||||
$comment =~ s/[\"]//g;
|
$comment =~ s/[\"]//g;
|
||||||
|
|
||||||
if ($test->{'result'} eq "MTR_RES_FAILED") {
|
# if a test case has to be retried it should have the result MTR_RES_FAILED in jUnit XML
|
||||||
$xml_report .= qq(>\n\t\t\t<failure message="" type="$test->{'result'}">\n<![CDATA[$test->{'logfile'}]]>\n\t\t\t</failure>\n\t\t</testcase>\n);
|
if ($test->{'result'} eq "MTR_RES_FAILED" || $test->{'retries'}) {
|
||||||
|
my $logcontents = $test->{'logfile-failed'} || $test->{'logfile'};
|
||||||
|
|
||||||
|
$xml_report .= qq(>\n\t\t\t<failure message="" type="MTR_RES_FAILED">\n<![CDATA[$logcontents]]>\n\t\t\t</failure>\n\t\t</testcase>\n);
|
||||||
} elsif ($test->{'result'} eq "MTR_RES_SKIPPED" && $test->{'disable'}) {
|
} elsif ($test->{'result'} eq "MTR_RES_SKIPPED" && $test->{'disable'}) {
|
||||||
$xml_report .= qq(>\n\t\t\t<disabled message="$comment" type="$test->{'result'}"/>\n\t\t</testcase>\n);
|
$xml_report .= qq(>\n\t\t\t<disabled message="$comment" type="MTR_RES_SKIPPED"/>\n\t\t</testcase>\n);
|
||||||
} elsif ($test->{'result'} eq "MTR_RES_SKIPPED") {
|
} elsif ($test->{'result'} eq "MTR_RES_SKIPPED") {
|
||||||
$xml_report .= qq(>\n\t\t\t<skipped message="$comment" type="$test->{'result'}"/>\n\t\t</testcase>\n);
|
$xml_report .= qq(>\n\t\t\t<skipped message="$comment" type="MTR_RES_SKIPPED"/>\n\t\t</testcase>\n);
|
||||||
} else {
|
} else {
|
||||||
$xml_report .= " />\n";
|
$xml_report .= " />\n";
|
||||||
}
|
}
|
||||||
|
|
12
mysql-test/lib/openssl.cnf
Normal file
12
mysql-test/lib/openssl.cnf
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# Toplevel section for openssl (including libssl)
|
||||||
|
openssl_conf = default_conf_section
|
||||||
|
|
||||||
|
[default_conf_section]
|
||||||
|
# We only specify configuration for the "ssl module"
|
||||||
|
ssl_conf = ssl_section
|
||||||
|
|
||||||
|
[ssl_section]
|
||||||
|
system_default = system_default_section
|
||||||
|
|
||||||
|
[system_default_section]
|
||||||
|
CipherString = ALL:@SECLEVEL=1
|
|
@ -15073,6 +15073,7 @@ EXPLAIN
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
|
"lateral": 1,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
"outer_ref_condition": "t1.a is not null",
|
"outer_ref_condition": "t1.a is not null",
|
||||||
|
@ -15179,6 +15180,7 @@ EXPLAIN
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
|
"lateral": 1,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
"outer_ref_condition": "t1.a is not null",
|
"outer_ref_condition": "t1.a is not null",
|
||||||
|
@ -15378,6 +15380,7 @@ EXPLAIN
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
|
"lateral": 1,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
"outer_ref_condition": "t3.a is not null and t3.c is not null",
|
"outer_ref_condition": "t3.a is not null and t3.c is not null",
|
||||||
|
@ -15530,6 +15533,7 @@ EXPLAIN
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
|
"lateral": 1,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
"outer_ref_condition": "t3.a is not null and t3.c is not null",
|
"outer_ref_condition": "t3.a is not null and t3.c is not null",
|
||||||
|
@ -15705,6 +15709,7 @@ EXPLAIN
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
|
"lateral": 1,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
"outer_ref_condition": "t3.c is not null",
|
"outer_ref_condition": "t3.c is not null",
|
||||||
|
@ -15952,6 +15957,7 @@ EXPLAIN
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
|
"lateral": 1,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
"outer_ref_condition": "t3.c is not null",
|
"outer_ref_condition": "t3.c is not null",
|
||||||
|
@ -16440,6 +16446,7 @@ EXPLAIN
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"first_match": "t4",
|
"first_match": "t4",
|
||||||
"materialized": {
|
"materialized": {
|
||||||
|
"lateral": 1,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 3,
|
"select_id": 3,
|
||||||
"const_condition": "1",
|
"const_condition": "1",
|
||||||
|
@ -16586,6 +16593,7 @@ EXPLAIN
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
|
"lateral": 1,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
"table": {
|
"table": {
|
||||||
|
|
|
@ -109,7 +109,7 @@ End of 5.0 tests
|
||||||
# Start of 10.0 tests
|
# Start of 10.0 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# MDEV-6950 Bad results with joins compating DATE and INT/ENUM/VARCHAR columns
|
# MDEV-6950 Bad results with joins comparing DATE and INT/ENUM/VARCHAR columns
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (c1 DATE PRIMARY KEY);
|
CREATE TABLE t1 (c1 DATE PRIMARY KEY);
|
||||||
INSERT INTO t1 VALUES ('2001-01-01');
|
INSERT INTO t1 VALUES ('2001-01-01');
|
||||||
|
|
|
@ -102,7 +102,7 @@ DROP TABLE t1;
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-6950 Bad results with joins compating DATE and INT/ENUM/VARCHAR columns
|
--echo # MDEV-6950 Bad results with joins comparing DATE and INT/ENUM/VARCHAR columns
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
CREATE TABLE t1 (c1 DATE PRIMARY KEY);
|
CREATE TABLE t1 (c1 DATE PRIMARY KEY);
|
||||||
|
|
|
@ -390,7 +390,7 @@ my $set_titlebar;
|
||||||
};
|
};
|
||||||
eval 'sub HAVE_WIN32_CONSOLE { $have_win32_console }';
|
eval 'sub HAVE_WIN32_CONSOLE { $have_win32_console }';
|
||||||
} else {
|
} else {
|
||||||
sub HAVE_WIN32_CONSOLE { 0 };
|
eval 'sub HAVE_WIN32_CONSOLE { 0 }';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,7 +398,7 @@ if (-t STDOUT) {
|
||||||
if (IS_WINDOWS and HAVE_WIN32_CONSOLE) {
|
if (IS_WINDOWS and HAVE_WIN32_CONSOLE) {
|
||||||
$set_titlebar = sub {Win32::Console::Title $_[0];};
|
$set_titlebar = sub {Win32::Console::Title $_[0];};
|
||||||
} elsif (defined $ENV{TERM} and $ENV{TERM} =~ /xterm/) {
|
} elsif (defined $ENV{TERM} and $ENV{TERM} =~ /xterm/) {
|
||||||
$set_titlebar = sub { print "\e];$_[0]\a"; };
|
$set_titlebar = sub { syswrite STDOUT, "\e];$_[0]\a"; };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,6 +784,7 @@ sub run_test_server ($$$) {
|
||||||
if ( $result->is_failed() ) {
|
if ( $result->is_failed() ) {
|
||||||
my $worker_logdir= $result->{savedir};
|
my $worker_logdir= $result->{savedir};
|
||||||
my $log_file_name=dirname($worker_logdir)."/".$result->{shortname}.".log";
|
my $log_file_name=dirname($worker_logdir)."/".$result->{shortname}.".log";
|
||||||
|
$result->{'logfile-failed'} = mtr_lastlinesfromfile($log_file_name, 20);
|
||||||
rename $log_file_name,$log_file_name.".failed";
|
rename $log_file_name,$log_file_name.".failed";
|
||||||
}
|
}
|
||||||
delete($result->{result});
|
delete($result->{result});
|
||||||
|
@ -2306,7 +2307,8 @@ sub environment_setup {
|
||||||
$ENV{'LC_CTYPE'}= "C";
|
$ENV{'LC_CTYPE'}= "C";
|
||||||
$ENV{'LC_COLLATE'}= "C";
|
$ENV{'LC_COLLATE'}= "C";
|
||||||
|
|
||||||
$ENV{'OPENSSL_CONF'}= "/dev/null";
|
$ENV{'OPENSSL_CONF'}= $mysqld_variables{'version-ssl-library'} gt 'OpenSSL 1.1.1'
|
||||||
|
? "$glob_mysql_test_dir/lib/openssl.cnf" : '/dev/null';
|
||||||
|
|
||||||
$ENV{'USE_RUNNING_SERVER'}= using_extern();
|
$ENV{'USE_RUNNING_SERVER'}= using_extern();
|
||||||
$ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
|
$ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
|
||||||
|
|
|
@ -38,7 +38,6 @@ galera_shutdown_nonprim : MDEV-21493 galera.galera_shutdown_nonprim
|
||||||
galera_split_brain : MDEV-18280 Galera test failure on galera_split_brain and galera_kill_nochanges
|
galera_split_brain : MDEV-18280 Galera test failure on galera_split_brain and galera_kill_nochanges
|
||||||
galera_ssl_upgrade : MDEV-19950 Galera test failure on galera_ssl_upgrade
|
galera_ssl_upgrade : MDEV-19950 Galera test failure on galera_ssl_upgrade
|
||||||
galera_sst_mariabackup_encrypt_with_key : MDEV-21484 galera_sst_mariabackup_encrypt_with_key
|
galera_sst_mariabackup_encrypt_with_key : MDEV-21484 galera_sst_mariabackup_encrypt_with_key
|
||||||
galera_sst_mariabackup_table_options: MDEV-19741 Galera test failure on galera.galera_sst_mariabackup_table_options
|
|
||||||
galera_toi_ddl_nonconflicting : MDEV-21518 galera.galera_toi_ddl_nonconflicting
|
galera_toi_ddl_nonconflicting : MDEV-21518 galera.galera_toi_ddl_nonconflicting
|
||||||
galera_var_innodb_disallow_writes : MDEV-20928 galera.galera_var_innodb_disallow_writes
|
galera_var_innodb_disallow_writes : MDEV-20928 galera.galera_var_innodb_disallow_writes
|
||||||
galera_var_node_address : MDEV-20485 Galera test failure
|
galera_var_node_address : MDEV-20485 Galera test failure
|
||||||
|
@ -46,7 +45,6 @@ galera_var_notify_cmd : MDEV-21905 Galera test galera_var_notify_cmd causes hang
|
||||||
galera_var_reject_queries : assertion in inline_mysql_socket_send
|
galera_var_reject_queries : assertion in inline_mysql_socket_send
|
||||||
galera_var_retry_autocommit: MDEV-18181 Galera test failure on galera.galera_var_retry_autocommit
|
galera_var_retry_autocommit: MDEV-18181 Galera test failure on galera.galera_var_retry_autocommit
|
||||||
galera_wan : MDEV-17259 Test failure on galera.galera_wan
|
galera_wan : MDEV-17259 Test failure on galera.galera_wan
|
||||||
galera_wsrep_new_cluster : MDEV-21515 galera.galera_wsrep_new_cluster
|
|
||||||
mysql-wsrep#198 : MDEV-18935 Galera test mysql-wsrep#198 sporaric assertion transaction.cpp:362: int wsrep::transaction::before_commit(): Assertion `state() == s_executing || state() == s_committing || state() == s_must_abort || state() == s_replaying' failed.
|
mysql-wsrep#198 : MDEV-18935 Galera test mysql-wsrep#198 sporaric assertion transaction.cpp:362: int wsrep::transaction::before_commit(): Assertion `state() == s_executing || state() == s_committing || state() == s_must_abort || state() == s_replaying' failed.
|
||||||
lp1376747-4 : MDEV-21911 Galera test failure on lp1376747-4
|
lp1376747-4 : MDEV-21911 Galera test failure on lp1376747-4
|
||||||
partition : MDEV-19958 Galera test failure on galera.partition
|
partition : MDEV-19958 Galera test failure on galera.partition
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
connection node_2;
|
|
||||||
connection node_1;
|
|
||||||
CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 CHAR(20) DEFAULT 'abc') ENGINE=InnoDB;
|
|
||||||
INSERT INTO t1 (f1) VALUES (1);
|
|
||||||
CREATE TABLE t2 (f1 CHAR(20)) ENGINE=InnoDB;
|
|
||||||
CREATE PROCEDURE proc_update ()
|
|
||||||
BEGIN
|
|
||||||
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
|
|
||||||
SET SESSION wsrep_sync_wait = 0;
|
|
||||||
WHILE 1 DO
|
|
||||||
UPDATE t1 SET f2 = LEFT(MD5(RAND()), 4);
|
|
||||||
END WHILE;
|
|
||||||
END|
|
|
||||||
connect node_1X, 127.0.0.1, root, , test, $NODE_MYPORT_1;
|
|
||||||
connection node_1X;
|
|
||||||
CALL proc_update();;
|
|
||||||
connection node_2;
|
|
||||||
SET SESSION wsrep_retry_autocommit = 10000;
|
|
||||||
connection node_1;
|
|
||||||
connection node_1X;
|
|
||||||
Got one of the listed errors
|
|
||||||
connection node_1;
|
|
||||||
DROP PROCEDURE proc_update;
|
|
||||||
DROP TABLE t1, t2;
|
|
||||||
CALL mtr.add_suppression("conflict state ABORTED after post commit");
|
|
|
@ -28,7 +28,11 @@ gtid_binlog_state_equal
|
||||||
#cleanup
|
#cleanup
|
||||||
connection node_3;
|
connection node_3;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
reset master;
|
connection node_1;
|
||||||
|
connection node_2;
|
||||||
|
connection node_3;
|
||||||
|
connection node_3;
|
||||||
|
RESET MASTER;
|
||||||
connection node_1;
|
connection node_1;
|
||||||
STOP SLAVE;
|
STOP SLAVE;
|
||||||
RESET SLAVE ALL;
|
RESET SLAVE ALL;
|
||||||
|
|
15
mysql-test/suite/galera/r/galera_v1_row_events.result
Normal file
15
mysql-test/suite/galera/r/galera_v1_row_events.result
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
connection node_2;
|
||||||
|
connection node_1;
|
||||||
|
CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
connection node_2;
|
||||||
|
SELECT COUNT(*) = 1 FROM t1;
|
||||||
|
COUNT(*) = 1
|
||||||
|
1
|
||||||
|
connection node_1;
|
||||||
|
UPDATE t1 SET f1 = 2 WHERE f1 = 1;
|
||||||
|
connection node_2;
|
||||||
|
SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2;
|
||||||
|
COUNT(*) = 1
|
||||||
|
1
|
||||||
|
DROP TABLE t1;
|
|
@ -1,39 +1,40 @@
|
||||||
connection node_2;
|
connection node_2;
|
||||||
connection node_1;
|
connection node_1;
|
||||||
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
connection node_1;
|
||||||
VARIABLE_VALUE = 'Primary'
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||||
1
|
VARIABLE_VALUE
|
||||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
Primary
|
||||||
VARIABLE_VALUE = 'ON'
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
||||||
1
|
VARIABLE_VALUE
|
||||||
SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
ON
|
||||||
VARIABLE_VALUE = 0
|
SELECT (VARIABLE_VALUE = 0 OR VARIABLE_VALUE = 1 ) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||||
1
|
(VARIABLE_VALUE = 0 OR VARIABLE_VALUE = 1 )
|
||||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
|
||||||
VARIABLE_VALUE = 'ON'
|
|
||||||
1
|
|
||||||
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
|
||||||
VARIABLE_VALUE = 4
|
|
||||||
1
|
|
||||||
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
|
||||||
VARIABLE_VALUE = 'Synced'
|
|
||||||
1
|
1
|
||||||
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||||
|
VARIABLE_VALUE
|
||||||
|
ON
|
||||||
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
||||||
|
VARIABLE_VALUE
|
||||||
|
4
|
||||||
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||||
|
VARIABLE_VALUE
|
||||||
|
Synced
|
||||||
connection node_2;
|
connection node_2;
|
||||||
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||||
VARIABLE_VALUE = 'Primary'
|
VARIABLE_VALUE
|
||||||
1
|
Primary
|
||||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
||||||
VARIABLE_VALUE = 'ON'
|
VARIABLE_VALUE
|
||||||
1
|
ON
|
||||||
SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
SELECT (VARIABLE_VALUE = 0 OR VARIABLE_VALUE = 1 ) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||||
VARIABLE_VALUE = 0
|
(VARIABLE_VALUE = 0 OR VARIABLE_VALUE = 1 )
|
||||||
1
|
|
||||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
|
||||||
VARIABLE_VALUE = 'ON'
|
|
||||||
1
|
|
||||||
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
|
||||||
VARIABLE_VALUE = 4
|
|
||||||
1
|
|
||||||
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
|
||||||
VARIABLE_VALUE = 'Synced'
|
|
||||||
1
|
1
|
||||||
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||||
|
VARIABLE_VALUE
|
||||||
|
ON
|
||||||
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
||||||
|
VARIABLE_VALUE
|
||||||
|
4
|
||||||
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||||
|
VARIABLE_VALUE
|
||||||
|
Synced
|
||||||
|
|
|
@ -62,6 +62,7 @@ push @::global_suppressions,
|
||||||
qr(WSREP: Ignoring error*),
|
qr(WSREP: Ignoring error*),
|
||||||
qr(WSREP: Failed to remove page file .*),
|
qr(WSREP: Failed to remove page file .*),
|
||||||
qr(WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*),
|
qr(WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*),
|
||||||
|
qr(WSREP: .*Transport endpoint is not connected.*),
|
||||||
);
|
);
|
||||||
|
|
||||||
sub skip_combinations {
|
sub skip_combinations {
|
||||||
|
|
7
mysql-test/suite/galera/t/MW-328A.cnf
Normal file
7
mysql-test/suite/galera/t/MW-328A.cnf
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
!include ../galera_2nodes.cnf
|
||||||
|
|
||||||
|
[mysqld.1]
|
||||||
|
wsrep-debug=ON
|
||||||
|
|
||||||
|
[mysqld.2]
|
||||||
|
wsrep-debug=ON
|
|
@ -13,7 +13,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
--source include/big_test.inc
|
--source include/force_restart.inc
|
||||||
--source suite/galera/t/MW-328-header.inc
|
--source suite/galera/t/MW-328-header.inc
|
||||||
|
|
||||||
--connection node_2
|
--connection node_2
|
||||||
|
|
7
mysql-test/suite/galera/t/MW-328B.cnf
Normal file
7
mysql-test/suite/galera/t/MW-328B.cnf
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
!include ../galera_2nodes.cnf
|
||||||
|
|
||||||
|
[mysqld.1]
|
||||||
|
wsrep-debug=ON
|
||||||
|
|
||||||
|
[mysqld.2]
|
||||||
|
wsrep-debug=ON
|
|
@ -8,7 +8,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
--source include/big_test.inc
|
--source include/force_restart.inc
|
||||||
--source suite/galera/t/MW-328-header.inc
|
--source suite/galera/t/MW-328-header.inc
|
||||||
|
|
||||||
--connection node_2
|
--connection node_2
|
||||||
|
|
|
@ -58,7 +58,21 @@ SELECT COUNT(*) AS EXPECT_0 FROM t1;
|
||||||
--echo #cleanup
|
--echo #cleanup
|
||||||
--connection node_3
|
--connection node_3
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
reset master;
|
|
||||||
|
--connection node_1
|
||||||
|
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
--connection node_2
|
||||||
|
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
--connection node_3
|
||||||
|
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||||
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
|
--connection node_3
|
||||||
|
RESET MASTER;
|
||||||
|
|
||||||
--connection node_1
|
--connection node_1
|
||||||
STOP SLAVE;
|
STOP SLAVE;
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
|
--source include/have_debug.inc
|
||||||
--source include/have_debug_sync.inc
|
--source include/have_debug_sync.inc
|
||||||
|
--source include/galera_have_debug_sync.inc
|
||||||
|
|
||||||
--let $node_1=node_1
|
--let $node_1=node_1
|
||||||
--let $node_2=node_2
|
--let $node_2=node_2
|
||||||
|
|
|
@ -6,44 +6,34 @@
|
||||||
|
|
||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'on' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
||||||
SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
SELECT (VARIABLE_VALUE = 0 OR VARIABLE_VALUE = 1 ) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||||
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
||||||
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||||
|
|
||||||
--connection node_2
|
--connection node_2
|
||||||
|
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'on' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
|
||||||
--source include/wait_condition.inc
|
|
||||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
||||||
SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
SELECT (VARIABLE_VALUE = 0 OR VARIABLE_VALUE = 1 ) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||||
SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
||||||
SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||||
|
|
27
mysql-test/suite/galera_sr/t/galera_sr_v1_row_events.test
Normal file
27
mysql-test/suite/galera_sr/t/galera_sr_v1_row_events.test
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#
|
||||||
|
# Test that Galera SR continues to run even with --log-bin-use-v1-row-events=1
|
||||||
|
#
|
||||||
|
|
||||||
|
--source include/galera_cluster.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
SET AUTOCOMMIT=OFF;
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
--connection node_2
|
||||||
|
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||||
|
SELECT COUNT(*) = 1 FROM t1;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
SET AUTOCOMMIT=ON;
|
||||||
|
UPDATE t1 SET f1 = 2 WHERE f1 = 1;
|
||||||
|
|
||||||
|
--connection node_2
|
||||||
|
SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
|
@ -484,7 +484,7 @@ VARIABLE_SCOPE GLOBAL
|
||||||
VARIABLE_TYPE INT UNSIGNED
|
VARIABLE_TYPE INT UNSIGNED
|
||||||
VARIABLE_COMMENT InnoDB system tablespace size to be set in recovery.
|
VARIABLE_COMMENT InnoDB system tablespace size to be set in recovery.
|
||||||
NUMERIC_MIN_VALUE 0
|
NUMERIC_MIN_VALUE 0
|
||||||
NUMERIC_MAX_VALUE 4294967295
|
NUMERIC_MAX_VALUE 268435456
|
||||||
NUMERIC_BLOCK_SIZE 0
|
NUMERIC_BLOCK_SIZE 0
|
||||||
ENUM_VALUE_LIST NULL
|
ENUM_VALUE_LIST NULL
|
||||||
READ_ONLY YES
|
READ_ONLY YES
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -14,7 +14,7 @@
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Code for handling dubble-linked lists in C
|
Code for handling doubly linked lists in C
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "mysys_priv.h"
|
#include "mysys_priv.h"
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Add a element to start of list */
|
/* Add an element to start of list */
|
||||||
|
|
||||||
LIST *list_add(LIST *root, LIST *element)
|
LIST *list_add(LIST *root, LIST *element)
|
||||||
{
|
{
|
||||||
|
|
|
@ -90,6 +90,8 @@ static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
|
||||||
PAM_DEBUG((stderr, "PAM: execute pam sandbox [%s].\n", toolpath));
|
PAM_DEBUG((stderr, "PAM: execute pam sandbox [%s].\n", toolpath));
|
||||||
(void) execl(toolpath, toolpath, NULL);
|
(void) execl(toolpath, toolpath, NULL);
|
||||||
PAM_DEBUG((stderr, "PAM: exec() failed.\n"));
|
PAM_DEBUG((stderr, "PAM: exec() failed.\n"));
|
||||||
|
my_printf_error(1, "PAM: Cannot execute %s (errno: %M)", ME_ERROR_LOG_ONLY,
|
||||||
|
toolpath, errno);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
16
sql/item.cc
16
sql/item.cc
|
@ -3492,8 +3492,20 @@ bool Item_basic_value::eq(const Item *item, bool binary_cmp) const
|
||||||
(h0= type_handler())->type_handler_for_comparison() ==
|
(h0= type_handler())->type_handler_for_comparison() ==
|
||||||
(h1= item->type_handler())->type_handler_for_comparison() &&
|
(h1= item->type_handler())->type_handler_for_comparison() &&
|
||||||
h0->cast_to_int_type_handler()->type_handler_for_comparison() ==
|
h0->cast_to_int_type_handler()->type_handler_for_comparison() ==
|
||||||
h1->cast_to_int_type_handler()->type_handler_for_comparison() &&
|
h1->cast_to_int_type_handler()->type_handler_for_comparison();
|
||||||
h0->Item_const_eq(c0, c1, binary_cmp);
|
if (res)
|
||||||
|
{
|
||||||
|
switch (c0->const_is_null() + c1->const_is_null()) {
|
||||||
|
case 2: // Two NULLs
|
||||||
|
res= true;
|
||||||
|
break;
|
||||||
|
case 1: // NULL and non-NULL
|
||||||
|
res= false;
|
||||||
|
break;
|
||||||
|
case 0: // Two non-NULLs
|
||||||
|
res= h0->Item_const_eq(c0, c1, binary_cmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
DBUG_EXECUTE_IF("Item_basic_value",
|
DBUG_EXECUTE_IF("Item_basic_value",
|
||||||
push_warning_printf(current_thd,
|
push_warning_printf(current_thd,
|
||||||
Sql_condition::WARN_LEVEL_NOTE,
|
Sql_condition::WARN_LEVEL_NOTE,
|
||||||
|
|
|
@ -4425,7 +4425,11 @@ static void init_ssl()
|
||||||
{
|
{
|
||||||
ulong err;
|
ulong err;
|
||||||
while ((err= ERR_get_error()))
|
while ((err= ERR_get_error()))
|
||||||
sql_print_warning("SSL error: %s", ERR_error_string(err, NULL));
|
{
|
||||||
|
char buf[256];
|
||||||
|
ERR_error_string_n(err, buf, sizeof(buf));
|
||||||
|
sql_print_warning("SSL error: %s",buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ERR_remove_state(0);
|
ERR_remove_state(0);
|
||||||
|
|
|
@ -772,31 +772,6 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||||
(table->table->s->table_category == TABLE_CATEGORY_USER &&
|
(table->table->s->table_category == TABLE_CATEGORY_USER &&
|
||||||
(check_eits_collection_allowed(thd) ||
|
(check_eits_collection_allowed(thd) ||
|
||||||
lex->with_persistent_for_clause));
|
lex->with_persistent_for_clause));
|
||||||
|
|
||||||
|
|
||||||
if (!lex->index_list)
|
|
||||||
{
|
|
||||||
tab->keys_in_use_for_query.init(tab->s->keys);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int pos;
|
|
||||||
LEX_STRING *index_name;
|
|
||||||
List_iterator_fast<LEX_STRING> it(*lex->index_list);
|
|
||||||
|
|
||||||
tab->keys_in_use_for_query.clear_all();
|
|
||||||
while ((index_name= it++))
|
|
||||||
{
|
|
||||||
if (tab->s->keynames.type_names == 0 ||
|
|
||||||
(pos= find_type(&tab->s->keynames, index_name->str,
|
|
||||||
index_name->length, 1)) <= 0)
|
|
||||||
{
|
|
||||||
compl_result_code= result_code= HA_ADMIN_INVALID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tab->keys_in_use_for_query.set_bit(--pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result_code == HA_ADMIN_OK)
|
if (result_code == HA_ADMIN_OK)
|
||||||
|
@ -882,6 +857,27 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||||
}
|
}
|
||||||
tab->file->column_bitmaps_signal();
|
tab->file->column_bitmaps_signal();
|
||||||
}
|
}
|
||||||
|
if (!lex->index_list)
|
||||||
|
tab->keys_in_use_for_query.init(tab->s->keys);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int pos;
|
||||||
|
LEX_STRING *index_name;
|
||||||
|
List_iterator_fast<LEX_STRING> it(*lex->index_list);
|
||||||
|
|
||||||
|
tab->keys_in_use_for_query.clear_all();
|
||||||
|
while ((index_name= it++))
|
||||||
|
{
|
||||||
|
if (tab->s->keynames.type_names == 0 ||
|
||||||
|
(pos= find_type(&tab->s->keynames, index_name->str,
|
||||||
|
index_name->length, 1)) <= 0)
|
||||||
|
{
|
||||||
|
compl_result_code= result_code= HA_ADMIN_INVALID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tab->keys_in_use_for_query.set_bit(--pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!(compl_result_code=
|
if (!(compl_result_code=
|
||||||
alloc_statistics_for_table(thd, table->table)) &&
|
alloc_statistics_for_table(thd, table->table)) &&
|
||||||
!(compl_result_code=
|
!(compl_result_code=
|
||||||
|
|
|
@ -4936,6 +4936,7 @@ extern "C" LEX_STRING * thd_query_string (MYSQL_THD thd)
|
||||||
@param buflen Length of the buffer
|
@param buflen Length of the buffer
|
||||||
|
|
||||||
@return Length of the query
|
@return Length of the query
|
||||||
|
@retval 0 if LOCK_thd_data cannot be acquired without waiting
|
||||||
|
|
||||||
@note This function is thread safe as the query string is
|
@note This function is thread safe as the query string is
|
||||||
accessed under mutex protection and the string is copied
|
accessed under mutex protection and the string is copied
|
||||||
|
@ -4944,10 +4945,19 @@ extern "C" LEX_STRING * thd_query_string (MYSQL_THD thd)
|
||||||
|
|
||||||
extern "C" size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen)
|
extern "C" size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen)
|
||||||
{
|
{
|
||||||
mysql_mutex_lock(&thd->LOCK_thd_data);
|
size_t len= 0;
|
||||||
size_t len= MY_MIN(buflen - 1, thd->query_length());
|
/* InnoDB invokes this function while holding internal mutexes.
|
||||||
memcpy(buf, thd->query(), len);
|
THD::awake() will hold LOCK_thd_data while invoking an InnoDB
|
||||||
mysql_mutex_unlock(&thd->LOCK_thd_data);
|
function that would acquire the internal mutex. Because this
|
||||||
|
function is a non-essential part of information_schema view output,
|
||||||
|
we will break the deadlock by avoiding a mutex wait here
|
||||||
|
and returning the empty string if a wait would be needed. */
|
||||||
|
if (!mysql_mutex_trylock(&thd->LOCK_thd_data))
|
||||||
|
{
|
||||||
|
len= MY_MIN(buflen - 1, thd->query_length());
|
||||||
|
memcpy(buf, thd->query(), len);
|
||||||
|
mysql_mutex_unlock(&thd->LOCK_thd_data);
|
||||||
|
}
|
||||||
buf[len]= '\0';
|
buf[len]= '\0';
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1884,6 +1884,11 @@ void Explain_table_access::print_explain_json(Explain_query *query,
|
||||||
/* This is a derived table. Print its contents here */
|
/* This is a derived table. Print its contents here */
|
||||||
writer->add_member("materialized").start_object();
|
writer->add_member("materialized").start_object();
|
||||||
Explain_node *node= query->get_node(derived_select_number);
|
Explain_node *node= query->get_node(derived_select_number);
|
||||||
|
if (node->get_type() == Explain_node::EXPLAIN_SELECT &&
|
||||||
|
((Explain_select*)node)->is_lateral)
|
||||||
|
{
|
||||||
|
writer->add_member("lateral").add_ll(1);
|
||||||
|
}
|
||||||
node->print_explain_json(query, writer, is_analyze);
|
node->print_explain_json(query, writer, is_analyze);
|
||||||
writer->end_object();
|
writer->end_object();
|
||||||
}
|
}
|
||||||
|
|
|
@ -211,6 +211,7 @@ public:
|
||||||
select_lex(NULL),
|
select_lex(NULL),
|
||||||
#endif
|
#endif
|
||||||
linkage(UNSPECIFIED_TYPE),
|
linkage(UNSPECIFIED_TYPE),
|
||||||
|
is_lateral(false),
|
||||||
message(NULL),
|
message(NULL),
|
||||||
having(NULL), having_value(Item::COND_UNDEF),
|
having(NULL), having_value(Item::COND_UNDEF),
|
||||||
using_temporary(false), using_filesort(false),
|
using_temporary(false), using_filesort(false),
|
||||||
|
@ -226,6 +227,7 @@ public:
|
||||||
#endif
|
#endif
|
||||||
const char *select_type;
|
const char *select_type;
|
||||||
enum sub_select_type linkage;
|
enum sub_select_type linkage;
|
||||||
|
bool is_lateral;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If message != NULL, this is a degenerate join plan, and all subsequent
|
If message != NULL, this is a degenerate join plan, and all subsequent
|
||||||
|
|
|
@ -27013,6 +27013,8 @@ int JOIN::save_explain_data_intern(Explain_query *output,
|
||||||
xpl_sel->select_id= join->select_lex->select_number;
|
xpl_sel->select_id= join->select_lex->select_number;
|
||||||
xpl_sel->select_type= join->select_lex->type;
|
xpl_sel->select_type= join->select_lex->type;
|
||||||
xpl_sel->linkage= select_lex->get_linkage();
|
xpl_sel->linkage= select_lex->get_linkage();
|
||||||
|
xpl_sel->is_lateral= ((select_lex->get_linkage() == DERIVED_TABLE_TYPE) &&
|
||||||
|
(select_lex->uncacheable & UNCACHEABLE_DEPENDENT));
|
||||||
if (select_lex->master_unit()->derived)
|
if (select_lex->master_unit()->derived)
|
||||||
xpl_sel->connection_type= Explain_node::EXPLAIN_NODE_DERIVED;
|
xpl_sel->connection_type= Explain_node::EXPLAIN_NODE_DERIVED;
|
||||||
|
|
||||||
|
|
|
@ -1815,18 +1815,11 @@ retry_page_get:
|
||||||
if (dict_index_is_spatial(index)) {
|
if (dict_index_is_spatial(index)) {
|
||||||
ut_ad(cursor->rtr_info);
|
ut_ad(cursor->rtr_info);
|
||||||
|
|
||||||
node_seq_t seq_no = rtr_get_current_ssn_id(index);
|
|
||||||
|
|
||||||
/* If SSN in memory is not initialized, fetch
|
/* If SSN in memory is not initialized, fetch
|
||||||
it from root page */
|
it from root page */
|
||||||
if (seq_no < 1) {
|
if (!rtr_get_current_ssn_id(index)) {
|
||||||
node_seq_t root_seq_no;
|
/* FIXME: do this in dict_load_table_one() */
|
||||||
|
index->set_ssn(page_get_ssn_id(page) + 1);
|
||||||
root_seq_no = page_get_ssn_id(page);
|
|
||||||
|
|
||||||
mutex_enter(&(index->rtr_ssn.mutex));
|
|
||||||
index->rtr_ssn.seq_no = root_seq_no + 1;
|
|
||||||
mutex_exit(&(index->rtr_ssn.mutex));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the MBR */
|
/* Save the MBR */
|
||||||
|
|
|
@ -431,16 +431,13 @@ decompress:
|
||||||
decompress_with_slot:
|
decompress_with_slot:
|
||||||
ut_d(fil_page_type_validate(space, dst_frame));
|
ut_d(fil_page_type_validate(space, dst_frame));
|
||||||
|
|
||||||
bpage->write_size = fil_page_decompress(
|
ulint write_size = fil_page_decompress(
|
||||||
slot->crypt_buf, dst_frame, space->flags);
|
slot->crypt_buf, dst_frame, space->flags);
|
||||||
slot->release();
|
slot->release();
|
||||||
|
|
||||||
ut_ad(!bpage->write_size
|
ut_ad(!write_size || fil_page_type_validate(space, dst_frame));
|
||||||
|| fil_page_type_validate(space, dst_frame));
|
|
||||||
|
|
||||||
ut_ad(space->pending_io());
|
ut_ad(space->pending_io());
|
||||||
|
return write_size != 0;
|
||||||
return bpage->write_size != 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key_version && space->crypt_data) {
|
if (key_version && space->crypt_data) {
|
||||||
|
@ -1295,7 +1292,6 @@ buf_block_init(buf_block_t* block, byte* frame)
|
||||||
block->page.buf_fix_count = 0;
|
block->page.buf_fix_count = 0;
|
||||||
block->page.io_fix = BUF_IO_NONE;
|
block->page.io_fix = BUF_IO_NONE;
|
||||||
block->page.real_size = 0;
|
block->page.real_size = 0;
|
||||||
block->page.write_size = 0;
|
|
||||||
block->modify_clock = 0;
|
block->modify_clock = 0;
|
||||||
block->page.slot = NULL;
|
block->page.slot = NULL;
|
||||||
block->page.status = buf_page_t::NORMAL;
|
block->page.status = buf_page_t::NORMAL;
|
||||||
|
@ -4197,7 +4193,6 @@ buf_page_init_low(
|
||||||
bpage->freed_page_clock = 0;
|
bpage->freed_page_clock = 0;
|
||||||
bpage->access_time = 0;
|
bpage->access_time = 0;
|
||||||
bpage->oldest_modification = 0;
|
bpage->oldest_modification = 0;
|
||||||
bpage->write_size = 0;
|
|
||||||
bpage->real_size = 0;
|
bpage->real_size = 0;
|
||||||
bpage->slot = NULL;
|
bpage->slot = NULL;
|
||||||
bpage->ibuf_exist = false;
|
bpage->ibuf_exist = false;
|
||||||
|
|
|
@ -3560,7 +3560,7 @@ dict_foreign_parse_drop_constraints(
|
||||||
|
|
||||||
ut_a(trx->mysql_thd);
|
ut_a(trx->mysql_thd);
|
||||||
|
|
||||||
cs = innobase_get_charset(trx->mysql_thd);
|
cs = thd_charset(trx->mysql_thd);
|
||||||
|
|
||||||
*n = 0;
|
*n = 0;
|
||||||
|
|
||||||
|
|
|
@ -789,7 +789,6 @@ dict_mem_index_create(
|
||||||
mutex_create(LATCH_ID_ZIP_PAD_MUTEX, &index->zip_pad.mutex);
|
mutex_create(LATCH_ID_ZIP_PAD_MUTEX, &index->zip_pad.mutex);
|
||||||
|
|
||||||
if (type & DICT_SPATIAL) {
|
if (type & DICT_SPATIAL) {
|
||||||
mutex_create(LATCH_ID_RTR_SSN_MUTEX, &index->rtr_ssn.mutex);
|
|
||||||
index->rtr_track = new
|
index->rtr_track = new
|
||||||
(mem_heap_alloc(heap, sizeof *index->rtr_track))
|
(mem_heap_alloc(heap, sizeof *index->rtr_track))
|
||||||
rtr_info_track_t();
|
rtr_info_track_t();
|
||||||
|
@ -1102,7 +1101,7 @@ dict_mem_index_free(
|
||||||
for (auto& rtr_info : index->rtr_track->rtr_active) {
|
for (auto& rtr_info : index->rtr_track->rtr_active) {
|
||||||
rtr_info->index = NULL;
|
rtr_info->index = NULL;
|
||||||
}
|
}
|
||||||
mutex_destroy(&index->rtr_ssn.mutex);
|
|
||||||
mutex_destroy(&index->rtr_track->rtr_active_mutex);
|
mutex_destroy(&index->rtr_track->rtr_active_mutex);
|
||||||
index->rtr_track->~rtr_info_track_t();
|
index->rtr_track->~rtr_info_track_t();
|
||||||
}
|
}
|
||||||
|
|
|
@ -570,7 +570,6 @@ static PSI_mutex_info all_innodb_mutexes[] = {
|
||||||
PSI_KEY(rtr_active_mutex),
|
PSI_KEY(rtr_active_mutex),
|
||||||
PSI_KEY(rtr_match_mutex),
|
PSI_KEY(rtr_match_mutex),
|
||||||
PSI_KEY(rtr_path_mutex),
|
PSI_KEY(rtr_path_mutex),
|
||||||
PSI_KEY(rtr_ssn_mutex),
|
|
||||||
PSI_KEY(trx_sys_mutex),
|
PSI_KEY(trx_sys_mutex),
|
||||||
PSI_KEY(zip_pad_mutex)
|
PSI_KEY(zip_pad_mutex)
|
||||||
};
|
};
|
||||||
|
@ -2126,17 +2125,6 @@ innobase_casedn_str(
|
||||||
my_casedn_str(system_charset_info, a);
|
my_casedn_str(system_charset_info, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
Determines the connection character set.
|
|
||||||
@return connection character set */
|
|
||||||
CHARSET_INFO*
|
|
||||||
innobase_get_charset(
|
|
||||||
/*=================*/
|
|
||||||
THD* mysql_thd) /*!< in: MySQL thread handle */
|
|
||||||
{
|
|
||||||
return(thd_charset(mysql_thd));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Determines the current SQL statement.
|
/** Determines the current SQL statement.
|
||||||
Thread unsafe, can only be called from the thread owning the THD.
|
Thread unsafe, can only be called from the thread owning the THD.
|
||||||
@param[in] thd MySQL thread handle
|
@param[in] thd MySQL thread handle
|
||||||
|
@ -2156,22 +2144,6 @@ innobase_get_stmt_unsafe(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Determines the current SQL statement.
|
|
||||||
Thread safe, can be called from any thread as the string is copied
|
|
||||||
into the provided buffer.
|
|
||||||
@param[in] thd MySQL thread handle
|
|
||||||
@param[out] buf Buffer containing SQL statement
|
|
||||||
@param[in] buflen Length of provided buffer
|
|
||||||
@return Length of the SQL statement */
|
|
||||||
size_t
|
|
||||||
innobase_get_stmt_safe(
|
|
||||||
THD* thd,
|
|
||||||
char* buf,
|
|
||||||
size_t buflen)
|
|
||||||
{
|
|
||||||
return thd_query_safe(thd, buf, buflen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
/**********************************************************************//**
|
||||||
Get the current setting of the tdc_size global parameter. We do
|
Get the current setting of the tdc_size global parameter. We do
|
||||||
a dirty read because for one there is no synchronization object and
|
a dirty read because for one there is no synchronization object and
|
||||||
|
@ -12177,7 +12149,7 @@ create_table_info_t::create_foreign_keys()
|
||||||
dict_index_t* err_index = NULL;
|
dict_index_t* err_index = NULL;
|
||||||
ulint err_col;
|
ulint err_col;
|
||||||
const bool tmp_table = m_flags2 & DICT_TF2_TEMPORARY;
|
const bool tmp_table = m_flags2 & DICT_TF2_TEMPORARY;
|
||||||
const CHARSET_INFO* cs = innobase_get_charset(m_thd);
|
const CHARSET_INFO* cs = thd_charset(m_thd);
|
||||||
const char* operation = "Create ";
|
const char* operation = "Create ";
|
||||||
const char* name = m_table_name;
|
const char* name = m_table_name;
|
||||||
|
|
||||||
|
@ -20031,7 +20003,7 @@ static MYSQL_SYSVAR_UINT(data_file_size_debug,
|
||||||
srv_sys_space_size_debug,
|
srv_sys_space_size_debug,
|
||||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
||||||
"InnoDB system tablespace size to be set in recovery.",
|
"InnoDB system tablespace size to be set in recovery.",
|
||||||
NULL, NULL, 0, 0, UINT_MAX32, 0);
|
NULL, NULL, 0, 0, 256U << 20, 0);
|
||||||
|
|
||||||
static MYSQL_SYSVAR_ULONG(fil_make_page_dirty_debug,
|
static MYSQL_SYSVAR_ULONG(fil_make_page_dirty_debug,
|
||||||
srv_fil_make_page_dirty_debug, PLUGIN_VAR_OPCMDARG,
|
srv_fil_make_page_dirty_debug, PLUGIN_VAR_OPCMDARG,
|
||||||
|
|
|
@ -528,13 +528,8 @@ the definitions are bracketed with #ifdef INNODB_COMPATIBILITY_HOOKS */
|
||||||
#error InnoDB needs MySQL to be built with #define INNODB_COMPATIBILITY_HOOKS
|
#error InnoDB needs MySQL to be built with #define INNODB_COMPATIBILITY_HOOKS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LEX_STRING* thd_query_string(MYSQL_THD thd);
|
|
||||||
size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen);
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
struct charset_info_st *thd_charset(MYSQL_THD thd);
|
|
||||||
|
|
||||||
/** Check if a user thread is a replication slave thread
|
/** Check if a user thread is a replication slave thread
|
||||||
@param thd user thread
|
@param thd user thread
|
||||||
@retval 0 the user thread is not a replication slave thread
|
@retval 0 the user thread is not a replication slave thread
|
||||||
|
|
|
@ -2929,7 +2929,7 @@ innobase_get_foreign_key_info(
|
||||||
char* referenced_table_name = NULL;
|
char* referenced_table_name = NULL;
|
||||||
ulint num_fk = 0;
|
ulint num_fk = 0;
|
||||||
Alter_info* alter_info = ha_alter_info->alter_info;
|
Alter_info* alter_info = ha_alter_info->alter_info;
|
||||||
const CHARSET_INFO* cs = innobase_get_charset(trx->mysql_thd);
|
const CHARSET_INFO* cs = thd_charset(trx->mysql_thd);
|
||||||
|
|
||||||
DBUG_ENTER("innobase_get_foreign_key_info");
|
DBUG_ENTER("innobase_get_foreign_key_info");
|
||||||
|
|
||||||
|
|
|
@ -2607,42 +2607,28 @@ ibuf_contract_after_insert(
|
||||||
} while (size > 0 && sum_sizes < entry_size);
|
} while (size > 0 && sum_sizes < entry_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************//**
|
/** Determine if a change buffer record has been encountered already.
|
||||||
Determine if an insert buffer record has been encountered already.
|
@param rec change buffer record in the MySQL 5.5 format
|
||||||
@return TRUE if a new record, FALSE if possible duplicate */
|
@param hash hash table of encountered records
|
||||||
static
|
@param size number of elements in hash
|
||||||
ibool
|
@retval true if a distinct record
|
||||||
ibuf_get_volume_buffered_hash(
|
@retval false if this may be duplicating an earlier record */
|
||||||
/*==========================*/
|
static bool ibuf_get_volume_buffered_hash(const rec_t *rec, ulint *hash,
|
||||||
const rec_t* rec, /*!< in: ibuf record in post-4.1 format */
|
ulint size)
|
||||||
const byte* types, /*!< in: fields */
|
|
||||||
const byte* data, /*!< in: start of user record data */
|
|
||||||
ulint comp, /*!< in: 0=ROW_FORMAT=REDUNDANT,
|
|
||||||
nonzero=ROW_FORMAT=COMPACT */
|
|
||||||
ulint* hash, /*!< in/out: hash array */
|
|
||||||
ulint size) /*!< in: number of elements in hash array */
|
|
||||||
{
|
{
|
||||||
ulint len;
|
ut_ad(rec_get_n_fields_old(rec) > IBUF_REC_FIELD_USER);
|
||||||
ulint fold;
|
const ulint start= rec_get_field_start_offs(rec, IBUF_REC_FIELD_USER);
|
||||||
ulint bitmask;
|
const ulint len= rec_get_data_size_old(rec) - start;
|
||||||
|
const uint32_t fold= ut_crc32(rec + start, len);
|
||||||
|
hash+= (fold / (CHAR_BIT * sizeof *hash)) % size;
|
||||||
|
ulint bitmask= static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
|
||||||
|
|
||||||
len = ibuf_rec_get_size(
|
if (*hash & bitmask)
|
||||||
rec, types,
|
return false;
|
||||||
rec_get_n_fields_old(rec) - IBUF_REC_FIELD_USER, comp);
|
|
||||||
fold = ut_fold_binary(data, len);
|
|
||||||
|
|
||||||
hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
|
/* We have not seen this record yet. Remember it. */
|
||||||
bitmask = static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
|
*hash|= bitmask;
|
||||||
|
return true;
|
||||||
if (*hash & bitmask) {
|
|
||||||
|
|
||||||
return(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We have not seen this record yet. Insert it. */
|
|
||||||
*hash |= bitmask;
|
|
||||||
|
|
||||||
return(TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef UNIV_DEBUG
|
#ifdef UNIV_DEBUG
|
||||||
|
@ -2735,11 +2721,7 @@ ibuf_get_volume_buffered_count_func(
|
||||||
case IBUF_OP_DELETE_MARK:
|
case IBUF_OP_DELETE_MARK:
|
||||||
/* There must be a record to delete-mark.
|
/* There must be a record to delete-mark.
|
||||||
See if this record has been already buffered. */
|
See if this record has been already buffered. */
|
||||||
if (n_recs && ibuf_get_volume_buffered_hash(
|
if (n_recs && ibuf_get_volume_buffered_hash(rec, hash, size)) {
|
||||||
rec, types + IBUF_REC_INFO_SIZE,
|
|
||||||
types + len,
|
|
||||||
types[IBUF_REC_OFFSET_FLAGS] & IBUF_REC_COMPACT,
|
|
||||||
hash, size)) {
|
|
||||||
(*n_recs)++;
|
(*n_recs)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1169,11 +1169,6 @@ public:
|
||||||
zip.data == NULL means an active
|
zip.data == NULL means an active
|
||||||
buf_pool.watch */
|
buf_pool.watch */
|
||||||
|
|
||||||
ulint write_size; /* Write size is set when this
|
|
||||||
page is first time written and then
|
|
||||||
if written again we check is TRIM
|
|
||||||
operation needed. */
|
|
||||||
|
|
||||||
ulint real_size; /*!< Real size of the page
|
ulint real_size; /*!< Real size of the page
|
||||||
Normal pages == srv_page_size
|
Normal pages == srv_page_size
|
||||||
page compressed pages, payload
|
page compressed pages, payload
|
||||||
|
|
|
@ -1103,7 +1103,22 @@ struct dict_index_t {
|
||||||
/* in which slot the next sample should be
|
/* in which slot the next sample should be
|
||||||
saved. */
|
saved. */
|
||||||
/* @} */
|
/* @} */
|
||||||
rtr_ssn_t rtr_ssn;/*!< Node sequence number for RTree */
|
private:
|
||||||
|
/** R-tree split sequence number */
|
||||||
|
std::atomic<node_seq_t> rtr_ssn;
|
||||||
|
public:
|
||||||
|
|
||||||
|
void set_ssn(node_seq_t ssn)
|
||||||
|
{
|
||||||
|
rtr_ssn.store(ssn, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
node_seq_t assign_ssn()
|
||||||
|
{
|
||||||
|
node_seq_t ssn= rtr_ssn.fetch_add(1, std::memory_order_relaxed);
|
||||||
|
return ssn + 1;
|
||||||
|
}
|
||||||
|
node_seq_t ssn() const { return rtr_ssn.load(std::memory_order_relaxed); }
|
||||||
|
|
||||||
rtr_info_track_t*
|
rtr_info_track_t*
|
||||||
rtr_track;/*!< tracking all R-Tree search cursors */
|
rtr_track;/*!< tracking all R-Tree search cursors */
|
||||||
trx_id_t trx_id; /*!< id of the transaction that created this
|
trx_id_t trx_id; /*!< id of the transaction that created this
|
||||||
|
|
|
@ -190,23 +190,8 @@ rtr_non_leaf_insert_stack_push(
|
||||||
double mbr_inc); /*!< in: MBR needs to be
|
double mbr_inc); /*!< in: MBR needs to be
|
||||||
enlarged */
|
enlarged */
|
||||||
|
|
||||||
/*****************************************************************//**
|
#define rtr_get_new_ssn_id(index) (index)->assign_ssn()
|
||||||
Allocates a new Split Sequence Number.
|
#define rtr_get_current_ssn_id(index) (index)->ssn()
|
||||||
@return new SSN id */
|
|
||||||
UNIV_INLINE
|
|
||||||
node_seq_t
|
|
||||||
rtr_get_new_ssn_id(
|
|
||||||
/*===============*/
|
|
||||||
dict_index_t* index); /*!< in: the index struct */
|
|
||||||
|
|
||||||
/*****************************************************************//**
|
|
||||||
Get the current Split Sequence Number.
|
|
||||||
@return current SSN id */
|
|
||||||
UNIV_INLINE
|
|
||||||
node_seq_t
|
|
||||||
rtr_get_current_ssn_id(
|
|
||||||
/*===================*/
|
|
||||||
dict_index_t* index); /*!< in/out: the index struct */
|
|
||||||
|
|
||||||
/********************************************************************//**
|
/********************************************************************//**
|
||||||
Create a RTree search info structure */
|
Create a RTree search info structure */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2014, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2017, MariaDB Corporation.
|
Copyright (c) 2017, 2020, MariaDB Corporation.
|
||||||
|
|
||||||
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
|
||||||
|
@ -123,41 +123,6 @@ rtr_non_leaf_stack_push(
|
||||||
#endif /* RTR_SEARCH_DIAGNOSTIC */
|
#endif /* RTR_SEARCH_DIAGNOSTIC */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************//**
|
|
||||||
Allocates a new Split Sequence Number.
|
|
||||||
@return new SSN id */
|
|
||||||
UNIV_INLINE
|
|
||||||
node_seq_t
|
|
||||||
rtr_get_new_ssn_id(
|
|
||||||
/*===============*/
|
|
||||||
dict_index_t* index) /*!< in/out: the index struct */
|
|
||||||
{
|
|
||||||
node_seq_t ssn;
|
|
||||||
|
|
||||||
mutex_enter(&(index->rtr_ssn.mutex));
|
|
||||||
ssn = ++index->rtr_ssn.seq_no;
|
|
||||||
mutex_exit(&(index->rtr_ssn.mutex));
|
|
||||||
|
|
||||||
return(ssn);
|
|
||||||
}
|
|
||||||
/*****************************************************************//**
|
|
||||||
Get the current Split Sequence Number.
|
|
||||||
@return current SSN id */
|
|
||||||
UNIV_INLINE
|
|
||||||
node_seq_t
|
|
||||||
rtr_get_current_ssn_id(
|
|
||||||
/*===================*/
|
|
||||||
dict_index_t* index) /*!< in: index struct */
|
|
||||||
{
|
|
||||||
node_seq_t ssn;
|
|
||||||
|
|
||||||
mutex_enter(&(index->rtr_ssn.mutex));
|
|
||||||
ssn = index->rtr_ssn.seq_no;
|
|
||||||
mutex_exit(&(index->rtr_ssn.mutex));
|
|
||||||
|
|
||||||
return(ssn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
Sets pointer to the data and length in a field. */
|
Sets pointer to the data and length in a field. */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2014, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2018, 2019, MariaDB Corporation.
|
Copyright (c) 2018, 2020, MariaDB Corporation.
|
||||||
|
|
||||||
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
|
||||||
|
@ -142,12 +142,6 @@ struct rtr_info_track_t {
|
||||||
rtr_active */
|
rtr_active */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Node Sequence Number and mutex protects it. */
|
|
||||||
typedef struct rtree_ssn {
|
|
||||||
ib_mutex_t mutex; /*!< mutex protect the seq num */
|
|
||||||
node_seq_t seq_no; /*!< the SSN (node sequence number) */
|
|
||||||
} rtr_ssn_t;
|
|
||||||
|
|
||||||
/* This is to record the record movement between pages. Used for corresponding
|
/* This is to record the record movement between pages. Used for corresponding
|
||||||
lock movement */
|
lock movement */
|
||||||
typedef struct rtr_rec_move {
|
typedef struct rtr_rec_move {
|
||||||
|
|
|
@ -237,13 +237,7 @@ ulint wsrep_innobase_mysql_sort(int mysql_type, uint charset_number,
|
||||||
unsigned int buf_length);
|
unsigned int buf_length);
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
/**********************************************************************//**
|
extern "C" struct charset_info_st *thd_charset(THD *thd);
|
||||||
Determines the connection character set.
|
|
||||||
@return connection character set */
|
|
||||||
CHARSET_INFO*
|
|
||||||
innobase_get_charset(
|
|
||||||
/*=================*/
|
|
||||||
THD* thd); /*!< in: MySQL thread handle */
|
|
||||||
|
|
||||||
/** Determines the current SQL statement.
|
/** Determines the current SQL statement.
|
||||||
Thread unsafe, can only be called from the thread owning the THD.
|
Thread unsafe, can only be called from the thread owning the THD.
|
||||||
|
@ -255,19 +249,6 @@ innobase_get_stmt_unsafe(
|
||||||
THD* thd,
|
THD* thd,
|
||||||
size_t* length);
|
size_t* length);
|
||||||
|
|
||||||
/** Determines the current SQL statement.
|
|
||||||
Thread safe, can be called from any thread as the string is copied
|
|
||||||
into the provided buffer.
|
|
||||||
@param[in] thd MySQL thread handle
|
|
||||||
@param[out] buf Buffer containing SQL statement
|
|
||||||
@param[in] buflen Length of provided buffer
|
|
||||||
@return Length of the SQL statement */
|
|
||||||
size_t
|
|
||||||
innobase_get_stmt_safe(
|
|
||||||
THD* thd,
|
|
||||||
char* buf,
|
|
||||||
size_t buflen);
|
|
||||||
|
|
||||||
/******************************************************************//**
|
/******************************************************************//**
|
||||||
This function is used to find the storage length in bytes of the first n
|
This function is used to find the storage length in bytes of the first n
|
||||||
characters for prefix indexes using a multibyte character set. The function
|
characters for prefix indexes using a multibyte character set. The function
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2008, Google Inc.
|
Copyright (c) 2008, Google Inc.
|
||||||
Copyright (c) 2012, Facebook Inc.
|
Copyright (c) 2012, Facebook Inc.
|
||||||
|
Copyright (c) 2020, MariaDB Corporation.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
|
@ -80,7 +81,6 @@ extern mysql_pfs_key_t recv_writer_mutex_key;
|
||||||
extern mysql_pfs_key_t rtr_active_mutex_key;
|
extern mysql_pfs_key_t rtr_active_mutex_key;
|
||||||
extern mysql_pfs_key_t rtr_match_mutex_key;
|
extern mysql_pfs_key_t rtr_match_mutex_key;
|
||||||
extern mysql_pfs_key_t rtr_path_mutex_key;
|
extern mysql_pfs_key_t rtr_path_mutex_key;
|
||||||
extern mysql_pfs_key_t rtr_ssn_mutex_key;
|
|
||||||
extern mysql_pfs_key_t redo_rseg_mutex_key;
|
extern mysql_pfs_key_t redo_rseg_mutex_key;
|
||||||
extern mysql_pfs_key_t noredo_rseg_mutex_key;
|
extern mysql_pfs_key_t noredo_rseg_mutex_key;
|
||||||
extern mysql_pfs_key_t page_zip_stat_per_index_mutex_key;
|
extern mysql_pfs_key_t page_zip_stat_per_index_mutex_key;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2017, 2018, MariaDB Corporation.
|
Copyright (c) 2017, 2020, MariaDB Corporation.
|
||||||
|
|
||||||
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
|
||||||
|
@ -314,7 +314,6 @@ enum latch_id_t {
|
||||||
LATCH_ID_REDO_RSEG,
|
LATCH_ID_REDO_RSEG,
|
||||||
LATCH_ID_NOREDO_RSEG,
|
LATCH_ID_NOREDO_RSEG,
|
||||||
LATCH_ID_RW_LOCK_DEBUG,
|
LATCH_ID_RW_LOCK_DEBUG,
|
||||||
LATCH_ID_RTR_SSN_MUTEX,
|
|
||||||
LATCH_ID_RTR_ACTIVE_MUTEX,
|
LATCH_ID_RTR_ACTIVE_MUTEX,
|
||||||
LATCH_ID_RTR_MATCH_MUTEX,
|
LATCH_ID_RTR_MATCH_MUTEX,
|
||||||
LATCH_ID_RTR_PATH_MUTEX,
|
LATCH_ID_RTR_PATH_MUTEX,
|
||||||
|
|
|
@ -1620,7 +1620,7 @@ wait_suspend_loop:
|
||||||
"Waiting for %s to exit", thread_name);
|
"Waiting for %s to exit", thread_name);
|
||||||
if (srv_print_verbose_log && count > COUNT_INTERVAL) {
|
if (srv_print_verbose_log && count > COUNT_INTERVAL) {
|
||||||
ib::info() << "Waiting for " << thread_name
|
ib::info() << "Waiting for " << thread_name
|
||||||
<< "to exit";
|
<< " to exit";
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
goto loop;
|
goto loop;
|
||||||
|
|
|
@ -384,8 +384,7 @@ private:
|
||||||
{
|
{
|
||||||
return(latch->get_id() == LATCH_ID_RTR_ACTIVE_MUTEX
|
return(latch->get_id() == LATCH_ID_RTR_ACTIVE_MUTEX
|
||||||
|| latch->get_id() == LATCH_ID_RTR_PATH_MUTEX
|
|| latch->get_id() == LATCH_ID_RTR_PATH_MUTEX
|
||||||
|| latch->get_id() == LATCH_ID_RTR_MATCH_MUTEX
|
|| latch->get_id() == LATCH_ID_RTR_MATCH_MUTEX);
|
||||||
|| latch->get_id() == LATCH_ID_RTR_SSN_MUTEX);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1361,8 +1360,6 @@ sync_latch_meta_init()
|
||||||
rw_lock_debug_mutex_key);
|
rw_lock_debug_mutex_key);
|
||||||
#endif /* UNIV_DEBUG */
|
#endif /* UNIV_DEBUG */
|
||||||
|
|
||||||
LATCH_ADD_MUTEX(RTR_SSN_MUTEX, SYNC_ANY_LATCH, rtr_ssn_mutex_key);
|
|
||||||
|
|
||||||
LATCH_ADD_MUTEX(RTR_ACTIVE_MUTEX, SYNC_ANY_LATCH,
|
LATCH_ADD_MUTEX(RTR_ACTIVE_MUTEX, SYNC_ANY_LATCH,
|
||||||
rtr_active_mutex_key);
|
rtr_active_mutex_key);
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2020, MariaDB Corporation.
|
Copyright (c) 2020, MariaDB Corporation.
|
||||||
Copyright (c) 2008, Google Inc.
|
Copyright (c) 2008, Google Inc.
|
||||||
|
Copyright (c) 2020, MariaDB Corporation.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
|
@ -73,7 +74,6 @@ mysql_pfs_key_t rw_lock_debug_mutex_key;
|
||||||
mysql_pfs_key_t rtr_active_mutex_key;
|
mysql_pfs_key_t rtr_active_mutex_key;
|
||||||
mysql_pfs_key_t rtr_match_mutex_key;
|
mysql_pfs_key_t rtr_match_mutex_key;
|
||||||
mysql_pfs_key_t rtr_path_mutex_key;
|
mysql_pfs_key_t rtr_path_mutex_key;
|
||||||
mysql_pfs_key_t rtr_ssn_mutex_key;
|
|
||||||
mysql_pfs_key_t rw_lock_list_mutex_key;
|
mysql_pfs_key_t rw_lock_list_mutex_key;
|
||||||
mysql_pfs_key_t rw_lock_mutex_key;
|
mysql_pfs_key_t rw_lock_mutex_key;
|
||||||
mysql_pfs_key_t srv_innodb_monitor_mutex_key;
|
mysql_pfs_key_t srv_innodb_monitor_mutex_key;
|
||||||
|
|
|
@ -46,6 +46,7 @@ Created July 17, 2007 Vasil Dimov
|
||||||
#include "trx0sys.h"
|
#include "trx0sys.h"
|
||||||
#include "que0que.h"
|
#include "que0que.h"
|
||||||
#include "trx0purge.h"
|
#include "trx0purge.h"
|
||||||
|
#include "sql_class.h"
|
||||||
|
|
||||||
/** Initial number of rows in the table cache */
|
/** Initial number of rows in the table cache */
|
||||||
#define TABLE_CACHE_INITIAL_ROWSNUM 1024
|
#define TABLE_CACHE_INITIAL_ROWSNUM 1024
|
||||||
|
@ -427,7 +428,6 @@ fill_trx_row(
|
||||||
which to copy volatile
|
which to copy volatile
|
||||||
strings */
|
strings */
|
||||||
{
|
{
|
||||||
size_t stmt_len;
|
|
||||||
const char* s;
|
const char* s;
|
||||||
|
|
||||||
ut_ad(lock_mutex_own());
|
ut_ad(lock_mutex_own());
|
||||||
|
@ -462,16 +462,14 @@ fill_trx_row(
|
||||||
row->trx_mysql_thread_id = thd_get_thread_id(trx->mysql_thd);
|
row->trx_mysql_thread_id = thd_get_thread_id(trx->mysql_thd);
|
||||||
|
|
||||||
char query[TRX_I_S_TRX_QUERY_MAX_LEN + 1];
|
char query[TRX_I_S_TRX_QUERY_MAX_LEN + 1];
|
||||||
stmt_len = innobase_get_stmt_safe(trx->mysql_thd, query, sizeof(query));
|
if (size_t stmt_len = thd_query_safe(trx->mysql_thd, query,
|
||||||
|
sizeof query)) {
|
||||||
if (stmt_len > 0) {
|
|
||||||
|
|
||||||
row->trx_query = static_cast<const char*>(
|
row->trx_query = static_cast<const char*>(
|
||||||
ha_storage_put_memlim(
|
ha_storage_put_memlim(
|
||||||
cache->storage, query, stmt_len + 1,
|
cache->storage, query, stmt_len + 1,
|
||||||
MAX_ALLOWED_FOR_STORAGE(cache)));
|
MAX_ALLOWED_FOR_STORAGE(cache)));
|
||||||
|
|
||||||
row->trx_query_cs = innobase_get_charset(trx->mysql_thd);
|
row->trx_query_cs = thd_charset(trx->mysql_thd);
|
||||||
|
|
||||||
if (row->trx_query == NULL) {
|
if (row->trx_query == NULL) {
|
||||||
|
|
||||||
|
|
|
@ -20886,6 +20886,53 @@ static void test_explain_meta()
|
||||||
mct_close_log();
|
mct_close_log();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
MDEV-20261 NULL passed to String::eq, SEGV, server crash, regression in 10.4
|
||||||
|
*/
|
||||||
|
static void test_mdev20261()
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
MYSQL_STMT *stmt;
|
||||||
|
MYSQL_BIND param[1];
|
||||||
|
const char *query= "SELECT * FROM t1 WHERE f = ? OR f = 'foo'";
|
||||||
|
char val[]= "";
|
||||||
|
my_bool is_null= TRUE;
|
||||||
|
|
||||||
|
myheader("test_mdev20261");
|
||||||
|
|
||||||
|
rc= mysql_query(mysql, "CREATE OR REPLACE TABLE t1 (f varchar(64)) ENGINE=MyISAM");
|
||||||
|
myquery(rc);
|
||||||
|
|
||||||
|
stmt= mysql_stmt_init(mysql);
|
||||||
|
check_stmt(stmt);
|
||||||
|
rc= mysql_stmt_prepare(stmt, query, strlen(query));
|
||||||
|
check_execute(stmt, rc);
|
||||||
|
|
||||||
|
verify_param_count(stmt, 1);
|
||||||
|
|
||||||
|
bzero((char*) param, sizeof(param));
|
||||||
|
|
||||||
|
param[0].buffer= &val;
|
||||||
|
param[0].buffer_type= MYSQL_TYPE_STRING;
|
||||||
|
param[0].is_null= &is_null;
|
||||||
|
|
||||||
|
rc= mysql_stmt_bind_param(stmt, param);
|
||||||
|
check_execute(stmt, rc);
|
||||||
|
|
||||||
|
rc= mysql_stmt_execute(stmt);
|
||||||
|
check_execute(stmt, rc);
|
||||||
|
|
||||||
|
rc= mysql_stmt_store_result(stmt);
|
||||||
|
check_execute(stmt, rc);
|
||||||
|
|
||||||
|
mysql_stmt_close(stmt);
|
||||||
|
|
||||||
|
rc= mysql_query(mysql, "DROP TABLE t1");
|
||||||
|
myquery(rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct my_tests_st my_tests[]= {
|
static struct my_tests_st my_tests[]= {
|
||||||
{ "disable_query_logs", disable_query_logs },
|
{ "disable_query_logs", disable_query_logs },
|
||||||
{ "test_view_sp_list_fields", test_view_sp_list_fields },
|
{ "test_view_sp_list_fields", test_view_sp_list_fields },
|
||||||
|
@ -21179,6 +21226,7 @@ static struct my_tests_st my_tests[]= {
|
||||||
#endif
|
#endif
|
||||||
{ "test_explain_meta", test_explain_meta },
|
{ "test_explain_meta", test_explain_meta },
|
||||||
{ "test_mdev18408", test_mdev18408 },
|
{ "test_mdev18408", test_mdev18408 },
|
||||||
|
{ "test_mdev20261", test_mdev20261 },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue