Merge branch 'mysql/5.5' into 5.5
reverted about half of commits as either not applicable or outright wrong
This commit is contained in:
commit
f3444df415
2
VERSION
2
VERSION
@ -1,4 +1,4 @@
|
|||||||
MYSQL_VERSION_MAJOR=5
|
MYSQL_VERSION_MAJOR=5
|
||||||
MYSQL_VERSION_MINOR=5
|
MYSQL_VERSION_MINOR=5
|
||||||
MYSQL_VERSION_PATCH=47
|
MYSQL_VERSION_PATCH=48
|
||||||
MYSQL_VERSION_EXTRA=
|
MYSQL_VERSION_EXTRA=
|
||||||
|
@ -12,6 +12,17 @@ before calling SSL_new();
|
|||||||
|
|
||||||
*** end Note ***
|
*** end Note ***
|
||||||
|
|
||||||
|
yaSSL Release notes, version 2.3.9 (12/01/2015)
|
||||||
|
This release of yaSSL fixes two client side Diffie-Hellman problems.
|
||||||
|
yaSSL was only handling the cases of zero or one leading zeros for the key
|
||||||
|
agreement instead of potentially any number. This caused about 1 in 50,000
|
||||||
|
connections to fail when using DHE cipher suites. The second problem was
|
||||||
|
the case where a server would send a public value shorter than the prime
|
||||||
|
value, causing about 1 in 128 client connections to fail, and also
|
||||||
|
caused the yaSSL client to read off the end of memory. All client side
|
||||||
|
DHE cipher suite users should update.
|
||||||
|
Thanks to Adam Langely (agl@imperialviolet.org) for the detailed report!
|
||||||
|
|
||||||
yaSSL Release notes, version 2.3.8 (9/17/2015)
|
yaSSL Release notes, version 2.3.8 (9/17/2015)
|
||||||
This release of yaSSL fixes a high security vulnerability. All users
|
This release of yaSSL fixes a high security vulnerability. All users
|
||||||
SHOULD update. If using yaSSL for TLS on the server side with private
|
SHOULD update. If using yaSSL for TLS on the server side with private
|
||||||
|
@ -378,6 +378,7 @@ public:
|
|||||||
|
|
||||||
uint get_agreedKeyLength() const;
|
uint get_agreedKeyLength() const;
|
||||||
const byte* get_agreedKey() const;
|
const byte* get_agreedKey() const;
|
||||||
|
uint get_publicKeyLength() const;
|
||||||
const byte* get_publicKey() const;
|
const byte* get_publicKey() const;
|
||||||
void makeAgreement(const byte*, unsigned int);
|
void makeAgreement(const byte*, unsigned int);
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
#include "rsa.h"
|
#include "rsa.h"
|
||||||
|
|
||||||
|
|
||||||
#define YASSL_VERSION "2.3.8"
|
#define YASSL_VERSION "2.3.9"
|
||||||
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
|
@ -751,9 +751,10 @@ struct DiffieHellman::DHImpl {
|
|||||||
byte* publicKey_;
|
byte* publicKey_;
|
||||||
byte* privateKey_;
|
byte* privateKey_;
|
||||||
byte* agreedKey_;
|
byte* agreedKey_;
|
||||||
|
uint pubKeyLength_;
|
||||||
|
|
||||||
DHImpl(TaoCrypt::RandomNumberGenerator& r) : ranPool_(r), publicKey_(0),
|
DHImpl(TaoCrypt::RandomNumberGenerator& r) : ranPool_(r), publicKey_(0),
|
||||||
privateKey_(0), agreedKey_(0) {}
|
privateKey_(0), agreedKey_(0), pubKeyLength_(0) {}
|
||||||
~DHImpl()
|
~DHImpl()
|
||||||
{
|
{
|
||||||
ysArrayDelete(agreedKey_);
|
ysArrayDelete(agreedKey_);
|
||||||
@ -762,7 +763,7 @@ struct DiffieHellman::DHImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DHImpl(const DHImpl& that) : dh_(that.dh_), ranPool_(that.ranPool_),
|
DHImpl(const DHImpl& that) : dh_(that.dh_), ranPool_(that.ranPool_),
|
||||||
publicKey_(0), privateKey_(0), agreedKey_(0)
|
publicKey_(0), privateKey_(0), agreedKey_(0), pubKeyLength_(0)
|
||||||
{
|
{
|
||||||
uint length = dh_.GetByteLength();
|
uint length = dh_.GetByteLength();
|
||||||
AllocKeys(length, length, length);
|
AllocKeys(length, length, length);
|
||||||
@ -810,7 +811,7 @@ DiffieHellman::DiffieHellman(const byte* p, unsigned int pSz, const byte* g,
|
|||||||
using TaoCrypt::Integer;
|
using TaoCrypt::Integer;
|
||||||
|
|
||||||
pimpl_->dh_.Initialize(Integer(p, pSz).Ref(), Integer(g, gSz).Ref());
|
pimpl_->dh_.Initialize(Integer(p, pSz).Ref(), Integer(g, gSz).Ref());
|
||||||
pimpl_->publicKey_ = NEW_YS opaque[pubSz];
|
pimpl_->publicKey_ = NEW_YS opaque[pimpl_->pubKeyLength_ = pubSz];
|
||||||
memcpy(pimpl_->publicKey_, pub, pubSz);
|
memcpy(pimpl_->publicKey_, pub, pubSz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -869,6 +870,10 @@ const byte* DiffieHellman::get_agreedKey() const
|
|||||||
return pimpl_->agreedKey_;
|
return pimpl_->agreedKey_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint DiffieHellman::get_publicKeyLength() const
|
||||||
|
{
|
||||||
|
return pimpl_->pubKeyLength_;
|
||||||
|
}
|
||||||
|
|
||||||
const byte* DiffieHellman::get_publicKey() const
|
const byte* DiffieHellman::get_publicKey() const
|
||||||
{
|
{
|
||||||
|
@ -109,15 +109,12 @@ void ClientDiffieHellmanPublic::build(SSL& ssl)
|
|||||||
uint keyLength = dhClient.get_agreedKeyLength(); // pub and agree same
|
uint keyLength = dhClient.get_agreedKeyLength(); // pub and agree same
|
||||||
|
|
||||||
alloc(keyLength, true);
|
alloc(keyLength, true);
|
||||||
dhClient.makeAgreement(dhServer.get_publicKey(), keyLength);
|
dhClient.makeAgreement(dhServer.get_publicKey(),
|
||||||
|
dhServer.get_publicKeyLength());
|
||||||
c16toa(keyLength, Yc_);
|
c16toa(keyLength, Yc_);
|
||||||
memcpy(Yc_ + KEY_OFFSET, dhClient.get_publicKey(), keyLength);
|
memcpy(Yc_ + KEY_OFFSET, dhClient.get_publicKey(), keyLength);
|
||||||
|
|
||||||
// because of encoding first byte might be zero, don't use it for preMaster
|
ssl.set_preMaster(dhClient.get_agreedKey(), keyLength);
|
||||||
if (*dhClient.get_agreedKey() == 0)
|
|
||||||
ssl.set_preMaster(dhClient.get_agreedKey() + 1, keyLength - 1);
|
|
||||||
else
|
|
||||||
ssl.set_preMaster(dhClient.get_agreedKey(), keyLength);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -321,11 +318,7 @@ void ClientDiffieHellmanPublic::read(SSL& ssl, input_buffer& input)
|
|||||||
}
|
}
|
||||||
dh.makeAgreement(Yc_, keyLength);
|
dh.makeAgreement(Yc_, keyLength);
|
||||||
|
|
||||||
// because of encoding, first byte might be 0, don't use for preMaster
|
ssl.set_preMaster(dh.get_agreedKey(), dh.get_agreedKeyLength());
|
||||||
if (*dh.get_agreedKey() == 0)
|
|
||||||
ssl.set_preMaster(dh.get_agreedKey() + 1, dh.get_agreedKeyLength() - 1);
|
|
||||||
else
|
|
||||||
ssl.set_preMaster(dh.get_agreedKey(), dh.get_agreedKeyLength());
|
|
||||||
ssl.makeMasterSecret();
|
ssl.makeMasterSecret();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -807,6 +807,19 @@ void SSL::set_random(const opaque* random, ConnectionEnd sender)
|
|||||||
// store client pre master secret
|
// store client pre master secret
|
||||||
void SSL::set_preMaster(const opaque* pre, uint sz)
|
void SSL::set_preMaster(const opaque* pre, uint sz)
|
||||||
{
|
{
|
||||||
|
uint i(0); // trim leading zeros
|
||||||
|
uint fullSz(sz);
|
||||||
|
|
||||||
|
while (i++ < fullSz && *pre == 0) {
|
||||||
|
sz--;
|
||||||
|
pre++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sz == 0) {
|
||||||
|
SetError(bad_input);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
secure_.use_connection().AllocPreSecret(sz);
|
secure_.use_connection().AllocPreSecret(sz);
|
||||||
memcpy(secure_.use_connection().pre_master_secret_, pre, sz);
|
memcpy(secure_.use_connection().pre_master_secret_, pre, sz);
|
||||||
}
|
}
|
||||||
@ -924,6 +937,8 @@ void SSL::order_error()
|
|||||||
// Create and store the master secret see page 32, 6.1
|
// Create and store the master secret see page 32, 6.1
|
||||||
void SSL::makeMasterSecret()
|
void SSL::makeMasterSecret()
|
||||||
{
|
{
|
||||||
|
if (GetError()) return;
|
||||||
|
|
||||||
if (isTLS())
|
if (isTLS())
|
||||||
makeTLSMasterSecret();
|
makeTLSMasterSecret();
|
||||||
else {
|
else {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2011, 2015, Oracle and/or its affiliates.
|
/* Copyright (c) 2011, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2011, 2015, MariaDB
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -17,7 +17,7 @@
|
|||||||
#ifndef _welcome_copyright_notice_h_
|
#ifndef _welcome_copyright_notice_h_
|
||||||
#define _welcome_copyright_notice_h_
|
#define _welcome_copyright_notice_h_
|
||||||
|
|
||||||
#define COPYRIGHT_NOTICE_CURRENT_YEAR "2015"
|
#define COPYRIGHT_NOTICE_CURRENT_YEAR "2016"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This define specifies copyright notice which is displayed by every MySQL
|
This define specifies copyright notice which is displayed by every MySQL
|
||||||
|
@ -1720,6 +1720,41 @@ insert into t1 values ('00:00:00'),('00:01:00');
|
|||||||
select 1 from t1 where 1 < some (select cast(a as datetime) from t1);
|
select 1 from t1 where 1 < some (select cast(a as datetime) from t1);
|
||||||
1
|
1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# Bug #21564557: INCONSISTENT OUTPUT FROM 5.5 AND 5.6
|
||||||
|
# UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%M"
|
||||||
|
#
|
||||||
|
SELECT UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"));
|
||||||
|
UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"))
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1411 Incorrect datetime value: '201506' for function str_to_date
|
||||||
|
SELECT UNIX_TIMESTAMP('2015-06-00');
|
||||||
|
UNIX_TIMESTAMP('2015-06-00')
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '2015-06-00'
|
||||||
|
SELECT UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'));
|
||||||
|
UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'))
|
||||||
|
NULL
|
||||||
|
set sql_mode= 'TRADITIONAL';
|
||||||
|
SELECT @@sql_mode;
|
||||||
|
@@sql_mode
|
||||||
|
STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||||
|
SELECT UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"));
|
||||||
|
UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"))
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1411 Incorrect datetime value: '201506' for function str_to_date
|
||||||
|
SELECT UNIX_TIMESTAMP('2015-06-00');
|
||||||
|
UNIX_TIMESTAMP('2015-06-00')
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '2015-06-00'
|
||||||
|
SELECT UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'));
|
||||||
|
UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'))
|
||||||
|
NULL
|
||||||
|
set sql_mode= default;
|
||||||
select time('10:10:10') > 10;
|
select time('10:10:10') > 10;
|
||||||
time('10:10:10') > 10
|
time('10:10:10') > 10
|
||||||
1
|
1
|
||||||
|
@ -4413,57 +4413,57 @@ test.t1 repair status OK
|
|||||||
test.t2 repair status OK
|
test.t2 repair status OK
|
||||||
test.t3 repair status OK
|
test.t3 repair status OK
|
||||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 repair error Corrupt
|
test.v1 repair status Operation failed
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 optimize status OK
|
test.t1 optimize status OK
|
||||||
test.t2 optimize status OK
|
test.t2 optimize status OK
|
||||||
test.t3 optimize status OK
|
test.t3 optimize status OK
|
||||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 optimize error Corrupt
|
test.v1 optimize status Operation failed
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 analyze status Table is already up to date
|
test.t1 analyze status Table is already up to date
|
||||||
test.t2 analyze status Table is already up to date
|
test.t2 analyze status Table is already up to date
|
||||||
test.t3 analyze status Table is already up to date
|
test.t3 analyze status Table is already up to date
|
||||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 analyze error Corrupt
|
test.v1 analyze status Operation failed
|
||||||
call bug13012()|
|
call bug13012()|
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 repair status OK
|
test.t1 repair status OK
|
||||||
test.t2 repair status OK
|
test.t2 repair status OK
|
||||||
test.t3 repair status OK
|
test.t3 repair status OK
|
||||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 repair error Corrupt
|
test.v1 repair status Operation failed
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 optimize status OK
|
test.t1 optimize status OK
|
||||||
test.t2 optimize status OK
|
test.t2 optimize status OK
|
||||||
test.t3 optimize status OK
|
test.t3 optimize status OK
|
||||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 optimize error Corrupt
|
test.v1 optimize status Operation failed
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 analyze status Table is already up to date
|
test.t1 analyze status Table is already up to date
|
||||||
test.t2 analyze status Table is already up to date
|
test.t2 analyze status Table is already up to date
|
||||||
test.t3 analyze status Table is already up to date
|
test.t3 analyze status Table is already up to date
|
||||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 analyze error Corrupt
|
test.v1 analyze status Operation failed
|
||||||
call bug13012()|
|
call bug13012()|
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 repair status OK
|
test.t1 repair status OK
|
||||||
test.t2 repair status OK
|
test.t2 repair status OK
|
||||||
test.t3 repair status OK
|
test.t3 repair status OK
|
||||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 repair error Corrupt
|
test.v1 repair status Operation failed
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 optimize status OK
|
test.t1 optimize status OK
|
||||||
test.t2 optimize status OK
|
test.t2 optimize status OK
|
||||||
test.t3 optimize status OK
|
test.t3 optimize status OK
|
||||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 optimize error Corrupt
|
test.v1 optimize status Operation failed
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 analyze status Table is already up to date
|
test.t1 analyze status Table is already up to date
|
||||||
test.t2 analyze status Table is already up to date
|
test.t2 analyze status Table is already up to date
|
||||||
test.t3 analyze status Table is already up to date
|
test.t3 analyze status Table is already up to date
|
||||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 analyze error Corrupt
|
test.v1 analyze status Operation failed
|
||||||
drop procedure bug13012|
|
drop procedure bug13012|
|
||||||
drop view v1|
|
drop view v1|
|
||||||
select * from t1 order by data|
|
select * from t1 order by data|
|
||||||
|
5
mysql-test/r/ssl_cert_verify.result
Normal file
5
mysql-test/r/ssl_cert_verify.result
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#T1: Host name (/CN=localhost/) as OU name in the server certificate, server certificate verification should fail.
|
||||||
|
#T2: Host name (localhost) as common name in the server certificate, server certificate verification should pass.
|
||||||
|
Variable_name Value
|
||||||
|
Ssl_version TLS_VERSION
|
||||||
|
# restart server using restart
|
@ -2422,28 +2422,28 @@ CREATE VIEW v1 AS SELECT id FROM t1;
|
|||||||
OPTIMIZE TABLE v1;
|
OPTIMIZE TABLE v1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 optimize error Corrupt
|
test.v1 optimize status Operation failed
|
||||||
ANALYZE TABLE v1;
|
ANALYZE TABLE v1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 analyze error Corrupt
|
test.v1 analyze status Operation failed
|
||||||
REPAIR TABLE v1;
|
REPAIR TABLE v1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 repair error Corrupt
|
test.v1 repair status Operation failed
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
OPTIMIZE TABLE v1;
|
OPTIMIZE TABLE v1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 optimize error Corrupt
|
test.v1 optimize status Operation failed
|
||||||
ANALYZE TABLE v1;
|
ANALYZE TABLE v1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 analyze error Corrupt
|
test.v1 analyze status Operation failed
|
||||||
REPAIR TABLE v1;
|
REPAIR TABLE v1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||||
test.v1 repair error Corrupt
|
test.v1 repair status Operation failed
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
create definer = current_user() sql security invoker view v1 as select 1;
|
create definer = current_user() sql security invoker view v1 as select 1;
|
||||||
show create view v1;
|
show create view v1;
|
||||||
|
20
mysql-test/std_data/ca-cert-verify.pem
Normal file
20
mysql-test/std_data/ca-cert-verify.pem
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDWzCCAkOgAwIBAgIJAO/QdKLEDQdXMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNV
|
||||||
|
BAYTAklOMREwDwYDVQQIDAhLYXJuYXRrYTESMBAGA1UEBwwJQmFuZ2Fsb3JlMQ4w
|
||||||
|
DAYDVQQKDAVNeVNRTDAeFw0xNjAxMDUxMDA1MDhaFw0yNTExMTMxMDA1MDhaMEQx
|
||||||
|
CzAJBgNVBAYTAklOMREwDwYDVQQIDAhLYXJuYXRrYTESMBAGA1UEBwwJQmFuZ2Fs
|
||||||
|
b3JlMQ4wDAYDVQQKDAVNeVNRTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
||||||
|
ggEBAKdOCuS2CzfBTJ2x8SAzY0J7cYJfNJvMDF1cvANnhkIhtnkWt/HZ5DJ9NxeX
|
||||||
|
q5h7FJLAi4gddqdk/tvQJw0V6gZepJr/mKVnMPivF5+oHPc9ZJQMX6B3FBNwWylm
|
||||||
|
ACd5GKx8I/H/MXyuhQTcoV//Ab+2pI8RHeYbBsm3lHH+tX7bRU6mUFjneqMpiCkb
|
||||||
|
JHt6BWZiWR10O6pMuGQ9+dDdsLhEV1fj3CctEPwW6rs4IZzD8xl5n+8cy7qu6eYH
|
||||||
|
Wt/snwsTzkrufeMRqTtqelxON9eoQwYOR1oH3vNEVlcbuoJAvaWOqBROUBdf12SP
|
||||||
|
TYSdP9nlRh7lTKQOywN4kYt6LqUCAwEAAaNQME4wHQYDVR0OBBYEFJ4c9tKaUU0P
|
||||||
|
EjBq5G207jjXI7RAMB8GA1UdIwQYMBaAFJ4c9tKaUU0PEjBq5G207jjXI7RAMAwG
|
||||||
|
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABRnUyj21oFi0SGJg/K5+8Lc
|
||||||
|
4n6OwVU/NgLOysIB0baIP/Rqeaze59xG/v9FPQgBlWcJK3RabOywx5bxAxdcus+1
|
||||||
|
yp5j4h37Qq1/qkgqmevvdSAPa0OBQbLb+58/naV+ywUpCYZ6flLdCMH3fXuDSlSq
|
||||||
|
qrCznextjojtWbnzrBmCmJmXWGd2gSaJDvb90ZZp/Elt3vN1sgjW0M/JEkb4MJ1r
|
||||||
|
6nfD/FHr2lUwBHm2yk7Blovx7x4d/Ip3pglk63cNO/Rn0SBTdoVDS2LB9du3Phq2
|
||||||
|
TZiL3NrRMGUNwmdaavyrJxaPq5D+Sfa4LYP3MMYD4KhLogNzIl299n5joyizlJw=
|
||||||
|
-----END CERTIFICATE-----
|
19
mysql-test/std_data/server-cert-verify-fail.pem
Normal file
19
mysql-test/std_data/server-cert-verify-fail.pem
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDJzCCAg8CAQEwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCSU4xETAPBgNV
|
||||||
|
BAgMCEthcm5hdGthMRIwEAYDVQQHDAlCYW5nYWxvcmUxDjAMBgNVBAoMBU15U1FM
|
||||||
|
MB4XDTE2MDEwNTEwMDgyN1oXDTI1MTExMzEwMDgyN1owbzELMAkGA1UEBhMCSU4x
|
||||||
|
EjAQBgNVBAgMCTpLYXJuYXRrYTETMBEGA1UEBwwKOkJhbmdhbG9yZTEPMA0GA1UE
|
||||||
|
CgwGOk15U1FMMRcwFQYDVQQLDA4vQ049bG9jYWxob3N0LzENMAsGA1UEAwwEZmFp
|
||||||
|
bDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3wnWuJodzZYq9TAJRm
|
||||||
|
HU7995FA3TEWdUinYTgGP79aTVQ4M9aeINlB6whWXOI8seh9Ja7C6kMzqOgYbgCl
|
||||||
|
WlDPAVJWktFYeWXOLxbpzh1KWkS6jBkWT02t7H7JcYbil7xjlJUxLz4UOOUDUDIP
|
||||||
|
6yqdA9VE3osESttjzj57Zm2xPqzbIHVJfORn7EexH4pryS7439p6i4XtfL31NJ8V
|
||||||
|
07M3j3a8GqbcEqXYvcUCrLnywDQ1igP817b6ta52nbgYWiqdn0mJs535UJ/p/rSl
|
||||||
|
D4Ae/6G3BSEY7whir6xY6vsd4KJ6w+wRCHnY0ky6OdDJVJLH1iqh7si7P3RBGkxw
|
||||||
|
Y7MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAggbw1jj2b7H5KDdeGJGIoOGkQAcs
|
||||||
|
GNSJussCfdk7qnzYXKmjyNppC86jjaOrXona5f+SNCuujdu86Tv8V69EH57k4lUc
|
||||||
|
DW7J4AD3vUb/tBzB0tsI/76Z4gm1XoCsnCGGpWd8GQAg/QNn/ZfJB2Vb/9ObN6rH
|
||||||
|
0HV7ouB6OGZSsb71+grKiN6mDyB1lZynCGvqBxOCKFISfcRbCNFHo/pONlHaNGPE
|
||||||
|
vjDH1bPZbEHj8owYgkdcQe0a8EbJYeQfm6fH8V8bmUcG7N60DrCnq4l1qwwVkh1S
|
||||||
|
7RpIDgrWkU+esIIdYZIIbtDxQP1Sm7kUh++7b+bcHnyw3KtDVSCw7MIedA==
|
||||||
|
-----END CERTIFICATE-----
|
19
mysql-test/std_data/server-cert-verify-pass.pem
Normal file
19
mysql-test/std_data/server-cert-verify-pass.pem
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDEzCCAfsCAQEwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCSU4xETAPBgNV
|
||||||
|
BAgMCEthcm5hdGthMRIwEAYDVQQHDAlCYW5nYWxvcmUxDjAMBgNVBAoMBU15U1FM
|
||||||
|
MB4XDTE2MDEwNTEwMDU1OVoXDTI1MTExMzEwMDU1OVowWzELMAkGA1UEBhMCSU4x
|
||||||
|
EjAQBgNVBAgMCTpLYXJuYXRrYTETMBEGA1UEBwwKOkJhbmdhbG9yZTEPMA0GA1UE
|
||||||
|
CgwGOk15U1FMMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUA
|
||||||
|
A4IBDwAwggEKAoIBAQDAmkbUwDe+nrqL8A8uwlIZk74HHCDjUAWrskKF9leEIQsB
|
||||||
|
5exFZ8JEo1u6mdR4laQWsxizGdTPqIEidkDyyEMh4+joHgyQEPD/G3rFVW8yEFHb
|
||||||
|
42O04O96BEPFXNPDRuX3MxI+lGbYDjxTS/WhVub4/3SqLjC28FJmEUXIHA0/A+c5
|
||||||
|
hlYXK0u+aPAqXxHIjBgB4BxxHXZKqecmvR3LhXoVmhJmndsVfKajB27nDKc8/OTI
|
||||||
|
H2SXb6h3nRPDXRfwB/C5i+004tEsVeIgkYshcCgLSyDdeVieUP2pm3EAmDSjmtLF
|
||||||
|
6CgY/EBSfH+JCKFUk75bA4k8CCGzBfIeOcsKHwgFAgMBAAEwDQYJKoZIhvcNAQEL
|
||||||
|
BQADggEBAInDuHtDkeT6dkWmRJCP56c4xiQqib2QuYUuMSrAhf07xlLHc6iHnD2X
|
||||||
|
hCWCrja6uwF90DnPjeouKMAUe5txq/uKA8/Y/NfXN6nPiAeHLI0qnTv7Mr9TQ8zU
|
||||||
|
DNDwRz6onlI2cS4GhrwAnlpiaxu7AjMUWHtfBFGFrgn3PawjDQpsBZNcxw1QsLc0
|
||||||
|
E0hFrWLOd0vDETEhoRge88N7a0jqK0Rd9cvRWnvjI+IsjQMLZzKufivIHPzI9K+9
|
||||||
|
Wtp8iRHcaBr5DpsBjgsO7dqVRbsNyaWsdHdLt+CQSGXpv7P6fq3K6nJFTBeIgSfS
|
||||||
|
gflrHVKYZRkKDDDpX4yHNdnIqrvy4RU=
|
||||||
|
-----END CERTIFICATE-----
|
27
mysql-test/std_data/server-key-verify-fail.pem
Normal file
27
mysql-test/std_data/server-key-verify-fail.pem
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpQIBAAKCAQEAvfCda4mh3Nlir1MAlGYdTv33kUDdMRZ1SKdhOAY/v1pNVDgz
|
||||||
|
1p4g2UHrCFZc4jyx6H0lrsLqQzOo6BhuAKVaUM8BUlaS0Vh5Zc4vFunOHUpaRLqM
|
||||||
|
GRZPTa3sfslxhuKXvGOUlTEvPhQ45QNQMg/rKp0D1UTeiwRK22POPntmbbE+rNsg
|
||||||
|
dUl85GfsR7EfimvJLvjf2nqLhe18vfU0nxXTszePdrwaptwSpdi9xQKsufLANDWK
|
||||||
|
A/zXtvq1rnaduBhaKp2fSYmznflQn+n+tKUPgB7/obcFIRjvCGKvrFjq+x3gonrD
|
||||||
|
7BEIedjSTLo50MlUksfWKqHuyLs/dEEaTHBjswIDAQABAoIBAQCSUyNzDPydXvsf
|
||||||
|
hhoUOParPAvU4tuETYDdD9Vdi7Lgf3jDQOjulbNIq/ec3KuBvrBwIrk9APvn+YxO
|
||||||
|
AUP9S2Vgi5jBDeDdVgNv4n90b3pSJk2UVQJI8V72wN5Ibnf/KeErSKvWo6V5daq/
|
||||||
|
AuZtKsZIdd3WFtA62HuyuBjTGc23Alj1C0EKnN0Rx1uBwDvx/OVQ266Us/x8jJqW
|
||||||
|
ZxIOfcvfNzBQEa5hAzbQCReVaC+rBLRAcMM2yGP7aDa+8cRkwuVlSqpX8CXBdLoU
|
||||||
|
PqmU49etcW72Rb1AFt9WgEu1Oh9UYbHFSB+FEbO8IGcGBsuYHf9zkxQyjpy/iKyT
|
||||||
|
H5dTu7YBAoGBAOWqEGepZVrfB+P6X18n3vbJhgYmF0sa0mCmwkFYgk36yNqsZ8at
|
||||||
|
lQjm5mbn4wjEKHIcQ/T1taq73W471M+PxMnn0WTwoG5jsyarZGgy6/95YXiyZtQe
|
||||||
|
qgA4P3aKkCteRP22DjG7uxmm9Hoqx8Z31vfRTLAHN1IEHPHHkg/J3gPTAoGBANO4
|
||||||
|
aqKeY4vcDvVkvxVbADrw++tZGwA+RuxfO4HKKru59VdA2PsAxhXwb3Dfejwj7hYW
|
||||||
|
yE9edHjGpMr1+dpf8YJYs7qjajHe1HxBOYqQGHycIdw+Gv56R4HpaS9eW3x8l/Pi
|
||||||
|
b4xnAodv2qIriACOe7br+rll4wKX46Wt64zdvpShAoGAT0r3HQM0Vjp4u/J+qRjX
|
||||||
|
9za+yjKuiiS5i9snaG5JlujGHhG2Rrc5pHgsBk17alRnbnZp1BJdZZQ1MFEB+aO2
|
||||||
|
mssp1YLqsRJFEU3NfdhO+MaMq6JUtFnd8fN5ndDbU83ZXgtUPUGGqKWm9OL+VHyd
|
||||||
|
wLQHmSL0q6F16Ngxirf0qjcCgYEAtSmiJVA+gdhk/FmeoBlkEwtNpM50Kjsf2PaM
|
||||||
|
Jrzk4Al5A5Y7lFvPI8q+sOio4XklKsWH1VJPe2EOdZUQnGlocE6SS+u03MN9Mm1l
|
||||||
|
XUl7inTXDGwgEQx0z5b4KE4nHlhGdauWI5+pLFbrz8RL9Z32AkneGnIyU2/AnW46
|
||||||
|
lijQAMECgYEAmgp/88ndIw49RCtMhYhtXQ87AsEAP6kzXQyKppDkn0os+xI5igIL
|
||||||
|
i/UDxB33hx3yjrUZwoGDV9MwlMhZNX5Tf5bwjPmmh1NR6KdEpPt5AkklX4s6uil2
|
||||||
|
Bxl1P5l1jl/PbEYtv5LDZKIPANWRzViMSIWqjUWlbdqE7/vjx+Oo+cc=
|
||||||
|
-----END RSA PRIVATE KEY-----
|
27
mysql-test/std_data/server-key-verify-pass.pem
Normal file
27
mysql-test/std_data/server-key-verify-pass.pem
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEowIBAAKCAQEAwJpG1MA3vp66i/APLsJSGZO+Bxwg41AFq7JChfZXhCELAeXs
|
||||||
|
RWfCRKNbupnUeJWkFrMYsxnUz6iBInZA8shDIePo6B4MkBDw/xt6xVVvMhBR2+Nj
|
||||||
|
tODvegRDxVzTw0bl9zMSPpRm2A48U0v1oVbm+P90qi4wtvBSZhFFyBwNPwPnOYZW
|
||||||
|
FytLvmjwKl8RyIwYAeAccR12SqnnJr0dy4V6FZoSZp3bFXymowdu5wynPPzkyB9k
|
||||||
|
l2+od50Tw10X8AfwuYvtNOLRLFXiIJGLIXAoC0sg3XlYnlD9qZtxAJg0o5rSxego
|
||||||
|
GPxAUnx/iQihVJO+WwOJPAghswXyHjnLCh8IBQIDAQABAoIBAHPQUSc9LkgBSks7
|
||||||
|
XuXPE28t1+aOk3gcdkx4NGg5aQaal/PcPea+LaL4WAAs4AZidPjxWLjZn43+1SfT
|
||||||
|
09opcbS/Rx3Mc+FtTn0YGQrwBJ0mExMV+K6bU2Ubi2TyHKQfzciHfUEEG5Nve/ba
|
||||||
|
hikuCFVRxuVOQRzABcw6NqvNsmlg892lfw6/+RDwMBcz7ocwzmiOUoIxgjyFo9G4
|
||||||
|
aJvRmHLij5892H6qveik+A/Xr+8leGQHiQET2wW/F9MFP5ypIT7aeE6remeZH7fG
|
||||||
|
f4/Zfei/TE4xK2ElNR/91byzeKIVY4vjtTndAiBuqpfYuICb40MC02LNW5Oe6VN2
|
||||||
|
3mQ6EgECgYEA7O4ndBnbs/00gyTGyNg6I+3wRTibhNH4R8RZFJiLfKRKOlUiLhUo
|
||||||
|
+bQeO4bCQ6YY++TYDvMEXTlA3jow9R9Mj2AWc6bNmQmJd/065QyFHftywT66I+V4
|
||||||
|
rz1ohSJyHXcv4DxqNk3o3Vb4N8GFjZKcodSgTv2Lk+9ipDYFcQiZop0CgYEA0BrF
|
||||||
|
SIyLTnjoVht/7RbIGEqhMQUiz5mx7qQ1TPB+YTG77G2xXJNg5d6S7WT4LN+cqbxN
|
||||||
|
YdndIbW4NdV7bH7FlG9q7jfkuZ+AY2BPU047tcDeyO0HYYEhVY+EyZqHci/26mvt
|
||||||
|
JrawdqS5HQS1y/rKfytm7YBGTvqoNZHvOHc6aokCgYEAxcjlbJkte+pyzMuFmiJP
|
||||||
|
HrFBczeXM+BoJ9j0GCpjvvAS+vEYsGl/pDvFRSHwx7I/hv/5kTkzOnNSAHGJbwbq
|
||||||
|
zYGEHJVxakC43k6pvI2gDnBa0pD/qHmmLnvP5dvkcU6Oy90DOUP+kc9JNJo7V/y8
|
||||||
|
/qdWD7q+qwcaTETAdCSexE0CgYA/DN1Y7bwHOnqqHArWOmDFe1b7EyNI4rgWJYpA
|
||||||
|
lVy09eyJ5XInKj/hZV3+rujCL723b2XCj89/tx7osJWEeaRDJL6xDh4uXzT25uch
|
||||||
|
xkIw/w6Asc/aqtT+p00EB92hqwaUX76qTA+K4r1zHUo3UvSnMu8sZgDnTOpJ0L05
|
||||||
|
zmXUgQKBgDT+IFrAzOty4B0mJncTCC/TulpW704bEZwNJfQSdtiBQr/vqoXygBQc
|
||||||
|
bHfpncpSfhzHB5lhRUv02TqXgl53D70nM7JD5nx98WYTTBxsbvxPlt4gBRZkfgq5
|
||||||
|
tHKclAArc1SbfW5Z8oYyl7h33LQJK116QSyiIIGieH5VXNPwnqUs
|
||||||
|
-----END RSA PRIVATE KEY-----
|
@ -0,0 +1,29 @@
|
|||||||
|
include/master-slave.inc
|
||||||
|
[connection master]
|
||||||
|
Test case 1:- table name with one character latin name.
|
||||||
|
SET @s:=CONCAT("CREATE TABLE `",REPEAT(CHAR(131),1),"` (a INT)");
|
||||||
|
PREPARE STMT FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
SET @s:=CONCAT("INSERT INTO `",REPEAT(CHAR(131),1),"` VALUES (1)");
|
||||||
|
PREPARE STMT FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
SET @s:=CONCAT("DROP TABLE `",REPEAT(CHAR(131),1), "`");
|
||||||
|
PREPARE STMT FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
Test case 2:- table name and database names with one character latin name.
|
||||||
|
SET @s:=CONCAT("CREATE DATABASE `",REPEAT(CHAR(131),1),"`");
|
||||||
|
PREPARE STMT FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
SET @s:=CONCAT("CREATE TABLE `",REPEAT(CHAR(131),1),"`.`",REPEAT(CHAR(131),1),"` (a INT)");
|
||||||
|
PREPARE STMT FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
SET @s:=CONCAT("INSERT INTO `",REPEAT(CHAR(131),1),"`.`",REPEAT(CHAR(131),1),"` VALUES (1)");
|
||||||
|
PREPARE STMT FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
SET @s:=CONCAT("DROP TABLE `",REPEAT(CHAR(131),1),"`.`",REPEAT(CHAR(131),1), "`");
|
||||||
|
PREPARE STMT FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
SET @s:=CONCAT("DROP DATABASE `",REPEAT(CHAR(131),1),"`");
|
||||||
|
PREPARE STMT FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
include/rpl_end.inc
|
53
mysql-test/suite/rpl/r/rpl_unsafe_statements.result
Normal file
53
mysql-test/suite/rpl/r/rpl_unsafe_statements.result
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
include/master-slave.inc
|
||||||
|
[connection master]
|
||||||
|
CREATE TABLE t1(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||||
|
CREATE TABLE t2(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||||
|
CREATE TRIGGER trig1 AFTER INSERT ON t1
|
||||||
|
FOR EACH ROW
|
||||||
|
INSERT INTO t2(i) VALUES(new.i);
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t2(i) VALUES (1);
|
||||||
|
ROLLBACK;
|
||||||
|
INSERT INTO t1(i) VALUES(2);
|
||||||
|
START TRANSACTION;
|
||||||
|
LOCK TABLES t1 WRITE, t2 WRITE;
|
||||||
|
INSERT INTO t1(i) VALUES(3);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
COMMIT;
|
||||||
|
include/diff_tables.inc [master:t1, slave:t1]
|
||||||
|
include/diff_tables.inc [master:t2, slave:t2]
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||||
|
CREATE TABLE t2(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||||
|
INSERT INTO t1 values (1), (2), (3);
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t2(i) VALUES (1);
|
||||||
|
ROLLBACK;
|
||||||
|
INSERT INTO t2(i) SELECT i FROM t1;
|
||||||
|
START TRANSACTION;
|
||||||
|
LOCK TABLES t2 WRITE, t1 READ;
|
||||||
|
INSERT INTO t2(i) SELECT i FROM t1;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
COMMIT;
|
||||||
|
include/diff_tables.inc [master:t1, slave:t1]
|
||||||
|
include/diff_tables.inc [master:t2, slave:t2]
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
CREATE TABLE t1(i int, id INT AUTO_INCREMENT, PRIMARY KEY (i, id)) ENGINE=MYISAM;
|
||||||
|
INSERT INTO t1 (i) values (1);
|
||||||
|
START TRANSACTION;
|
||||||
|
LOCK TABLES t1 WRITE;
|
||||||
|
INSERT INTO t1 (i) values (2);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
COMMIT;
|
||||||
|
include/diff_tables.inc [master:t1, slave:t1]
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(i INT, j INT, UNIQUE KEY(i), UNIQUE KEY(j)) ENGINE=INNODB;
|
||||||
|
INSERT INTO t1 (i,j) VALUES (1,2) ON DUPLICATE KEY UPDATE j=j+1;
|
||||||
|
START TRANSACTION;
|
||||||
|
LOCK TABLES t1 WRITE;
|
||||||
|
INSERT INTO t1 (i,j) VALUES (1,2) ON DUPLICATE KEY UPDATE j=j+1;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
COMMIT;
|
||||||
|
include/diff_tables.inc [master:t1, slave:t1]
|
||||||
|
DROP TABLE t1;
|
||||||
|
include/rpl_end.inc
|
@ -0,0 +1,87 @@
|
|||||||
|
###############################################################################
|
||||||
|
# Bug#21205695 DROP TABLE MAY CAUSE SLAVES TO BREAK
|
||||||
|
#
|
||||||
|
# Problem:
|
||||||
|
# ========
|
||||||
|
# 1) Drop table queries are re-generated by server
|
||||||
|
# before writing the events(queries) into binlog
|
||||||
|
# for various reasons. If table name/db name contains
|
||||||
|
# a non regular characters (like latin characters),
|
||||||
|
# the generated query is wrong. Hence it breaks the
|
||||||
|
# replication.
|
||||||
|
# 2) In the edge case, when table name contains
|
||||||
|
# 64 latin characters (latin takes 2 bytes), server is
|
||||||
|
# throwing an assert (M_TBLLEN < 128)
|
||||||
|
#
|
||||||
|
# 3) In the edge case, when db name contains 64 latin
|
||||||
|
# characters, binlog contents are interpreted wrongly
|
||||||
|
# which is leading to replication issues.
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
--source include/not_windows.inc
|
||||||
|
--source include/master-slave.inc
|
||||||
|
|
||||||
|
--let iter=1
|
||||||
|
# Change iteration to 4 after fixing Bug #22280214
|
||||||
|
while ($iter <= 2)
|
||||||
|
{
|
||||||
|
--connection master
|
||||||
|
if ($iter == 1)
|
||||||
|
{
|
||||||
|
--echo Test case 1:- table name with one character latin name.
|
||||||
|
--let $tblname= REPEAT(CHAR(131),1)
|
||||||
|
}
|
||||||
|
if ($iter == 2)
|
||||||
|
{
|
||||||
|
--echo Test case 2:- table name and database names with one character latin name.
|
||||||
|
--let $tblname= REPEAT(CHAR(131),1),"`.`",REPEAT(CHAR(131),1)
|
||||||
|
--eval SET @s:=CONCAT("CREATE DATABASE `",REPEAT(CHAR(131),1),"`")
|
||||||
|
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
}
|
||||||
|
# After fixing Bug #22280214 DATADIR LOCATION IS LIMITING
|
||||||
|
# IDENTIFIER MAX LENGTH, the following two tests (iter 3 and 4) can be
|
||||||
|
# uncommented.
|
||||||
|
#if ($iter == 3)
|
||||||
|
#{
|
||||||
|
# --echo Test case 3:- table name and database names with 64 latin characters name.
|
||||||
|
# --let $tblname= REPEAT(CHAR(131),64),"`.`", REPEAT(CHAR(131),64)
|
||||||
|
# --eval SET @s:=CONCAT("CREATE DATABASE `",REPEAT(CHAR(131),64),"`")
|
||||||
|
# PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
#}
|
||||||
|
#if ($iter == 4)
|
||||||
|
#{
|
||||||
|
# --echo Test case 4:- table name and database names with 64 Euro(€) characters.
|
||||||
|
# --let $tblname= REPEAT(CHAR(226,130,172),64),"`.`", REPEAT(CHAR(226,130,172),64)
|
||||||
|
# --eval SET @s:=CONCAT("CREATE DATABASE `",REPEAT(CHAR(226,130,172),64),"`")
|
||||||
|
# PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
#}
|
||||||
|
--eval SET @s:=CONCAT("CREATE TABLE `",$tblname,"` (a INT)")
|
||||||
|
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
--eval SET @s:=CONCAT("INSERT INTO `",$tblname,"` VALUES (1)")
|
||||||
|
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
--eval SET @s:=CONCAT("DROP TABLE `",$tblname, "`")
|
||||||
|
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
if ($iter == 2)
|
||||||
|
{
|
||||||
|
--eval SET @s:=CONCAT("DROP DATABASE `",REPEAT(CHAR(131),1),"`")
|
||||||
|
PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
}
|
||||||
|
# After fixing Bug #22280214 DATADIR LOCATION IS LIMITING
|
||||||
|
# IDENTIFIER MAX LENGTH, the following two tests (iter 3 and 4) can be
|
||||||
|
# uncommented.
|
||||||
|
#if ($iter == 3)
|
||||||
|
#{
|
||||||
|
# --eval SET @s:=CONCAT("DROP DATABASE `",REPEAT(CHAR(131),64),"`")
|
||||||
|
# PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
#}
|
||||||
|
#if ($iter == 4)
|
||||||
|
#{
|
||||||
|
# --eval SET @s:=CONCAT("DROP DATABASE `",REPEAT(CHAR(226,130,172),64),"`")
|
||||||
|
# PREPARE STMT FROM @s; EXECUTE stmt;
|
||||||
|
#}
|
||||||
|
--sync_slave_with_master
|
||||||
|
--inc $iter
|
||||||
|
}
|
||||||
|
|
||||||
|
--source include/rpl_end.inc
|
176
mysql-test/suite/rpl/t/rpl_unsafe_statements.test
Normal file
176
mysql-test/suite/rpl/t/rpl_unsafe_statements.test
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
################################################################################
|
||||||
|
# Bug#17047208 REPLICATION DIFFERENCE FOR MULTIPLE TRIGGERS
|
||||||
|
# Problem: If DML invokes a trigger or a stored function that inserts into an
|
||||||
|
# AUTO_INCREMENT column, that DML has to be marked as 'unsafe' statement. If the
|
||||||
|
# tables are locked in the transaction prior to DML statement (using LOCK
|
||||||
|
# TABLES), then the DML statement is not marked as 'unsafe' statement.
|
||||||
|
|
||||||
|
# Steps to reproduce the reported test case (BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS)
|
||||||
|
# Case-1:
|
||||||
|
# > Create a trigger on a table and do a insert in the trigger that updates
|
||||||
|
# auto increment column
|
||||||
|
# > A DML that executes the trigger in step.1 and check that DML is marked
|
||||||
|
# as unsafe and DML is written into binlog using row format (in MBR)
|
||||||
|
# > Execute the step 2 by locking the required tables prior to DML and check
|
||||||
|
# that DML is marked as unsafe and DML is written into binlog using row
|
||||||
|
# format (in MBR)
|
||||||
|
#
|
||||||
|
# This test script also adds test cases to cover few other unsafe statements.
|
||||||
|
# Case-2: BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT
|
||||||
|
# Case-3: BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST
|
||||||
|
# Case-4: BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_binlog_format_mixed.inc
|
||||||
|
--source include/master-slave.inc
|
||||||
|
|
||||||
|
# Case-1: BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS
|
||||||
|
# Statement is unsafe because it invokes a trigger or a
|
||||||
|
# stored function that inserts into an AUTO_INCREMENT column.
|
||||||
|
|
||||||
|
# Step-1.1: Create two tables, one with AUTO_INCREMENT column.
|
||||||
|
CREATE TABLE t1(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||||
|
CREATE TABLE t2(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||||
|
|
||||||
|
# Step-1.2: Create a trigger that inserts into an AUTO_INCREMENT column.
|
||||||
|
CREATE TRIGGER trig1 AFTER INSERT ON t1
|
||||||
|
FOR EACH ROW
|
||||||
|
INSERT INTO t2(i) VALUES(new.i);
|
||||||
|
|
||||||
|
# Step-1.3: Create some gap in auto increment value on master's t2 table
|
||||||
|
# but not on slave (by doing rollback). Just in case if the unsafe statements
|
||||||
|
# are written in statement format, diff tables will fail.
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t2(i) VALUES (1);
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
# Step-1.4: Insert a tuple into table t1 that triggers trig1 which inserts
|
||||||
|
# into an AUTO_INCREMENT column.
|
||||||
|
INSERT INTO t1(i) VALUES(2);
|
||||||
|
|
||||||
|
# Step-1.5: Repeat step 1.4 but using 'LOCK TABLES' logic.
|
||||||
|
START TRANSACTION;
|
||||||
|
LOCK TABLES t1 WRITE, t2 WRITE;
|
||||||
|
INSERT INTO t1(i) VALUES(3);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
# Step-1.6: Sync slave with master
|
||||||
|
--sync_slave_with_master
|
||||||
|
|
||||||
|
# Step-1.7: Diff master-slave tables to make sure everything is in sync.
|
||||||
|
--let $diff_tables=master:t1, slave:t1
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
|
--let $diff_tables=master:t2, slave:t2
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
|
# Step-1.8: Cleanup
|
||||||
|
--connection master
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
# Case-2: BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT
|
||||||
|
# Statements writing to a table with an auto-increment column after selecting
|
||||||
|
# from another table are unsafe because the order in which rows are retrieved
|
||||||
|
# determines what (if any) rows will be written. This order cannot be
|
||||||
|
# predicted and may differ on master and the slave.
|
||||||
|
|
||||||
|
# Step-2.1: Create two tables, one with AUTO_INCREMENT column.
|
||||||
|
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||||
|
CREATE TABLE t2(id INT AUTO_INCREMENT, i INT, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||||
|
|
||||||
|
# Step-2.2: Create some tuples in table t1.
|
||||||
|
INSERT INTO t1 values (1), (2), (3);
|
||||||
|
|
||||||
|
# Step-2.3: Create some gap in auto increment value on master's t2 table
|
||||||
|
# but not on slave (by doing rollback). Just in case if the unsafe statements
|
||||||
|
# are written in statement format, diff tables will fail.
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t2(i) VALUES (1);
|
||||||
|
ROLLBACK;
|
||||||
|
|
||||||
|
# Step-2.4: Insert into t2 (table with an auto-increment) by selecting tuples
|
||||||
|
# from table t1.
|
||||||
|
INSERT INTO t2(i) SELECT i FROM t1;
|
||||||
|
|
||||||
|
# Step-2.5: Repeat step 2.4 but now with 'LOCK TABLES' logic.
|
||||||
|
START TRANSACTION;
|
||||||
|
LOCK TABLES t2 WRITE, t1 READ;
|
||||||
|
INSERT INTO t2(i) SELECT i FROM t1;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
# Step-2.6: Sync slave with master
|
||||||
|
--sync_slave_with_master
|
||||||
|
|
||||||
|
# Step-2.7: Diff master-slave tables to make sure everything is in sync.
|
||||||
|
--let $diff_tables=master:t1, slave:t1
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
|
--let $diff_tables=master:t2, slave:t2
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
|
# Step-2.8: Cleanup
|
||||||
|
--connection master
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
# Case-3: BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST
|
||||||
|
# INSERT into autoincrement field which is not the first part in the
|
||||||
|
# composed primary key is unsafe
|
||||||
|
#
|
||||||
|
# Step-3.1: Create a table with auto increment column and a composed primary key
|
||||||
|
# (second column is auto increment column). Such a definition is allowed only
|
||||||
|
# with 'myisam' engine.
|
||||||
|
CREATE TABLE t1(i int, id INT AUTO_INCREMENT, PRIMARY KEY (i, id)) ENGINE=MYISAM;
|
||||||
|
|
||||||
|
# Step-3.2: Inserting into such a table is unsafe.
|
||||||
|
INSERT INTO t1 (i) values (1);
|
||||||
|
|
||||||
|
# Step-3.3: Repeat step 3.2, now with 'LOCK TABLES' logic.
|
||||||
|
START TRANSACTION;
|
||||||
|
LOCK TABLES t1 WRITE;
|
||||||
|
INSERT INTO t1 (i) values (2);
|
||||||
|
UNLOCK TABLES;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
# Step-3.4: Sync slave with master
|
||||||
|
--sync_slave_with_master
|
||||||
|
|
||||||
|
# Step-3.5: Diff master-slave tables to make sure everything is in sync.
|
||||||
|
--let $diff_tables=master:t1, slave:t1
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
|
# Step-3.6: Cleanup
|
||||||
|
--connection master
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
# Case-4: BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS
|
||||||
|
# INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY
|
||||||
|
# is unsafe Statement
|
||||||
|
|
||||||
|
# Step-4.1: Create a table with two unique keys
|
||||||
|
CREATE TABLE t1(i INT, j INT, UNIQUE KEY(i), UNIQUE KEY(j)) ENGINE=INNODB;
|
||||||
|
|
||||||
|
# Step-4.2: Inserting into such a table is unsafe.
|
||||||
|
INSERT INTO t1 (i,j) VALUES (1,2) ON DUPLICATE KEY UPDATE j=j+1;
|
||||||
|
|
||||||
|
# Step-4.3: Repeat step 3.2, now with 'LOCK TABLES' logic.
|
||||||
|
START TRANSACTION;
|
||||||
|
LOCK TABLES t1 WRITE;
|
||||||
|
INSERT INTO t1 (i,j) VALUES (1,2) ON DUPLICATE KEY UPDATE j=j+1;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
# Step-4.4: Sync slave with master
|
||||||
|
--sync_slave_with_master
|
||||||
|
|
||||||
|
# Step-4.5: Diff master-slave tables to make sure everything is in sync.
|
||||||
|
--let $diff_tables=master:t1, slave:t1
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
|
# Step-4.6: Cleanup
|
||||||
|
--connection master
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--source include/rpl_end.inc
|
@ -1039,6 +1039,24 @@ insert into t1 values ('00:00:00'),('00:01:00');
|
|||||||
select 1 from t1 where 1 < some (select cast(a as datetime) from t1);
|
select 1 from t1 where 1 < some (select cast(a as datetime) from t1);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #21564557: INCONSISTENT OUTPUT FROM 5.5 AND 5.6
|
||||||
|
--echo # UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%M"
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"));
|
||||||
|
SELECT UNIX_TIMESTAMP('2015-06-00');
|
||||||
|
SELECT UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'));
|
||||||
|
|
||||||
|
set sql_mode= 'TRADITIONAL';
|
||||||
|
SELECT @@sql_mode;
|
||||||
|
|
||||||
|
SELECT UNIX_TIMESTAMP(STR_TO_DATE('201506', "%Y%m"));
|
||||||
|
SELECT UNIX_TIMESTAMP('2015-06-00');
|
||||||
|
SELECT UNIX_TIMESTAMP(STR_TO_DATE('0000-00-00 10:30:30', '%Y-%m-%d %h:%i:%s'));
|
||||||
|
|
||||||
|
set sql_mode= default;
|
||||||
|
|
||||||
select time('10:10:10') > 10;
|
select time('10:10:10') > 10;
|
||||||
select time('10:10:10') > 1010;
|
select time('10:10:10') > 1010;
|
||||||
select time('10:10:09') > 101010;
|
select time('10:10:09') > 101010;
|
||||||
|
43
mysql-test/t/ssl_cert_verify.test
Normal file
43
mysql-test/t/ssl_cert_verify.test
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Want to skip this test from Valgrind execution
|
||||||
|
--source include/no_valgrind_without_big.inc
|
||||||
|
# This test should work in embedded server after we fix mysqltest
|
||||||
|
-- source include/not_embedded.inc
|
||||||
|
-- source include/have_ssl_communication.inc
|
||||||
|
# Save the initial number of concurrent sessions
|
||||||
|
--source include/count_sessions.inc
|
||||||
|
|
||||||
|
let $ssl_verify_fail_path = --ssl --ssl-ca=$MYSQL_TEST_DIR/std_data/ca-cert-verify.pem --ssl-key=$MYSQL_TEST_DIR/std_data/server-key-verify-fail.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/server-cert-verify-fail.pem;
|
||||||
|
let $ssl_verify_pass_path = --ssl --ssl-ca=$MYSQL_TEST_DIR/std_data/ca-cert-verify.pem --ssl-key=$MYSQL_TEST_DIR/std_data/server-key-verify-pass.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/server-cert-verify-pass.pem;
|
||||||
|
|
||||||
|
--echo #T1: Host name (/CN=localhost/) as OU name in the server certificate, server certificate verification should fail.
|
||||||
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
--shutdown_server
|
||||||
|
--source include/wait_until_disconnected.inc
|
||||||
|
|
||||||
|
--exec echo "restart:" $ssl_verify_fail_path > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
--enable_reconnect
|
||||||
|
--source include/wait_until_connected_again.inc
|
||||||
|
|
||||||
|
--error 1
|
||||||
|
--exec $MYSQL --protocol=tcp --ssl-ca=$MYSQL_TEST_DIR/std_data/ca-cert-verify.pem --ssl-verify-server-cert -e "SHOW STATUS like 'Ssl_version'"
|
||||||
|
|
||||||
|
--echo #T2: Host name (localhost) as common name in the server certificate, server certificate verification should pass.
|
||||||
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
--shutdown_server
|
||||||
|
--source include/wait_until_disconnected.inc
|
||||||
|
|
||||||
|
--exec echo "restart:" $ssl_verify_pass_path > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
--enable_reconnect
|
||||||
|
--source include/wait_until_connected_again.inc
|
||||||
|
|
||||||
|
--replace_result TLSv1.2 TLS_VERSION TLSv1.1 TLS_VERSION TLSv1 TLS_VERSION
|
||||||
|
--exec $MYSQL --protocol=tcp --ssl-ca=$MYSQL_TEST_DIR/std_data/ca-cert-verify.pem --ssl-verify-server-cert -e "SHOW STATUS like 'Ssl_version'"
|
||||||
|
|
||||||
|
--echo # restart server using restart
|
||||||
|
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
--shutdown_server
|
||||||
|
--source include/wait_until_disconnected.inc
|
||||||
|
|
||||||
|
--exec echo "restart: " > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||||
|
--enable_reconnect
|
||||||
|
--source include/wait_until_connected_again.inc
|
@ -1,5 +1,5 @@
|
|||||||
# Copyright (c) 2005, 2011, Oracle and/or its affiliates.
|
# Copyright (c) 2005, 2015, Oracle and/or its affiliates.
|
||||||
# Copyright (c) 2008-2011, Monty Program Ab
|
# Copyright (c) 2008, 2016, MariaDB
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU Library General Public
|
# modify it under the terms of the GNU Library General Public
|
||||||
@ -1057,8 +1057,8 @@
|
|||||||
# write_keys() and find_all_keys().
|
# write_keys() and find_all_keys().
|
||||||
# They both return ha_rows, which is platform dependent.
|
# They both return ha_rows, which is platform dependent.
|
||||||
#
|
#
|
||||||
# The '...' wildcards are for 'fun:inline_mysql_file_write' which *may*
|
# The '...' wildcards are for 'fun:inline_mysql_file_write' and
|
||||||
# be inlined.
|
# 'fun:find_all_keys' which *may* be inlined.
|
||||||
{
|
{
|
||||||
Bug#12856915 VALGRIND FAILURE IN FILESORT/CREATE_SORT_INDEX / one
|
Bug#12856915 VALGRIND FAILURE IN FILESORT/CREATE_SORT_INDEX / one
|
||||||
Memcheck:Param
|
Memcheck:Param
|
||||||
@ -1069,7 +1069,7 @@
|
|||||||
fun:my_b_flush_io_cache
|
fun:my_b_flush_io_cache
|
||||||
fun:_my_b_write
|
fun:_my_b_write
|
||||||
fun:_Z*10write_keysP13st_sort_paramPPhjP11st_io_cacheS4_
|
fun:_Z*10write_keysP13st_sort_paramPPhjP11st_io_cacheS4_
|
||||||
fun:_Z*13find_all_keysP13st_sort_paramP10SQL_SELECTPPhP11st_io_cacheS6_
|
...
|
||||||
fun:_Z8filesortP3THDP5TABLEP13st_sort_fieldjP10SQL_SELECTybPy
|
fun:_Z8filesortP3THDP5TABLEP13st_sort_fieldjP10SQL_SELECTybPy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2006, 2010, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (C) 2007 Google Inc.
|
/* Copyright (C) 2007 Google Inc.
|
||||||
Copyright (c) 2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
Copyright (c) 2008, 2013, Oracle and/or its affiliates.
|
||||||
Use is subject to license terms.
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2003, 2014, Oracle and/or its affiliates.
|
/* Copyright (c) 2003, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2015, MariaDB
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -1884,38 +1884,39 @@ mysql_get_ssl_cipher(MYSQL *mysql __attribute__((unused)))
|
|||||||
static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const char **errptr)
|
static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const char **errptr)
|
||||||
{
|
{
|
||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
X509 *server_cert;
|
X509 *server_cert= NULL;
|
||||||
X509_NAME *x509sn;
|
char *cn= NULL;
|
||||||
int cn_pos;
|
int cn_loc= -1;
|
||||||
X509_NAME_ENTRY *cn_entry;
|
ASN1_STRING *cn_asn1= NULL;
|
||||||
ASN1_STRING *cn_asn1;
|
X509_NAME_ENTRY *cn_entry= NULL;
|
||||||
const char *cn_str;
|
X509_NAME *subject= NULL;
|
||||||
|
int ret_validation= 1;
|
||||||
|
|
||||||
DBUG_ENTER("ssl_verify_server_cert");
|
DBUG_ENTER("ssl_verify_server_cert");
|
||||||
DBUG_PRINT("enter", ("server_hostname: %s", server_hostname));
|
DBUG_PRINT("enter", ("server_hostname: %s", server_hostname));
|
||||||
|
|
||||||
if (!(ssl= (SSL*)vio->ssl_arg))
|
if (!(ssl= (SSL*)vio->ssl_arg))
|
||||||
{
|
{
|
||||||
*errptr= "No SSL pointer found";
|
*errptr= "No SSL pointer found";
|
||||||
DBUG_RETURN(1);
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!server_hostname)
|
if (!server_hostname)
|
||||||
{
|
{
|
||||||
*errptr= "No server hostname supplied";
|
*errptr= "No server hostname supplied";
|
||||||
DBUG_RETURN(1);
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(server_cert= SSL_get_peer_certificate(ssl)))
|
if (!(server_cert= SSL_get_peer_certificate(ssl)))
|
||||||
{
|
{
|
||||||
*errptr= "Could not get server certificate";
|
*errptr= "Could not get server certificate";
|
||||||
DBUG_RETURN(1);
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (X509_V_OK != SSL_get_verify_result(ssl))
|
if (X509_V_OK != SSL_get_verify_result(ssl))
|
||||||
{
|
{
|
||||||
*errptr= "Failed to verify the server certificate";
|
*errptr= "Failed to verify the server certificate";
|
||||||
X509_free(server_cert);
|
goto error;
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
We already know that the certificate exchanged was valid; the SSL library
|
We already know that the certificate exchanged was valid; the SSL library
|
||||||
@ -1923,33 +1924,57 @@ static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const c
|
|||||||
are what we expect.
|
are what we expect.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
x509sn= X509_get_subject_name(server_cert);
|
/*
|
||||||
|
Some notes for future development
|
||||||
|
We should check host name in alternative name first and then if needed check in common name.
|
||||||
|
Currently yssl doesn't support alternative name.
|
||||||
|
openssl 1.0.2 support X509_check_host method for host name validation, we may need to start using
|
||||||
|
X509_check_host in the future.
|
||||||
|
*/
|
||||||
|
|
||||||
if ((cn_pos= X509_NAME_get_index_by_NID(x509sn, NID_commonName, -1)) < 0)
|
subject= X509_get_subject_name(server_cert);
|
||||||
goto err;
|
cn_loc= X509_NAME_get_index_by_NID(subject, NID_commonName, -1);
|
||||||
|
if (cn_loc < 0)
|
||||||
|
{
|
||||||
|
*errptr= "Failed to get CN location in the certificate subject";
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(cn_entry= X509_NAME_get_entry(x509sn, cn_pos)))
|
cn_entry= X509_NAME_get_entry(subject, cn_loc);
|
||||||
goto err;
|
if (cn_entry == NULL)
|
||||||
|
{
|
||||||
|
*errptr= "Failed to get CN entry using CN location";
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(cn_asn1 = X509_NAME_ENTRY_get_data(cn_entry)))
|
cn_asn1 = X509_NAME_ENTRY_get_data(cn_entry);
|
||||||
goto err;
|
if (cn_asn1 == NULL)
|
||||||
|
{
|
||||||
|
*errptr= "Failed to get CN from CN entry";
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
cn_str = (char *)ASN1_STRING_data(cn_asn1);
|
cn= (char *) ASN1_STRING_data(cn_asn1);
|
||||||
|
|
||||||
/* Make sure there is no embedded \0 in the CN */
|
if ((size_t)ASN1_STRING_length(cn_asn1) != strlen(cn))
|
||||||
if ((size_t)ASN1_STRING_length(cn_asn1) != strlen(cn_str))
|
{
|
||||||
goto err;
|
*errptr= "NULL embedded in the certificate CN";
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (strcmp(cn_str, server_hostname))
|
DBUG_PRINT("info", ("Server hostname in cert: %s", cn));
|
||||||
goto err;
|
if (!strcmp(cn, server_hostname))
|
||||||
|
{
|
||||||
|
/* Success */
|
||||||
|
ret_validation= 0;
|
||||||
|
}
|
||||||
|
|
||||||
X509_free (server_cert);
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
|
|
||||||
err:
|
|
||||||
X509_free(server_cert);
|
|
||||||
*errptr= "SSL certificate validation failure";
|
*errptr= "SSL certificate validation failure";
|
||||||
DBUG_RETURN(1);
|
|
||||||
|
error:
|
||||||
|
if (server_cert != NULL)
|
||||||
|
X509_free (server_cert);
|
||||||
|
DBUG_RETURN(ret_validation);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_OPENSSL */
|
#endif /* HAVE_OPENSSL */
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/*
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
Copyright (c) 2010, 2016, MariaDB
|
||||||
Copyright (c) 2010, 2015, MariaDB
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -856,7 +855,12 @@ int field_conv(Field *to,Field *from)
|
|||||||
Field_blob *blob=(Field_blob*) to;
|
Field_blob *blob=(Field_blob*) to;
|
||||||
from->val_str(&blob->value);
|
from->val_str(&blob->value);
|
||||||
|
|
||||||
if (!blob->value.is_alloced() && from->is_updatable())
|
/*
|
||||||
|
Copy value if copy_blobs is set, or source is part of the table's
|
||||||
|
writeset.
|
||||||
|
*/
|
||||||
|
if (to->table->copy_blobs ||
|
||||||
|
(!blob->value.is_alloced() && from->is_updatable()))
|
||||||
blob->value.copy();
|
blob->value.copy();
|
||||||
|
|
||||||
return blob->store(blob->value.ptr(),blob->value.length(),from->charset());
|
return blob->store(blob->value.ptr(),blob->value.length(),from->charset());
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2010, 2014, Monty Program Ab.
|
Copyright (c) 2010, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define SQL_ITEM_INCLUDED
|
#define SQL_ITEM_INCLUDED
|
||||||
|
|
||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2015 Monty Program Ab.
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2015, MariaDB
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#ifndef ITEM_CMPFUNC_INCLUDED
|
#ifndef ITEM_CMPFUNC_INCLUDED
|
||||||
#define ITEM_CMPFUNC_INCLUDED
|
#define ITEM_CMPFUNC_INCLUDED
|
||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2015, MariaDB
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2012, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2012, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2013, Monty Program Ab
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2014, SkySQL Ab.
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2014, Monty Program Ab.
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -3093,7 +3093,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
|
|||||||
|
|
||||||
slave_proxy_id= thread_id = uint4korr(buf + Q_THREAD_ID_OFFSET);
|
slave_proxy_id= thread_id = uint4korr(buf + Q_THREAD_ID_OFFSET);
|
||||||
exec_time = uint4korr(buf + Q_EXEC_TIME_OFFSET);
|
exec_time = uint4korr(buf + Q_EXEC_TIME_OFFSET);
|
||||||
db_len = (uint)buf[Q_DB_LEN_OFFSET]; // TODO: add a check of all *_len vars
|
db_len = (uchar)buf[Q_DB_LEN_OFFSET]; // TODO: add a check of all *_len vars
|
||||||
error_code = uint2korr(buf + Q_ERR_CODE_OFFSET);
|
error_code = uint2korr(buf + Q_ERR_CODE_OFFSET);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -9692,8 +9692,8 @@ bool Table_map_log_event::write_data_body(IO_CACHE *file)
|
|||||||
DBUG_ASSERT(m_dbnam != NULL);
|
DBUG_ASSERT(m_dbnam != NULL);
|
||||||
DBUG_ASSERT(m_tblnam != NULL);
|
DBUG_ASSERT(m_tblnam != NULL);
|
||||||
/* We use only one byte per length for storage in event: */
|
/* We use only one byte per length for storage in event: */
|
||||||
DBUG_ASSERT(m_dblen < 128);
|
DBUG_ASSERT(m_dblen <= NAME_LEN);
|
||||||
DBUG_ASSERT(m_tbllen < 128);
|
DBUG_ASSERT(m_tbllen <= NAME_LEN);
|
||||||
|
|
||||||
uchar const dbuf[]= { (uchar) m_dblen };
|
uchar const dbuf[]= { (uchar) m_dblen };
|
||||||
uchar const tbuf[]= { (uchar) m_tbllen };
|
uchar const tbuf[]= { (uchar) m_tbllen };
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2010, 2015, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -293,7 +294,8 @@ static inline bool table_not_corrupt_error(uint sql_errno)
|
|||||||
sql_errno == ER_LOCK_WAIT_TIMEOUT ||
|
sql_errno == ER_LOCK_WAIT_TIMEOUT ||
|
||||||
sql_errno == ER_LOCK_DEADLOCK ||
|
sql_errno == ER_LOCK_DEADLOCK ||
|
||||||
sql_errno == ER_CANT_LOCK_LOG_TABLE ||
|
sql_errno == ER_CANT_LOCK_LOG_TABLE ||
|
||||||
sql_errno == ER_OPEN_AS_READONLY);
|
sql_errno == ER_OPEN_AS_READONLY ||
|
||||||
|
sql_errno == ER_WRONG_OBJECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -380,7 +382,13 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
lex->query_tables_last= &table->next_global;
|
lex->query_tables_last= &table->next_global;
|
||||||
lex->query_tables_own_last= 0;
|
lex->query_tables_own_last= 0;
|
||||||
|
|
||||||
if (view_operator_func == NULL)
|
/*
|
||||||
|
CHECK TABLE command is allowed for views as well. Check on alter flags
|
||||||
|
to differentiate from ALTER TABLE...CHECK PARTITION on which view is not
|
||||||
|
allowed.
|
||||||
|
*/
|
||||||
|
if (lex->alter_info.flags & ALTER_ADMIN_PARTITION ||
|
||||||
|
view_operator_func == NULL)
|
||||||
{
|
{
|
||||||
table->required_type=FRMTYPE_TABLE;
|
table->required_type=FRMTYPE_TABLE;
|
||||||
DBUG_ASSERT(!lex->only_view);
|
DBUG_ASSERT(!lex->only_view);
|
||||||
|
166
sql/sql_base.cc
166
sql/sql_base.cc
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2010, 2015, MariaDB
|
Copyright (c) 2010, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -217,11 +217,6 @@ static bool check_and_update_table_version(THD *thd, TABLE_LIST *tables,
|
|||||||
static bool open_table_entry_fini(THD *thd, TABLE_SHARE *share, TABLE *entry);
|
static bool open_table_entry_fini(THD *thd, TABLE_SHARE *share, TABLE *entry);
|
||||||
static bool auto_repair_table(THD *thd, TABLE_LIST *table_list);
|
static bool auto_repair_table(THD *thd, TABLE_LIST *table_list);
|
||||||
static void free_cache_entry(TABLE *entry);
|
static void free_cache_entry(TABLE *entry);
|
||||||
static bool
|
|
||||||
has_write_table_with_auto_increment(TABLE_LIST *tables);
|
|
||||||
static bool
|
|
||||||
has_write_table_with_auto_increment_and_select(TABLE_LIST *tables);
|
|
||||||
static bool has_write_table_auto_increment_not_first_in_pk(TABLE_LIST *tables);
|
|
||||||
|
|
||||||
uint cached_open_tables(void)
|
uint cached_open_tables(void)
|
||||||
{
|
{
|
||||||
@ -2913,6 +2908,16 @@ bool open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
|||||||
*/
|
*/
|
||||||
if (dd_frm_type(thd, path, ¬_used) == FRMTYPE_VIEW)
|
if (dd_frm_type(thd, path, ¬_used) == FRMTYPE_VIEW)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
If parent_l of the table_list is non null then a merge table
|
||||||
|
has this view as child table, which is not supported.
|
||||||
|
*/
|
||||||
|
if (table_list->parent_l)
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_MRG_TABLE, MYF(0));
|
||||||
|
DBUG_RETURN(true);
|
||||||
|
}
|
||||||
|
|
||||||
if (!tdc_open_view(thd, table_list, alias, key, key_length,
|
if (!tdc_open_view(thd, table_list, alias, key, key_length,
|
||||||
mem_root, 0))
|
mem_root, 0))
|
||||||
{
|
{
|
||||||
@ -5892,63 +5897,6 @@ bool lock_tables(THD *thd, TABLE_LIST *tables, uint count,
|
|||||||
*(ptr++)= table->table;
|
*(ptr++)= table->table;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
DML statements that modify a table with an auto_increment column based on
|
|
||||||
rows selected from a table are unsafe as the order in which the rows are
|
|
||||||
fetched fron the select tables cannot be determined and may differ on
|
|
||||||
master and slave.
|
|
||||||
*/
|
|
||||||
if (thd->variables.binlog_format != BINLOG_FORMAT_ROW && tables &&
|
|
||||||
has_write_table_with_auto_increment_and_select(tables))
|
|
||||||
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT);
|
|
||||||
/* Todo: merge all has_write_table_auto_inc with decide_logging_format */
|
|
||||||
if (thd->variables.binlog_format != BINLOG_FORMAT_ROW && tables)
|
|
||||||
{
|
|
||||||
if (has_write_table_auto_increment_not_first_in_pk(tables))
|
|
||||||
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
INSERT...ON DUPLICATE KEY UPDATE on a table with more than one unique keys
|
|
||||||
can be unsafe.
|
|
||||||
*/
|
|
||||||
uint unique_keys= 0;
|
|
||||||
for (TABLE_LIST *query_table= tables; query_table && unique_keys <= 1;
|
|
||||||
query_table= query_table->next_global)
|
|
||||||
if(query_table->table)
|
|
||||||
{
|
|
||||||
uint keys= query_table->table->s->keys, i= 0;
|
|
||||||
unique_keys= 0;
|
|
||||||
for (KEY* keyinfo= query_table->table->s->key_info;
|
|
||||||
i < keys && unique_keys <= 1; i++, keyinfo++)
|
|
||||||
{
|
|
||||||
if (keyinfo->flags & HA_NOSAME)
|
|
||||||
unique_keys++;
|
|
||||||
}
|
|
||||||
if (!query_table->placeholder() &&
|
|
||||||
query_table->lock_type >= TL_WRITE_ALLOW_WRITE &&
|
|
||||||
unique_keys > 1 && thd->lex->sql_command == SQLCOM_INSERT &&
|
|
||||||
/* Duplicate key update is not supported by INSERT DELAYED */
|
|
||||||
thd->command != COM_DELAYED_INSERT &&
|
|
||||||
thd->lex->duplicates == DUP_UPDATE)
|
|
||||||
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We have to emulate LOCK TABLES if we are statement needs prelocking. */
|
|
||||||
if (thd->lex->requires_prelocking())
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
A query that modifies autoinc column in sub-statement can make the
|
|
||||||
master and slave inconsistent.
|
|
||||||
We can solve these problems in mixed mode by switching to binlogging
|
|
||||||
if at least one updated table is used by sub-statement
|
|
||||||
*/
|
|
||||||
if (thd->variables.binlog_format != BINLOG_FORMAT_ROW && tables &&
|
|
||||||
has_write_table_with_auto_increment(thd->lex->first_not_own_table()))
|
|
||||||
thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS);
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG_SYNC(thd, "before_lock_tables_takes_lock");
|
DEBUG_SYNC(thd, "before_lock_tables_takes_lock");
|
||||||
|
|
||||||
if (! (thd->lock= mysql_lock_tables(thd, start, (uint) (ptr - start),
|
if (! (thd->lock= mysql_lock_tables(thd, start, (uint) (ptr - start),
|
||||||
@ -9673,98 +9621,6 @@ bool is_equal(const LEX_STRING *a, const LEX_STRING *b)
|
|||||||
return a->length == b->length && !strncmp(a->str, b->str, a->length);
|
return a->length == b->length && !strncmp(a->str, b->str, a->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Tells if two (or more) tables have auto_increment columns and we want to
|
|
||||||
lock those tables with a write lock.
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
has_two_write_locked_tables_with_auto_increment
|
|
||||||
tables Table list
|
|
||||||
|
|
||||||
NOTES:
|
|
||||||
Call this function only when you have established the list of all tables
|
|
||||||
which you'll want to update (including stored functions, triggers, views
|
|
||||||
inside your statement).
|
|
||||||
*/
|
|
||||||
|
|
||||||
static bool
|
|
||||||
has_write_table_with_auto_increment(TABLE_LIST *tables)
|
|
||||||
{
|
|
||||||
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
|
||||||
{
|
|
||||||
/* we must do preliminary checks as table->table may be NULL */
|
|
||||||
if (!table->placeholder() &&
|
|
||||||
table->table->found_next_number_field &&
|
|
||||||
(table->lock_type >= TL_WRITE_ALLOW_WRITE))
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
checks if we have select tables in the table list and write tables
|
|
||||||
with auto-increment column.
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
has_two_write_locked_tables_with_auto_increment_and_select
|
|
||||||
tables Table list
|
|
||||||
|
|
||||||
RETURN VALUES
|
|
||||||
|
|
||||||
-true if the table list has atleast one table with auto-increment column
|
|
||||||
|
|
||||||
|
|
||||||
and atleast one table to select from.
|
|
||||||
-false otherwise
|
|
||||||
*/
|
|
||||||
|
|
||||||
static bool
|
|
||||||
has_write_table_with_auto_increment_and_select(TABLE_LIST *tables)
|
|
||||||
{
|
|
||||||
bool has_select= false;
|
|
||||||
bool has_auto_increment_tables = has_write_table_with_auto_increment(tables);
|
|
||||||
for(TABLE_LIST *table= tables; table; table= table->next_global)
|
|
||||||
{
|
|
||||||
if (!table->placeholder() &&
|
|
||||||
(table->lock_type <= TL_READ_NO_INSERT))
|
|
||||||
{
|
|
||||||
has_select= true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(has_select && has_auto_increment_tables);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Tells if there is a table whose auto_increment column is a part
|
|
||||||
of a compound primary key while is not the first column in
|
|
||||||
the table definition.
|
|
||||||
|
|
||||||
@param tables Table list
|
|
||||||
|
|
||||||
@return true if the table exists, fais if does not.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static bool
|
|
||||||
has_write_table_auto_increment_not_first_in_pk(TABLE_LIST *tables)
|
|
||||||
{
|
|
||||||
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
|
||||||
{
|
|
||||||
/* we must do preliminary checks as table->table may be NULL */
|
|
||||||
if (!table->placeholder() &&
|
|
||||||
table->table->found_next_number_field &&
|
|
||||||
(table->lock_type >= TL_WRITE_ALLOW_WRITE)
|
|
||||||
&& table->table->s->next_number_keypart != 0)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Open and lock system tables for read.
|
Open and lock system tables for read.
|
||||||
|
|
||||||
|
135
sql/sql_class.cc
135
sql/sql_class.cc
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2008, 2015, MariaDB
|
Copyright (c) 2008, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -4493,6 +4493,94 @@ void xid_cache_delete(XID_STATE *xid_state)
|
|||||||
mysql_mutex_unlock(&LOCK_xid_cache);
|
mysql_mutex_unlock(&LOCK_xid_cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tells if two (or more) tables have auto_increment columns and we want to
|
||||||
|
lock those tables with a write lock.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
has_two_write_locked_tables_with_auto_increment
|
||||||
|
tables Table list
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
Call this function only when you have established the list of all tables
|
||||||
|
which you'll want to update (including stored functions, triggers, views
|
||||||
|
inside your statement).
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool
|
||||||
|
has_write_table_with_auto_increment(TABLE_LIST *tables)
|
||||||
|
{
|
||||||
|
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
||||||
|
{
|
||||||
|
/* we must do preliminary checks as table->table may be NULL */
|
||||||
|
if (!table->placeholder() &&
|
||||||
|
table->table->found_next_number_field &&
|
||||||
|
(table->lock_type >= TL_WRITE_ALLOW_WRITE))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
checks if we have select tables in the table list and write tables
|
||||||
|
with auto-increment column.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
has_two_write_locked_tables_with_auto_increment_and_select
|
||||||
|
tables Table list
|
||||||
|
|
||||||
|
RETURN VALUES
|
||||||
|
|
||||||
|
-true if the table list has atleast one table with auto-increment column
|
||||||
|
|
||||||
|
|
||||||
|
and atleast one table to select from.
|
||||||
|
-false otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool
|
||||||
|
has_write_table_with_auto_increment_and_select(TABLE_LIST *tables)
|
||||||
|
{
|
||||||
|
bool has_select= false;
|
||||||
|
bool has_auto_increment_tables = has_write_table_with_auto_increment(tables);
|
||||||
|
for(TABLE_LIST *table= tables; table; table= table->next_global)
|
||||||
|
{
|
||||||
|
if (!table->placeholder() &&
|
||||||
|
(table->lock_type <= TL_READ_NO_INSERT))
|
||||||
|
{
|
||||||
|
has_select= true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(has_select && has_auto_increment_tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tells if there is a table whose auto_increment column is a part
|
||||||
|
of a compound primary key while is not the first column in
|
||||||
|
the table definition.
|
||||||
|
|
||||||
|
@param tables Table list
|
||||||
|
|
||||||
|
@return true if the table exists, fais if does not.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool
|
||||||
|
has_write_table_auto_increment_not_first_in_pk(TABLE_LIST *tables)
|
||||||
|
{
|
||||||
|
for (TABLE_LIST *table= tables; table; table= table->next_global)
|
||||||
|
{
|
||||||
|
/* we must do preliminary checks as table->table may be NULL */
|
||||||
|
if (!table->placeholder() &&
|
||||||
|
table->table->found_next_number_field &&
|
||||||
|
(table->lock_type >= TL_WRITE_ALLOW_WRITE)
|
||||||
|
&& table->table->s->next_number_keypart != 0)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Decide on logging format to use for the statement and issue errors
|
Decide on logging format to use for the statement and issue errors
|
||||||
@ -4656,6 +4744,31 @@ int THD::decide_logging_format(TABLE_LIST *tables)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (variables.binlog_format != BINLOG_FORMAT_ROW && tables)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
DML statements that modify a table with an auto_increment column based on
|
||||||
|
rows selected from a table are unsafe as the order in which the rows are
|
||||||
|
fetched fron the select tables cannot be determined and may differ on
|
||||||
|
master and slave.
|
||||||
|
*/
|
||||||
|
if (has_write_table_with_auto_increment_and_select(tables))
|
||||||
|
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_WRITE_AUTOINC_SELECT);
|
||||||
|
|
||||||
|
if (has_write_table_auto_increment_not_first_in_pk(tables))
|
||||||
|
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST);
|
||||||
|
|
||||||
|
/*
|
||||||
|
A query that modifies autoinc column in sub-statement can make the
|
||||||
|
master and slave inconsistent.
|
||||||
|
We can solve these problems in mixed mode by switching to binlogging
|
||||||
|
if at least one updated table is used by sub-statement
|
||||||
|
*/
|
||||||
|
if (lex->requires_prelocking() &&
|
||||||
|
has_write_table_with_auto_increment(lex->first_not_own_table()))
|
||||||
|
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Get the capabilities vector for all involved storage engines and
|
Get the capabilities vector for all involved storage engines and
|
||||||
mask out the flags for the binary log.
|
mask out the flags for the binary log.
|
||||||
@ -4694,6 +4807,26 @@ int THD::decide_logging_format(TABLE_LIST *tables)
|
|||||||
|
|
||||||
prev_write_table= table->table;
|
prev_write_table= table->table;
|
||||||
|
|
||||||
|
/*
|
||||||
|
INSERT...ON DUPLICATE KEY UPDATE on a table with more than one unique keys
|
||||||
|
can be unsafe. Check for it if the flag is already not marked for the
|
||||||
|
given statement.
|
||||||
|
*/
|
||||||
|
if (!lex->is_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS) &&
|
||||||
|
lex->sql_command == SQLCOM_INSERT &&
|
||||||
|
/* Duplicate key update is not supported by INSERT DELAYED */
|
||||||
|
command != COM_DELAYED_INSERT && lex->duplicates == DUP_UPDATE)
|
||||||
|
{
|
||||||
|
uint keys= table->table->s->keys, i= 0, unique_keys= 0;
|
||||||
|
for (KEY* keyinfo= table->table->s->key_info;
|
||||||
|
i < keys && unique_keys <= 1; i++, keyinfo++)
|
||||||
|
{
|
||||||
|
if (keyinfo->flags & HA_NOSAME)
|
||||||
|
unique_keys++;
|
||||||
|
}
|
||||||
|
if (unique_keys > 1 )
|
||||||
|
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_INSERT_TWO_KEYS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
flags_access_some_set |= flags;
|
flags_access_some_set |= flags;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2014, MariaDB
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2014, Monty Program Ab.
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2010, 2014, Monty Program Ab.
|
Copyright (c) 2010, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -1481,6 +1481,11 @@ public:
|
|||||||
return get_stmt_unsafe_flags() != 0;
|
return get_stmt_unsafe_flags() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool is_stmt_unsafe(enum_binlog_stmt_unsafe unsafe)
|
||||||
|
{
|
||||||
|
return binlog_stmt_flags & (1 << unsafe);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Flag the current (top-level) statement as unsafe.
|
Flag the current (top-level) statement as unsafe.
|
||||||
The flag will be reset after the statement has finished.
|
The flag will be reset after the statement has finished.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2015 Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2015 Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2015 MariaDB
|
Copyright (c) 2009, 2016 MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2015, MariaDB
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -1255,20 +1255,17 @@ static const char *require_quotes(const char *name, uint name_length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
Quote the given identifier if needed and append it to the target string.
|
Convert and quote the given identifier if needed and append it to the
|
||||||
If the given identifier is empty, it will be quoted.
|
target string. If the given identifier is empty, it will be quoted.
|
||||||
|
@thd thread handler
|
||||||
|
@packet target string
|
||||||
|
@name the identifier to be appended
|
||||||
|
@length length of the appending identifier
|
||||||
|
|
||||||
SYNOPSIS
|
@return
|
||||||
append_identifier()
|
0 success
|
||||||
thd thread handler
|
1 error
|
||||||
packet target string
|
|
||||||
name the identifier to be appended
|
|
||||||
name_length length of the appending identifier
|
|
||||||
|
|
||||||
RETURN VALUES
|
|
||||||
true Error
|
|
||||||
false Ok
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2005, 2010, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2012, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2010, 2015, MariaDB
|
Copyright (c) 2010, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -3135,8 +3135,31 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Field redefined */
|
/* Field redefined */
|
||||||
|
|
||||||
|
/*
|
||||||
|
If we are replacing a BIT field, revert the increment
|
||||||
|
of total_uneven_bit_length that was done above.
|
||||||
|
*/
|
||||||
|
if (sql_field->sql_type == MYSQL_TYPE_BIT &&
|
||||||
|
file->ha_table_flags() & HA_CAN_BIT_FIELD)
|
||||||
|
total_uneven_bit_length-= sql_field->length & 7;
|
||||||
|
|
||||||
sql_field->def= dup_field->def;
|
sql_field->def= dup_field->def;
|
||||||
sql_field->sql_type= dup_field->sql_type;
|
sql_field->sql_type= dup_field->sql_type;
|
||||||
|
|
||||||
|
/*
|
||||||
|
If we are replacing a field with a BIT field, we need
|
||||||
|
to initialize pack_flag. Note that we do not need to
|
||||||
|
increment total_uneven_bit_length here as this dup_field
|
||||||
|
has already been processed.
|
||||||
|
*/
|
||||||
|
if (sql_field->sql_type == MYSQL_TYPE_BIT)
|
||||||
|
{
|
||||||
|
sql_field->pack_flag= FIELDFLAG_NUMBER;
|
||||||
|
if (!(file->ha_table_flags() & HA_CAN_BIT_FIELD))
|
||||||
|
sql_field->pack_flag|= FIELDFLAG_TREAT_BIT_AS_CHAR;
|
||||||
|
}
|
||||||
|
|
||||||
sql_field->charset= (dup_field->charset ?
|
sql_field->charset= (dup_field->charset ?
|
||||||
dup_field->charset :
|
dup_field->charset :
|
||||||
create_info->default_table_charset);
|
create_info->default_table_charset);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2006, 2010, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1995, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -2103,12 +2103,7 @@ buf_flush_stat_update(void)
|
|||||||
ib_uint64_t lsn;
|
ib_uint64_t lsn;
|
||||||
ulint n_flushed;
|
ulint n_flushed;
|
||||||
|
|
||||||
lsn = log_get_lsn_nowait();
|
if (!log_peek_lsn(&lsn)) {
|
||||||
|
|
||||||
/* log_get_lsn_nowait tries to get log_sys->mutex with
|
|
||||||
mutex_enter_nowait, if this does not succeed function
|
|
||||||
returns 0, do not use that value to update stats. */
|
|
||||||
if (lsn == 0) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2008, 2009 Google Inc.
|
Copyright (c) 2008, 2009 Google Inc.
|
||||||
Copyright (c) 2009, Percona Inc.
|
Copyright (c) 2009, Percona Inc.
|
||||||
Copyright (c) 2013, 2014, SkySQL Ab. All Rights Reserved.
|
Copyright (c) 2013, 2014, SkySQL Ab. All Rights Reserved.
|
||||||
@ -2433,6 +2433,8 @@ exit_func:
|
|||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
A thread which prints warnings about semaphore waits which have lasted
|
A thread which prints warnings about semaphore waits which have lasted
|
||||||
too long. These can be used to track bugs which cause hangs.
|
too long. These can be used to track bugs which cause hangs.
|
||||||
|
Note: In order to make sync_arr_wake_threads_if_sema_free work as expected,
|
||||||
|
we should avoid waiting any mutexes in this function!
|
||||||
@return a dummy parameter */
|
@return a dummy parameter */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
os_thread_ret_t
|
os_thread_ret_t
|
||||||
@ -2470,24 +2472,21 @@ loop:
|
|||||||
|
|
||||||
/* Try to track a strange bug reported by Harald Fuchs and others,
|
/* Try to track a strange bug reported by Harald Fuchs and others,
|
||||||
where the lsn seems to decrease at times */
|
where the lsn seems to decrease at times */
|
||||||
|
if (log_peek_lsn(&new_lsn)) {
|
||||||
|
if (new_lsn < old_lsn) {
|
||||||
|
ut_print_timestamp(stderr);
|
||||||
|
fprintf(stderr,
|
||||||
|
" InnoDB: Error: old log sequence number %llu"
|
||||||
|
" was greater\n"
|
||||||
|
"InnoDB: than the new log sequence number %llu!\n"
|
||||||
|
"InnoDB: Please submit a bug report"
|
||||||
|
" to http://bugs.mysql.com\n",
|
||||||
|
old_lsn, new_lsn);
|
||||||
|
ut_ad(0);
|
||||||
|
}
|
||||||
|
|
||||||
/* We have to use nowait to ensure we don't block */
|
|
||||||
new_lsn= log_get_lsn_nowait();
|
|
||||||
|
|
||||||
if (new_lsn && new_lsn < old_lsn) {
|
|
||||||
ut_print_timestamp(stderr);
|
|
||||||
fprintf(stderr,
|
|
||||||
" InnoDB: Error: old log sequence number %llu"
|
|
||||||
" was greater\n"
|
|
||||||
"InnoDB: than the new log sequence number %llu!\n"
|
|
||||||
"InnoDB: Please submit a bug report"
|
|
||||||
" to http://bugs.mysql.com\n",
|
|
||||||
old_lsn, new_lsn);
|
|
||||||
ut_ad(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_lsn)
|
|
||||||
old_lsn = new_lsn;
|
old_lsn = new_lsn;
|
||||||
|
}
|
||||||
|
|
||||||
if (difftime(time(NULL), srv_last_monitor_time) > 60) {
|
if (difftime(time(NULL), srv_last_monitor_time) > 60) {
|
||||||
/* We referesh InnoDB Monitor values so that averages are
|
/* We referesh InnoDB Monitor values so that averages are
|
||||||
|
Loading…
x
Reference in New Issue
Block a user