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_MINOR=5
|
||||
MYSQL_VERSION_PATCH=47
|
||||
MYSQL_VERSION_PATCH=48
|
||||
MYSQL_VERSION_EXTRA=
|
||||
|
@ -12,6 +12,17 @@ before calling SSL_new();
|
||||
|
||||
*** 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)
|
||||
This release of yaSSL fixes a high security vulnerability. All users
|
||||
SHOULD update. If using yaSSL for TLS on the server side with private
|
||||
|
@ -378,6 +378,7 @@ public:
|
||||
|
||||
uint get_agreedKeyLength() const;
|
||||
const byte* get_agreedKey() const;
|
||||
uint get_publicKeyLength() const;
|
||||
const byte* get_publicKey() const;
|
||||
void makeAgreement(const byte*, unsigned int);
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
||||
#include "rsa.h"
|
||||
|
||||
|
||||
#define YASSL_VERSION "2.3.8"
|
||||
#define YASSL_VERSION "2.3.9"
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
@ -751,9 +751,10 @@ struct DiffieHellman::DHImpl {
|
||||
byte* publicKey_;
|
||||
byte* privateKey_;
|
||||
byte* agreedKey_;
|
||||
uint pubKeyLength_;
|
||||
|
||||
DHImpl(TaoCrypt::RandomNumberGenerator& r) : ranPool_(r), publicKey_(0),
|
||||
privateKey_(0), agreedKey_(0) {}
|
||||
privateKey_(0), agreedKey_(0), pubKeyLength_(0) {}
|
||||
~DHImpl()
|
||||
{
|
||||
ysArrayDelete(agreedKey_);
|
||||
@ -762,7 +763,7 @@ struct DiffieHellman::DHImpl {
|
||||
}
|
||||
|
||||
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();
|
||||
AllocKeys(length, length, length);
|
||||
@ -810,7 +811,7 @@ DiffieHellman::DiffieHellman(const byte* p, unsigned int pSz, const byte* g,
|
||||
using TaoCrypt::Integer;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -869,6 +870,10 @@ const byte* DiffieHellman::get_agreedKey() const
|
||||
return pimpl_->agreedKey_;
|
||||
}
|
||||
|
||||
uint DiffieHellman::get_publicKeyLength() const
|
||||
{
|
||||
return pimpl_->pubKeyLength_;
|
||||
}
|
||||
|
||||
const byte* DiffieHellman::get_publicKey() const
|
||||
{
|
||||
|
@ -109,15 +109,12 @@ void ClientDiffieHellmanPublic::build(SSL& ssl)
|
||||
uint keyLength = dhClient.get_agreedKeyLength(); // pub and agree same
|
||||
|
||||
alloc(keyLength, true);
|
||||
dhClient.makeAgreement(dhServer.get_publicKey(), keyLength);
|
||||
dhClient.makeAgreement(dhServer.get_publicKey(),
|
||||
dhServer.get_publicKeyLength());
|
||||
c16toa(keyLength, Yc_);
|
||||
memcpy(Yc_ + KEY_OFFSET, dhClient.get_publicKey(), keyLength);
|
||||
|
||||
// because of encoding first byte might be zero, don't use it for preMaster
|
||||
if (*dhClient.get_agreedKey() == 0)
|
||||
ssl.set_preMaster(dhClient.get_agreedKey() + 1, keyLength - 1);
|
||||
else
|
||||
ssl.set_preMaster(dhClient.get_agreedKey(), keyLength);
|
||||
ssl.set_preMaster(dhClient.get_agreedKey(), keyLength);
|
||||
}
|
||||
|
||||
|
||||
@ -321,11 +318,7 @@ void ClientDiffieHellmanPublic::read(SSL& ssl, input_buffer& input)
|
||||
}
|
||||
dh.makeAgreement(Yc_, keyLength);
|
||||
|
||||
// because of encoding, first byte might be 0, don't use for preMaster
|
||||
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.set_preMaster(dh.get_agreedKey(), dh.get_agreedKeyLength());
|
||||
ssl.makeMasterSecret();
|
||||
}
|
||||
|
||||
|
@ -807,6 +807,19 @@ void SSL::set_random(const opaque* random, ConnectionEnd sender)
|
||||
// store client pre master secret
|
||||
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);
|
||||
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
|
||||
void SSL::makeMasterSecret()
|
||||
{
|
||||
if (GetError()) return;
|
||||
|
||||
if (isTLS())
|
||||
makeTLSMasterSecret();
|
||||
else {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2011, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2015, MariaDB
|
||||
/* Copyright (c) 2011, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -17,7 +17,7 @@
|
||||
#ifndef _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
|
||||
|
@ -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);
|
||||
1
|
||||
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;
|
||||
time('10:10:10') > 10
|
||||
1
|
||||
|
@ -4413,57 +4413,57 @@ test.t1 repair status OK
|
||||
test.t2 repair status OK
|
||||
test.t3 repair status OK
|
||||
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
|
||||
test.t1 optimize status OK
|
||||
test.t2 optimize status OK
|
||||
test.t3 optimize status OK
|
||||
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
|
||||
test.t1 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.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
call bug13012()|
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 repair status OK
|
||||
test.t2 repair status OK
|
||||
test.t3 repair status OK
|
||||
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
|
||||
test.t1 optimize status OK
|
||||
test.t2 optimize status OK
|
||||
test.t3 optimize status OK
|
||||
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
|
||||
test.t1 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.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
call bug13012()|
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 repair status OK
|
||||
test.t2 repair status OK
|
||||
test.t3 repair status OK
|
||||
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
|
||||
test.t1 optimize status OK
|
||||
test.t2 optimize status OK
|
||||
test.t3 optimize status OK
|
||||
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
|
||||
test.t1 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.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
drop procedure bug13012|
|
||||
drop view v1|
|
||||
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;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||
test.v1 optimize error Corrupt
|
||||
test.v1 optimize status Operation failed
|
||||
ANALYZE TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
REPAIR TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||
test.v1 repair error Corrupt
|
||||
test.v1 repair status Operation failed
|
||||
DROP TABLE t1;
|
||||
OPTIMIZE TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 optimize Error 'test.v1' is not BASE TABLE
|
||||
test.v1 optimize error Corrupt
|
||||
test.v1 optimize status Operation failed
|
||||
ANALYZE TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 analyze Error 'test.v1' is not BASE TABLE
|
||||
test.v1 analyze error Corrupt
|
||||
test.v1 analyze status Operation failed
|
||||
REPAIR TABLE v1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.v1 repair Error 'test.v1' is not BASE TABLE
|
||||
test.v1 repair error Corrupt
|
||||
test.v1 repair status Operation failed
|
||||
DROP VIEW v1;
|
||||
create definer = current_user() sql security invoker view v1 as select 1;
|
||||
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);
|
||||
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') > 1010;
|
||||
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) 2008-2011, Monty Program Ab
|
||||
# Copyright (c) 2005, 2015, Oracle and/or its affiliates.
|
||||
# Copyright (c) 2008, 2016, MariaDB
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
@ -1057,8 +1057,8 @@
|
||||
# write_keys() and find_all_keys().
|
||||
# They both return ha_rows, which is platform dependent.
|
||||
#
|
||||
# The '...' wildcards are for 'fun:inline_mysql_file_write' which *may*
|
||||
# be inlined.
|
||||
# The '...' wildcards are for 'fun:inline_mysql_file_write' and
|
||||
# 'fun:find_all_keys' which *may* be inlined.
|
||||
{
|
||||
Bug#12856915 VALGRIND FAILURE IN FILESORT/CREATE_SORT_INDEX / one
|
||||
Memcheck:Param
|
||||
@ -1069,7 +1069,7 @@
|
||||
fun:my_b_flush_io_cache
|
||||
fun:_my_b_write
|
||||
fun:_Z*10write_keysP13st_sort_paramPPhjP11st_io_cacheS4_
|
||||
fun:_Z*13find_all_keysP13st_sort_paramP10SQL_SELECTPPhP11st_io_cacheS6_
|
||||
...
|
||||
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
|
||||
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
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Copyright (C) 2007 Google Inc.
|
||||
Copyright (c) 2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
||||
Use is subject to license terms.
|
||||
Copyright (c) 2008, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2003, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
/* Copyright (c) 2003, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -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)
|
||||
{
|
||||
SSL *ssl;
|
||||
X509 *server_cert;
|
||||
X509_NAME *x509sn;
|
||||
int cn_pos;
|
||||
X509_NAME_ENTRY *cn_entry;
|
||||
ASN1_STRING *cn_asn1;
|
||||
const char *cn_str;
|
||||
X509 *server_cert= NULL;
|
||||
char *cn= NULL;
|
||||
int cn_loc= -1;
|
||||
ASN1_STRING *cn_asn1= NULL;
|
||||
X509_NAME_ENTRY *cn_entry= NULL;
|
||||
X509_NAME *subject= NULL;
|
||||
int ret_validation= 1;
|
||||
|
||||
DBUG_ENTER("ssl_verify_server_cert");
|
||||
DBUG_PRINT("enter", ("server_hostname: %s", server_hostname));
|
||||
|
||||
if (!(ssl= (SSL*)vio->ssl_arg))
|
||||
{
|
||||
*errptr= "No SSL pointer found";
|
||||
DBUG_RETURN(1);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!server_hostname)
|
||||
{
|
||||
*errptr= "No server hostname supplied";
|
||||
DBUG_RETURN(1);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!(server_cert= SSL_get_peer_certificate(ssl)))
|
||||
{
|
||||
*errptr= "Could not get server certificate";
|
||||
DBUG_RETURN(1);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (X509_V_OK != SSL_get_verify_result(ssl))
|
||||
{
|
||||
*errptr= "Failed to verify the server certificate";
|
||||
X509_free(server_cert);
|
||||
DBUG_RETURN(1);
|
||||
goto error;
|
||||
}
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
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)
|
||||
goto err;
|
||||
subject= X509_get_subject_name(server_cert);
|
||||
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)))
|
||||
goto err;
|
||||
cn_entry= X509_NAME_get_entry(subject, cn_loc);
|
||||
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)))
|
||||
goto err;
|
||||
cn_asn1 = X509_NAME_ENTRY_get_data(cn_entry);
|
||||
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_str))
|
||||
goto err;
|
||||
if ((size_t)ASN1_STRING_length(cn_asn1) != strlen(cn))
|
||||
{
|
||||
*errptr= "NULL embedded in the certificate CN";
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (strcmp(cn_str, server_hostname))
|
||||
goto err;
|
||||
DBUG_PRINT("info", ("Server hostname in cert: %s", cn));
|
||||
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";
|
||||
DBUG_RETURN(1);
|
||||
|
||||
error:
|
||||
if (server_cert != NULL)
|
||||
X509_free (server_cert);
|
||||
DBUG_RETURN(ret_validation);
|
||||
}
|
||||
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
@ -1,6 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2015, MariaDB
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -856,7 +855,12 @@ int field_conv(Field *to,Field *from)
|
||||
Field_blob *blob=(Field_blob*) to;
|
||||
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();
|
||||
|
||||
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) 2010, 2014, Monty Program Ab.
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -2,7 +2,7 @@
|
||||
#define SQL_ITEM_INCLUDED
|
||||
|
||||
/* 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
|
||||
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) 2009, 2015, MariaDB
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -1,7 +1,7 @@
|
||||
#ifndef ITEM_CMPFUNC_INCLUDED
|
||||
#define ITEM_CMPFUNC_INCLUDED
|
||||
/* 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
|
||||
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) 2009, 2013, Monty Program Ab
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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
|
||||
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) 2009, 2014, Monty Program Ab.
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -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);
|
||||
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);
|
||||
|
||||
/*
|
||||
@ -9692,8 +9692,8 @@ bool Table_map_log_event::write_data_body(IO_CACHE *file)
|
||||
DBUG_ASSERT(m_dbnam != NULL);
|
||||
DBUG_ASSERT(m_tblnam != NULL);
|
||||
/* We use only one byte per length for storage in event: */
|
||||
DBUG_ASSERT(m_dblen < 128);
|
||||
DBUG_ASSERT(m_tbllen < 128);
|
||||
DBUG_ASSERT(m_dblen <= NAME_LEN);
|
||||
DBUG_ASSERT(m_tbllen <= NAME_LEN);
|
||||
|
||||
uchar const dbuf[]= { (uchar) m_dblen };
|
||||
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
|
||||
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_DEADLOCK ||
|
||||
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_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;
|
||||
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) 2010, 2015, MariaDB
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -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 auto_repair_table(THD *thd, TABLE_LIST *table_list);
|
||||
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)
|
||||
{
|
||||
@ -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 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,
|
||||
mem_root, 0))
|
||||
{
|
||||
@ -5892,63 +5897,6 @@ bool lock_tables(THD *thd, TABLE_LIST *tables, uint count,
|
||||
*(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");
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
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.
|
||||
|
||||
|
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) 2008, 2015, MariaDB
|
||||
Copyright (c) 2008, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -4493,6 +4493,94 @@ void xid_cache_delete(XID_STATE *xid_state)
|
||||
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
|
||||
@ -4656,6 +4744,31 @@ int THD::decide_logging_format(TABLE_LIST *tables)
|
||||
}
|
||||
#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
|
||||
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;
|
||||
|
||||
/*
|
||||
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;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
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
|
||||
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) 2009, 2014, Monty Program Ab.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2014, Monty Program Ab.
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -1481,6 +1481,11 @@ public:
|
||||
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.
|
||||
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) 2009, 2015 MariaDB
|
||||
Copyright (c) 2009, 2016 MariaDB
|
||||
|
||||
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
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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
|
||||
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.
|
||||
If the given identifier is empty, it will be quoted.
|
||||
/**
|
||||
Convert and quote the given identifier if needed and append it to the
|
||||
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
|
||||
append_identifier()
|
||||
thd thread handler
|
||||
packet target string
|
||||
name the identifier to be appended
|
||||
name_length length of the appending identifier
|
||||
|
||||
RETURN VALUES
|
||||
true Error
|
||||
false Ok
|
||||
@return
|
||||
0 success
|
||||
1 error
|
||||
*/
|
||||
|
||||
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
|
||||
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) 2010, 2015, MariaDB
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
@ -3135,8 +3135,31 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
||||
else
|
||||
{
|
||||
/* 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->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 ?
|
||||
dup_field->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
|
||||
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
|
||||
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;
|
||||
ulint n_flushed;
|
||||
|
||||
lsn = log_get_lsn_nowait();
|
||||
|
||||
/* 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) {
|
||||
if (!log_peek_lsn(&lsn)) {
|
||||
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) 2009, Percona Inc.
|
||||
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
|
||||
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 */
|
||||
UNIV_INTERN
|
||||
os_thread_ret_t
|
||||
@ -2470,24 +2472,21 @@ loop:
|
||||
|
||||
/* Try to track a strange bug reported by Harald Fuchs and others,
|
||||
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;
|
||||
}
|
||||
|
||||
if (difftime(time(NULL), srv_last_monitor_time) > 60) {
|
||||
/* We referesh InnoDB Monitor values so that averages are
|
||||
|
Loading…
x
Reference in New Issue
Block a user