mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge branch '10.0-galera' into 10.1
This commit is contained in:
@@ -26,7 +26,7 @@ ENDIF()
|
||||
OPTION(WITH_WSREP "WSREP replication API (to use, e.g. Galera Replication library)" ${with_wsrep_default})
|
||||
|
||||
# Set the patch version
|
||||
SET(WSREP_PATCH_VERSION "23")
|
||||
SET(WSREP_PATCH_VERSION "24")
|
||||
|
||||
# Obtain wsrep API version
|
||||
FILE(STRINGS "${MySQL_SOURCE_DIR}/wsrep/wsrep_api.h" WSREP_API_VERSION
|
||||
|
@@ -139,8 +139,6 @@ my $opt_start_exit;
|
||||
my $start_only;
|
||||
my $file_wsrep_provider;
|
||||
|
||||
our @global_suppressions;
|
||||
|
||||
END {
|
||||
if ( defined $opt_tmpdir_pid and $opt_tmpdir_pid == $$ )
|
||||
{
|
||||
@@ -195,8 +193,6 @@ my @DEFAULT_SUITES= qw(
|
||||
sys_vars-
|
||||
unit-
|
||||
vcol-
|
||||
wsrep-
|
||||
galera-
|
||||
);
|
||||
my $opt_suites;
|
||||
|
||||
@@ -357,7 +353,6 @@ my $opt_max_test_fail= env_or_val(MTR_MAX_TEST_FAIL => 10);
|
||||
my $opt_core_on_failure= 0;
|
||||
|
||||
my $opt_parallel= $ENV{MTR_PARALLEL} || 1;
|
||||
my $opt_port_group_size = $ENV{MTR_PORT_GROUP_SIZE} || 20;
|
||||
|
||||
# lock file to stop tests
|
||||
my $opt_stop_file= $ENV{MTR_STOP_FILE};
|
||||
@@ -1118,7 +1113,6 @@ sub command_line_setup {
|
||||
# Specify ports
|
||||
'build-thread|mtr-build-thread=i' => \$opt_build_thread,
|
||||
'port-base|mtr-port-base=i' => \$opt_port_base,
|
||||
'port-group-size=s' => \$opt_port_group_size,
|
||||
|
||||
# Test case authoring
|
||||
'record' => \$opt_record,
|
||||
@@ -1824,16 +1818,16 @@ sub set_build_thread_ports($) {
|
||||
$ENV{MTR_BUILD_THREAD}= $build_thread;
|
||||
|
||||
# Calculate baseport
|
||||
$baseport= $build_thread * $opt_port_group_size + 10000;
|
||||
if ( $baseport < 5001 or $baseport + $opt_port_group_size >= 32767 )
|
||||
$baseport= $build_thread * 20 + 10000;
|
||||
if ( $baseport < 5001 or $baseport + 19 >= 32767 )
|
||||
{
|
||||
mtr_error("MTR_BUILD_THREAD number results in a port",
|
||||
"outside 5001 - 32767",
|
||||
"($baseport - $baseport + $opt_port_group_size)");
|
||||
"($baseport - $baseport + 19)");
|
||||
}
|
||||
|
||||
mtr_report("Using MTR_BUILD_THREAD $build_thread,",
|
||||
"with reserved ports $baseport..".($baseport+($opt_port_group_size-1)));
|
||||
"with reserved ports $baseport..".($baseport+19));
|
||||
|
||||
}
|
||||
|
||||
@@ -2994,8 +2988,8 @@ sub kill_leftovers ($) {
|
||||
sub check_ports_free ($)
|
||||
{
|
||||
my $bthread= shift;
|
||||
my $portbase = $bthread * $opt_port_group_size + 10000;
|
||||
for ($portbase..$portbase+($opt_port_group_size-1)){
|
||||
my $portbase = $bthread * 10 + 10000;
|
||||
for ($portbase..$portbase+9){
|
||||
if (mtr_ping_port($_)){
|
||||
mtr_report(" - 'localhost:$_' was not free");
|
||||
return 0; # One port was not free
|
||||
@@ -4407,7 +4401,6 @@ sub extract_warning_lines ($$) {
|
||||
# Perl code.
|
||||
my @antipatterns =
|
||||
(
|
||||
@global_suppressions,
|
||||
qr/error .*connecting to master/,
|
||||
qr/InnoDB: Error: in ALTER TABLE `test`.`t[12]`/,
|
||||
qr/InnoDB: Error: table `test`.`t[12]` .*does not exist in the InnoDB internal/,
|
||||
@@ -6117,8 +6110,6 @@ Options that specify ports
|
||||
build-thread=# Can be set in environment variable MTR_BUILD_THREAD.
|
||||
Set MTR_BUILD_THREAD="auto" to automatically aquire
|
||||
a build thread id that is unique to current host
|
||||
port-group-size=N Reserve groups of TCP ports of size N for each MTR thread
|
||||
|
||||
|
||||
Options for test case authoring
|
||||
|
||||
|
1908
mysql-test/r/alter_table.test
Normal file
1908
mysql-test/r/alter_table.test
Normal file
File diff suppressed because it is too large
Load Diff
2291
mysql-test/r/grant.test
Normal file
2291
mysql-test/r/grant.test
Normal file
File diff suppressed because it is too large
Load Diff
124
mysql-test/r/lowercase_fs_off.test
Normal file
124
mysql-test/r/lowercase_fs_off.test
Normal file
@@ -0,0 +1,124 @@
|
||||
#
|
||||
# Specific tests for case sensitive file systems
|
||||
# i.e. lower_case_filesystem=OFF
|
||||
#
|
||||
-- source include/have_case_sensitive_file_system.inc
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
connect (master,localhost,root,,);
|
||||
connection master;
|
||||
create database d1;
|
||||
grant all on d1.* to 'sample'@'localhost' identified by 'password';
|
||||
flush privileges;
|
||||
|
||||
connect (sample,localhost,sample,password,d1);
|
||||
connection sample;
|
||||
select database();
|
||||
--error ER_DBACCESS_DENIED_ERROR
|
||||
create database d2;
|
||||
--error ER_DBACCESS_DENIED_ERROR
|
||||
create database D1;
|
||||
disconnect sample;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
connection master;
|
||||
drop user 'sample'@'localhost';
|
||||
drop database if exists d1;
|
||||
disconnect master;
|
||||
--source include/wait_until_disconnected.inc
|
||||
connection default;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
# Bug#41049 does syntax "grant" case insensitive?
|
||||
#
|
||||
CREATE DATABASE d1;
|
||||
USE d1;
|
||||
CREATE TABLE T1(f1 INT);
|
||||
CREATE TABLE t1(f1 INT);
|
||||
GRANT SELECT ON T1 to user_1@localhost;
|
||||
|
||||
connect (con1,localhost,user_1,,d1);
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
select * from t1;
|
||||
select * from T1;
|
||||
connection default;
|
||||
GRANT SELECT ON t1 to user_1@localhost;
|
||||
connection con1;
|
||||
select * from information_schema.table_privileges;
|
||||
connection default;
|
||||
disconnect con1;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
DROP USER user_1@localhost;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
|
||||
CREATE DATABASE db1;
|
||||
USE db1;
|
||||
CREATE PROCEDURE p1() BEGIN END;
|
||||
CREATE FUNCTION f1(i INT) RETURNS INT RETURN i+1;
|
||||
|
||||
GRANT USAGE ON db1.* to user_1@localhost;
|
||||
GRANT EXECUTE ON PROCEDURE db1.P1 to user_1@localhost;
|
||||
GRANT EXECUTE ON FUNCTION db1.f1 to user_1@localhost;
|
||||
GRANT UPDATE ON db1.* to USER_1@localhost;
|
||||
|
||||
connect (con1,localhost,user_1,,db1);
|
||||
call p1();
|
||||
call P1();
|
||||
select f1(1);
|
||||
connect (con2,localhost,USER_1,,db1);
|
||||
--error ER_PROCACCESS_DENIED_ERROR
|
||||
call p1();
|
||||
--error ER_PROCACCESS_DENIED_ERROR
|
||||
call P1();
|
||||
--error ER_PROCACCESS_DENIED_ERROR
|
||||
select f1(1);
|
||||
|
||||
connection default;
|
||||
disconnect con1;
|
||||
disconnect con2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM USER_1@localhost;
|
||||
DROP FUNCTION f1;
|
||||
DROP PROCEDURE p1;
|
||||
DROP USER user_1@localhost;
|
||||
DROP USER USER_1@localhost;
|
||||
DROP DATABASE db1;
|
||||
use test;
|
||||
|
||||
# End of 5.0 tests
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Extra test coverage for Bug#56595 RENAME TABLE causes assert on OS X
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a INT);
|
||||
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW SET new.a= 1;
|
||||
RENAME TABLE t1 TO T1;
|
||||
ALTER TABLE T1 RENAME t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# MDEV-13912 mysql_upgrade: case (in)sensitivity for stored procedures
|
||||
#
|
||||
create database TEST;
|
||||
create procedure TEST.pr() begin end;
|
||||
create procedure test.pr() begin end;
|
||||
--exec $MYSQL_UPGRADE --force 2>&1
|
||||
drop procedure test.pr;
|
||||
drop database TEST;
|
||||
|
||||
# End of 5.5 tests
|
||||
|
||||
#
|
||||
# MDEV-9014 SHOW TRIGGERS not case sensitive
|
||||
#
|
||||
create table t1 (a int);
|
||||
create trigger t1_bi before insert on t1 for each row set new.a= 1;
|
||||
show triggers like '%T1%';
|
||||
drop table t1;
|
1069
mysql-test/r/sp-security.test
Normal file
1069
mysql-test/r/sp-security.test
Normal file
File diff suppressed because it is too large
Load Diff
417
mysql-test/r/type_float.test
Normal file
417
mysql-test/r/type_float.test
Normal file
@@ -0,0 +1,417 @@
|
||||
# Description
|
||||
# -----------
|
||||
# Numeric floating point.
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1,t2;
|
||||
--enable_warnings
|
||||
|
||||
SELECT 10,10.0,10.,.1e+2,100.0e-1;
|
||||
SELECT 6e-16, -6e-16, --6e-16, -6e-16+1.000000;
|
||||
SELECT 1e1,1.e1,1.0e1,1e+1,1.e+1,1.0e+1,1e-1,1.e-1,1.0e-1;
|
||||
SELECT 0.001e+1,0.001e-1, -0.001e+01,-0.001e-01;
|
||||
SELECT 123.23E+02,-123.23E-02,"123.23E+02"+0.0,"-123.23E-02"+0.0;
|
||||
SELECT 2147483647E+02,21474836.47E+06;
|
||||
|
||||
create table t1 (f1 float(24),f2 float(52));
|
||||
# We mask out Privileges column because it differs for embedded server
|
||||
--replace_column 8 #
|
||||
show full columns from t1;
|
||||
insert into t1 values(10,10),(1e+5,1e+5),(1234567890,1234567890),(1e+10,1e+10),(1e+15,1e+15),(1e+20,1e+20),(1e+50,1e+50),(1e+150,1e+150);
|
||||
insert into t1 values(-10,-10),(1e-5,1e-5),(1e-10,1e-10),(1e-15,1e-15),(1e-20,1e-20),(1e-50,1e-50),(1e-150,1e-150);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (datum double);
|
||||
insert into t1 values (0.5),(1.0),(1.5),(2.0),(2.5);
|
||||
select * from t1;
|
||||
select * from t1 where datum < 1.5;
|
||||
select * from t1 where datum > 1.5;
|
||||
select * from t1 where datum = 1.5;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a decimal(7,3) not null, key (a));
|
||||
insert into t1 values ("0"),("-0.00"),("-0.01"),("-0.002"),("1");
|
||||
select a from t1 order by a;
|
||||
select min(a) from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# BUG#3612, BUG#4393, BUG#4356, BUG#4394
|
||||
#
|
||||
|
||||
create table t1 (c1 double, c2 varchar(20));
|
||||
insert t1 values (121,"16");
|
||||
select c1 + c1 * (c2 / 100) as col from t1;
|
||||
create table t2 select c1 + c1 * (c2 / 100) as col1, round(c1, 5) as col2, round(c1, 35) as col3, sqrt(c1*1e-15) col4 from t1;
|
||||
# Floats are a bit different in PS
|
||||
--disable_ps_protocol
|
||||
select * from t2;
|
||||
--enable_ps_protocol
|
||||
show create table t2;
|
||||
drop table t1,t2;
|
||||
|
||||
# Bug #1022: When a table contains a 'float' field,
|
||||
# and one of the functions MAX, MIN, or AVG is used on that field,
|
||||
# the system crashes.
|
||||
|
||||
create table t1 (a float);
|
||||
insert into t1 values (1);
|
||||
select max(a),min(a),avg(a) from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# FLOAT/DOUBLE/DECIMAL handling
|
||||
#
|
||||
|
||||
create table t1 (f float, f2 float(24), f3 float(6,2), d double, d2 float(53), d3 double(10,3), de decimal, de2 decimal(6), de3 decimal(5,2), n numeric, n2 numeric(8), n3 numeric(7,6));
|
||||
# We mask out Privileges column because it differs for embedded server
|
||||
--replace_column 8 #
|
||||
show full columns from t1;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a decimal(7,3) not null, key (a));
|
||||
insert into t1 values ("0"),("-0.00"),("-0.01"),("-0.002"),("1");
|
||||
select a from t1 order by a;
|
||||
select min(a) from t1;
|
||||
drop table t1;
|
||||
|
||||
--error 1425
|
||||
create table t1 (a float(200,100), b double(200,100));
|
||||
|
||||
#
|
||||
# float in a char(1) field
|
||||
#
|
||||
create table t1 (c20 char);
|
||||
insert into t1 values (5000.0);
|
||||
insert into t1 values (0.5e4);
|
||||
drop table t1;
|
||||
|
||||
# Errors
|
||||
|
||||
--error 1063
|
||||
create table t1 (f float(54)); # Should give an error
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
# Don't allow 'double unsigned' to be set to a negative value (Bug #7700)
|
||||
create table t1 (d1 double, d2 double unsigned);
|
||||
insert into t1 set d1 = -1.0;
|
||||
update t1 set d2 = d1;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
# Ensure that maximum values as the result of number of decimals
|
||||
# being specified in table schema are enforced (Bug #7361)
|
||||
create table t1 (f float(4,3));
|
||||
insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11");
|
||||
select * from t1;
|
||||
drop table if exists t1;
|
||||
create table t1 (f double(4,3));
|
||||
insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11");
|
||||
select * from t1;
|
||||
drop table if exists t1;
|
||||
|
||||
# Check conversion of floats to character field (Bug #7774)
|
||||
create table t1 (c char(20));
|
||||
insert into t1 values (5e-28);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
create table t1 (c char(6));
|
||||
insert into t1 values (2e5),(2e6),(2e-4),(2e-5);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Test of comparison of integer with float-in-range (Bug #7840)
|
||||
# This is needed because some ODBC applications (like Foxpro) uses
|
||||
# floats for everything.
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (
|
||||
reckey int unsigned NOT NULL,
|
||||
recdesc varchar(50) NOT NULL,
|
||||
PRIMARY KEY (reckey)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
|
||||
INSERT INTO t1 VALUES (108, 'Has 108 as key');
|
||||
INSERT INTO t1 VALUES (109, 'Has 109 as key');
|
||||
select * from t1 where reckey=108;
|
||||
select * from t1 where reckey=1.08E2;
|
||||
select * from t1 where reckey=109;
|
||||
select * from t1 where reckey=1.09E2;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #13372 (decimal union)
|
||||
#
|
||||
create table t1 (d double(10,1));
|
||||
create table t2 (d double(10,9));
|
||||
insert into t1 values ("100000000.0");
|
||||
insert into t2 values ("1.23456780");
|
||||
create table t3 select * from t2 union select * from t1;
|
||||
select * from t3;
|
||||
show create table t3;
|
||||
drop table t1, t2, t3;
|
||||
|
||||
|
||||
#
|
||||
# Bug #9855 (inconsistent column type for create select
|
||||
#
|
||||
create table t1 select 105213674794682365.00 + 0.0 x;
|
||||
show warnings;
|
||||
desc t1;
|
||||
drop table t1;
|
||||
|
||||
create table t1 select 0.0 x;
|
||||
desc t1;
|
||||
create table t2 select 105213674794682365.00 y;
|
||||
desc t2;
|
||||
create table t3 select x+y a from t1,t2;
|
||||
show warnings;
|
||||
desc t3;
|
||||
drop table t1,t2,t3;
|
||||
|
||||
#
|
||||
# Bug #22129: A small double precision number becomes zero
|
||||
#
|
||||
# check if underflows are detected correctly
|
||||
select 1e-308, 1.00000001e-300, 100000000e-300;
|
||||
|
||||
# check if overflows are detected correctly
|
||||
select 10e307;
|
||||
|
||||
#
|
||||
# Bug #19690: ORDER BY eliminates rows from the result
|
||||
#
|
||||
create table t1(a int, b double(8, 2));
|
||||
insert into t1 values
|
||||
(1, 28.50), (1, 121.85), (1, 157.23), (1, 1351.00), (1, -1965.35), (1, 81.75),
|
||||
(1, 217.08), (1, 7.94), (4, 96.07), (4, 6404.65), (4, -6500.72), (2, 100.00),
|
||||
(5, 5.00), (5, -2104.80), (5, 2033.80), (5, 0.07), (5, 65.93),
|
||||
(3, -4986.24), (3, 5.00), (3, 4857.34), (3, 123.74), (3, 0.16),
|
||||
(6, -1695.31), (6, 1003.77), (6, 499.72), (6, 191.82);
|
||||
explain select sum(b) s from t1 group by a;
|
||||
select sum(b) s from t1 group by a;
|
||||
select sum(b) s from t1 group by a having s <> 0;
|
||||
select sum(b) s from t1 group by a having s <> 0 order by s;
|
||||
select sum(b) s from t1 group by a having s <=> 0;
|
||||
select sum(b) s from t1 group by a having s <=> 0 order by s;
|
||||
alter table t1 add key (a, b);
|
||||
explain select sum(b) s from t1 group by a;
|
||||
select sum(b) s from t1 group by a;
|
||||
select sum(b) s from t1 group by a having s <> 0;
|
||||
select sum(b) s from t1 group by a having s <> 0 order by s;
|
||||
select sum(b) s from t1 group by a having s <=> 0;
|
||||
select sum(b) s from t1 group by a having s <=> 0 order by s;
|
||||
drop table t1;
|
||||
|
||||
--echo End of 4.1 tests
|
||||
|
||||
#
|
||||
# bug #12694 (float(m,d) specifications)
|
||||
#
|
||||
|
||||
--error 1427
|
||||
create table t1 (s1 float(0,2));
|
||||
--error 1427
|
||||
create table t1 (s1 float(1,2));
|
||||
|
||||
#
|
||||
# MySQL Bugs: #11589: mysqltest --ps-protocol, strange output, float/double/real with zerofill
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (
|
||||
f1 real zerofill,
|
||||
f2 double zerofill,
|
||||
f3 float zerofill);
|
||||
INSERT INTO t1 VALUES ( 0.314152e+1, 0.314152e+1, 0.314152e+1);
|
||||
|
||||
let $my_stmt= select f1, f2, f3 FROM t1;
|
||||
eval PREPARE stmt1 FROM '$my_stmt';
|
||||
select f1, f2, f3 FROM t1;
|
||||
eval $my_stmt;
|
||||
EXECUTE stmt1;
|
||||
|
||||
DROP TABLE t1;
|
||||
# Bug #28121 "INSERT or UPDATE into DOUBLE(200,0) field being truncated to 31 digits"
|
||||
#
|
||||
|
||||
create table t1 (f1 double(200, 0));
|
||||
insert into t1 values (1e199), (-1e199);
|
||||
insert into t1 values (1e200), (-1e200);
|
||||
insert into t1 values (2e200), (-2e200);
|
||||
select f1 + 0e0 from t1;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (f1 float(30, 0));
|
||||
insert into t1 values (1e29), (-1e29);
|
||||
insert into t1 values (1e30), (-1e30);
|
||||
insert into t1 values (2e30), (-2e30);
|
||||
select f1 + 0e0 from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #12860 "Difference in zero padding of exponent between Unix and Windows"
|
||||
#
|
||||
|
||||
create table t1 (c char(6));
|
||||
insert into t1 values (2e6),(2e-5);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #21497 "DOUBLE truncated to unusable value"
|
||||
#
|
||||
|
||||
CREATE TABLE d1 (d DOUBLE);
|
||||
INSERT INTO d1 VALUES (1.7976931348623157E+308);
|
||||
SELECT * FROM d1;
|
||||
--error ER_ILLEGAL_VALUE_FOR_TYPE
|
||||
INSERT INTO d1 VALUES (1.79769313486232e+308);
|
||||
SELECT * FROM d1;
|
||||
DROP TABLE d1;
|
||||
|
||||
#
|
||||
# Bug #26788 "mysqld (debug) aborts when inserting specific numbers into char
|
||||
# fields"
|
||||
#
|
||||
|
||||
create table t1 (a char(20));
|
||||
insert into t1 values (1.225e-05);
|
||||
select a+0 from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #27483: Casting 'scientific notation type' to 'unsigned bigint' fails on
|
||||
# windows.
|
||||
#
|
||||
|
||||
create table t1(d double, u bigint unsigned);
|
||||
|
||||
insert into t1(d) values (9.22337203685479e18),
|
||||
(1.84e19);
|
||||
|
||||
update t1 set u = d;
|
||||
select u from t1;
|
||||
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #21205: Different number of digits for float/doble/real in --ps-protocol
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (f1 DOUBLE);
|
||||
INSERT INTO t1 VALUES(-1.79769313486231e+308);
|
||||
SELECT f1 FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#12406055 BUFFER OVERFLOW OF VARIABLE 'BUFF' IN STRING::SET_REAL
|
||||
--echo #
|
||||
|
||||
--echo # Ignoring output from misc. float operations
|
||||
--disable_result_log
|
||||
|
||||
let $nine_65=
|
||||
99999999999999999999999999999999999999999999999999999999999999999;
|
||||
|
||||
select format(-1.7976931348623157E+307,256) as foo;
|
||||
select least(-1.1111111111111111111111111,
|
||||
- group_concat(1.7976931348623157E+308)) as foo;
|
||||
eval select concat((truncate((-1.7976931348623157E+307),(0x1e))),
|
||||
($nine_65)) into @a;
|
||||
--enable_result_log
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
--echo #
|
||||
--echo # Bug#12368853 FORMAT() CRASHES WITH LARGE NUMBERS AFTER TRUNCATE...
|
||||
--echo #
|
||||
|
||||
select format(truncate('1.7976931348623157E+308',-12),1,'fr_BE') as foo;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17249 MAKETIME(-1e50,0,0) returns a wrong result
|
||||
--echo #
|
||||
|
||||
SELECT LEFT('a',EXP(50));
|
||||
SELECT LEFT('a', COALESCE(1e30));
|
||||
|
||||
CREATE TABLE t1 (a FLOAT);
|
||||
INSERT INTO t1 VALUES (1e30);
|
||||
SELECT LEFT('a',a), LEFT('a',1e30) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
PREPARE stmt FROM 'SELECT LEFT(111,?)';
|
||||
SET @a=1e30;
|
||||
EXECUTE stmt USING @a;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
SELECT LEFT('a',(SELECT 1e30 FROM t1 LIMIT 1));
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (a DOUBLE);
|
||||
INSERT INTO t1 VALUES (1e30),(0);
|
||||
SELECT LEFT('a', SUM(a)) FROM t1;
|
||||
SELECT LEFT('a', AVG(a)) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug #13500371 63704: CONVERSION OF '1.' TO A NUMBER GIVES ERROR 1265
|
||||
--echo # (WARN_DATA_TRUNCATED)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (f FLOAT);
|
||||
INSERT INTO t1 VALUES ('1.');
|
||||
INSERT INTO t1 VALUES ('2.0.');
|
||||
INSERT INTO t1 VALUES ('.');
|
||||
SELECT * FROM t1 ORDER BY f;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Start of 10.0 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-6950 Bad results with joins comparing DATE/DATETIME and INT/DECIMAL/DOUBLE/ENUM/VARCHAR columns
|
||||
--echo #
|
||||
CREATE TABLE t1 (a DATETIME PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES ('1999-01-01 00:00:00');
|
||||
CREATE TABLE t2 (a DOUBLE);
|
||||
INSERT INTO t2 VALUES (19990101000000);
|
||||
INSERT INTO t2 VALUES (990101000000);
|
||||
SELECT t1.* FROM t1,t2 WHERE t1.a=t2.a;
|
||||
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.a=t2.a;
|
||||
ALTER TABLE t2 ADD PRIMARY KEY(a);
|
||||
SELECT t1.* FROM t1,t2 WHERE t1.a=t2.a;
|
||||
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.a=t2.a;
|
||||
--echo # t2 should NOT be eliminated
|
||||
EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.a=t2.a;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-6971 Bad results with joins comparing TIME and DOUBLE/DECIMAL columns
|
||||
--echo #
|
||||
CREATE TABLE t1 (a TIME(6) PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES ('10:20:30');
|
||||
CREATE TABLE t2 (a DOUBLE);
|
||||
INSERT INTO t2 VALUES (102030),(102030.000000001);
|
||||
SELECT t1.* FROM t1 JOIN t2 USING(a);
|
||||
SELECT t1.* FROM t1 LEFT JOIN t2 USING(a);
|
||||
ALTER TABLE t2 ADD PRIMARY KEY(a);
|
||||
SELECT t1.* FROM t1 JOIN t2 USING(a);
|
||||
SELECT t1.* FROM t1 LEFT JOIN t2 USING(a);
|
||||
--echo # t2 should NOT be elimitated
|
||||
EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 USING(a);
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.0 tests
|
||||
--echo #
|
@@ -10,5 +10,6 @@ there should be *no* long test name listed below:
|
||||
select distinct variable_name as `there should be *no* variables listed below:` from t2
|
||||
left join t1 on variable_name=test_name where test_name is null;
|
||||
there should be *no* variables listed below:
|
||||
wsrep_certification_rules
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
|
@@ -29,6 +29,20 @@ NUMERIC_BLOCK_SIZE NULL
|
||||
ENUM_VALUE_LIST OFF,ON
|
||||
READ_ONLY NO
|
||||
COMMAND_LINE_ARGUMENT OPTIONAL
|
||||
VARIABLE_NAME WSREP_CERTIFICATION_RULES
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE strict
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE strict
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE ENUM
|
||||
VARIABLE_COMMENT Certification rules to use in the cluster. Possible values are: "strict": stricter rules that could result in more certification failures. "optimized": relaxed rules that allow more concurrency and cause less certification failures.
|
||||
NUMERIC_MIN_VALUE NULL
|
||||
NUMERIC_MAX_VALUE NULL
|
||||
NUMERIC_BLOCK_SIZE NULL
|
||||
ENUM_VALUE_LIST strict,optimized
|
||||
READ_ONLY NO
|
||||
COMMAND_LINE_ARGUMENT REQUIRED
|
||||
VARIABLE_NAME WSREP_CERTIFY_NONPK
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE ON
|
||||
|
@@ -4439,6 +4439,22 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
|
||||
else
|
||||
thd->variables.collation_database= thd->db_charset;
|
||||
|
||||
{
|
||||
const CHARSET_INFO *cs= thd->charset();
|
||||
/*
|
||||
We cannot ask for parsing a statement using a character set
|
||||
without state_maps (parser internal data).
|
||||
*/
|
||||
if (!cs->state_map)
|
||||
{
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
"character_set cannot be parsed");
|
||||
thd->is_slave_error= true;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Record any GTID in the same transaction, so slave state is
|
||||
transactionally consistent.
|
||||
@@ -7943,6 +7959,11 @@ User_var_log_event(const char* buf, uint event_len,
|
||||
we keep the flags set to UNDEF_F.
|
||||
*/
|
||||
uint bytes_read= ((val + val_len) - buf_start);
|
||||
if (bytes_read > event_len)
|
||||
{
|
||||
error= true;
|
||||
goto err;
|
||||
}
|
||||
if ((data_written - bytes_read) > 0)
|
||||
{
|
||||
flags= (uint) *(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE +
|
||||
|
@@ -4940,6 +4940,19 @@ static Sys_var_mybool Sys_wsrep_certify_nonPK(
|
||||
GLOBAL_VAR(wsrep_certify_nonPK),
|
||||
CMD_LINE(OPT_ARG), DEFAULT(TRUE));
|
||||
|
||||
static const char *wsrep_certification_rules_names[]= { "strict", "optimized", NullS };
|
||||
static Sys_var_enum Sys_wsrep_certification_rules(
|
||||
"wsrep_certification_rules",
|
||||
"Certification rules to use in the cluster. Possible values are: "
|
||||
"\"strict\": stricter rules that could result in more certification "
|
||||
"failures. "
|
||||
"\"optimized\": relaxed rules that allow more concurrency and "
|
||||
"cause less certification failures.",
|
||||
GLOBAL_VAR(wsrep_certification_rules), CMD_LINE(REQUIRED_ARG),
|
||||
wsrep_certification_rules_names, DEFAULT(WSREP_CERTIFICATION_RULES_STRICT),
|
||||
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0),
|
||||
ON_UPDATE(0));
|
||||
|
||||
static Sys_var_mybool Sys_wsrep_causal_reads(
|
||||
"wsrep_causal_reads", "Setting this variable is equivalent "
|
||||
"to setting wsrep_sync_wait READ flag",
|
||||
|
@@ -77,6 +77,7 @@ ulong wsrep_max_ws_size = 1073741824UL;//max ws (RBR buffer) size
|
||||
ulong wsrep_max_ws_rows = 65536; // max number of rows in ws
|
||||
int wsrep_to_isolation = 0; // # of active TO isolation threads
|
||||
my_bool wsrep_certify_nonPK = 1; // certify, even when no primary key
|
||||
ulong wsrep_certification_rules = WSREP_CERTIFICATION_RULES_STRICT;
|
||||
long wsrep_max_protocol_version = 3; // maximum protocol version to use
|
||||
ulong wsrep_forced_binlog_format = BINLOG_FORMAT_UNSPEC;
|
||||
my_bool wsrep_recovery = 0; // recovery
|
||||
|
@@ -30,6 +30,7 @@ typedef struct st_mysql_show_var SHOW_VAR;
|
||||
#include "mdl.h"
|
||||
#include "mysqld.h"
|
||||
#include "sql_table.h"
|
||||
#include "wsrep_mysqld_c.h"
|
||||
|
||||
#define WSREP_UNDEFINED_TRX_ID ULONGLONG_MAX
|
||||
|
||||
|
26
sql/wsrep_mysqld_c.h
Normal file
26
sql/wsrep_mysqld_c.h
Normal file
@@ -0,0 +1,26 @@
|
||||
/* Copyright 2018-2018 Codership Oy <http://www.codership.com>
|
||||
|
||||
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 Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifndef WSREP_MYSQLD_C_H
|
||||
#define WSREP_MYSQLD_C_H
|
||||
|
||||
enum enum_wsrep_certification_rules {
|
||||
WSREP_CERTIFICATION_RULES_STRICT,
|
||||
WSREP_CERTIFICATION_RULES_OPTIMIZED
|
||||
};
|
||||
|
||||
extern ulong wsrep_certification_rules;
|
||||
|
||||
#endif /* WSREP_MYSQLD_C_H */
|
@@ -112,6 +112,7 @@ MYSQL_PLUGIN_IMPORT extern char mysql_unpacked_real_data_home[];
|
||||
#include "fts0priv.h"
|
||||
#include "page0zip.h"
|
||||
#include "fil0pagecompress.h"
|
||||
#include "dict0priv.h"
|
||||
|
||||
#define thd_get_trx_isolation(X) ((enum_tx_isolation)thd_tx_isolation(X))
|
||||
|
||||
@@ -134,7 +135,7 @@ MYSQL_PLUGIN_IMPORT extern char mysql_unpacked_real_data_home[];
|
||||
# endif /* MYSQL_PLUGIN_IMPORT */
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
#include "dict0priv.h"
|
||||
#include "../../../wsrep/wsrep_api.h"
|
||||
#include "../storage/innobase/include/ut0byte.h"
|
||||
#include <mysql/service_md5.h>
|
||||
|
||||
@@ -8449,7 +8450,8 @@ report_error:
|
||||
&& wsrep_thd_exec_mode(user_thd) == LOCAL_STATE
|
||||
&& !wsrep_consistency_check(user_thd)
|
||||
&& !wsrep_thd_ignore_table(user_thd)) {
|
||||
if (wsrep_append_keys(user_thd, false, record, NULL)) {
|
||||
if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, record,
|
||||
NULL)) {
|
||||
DBUG_PRINT("wsrep", ("row key failed"));
|
||||
error_result = HA_ERR_INTERNAL_ERROR;
|
||||
goto wsrep_error;
|
||||
@@ -8972,7 +8974,8 @@ func_exit:
|
||||
{
|
||||
DBUG_PRINT("wsrep", ("update row key"));
|
||||
|
||||
if (wsrep_append_keys(user_thd, false, old_row, new_row)) {
|
||||
if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, old_row,
|
||||
new_row)) {
|
||||
WSREP_DEBUG("WSREP: UPDATE_ROW_KEY FAILED");
|
||||
DBUG_PRINT("wsrep", ("row key failed"));
|
||||
err = HA_ERR_INTERNAL_ERROR;
|
||||
@@ -9036,7 +9039,8 @@ ha_innobase::delete_row(
|
||||
wsrep_on(user_thd) &&
|
||||
!wsrep_thd_ignore_table(user_thd))
|
||||
{
|
||||
if (wsrep_append_keys(user_thd, false, record, NULL)) {
|
||||
if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, record,
|
||||
NULL)) {
|
||||
DBUG_PRINT("wsrep", ("delete fail"));
|
||||
error = (dberr_t) HA_ERR_INTERNAL_ERROR;
|
||||
goto wsrep_error;
|
||||
@@ -10282,8 +10286,22 @@ wsrep_dict_foreign_find_index(
|
||||
ibool check_charsets,
|
||||
ulint check_null);
|
||||
|
||||
inline
|
||||
const char*
|
||||
wsrep_key_type_to_str(wsrep_key_type type)
|
||||
{
|
||||
switch (type) {
|
||||
case WSREP_KEY_SHARED:
|
||||
return "shared";
|
||||
case WSREP_KEY_SEMI:
|
||||
return "semi";
|
||||
case WSREP_KEY_EXCLUSIVE:
|
||||
return "exclusive";
|
||||
};
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
extern dberr_t
|
||||
ulint
|
||||
wsrep_append_foreign_key(
|
||||
/*===========================*/
|
||||
trx_t* trx, /*!< in: trx */
|
||||
@@ -10291,7 +10309,8 @@ wsrep_append_foreign_key(
|
||||
const rec_t* rec, /*!<in: clustered index record */
|
||||
dict_index_t* index, /*!<in: clustered index */
|
||||
ibool referenced, /*!<in: is check for referenced table */
|
||||
ibool shared) /*!<in: is shared access */
|
||||
wsrep_key_type key_type) /*!< in: access type of this key
|
||||
(shared, exclusive, semi...) */
|
||||
{
|
||||
ut_a(trx);
|
||||
THD* thd = (THD*)trx->mysql_thd;
|
||||
@@ -10389,10 +10408,11 @@ wsrep_append_foreign_key(
|
||||
rcode = wsrep_rec_get_foreign_key(
|
||||
&key[1], &len, rec, index, idx,
|
||||
wsrep_protocol_version > 1);
|
||||
|
||||
if (rcode != DB_SUCCESS) {
|
||||
WSREP_ERROR(
|
||||
"FK key set failed: %lu (%lu %lu), index: %s %s, %s",
|
||||
rcode, referenced, shared,
|
||||
"FK key set failed: %lu (%lu %s), index: %s %s, %s",
|
||||
rcode, referenced, wsrep_key_type_to_str(key_type),
|
||||
(index && index->name) ? index->name :
|
||||
"void index",
|
||||
(index && index->table_name) ? index->table_name :
|
||||
@@ -10400,6 +10420,7 @@ wsrep_append_foreign_key(
|
||||
wsrep_thd_query(thd));
|
||||
return DB_ERROR;
|
||||
}
|
||||
|
||||
strncpy(cache_key,
|
||||
(wsrep_protocol_version > 1) ?
|
||||
((referenced) ?
|
||||
@@ -10444,7 +10465,7 @@ wsrep_append_foreign_key(
|
||||
wsrep_ws_handle(thd, trx),
|
||||
&wkey,
|
||||
1,
|
||||
shared ? WSREP_KEY_SHARED : WSREP_KEY_EXCLUSIVE,
|
||||
key_type,
|
||||
copy);
|
||||
if (rcode) {
|
||||
DBUG_PRINT("wsrep", ("row key failed: %zu", rcode));
|
||||
@@ -10466,15 +10487,16 @@ wsrep_append_key(
|
||||
TABLE *table,
|
||||
const char* key,
|
||||
uint16_t key_len,
|
||||
bool shared
|
||||
wsrep_key_type key_type /*!< in: access type of this key
|
||||
(shared, exclusive, semi...) */
|
||||
)
|
||||
{
|
||||
DBUG_ENTER("wsrep_append_key");
|
||||
bool const copy = true;
|
||||
#ifdef WSREP_DEBUG_PRINT
|
||||
fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s\n Query: %s ",
|
||||
(shared) ? "Shared" : "Exclusive",
|
||||
thd_get_thread_id(thd), (long long)trx->id, key_len,
|
||||
wsrep_key_type_to_str(key_type),
|
||||
wsrep_thd_thread_id(thd), trx->id, key_len,
|
||||
table_share->table_name.str, wsrep_thd_query(thd));
|
||||
for (int i=0; i<key_len; i++) {
|
||||
fprintf(stderr, "%hhX, ", key[i]);
|
||||
@@ -10501,7 +10523,7 @@ wsrep_append_key(
|
||||
wsrep_ws_handle(thd, trx),
|
||||
&wkey,
|
||||
1,
|
||||
shared ? WSREP_KEY_SHARED : WSREP_KEY_EXCLUSIVE,
|
||||
key_type,
|
||||
copy);
|
||||
if (rcode) {
|
||||
DBUG_PRINT("wsrep", ("row key failed: %d", rcode));
|
||||
@@ -10538,7 +10560,8 @@ int
|
||||
ha_innobase::wsrep_append_keys(
|
||||
/*==================*/
|
||||
THD *thd,
|
||||
bool shared,
|
||||
wsrep_key_type key_type, /*!< in: access type of this key
|
||||
(shared, exclusive, semi...) */
|
||||
const uchar* record0, /* in: row in MySQL format */
|
||||
const uchar* record1) /* in: row in MySQL format */
|
||||
{
|
||||
@@ -10570,7 +10593,7 @@ ha_innobase::wsrep_append_keys(
|
||||
if (!is_null) {
|
||||
rcode = wsrep_append_key(
|
||||
thd, trx, table_share, table, keyval,
|
||||
len, shared);
|
||||
len, key_type);
|
||||
if (rcode) DBUG_RETURN(rcode);
|
||||
}
|
||||
else
|
||||
@@ -10623,10 +10646,11 @@ ha_innobase::wsrep_append_keys(
|
||||
if (!is_null) {
|
||||
rcode = wsrep_append_key(
|
||||
thd, trx, table_share, table,
|
||||
keyval0, len+1, shared);
|
||||
keyval0, len+1, key_type);
|
||||
if (rcode) DBUG_RETURN(rcode);
|
||||
|
||||
if (key_info->flags & HA_NOSAME || shared)
|
||||
if (key_info->flags & HA_NOSAME ||
|
||||
key_type == WSREP_KEY_SHARED)
|
||||
key_appended = true;
|
||||
}
|
||||
else
|
||||
@@ -10643,7 +10667,7 @@ ha_innobase::wsrep_append_keys(
|
||||
rcode = wsrep_append_key(
|
||||
thd, trx, table_share,
|
||||
table,
|
||||
keyval1, len+1, shared);
|
||||
keyval1, len+1, key_type);
|
||||
if (rcode) DBUG_RETURN(rcode);
|
||||
}
|
||||
}
|
||||
@@ -10659,7 +10683,7 @@ ha_innobase::wsrep_append_keys(
|
||||
wsrep_calc_row_hash(digest, record0, table, prebuilt, thd);
|
||||
if ((rcode = wsrep_append_key(thd, trx, table_share, table,
|
||||
(const char*) digest, 16,
|
||||
shared))) {
|
||||
key_type))) {
|
||||
DBUG_RETURN(rcode);
|
||||
}
|
||||
|
||||
@@ -10669,7 +10693,7 @@ ha_innobase::wsrep_append_keys(
|
||||
if ((rcode = wsrep_append_key(thd, trx, table_share,
|
||||
table,
|
||||
(const char*) digest,
|
||||
16, shared))) {
|
||||
16, key_type))) {
|
||||
DBUG_RETURN(rcode);
|
||||
}
|
||||
}
|
||||
|
@@ -26,6 +26,10 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
||||
|
||||
#include "dict0stats.h"
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
#include "../../../wsrep/wsrep_api.h"
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/* Structure defines translation table between mysql index and innodb
|
||||
index structures */
|
||||
struct innodb_idx_translate_t {
|
||||
@@ -115,7 +119,7 @@ class ha_innobase: public handler
|
||||
dict_index_t* innobase_get_index(uint keynr);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
int wsrep_append_keys(THD *thd, bool shared,
|
||||
int wsrep_append_keys(THD *thd, wsrep_key_type key_type,
|
||||
const uchar* record0, const uchar* record1);
|
||||
#endif
|
||||
/* Init values for the class: */
|
||||
|
@@ -55,6 +55,11 @@ Created 4/20/1996 Heikki Tuuri
|
||||
#include "fts0types.h"
|
||||
#include "m_string.h"
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
#include "../../../wsrep/wsrep_api.h"
|
||||
#include "wsrep_mysqld_c.h"
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/*************************************************************************
|
||||
IMPORTANT NOTE: Any operation that generates redo MUST check that there
|
||||
is enough space in the redo log before for that operation. This is
|
||||
@@ -937,7 +942,7 @@ dberr_t wsrep_append_foreign_key(trx_t *trx,
|
||||
const rec_t* clust_rec,
|
||||
dict_index_t* clust_index,
|
||||
ibool referenced,
|
||||
ibool shared);
|
||||
enum wsrep_key_type key_type);
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/*********************************************************************//**
|
||||
@@ -1296,7 +1301,7 @@ row_ins_foreign_check_on_constraint(
|
||||
foreign,
|
||||
clust_rec,
|
||||
clust_index,
|
||||
FALSE, FALSE);
|
||||
FALSE, WSREP_KEY_EXCLUSIVE);
|
||||
if (err != DB_SUCCESS) {
|
||||
fprintf(stderr,
|
||||
"WSREP: foreign key append failed: %d\n", err);
|
||||
@@ -1638,16 +1643,34 @@ run_again:
|
||||
}
|
||||
|
||||
if (check_ref) {
|
||||
err = DB_SUCCESS;
|
||||
#ifdef WITH_WSREP
|
||||
enum wsrep_key_type key_type = WSREP_KEY_EXCLUSIVE;
|
||||
#endif WITH_WSREP
|
||||
err = DB_SUCCESS;
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (upd_node != NULL) {
|
||||
key_type = WSREP_KEY_SHARED;
|
||||
} else {
|
||||
switch (wsrep_certification_rules) {
|
||||
case WSREP_CERTIFICATION_RULES_STRICT:
|
||||
key_type = WSREP_KEY_EXCLUSIVE;
|
||||
break;
|
||||
case WSREP_CERTIFICATION_RULES_OPTIMIZED:
|
||||
key_type = WSREP_KEY_SEMI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
err = wsrep_append_foreign_key(
|
||||
thr_get_trx(thr),
|
||||
foreign,
|
||||
rec,
|
||||
check_index,
|
||||
check_ref,
|
||||
(upd_node) ? TRUE : FALSE);
|
||||
#endif /* WITH_WSREP */
|
||||
key_type);
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
goto end_scan;
|
||||
} else if (foreign->type != 0) {
|
||||
/* There is an ON UPDATE or ON DELETE
|
||||
|
@@ -110,6 +110,7 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "fts0priv.h"
|
||||
#include "page0zip.h"
|
||||
#include "fil0pagecompress.h"
|
||||
#include "dict0priv.h"
|
||||
|
||||
#define thd_get_trx_isolation(X) ((enum_tx_isolation)thd_tx_isolation(X))
|
||||
|
||||
@@ -133,7 +134,7 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# endif /* MYSQL_PLUGIN_IMPORT */
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
#include "dict0priv.h"
|
||||
#include "../../../wsrep/wsrep_api.h"
|
||||
#include "../storage/innobase/include/ut0byte.h"
|
||||
#include <mysql/service_md5.h>
|
||||
|
||||
@@ -8894,6 +8895,7 @@ no_commit:
|
||||
error = row_insert_for_mysql((byte*) record, prebuilt);
|
||||
DEBUG_SYNC(user_thd, "ib_after_row_insert");
|
||||
|
||||
|
||||
/* Handle duplicate key errors */
|
||||
if (auto_inc_used) {
|
||||
ulonglong auto_inc;
|
||||
@@ -9035,7 +9037,7 @@ report_error:
|
||||
&& wsrep_thd_exec_mode(user_thd) == LOCAL_STATE
|
||||
&& !wsrep_consistency_check(user_thd)
|
||||
&& !wsrep_thd_ignore_table(user_thd)) {
|
||||
if (wsrep_append_keys(user_thd, false, record, NULL)) {
|
||||
if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, record, NULL)) {
|
||||
DBUG_PRINT("wsrep", ("row key failed"));
|
||||
error_result = HA_ERR_INTERNAL_ERROR;
|
||||
goto wsrep_error;
|
||||
@@ -9556,7 +9558,8 @@ func_exit:
|
||||
{
|
||||
DBUG_PRINT("wsrep", ("update row key"));
|
||||
|
||||
if (wsrep_append_keys(user_thd, false, old_row, new_row)) {
|
||||
if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, old_row,
|
||||
new_row)) {
|
||||
WSREP_DEBUG("WSREP: UPDATE_ROW_KEY FAILED");
|
||||
DBUG_PRINT("wsrep", ("row key failed"));
|
||||
err = HA_ERR_INTERNAL_ERROR;
|
||||
@@ -9619,7 +9622,8 @@ ha_innobase::delete_row(
|
||||
wsrep_on(user_thd) &&
|
||||
!wsrep_thd_ignore_table(user_thd))
|
||||
{
|
||||
if (wsrep_append_keys(user_thd, false, record, NULL)) {
|
||||
if (wsrep_append_keys(user_thd, WSREP_KEY_EXCLUSIVE, record,
|
||||
NULL)) {
|
||||
DBUG_PRINT("wsrep", ("delete fail"));
|
||||
error = (dberr_t) HA_ERR_INTERNAL_ERROR;
|
||||
goto wsrep_error;
|
||||
@@ -10850,8 +10854,22 @@ wsrep_dict_foreign_find_index(
|
||||
ibool check_charsets,
|
||||
ulint check_null);
|
||||
|
||||
inline
|
||||
const char*
|
||||
wsrep_key_type_to_str(wsrep_key_type type)
|
||||
{
|
||||
switch (type) {
|
||||
case WSREP_KEY_SHARED:
|
||||
return "shared";
|
||||
case WSREP_KEY_SEMI:
|
||||
return "semi";
|
||||
case WSREP_KEY_EXCLUSIVE:
|
||||
return "exclusive";
|
||||
};
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
extern dberr_t
|
||||
ulint
|
||||
wsrep_append_foreign_key(
|
||||
/*===========================*/
|
||||
trx_t* trx, /*!< in: trx */
|
||||
@@ -10859,7 +10877,8 @@ wsrep_append_foreign_key(
|
||||
const rec_t* rec, /*!<in: clustered index record */
|
||||
dict_index_t* index, /*!<in: clustered index */
|
||||
ibool referenced, /*!<in: is check for referenced table */
|
||||
ibool shared) /*!<in: is shared access */
|
||||
wsrep_key_type key_type) /*!< in: access type of this key
|
||||
(shared, exclusive, semi...) */
|
||||
{
|
||||
ut_a(trx);
|
||||
THD* thd = (THD*)trx->mysql_thd;
|
||||
@@ -10957,10 +10976,11 @@ wsrep_append_foreign_key(
|
||||
rcode = wsrep_rec_get_foreign_key(
|
||||
&key[1], &len, rec, index, idx,
|
||||
wsrep_protocol_version > 1);
|
||||
|
||||
if (rcode != DB_SUCCESS) {
|
||||
WSREP_ERROR(
|
||||
"FK key set failed: %lu (%lu %lu), index: %s %s, %s",
|
||||
rcode, referenced, shared,
|
||||
"FK key set failed: %lu (%lu %s), index: %s %s, %s",
|
||||
rcode, referenced, wsrep_key_type_to_str(key_type),
|
||||
(index && index->name) ? index->name :
|
||||
"void index",
|
||||
(index && index->table_name) ? index->table_name :
|
||||
@@ -10968,6 +10988,7 @@ wsrep_append_foreign_key(
|
||||
wsrep_thd_query(thd));
|
||||
return DB_ERROR;
|
||||
}
|
||||
|
||||
strncpy(cache_key,
|
||||
(wsrep_protocol_version > 1) ?
|
||||
((referenced) ?
|
||||
@@ -11012,7 +11033,7 @@ wsrep_append_foreign_key(
|
||||
wsrep_ws_handle(thd, trx),
|
||||
&wkey,
|
||||
1,
|
||||
shared ? WSREP_KEY_SHARED : WSREP_KEY_EXCLUSIVE,
|
||||
key_type,
|
||||
copy);
|
||||
if (rcode) {
|
||||
DBUG_PRINT("wsrep", ("row key failed: %zu", rcode));
|
||||
@@ -11034,14 +11055,15 @@ wsrep_append_key(
|
||||
TABLE *table,
|
||||
const char* key,
|
||||
uint16_t key_len,
|
||||
bool shared
|
||||
wsrep_key_type key_type /*!< in: access type of this key
|
||||
(shared, exclusive, semi...) */
|
||||
)
|
||||
{
|
||||
DBUG_ENTER("wsrep_append_key");
|
||||
bool const copy = true;
|
||||
#ifdef WSREP_DEBUG_PRINT
|
||||
fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s\n Query: %s ",
|
||||
(shared) ? "Shared" : "Exclusive",
|
||||
wsrep_key_type_to_str(key_type),
|
||||
thd_get_thread_id(thd), (long long)trx->id, key_len,
|
||||
table_share->table_name.str, wsrep_thd_query(thd));
|
||||
for (int i=0; i<key_len; i++) {
|
||||
@@ -11069,7 +11091,7 @@ wsrep_append_key(
|
||||
wsrep_ws_handle(thd, trx),
|
||||
&wkey,
|
||||
1,
|
||||
shared ? WSREP_KEY_SHARED : WSREP_KEY_EXCLUSIVE,
|
||||
key_type,
|
||||
copy);
|
||||
if (rcode) {
|
||||
DBUG_PRINT("wsrep", ("row key failed: %d", rcode));
|
||||
@@ -11106,7 +11128,8 @@ int
|
||||
ha_innobase::wsrep_append_keys(
|
||||
/*==================*/
|
||||
THD *thd,
|
||||
bool shared,
|
||||
wsrep_key_type key_type, /*!< in: access type of this key
|
||||
(shared, exclusive, semi...) */
|
||||
const uchar* record0, /* in: row in MySQL format */
|
||||
const uchar* record1) /* in: row in MySQL format */
|
||||
{
|
||||
@@ -11138,7 +11161,7 @@ ha_innobase::wsrep_append_keys(
|
||||
if (!is_null) {
|
||||
rcode = wsrep_append_key(
|
||||
thd, trx, table_share, table, keyval,
|
||||
len, shared);
|
||||
len, key_type);
|
||||
if (rcode) DBUG_RETURN(rcode);
|
||||
}
|
||||
else
|
||||
@@ -11191,10 +11214,11 @@ ha_innobase::wsrep_append_keys(
|
||||
if (!is_null) {
|
||||
rcode = wsrep_append_key(
|
||||
thd, trx, table_share, table,
|
||||
keyval0, len+1, shared);
|
||||
keyval0, len+1, key_type);
|
||||
if (rcode) DBUG_RETURN(rcode);
|
||||
|
||||
if (key_info->flags & HA_NOSAME || shared)
|
||||
if (key_info->flags & HA_NOSAME ||
|
||||
key_type == WSREP_KEY_SHARED)
|
||||
key_appended = true;
|
||||
}
|
||||
else
|
||||
@@ -11211,7 +11235,7 @@ ha_innobase::wsrep_append_keys(
|
||||
rcode = wsrep_append_key(
|
||||
thd, trx, table_share,
|
||||
table,
|
||||
keyval1, len+1, shared);
|
||||
keyval1, len+1, key_type);
|
||||
if (rcode) DBUG_RETURN(rcode);
|
||||
}
|
||||
}
|
||||
@@ -11227,7 +11251,7 @@ ha_innobase::wsrep_append_keys(
|
||||
wsrep_calc_row_hash(digest, record0, table, prebuilt, thd);
|
||||
if ((rcode = wsrep_append_key(thd, trx, table_share, table,
|
||||
(const char*) digest, 16,
|
||||
shared))) {
|
||||
key_type))) {
|
||||
DBUG_RETURN(rcode);
|
||||
}
|
||||
|
||||
@@ -11237,7 +11261,7 @@ ha_innobase::wsrep_append_keys(
|
||||
if ((rcode = wsrep_append_key(thd, trx, table_share,
|
||||
table,
|
||||
(const char*) digest,
|
||||
16, shared))) {
|
||||
16, key_type))) {
|
||||
DBUG_RETURN(rcode);
|
||||
}
|
||||
}
|
||||
|
@@ -26,6 +26,10 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
||||
|
||||
#include "dict0stats.h"
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
#include "../../../wsrep/wsrep_api.h"
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/* Structure defines translation table between mysql index and innodb
|
||||
index structures */
|
||||
struct innodb_idx_translate_t {
|
||||
@@ -115,7 +119,7 @@ class ha_innobase: public handler
|
||||
dict_index_t* innobase_get_index(uint keynr);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
int wsrep_append_keys(THD *thd, bool shared,
|
||||
int wsrep_append_keys(THD *thd, wsrep_key_type key_type,
|
||||
const uchar* record0, const uchar* record1);
|
||||
#endif
|
||||
/* Init values for the class: */
|
||||
|
@@ -55,6 +55,11 @@ Created 4/20/1996 Heikki Tuuri
|
||||
#include "fts0types.h"
|
||||
#include "m_string.h"
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
#include "../../../wsrep/wsrep_api.h"
|
||||
#include "wsrep_mysqld_c.h"
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/*************************************************************************
|
||||
IMPORTANT NOTE: Any operation that generates redo MUST check that there
|
||||
is enough space in the redo log before for that operation. This is
|
||||
@@ -943,7 +948,7 @@ dberr_t wsrep_append_foreign_key(trx_t *trx,
|
||||
const rec_t* clust_rec,
|
||||
dict_index_t* clust_index,
|
||||
ibool referenced,
|
||||
ibool shared);
|
||||
enum wsrep_key_type key_type);
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/*********************************************************************//**
|
||||
@@ -1302,7 +1307,7 @@ row_ins_foreign_check_on_constraint(
|
||||
foreign,
|
||||
clust_rec,
|
||||
clust_index,
|
||||
FALSE, FALSE);
|
||||
FALSE, WSREP_KEY_EXCLUSIVE);
|
||||
if (err != DB_SUCCESS) {
|
||||
fprintf(stderr,
|
||||
"WSREP: foreign key append failed: %d\n", err);
|
||||
@@ -1650,16 +1655,34 @@ run_again:
|
||||
}
|
||||
|
||||
if (check_ref) {
|
||||
err = DB_SUCCESS;
|
||||
#ifdef WITH_WSREP
|
||||
enum wsrep_key_type key_type = WSREP_KEY_EXCLUSIVE;
|
||||
#endif /* WITH_WSREP */
|
||||
err = DB_SUCCESS;
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (upd_node != NULL) {
|
||||
key_type = WSREP_KEY_SHARED;
|
||||
} else {
|
||||
switch (wsrep_certification_rules) {
|
||||
case WSREP_CERTIFICATION_RULES_STRICT:
|
||||
key_type = WSREP_KEY_EXCLUSIVE;
|
||||
break;
|
||||
case WSREP_CERTIFICATION_RULES_OPTIMIZED:
|
||||
key_type = WSREP_KEY_SEMI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
err = wsrep_append_foreign_key(
|
||||
thr_get_trx(thr),
|
||||
foreign,
|
||||
rec,
|
||||
check_index,
|
||||
check_ref,
|
||||
(upd_node) ? TRUE : FALSE);
|
||||
#endif /* WITH_WSREP */
|
||||
key_type);
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
goto end_scan;
|
||||
} else if (foreign->type != 0) {
|
||||
/* There is an ON UPDATE or ON DELETE
|
||||
|
@@ -116,7 +116,6 @@ if(NOT MINGW)
|
||||
win32/zlib1.rc # If present will override custom build rule below.
|
||||
)
|
||||
endif()
|
||||
|
||||
# parse the full version number from zlib.h and include in ZLIB_FULL_VERSION
|
||||
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
|
||||
string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
|
||||
|
Reference in New Issue
Block a user