mirror of
https://github.com/MariaDB/server.git
synced 2025-04-18 13:15:32 +02:00
Merge branch 'mysql/5.5' into 5.5
This commit is contained in:
commit
b069d19284
48 changed files with 476 additions and 159 deletions
VERSION
client
client_priv.hmysql.ccmysql_upgrade.cmysqladmin.ccmysqlcheck.cmysqldump.cmysqlimport.cmysqlshow.cmysqlslap.cmysqltest.cc
extra/yassl
mysql-test
r
suite
binlog/r
rpl
t
sql
handler.cchandler.hitem.ccitem_func.hitem_geofunc.hmysqld.hsql_acl.ccsql_class.hsql_insert.ccsql_load.ccsql_select.ccsql_table.ccsql_update.cc
storage
innobase
myisam
myisammrg
2
VERSION
2
VERSION
|
@ -1,4 +1,4 @@
|
|||
MYSQL_VERSION_MAJOR=5
|
||||
MYSQL_VERSION_MINOR=5
|
||||
MYSQL_VERSION_PATCH=48
|
||||
MYSQL_VERSION_PATCH=49
|
||||
MYSQL_VERSION_EXTRA=
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
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
|
||||
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) 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) 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
|
||||
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) 2010, 2014, Monty Program Ab.
|
||||
Copyright (c) 2010, 2016, Monty Program Ab.
|
||||
|
||||
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) 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
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
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
|
||||
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) 2011, 2015, MariaDB
|
||||
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) 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
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
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
|
||||
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, 2013, Monty Program Ab.
|
||||
Copyright (c) 2009, 2016, Monty Program Ab.
|
||||
|
||||
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
|
||||
|
|
|
@ -12,6 +12,12 @@ before calling SSL_new();
|
|||
|
||||
*** 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)
|
||||
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
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include "rsa.h"
|
||||
|
||||
|
||||
#define YASSL_VERSION "2.3.9"
|
||||
#define YASSL_VERSION "2.3.9b"
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
|
|
@ -191,14 +191,18 @@ private:
|
|||
class X509_NAME {
|
||||
char* name_;
|
||||
size_t sz_;
|
||||
int cnPosition_; // start of common name, -1 is none
|
||||
int cnLen_; // length of above
|
||||
ASN1_STRING entry_;
|
||||
public:
|
||||
X509_NAME(const char*, size_t sz);
|
||||
X509_NAME(const char*, size_t sz, int pos, int len);
|
||||
~X509_NAME();
|
||||
|
||||
const char* GetName() const;
|
||||
ASN1_STRING* GetEntry(int i);
|
||||
size_t GetLength() const;
|
||||
int GetCnPosition() const { return cnPosition_; }
|
||||
int GetCnLength() const { return cnLen_; }
|
||||
private:
|
||||
X509_NAME(const X509_NAME&); // hide copy
|
||||
X509_NAME& operator=(const X509_NAME&); // and assign
|
||||
|
@ -226,7 +230,7 @@ class X509 {
|
|||
StringHolder afterDate_; // not valid after
|
||||
public:
|
||||
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_NAME* GetIssuer();
|
||||
|
|
|
@ -293,7 +293,10 @@ int CertManager::Validate()
|
|||
int aSz = (int)strlen(cert.GetAfterDate()) + 1;
|
||||
peerX509_ = NEW_YS X509(cert.GetIssuer(), iSz, cert.GetCommonName(),
|
||||
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_) {
|
||||
X509_STORE_CTX store;
|
||||
|
@ -345,7 +348,9 @@ void CertManager::setPeerX509(X509* x)
|
|||
|
||||
peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(),
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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 idx = -1; // not found
|
||||
const char* start = &name->GetName()[lastpos + 1];
|
||||
int cnPos = -1;
|
||||
|
||||
switch (nid) {
|
||||
case NID_commonName:
|
||||
const char* found = strstr(start, "/CN=");
|
||||
if (found) {
|
||||
found += 4; // advance to str
|
||||
idx = found - start + lastpos + 1;
|
||||
}
|
||||
cnPos = name->GetCnPosition();
|
||||
if (lastpos < cnPos)
|
||||
idx = cnPos;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1555,7 +1555,9 @@ void SSL_SESSION::CopyX509(X509* x)
|
|||
|
||||
peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(),
|
||||
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)
|
||||
: name_(0), sz_(sz)
|
||||
X509_NAME::X509_NAME(const char* n, size_t sz, int pos, int len)
|
||||
: name_(0), sz_(sz), cnPosition_(pos), cnLen_(len)
|
||||
{
|
||||
if (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,
|
||||
const char* b, int bSz, const char* a, int aSz)
|
||||
: issuer_(i, iSz), subject_(s, sSz),
|
||||
const char* b, int bSz, const char* a, int aSz, int issPos,
|
||||
int issLen, int subPos, int subLen)
|
||||
: issuer_(i, iSz, issPos, issLen), subject_(s, sSz, subPos, subLen),
|
||||
beforeDate_(b, bSz), afterDate_(a, aSz)
|
||||
{}
|
||||
|
||||
|
@ -2538,17 +2541,19 @@ ASN1_STRING* X509_NAME::GetEntry(int i)
|
|||
if (i < 0 || i >= int(sz_))
|
||||
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)
|
||||
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);
|
||||
if (entry_.data[sz_ -i - 1]) {
|
||||
entry_.data[sz_ - i] = 0;
|
||||
entry_.length = int(sz_) - i;
|
||||
}
|
||||
else
|
||||
entry_.length = int(sz_) - i - 1;
|
||||
memcpy(entry_.data, &name_[i], cnLen_);
|
||||
entry_.data[cnLen_] = 0;
|
||||
entry_.length = cnLen_;
|
||||
entry_.type = 0;
|
||||
|
||||
return &entry_;
|
||||
|
|
|
@ -283,6 +283,10 @@ public:
|
|||
const byte* GetHash() const { return subjectHash_; }
|
||||
const char* GetBeforeDate() const { return beforeDate_; }
|
||||
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();
|
||||
private:
|
||||
|
@ -292,6 +296,10 @@ private:
|
|||
word32 sigLength_; // length of signature
|
||||
word32 signatureOID_; // sum of algorithm 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 issuerHash_[SHA_SIZE]; // hash of all Names
|
||||
byte* signature_;
|
||||
|
|
|
@ -474,8 +474,9 @@ void DH_Decoder::Decode(DH& key)
|
|||
|
||||
CertDecoder::CertDecoder(Source& s, bool decode, SignerList* signers,
|
||||
bool noVerify, CertType ct)
|
||||
: BER_Decoder(s), certBegin_(0), sigIndex_(0), sigLength_(0),
|
||||
signature_(0), verify_(!noVerify)
|
||||
: BER_Decoder(s), certBegin_(0), sigIndex_(0), sigLength_(0), subCnPos_(-1),
|
||||
subCnLen_(0), issCnPos_(-1), issCnLen_(0), signature_(0),
|
||||
verify_(!noVerify)
|
||||
{
|
||||
issuer_[0] = 0;
|
||||
subject_[0] = 0;
|
||||
|
@ -796,6 +797,13 @@ void CertDecoder::GetName(NameType nt)
|
|||
case COMMON_NAME:
|
||||
if (!(ptr = AddTag(ptr, buf_end, "/CN=", 4, strLen)))
|
||||
return;
|
||||
if (nt == ISSUER) {
|
||||
issCnPos_ = (int)(ptr - strLen - issuer_);
|
||||
issCnLen_ = (int)strLen;
|
||||
} else {
|
||||
subCnPos_ = (int)(ptr - strLen - subject_);
|
||||
subCnLen_ = (int)strLen;
|
||||
}
|
||||
break;
|
||||
case SUR_NAME:
|
||||
if (!(ptr = AddTag(ptr, buf_end, "/SN=", 4, strLen)))
|
||||
|
|
|
@ -470,10 +470,28 @@ inline void showPeer(SSL* ssl)
|
|||
char* issuer = X509_NAME_oneline(X509_get_issuer_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,
|
||||
subject);
|
||||
X509_NAME_ENTRY* se = NULL;
|
||||
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(issuer);
|
||||
|
||||
}
|
||||
else
|
||||
printf("peer has no cert!\n");
|
||||
|
|
|
@ -660,9 +660,9 @@ ERROR 22003: BIGINT UNSIGNED value is out of range in '(18446744073709551615 DIV
|
|||
CREATE TABLE t1(a BIGINT, b BIGINT UNSIGNED);
|
||||
INSERT INTO t1 VALUES(-9223372036854775808, 9223372036854775809);
|
||||
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;
|
||||
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;
|
||||
SET @a:=999999999999999999999999999999999999999999999999999999999999999999999999999999999;
|
||||
SELECT @a + @a;
|
||||
|
|
39
mysql-test/r/insert_innodb.result
Normal file
39
mysql-test/r/insert_innodb.result
Normal 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;
|
|
@ -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 # # use `test`; CREATE TABLE IF NOT EXISTS `t3` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
)
|
||||
) ENGINE=MyISAM
|
||||
master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Table_map # # table_id: # (mysql.user)
|
||||
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||
|
|
|
@ -56,6 +56,10 @@ CREATE VIEW v1 AS SELECT a FROM t1 WHERE a < 100;
|
|||
CREATE DATABASE d2;
|
||||
source include/kill_query.inc;
|
||||
include/rpl_diff.inc
|
||||
ALTER DATABASE d1
|
||||
DEFAULT CHARACTER SET = 'utf8';
|
||||
source include/kill_query.inc;
|
||||
include/rpl_diff.inc
|
||||
DROP DATABASE d1;
|
||||
source include/kill_query.inc;
|
||||
include/rpl_diff.inc
|
||||
|
@ -83,6 +87,9 @@ include/rpl_diff.inc
|
|||
DROP FUNCTION f1;
|
||||
source include/kill_query.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)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO rows FROM t2;
|
||||
|
@ -96,6 +103,9 @@ include/rpl_diff.inc
|
|||
DROP PROCEDURE p1;
|
||||
source include/kill_query.inc;
|
||||
include/rpl_diff.inc
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
source include/kill_query.inc;
|
||||
include/rpl_diff.inc
|
||||
CREATE TABLE t2 (b int);
|
||||
source include/kill_query.inc;
|
||||
include/rpl_diff.inc
|
||||
|
|
|
@ -4,8 +4,9 @@ CREATE TABLE t1 (a int) ENGINE=MyISAM;
|
|||
CREATE TABLE t2 (a int) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
INSERT INTO t2 VALUES (4), (5), (6);
|
||||
CREATE TABLE IF NOT EXISTS t1_merge LIKE t1;
|
||||
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;
|
||||
include/diff_tables.inc [master:test.t1, slave:test.t1]
|
||||
include/diff_tables.inc [master:test.t2, slave:test.t2]
|
||||
UPDATE t1_merge SET a=10 WHERE a=1;
|
||||
|
|
13
mysql-test/suite/rpl/r/rpl_tmp_table_and_DDL_innodb.result
Normal file
13
mysql-test/suite/rpl/r/rpl_tmp_table_and_DDL_innodb.result
Normal 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
|
|
@ -26,10 +26,8 @@
|
|||
#
|
||||
# There are some part of the test are temporarily disabled because of
|
||||
# the following bugs, please enable then once they get fixed:
|
||||
# - BUG#44041
|
||||
# - BUG#43353
|
||||
# - BUG#25705
|
||||
# - BUG#44171
|
||||
# - BUG#22473427
|
||||
# - Bug#22587377
|
||||
|
||||
# Temporarily disabled on Windows due to bug #47638
|
||||
--source include/not_windows.inc
|
||||
|
@ -148,11 +146,9 @@ let $rpl_diff_statement= SELECT schema_name FROM information_schema.schemata
|
|||
send CREATE DATABASE d2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# Temporarily disabled, see BUG#44041, the ALTER DATABASE can affect the
|
||||
# collation of other database on slave
|
||||
#send ALTER DATABASE d1
|
||||
# DEFAULT CHARACTER SET = 'utf8';
|
||||
#source include/kill_query_and_diff_master_slave.inc;
|
||||
send ALTER DATABASE d1
|
||||
DEFAULT CHARACTER SET = 'utf8';
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
send DROP DATABASE d1;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
@ -171,8 +167,8 @@ send CREATE EVENT e2
|
|||
DO INSERT INTO test.t1 VALUES (2);
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
# Temporarily disabled because of BUG#44171, killing ALTER EVENT can
|
||||
# crash the server
|
||||
# Temporarily disabled,see Bug#22587377-RPL.RPL_KILLED_DDL
|
||||
# FAILS SPORADICALLY ON PB2 IN 5.5 AND 5.6
|
||||
#send ALTER EVENT e1
|
||||
# ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 DAY;
|
||||
#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
|
||||
# killed
|
||||
#
|
||||
# Temporarily disabled. Because of BUG#43353, KILL the query may
|
||||
# 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;
|
||||
send DROP FUNCTION IF EXISTS f2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## PROCEDURE ########
|
||||
|
||||
|
@ -231,9 +219,8 @@ source include/kill_query_and_diff_master_slave.inc;
|
|||
send DROP PROCEDURE p1;
|
||||
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;
|
||||
#source include/kill_query_and_diff_master_slave.inc;
|
||||
send DROP PROCEDURE IF EXISTS p2;
|
||||
source include/kill_query_and_diff_master_slave.inc;
|
||||
|
||||
######## TABLE ########
|
||||
|
||||
|
@ -261,9 +248,10 @@ source include/kill_query_and_diff_master_slave.inc;
|
|||
|
||||
######## 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
|
||||
# FOREIGN DATA WRAPPER mysql
|
||||
|
|
|
@ -20,8 +20,10 @@ CREATE TABLE t1 (a int) ENGINE=MyISAM;
|
|||
CREATE TABLE t2 (a int) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
INSERT INTO t2 VALUES (4), (5), (6);
|
||||
CREATE TABLE IF NOT EXISTS t1_merge LIKE t1;
|
||||
ALTER TABLE t1_merge ENGINE=MERGE UNION (t2, t1);
|
||||
# Changed a little to check also an issue reported on BUG#20574550
|
||||
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
|
||||
|
||||
|
|
55
mysql-test/suite/rpl/t/rpl_tmp_table_and_DDL_innodb.test
Normal file
55
mysql-test/suite/rpl/t/rpl_tmp_table_and_DDL_innodb.test
Normal 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
|
||||
|
43
mysql-test/t/insert_innodb.test
Normal file
43
mysql-test/t/insert_innodb.test
Normal 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;
|
|
@ -1,5 +1,5 @@
|
|||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2013, Monty Program Ab.
|
||||
/* Copyright (c) 2000, 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
|
||||
|
@ -5463,3 +5463,28 @@ fl_create_iterator(enum handler_iterator_type type,
|
|||
}
|
||||
}
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef HANDLER_INCLUDED
|
||||
#define HANDLER_INCLUDED
|
||||
/*
|
||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009-2011 Monty Program Ab
|
||||
Copyright (c) 2000, 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
|
||||
|
@ -333,6 +333,7 @@
|
|||
/* Flags for method is_fatal_error */
|
||||
#define HA_CHECK_DUP_KEY 1
|
||||
#define HA_CHECK_DUP_UNIQUE 2
|
||||
#define HA_CHECK_FK_ERROR 4
|
||||
#define HA_CHECK_DUP (HA_CHECK_DUP_KEY + HA_CHECK_DUP_UNIQUE)
|
||||
|
||||
enum legacy_db_type
|
||||
|
@ -2023,7 +2024,10 @@ public:
|
|||
((flags & HA_CHECK_DUP_KEY) &&
|
||||
(error == HA_ERR_FOUND_DUPP_KEY ||
|
||||
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 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);
|
||||
}
|
||||
#endif
|
||||
|
||||
void warn_fk_constraint_violation(THD *thd, TABLE *table, int error);
|
||||
|
||||
#endif /* HANDLER_INCLUDED */
|
||||
|
|
12
sql/item.cc
12
sql/item.cc
|
@ -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
|
||||
|
||||
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;
|
||||
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(),
|
||||
ostr->charset(), tocs, &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)
|
||||
{
|
||||
if (state == NO_VALUE)
|
||||
if (state == NO_VALUE || query_type & QT_NO_DATA_EXPANSION)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (field && field->table->const_table)
|
||||
if (field && field->table->const_table &&
|
||||
!(query_type & QT_NO_DATA_EXPANSION))
|
||||
{
|
||||
print_value(str);
|
||||
return;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef ITEM_FUNC_INCLUDED
|
||||
#define ITEM_FUNC_INCLUDED
|
||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2014, MariaDB
|
||||
/* Copyright (c) 2000, 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
|
||||
|
@ -245,7 +245,7 @@ public:
|
|||
char buf[256];
|
||||
String str(buf, sizeof(buf), system_charset_info);
|
||||
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());
|
||||
}
|
||||
inline double raise_float_overflow()
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef ITEM_GEOFUNC_INCLUDED
|
||||
#define ITEM_GEOFUNC_INCLUDED
|
||||
|
||||
/* Copyright (c) 2000, 2010 Oracle and/or its affiliates.
|
||||
Copyright (C) 2011 Monty Program Ab.
|
||||
/* Copyright (c) 2000, 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
|
||||
|
@ -191,7 +191,7 @@ public:
|
|||
if (args[i]->fixed && args[i]->field_type() != MYSQL_TYPE_GEOMETRY)
|
||||
{
|
||||
String str;
|
||||
args[i]->print(&str, QT_ORDINARY);
|
||||
args[i]->print(&str, QT_NO_DATA_EXPANSION);
|
||||
str.append('\0');
|
||||
my_error(ER_ILLEGAL_VALUE_FOR_TYPE, MYF(0), "non geometric",
|
||||
str.ptr());
|
||||
|
|
12
sql/mysqld.h
12
sql/mysqld.h
|
@ -1,5 +1,5 @@
|
|||
/* Copyright (c) 2006, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2015, MariaDB
|
||||
/* Copyright (c) 2006, 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
|
||||
|
@ -427,7 +427,13 @@ enum enum_query_type
|
|||
/// Without character set introducers.
|
||||
QT_WITHOUT_INTRODUCERS= (1 << 1),
|
||||
/// 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 */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2014, SkySQL Ab.
|
||||
/* Copyright (c) 2000, 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
|
||||
|
@ -769,7 +769,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
|
|||
goto end;
|
||||
|
||||
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)))
|
||||
{
|
||||
ACL_HOST host;
|
||||
|
@ -826,7 +825,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
|
|||
goto end;
|
||||
|
||||
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);
|
||||
password_length= table->field[2]->field_length /
|
||||
table->field[2]->charset()->mbmaxlen;
|
||||
|
@ -1029,7 +1027,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
|
|||
goto end;
|
||||
|
||||
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)))
|
||||
{
|
||||
ACL_DB db;
|
||||
|
@ -1091,8 +1088,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
|
|||
end_read_record(&read_record_info);
|
||||
freeze_size(&acl_dbs);
|
||||
|
||||
(void) my_init_dynamic_array(&acl_proxy_users, sizeof(ACL_PROXY_USER),
|
||||
50, 100);
|
||||
if (tables[3].table)
|
||||
{
|
||||
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;
|
||||
|
||||
end:
|
||||
end_read_record(&read_record_info);
|
||||
thd->variables.sql_mode= old_sql_mode;
|
||||
DBUG_RETURN(return_val);
|
||||
}
|
||||
|
@ -1142,12 +1138,12 @@ void acl_free(bool end)
|
|||
delete_dynamic(&acl_wild_hosts);
|
||||
delete_dynamic(&acl_proxy_users);
|
||||
my_hash_free(&acl_check_hosts);
|
||||
plugin_unlock(0, native_password_plugin);
|
||||
plugin_unlock(0, old_password_plugin);
|
||||
if (!end)
|
||||
acl_cache->clear(1); /* purecov: inspected */
|
||||
else
|
||||
{
|
||||
plugin_unlock(0, native_password_plugin);
|
||||
plugin_unlock(0, old_password_plugin);
|
||||
delete acl_cache;
|
||||
acl_cache=0;
|
||||
}
|
||||
|
@ -1221,6 +1217,10 @@ my_bool acl_reload(THD *thd)
|
|||
old_acl_users= acl_users;
|
||||
old_acl_proxy_users= acl_proxy_users;
|
||||
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;
|
||||
delete_dynamic(&acl_wild_hosts);
|
||||
my_hash_free(&acl_check_hosts);
|
||||
|
|
|
@ -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
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -1807,6 +1807,18 @@ public:
|
|||
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:
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
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
|
||||
|
@ -1609,7 +1609,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
|||
else
|
||||
table->file->insert_id_for_cur_row= insert_id_for_cur_row;
|
||||
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;
|
||||
is_duplicate_key_error= table->file->is_fatal_error(error, 0);
|
||||
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)
|
||||
{
|
||||
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 &
|
||||
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");
|
||||
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;
|
||||
if (!(thd->variables.old_behavior &
|
||||
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);
|
||||
if (!table->file->has_transactions())
|
||||
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);
|
||||
|
||||
err:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
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
|
||||
|
@ -255,6 +255,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
thd_proc_info(thd, "executing");
|
||||
/*
|
||||
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.
|
||||
|
|
|
@ -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
|
||||
|
||||
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_iterator_fast<TABLE_LIST> ti(*tables);
|
||||
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++)
|
||||
{
|
||||
/*
|
||||
See comment in print_table_array() about the second part of the
|
||||
condition
|
||||
*/
|
||||
if (!t->optimized_away && !is_eliminated_table(eliminated_tables, t))
|
||||
non_const_tables++;
|
||||
/* See comment in print_table_array() about the second condition */
|
||||
if (print_const_tables || !t->optimized_away)
|
||||
if (!is_eliminated_table(eliminated_tables, t))
|
||||
tables_to_print++;
|
||||
}
|
||||
if (!non_const_tables)
|
||||
if (tables_to_print == 0)
|
||||
{
|
||||
str->append(STRING_WITH_LEN("dual"));
|
||||
return; // all tables were optimized away
|
||||
}
|
||||
ti.rewind();
|
||||
|
||||
if (!(table= (TABLE_LIST **)thd->alloc(sizeof(TABLE_LIST*) *
|
||||
non_const_tables)))
|
||||
if (!(table= static_cast<TABLE_LIST **>(thd->alloc(sizeof(TABLE_LIST*) *
|
||||
tables_to_print))))
|
||||
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++))
|
||||
{
|
||||
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;
|
||||
*t--= tmp;
|
||||
}
|
||||
|
@ -23173,7 +23193,7 @@ static void print_join(THD *thd,
|
|||
*/
|
||||
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++)
|
||||
{
|
||||
if (!(*t2)->sj_inner_tables)
|
||||
|
@ -23186,7 +23206,7 @@ static void print_join(THD *thd,
|
|||
}
|
||||
}
|
||||
print_table_array(thd, eliminated_tables, str, table,
|
||||
table + non_const_tables, query_type);
|
||||
table + tables_to_print, query_type);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
||||
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.
|
||||
*/
|
||||
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
|
||||
|
@ -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))
|
||||
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))=
|
||||
store_create_info(thd, table, &query,
|
||||
create_info, TRUE /* show_database */);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2013, Monty Program Ab.
|
||||
/* Copyright (c) 2000, 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
|
||||
|
@ -774,7 +774,8 @@ int mysql_update(THD *thd,
|
|||
error= 0;
|
||||
}
|
||||
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
|
||||
|
@ -782,7 +783,8 @@ int mysql_update(THD *thd,
|
|||
*/
|
||||
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 */
|
||||
|
||||
prepare_record_for_error_message(error, table);
|
||||
|
@ -790,6 +792,9 @@ int mysql_update(THD *thd,
|
|||
error= 1;
|
||||
break;
|
||||
}
|
||||
else if (ignore && !table->file->is_fatal_error(error,
|
||||
HA_CHECK_FK_ERROR))
|
||||
warn_fk_constraint_violation(thd, table, error);
|
||||
}
|
||||
|
||||
if (table->triggers &&
|
||||
|
@ -1969,7 +1974,8 @@ int multi_update::send_data(List<Item> ¬_used_values)
|
|||
{
|
||||
updated--;
|
||||
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
|
||||
|
@ -1977,13 +1983,17 @@ int multi_update::send_data(List<Item> ¬_used_values)
|
|||
*/
|
||||
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 */
|
||||
|
||||
prepare_record_for_error_message(error, table);
|
||||
table->file->print_error(error,MYF(flags));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
else if (ignore && !table->file->is_fatal_error(error,
|
||||
HA_CHECK_FK_ERROR))
|
||||
warn_fk_constraint_violation(thd, table, error);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2256,11 +2266,15 @@ int multi_update::do_updates()
|
|||
local_error != HA_ERR_RECORD_IS_THE_SAME)
|
||||
{
|
||||
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;
|
||||
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)
|
||||
updated++;
|
||||
|
|
|
@ -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
|
||||
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);
|
||||
|
||||
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) {
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
|
@ -335,28 +335,7 @@ amount of increment. */
|
|||
# define os_atomic_increment_ulint(ptr, amount) \
|
||||
os_atomic_increment(ptr, amount)
|
||||
|
||||
# if 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);
|
||||
}
|
||||
|
||||
# elif defined(IB_STRONG_MEMORY_MODEL)
|
||||
# if defined(IB_STRONG_MEMORY_MODEL)
|
||||
|
||||
/** Do an atomic test and set.
|
||||
@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));
|
||||
}
|
||||
|
||||
# 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
|
||||
|
||||
# error "Unsupported platform"
|
||||
|
|
|
@ -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
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -1767,7 +1767,7 @@ 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) {
|
||||
recv_no_ibuf_operations = TRUE;
|
||||
|
|
|
@ -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
|
||||
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,
|
||||
sizeof(FTB_WORD) +
|
||||
(info->trunc ? HA_MAX_KEY_BUFF :
|
||||
word_len * ftb_param->ftb->charset->mbmaxlen +
|
||||
(word_len + 1) *
|
||||
ftb_param->ftb->charset->mbmaxlen +
|
||||
HA_FT_WLEN +
|
||||
ftb_param->ftb->info->s->rec_reflength));
|
||||
ftbw->len= word_len + 1;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* 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
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
Loading…
Add table
Reference in a new issue