Merge branch 'mysql/5.5' into 5.5

This commit is contained in:
Sergei Golubchik 2016-04-20 15:25:55 +02:00
commit b069d19284
48 changed files with 476 additions and 159 deletions

View File

@ -1,4 +1,4 @@
MYSQL_VERSION_MAJOR=5 MYSQL_VERSION_MAJOR=5
MYSQL_VERSION_MINOR=5 MYSQL_VERSION_MINOR=5
MYSQL_VERSION_PATCH=48 MYSQL_VERSION_PATCH=49
MYSQL_VERSION_EXTRA= MYSQL_VERSION_EXTRA=

View File

@ -1,5 +1,6 @@
/* /*
Copyright (c) 2001, 2012, Oracle and/or its affiliates. Copyright (c) 2001, 2012, 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

View File

@ -1,6 +1,6 @@
/* /*
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

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2006, 2013, Oracle and/or its affiliates. Copyright (c) 2006, 2013, 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

View File

@ -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, Monty Program Ab.
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

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2001, 2011, Oracle and/or its affiliates. Copyright (c) 2001, 2011, 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

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2000, 2013, Oracle and/or its affiliates. Copyright (c) 2000, 2013, Oracle and/or its affiliates.
Copyright (c) 2010, 2015, 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

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2000, 2015, Oracle and/or its affiliates. Copyright (c) 2000, 2015, 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

View File

@ -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

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2005, 2015, Oracle and/or its affiliates. Copyright (c) 2005, 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

View File

@ -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, 2013, Monty Program Ab. Copyright (c) 2009, 2016, Monty Program Ab.
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

View File

@ -12,6 +12,12 @@ before calling SSL_new();
*** end Note *** *** end Note ***
yaSSL Release notes, version 2.3.9b (2/03/2016)
This release of yaSSL fixes the OpenSSL compatibility function
X509_NAME_get_index_by_NID() to use the actual index of the common name
instead of searching on the format prefix. Thanks for the report from
yashwant.sahu@oracle.com . Anyone using this function should update.
yaSSL Release notes, version 2.3.9 (12/01/2015) yaSSL Release notes, version 2.3.9 (12/01/2015)
This release of yaSSL fixes two client side Diffie-Hellman problems. 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 yaSSL was only handling the cases of zero or one leading zeros for the key

View File

@ -35,7 +35,7 @@
#include "rsa.h" #include "rsa.h"
#define YASSL_VERSION "2.3.9" #define YASSL_VERSION "2.3.9b"
#if defined(__cplusplus) #if defined(__cplusplus)

View File

@ -191,14 +191,18 @@ private:
class X509_NAME { class X509_NAME {
char* name_; char* name_;
size_t sz_; size_t sz_;
int cnPosition_; // start of common name, -1 is none
int cnLen_; // length of above
ASN1_STRING entry_; ASN1_STRING entry_;
public: public:
X509_NAME(const char*, size_t sz); X509_NAME(const char*, size_t sz, int pos, int len);
~X509_NAME(); ~X509_NAME();
const char* GetName() const; const char* GetName() const;
ASN1_STRING* GetEntry(int i); ASN1_STRING* GetEntry(int i);
size_t GetLength() const; size_t GetLength() const;
int GetCnPosition() const { return cnPosition_; }
int GetCnLength() const { return cnLen_; }
private: private:
X509_NAME(const X509_NAME&); // hide copy X509_NAME(const X509_NAME&); // hide copy
X509_NAME& operator=(const X509_NAME&); // and assign X509_NAME& operator=(const X509_NAME&); // and assign
@ -226,7 +230,7 @@ class X509 {
StringHolder afterDate_; // not valid after StringHolder afterDate_; // not valid after
public: public:
X509(const char* i, size_t, const char* s, size_t, X509(const char* i, size_t, const char* s, size_t,
const char* b, int, const char* a, int); const char* b, int, const char* a, int, int, int, int, int);
~X509() {} ~X509() {}
X509_NAME* GetIssuer(); X509_NAME* GetIssuer();

View File

@ -293,7 +293,10 @@ int CertManager::Validate()
int aSz = (int)strlen(cert.GetAfterDate()) + 1; int aSz = (int)strlen(cert.GetAfterDate()) + 1;
peerX509_ = NEW_YS X509(cert.GetIssuer(), iSz, cert.GetCommonName(), peerX509_ = NEW_YS X509(cert.GetIssuer(), iSz, cert.GetCommonName(),
sSz, cert.GetBeforeDate(), bSz, sSz, cert.GetBeforeDate(), bSz,
cert.GetAfterDate(), aSz); cert.GetAfterDate(), aSz,
cert.GetIssuerCnStart(), cert.GetIssuerCnLength(),
cert.GetSubjectCnStart(), cert.GetSubjectCnLength()
);
if (err == TaoCrypt::SIG_OTHER_E && verifyCallback_) { if (err == TaoCrypt::SIG_OTHER_E && verifyCallback_) {
X509_STORE_CTX store; X509_STORE_CTX store;
@ -345,7 +348,9 @@ void CertManager::setPeerX509(X509* x)
peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(), peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(),
subject->GetName(), subject->GetLength(), (const char*) before->data, subject->GetName(), subject->GetLength(), (const char*) before->data,
before->length, (const char*) after->data, after->length); before->length, (const char*) after->data, after->length,
issuer->GetCnPosition(), issuer->GetCnLength(),
subject->GetCnPosition(), subject->GetCnLength());
} }

View File

@ -1351,15 +1351,13 @@ int ASN1_STRING_type(ASN1_STRING *x)
int X509_NAME_get_index_by_NID(X509_NAME* name,int nid, int lastpos) int X509_NAME_get_index_by_NID(X509_NAME* name,int nid, int lastpos)
{ {
int idx = -1; // not found int idx = -1; // not found
const char* start = &name->GetName()[lastpos + 1]; int cnPos = -1;
switch (nid) { switch (nid) {
case NID_commonName: case NID_commonName:
const char* found = strstr(start, "/CN="); cnPos = name->GetCnPosition();
if (found) { if (lastpos < cnPos)
found += 4; // advance to str idx = cnPos;
idx = found - start + lastpos + 1;
}
break; break;
} }

View File

@ -1555,7 +1555,9 @@ void SSL_SESSION::CopyX509(X509* x)
peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(), peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(),
subject->GetName(), subject->GetLength(), (const char*) before->data, subject->GetName(), subject->GetLength(), (const char*) before->data,
before->length, (const char*) after->data, after->length); before->length, (const char*) after->data, after->length,
issuer->GetCnPosition(), issuer->GetCnLength(),
subject->GetCnPosition(), subject->GetCnLength());
} }
@ -2472,8 +2474,8 @@ void Security::set_resuming(bool b)
} }
X509_NAME::X509_NAME(const char* n, size_t sz) X509_NAME::X509_NAME(const char* n, size_t sz, int pos, int len)
: name_(0), sz_(sz) : name_(0), sz_(sz), cnPosition_(pos), cnLen_(len)
{ {
if (sz) { if (sz) {
name_ = NEW_YS char[sz]; name_ = NEW_YS char[sz];
@ -2503,8 +2505,9 @@ size_t X509_NAME::GetLength() const
X509::X509(const char* i, size_t iSz, const char* s, size_t sSz, X509::X509(const char* i, size_t iSz, const char* s, size_t sSz,
const char* b, int bSz, const char* a, int aSz) const char* b, int bSz, const char* a, int aSz, int issPos,
: issuer_(i, iSz), subject_(s, sSz), int issLen, int subPos, int subLen)
: issuer_(i, iSz, issPos, issLen), subject_(s, sSz, subPos, subLen),
beforeDate_(b, bSz), afterDate_(a, aSz) beforeDate_(b, bSz), afterDate_(a, aSz)
{} {}
@ -2538,17 +2541,19 @@ ASN1_STRING* X509_NAME::GetEntry(int i)
if (i < 0 || i >= int(sz_)) if (i < 0 || i >= int(sz_))
return 0; return 0;
if (i != cnPosition_ || cnLen_ <= 0) // only entry currently supported
return 0;
if (cnLen_ > int(sz_-i)) // make sure there's room in read buffer
return 0;
if (entry_.data) if (entry_.data)
ysArrayDelete(entry_.data); ysArrayDelete(entry_.data);
entry_.data = NEW_YS byte[sz_]; // max size; entry_.data = NEW_YS byte[cnLen_+1]; // max size;
memcpy(entry_.data, &name_[i], sz_ - i); memcpy(entry_.data, &name_[i], cnLen_);
if (entry_.data[sz_ -i - 1]) { entry_.data[cnLen_] = 0;
entry_.data[sz_ - i] = 0; entry_.length = cnLen_;
entry_.length = int(sz_) - i;
}
else
entry_.length = int(sz_) - i - 1;
entry_.type = 0; entry_.type = 0;
return &entry_; return &entry_;

View File

@ -283,6 +283,10 @@ public:
const byte* GetHash() const { return subjectHash_; } const byte* GetHash() const { return subjectHash_; }
const char* GetBeforeDate() const { return beforeDate_; } const char* GetBeforeDate() const { return beforeDate_; }
const char* GetAfterDate() const { return afterDate_; } const char* GetAfterDate() const { return afterDate_; }
int GetSubjectCnStart() const { return subCnPos_; }
int GetIssuerCnStart() const { return issCnPos_; }
int GetSubjectCnLength() const { return subCnLen_; }
int GetIssuerCnLength() const { return issCnLen_; }
void DecodeToKey(); void DecodeToKey();
private: private:
@ -292,6 +296,10 @@ private:
word32 sigLength_; // length of signature word32 sigLength_; // length of signature
word32 signatureOID_; // sum of algorithm object id word32 signatureOID_; // sum of algorithm object id
word32 keyOID_; // sum of key algo object id word32 keyOID_; // sum of key algo object id
int subCnPos_; // subject common name start, -1 is none
int subCnLen_; // length of above
int issCnPos_; // issuer common name start, -1 is none
int issCnLen_; // length of above
byte subjectHash_[SHA_SIZE]; // hash of all Names byte subjectHash_[SHA_SIZE]; // hash of all Names
byte issuerHash_[SHA_SIZE]; // hash of all Names byte issuerHash_[SHA_SIZE]; // hash of all Names
byte* signature_; byte* signature_;

View File

@ -474,8 +474,9 @@ void DH_Decoder::Decode(DH& key)
CertDecoder::CertDecoder(Source& s, bool decode, SignerList* signers, CertDecoder::CertDecoder(Source& s, bool decode, SignerList* signers,
bool noVerify, CertType ct) bool noVerify, CertType ct)
: BER_Decoder(s), certBegin_(0), sigIndex_(0), sigLength_(0), : BER_Decoder(s), certBegin_(0), sigIndex_(0), sigLength_(0), subCnPos_(-1),
signature_(0), verify_(!noVerify) subCnLen_(0), issCnPos_(-1), issCnLen_(0), signature_(0),
verify_(!noVerify)
{ {
issuer_[0] = 0; issuer_[0] = 0;
subject_[0] = 0; subject_[0] = 0;
@ -796,6 +797,13 @@ void CertDecoder::GetName(NameType nt)
case COMMON_NAME: case COMMON_NAME:
if (!(ptr = AddTag(ptr, buf_end, "/CN=", 4, strLen))) if (!(ptr = AddTag(ptr, buf_end, "/CN=", 4, strLen)))
return; return;
if (nt == ISSUER) {
issCnPos_ = (int)(ptr - strLen - issuer_);
issCnLen_ = (int)strLen;
} else {
subCnPos_ = (int)(ptr - strLen - subject_);
subCnLen_ = (int)strLen;
}
break; break;
case SUR_NAME: case SUR_NAME:
if (!(ptr = AddTag(ptr, buf_end, "/SN=", 4, strLen))) if (!(ptr = AddTag(ptr, buf_end, "/SN=", 4, strLen)))

View File

@ -470,10 +470,28 @@ inline void showPeer(SSL* ssl)
char* issuer = X509_NAME_oneline(X509_get_issuer_name(peer), 0, 0); char* issuer = X509_NAME_oneline(X509_get_issuer_name(peer), 0, 0);
char* subject = X509_NAME_oneline(X509_get_subject_name(peer), 0, 0); char* subject = X509_NAME_oneline(X509_get_subject_name(peer), 0, 0);
printf("peer's cert info:\n issuer : %s\n subject: %s\n", issuer, X509_NAME_ENTRY* se = NULL;
subject); ASN1_STRING* sd = NULL;
char* subCN = NULL;
X509_NAME* sub = X509_get_subject_name(peer);
int lastpos = -1;
if (sub)
lastpos = X509_NAME_get_index_by_NID(sub, NID_commonName, lastpos);
if (lastpos >= 0) {
se = X509_NAME_get_entry(sub, lastpos);
if (se)
sd = X509_NAME_ENTRY_get_data(se);
if (sd)
subCN = (char*)ASN1_STRING_data(sd);
}
printf("peer's cert info:\n issuer : %s\n subject: %s\n"
" subject cn: %s\n", issuer, subject, subCN);
free(subject); free(subject);
free(issuer); free(issuer);
} }
else else
printf("peer has no cert!\n"); printf("peer has no cert!\n");

View File

@ -660,9 +660,9 @@ ERROR 22003: BIGINT UNSIGNED value is out of range in '(18446744073709551615 DIV
CREATE TABLE t1(a BIGINT, b BIGINT UNSIGNED); CREATE TABLE t1(a BIGINT, b BIGINT UNSIGNED);
INSERT INTO t1 VALUES(-9223372036854775808, 9223372036854775809); INSERT INTO t1 VALUES(-9223372036854775808, 9223372036854775809);
SELECT -a FROM t1; SELECT -a FROM t1;
ERROR 22003: BIGINT value is out of range in '-(-9223372036854775808)' ERROR 22003: BIGINT value is out of range in '-(`test`.`t1`.`a`)'
SELECT -b FROM t1; SELECT -b FROM t1;
ERROR 22003: BIGINT value is out of range in '-(9223372036854775809)' ERROR 22003: BIGINT value is out of range in '-(`test`.`t1`.`b`)'
DROP TABLE t1; DROP TABLE t1;
SET @a:=999999999999999999999999999999999999999999999999999999999999999999999999999999999; SET @a:=999999999999999999999999999999999999999999999999999999999999999999999999999999999;
SELECT @a + @a; SELECT @a + @a;

View File

@ -0,0 +1,39 @@
#
# BUG#22037930: INSERT IGNORE FAILS TO IGNORE
# FOREIGN KEY CONSTRAINT
# Setup.
CREATE TABLE t1 (fld1 INT PRIMARY KEY) ENGINE=INNODB;
CREATE TABLE t2 (fld2 INT, FOREIGN KEY (fld2) REFERENCES t1 (fld1))
ENGINE=INNODB;
INSERT INTO t1 VALUES(0);
INSERT INTO t2 VALUES(0);
# Without fix, an error is reported.
INSERT IGNORE INTO t2 VALUES(1);
Warnings:
Warning 1452 Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
Warning 1452 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
UPDATE IGNORE t2 SET fld2=20 WHERE fld2=0;
Warnings:
Warning 1452 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
UPDATE IGNORE t1 SET fld1=20 WHERE fld1=0;
Warnings:
Warning 1451 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
# Test for multi update.
UPDATE IGNORE t1, t2 SET t2.fld2= t2.fld2 + 3;
Warnings:
Warning 1452 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
UPDATE IGNORE t1, t2 SET t1.fld1= t1.fld1 + 3;
Warnings:
Warning 1451 `test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`)
# Reports an error since IGNORE is not used.
INSERT INTO t2 VALUES(1);
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
UPDATE t2 SET fld2=20 WHERE fld2=0;
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
UPDATE t1 SET fld1=20 WHERE fld1=0;
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
UPDATE t1, t2 SET t2.fld2= t2.fld2 + 3;
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
UPDATE t1, t2 SET t1.fld1= t1.fld1 + 3;
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
DROP TABLE t2, t1;

View File

@ -662,7 +662,7 @@ master-bin.000001 # Query # # use `test`; CREATE TABLE IF NOT EXISTS `t2` (
master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # COMMIT
master-bin.000001 # Query # # use `test`; CREATE TABLE IF NOT EXISTS `t3` ( master-bin.000001 # Query # # use `test`; CREATE TABLE IF NOT EXISTS `t3` (
`a` int(11) DEFAULT NULL `a` int(11) DEFAULT NULL
) ) ENGINE=MyISAM
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (mysql.user) master-bin.000001 # Table_map # # table_id: # (mysql.user)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F

View File

@ -56,6 +56,10 @@ CREATE VIEW v1 AS SELECT a FROM t1 WHERE a < 100;
CREATE DATABASE d2; CREATE DATABASE d2;
source include/kill_query.inc; source include/kill_query.inc;
include/rpl_diff.inc include/rpl_diff.inc
ALTER DATABASE d1
DEFAULT CHARACTER SET = 'utf8';
source include/kill_query.inc;
include/rpl_diff.inc
DROP DATABASE d1; DROP DATABASE d1;
source include/kill_query.inc; source include/kill_query.inc;
include/rpl_diff.inc include/rpl_diff.inc
@ -83,6 +87,9 @@ include/rpl_diff.inc
DROP FUNCTION f1; DROP FUNCTION f1;
source include/kill_query.inc; source include/kill_query.inc;
include/rpl_diff.inc include/rpl_diff.inc
DROP FUNCTION IF EXISTS f2;
source include/kill_query.inc;
include/rpl_diff.inc
CREATE PROCEDURE p2 (OUT rows INT) CREATE PROCEDURE p2 (OUT rows INT)
BEGIN BEGIN
SELECT COUNT(*) INTO rows FROM t2; SELECT COUNT(*) INTO rows FROM t2;
@ -96,6 +103,9 @@ include/rpl_diff.inc
DROP PROCEDURE p1; DROP PROCEDURE p1;
source include/kill_query.inc; source include/kill_query.inc;
include/rpl_diff.inc include/rpl_diff.inc
DROP PROCEDURE IF EXISTS p2;
source include/kill_query.inc;
include/rpl_diff.inc
CREATE TABLE t2 (b int); CREATE TABLE t2 (b int);
source include/kill_query.inc; source include/kill_query.inc;
include/rpl_diff.inc include/rpl_diff.inc

View File

@ -4,8 +4,9 @@ CREATE TABLE t1 (a int) ENGINE=MyISAM;
CREATE TABLE t2 (a int) ENGINE=MyISAM; CREATE TABLE t2 (a int) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1), (2), (3); INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (4), (5), (6); INSERT INTO t2 VALUES (4), (5), (6);
CREATE TABLE IF NOT EXISTS t1_merge LIKE t1; CREATE TEMPORARY TABLE IF NOT EXISTS tt1_merge LIKE t1;
ALTER TABLE t1_merge ENGINE=MERGE UNION (t2, t1); ALTER TABLE tt1_merge ENGINE=MERGE UNION (t2, t1);
CREATE TABLE t1_merge LIKE tt1_merge;
include/diff_tables.inc [master:test.t1, slave:test.t1] include/diff_tables.inc [master:test.t1, slave:test.t1]
include/diff_tables.inc [master:test.t2, slave:test.t2] include/diff_tables.inc [master:test.t2, slave:test.t2]
UPDATE t1_merge SET a=10 WHERE a=1; UPDATE t1_merge SET a=10 WHERE a=1;

View File

@ -0,0 +1,13 @@
include/master-slave.inc
[connection master]
CREATE TEMPORARY TABLE temp_t1 (c1 INT) ENGINE=InnoDB;
CREATE TEMPORARY TABLE temp_t2 (c1 INT) ENGINE=MyISAM;
CREATE TABLE t1 LIKE temp_t1;
CREATE TABLE t2 LIKE temp_t2;
include/assert.inc ["t1 on master and temp_t1 have the same storage engine"]
include/assert.inc ["t2 on master and temp_t2 have the same storage engine"]
include/assert.inc ["t1 on slave and temp_t1 have the same storage engine"]
include/assert.inc ["t2 on slave and temp_t2 have the same storage engine"]
DROP TEMPORARY TABLE temp_t1, temp_t2;
DROP TABLE t1, t2;
include/rpl_end.inc

View File

@ -26,10 +26,8 @@
# #
# There are some part of the test are temporarily disabled because of # There are some part of the test are temporarily disabled because of
# the following bugs, please enable then once they get fixed: # the following bugs, please enable then once they get fixed:
# - BUG#44041 # - BUG#22473427
# - BUG#43353 # - Bug#22587377
# - BUG#25705
# - BUG#44171
# Temporarily disabled on Windows due to bug #47638 # Temporarily disabled on Windows due to bug #47638
--source include/not_windows.inc --source include/not_windows.inc
@ -148,11 +146,9 @@ let $rpl_diff_statement= SELECT schema_name FROM information_schema.schemata
send CREATE DATABASE d2; send CREATE DATABASE d2;
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
# Temporarily disabled, see BUG#44041, the ALTER DATABASE can affect the send ALTER DATABASE d1
# collation of other database on slave DEFAULT CHARACTER SET = 'utf8';
#send ALTER DATABASE d1 source include/kill_query_and_diff_master_slave.inc;
# DEFAULT CHARACTER SET = 'utf8';
#source include/kill_query_and_diff_master_slave.inc;
send DROP DATABASE d1; send DROP DATABASE d1;
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
@ -171,8 +167,8 @@ send CREATE EVENT e2
DO INSERT INTO test.t1 VALUES (2); DO INSERT INTO test.t1 VALUES (2);
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
# Temporarily disabled because of BUG#44171, killing ALTER EVENT can # Temporarily disabled,see Bug#22587377-RPL.RPL_KILLED_DDL
# crash the server # FAILS SPORADICALLY ON PB2 IN 5.5 AND 5.6
#send ALTER EVENT e1 #send ALTER EVENT e1
# ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 DAY; # ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 DAY;
#source include/kill_query_and_diff_master_slave.inc; #source include/kill_query_and_diff_master_slave.inc;
@ -201,16 +197,8 @@ source include/kill_query_and_diff_master_slave.inc;
# function f2 probably does not exist because the CREATE query was # function f2 probably does not exist because the CREATE query was
# killed # killed
# send DROP FUNCTION IF EXISTS f2;
# Temporarily disabled. Because of BUG#43353, KILL the query may source include/kill_query_and_diff_master_slave.inc;
# result in function not found, and for 5.1, DROP statements will be
# logged if the function is not found on master, so the following DROP
# FUNCTION statement may be interrupted and not drop the function on
# master, but still get logged and executed on slave and cause
# inconsistence. Also disable the following DROP PROCEDURE IF EXITS
# below.
#send DROP FUNCTION IF EXISTS f2;
#source include/kill_query_and_diff_master_slave.inc;
######## PROCEDURE ######## ######## PROCEDURE ########
@ -231,9 +219,8 @@ source include/kill_query_and_diff_master_slave.inc;
send DROP PROCEDURE p1; send DROP PROCEDURE p1;
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
# Temporarily disabled because of bug#43353, see comment above for DROP FUNCTION IF EXISTS send DROP PROCEDURE IF EXISTS p2;
#send DROP PROCEDURE IF EXISTS p2; source include/kill_query_and_diff_master_slave.inc;
#source include/kill_query_and_diff_master_slave.inc;
######## TABLE ######## ######## TABLE ########
@ -261,9 +248,10 @@ source include/kill_query_and_diff_master_slave.inc;
######## SERVER ######## ######## SERVER ########
# Tempoarily disabled, see bug#25705 # Temporarily disabled, see Bug #22473427 - DROP SERVER FAILS
# AFTER ALTER SERVER+KILL QUERY
# --let $rpl_diff_statement= SELECT * FROM mysql.server WHERE name like \'s%\' # --let $rpl_diff_statement= SELECT * FROM mysql.servers WHERE Server_name like \'s%\'
# send CREATE SERVER s2 # send CREATE SERVER s2
# FOREIGN DATA WRAPPER mysql # FOREIGN DATA WRAPPER mysql

View File

@ -20,8 +20,10 @@ CREATE TABLE t1 (a int) ENGINE=MyISAM;
CREATE TABLE t2 (a int) ENGINE=MyISAM; CREATE TABLE t2 (a int) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1), (2), (3); INSERT INTO t1 VALUES (1), (2), (3);
INSERT INTO t2 VALUES (4), (5), (6); INSERT INTO t2 VALUES (4), (5), (6);
CREATE TABLE IF NOT EXISTS t1_merge LIKE t1; # Changed a little to check also an issue reported on BUG#20574550
ALTER TABLE t1_merge ENGINE=MERGE UNION (t2, t1); CREATE TEMPORARY TABLE IF NOT EXISTS tt1_merge LIKE t1;
ALTER TABLE tt1_merge ENGINE=MERGE UNION (t2, t1);
CREATE TABLE t1_merge LIKE tt1_merge;
--sync_slave_with_master --sync_slave_with_master

View File

@ -0,0 +1,55 @@
source include/have_innodb.inc;
source include/have_binlog_format_row.inc;
source include/master-slave.inc;
#
# BUG#20574550
# CREATE TABLE LIKE <TEMP_TABLE> does not preserve original table storage
# engine when using row based replication
#
--connection master
# Define temp_t1 and temp_t2 storage engines
--let $engine_temp_t1= InnoDB
--let $engine_temp_t2= MyISAM
# Create the two temporary tables
--eval CREATE TEMPORARY TABLE temp_t1 (c1 INT) ENGINE=$engine_temp_t1
--eval CREATE TEMPORARY TABLE temp_t2 (c1 INT) ENGINE=$engine_temp_t2
# Create t1 and t2 based on temporary tables
CREATE TABLE t1 LIKE temp_t1;
CREATE TABLE t2 LIKE temp_t2;
--sync_slave_with_master
# On master
--connection master
# Assert that t1 and t2 have the same storage engines as temp_t1 and temp_t2
--let $engine_t1= query_get_value(SHOW TABLE STATUS WHERE Name='t1', Engine, 1)
--let $assert_cond= "$engine_t1" = "$engine_temp_t1"
--let $assert_text= "t1 on master and temp_t1 have the same storage engine"
--source include/assert.inc
--let $engine_t2= query_get_value(SHOW TABLE STATUS WHERE Name='t2', Engine, 1)
--let $assert_cond= "$engine_t2" = "$engine_temp_t2"
--let $assert_text= "t2 on master and temp_t2 have the same storage engine"
--source include/assert.inc
# On slave
--connection slave
# Assert that t1 and t2 have the same storage engines as temp_t1 and temp_t2
--let $engine_t1= query_get_value(SHOW TABLE STATUS WHERE Name='t1', Engine, 1)
--let $assert_cond= "$engine_t1" = "$engine_temp_t1"
--let $assert_text= "t1 on slave and temp_t1 have the same storage engine"
--source include/assert.inc
--let $engine_t2= query_get_value(SHOW TABLE STATUS WHERE Name='t2', Engine, 1)
--let $assert_cond= "$engine_t2" = "$engine_temp_t2"
--let $assert_text= "t2 on slave and temp_t2 have the same storage engine"
--source include/assert.inc
# Cleanup
--connection master
DROP TEMPORARY TABLE temp_t1, temp_t2;
DROP TABLE t1, t2;
--source include/rpl_end.inc

View File

@ -0,0 +1,43 @@
--source include/have_innodb.inc
#
# MDEV-8979 IGNORE does not ignore the error 1452
#
--echo #
--echo # BUG#22037930: INSERT IGNORE FAILS TO IGNORE
--echo # FOREIGN KEY CONSTRAINT
--echo # Setup.
CREATE TABLE t1 (fld1 INT PRIMARY KEY) ENGINE=INNODB;
CREATE TABLE t2 (fld2 INT, FOREIGN KEY (fld2) REFERENCES t1 (fld1))
ENGINE=INNODB;
INSERT INTO t1 VALUES(0);
INSERT INTO t2 VALUES(0);
--echo # Without fix, an error is reported.
INSERT IGNORE INTO t2 VALUES(1);
UPDATE IGNORE t2 SET fld2=20 WHERE fld2=0;
UPDATE IGNORE t1 SET fld1=20 WHERE fld1=0;
--echo # Test for multi update.
UPDATE IGNORE t1, t2 SET t2.fld2= t2.fld2 + 3;
UPDATE IGNORE t1, t2 SET t1.fld1= t1.fld1 + 3;
--echo # Reports an error since IGNORE is not used.
--error ER_NO_REFERENCED_ROW_2
INSERT INTO t2 VALUES(1);
--error ER_NO_REFERENCED_ROW_2
UPDATE t2 SET fld2=20 WHERE fld2=0;
--error ER_ROW_IS_REFERENCED_2
UPDATE t1 SET fld1=20 WHERE fld1=0;
--error ER_NO_REFERENCED_ROW_2
UPDATE t1, t2 SET t2.fld2= t2.fld2 + 3;
--error ER_ROW_IS_REFERENCED_2
UPDATE t1, t2 SET t1.fld1= t1.fld1 + 3;
DROP TABLE t2, t1;

View File

@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. /* Copyright (c) 2000, 2016, 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
@ -5463,3 +5463,28 @@ fl_create_iterator(enum handler_iterator_type type,
} }
} }
#endif /*TRANS_LOG_MGM_EXAMPLE_CODE*/ #endif /*TRANS_LOG_MGM_EXAMPLE_CODE*/
/**
Report a warning for FK constraint violation.
@param thd Thread handle.
@param table table on which the operation is performed.
@param error handler error number.
*/
void warn_fk_constraint_violation(THD *thd,TABLE *table, int error)
{
String str;
switch(error) {
case HA_ERR_ROW_IS_REFERENCED:
table->file->get_error_message(error, &str);
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_ROW_IS_REFERENCED_2, str.c_ptr_safe());
break;
case HA_ERR_NO_REFERENCED_ROW:
table->file->get_error_message(error, &str);
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_NO_REFERENCED_ROW_2, str.c_ptr_safe());
break;
}
}

View File

@ -1,8 +1,8 @@
#ifndef HANDLER_INCLUDED #ifndef HANDLER_INCLUDED
#define HANDLER_INCLUDED #define HANDLER_INCLUDED
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates. Copyright (c) 2000, 2016, Oracle and/or its affiliates.
Copyright (c) 2009-2011 Monty Program Ab Copyright (c) 2009, 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 General Public License modify it under the terms of the GNU General Public License
@ -333,6 +333,7 @@
/* Flags for method is_fatal_error */ /* Flags for method is_fatal_error */
#define HA_CHECK_DUP_KEY 1 #define HA_CHECK_DUP_KEY 1
#define HA_CHECK_DUP_UNIQUE 2 #define HA_CHECK_DUP_UNIQUE 2
#define HA_CHECK_FK_ERROR 4
#define HA_CHECK_DUP (HA_CHECK_DUP_KEY + HA_CHECK_DUP_UNIQUE) #define HA_CHECK_DUP (HA_CHECK_DUP_KEY + HA_CHECK_DUP_UNIQUE)
enum legacy_db_type enum legacy_db_type
@ -2023,7 +2024,10 @@ public:
((flags & HA_CHECK_DUP_KEY) && ((flags & HA_CHECK_DUP_KEY) &&
(error == HA_ERR_FOUND_DUPP_KEY || (error == HA_ERR_FOUND_DUPP_KEY ||
error == HA_ERR_FOUND_DUPP_UNIQUE)) || error == HA_ERR_FOUND_DUPP_UNIQUE)) ||
error == HA_ERR_AUTOINC_ERANGE) error == HA_ERR_AUTOINC_ERANGE ||
((flags & HA_CHECK_FK_ERROR) &&
(error == HA_ERR_ROW_IS_REFERENCED ||
error == HA_ERR_NO_REFERENCED_ROW)))
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
@ -3105,4 +3109,7 @@ inline const char *table_case_name(HA_CREATE_INFO *info, const char *name)
{ {
return ((lower_case_table_names == 2 && info->alias) ? info->alias : name); return ((lower_case_table_names == 2 && info->alias) ? info->alias : name);
} }
#endif
void warn_fk_constraint_violation(THD *thd, TABLE *table, int error);
#endif /* HANDLER_INCLUDED */

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2014, Oracle and/or its affiliates. Copyright (c) 2000, 2016, Oracle and/or its affiliates.
Copyright (c) 2010, 2016, 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
@ -1272,6 +1272,11 @@ Item *Item_param::safe_charset_converter(CHARSET_INFO *tocs)
{ {
uint cnv_errors; uint cnv_errors;
String *ostr= val_str(&cnvstr); String *ostr= val_str(&cnvstr);
if (null_value)
{
Item_null *n= new Item_null();
return n ? n->safe_charset_converter(tocs) : NULL;
}
cnvitem->str_value.copy(ostr->ptr(), ostr->length(), cnvitem->str_value.copy(ostr->ptr(), ostr->length(),
ostr->charset(), tocs, &cnv_errors); ostr->charset(), tocs, &cnv_errors);
if (cnv_errors) if (cnv_errors)
@ -3888,7 +3893,7 @@ Item_param::eq(const Item *arg, bool binary_cmp) const
void Item_param::print(String *str, enum_query_type query_type) void Item_param::print(String *str, enum_query_type query_type)
{ {
if (state == NO_VALUE) if (state == NO_VALUE || query_type & QT_NO_DATA_EXPANSION)
{ {
str->append('?'); str->append('?');
} }
@ -6753,7 +6758,8 @@ Item *Item_field::update_value_transformer(uchar *select_arg)
void Item_field::print(String *str, enum_query_type query_type) void Item_field::print(String *str, enum_query_type query_type)
{ {
if (field && field->table->const_table) if (field && field->table->const_table &&
!(query_type & QT_NO_DATA_EXPANSION))
{ {
print_value(str); print_value(str);
return; return;

View File

@ -1,7 +1,7 @@
#ifndef ITEM_FUNC_INCLUDED #ifndef ITEM_FUNC_INCLUDED
#define ITEM_FUNC_INCLUDED #define ITEM_FUNC_INCLUDED
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. /* Copyright (c) 2000, 2016, 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
@ -245,7 +245,7 @@ public:
char buf[256]; char buf[256];
String str(buf, sizeof(buf), system_charset_info); String str(buf, sizeof(buf), system_charset_info);
str.length(0); str.length(0);
print(&str, QT_ORDINARY); print(&str, QT_NO_DATA_EXPANSION);
my_error(ER_DATA_OUT_OF_RANGE, MYF(0), type_name, str.c_ptr_safe()); my_error(ER_DATA_OUT_OF_RANGE, MYF(0), type_name, str.c_ptr_safe());
} }
inline double raise_float_overflow() inline double raise_float_overflow()

View File

@ -1,8 +1,8 @@
#ifndef ITEM_GEOFUNC_INCLUDED #ifndef ITEM_GEOFUNC_INCLUDED
#define ITEM_GEOFUNC_INCLUDED #define ITEM_GEOFUNC_INCLUDED
/* Copyright (c) 2000, 2010 Oracle and/or its affiliates. /* Copyright (c) 2000, 2016 Oracle and/or its affiliates.
Copyright (C) 2011 Monty Program Ab. 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
@ -191,7 +191,7 @@ public:
if (args[i]->fixed && args[i]->field_type() != MYSQL_TYPE_GEOMETRY) if (args[i]->fixed && args[i]->field_type() != MYSQL_TYPE_GEOMETRY)
{ {
String str; String str;
args[i]->print(&str, QT_ORDINARY); args[i]->print(&str, QT_NO_DATA_EXPANSION);
str.append('\0'); str.append('\0');
my_error(ER_ILLEGAL_VALUE_FOR_TYPE, MYF(0), "non geometric", my_error(ER_ILLEGAL_VALUE_FOR_TYPE, MYF(0), "non geometric",
str.ptr()); str.ptr());

View File

@ -1,5 +1,5 @@
/* Copyright (c) 2006, 2015, Oracle and/or its affiliates. /* Copyright (c) 2006, 2016, 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
@ -427,7 +427,13 @@ enum enum_query_type
/// Without character set introducers. /// Without character set introducers.
QT_WITHOUT_INTRODUCERS= (1 << 1), QT_WITHOUT_INTRODUCERS= (1 << 1),
/// view internal representation (like QT_ORDINARY except ORDER BY clause) /// view internal representation (like QT_ORDINARY except ORDER BY clause)
QT_VIEW_INTERNAL= (1 << 2) QT_VIEW_INTERNAL= (1 << 2),
/**
If an expression is constant, print the expression, not the value
it evaluates to. Should be used for error messages, so that they
don't reveal values.
*/
QT_NO_DATA_EXPANSION= (1 << 9),
}; };
/* query_id */ /* query_id */

View File

@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. /* Copyright (c) 2000, 2016, 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
@ -769,7 +769,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
goto end; goto end;
table->use_all_columns(); table->use_all_columns();
(void) my_init_dynamic_array(&acl_hosts,sizeof(ACL_HOST),20,50);
while (!(read_record_info.read_record(&read_record_info))) while (!(read_record_info.read_record(&read_record_info)))
{ {
ACL_HOST host; ACL_HOST host;
@ -826,7 +825,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
goto end; goto end;
table->use_all_columns(); table->use_all_columns();
(void) my_init_dynamic_array(&acl_users,sizeof(ACL_USER),50,100);
username_char_length= min(table->field[1]->char_length(), USERNAME_CHAR_LENGTH); username_char_length= min(table->field[1]->char_length(), USERNAME_CHAR_LENGTH);
password_length= table->field[2]->field_length / password_length= table->field[2]->field_length /
table->field[2]->charset()->mbmaxlen; table->field[2]->charset()->mbmaxlen;
@ -1029,7 +1027,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
goto end; goto end;
table->use_all_columns(); table->use_all_columns();
(void) my_init_dynamic_array(&acl_dbs,sizeof(ACL_DB),50,100);
while (!(read_record_info.read_record(&read_record_info))) while (!(read_record_info.read_record(&read_record_info)))
{ {
ACL_DB db; ACL_DB db;
@ -1091,8 +1088,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
end_read_record(&read_record_info); end_read_record(&read_record_info);
freeze_size(&acl_dbs); freeze_size(&acl_dbs);
(void) my_init_dynamic_array(&acl_proxy_users, sizeof(ACL_PROXY_USER),
50, 100);
if (tables[3].table) if (tables[3].table)
{ {
init_read_record(&read_record_info, thd, table= tables[3].table, NULL, 1, init_read_record(&read_record_info, thd, table= tables[3].table, NULL, 1,
@ -1128,6 +1123,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
return_val= FALSE; return_val= FALSE;
end: end:
end_read_record(&read_record_info);
thd->variables.sql_mode= old_sql_mode; thd->variables.sql_mode= old_sql_mode;
DBUG_RETURN(return_val); DBUG_RETURN(return_val);
} }
@ -1142,12 +1138,12 @@ void acl_free(bool end)
delete_dynamic(&acl_wild_hosts); delete_dynamic(&acl_wild_hosts);
delete_dynamic(&acl_proxy_users); delete_dynamic(&acl_proxy_users);
my_hash_free(&acl_check_hosts); my_hash_free(&acl_check_hosts);
plugin_unlock(0, native_password_plugin);
plugin_unlock(0, old_password_plugin);
if (!end) if (!end)
acl_cache->clear(1); /* purecov: inspected */ acl_cache->clear(1); /* purecov: inspected */
else else
{ {
plugin_unlock(0, native_password_plugin);
plugin_unlock(0, old_password_plugin);
delete acl_cache; delete acl_cache;
acl_cache=0; acl_cache=0;
} }
@ -1221,6 +1217,10 @@ my_bool acl_reload(THD *thd)
old_acl_users= acl_users; old_acl_users= acl_users;
old_acl_proxy_users= acl_proxy_users; old_acl_proxy_users= acl_proxy_users;
old_acl_dbs= acl_dbs; old_acl_dbs= acl_dbs;
my_init_dynamic_array(&acl_hosts, sizeof(ACL_HOST), 20, 50);
my_init_dynamic_array(&acl_users, sizeof(ACL_USER), 50, 100);
my_init_dynamic_array(&acl_dbs, sizeof(ACL_DB), 50, 100);
my_init_dynamic_array(&acl_proxy_users, sizeof(ACL_PROXY_USER), 50, 100);
old_mem= mem; old_mem= mem;
delete_dynamic(&acl_wild_hosts); delete_dynamic(&acl_wild_hosts);
my_hash_free(&acl_check_hosts); my_hash_free(&acl_check_hosts);

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2015, Oracle and/or its affiliates. Copyright (c) 2000, 2016, Oracle and/or its affiliates.
Copyright (c) 2009, 2016, 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
@ -1807,6 +1807,18 @@ public:
current_stmt_binlog_format == BINLOG_FORMAT_ROW); current_stmt_binlog_format == BINLOG_FORMAT_ROW);
return current_stmt_binlog_format == BINLOG_FORMAT_ROW; return current_stmt_binlog_format == BINLOG_FORMAT_ROW;
} }
/**
Determine if binlogging is disabled for this session
@retval 0 if the current statement binlogging is disabled
(could be because of binlog closed/binlog option
is set to false).
@retval 1 if the current statement will be binlogged
*/
inline bool is_current_stmt_binlog_disabled() const
{
return (!(variables.option_bits & OPTION_BIN_LOG) ||
!mysql_bin_log.is_open());
}
private: private:
/** /**

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2000, 2015, Oracle and/or its affiliates. Copyright (c) 2000, 2016, 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
@ -1609,7 +1609,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
else else
table->file->insert_id_for_cur_row= insert_id_for_cur_row; table->file->insert_id_for_cur_row= insert_id_for_cur_row;
bool is_duplicate_key_error; bool is_duplicate_key_error;
if (table->file->is_fatal_error(error, HA_CHECK_DUP)) if (table->file->is_fatal_error(error, HA_CHECK_DUP | HA_CHECK_FK_ERROR))
goto err; goto err;
is_duplicate_key_error= table->file->is_fatal_error(error, 0); is_duplicate_key_error= table->file->is_fatal_error(error, 0);
if (!is_duplicate_key_error) if (!is_duplicate_key_error)
@ -1712,7 +1712,8 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
error != HA_ERR_RECORD_IS_THE_SAME) error != HA_ERR_RECORD_IS_THE_SAME)
{ {
if (info->ignore && if (info->ignore &&
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY)) !table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
HA_CHECK_FK_ERROR))
{ {
if (!(thd->variables.old_behavior & if (!(thd->variables.old_behavior &
OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE)) OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE))
@ -1844,7 +1845,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
{ {
DEBUG_SYNC(thd, "write_row_noreplace"); DEBUG_SYNC(thd, "write_row_noreplace");
if (!info->ignore || if (!info->ignore ||
table->file->is_fatal_error(error, HA_CHECK_DUP)) table->file->is_fatal_error(error, HA_CHECK_DUP | HA_CHECK_FK_ERROR))
goto err; goto err;
if (!(thd->variables.old_behavior & if (!(thd->variables.old_behavior &
OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE)) OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE))
@ -1865,6 +1866,9 @@ ok_or_after_trg_err:
my_safe_afree(key,table->s->max_unique_length,MAX_KEY_LENGTH); my_safe_afree(key,table->s->max_unique_length,MAX_KEY_LENGTH);
if (!table->file->has_transactions()) if (!table->file->has_transactions())
thd->transaction.stmt.modified_non_trans_table= TRUE; thd->transaction.stmt.modified_non_trans_table= TRUE;
if (info->ignore &&
!table->file->is_fatal_error(error, HA_CHECK_FK_ERROR))
warn_fk_constraint_violation(thd, table, error);
DBUG_RETURN(trg_error); DBUG_RETURN(trg_error);
err: err:

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2000, 2015, Oracle and/or its affiliates. Copyright (c) 2000, 2016, 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
@ -255,6 +255,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
{ {
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
thd_proc_info(thd, "executing");
/* /*
Let us emit an error if we are loading data to table which is used Let us emit an error if we are loading data to table which is used
in subselect in SET clause like we do it for INSERT. in subselect in SET clause like we do it for INSERT.

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2000, 2015 Oracle and/or its affiliates. /* Copyright (c) 2000, 2016 Oracle and/or its affiliates.
Copyright (c) 2009, 2016 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
@ -23128,32 +23128,52 @@ static void print_join(THD *thd,
/* List is reversed => we should reverse it before using */ /* List is reversed => we should reverse it before using */
List_iterator_fast<TABLE_LIST> ti(*tables); List_iterator_fast<TABLE_LIST> ti(*tables);
TABLE_LIST **table; TABLE_LIST **table;
uint non_const_tables= 0;
/*
If the QT_NO_DATA_EXPANSION flag is specified, we print the
original table list, including constant tables that have been
optimized away, as the constant tables may be referenced in the
expression printed by Item_field::print() when this flag is given.
Otherwise, only non-const tables are printed.
Example:
Original SQL:
select * from (select 1) t
Printed without QT_NO_DATA_EXPANSION:
select '1' AS `1` from dual
Printed with QT_NO_DATA_EXPANSION:
select `t`.`1` from (select 1 AS `1`) `t`
*/
const bool print_const_tables= (query_type & QT_NO_DATA_EXPANSION);
size_t tables_to_print= 0;
for (TABLE_LIST *t= ti++; t ; t= ti++) for (TABLE_LIST *t= ti++; t ; t= ti++)
{ {
/* /* See comment in print_table_array() about the second condition */
See comment in print_table_array() about the second part of the if (print_const_tables || !t->optimized_away)
condition if (!is_eliminated_table(eliminated_tables, t))
*/ tables_to_print++;
if (!t->optimized_away && !is_eliminated_table(eliminated_tables, t))
non_const_tables++;
} }
if (!non_const_tables) if (tables_to_print == 0)
{ {
str->append(STRING_WITH_LEN("dual")); str->append(STRING_WITH_LEN("dual"));
return; // all tables were optimized away return; // all tables were optimized away
} }
ti.rewind(); ti.rewind();
if (!(table= (TABLE_LIST **)thd->alloc(sizeof(TABLE_LIST*) * if (!(table= static_cast<TABLE_LIST **>(thd->alloc(sizeof(TABLE_LIST*) *
non_const_tables))) tables_to_print))))
return; // out of memory return; // out of memory
TABLE_LIST *tmp, **t= table + (non_const_tables - 1); TABLE_LIST *tmp, **t= table + (tables_to_print - 1);
while ((tmp= ti++)) while ((tmp= ti++))
{ {
if (tmp->optimized_away || is_eliminated_table(eliminated_tables, tmp)) if (tmp->optimized_away && !print_const_tables)
continue;
if (is_eliminated_table(eliminated_tables, tmp))
continue; continue;
*t--= tmp; *t--= tmp;
} }
@ -23173,7 +23193,7 @@ static void print_join(THD *thd,
*/ */
if ((*table)->sj_inner_tables) if ((*table)->sj_inner_tables)
{ {
TABLE_LIST **end= table + non_const_tables; TABLE_LIST **end= table + tables_to_print;
for (TABLE_LIST **t2= table; t2!=end; t2++) for (TABLE_LIST **t2= table; t2!=end; t2++)
{ {
if (!(*t2)->sj_inner_tables) if (!(*t2)->sj_inner_tables)
@ -23186,7 +23206,7 @@ static void print_join(THD *thd,
} }
} }
print_table_array(thd, eliminated_tables, str, table, print_table_array(thd, eliminated_tables, str, table,
table + non_const_tables, query_type); table + tables_to_print, query_type);
} }
/** /**

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2000, 2015, Oracle and/or its affiliates. Copyright (c) 2000, 2016, Oracle and/or its affiliates.
Copyright (c) 2010, 2016, 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
@ -4880,7 +4880,8 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
/* /*
We have to write the query before we unlock the tables. We have to write the query before we unlock the tables.
*/ */
if (thd->is_current_stmt_binlog_format_row()) if (!thd->is_current_stmt_binlog_disabled() &&
thd->is_current_stmt_binlog_format_row())
{ {
/* /*
Since temporary tables are not replicated under row-based Since temporary tables are not replicated under row-based
@ -4922,6 +4923,21 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
if (open_table(thd, table, thd->mem_root, &ot_ctx)) if (open_table(thd, table, thd->mem_root, &ot_ctx))
goto err; goto err;
/*
After opening a MERGE table add the children to the query list of
tables, so that children tables info can be used on "CREATE TABLE"
statement generation by the binary log.
Note that placeholders don't have the handler open.
*/
if (table->table->file->extra(HA_EXTRA_ADD_CHILDREN_LIST))
goto err;
/*
As the reference table is temporary and may not exist on slave, we must
force the ENGINE to be present into CREATE TABLE.
*/
create_info->used_fields|= HA_CREATE_USED_ENGINE;
int result __attribute__((unused))= int result __attribute__((unused))=
store_create_info(thd, table, &query, store_create_info(thd, table, &query,
create_info, TRUE /* show_database */); create_info, TRUE /* show_database */);

View File

@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. /* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
Copyright (c) 2011, 2013, Monty Program Ab. 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
@ -774,7 +774,8 @@ int mysql_update(THD *thd,
error= 0; error= 0;
} }
else if (!ignore || else if (!ignore ||
table->file->is_fatal_error(error, HA_CHECK_DUP_KEY)) table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
HA_CHECK_FK_ERROR))
{ {
/* /*
If (ignore && error is ignorable) we don't have to If (ignore && error is ignorable) we don't have to
@ -782,7 +783,8 @@ int mysql_update(THD *thd,
*/ */
myf flags= 0; myf flags= 0;
if (table->file->is_fatal_error(error, HA_CHECK_DUP_KEY)) if (table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
HA_CHECK_FK_ERROR))
flags|= ME_FATALERROR; /* Other handler errors are fatal */ flags|= ME_FATALERROR; /* Other handler errors are fatal */
prepare_record_for_error_message(error, table); prepare_record_for_error_message(error, table);
@ -790,6 +792,9 @@ int mysql_update(THD *thd,
error= 1; error= 1;
break; break;
} }
else if (ignore && !table->file->is_fatal_error(error,
HA_CHECK_FK_ERROR))
warn_fk_constraint_violation(thd, table, error);
} }
if (table->triggers && if (table->triggers &&
@ -1969,7 +1974,8 @@ int multi_update::send_data(List<Item> &not_used_values)
{ {
updated--; updated--;
if (!ignore || if (!ignore ||
table->file->is_fatal_error(error, HA_CHECK_DUP_KEY)) table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
HA_CHECK_FK_ERROR))
{ {
/* /*
If (ignore && error == is ignorable) we don't have to If (ignore && error == is ignorable) we don't have to
@ -1977,13 +1983,17 @@ int multi_update::send_data(List<Item> &not_used_values)
*/ */
myf flags= 0; myf flags= 0;
if (table->file->is_fatal_error(error, HA_CHECK_DUP_KEY)) if (table->file->is_fatal_error(error, HA_CHECK_DUP_KEY |
HA_CHECK_FK_ERROR))
flags|= ME_FATALERROR; /* Other handler errors are fatal */ flags|= ME_FATALERROR; /* Other handler errors are fatal */
prepare_record_for_error_message(error, table); prepare_record_for_error_message(error, table);
table->file->print_error(error,MYF(flags)); table->file->print_error(error,MYF(flags));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
else if (ignore && !table->file->is_fatal_error(error,
HA_CHECK_FK_ERROR))
warn_fk_constraint_violation(thd, table, error);
} }
else else
{ {
@ -2256,11 +2266,15 @@ int multi_update::do_updates()
local_error != HA_ERR_RECORD_IS_THE_SAME) local_error != HA_ERR_RECORD_IS_THE_SAME)
{ {
if (!ignore || if (!ignore ||
table->file->is_fatal_error(local_error, HA_CHECK_DUP_KEY)) table->file->is_fatal_error(local_error, HA_CHECK_DUP_KEY |
HA_CHECK_FK_ERROR))
{ {
err_table= table; err_table= table;
goto err; goto err;
} }
else if (ignore && !table->file->is_fatal_error(local_error,
HA_CHECK_FK_ERROR))
warn_fk_constraint_violation(thd, table, local_error);
} }
if (local_error != HA_ERR_RECORD_IS_THE_SAME) if (local_error != HA_ERR_RECORD_IS_THE_SAME)
updated++; updated++;

View File

@ -1,6 +1,6 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 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
@ -1140,7 +1140,7 @@ dict_create_index_step(
>= DICT_TF_FORMAT_ZIP); >= DICT_TF_FORMAT_ZIP);
node->index = dict_index_get_if_in_cache_low(index_id); node->index = dict_index_get_if_in_cache_low(index_id);
ut_a(err == DB_SUCCESS ? node->index != NULL : node->index == NULL); ut_a((node->index == NULL) == (err != DB_SUCCESS));
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {

View File

@ -1,6 +1,6 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc. Copyright (c) 2008, Google Inc.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
@ -335,28 +335,7 @@ amount of increment. */
# define os_atomic_increment_ulint(ptr, amount) \ # define os_atomic_increment_ulint(ptr, amount) \
os_atomic_increment(ptr, amount) os_atomic_increment(ptr, amount)
# if defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET) # if defined(IB_STRONG_MEMORY_MODEL)
/** Do an atomic test-and-set.
@param[in,out] ptr Memory location to set to non-zero
@return the previous value */
static inline
lock_word_t
os_atomic_test_and_set(volatile lock_word_t* ptr)
{
return(__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE));
}
/** Do an atomic clear.
@param[in,out] ptr Memory location to set to zero */
static inline
void
os_atomic_clear(volatile lock_word_t* ptr)
{
__atomic_clear(ptr, __ATOMIC_RELEASE);
}
# elif defined(IB_STRONG_MEMORY_MODEL)
/** Do an atomic test and set. /** Do an atomic test and set.
@param[in,out] ptr Memory location to set to non-zero @param[in,out] ptr Memory location to set to non-zero
@ -385,6 +364,27 @@ os_atomic_clear(volatile lock_word_t* ptr)
return(__sync_lock_test_and_set(ptr, 0)); return(__sync_lock_test_and_set(ptr, 0));
} }
# elif defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET)
/** Do an atomic test-and-set.
@param[in,out] ptr Memory location to set to non-zero
@return the previous value */
static inline
lock_word_t
os_atomic_test_and_set(volatile lock_word_t* ptr)
{
return(__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE));
}
/** Do an atomic clear.
@param[in,out] ptr Memory location to set to zero */
static inline
void
os_atomic_clear(volatile lock_word_t* ptr)
{
__atomic_clear(ptr, __ATOMIC_RELEASE);
}
# else # else
# error "Unsupported platform" # error "Unsupported platform"

View File

@ -1,6 +1,6 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1997, 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
@ -1767,7 +1767,7 @@ loop:
goto loop; goto loop;
} }
ut_ad(allow_ibuf == FALSE ? mutex_own(&log_sys->mutex) : !mutex_own(&log_sys->mutex)); ut_ad((!allow_ibuf) == mutex_own(&log_sys->mutex));
if (!allow_ibuf) { if (!allow_ibuf) {
recv_no_ibuf_operations = TRUE; recv_no_ibuf_operations = TRUE;

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. /* Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
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
@ -197,7 +197,8 @@ static int ftb_query_add_word(MYSQL_FTPARSER_PARAM *param,
ftbw= (FTB_WORD *)alloc_root(&ftb_param->ftb->mem_root, ftbw= (FTB_WORD *)alloc_root(&ftb_param->ftb->mem_root,
sizeof(FTB_WORD) + sizeof(FTB_WORD) +
(info->trunc ? HA_MAX_KEY_BUFF : (info->trunc ? HA_MAX_KEY_BUFF :
word_len * ftb_param->ftb->charset->mbmaxlen + (word_len + 1) *
ftb_param->ftb->charset->mbmaxlen +
HA_FT_WLEN + HA_FT_WLEN +
ftb_param->ftb->info->s->rec_reflength)); ftb_param->ftb->info->s->rec_reflength));
ftbw->len= word_len + 1; ftbw->len= word_len + 1;

View File

@ -1,4 +1,5 @@
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates /* Copyright (c) 2000, 2011, 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