Merge branch '5.5' into 10.0

This commit is contained in:
Sergei Golubchik 2016-04-26 23:05:26 +02:00
commit 872649c7ba
109 changed files with 1309 additions and 319 deletions

View File

@ -1,3 +1,3 @@
MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MAJOR=10
MYSQL_VERSION_MINOR=0 MYSQL_VERSION_MINOR=0
MYSQL_VERSION_PATCH=24 MYSQL_VERSION_PATCH=25

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,7 +1,6 @@
/* /*
Copyright (c) 2000, 2014, Oracle and/or its affiliates. Copyright (c) 2000, 2014, Oracle and/or its affiliates.
Copyright (c) 2009, 2013, Monty Program Ab. Copyright (c) 2009, 2016, MariaDB
Copyright (c) 2013, 2014, SkySQL 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
@ -96,9 +95,16 @@ extern "C" {
#endif #endif
} }
#if !defined(HAVE_VIDATTR) #ifdef HAVE_VIDATTR
#undef vidattr static int have_curses= 0;
#define vidattr(A) {} // Can't get this to work static void my_vidattr(chtype attrs)
{
if (have_curses)
vidattr(attrs);
}
#else
#undef HAVE_SETUPTERM
#define my_vidattr(A) {} // Can't get this to work
#endif #endif
#ifdef FN_NO_CASE_SENSE #ifdef FN_NO_CASE_SENSE
@ -4740,9 +4746,9 @@ com_status(String *buffer __attribute__((unused)),
if (skip_updates) if (skip_updates)
{ {
vidattr(A_BOLD); my_vidattr(A_BOLD);
tee_fprintf(stdout, "\nAll updates ignored to this database\n"); tee_fprintf(stdout, "\nAll updates ignored to this database\n");
vidattr(A_NORMAL); my_vidattr(A_NORMAL);
} }
#ifdef USE_POPEN #ifdef USE_POPEN
tee_fprintf(stdout, "Current pager:\t\t%s\n", pager); tee_fprintf(stdout, "Current pager:\t\t%s\n", pager);
@ -4810,9 +4816,9 @@ com_status(String *buffer __attribute__((unused)),
} }
if (safe_updates) if (safe_updates)
{ {
vidattr(A_BOLD); my_vidattr(A_BOLD);
tee_fprintf(stdout, "\nNote that you are running in safe_update_mode:\n"); tee_fprintf(stdout, "\nNote that you are running in safe_update_mode:\n");
vidattr(A_NORMAL); my_vidattr(A_NORMAL);
tee_fprintf(stdout, "\ tee_fprintf(stdout, "\
UPDATEs and DELETEs that don't use a key in the WHERE clause are not allowed.\n\ UPDATEs and DELETEs that don't use a key in the WHERE clause are not allowed.\n\
(One can force an UPDATE/DELETE by adding LIMIT # at the end of the command.)\n\ (One can force an UPDATE/DELETE by adding LIMIT # at the end of the command.)\n\
@ -4905,10 +4911,11 @@ put_info(const char *str,INFO_TYPE info_type, uint error, const char *sqlstate)
{ {
if (!inited) if (!inited)
{ {
inited=1;
#ifdef HAVE_SETUPTERM #ifdef HAVE_SETUPTERM
(void) setupterm((char *)0, 1, (int *) 0); int errret;
have_curses= setupterm((char *)0, 1, &errret) != ERR;
#endif #endif
inited=1;
} }
if (info_type == INFO_ERROR) if (info_type == INFO_ERROR)
{ {
@ -4920,7 +4927,7 @@ put_info(const char *str,INFO_TYPE info_type, uint error, const char *sqlstate)
putchar('\a'); /* This should make a bell */ putchar('\a'); /* This should make a bell */
#endif #endif
} }
vidattr(A_STANDOUT); my_vidattr(A_STANDOUT);
if (error) if (error)
{ {
if (sqlstate) if (sqlstate)
@ -4939,9 +4946,9 @@ put_info(const char *str,INFO_TYPE info_type, uint error, const char *sqlstate)
tee_fputs(": ", file); tee_fputs(": ", file);
} }
else else
vidattr(A_BOLD); my_vidattr(A_BOLD);
(void) tee_puts(str, file); (void) tee_puts(str, file);
vidattr(A_NORMAL); my_vidattr(A_NORMAL);
} }
if (unbuffered) if (unbuffered)
fflush(file); fflush(file);

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, 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) 2001, 2013, Oracle and/or its affiliates. Copyright (c) 2001, 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, 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

@ -50,8 +50,6 @@ usr/share/mysql/mysql-test/suite/ndb
usr/share/mysql/mysql-test/suite/ndb/t usr/share/mysql/mysql-test/suite/ndb/t
usr/share/mysql/mysql-test/suite/ndb/r usr/share/mysql/mysql-test/suite/ndb/r
usr/share/mysql/mysql-test/suite/maria usr/share/mysql/mysql-test/suite/maria
usr/share/mysql/mysql-test/suite/maria/t
usr/share/mysql/mysql-test/suite/maria/r
usr/share/mysql/mysql-test/suite/funcs_2 usr/share/mysql/mysql-test/suite/funcs_2
usr/share/mysql/mysql-test/suite/funcs_2/lib usr/share/mysql/mysql-test/suite/funcs_2/lib
usr/share/mysql/mysql-test/suite/funcs_2/t usr/share/mysql/mysql-test/suite/funcs_2/t

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

@ -34,7 +34,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,
ASN1_STRING *b, ASN1_STRING *a); ASN1_STRING *b, ASN1_STRING *a, int, int, int, int);
~X509() {} ~X509() {}
X509_NAME* GetIssuer(); X509_NAME* GetIssuer();

View File

@ -304,7 +304,10 @@ int CertManager::Validate()
afterDate.type= cert.GetAfterDateType(); afterDate.type= cert.GetAfterDateType();
afterDate.length= strlen((char *) afterDate.data) + 1; afterDate.length= strlen((char *) afterDate.data) + 1;
peerX509_ = NEW_YS X509(cert.GetIssuer(), iSz, cert.GetCommonName(), peerX509_ = NEW_YS X509(cert.GetIssuer(), iSz, cert.GetCommonName(),
sSz, &beforeDate, &afterDate); sSz, &beforeDate, &afterDate,
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;
@ -350,7 +353,9 @@ int CertManager::SetPrivateKey(const x509& key)
afterDate.type= cd.GetAfterDateType(); afterDate.type= cd.GetAfterDateType();
afterDate.length= strlen((char *) afterDate.data) + 1; afterDate.length= strlen((char *) afterDate.data) + 1;
selfX509_ = NEW_YS X509(cd.GetIssuer(), iSz, cd.GetCommonName(), selfX509_ = NEW_YS X509(cd.GetIssuer(), iSz, cd.GetCommonName(),
sSz, &beforeDate, &afterDate); sSz, &beforeDate, &afterDate,
cd.GetIssuerCnStart(), cd.GetIssuerCnLength(),
cd.GetSubjectCnStart(), cd.GetSubjectCnLength());
} }
return 0; return 0;
} }
@ -367,7 +372,9 @@ void CertManager::setPeerX509(X509* x)
ASN1_STRING* after = x->GetAfter(); ASN1_STRING* after = x->GetAfter();
peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(), peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(),
subject->GetName(), subject->GetLength(), before, after); subject->GetName(), subject->GetLength(), before, after,
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;
} }
@ -1471,10 +1469,6 @@ int SSL_peek(SSL* ssl, void* buffer, int sz)
int SSL_pending(SSL* ssl) int SSL_pending(SSL* ssl)
{ {
// Just in case there's pending data that hasn't been processed yet...
char c;
SSL_peek(ssl, &c, 1);
return ssl->bufferedData(); return ssl->bufferedData();
} }

View File

@ -1554,8 +1554,9 @@ void SSL_SESSION::CopyX509(X509* x)
ASN1_TIME* after = x->GetAfter(); ASN1_TIME* after = x->GetAfter();
peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(), peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(),
subject->GetName(), subject->GetLength(), subject->GetName(), subject->GetLength(), before, after,
before, after); issuer->GetCnPosition(), issuer->GetCnLength(),
subject->GetCnPosition(), subject->GetCnLength());
} }
@ -2472,8 +2473,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 +2504,10 @@ 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,
ASN1_STRING *b, ASN1_STRING *a) ASN1_STRING *b, ASN1_STRING *a,
: issuer_(i, iSz), subject_(s, sSz), int issPos, int issLen,
int subPos, int subLen)
: issuer_(i, iSz, issPos, issLen), subject_(s, sSz, subPos, subLen),
beforeDate_((char *) b->data, b->length, b->type), beforeDate_((char *) b->data, b->length, b->type),
afterDate_((char *) a->data, a->length, a->type) afterDate_((char *) a->data, a->length, a->type)
{} {}
@ -2539,17 +2542,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

@ -285,6 +285,10 @@ public:
byte GetBeforeDateType() const { return beforeDateType_; } byte GetBeforeDateType() const { return beforeDateType_; }
const char* GetAfterDate() const { return afterDate_; } const char* GetAfterDate() const { return afterDate_; }
byte GetAfterDateType() const { return afterDateType_; } byte GetAfterDateType() const { return afterDateType_; }
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:
@ -294,6 +298,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

@ -482,8 +482,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;
@ -804,6 +805,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

@ -274,6 +274,25 @@ SET(CLIENT_API_FUNCTIONS
) )
IF(CMAKE_SYSTEM_NAME MATCHES "Linux") IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
IF (NOT DISABLE_LIBMYSQLCLIENT_SYMBOL_VERSIONING)
INCLUDE (CheckCSourceCompiles)
FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.ld"
"VERSION {\nlibmysqlclient_18 {\nglobal: *;\n};\n}\n")
SET(CMAKE_REQUIRED_LIBRARIES "-Wl,src.ld")
CHECK_C_SOURCE_COMPILES("int main() { return 0; }"
SUPPORTS_VERSION_IN_LINK_SCRIPT)
SET(CMAKE_REQUIRED_LIBRARIES)
IF (NOT SUPPORTS_VERSION_IN_LINK_SCRIPT)
# https://sourceware.org/bugzilla/show_bug.cgi?id=16895
MESSAGE(SEND_ERROR "Your current linker does not support VERSION "
"command in linker scripts like a GNU ld or any compatible linker "
"should. Perhaps you're using gold? Either switch to GNU ld compatible "
"linker or run cmake with -DDISABLE_LIBMYSQLCLIENT_SYMBOL_VERSIONING=TRUE "
"to be able to complete the build")
ENDIF (NOT SUPPORTS_VERSION_IN_LINK_SCRIPT)
# When building RPM, or DEB package on Debian, use ELF symbol versioning # When building RPM, or DEB package on Debian, use ELF symbol versioning
# for compatibility with distribution packages, so client shared library can # for compatibility with distribution packages, so client shared library can
# painlessly replace the one supplied by the distribution. # painlessly replace the one supplied by the distribution.
@ -358,14 +377,26 @@ IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
make_scrambled_password_323 make_scrambled_password_323
) )
# Linker script to version symbols in Fedora- and Debian- compatible way, MDEV-5529
SET(VERSION_SCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/libmysql_versions.ld.in)
# Generate version script. # Generate version script.
# Create semicolon separated lists of functions to export from # Create semicolon separated lists of functions to export from
# Since RPM packages use separate versioning for 5.1 API # Since RPM packages use separate versioning for 5.1 API
# and 5.5 API (libmysqlclient_16 vs libmysqlclient_18), # and 5.5 API (libmysqlclient_16 vs libmysqlclient_18),
# we need 2 lists. # we need 2 lists.
SET (VERSION_HEADER
"VERSION {
libmysqlclient_18 {
global:")
SET (VERSION_FOOTER
" local:
*;
};
libmysqlclient_16 {
/* empty here. aliases are added above */
};
}
")
SET (CLIENT_API_5_1_LIST) SET (CLIENT_API_5_1_LIST)
SET (CLIENT_API_5_1_ALIASES) SET (CLIENT_API_5_1_ALIASES)
FOREACH (f ${CLIENT_API_FUNCTIONS_5_1} ${CLIENT_API_5_1_EXTRA}) FOREACH (f ${CLIENT_API_FUNCTIONS_5_1} ${CLIENT_API_5_1_EXTRA})
@ -378,6 +409,13 @@ IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
SET(CLIENT_API_5_5_LIST "${CLIENT_API_5_5_LIST}\t${f};\n") SET(CLIENT_API_5_5_LIST "${CLIENT_API_5_5_LIST}\t${f};\n")
ENDFOREACH() ENDFOREACH()
ELSE (NOT DISABLE_LIBMYSQLCLIENT_SYMBOL_VERSIONING)
SET (CLIENT_API_5_1_ALIASES "/* Versioning disabled per user request. MDEV-5982 */")
ENDIF (NOT DISABLE_LIBMYSQLCLIENT_SYMBOL_VERSIONING)
# Linker script to version symbols in Fedora- and Debian- compatible way, MDEV-5529
SET(VERSION_SCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/libmysql_versions.ld.in)
CONFIGURE_FILE( CONFIGURE_FILE(
${VERSION_SCRIPT_TEMPLATE} ${VERSION_SCRIPT_TEMPLATE}
${CMAKE_CURRENT_BINARY_DIR}/libmysql_versions.ld ${CMAKE_CURRENT_BINARY_DIR}/libmysql_versions.ld
@ -386,7 +424,7 @@ IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
SET(VERSION_SCRIPT_LINK_FLAGS SET(VERSION_SCRIPT_LINK_FLAGS
"-Wl,${CMAKE_CURRENT_BINARY_DIR}/libmysql_versions.ld") "-Wl,${CMAKE_CURRENT_BINARY_DIR}/libmysql_versions.ld")
ENDIF() ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
SET(CLIENT_SOURCES SET(CLIENT_SOURCES

View File

@ -27,19 +27,7 @@ mysql_get_charset_by_csname = get_charset_by_csname;
mysql_net_realloc = net_realloc; mysql_net_realloc = net_realloc;
mysql_client_errors = client_errors; mysql_client_errors = client_errors;
VERSION { @VERSION_HEADER@
libmysqlclient_18 {
global:
@CLIENT_API_5_1_LIST@ @CLIENT_API_5_1_LIST@
@CLIENT_API_5_5_LIST@ @CLIENT_API_5_5_LIST@
@VERSION_FOOTER@
local:
*;
};
libmysqlclient_16 {
/* empty here. aliases are added above */
};
}

View File

@ -1818,6 +1818,12 @@ SELECT f1() FROM t1 LEFT JOIN (SELECT 1 AS a FROM t1 LIMIT 0) AS d ON 1 GROUP BY
DROP FUNCTION f1; DROP FUNCTION f1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-9662 Assertion `precision || !scale' failed in my_decimal_precision_to_length_no_truncation(uint, uint8, bool)
--echo #
SELECT @@collation_connection;
SELECT CASE 1 WHEN 2 THEN ( - '3' ) END;
--echo # --echo #
--echo # MDEV-5702 Incorrect results are returned with NULLIF() --echo # MDEV-5702 Incorrect results are returned with NULLIF()
--echo # --echo #

View File

@ -502,3 +502,9 @@ a
SELECT * FROM t1 WHERE a IN (0.8,0.9); SELECT * FROM t1 WHERE a IN (0.8,0.9);
a a
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-9372 select 100 between 1 and 9223372036854775808 returns false
#
SELECT 100 BETWEEN 1 AND 9223372036854775808;
100 BETWEEN 1 AND 9223372036854775808
1

View File

@ -8,4 +8,17 @@ a
Warnings: Warnings:
Note 1003 2000-01-01 Note 1003 2000-01-01
Note 1003 2000-01-06 Note 1003 2000-01-06
set debug_dbug='';
drop table t1;
create table t1 (id int not null, ut timestamp(6) not null);
insert into t1 values(1, '2001-01-01 00:00:00.2');
insert into t1 values(1, '2001-01-01 00:00:00.1');
select * from t1;
id ut
1 2001-01-01 00:00:00.200000
1 2001-01-01 00:00:00.100000
select (select max(m2.ut) from t1 m2 where m1.id <> 0) from t1 m1;
(select max(m2.ut) from t1 m2 where m1.id <> 0)
2001-01-01 00:00:00.200000
2001-01-01 00:00:00.200000
drop table t1; drop table t1;

View File

@ -231,3 +231,16 @@ case t1.f1 when '00:00:00' then 1 end
1 1
NULL NULL
drop table t1; drop table t1;
#
# MDEV-9745 Crash with CASE WHEN TRUE THEN COALESCE(CAST(NULL AS UNSIGNED)) ELSE 4 END
#
CREATE TABLE t1 SELECT CASE WHEN TRUE THEN COALESCE(CAST(NULL AS UNSIGNED)) ELSE 4 END AS a;
DESCRIBE t1;
Field Type Null Key Default Extra
a decimal(1,0) YES NULL
DROP TABLE t1;
CREATE TABLE t1 SELECT CASE WHEN TRUE THEN COALESCE(CAST(NULL AS UNSIGNED)) ELSE 40 END AS a;
DESCRIBE t1;
Field Type Null Key Default Extra
a decimal(2,0) YES NULL
DROP TABLE t1;

View File

@ -2887,6 +2887,15 @@ f1()
DROP FUNCTION f1; DROP FUNCTION f1;
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-9662 Assertion `precision || !scale' failed in my_decimal_precision_to_length_no_truncation(uint, uint8, bool)
#
SELECT @@collation_connection;
@@collation_connection
binary
SELECT CASE 1 WHEN 2 THEN ( - '3' ) END;
CASE 1 WHEN 2 THEN ( - '3' ) END
NULL
#
# MDEV-5702 Incorrect results are returned with NULLIF() # MDEV-5702 Incorrect results are returned with NULLIF()
# #
CREATE TABLE t1 (d DATE); CREATE TABLE t1 (d DATE);

View File

@ -3279,6 +3279,15 @@ f1()
DROP FUNCTION f1; DROP FUNCTION f1;
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-9662 Assertion `precision || !scale' failed in my_decimal_precision_to_length_no_truncation(uint, uint8, bool)
#
SELECT @@collation_connection;
@@collation_connection
cp1251_general_ci
SELECT CASE 1 WHEN 2 THEN ( - '3' ) END;
CASE 1 WHEN 2 THEN ( - '3' ) END
NULL
#
# MDEV-5702 Incorrect results are returned with NULLIF() # MDEV-5702 Incorrect results are returned with NULLIF()
# #
CREATE TABLE t1 (d DATE); CREATE TABLE t1 (d DATE);

View File

@ -0,0 +1,14 @@
#
# Start of 5.5 tests
#
#
# MDEV-9862 Illegal mix of collation, when comparing column with CASE expression
#
SET NAMES cp850;
CREATE TABLE t1 (a CHAR(1) CHARACTER SET latin1);
SELECT a FROM t1 WHERE CASE a WHEN 'aaaa' THEN 'Y' WHEN 'aaaa' THEN 'Y' ELSE NULL END <> a;
a
DROP TABLE t1;
#
# End of 5.5 tests
#

View File

@ -3563,6 +3563,15 @@ f1()
DROP FUNCTION f1; DROP FUNCTION f1;
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-9662 Assertion `precision || !scale' failed in my_decimal_precision_to_length_no_truncation(uint, uint8, bool)
#
SELECT @@collation_connection;
@@collation_connection
latin1_swedish_ci
SELECT CASE 1 WHEN 2 THEN ( - '3' ) END;
CASE 1 WHEN 2 THEN ( - '3' ) END
NULL
#
# MDEV-5702 Incorrect results are returned with NULLIF() # MDEV-5702 Incorrect results are returned with NULLIF()
# #
CREATE TABLE t1 (d DATE); CREATE TABLE t1 (d DATE);

View File

@ -4470,6 +4470,15 @@ f1()
DROP FUNCTION f1; DROP FUNCTION f1;
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-9662 Assertion `precision || !scale' failed in my_decimal_precision_to_length_no_truncation(uint, uint8, bool)
#
SELECT @@collation_connection;
@@collation_connection
ucs2_general_ci
SELECT CASE 1 WHEN 2 THEN ( - '3' ) END;
CASE 1 WHEN 2 THEN ( - '3' ) END
NULL
#
# MDEV-5702 Incorrect results are returned with NULLIF() # MDEV-5702 Incorrect results are returned with NULLIF()
# #
CREATE TABLE t1 (d DATE); CREATE TABLE t1 (d DATE);

View File

@ -5338,6 +5338,15 @@ f1()
DROP FUNCTION f1; DROP FUNCTION f1;
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-9662 Assertion `precision || !scale' failed in my_decimal_precision_to_length_no_truncation(uint, uint8, bool)
#
SELECT @@collation_connection;
@@collation_connection
utf8_general_ci
SELECT CASE 1 WHEN 2 THEN ( - '3' ) END;
CASE 1 WHEN 2 THEN ( - '3' ) END
NULL
#
# MDEV-5702 Incorrect results are returned with NULLIF() # MDEV-5702 Incorrect results are returned with NULLIF()
# #
CREATE TABLE t1 (d DATE); CREATE TABLE t1 (d DATE);

View File

@ -15,3 +15,15 @@ CREATE TABLE t1(a VARCHAR(2) CHARACTER SET big5 COLLATE big5_chinese_ci,
FULLTEXT(a)); FULLTEXT(a));
INSERT INTO t1 VALUES(0xA3C2); INSERT INTO t1 VALUES(0xA3C2);
DROP TABLE t1; DROP TABLE t1;
create table t1 (
id varchar(255),
business_name text null collate utf8mb4_unicode_ci,
street_address text,
fulltext index ft (business_name),
fulltext index ft2 (street_address)
);
select * from t1 where match (business_name, street_address) against ('some business name and address here');
ERROR HY000: Can't find FULLTEXT index matching the column list
select * from t1 where match (business_name, street_address) against ('some business name and address here' in boolean mode);
id business_name street_address
drop table t1;

View File

@ -660,9 +660,14 @@ 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`)'
INSERT INTO t1 VALUES(0,0);
SELECT -a FROM t1;
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 '-(`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,30 @@
#
# 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`))
UPDATE IGNORE t2 SET fld2=20 WHERE fld2=0;
UPDATE IGNORE t1 SET fld1=20 WHERE fld1=0;
# Test for multi update.
UPDATE IGNORE t1, t2 SET t2.fld2= t2.fld2 + 3;
UPDATE IGNORE t1, t2 SET t1.fld1= t1.fld1 + 3;
# 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

@ -90,6 +90,17 @@ SELECT DATE_FORMAT('2001-01-07', '%w %a %W');
DATE_FORMAT('2001-01-07', '%w %a %W') DATE_FORMAT('2001-01-07', '%w %a %W')
0 Du Duminică 0 Du Duminică
End of 5.4 tests End of 5.4 tests
SET NAMES utf8;
SET lc_time_names=de_AT;
SELECT monthname('2001-01-01');
monthname('2001-01-01')
Jänner
SELECT monthname('2001-02-01');
monthname('2001-02-01')
Februar
SELECT monthname('2001-03-01');
monthname('2001-03-01')
März
# #
# Start of 5.6 tests # Start of 5.6 tests
# #

View File

@ -1,5 +1,4 @@
drop table if exists t1,t2,t3; set @@debug_dbug= 'd,opt';
drop view if exists v2,v3;
CREATE TABLE t1 (pk INT PRIMARY KEY) ENGINE=MyISAM; CREATE TABLE t1 (pk INT PRIMARY KEY) ENGINE=MyISAM;
CREATE TABLE t2 ( CREATE TABLE t2 (
f1 DATE, f1 DATE,

View File

@ -1335,7 +1335,7 @@ sysdate-is-now FALSE
table-cache 400 table-cache 400
table-definition-cache 400 table-definition-cache 400
table-open-cache 400 table-open-cache 400
tc-heuristic-recover COMMIT tc-heuristic-recover OFF
thread-cache-size 0 thread-cache-size 0
thread-pool-idle-timeout 60 thread-pool-idle-timeout 60
thread-pool-max-threads 500 thread-pool-max-threads 500

View File

@ -6,7 +6,7 @@ insert into t1 values (2,2), (1,1);
create table t2 (a int); create table t2 (a int);
insert into t2 values (2), (3); insert into t2 values (2), (3);
set session join_cache_level=3; set session join_cache_level=3;
set @@debug_dbug= 'd:t:O,/tmp/trace.out'; set @@debug_dbug= 'd,opt';
explain select t1.b from t1,t2 where t1.b=t2.a; explain select t1.b from t1,t2 where t1.b=t2.a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where

View File

@ -0,0 +1,158 @@
create user natauth@localhost identified via 'mysql_native_password' using '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user newpass@localhost identified by password '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user newpassnat@localhost identified via 'mysql_native_password';
set password for newpassnat@localhost = '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user oldauth@localhost identified with 'mysql_old_password' using '378b243e220ca493';
create user oldpass@localhost identified by password '378b243e220ca493';
create user oldpassold@localhost identified with 'mysql_old_password';
set password for oldpassold@localhost = '378b243e220ca493';
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
user host password plugin authentication_string
natauth localhost mysql_native_password *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
newpass localhost *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
newpassnat localhost *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
oldauth localhost mysql_old_password 378b243e220ca493
oldpass localhost 378b243e220ca493
oldpassold localhost 378b243e220ca493
connect con,localhost,natauth,test,;
select current_user();
current_user()
natauth@localhost
disconnect con;
connect con,localhost,newpass,test,;
select current_user();
current_user()
newpass@localhost
disconnect con;
connect con,localhost,newpassnat,test,;
select current_user();
current_user()
newpassnat@localhost
disconnect con;
connect con,localhost,oldauth,test,;
select current_user();
current_user()
oldauth@localhost
disconnect con;
connect con,localhost,oldpass,test,;
select current_user();
current_user()
oldpass@localhost
disconnect con;
connect con,localhost,oldpassold,test,;
select current_user();
current_user()
oldpassold@localhost
disconnect con;
connection default;
flush privileges;
connect con,localhost,natauth,test,;
select current_user();
current_user()
natauth@localhost
disconnect con;
connect con,localhost,newpass,test,;
select current_user();
current_user()
newpass@localhost
disconnect con;
connect con,localhost,newpassnat,test,;
select current_user();
current_user()
newpassnat@localhost
disconnect con;
connect con,localhost,oldauth,test,;
select current_user();
current_user()
oldauth@localhost
disconnect con;
connect con,localhost,oldpass,test,;
select current_user();
current_user()
oldpass@localhost
disconnect con;
connect con,localhost,oldpassold,test,;
select current_user();
current_user()
oldpassold@localhost
disconnect con;
connection default;
set password for natauth@localhost = PASSWORD('test2');
set password for newpass@localhost = PASSWORD('test2');
set password for newpassnat@localhost = PASSWORD('test2');
set password for oldauth@localhost = PASSWORD('test2');
set password for oldpass@localhost = PASSWORD('test2');
set password for oldpassold@localhost = PASSWORD('test2');
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
user host password plugin authentication_string
natauth localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
newpass localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
newpassnat localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
oldauth localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
oldpass localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
oldpassold localhost *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E
connect con,localhost,natauth,test2,;
select current_user();
current_user()
natauth@localhost
disconnect con;
connect con,localhost,newpass,test2,;
select current_user();
current_user()
newpass@localhost
disconnect con;
connect con,localhost,newpassnat,test2,;
select current_user();
current_user()
newpassnat@localhost
disconnect con;
connect con,localhost,oldauth,test2,;
select current_user();
current_user()
oldauth@localhost
disconnect con;
connect con,localhost,oldpass,test2,;
select current_user();
current_user()
oldpass@localhost
disconnect con;
connect con,localhost,oldpassold,test2,;
select current_user();
current_user()
oldpassold@localhost
disconnect con;
connection default;
flush privileges;
connect con,localhost,natauth,test2,;
select current_user();
current_user()
natauth@localhost
disconnect con;
connect con,localhost,newpass,test2,;
select current_user();
current_user()
newpass@localhost
disconnect con;
connect con,localhost,newpassnat,test2,;
select current_user();
current_user()
newpassnat@localhost
disconnect con;
connect con,localhost,oldauth,test2,;
select current_user();
current_user()
oldauth@localhost
disconnect con;
connect con,localhost,oldpass,test2,;
select current_user();
current_user()
oldpass@localhost
disconnect con;
connect con,localhost,oldpassold,test2,;
select current_user();
current_user()
oldpassold@localhost
disconnect con;
connection default;
drop user natauth@localhost, newpass@localhost, newpassnat@localhost;
drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost;

View File

@ -71,7 +71,7 @@ connection default;
set password for u1 = PASSWORD('SOMETHINGELSE'); set password for u1 = PASSWORD('SOMETHINGELSE');
select user, host, password, plugin, authentication_string from mysql.user where user = 'u1'; select user, host, password, plugin, authentication_string from mysql.user where user = 'u1';
user host password plugin authentication_string user host password plugin authentication_string
u1 % *054B7BBD2B9A553DA560520DCD3F76DA2D81B7C6 mysql_native_password *7AFEFD08B6B720E781FB000CAA418F54FA662626 u1 % *054B7BBD2B9A553DA560520DCD3F76DA2D81B7C6
# #
# Here we should use the password field, as that primes over # Here we should use the password field, as that primes over
# the authentication_string field. # the authentication_string field.
@ -115,7 +115,7 @@ connection default;
update mysql.user set authentication_string = '' where user='u1'; update mysql.user set authentication_string = '' where user='u1';
select user, host, password, plugin, authentication_string from mysql.user where user = 'u1'; select user, host, password, plugin, authentication_string from mysql.user where user = 'u1';
user host password plugin authentication_string user host password plugin authentication_string
u1 % *054B7BBD2B9A553DA560520DCD3F76DA2D81B7C6 mysql_native_password u1 % *054B7BBD2B9A553DA560520DCD3F76DA2D81B7C6
flush privileges; flush privileges;
show grants for u1; show grants for u1;
Grants for u1@% Grants for u1@%
@ -127,7 +127,7 @@ GRANT SELECT ON `mysql`.* TO 'u1'@'%'
connect con1, localhost, u1,'SOMETHINGELSE',; connect con1, localhost, u1,'SOMETHINGELSE',;
select user, host, password, plugin, authentication_string from mysql.user where user = 'u1'; select user, host, password, plugin, authentication_string from mysql.user where user = 'u1';
user host password plugin authentication_string user host password plugin authentication_string
u1 % *054B7BBD2B9A553DA560520DCD3F76DA2D81B7C6 mysql_native_password u1 % *054B7BBD2B9A553DA560520DCD3F76DA2D81B7C6
disconnect con1; disconnect con1;
connection default; connection default;
# #

View File

@ -32,12 +32,9 @@ update t1, t2 set val= 1 where id1=id2;
call bug9486(); call bug9486();
lock tables t2 write; lock tables t2 write;
call bug9486(); call bug9486();
show processlist; SELECT state,info FROM information_schema.processlist WHERE id=con1root_id;
Id User Host db Command Time State Info Progress state info
# root localhost test Sleep # NULL 0.000 Waiting for table metadata lock update t1, t2 set val= 1 where id1=id2
# root localhost test Query # Waiting for table metadata lock update t1, t2 set val= 1 where id1=id2 0.000
# root localhost test Query # init show processlist 0.000
# root localhost test Sleep # NULL 0.000
unlock tables; unlock tables;
drop procedure bug9486; drop procedure bug9486;
drop table t1, t2; drop table t1, t2;

View File

@ -0,0 +1,7 @@
SET @@net_read_timeout=1;
SELECT 1;
1
1
SELECT 1;
1
1

View File

@ -439,6 +439,41 @@ select 1 from t1 as t1_0 inner join t1 as t2 on (t1_0.a <=> now()) join t1 on 1;
1 1
drop table t1; drop table t1;
# #
# MDEV-9521 Least function returns 0000-00-00 for null date columns instead of null
#
CREATE TABLE t1 (
id BIGINT NOT NULL,
date_debut DATE NOT NULL,
date_fin DATE DEFAULT NULL);
CREATE TABLE t2(
id BIGINT NOT NULL,
date_debut DATE NOT NULL,
date_fin DATE DEFAULT NULL);
INSERT INTO t1 VALUES (1,'2016-01-01','2016-01-31');
INSERT INTO t1 VALUES (2,'2016-02-01',null);
INSERT INTO t1 VALUES (3,'2016-03-01','2016-03-31');
INSERT INTO t1 VALUES (4,'2016-04-01',null);
INSERT INTO t2 VALUES (1,'2016-01-01','2016-01-31');
INSERT INTO t2 VALUES (2,'2016-02-01','2016-01-28');
INSERT INTO t2 VALUES (3,'2016-03-01',null);
INSERT INTO t2 VALUES (4,'2016-04-01',null);
SELECT t1.id,
GREATEST(t2.date_debut, t1.date_debut) AS date_debut,
LEAST(IFNULL(t2.date_fin, IFNULL(t1.date_fin, NULL)),
IFNULL(t1.date_fin, IFNULL(t2.date_fin, NULL))) AS date_fin
FROM t1 LEFT JOIN t2 ON (t1.id=t2.id);
id date_debut date_fin
1 2016-01-01 2016-01-31 00:00:00
2 2016-02-01 2016-01-28 00:00:00
3 2016-03-01 2016-03-31 00:00:00
4 2016-04-01 NULL
DROP TABLE t1,t2;
SELECT
LEAST(COALESCE(DATE(NULL), DATE(NULL)), COALESCE(DATE(NULL), DATE(NULL))) AS d0,
LEAST(IFNULL(DATE(NULL), DATE(NULL)), IFNULL(DATE(NULL), DATE(NULL))) AS d1;
d0 d1
NULL NULL
#
# MDEV-9511 Valgrind warnings 'Invalid read' in Field_newdate::cmp and Field_newdate::val_str # MDEV-9511 Valgrind warnings 'Invalid read' in Field_newdate::cmp and Field_newdate::val_str
# #
CREATE TABLE t1 (f1 DATE, f2 VARCHAR(1)); CREATE TABLE t1 (f1 DATE, f2 VARCHAR(1));

View File

@ -644,6 +644,15 @@ SELECT MAX(dt) = '2011-01-06 12:34:30' FROM t1;
MAX(dt) = '2011-01-06 12:34:30' MAX(dt) = '2011-01-06 12:34:30'
1 1
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-9413 "datetime >= coalesce(c1(NULL))" doesn't return expected NULL
#
CREATE TABLE t1(c1 TIMESTAMP(6) NULL DEFAULT NULL);
INSERT INTO t1 VALUES(NULL);
SELECT c1, '2016-06-13 20:00:00.000003' >= COALESCE( c1 ) FROM t1;
c1 '2016-06-13 20:00:00.000003' >= COALESCE( c1 )
NULL NULL
DROP TABLE t1;
End of 5.5 tests End of 5.5 tests
# #
# MDEV-7254: Assigned expression is evaluated twice when updating column TIMESTAMP NOT NULL # MDEV-7254: Assigned expression is evaluated twice when updating column TIMESTAMP NOT NULL

View File

@ -0,0 +1,3 @@
set global log_warnings=2;
set @@wait_timeout=1;
set global log_warnings=@@log_warnings;

View File

@ -683,7 +683,7 @@ master-bin.000001 # Query # # COMMIT
master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Gtid # # GTID #-#-#
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 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Table_map # # table_id: # (mysql.user) master-bin.000001 # Table_map # # table_id: # (mysql.user)
master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F

View File

@ -70,6 +70,50 @@ Error 1005 Can't create table `test`.`#sql-temporary` (errno: 150 "Foreign key c
Warning 1215 Cannot add foreign key constraint Warning 1215 Cannot add foreign key constraint
drop table t2; drop table t2;
drop table t1; drop table t1;
CREATE DATABASE kg_test1;
CREATE DATABASE kg_test2;
CREATE TABLE `kg_test1`.`group` (
Id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `kg_test1`.`person` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`Id`),
CONSTRAINT `fk_person_group` FOREIGN KEY (`Id`) REFERENCES `group` (`Id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
show create table `kg_test1`.`person`;
Table Create Table
person CREATE TABLE `person` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(50) NOT NULL,
PRIMARY KEY (`Id`),
CONSTRAINT `fk_person_group` FOREIGN KEY (`Id`) REFERENCES `group` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `kg_test2`.`person2` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`Id`),
CONSTRAINT `fk_person_group` FOREIGN KEY (`Id`) REFERENCES `group` (`Id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
ERROR HY000: Can't create table `kg_test2`.`person2` (errno: 150 "Foreign key constraint is incorrectly formed")
CREATE TABLE `kg_test2`.`person2` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`Id`),
CONSTRAINT `fk_person_group` FOREIGN KEY (`Id`) REFERENCES `kg_test1`.`group` (`Id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
show create table `kg_test2`.`person2`;
Table Create Table
person2 CREATE TABLE `person2` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(50) NOT NULL,
PRIMARY KEY (`Id`),
CONSTRAINT `fk_person_group` FOREIGN KEY (`Id`) REFERENCES `kg_test1`.`group` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SHOW WARNINGS;
Level Code Message
DROP DATABASE kg_test2;
DROP DATABASE kg_test1;
CREATE TABLE `#departaments` ( CREATE TABLE `#departaments` (
`id_depart` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_depart` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id_depart`) PRIMARY KEY (`id_depart`)

View File

@ -125,6 +125,47 @@ show warnings;
drop table t2; drop table t2;
drop table t1; drop table t1;
#
# MDEV-9142 :Adding Constraint with no database reference
# results in ERROR 1046 (3D000) at line 13: No database selected
#
CREATE DATABASE kg_test1;
CREATE DATABASE kg_test2;
CREATE TABLE `kg_test1`.`group` (
Id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `kg_test1`.`person` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`Id`),
CONSTRAINT `fk_person_group` FOREIGN KEY (`Id`) REFERENCES `group` (`Id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
show create table `kg_test1`.`person`;
--error 1005
CREATE TABLE `kg_test2`.`person2` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`Id`),
CONSTRAINT `fk_person_group` FOREIGN KEY (`Id`) REFERENCES `group` (`Id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE `kg_test2`.`person2` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`Id`),
CONSTRAINT `fk_person_group` FOREIGN KEY (`Id`) REFERENCES `kg_test1`.`group` (`Id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
show create table `kg_test2`.`person2`;
SHOW WARNINGS;
DROP DATABASE kg_test2;
DROP DATABASE kg_test1;
# #
# MDEV-7627: Some symbols in table name can cause to Error Code: 1050 when created FK # MDEV-7627: Some symbols in table name can cause to Error Code: 1050 when created FK
# #

View File

@ -153,7 +153,7 @@ slave-bin.000001 # Query # # COMMIT
slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Gtid # # GTID #-#-#
slave-bin.000001 # Query # # use `test`; CREATE TABLE `t4` ( slave-bin.000001 # Query # # use `test`; CREATE TABLE `t4` (
`a` int(11) DEFAULT NULL `a` int(11) DEFAULT NULL
) ) ENGINE=MyISAM
slave-bin.000001 # Gtid # # BEGIN GTID #-#-# slave-bin.000001 # Gtid # # BEGIN GTID #-#-#
slave-bin.000001 # Query # # use `test`; CREATE TABLE `t5` ( slave-bin.000001 # Query # # use `test`; CREATE TABLE `t5` (
`a` int(11) DEFAULT NULL `a` int(11) DEFAULT NULL

View File

@ -39,7 +39,7 @@ master-bin.000001 # Query # # use `test`; CREATE OR REPLACE table t1 like t2
master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE `t1` ( master-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE `t1` (
`a_in_temporary` int(11) DEFAULT NULL `a_in_temporary` int(11) DEFAULT NULL
) ) ENGINE=MyISAM
master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
binlog from server 2 binlog from server 2
@ -72,7 +72,7 @@ slave-bin.000001 # Query # # use `test`; CREATE OR REPLACE table t1 like t2
slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Gtid # # GTID #-#-#
slave-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE `t1` ( slave-bin.000001 # Query # # use `test`; CREATE OR REPLACE TABLE `t1` (
`a_in_temporary` int(11) DEFAULT NULL `a_in_temporary` int(11) DEFAULT NULL
) ) ENGINE=MyISAM
slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Gtid # # GTID #-#-#
slave-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `t1` /* generated by server */ slave-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `t1` /* generated by server */
# #
@ -175,7 +175,7 @@ slave-bin.000001 # Query # # COMMIT
slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Gtid # # GTID #-#-#
slave-bin.000001 # Query # # use `test`; CREATE TABLE `t4` ( slave-bin.000001 # Query # # use `test`; CREATE TABLE `t4` (
`a` int(11) DEFAULT NULL `a` int(11) DEFAULT NULL
) ) ENGINE=MyISAM
slave-bin.000001 # Gtid # # BEGIN GTID #-#-# slave-bin.000001 # Gtid # # BEGIN GTID #-#-#
slave-bin.000001 # Query # # use `test`; CREATE TABLE `t5` ( slave-bin.000001 # Query # # use `test`; CREATE TABLE `t5` (
`a` int(11) DEFAULT NULL `a` int(11) DEFAULT NULL

View File

@ -153,7 +153,7 @@ slave-bin.000001 # Query # # COMMIT
slave-bin.000001 # Gtid # # GTID #-#-# slave-bin.000001 # Gtid # # GTID #-#-#
slave-bin.000001 # Query # # use `test`; CREATE TABLE `t4` ( slave-bin.000001 # Query # # use `test`; CREATE TABLE `t4` (
`a` int(11) DEFAULT NULL `a` int(11) DEFAULT NULL
) ) ENGINE=MyISAM
slave-bin.000001 # Gtid # # BEGIN GTID #-#-# slave-bin.000001 # Gtid # # BEGIN GTID #-#-#
slave-bin.000001 # Query # # use `test`; CREATE TABLE `t5` ( slave-bin.000001 # Query # # use `test`; CREATE TABLE `t5` (
`a` int(11) DEFAULT NULL `a` int(11) DEFAULT NULL

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

@ -194,7 +194,7 @@ master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; CREATE TABLE `t9` ( master-bin.000001 # Query # # use `test`; CREATE TABLE `t9` (
`a` int(11) DEFAULT NULL, `a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL `b` int(11) DEFAULT NULL
) ) ENGINE=MyISAM
**** On Slave **** **** On Slave ****
SHOW CREATE TABLE t8; SHOW CREATE TABLE t8;
Table t8 Table t8
@ -207,7 +207,7 @@ Table t9
Create Table CREATE TABLE `t9` ( Create Table CREATE TABLE `t9` (
`a` int(11) DEFAULT NULL, `a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL `b` int(11) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8,t9; DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8,t9;
STOP SLAVE; STOP SLAVE;
include/wait_for_slave_to_stop.inc include/wait_for_slave_to_stop.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

@ -409,3 +409,8 @@ SELECT * FROM t1 WHERE a=0.9;
SELECT * FROM t1 WHERE a IN (0.8,0.9); SELECT * FROM t1 WHERE a IN (0.8,0.9);
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-9372 select 100 between 1 and 9223372036854775808 returns false
--echo #
SELECT 100 BETWEEN 1 AND 9223372036854775808;

View File

@ -7,5 +7,16 @@ create table t1 (a date);
insert t1 values ('2000-01-02'), ('2001-02-03'), ('2002-03-04'); insert t1 values ('2000-01-02'), ('2001-02-03'), ('2002-03-04');
set debug_dbug='d,str_to_datetime_warn'; set debug_dbug='d,str_to_datetime_warn';
select * from t1 where a > date_add('2000-01-01', interval 5 day); select * from t1 where a > date_add('2000-01-01', interval 5 day);
set debug_dbug='';
drop table t1;
#
# MDEV-9707 MAX(timestamp(6) column) in correlated sub-query returns non-existent row data in original table
#
create table t1 (id int not null, ut timestamp(6) not null);
insert into t1 values(1, '2001-01-01 00:00:00.2');
insert into t1 values(1, '2001-01-01 00:00:00.1');
select * from t1;
select (select max(m2.ut) from t1 m2 where m1.id <> 0) from t1 m1;
drop table t1; drop table t1;

View File

@ -193,3 +193,12 @@ insert t1 values ('00:00:00'),('00:01:00');
select case t1.f1 when '00:00:00' then 1 end from t1; select case t1.f1 when '00:00:00' then 1 end from t1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-9745 Crash with CASE WHEN TRUE THEN COALESCE(CAST(NULL AS UNSIGNED)) ELSE 4 END
--echo #
CREATE TABLE t1 SELECT CASE WHEN TRUE THEN COALESCE(CAST(NULL AS UNSIGNED)) ELSE 4 END AS a;
DESCRIBE t1;
DROP TABLE t1;
CREATE TABLE t1 SELECT CASE WHEN TRUE THEN COALESCE(CAST(NULL AS UNSIGNED)) ELSE 40 END AS a;
DESCRIBE t1;
DROP TABLE t1;

View File

@ -0,0 +1,16 @@
--echo #
--echo # Start of 5.5 tests
--echo #
--echo #
--echo # MDEV-9862 Illegal mix of collation, when comparing column with CASE expression
--echo #
SET NAMES cp850;
CREATE TABLE t1 (a CHAR(1) CHARACTER SET latin1);
SELECT a FROM t1 WHERE CASE a WHEN 'aaaa' THEN 'Y' WHEN 'aaaa' THEN 'Y' ELSE NULL END <> a;
DROP TABLE t1;
--echo #
--echo # End of 5.5 tests
--echo #

View File

@ -67,10 +67,10 @@ select /*2*/ user, host, db, command, state, info
select release_lock("test_lock2"); select release_lock("test_lock2");
drop event закачка; drop event закачка;
# Wait for release_lock("test_lock2") to complete, # Wait for get_lock("test_lock2") to complete,
# to avoid polluting the next test information_schema.processlist # to avoid polluting the next test information_schema.processlist
let $wait_condition= select count(*) = 0 from information_schema.processlist let $wait_condition= select count(*) = 0 from information_schema.processlist
where (state like 'User lock%' AND info like 'select get_lock%'); where info='select get_lock("test_lock2", 20)';
--source include/wait_condition.inc --source include/wait_condition.inc

View File

@ -32,3 +32,18 @@ INSERT INTO t1 VALUES(0xA3C2);
DROP TABLE t1; DROP TABLE t1;
# End of 5.1 tests # End of 5.1 tests
#
# MDEV-9986 Full-text search of the utf8mb4 column causes crash
#
create table t1 (
id varchar(255),
business_name text null collate utf8mb4_unicode_ci,
street_address text,
fulltext index ft (business_name),
fulltext index ft2 (street_address)
);
--error ER_FT_MATCHING_KEY_NOT_FOUND
select * from t1 where match (business_name, street_address) against ('some business name and address here');
select * from t1 where match (business_name, street_address) against ('some business name and address here' in boolean mode);
drop table t1;

View File

@ -484,6 +484,14 @@ SELECT -a FROM t1;
--error ER_DATA_OUT_OF_RANGE --error ER_DATA_OUT_OF_RANGE
SELECT -b FROM t1; SELECT -b FROM t1;
# try with two rows now
INSERT INTO t1 VALUES(0,0);
--error ER_DATA_OUT_OF_RANGE
SELECT -a FROM t1;
--error ER_DATA_OUT_OF_RANGE
SELECT -b FROM t1;
DROP TABLE t1; DROP TABLE t1;
# Decimal overflows # Decimal overflows

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 @@
# #
# 6619 SHOW PROCESSLIST returns empty result set after KILL QUERY # MDEV-6619 SHOW PROCESSLIST returns empty result set after KILL QUERY
# #
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/have_debug_sync.inc --source include/have_debug_sync.inc

View File

@ -55,6 +55,14 @@ SELECT DATE_FORMAT('2001-01-06', '%w %a %W');
SELECT DATE_FORMAT('2001-01-07', '%w %a %W'); SELECT DATE_FORMAT('2001-01-07', '%w %a %W');
--echo End of 5.4 tests --echo End of 5.4 tests
#
# MDEV-9928 LC_TIME_NAMES=de_AT; unusual name for february
#
SET NAMES utf8;
SET lc_time_names=de_AT;
SELECT monthname('2001-01-01');
SELECT monthname('2001-02-01');
SELECT monthname('2001-03-01');
--echo # --echo #
--echo # Start of 5.6 tests --echo # Start of 5.6 tests

View File

@ -1 +0,0 @@
--debug

View File

@ -1,10 +1,10 @@
#
# MDEV-6830 Server crashes in best_access_path after a sequence of SELECTs invollving a temptable view
#
--source include/have_debug.inc --source include/have_debug.inc
--disable_warnings set @@debug_dbug= 'd,opt';
drop table if exists t1,t2,t3;
drop view if exists v2,v3;
--enable_warnings
CREATE TABLE t1 (pk INT PRIMARY KEY) ENGINE=MyISAM; CREATE TABLE t1 (pk INT PRIMARY KEY) ENGINE=MyISAM;
CREATE TABLE t2 ( CREATE TABLE t2 (

View File

@ -125,12 +125,8 @@ SEND;
UPDATE `t``\""e` SET a = 12 WHERE a = 0; UPDATE `t``\""e` SET a = 12 WHERE a = 0;
--echo # default connection --echo # default connection
connection default; connection default;
let $wait_timeout= 2; let $wait_condition= SELECT COUNT(*)=2 FROM INFORMATION_SCHEMA.INNODB_LOCKS;
let $wait_condition= SELECT 1 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE ID = $id_1 AND STATE = 'Searching rows for update';
--source include/wait_condition.inc --source include/wait_condition.inc
#--echo # tested wait condition $wait_condition_reps times
# INNODB_LOCKS only exists in innodb_plugin
--sorted_result --sorted_result
SELECT lock_table, COUNT(*) FROM INFORMATION_SCHEMA.INNODB_LOCKS SELECT lock_table, COUNT(*) FROM INFORMATION_SCHEMA.INNODB_LOCKS
GROUP BY lock_table; GROUP BY lock_table;

View File

@ -10,7 +10,7 @@ create table t2 (a int);
insert into t2 values (2), (3); insert into t2 values (2), (3);
set session join_cache_level=3; set session join_cache_level=3;
set @@debug_dbug= 'd:t:O,/tmp/trace.out'; set @@debug_dbug= 'd,opt';
explain select t1.b from t1,t2 where t1.b=t2.a; explain select t1.b from t1,t2 where t1.b=t2.a;
select t1.b from t1,t2 where t1.b=t2.a; select t1.b from t1,t2 where t1.b=t2.a;

View File

@ -0,0 +1,128 @@
#
# MDEV-9835 Valid password is not working after server restart.
#
# Various combinations of SET PASSWORD and not-empty mysql.user.plugin field
#
--source include/not_embedded.inc
--enable_connect_log
# The hash (old and new) is for 'test'
create user natauth@localhost identified via 'mysql_native_password' using '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user newpass@localhost identified by password '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user newpassnat@localhost identified via 'mysql_native_password';
set password for newpassnat@localhost = '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29';
create user oldauth@localhost identified with 'mysql_old_password' using '378b243e220ca493';
create user oldpass@localhost identified by password '378b243e220ca493';
create user oldpassold@localhost identified with 'mysql_old_password';
set password for oldpassold@localhost = '378b243e220ca493';
--sorted_result
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
--connect(con,localhost,natauth,test,)
select current_user();
--disconnect con
--connect(con,localhost,newpass,test,)
select current_user();
--disconnect con
--connect(con,localhost,newpassnat,test,)
select current_user();
--disconnect con
--connect(con,localhost,oldauth,test,)
select current_user();
--disconnect con
--connect(con,localhost,oldpass,test,)
select current_user();
--disconnect con
--connect(con,localhost,oldpassold,test,)
select current_user();
--disconnect con
--connection default
flush privileges;
--connect(con,localhost,natauth,test,)
select current_user();
--disconnect con
--connect(con,localhost,newpass,test,)
select current_user();
--disconnect con
--connect(con,localhost,newpassnat,test,)
select current_user();
--disconnect con
--connect(con,localhost,oldauth,test,)
select current_user();
--disconnect con
--connect(con,localhost,oldpass,test,)
select current_user();
--disconnect con
--connect(con,localhost,oldpassold,test,)
select current_user();
--disconnect con
--connection default
# changing to the NEW password hash
set password for natauth@localhost = PASSWORD('test2');
set password for newpass@localhost = PASSWORD('test2');
set password for newpassnat@localhost = PASSWORD('test2');
set password for oldauth@localhost = PASSWORD('test2');
set password for oldpass@localhost = PASSWORD('test2');
set password for oldpassold@localhost = PASSWORD('test2');
--sorted_result
select user, host, password, plugin, authentication_string from mysql.user where user != 'root';
--connect(con,localhost,natauth,test2,)
select current_user();
--disconnect con
--connect(con,localhost,newpass,test2,)
select current_user();
--disconnect con
--connect(con,localhost,newpassnat,test2,)
select current_user();
--disconnect con
--connect(con,localhost,oldauth,test2,)
select current_user();
--disconnect con
--connect(con,localhost,oldpass,test2,)
select current_user();
--disconnect con
--connect(con,localhost,oldpassold,test2,)
select current_user();
--disconnect con
--connection default
flush privileges;
--connect(con,localhost,natauth,test2,)
select current_user();
--disconnect con
--connect(con,localhost,newpass,test2,)
select current_user();
--disconnect con
--connect(con,localhost,newpassnat,test2,)
select current_user();
--disconnect con
--connect(con,localhost,oldauth,test2,)
select current_user();
--disconnect con
--connect(con,localhost,oldpass,test2,)
select current_user();
--disconnect con
--connect(con,localhost,oldpassold,test2,)
select current_user();
--disconnect con
--connection default
drop user natauth@localhost, newpass@localhost, newpassnat@localhost;
drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost;

View File

@ -77,12 +77,15 @@ call bug9486();
connection con2root; connection con2root;
lock tables t2 write; lock tables t2 write;
connection con1root; connection con1root;
let $con1root_id=`SELECT CONNECTION_ID()`;
send call bug9486(); send call bug9486();
connection con2root; connection con2root;
--sleep 2
# There should be call statement in locked state. # There should be call statement in locked state.
--replace_column 1 # 3 localhost 6 # let $wait_condition=SELECT COUNT(*)=1 FROM information_schema.processlist WHERE
show processlist; id=$con1root_id AND state='Waiting for table metadata lock';
--source include/wait_condition.inc
--replace_result $con1root_id con1root_id
eval SELECT state,info FROM information_schema.processlist WHERE id=$con1root_id;
unlock tables; unlock tables;
connection con1root; connection con1root;
reap; reap;

View File

@ -0,0 +1 @@
--loose-thread-handling=pool-of-threads

View File

@ -0,0 +1,11 @@
#
# MDEV-9836 Connection lost when using SSL
#
-- source include/have_ssl_communication.inc
connect(con1,localhost,root,,,,,SSL);
SET @@net_read_timeout=1;
SELECT 1;
# MDEV-9836 - YASSL bug - SSL connection lost if it has been idle, for longer than net_read_timeout
-- sleep 2
SELECT 1;
disconnect con1;

View File

@ -385,6 +385,36 @@ select 1 from t1 as t1_0 inner join t1 as t2 on (t1_0.a <=> now()) join t1 on 1;
select 1 from t1 as t1_0 inner join t1 as t2 on (t1_0.a <=> now()) join t1 on 1; select 1 from t1 as t1_0 inner join t1 as t2 on (t1_0.a <=> now()) join t1 on 1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-9521 Least function returns 0000-00-00 for null date columns instead of null
--echo #
CREATE TABLE t1 (
id BIGINT NOT NULL,
date_debut DATE NOT NULL,
date_fin DATE DEFAULT NULL);
CREATE TABLE t2(
id BIGINT NOT NULL,
date_debut DATE NOT NULL,
date_fin DATE DEFAULT NULL);
INSERT INTO t1 VALUES (1,'2016-01-01','2016-01-31');
INSERT INTO t1 VALUES (2,'2016-02-01',null);
INSERT INTO t1 VALUES (3,'2016-03-01','2016-03-31');
INSERT INTO t1 VALUES (4,'2016-04-01',null);
INSERT INTO t2 VALUES (1,'2016-01-01','2016-01-31');
INSERT INTO t2 VALUES (2,'2016-02-01','2016-01-28');
INSERT INTO t2 VALUES (3,'2016-03-01',null);
INSERT INTO t2 VALUES (4,'2016-04-01',null);
SELECT t1.id,
GREATEST(t2.date_debut, t1.date_debut) AS date_debut,
LEAST(IFNULL(t2.date_fin, IFNULL(t1.date_fin, NULL)),
IFNULL(t1.date_fin, IFNULL(t2.date_fin, NULL))) AS date_fin
FROM t1 LEFT JOIN t2 ON (t1.id=t2.id);
DROP TABLE t1,t2;
SELECT
LEAST(COALESCE(DATE(NULL), DATE(NULL)), COALESCE(DATE(NULL), DATE(NULL))) AS d0,
LEAST(IFNULL(DATE(NULL), DATE(NULL)), IFNULL(DATE(NULL), DATE(NULL))) AS d1;
--echo # --echo #
--echo # MDEV-9511 Valgrind warnings 'Invalid read' in Field_newdate::cmp and Field_newdate::val_str --echo # MDEV-9511 Valgrind warnings 'Invalid read' in Field_newdate::cmp and Field_newdate::val_str
--echo # --echo #

View File

@ -445,6 +445,14 @@ SELECT MAX(ts) = '2011-01-06 12:34:30' FROM t1;
SELECT MAX(dt) = '2011-01-06 12:34:30' FROM t1; SELECT MAX(dt) = '2011-01-06 12:34:30' FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-9413 "datetime >= coalesce(c1(NULL))" doesn't return expected NULL
--echo #
CREATE TABLE t1(c1 TIMESTAMP(6) NULL DEFAULT NULL);
INSERT INTO t1 VALUES(NULL);
SELECT c1, '2016-06-13 20:00:00.000003' >= COALESCE( c1 ) FROM t1;
DROP TABLE t1;
--echo End of 5.5 tests --echo End of 5.5 tests
--echo # --echo #

View File

@ -0,0 +1,16 @@
source include/not_embedded.inc;
source include/not_windows.inc;
#
# MDEV-7775 Wrong error message (Unknown error) when idle sessions are killed after wait_timeout
#
set global log_warnings=2;
connect (foo,localhost,root);
set @@wait_timeout=1;
sleep 2;
connection default;
let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_RANGE= -50;
let SEARCH_PATTERN= Aborted.*Got timeout reading communication packets;
source include/search_pattern_in_file.inc;
set global log_warnings=@@log_warnings;

View File

@ -18,7 +18,6 @@
#include "mysys_err.h" #include "mysys_err.h"
#include <my_dir.h> /* for stat */ #include <my_dir.h> /* for stat */
#include <m_string.h> #include <m_string.h>
#include "mysys_err.h"
#if defined(HAVE_UTIME_H) #if defined(HAVE_UTIME_H)
#include <utime.h> #include <utime.h>
#elif defined(HAVE_SYS_UTIME_H) #elif defined(HAVE_SYS_UTIME_H)

View File

@ -310,6 +310,7 @@ void print_find_structs()
add_structs_to_map(root_by_len,max_len); add_structs_to_map(root_by_len,max_len);
set_links(root_by_len,max_len); set_links(root_by_len,max_len);
print_hash_map("sql_functions_map"); print_hash_map("sql_functions_map");
free(hash_map);
hash_map= 0; hash_map= 0;
size_hash_map= 0; size_hash_map= 0;
@ -319,6 +320,7 @@ void print_find_structs()
add_structs_to_map(root_by_len2,max_len2); add_structs_to_map(root_by_len2,max_len2);
set_links(root_by_len2,max_len2); set_links(root_by_len2,max_len2);
print_hash_map("symbols_map"); print_hash_map("symbols_map");
free(hash_map);
} }

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

View File

@ -1,8 +1,8 @@
#ifndef HANDLER_INCLUDED #ifndef HANDLER_INCLUDED
#define HANDLER_INCLUDED #define HANDLER_INCLUDED
/* /*
Copyright (c) 2000, 2014, Oracle and/or its affiliates. Copyright (c) 2000, 2016, 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 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
@ -419,7 +419,9 @@ static const uint MYSQL_START_TRANS_OPT_READ_WRITE = 4;
/* 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)
#define HA_CHECK_ALL (~0U)
enum legacy_db_type enum legacy_db_type
{ {
@ -2822,7 +2824,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;
} }
@ -4153,4 +4158,4 @@ inline const char *table_case_name(HA_CREATE_INFO *info, const char *name)
void print_keydup_error(TABLE *table, KEY *key, const char *msg, myf errflag); void print_keydup_error(TABLE *table, KEY *key, const char *msg, myf errflag);
void print_keydup_error(TABLE *table, KEY *key, myf errflag); void print_keydup_error(TABLE *table, KEY *key, myf errflag);
#endif #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
@ -1306,8 +1306,8 @@ Item *Item_param::safe_charset_converter(CHARSET_INFO *tocs)
to it's possible that the converter will not be needed at all: to it's possible that the converter will not be needed at all:
PREPARE stmt FROM 'SELECT * FROM t1 WHERE field = ?'; PREPARE stmt FROM 'SELECT * FROM t1 WHERE field = ?';
SET @@arg= 1; SET @arg= 1;
EXECUTE stms USING @arg; EXECUTE stmt USING @arg;
In the above example result_type is STRING_RESULT at prepare time, In the above example result_type is STRING_RESULT at prepare time,
and INT_RESULT at execution time. and INT_RESULT at execution time.
@ -3835,7 +3835,7 @@ Item_param::eq(const Item *item, 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('?');
} }
@ -6734,7 +6734,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

@ -2363,7 +2363,7 @@ public:
max_length= 0; max_length= 0;
name= name_par ? name_par : (char*) "NULL"; name= name_par ? name_par : (char*) "NULL";
fixed= 1; fixed= 1;
collation.set(cs, DERIVATION_IGNORABLE); collation.set(cs, DERIVATION_IGNORABLE, MY_REPERTOIRE_ASCII);
} }
enum Type type() const { return NULL_ITEM; } enum Type type() const { return NULL_ITEM; }
bool eq(const Item *item, bool binary_cmp) const { return null_eq(item); } bool eq(const Item *item, bool binary_cmp) const { return null_eq(item); }

View File

@ -161,10 +161,11 @@ static int cmp_row_type(Item* item1, Item* item2)
static int agg_cmp_type(Item_result *type, Item **items, uint nitems) static int agg_cmp_type(Item_result *type, Item **items, uint nitems)
{ {
uint i; uint unsigned_count= items[0]->unsigned_flag;
type[0]= items[0]->cmp_type(); type[0]= items[0]->cmp_type();
for (i= 1 ; i < nitems ; i++) for (uint i= 1 ; i < nitems ; i++)
{ {
unsigned_count+= items[i]->unsigned_flag;
type[0]= item_cmp_type(type[0], items[i]->cmp_type()); type[0]= item_cmp_type(type[0], items[i]->cmp_type());
/* /*
When aggregating types of two row expressions we have to check When aggregating types of two row expressions we have to check
@ -176,6 +177,12 @@ static int agg_cmp_type(Item_result *type, Item **items, uint nitems)
if (type[0] == ROW_RESULT && cmp_row_type(items[0], items[i])) if (type[0] == ROW_RESULT && cmp_row_type(items[0], items[i]))
return 1; // error found: invalid usage of rows return 1; // error found: invalid usage of rows
} }
/**
If all arguments are of INT type but have different unsigned_flag values,
switch to DECIMAL_RESULT.
*/
if (type[0] == INT_RESULT && unsigned_count != nitems && unsigned_count != 0)
type[0]= DECIMAL_RESULT;
return 0; return 0;
} }
@ -2621,10 +2628,7 @@ bool Item_func_ifnull::date_op(MYSQL_TIME *ltime, uint fuzzydate)
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
if (!args[0]->get_date_with_conversion(ltime, fuzzydate & ~TIME_FUZZY_DATES)) if (!args[0]->get_date_with_conversion(ltime, fuzzydate & ~TIME_FUZZY_DATES))
return (null_value= false); return (null_value= false);
if (!args[1]->get_date_with_conversion(ltime, fuzzydate & ~TIME_FUZZY_DATES)) return (null_value= args[1]->get_date_with_conversion(ltime, fuzzydate & ~TIME_FUZZY_DATES));
return (null_value= false);
bzero((char*) ltime,sizeof(*ltime));
return null_value= !(fuzzydate & TIME_FUZZY_DATES);
} }
@ -3081,24 +3085,6 @@ bool Item_func_case::fix_fields(THD *thd, Item **ref)
} }
void Item_func_case::agg_str_lengths(Item* arg)
{
fix_char_length(MY_MAX(max_char_length(), arg->max_char_length()));
set_if_bigger(decimals, arg->decimals);
unsigned_flag= unsigned_flag && arg->unsigned_flag;
}
void Item_func_case::agg_num_lengths(Item *arg)
{
uint len= my_decimal_length_to_precision(arg->max_length, arg->decimals,
arg->unsigned_flag) - arg->decimals;
set_if_bigger(max_length, len);
set_if_bigger(decimals, arg->decimals);
unsigned_flag= unsigned_flag && arg->unsigned_flag;
}
/** /**
Check if (*place) and new_value points to different Items and call Check if (*place) and new_value points to different Items and call
THD::change_item_tree() if needed. THD::change_item_tree() if needed.
@ -3164,17 +3150,7 @@ void Item_func_case::fix_length_and_dec()
} }
else else
{ {
collation.set_numeric(); fix_attributes(agg, nagg);
max_length=0;
decimals=0;
unsigned_flag= TRUE;
for (uint i= 0; i < ncases; i+= 2)
agg_num_lengths(args[i + 1]);
if (else_expr_num != -1)
agg_num_lengths(args[else_expr_num]);
max_length= my_decimal_precision_to_length_no_truncation(max_length +
decimals, decimals,
unsigned_flag);
} }
/* /*
@ -3374,16 +3350,12 @@ double Item_func_coalesce::real_op()
bool Item_func_coalesce::date_op(MYSQL_TIME *ltime,uint fuzzydate) bool Item_func_coalesce::date_op(MYSQL_TIME *ltime,uint fuzzydate)
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
null_value= 0;
for (uint i= 0; i < arg_count; i++) for (uint i= 0; i < arg_count; i++)
{ {
bool res= args[i]->get_date_with_conversion(ltime, if (!args[i]->get_date_with_conversion(ltime, fuzzydate & ~TIME_FUZZY_DATES))
fuzzydate & ~TIME_FUZZY_DATES); return (null_value= false);
if (!args[i]->null_value)
return res;
} }
bzero((char*) ltime,sizeof(*ltime)); return (null_value= true);
return null_value|= !(fuzzydate & TIME_FUZZY_DATES);
} }
@ -3406,19 +3378,32 @@ void Item_func_coalesce::fix_length_and_dec()
{ {
cached_field_type= agg_field_type(args, arg_count); cached_field_type= agg_field_type(args, arg_count);
agg_result_type(&cached_result_type, args, arg_count); agg_result_type(&cached_result_type, args, arg_count);
fix_attributes(args, arg_count);
}
#if MYSQL_VERSION_ID > 100100
#error Rename this to Item_hybrid_func::fix_attributes() when mering to 10.1
#endif
void Item_func_hybrid_result_type::fix_attributes(Item **items, uint nitems)
{
switch (cached_result_type) { switch (cached_result_type) {
case STRING_RESULT: case STRING_RESULT:
if (count_string_result_length(cached_field_type, args, arg_count)) if (count_string_result_length(field_type(),
items, nitems))
return; return;
break; break;
case DECIMAL_RESULT: case DECIMAL_RESULT:
count_decimal_length(); collation.set_numeric();
count_decimal_length(items, nitems);
break; break;
case REAL_RESULT: case REAL_RESULT:
count_real_length(); collation.set_numeric();
count_real_length(items, nitems);
break; break;
case INT_RESULT: case INT_RESULT:
count_only_length(args, arg_count); collation.set_numeric();
count_only_length(items, nitems);
decimals= 0; decimals= 0;
break; break;
case ROW_RESULT: case ROW_RESULT:

View File

@ -1274,8 +1274,6 @@ public:
Item *find_item(String *str); Item *find_item(String *str);
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
void cleanup(); void cleanup();
void agg_str_lengths(Item *arg);
void agg_num_lengths(Item *arg);
}; };
/* /*

View File

@ -639,16 +639,16 @@ void Item_func::count_datetime_length(Item **item, uint nitems)
result length/precision depends on argument ones. result length/precision depends on argument ones.
*/ */
void Item_func::count_decimal_length() void Item_func::count_decimal_length(Item **item, uint nitems)
{ {
int max_int_part= 0; int max_int_part= 0;
decimals= 0; decimals= 0;
unsigned_flag= 1; unsigned_flag= 1;
for (uint i=0 ; i < arg_count ; i++) for (uint i=0 ; i < nitems ; i++)
{ {
set_if_bigger(decimals, args[i]->decimals); set_if_bigger(decimals, item[i]->decimals);
set_if_bigger(max_int_part, args[i]->decimal_int_part()); set_if_bigger(max_int_part, item[i]->decimal_int_part());
set_if_smaller(unsigned_flag, args[i]->unsigned_flag); set_if_smaller(unsigned_flag, item[i]->unsigned_flag);
} }
int precision= MY_MIN(max_int_part + decimals, DECIMAL_MAX_PRECISION); int precision= MY_MIN(max_int_part + decimals, DECIMAL_MAX_PRECISION);
fix_char_length(my_decimal_precision_to_length_no_truncation(precision, fix_char_length(my_decimal_precision_to_length_no_truncation(precision,
@ -679,19 +679,19 @@ void Item_func::count_only_length(Item **item, uint nitems)
result length/precision depends on argument ones. result length/precision depends on argument ones.
*/ */
void Item_func::count_real_length() void Item_func::count_real_length(Item **item, uint nitems)
{ {
uint32 length= 0; uint32 length= 0;
decimals= 0; decimals= 0;
max_length= 0; max_length= 0;
for (uint i=0 ; i < arg_count ; i++) for (uint i=0 ; i < nitems ; i++)
{ {
if (decimals != NOT_FIXED_DEC) if (decimals != NOT_FIXED_DEC)
{ {
set_if_bigger(decimals, args[i]->decimals); set_if_bigger(decimals, item[i]->decimals);
set_if_bigger(length, (args[i]->max_length - args[i]->decimals)); set_if_bigger(length, (item[i]->max_length - item[i]->decimals));
} }
set_if_bigger(max_length, args[i]->max_length); set_if_bigger(max_length, item[i]->max_length);
} }
if (decimals != NOT_FIXED_DEC) if (decimals != NOT_FIXED_DEC)
{ {
@ -809,7 +809,7 @@ void Item_num_op::fix_length_and_dec(void)
if (r0 == REAL_RESULT || r1 == REAL_RESULT || if (r0 == REAL_RESULT || r1 == REAL_RESULT ||
r0 == STRING_RESULT || r1 ==STRING_RESULT) r0 == STRING_RESULT || r1 ==STRING_RESULT)
{ {
count_real_length(); count_real_length(args, arg_count);
max_length= float_length(decimals); max_length= float_length(decimals);
cached_result_type= REAL_RESULT; cached_result_type= REAL_RESULT;
} }
@ -6305,6 +6305,8 @@ bool Item_func_match::fix_index()
for (i=1; i < arg_count; i++) for (i=1; i < arg_count; i++)
{ {
if (args[i]->type() != FIELD_ITEM)
goto err;
item=(Item_field*)args[i]; item=(Item_field*)args[i];
for (keynr=0 ; keynr < fts ; keynr++) for (keynr=0 ; keynr < fts ; keynr++)
{ {

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
@ -40,6 +40,13 @@ protected:
*/ */
uint allowed_arg_cols; uint allowed_arg_cols;
String *val_str_from_val_str_ascii(String *str, String *str2); String *val_str_from_val_str_ascii(String *str, String *str2);
void count_only_length(Item **item, uint nitems);
void count_real_length(Item **item, uint nitems);
void count_decimal_length(Item **item, uint nitems);
void count_datetime_length(Item **item, uint nitems);
bool count_string_result_length(enum_field_types field_type,
Item **item, uint nitems);
public: public:
uint arg_count; uint arg_count;
/* /*
@ -154,16 +161,10 @@ public:
virtual void print(String *str, enum_query_type query_type); virtual void print(String *str, enum_query_type query_type);
void print_op(String *str, enum_query_type query_type); void print_op(String *str, enum_query_type query_type);
void print_args(String *str, uint from, enum_query_type query_type); void print_args(String *str, uint from, enum_query_type query_type);
void count_only_length(Item **item, uint nitems);
void count_real_length();
void count_decimal_length();
inline bool get_arg0_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) inline bool get_arg0_date(MYSQL_TIME *ltime, ulonglong fuzzy_date)
{ {
return (null_value=args[0]->get_date_with_conversion(ltime, fuzzy_date)); return (null_value=args[0]->get_date_with_conversion(ltime, fuzzy_date));
} }
void count_datetime_length(Item **item, uint nitems);
bool count_string_result_length(enum_field_types field_type,
Item **item, uint nitems);
inline bool get_arg0_time(MYSQL_TIME *ltime) inline bool get_arg0_time(MYSQL_TIME *ltime)
{ {
null_value= args[0]->get_time(ltime); null_value= args[0]->get_time(ltime);
@ -253,7 +254,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()
@ -444,7 +445,7 @@ class Item_func_hybrid_result_type: public Item_func
} }
protected: protected:
Item_result cached_result_type; Item_result cached_result_type;
void fix_attributes(Item **item, uint nitems);
public: public:
Item_func_hybrid_result_type() :Item_func(), cached_result_type(REAL_RESULT) Item_func_hybrid_result_type() :Item_func(), cached_result_type(REAL_RESULT)
{ collation.set_numeric(); } { collation.set_numeric(); }

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

@ -281,7 +281,7 @@ const char *show_comp_option_name[]= {"YES", "NO", "DISABLED"};
static const char *tc_heuristic_recover_names[]= static const char *tc_heuristic_recover_names[]=
{ {
"COMMIT", "ROLLBACK", NullS "OFF", "COMMIT", "ROLLBACK", NullS
}; };
static TYPELIB tc_heuristic_recover_typelib= static TYPELIB tc_heuristic_recover_typelib=
{ {
@ -8660,6 +8660,7 @@ mysqld_get_one_option(int optid,
log_error_file_ptr= const_cast<char*>(""); log_error_file_ptr= const_cast<char*>("");
break; break;
case OPT_IGNORE_DB_DIRECTORY: case OPT_IGNORE_DB_DIRECTORY:
opt_ignore_db_dirs= NULL; // will be set in ignore_db_dirs_process_additions
if (*argument == 0) if (*argument == 0)
ignore_db_dirs_reset(); ignore_db_dirs_reset();
else else

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
@ -623,7 +623,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
@ -742,9 +742,8 @@ static ACL_USER *find_user_wild(const char *host, const char *user, const char *
static ACL_ROLE *find_acl_role(const char *user); static ACL_ROLE *find_acl_role(const char *user);
static ROLE_GRANT_PAIR *find_role_grant_pair(const LEX_STRING *u, const LEX_STRING *h, const LEX_STRING *r); static ROLE_GRANT_PAIR *find_role_grant_pair(const LEX_STRING *u, const LEX_STRING *h, const LEX_STRING *r);
static ACL_USER_BASE *find_acl_user_base(const char *user, const char *host); static ACL_USER_BASE *find_acl_user_base(const char *user, const char *host);
static bool update_user_table(THD *thd, TABLE *table, const char *host, static bool update_user_table(THD *, TABLE *, const char *, const char *, const
const char *user, const char *new_password, char *, uint, bool);
uint new_password_len);
static my_bool acl_load(THD *thd, TABLE_LIST *tables); static my_bool acl_load(THD *thd, TABLE_LIST *tables);
static my_bool grant_load(THD *thd, TABLE_LIST *tables); static my_bool grant_load(THD *thd, TABLE_LIST *tables);
static inline void get_grantor(THD *thd, char* grantor); static inline void get_grantor(THD *thd, char* grantor);
@ -1035,7 +1034,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
grant_version++; /* Privileges updated */ grant_version++; /* Privileges updated */
init_sql_alloc(&acl_memroot, ACL_ALLOC_BLOCK_SIZE, 0, MYF(0)); init_sql_alloc(&acl_memroot, ACL_ALLOC_BLOCK_SIZE, 0, MYF(0));
(void) my_init_dynamic_array(&acl_hosts,sizeof(ACL_HOST), 20, 50, MYF(0));
if (tables[0].table) // "host" table may not exist (e.g. in MySQL 5.6.7+) if (tables[0].table) // "host" table may not exist (e.g. in MySQL 5.6.7+)
{ {
if (init_read_record(&read_record_info, thd, table= tables[0].table, if (init_read_record(&read_record_info, thd, table= tables[0].table,
@ -1097,11 +1095,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
NULL, 1, 1, FALSE)) NULL, 1, 1, FALSE))
goto end; goto end;
table->use_all_columns(); table->use_all_columns();
(void) my_init_dynamic_array(&acl_users,sizeof(ACL_USER), 50, 100, MYF(0));
(void) my_hash_init2(&acl_roles,50, &my_charset_utf8_bin,
0, 0, 0, (my_hash_get_key) acl_role_get_key, 0,
(void (*)(void *))free_acl_role, 0);
username_char_length= MY_MIN(table->field[1]->char_length(), username_char_length= MY_MIN(table->field[1]->char_length(),
USERNAME_CHAR_LENGTH); USERNAME_CHAR_LENGTH);
password_length= table->field[2]->field_length / password_length= table->field[2]->field_length /
@ -1361,7 +1354,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
NULL, 1, 1, FALSE)) NULL, 1, 1, FALSE))
goto end; goto end;
table->use_all_columns(); table->use_all_columns();
(void) my_init_dynamic_array(&acl_dbs,sizeof(ACL_DB), 50, 100, MYF(0));
while (!(read_record_info.read_record(&read_record_info))) while (!(read_record_info.read_record(&read_record_info)))
{ {
ACL_DB db; ACL_DB db;
@ -1423,8 +1415,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, MYF(0));
if (tables[3].table) if (tables[3].table)
{ {
if (init_read_record(&read_record_info, thd, table= tables[3].table, if (init_read_record(&read_record_info, thd, table= tables[3].table,
@ -1461,10 +1451,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
NULL, 1, 1, FALSE)) NULL, 1, 1, FALSE))
goto end; goto end;
table->use_all_columns(); table->use_all_columns();
/* account for every role mapping */
(void) my_hash_init2(&acl_roles_mappings, 50, system_charset_info, 0, 0, 0,
(my_hash_get_key) acl_role_map_get_key, 0, 0, 0);
MEM_ROOT temp_root; MEM_ROOT temp_root;
init_alloc_root(&temp_root, ACL_ALLOC_BLOCK_SIZE, 0, MYF(0)); init_alloc_root(&temp_root, ACL_ALLOC_BLOCK_SIZE, 0, MYF(0));
while (!(read_record_info.read_record(&read_record_info))) while (!(read_record_info.read_record(&read_record_info)))
@ -1503,6 +1490,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);
} }
@ -1519,12 +1507,12 @@ void acl_free(bool end)
delete_dynamic(&acl_proxy_users); delete_dynamic(&acl_proxy_users);
my_hash_free(&acl_check_hosts); my_hash_free(&acl_check_hosts);
my_hash_free(&acl_roles_mappings); my_hash_free(&acl_roles_mappings);
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;
} }
@ -1605,6 +1593,15 @@ my_bool acl_reload(THD *thd)
old_acl_roles_mappings= acl_roles_mappings; old_acl_roles_mappings= acl_roles_mappings;
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, MYF(0));
my_init_dynamic_array(&acl_users, sizeof(ACL_USER), 50, 100, MYF(0));
my_init_dynamic_array(&acl_dbs, sizeof(ACL_DB), 50, 100, MYF(0));
my_init_dynamic_array(&acl_proxy_users, sizeof(ACL_PROXY_USER), 50, 100, MYF(0));
my_hash_init2(&acl_roles,50, &my_charset_utf8_bin,
0, 0, 0, (my_hash_get_key) acl_role_get_key, 0,
(void (*)(void *))free_acl_role, 0);
my_hash_init2(&acl_roles_mappings, 50, system_charset_info, 0, 0, 0,
(my_hash_get_key) acl_role_map_get_key, 0, 0, 0);
old_mem= acl_memroot; old_mem= acl_memroot;
delete_dynamic(&acl_wild_hosts); delete_dynamic(&acl_wild_hosts);
my_hash_free(&acl_check_hosts); my_hash_free(&acl_check_hosts);
@ -2611,6 +2608,7 @@ bool change_password(THD *thd, const char *host, const char *user,
enum_binlog_format save_binlog_format; enum_binlog_format save_binlog_format;
uint new_password_len= (uint) strlen(new_password); uint new_password_len= (uint) strlen(new_password);
bool result= 1; bool result= 1;
bool use_salt= 0;
DBUG_ENTER("change_password"); DBUG_ENTER("change_password");
DBUG_PRINT("enter",("host: '%s' user: '%s' new_password: '%s'", DBUG_PRINT("enter",("host: '%s' user: '%s' new_password: '%s'",
host,user,new_password)); host,user,new_password));
@ -2668,6 +2666,7 @@ bool change_password(THD *thd, const char *host, const char *user,
acl_user->auth_string.length= new_password_len; acl_user->auth_string.length= new_password_len;
set_user_salt(acl_user, new_password, new_password_len); set_user_salt(acl_user, new_password, new_password_len);
set_user_plugin(acl_user, new_password_len); set_user_plugin(acl_user, new_password_len);
use_salt= 1;
} }
else else
push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, push_warning(thd, Sql_condition::WARN_LEVEL_NOTE,
@ -2676,7 +2675,7 @@ bool change_password(THD *thd, const char *host, const char *user,
if (update_user_table(thd, table, if (update_user_table(thd, table,
safe_str(acl_user->host.hostname), safe_str(acl_user->host.hostname),
safe_str(acl_user->user.str), safe_str(acl_user->user.str),
new_password, new_password_len)) new_password, new_password_len, use_salt))
{ {
mysql_mutex_unlock(&acl_cache->lock); /* purecov: deadcode */ mysql_mutex_unlock(&acl_cache->lock); /* purecov: deadcode */
goto end; goto end;
@ -2972,7 +2971,8 @@ bool hostname_requires_resolving(const char *hostname)
static bool update_user_table(THD *thd, TABLE *table, static bool update_user_table(THD *thd, TABLE *table,
const char *host, const char *user, const char *host, const char *user,
const char *new_password, uint new_password_len) const char *new_password, uint new_password_len,
bool reset_plugin)
{ {
char user_key[MAX_KEY_LENGTH]; char user_key[MAX_KEY_LENGTH];
int error; int error;
@ -2995,6 +2995,11 @@ static bool update_user_table(THD *thd, TABLE *table,
} }
store_record(table,record[1]); store_record(table,record[1]);
table->field[2]->store(new_password, new_password_len, system_charset_info); table->field[2]->store(new_password, new_password_len, system_charset_info);
if (reset_plugin && table->s->fields >= 41)
{
table->field[40]->reset();
table->field[41]->reset();
}
if ((error=table->file->ha_update_row(table->record[1],table->record[0])) && if ((error=table->file->ha_update_row(table->record[1],table->record[0])) &&
error != HA_ERR_RECORD_IS_THE_SAME) error != HA_ERR_RECORD_IS_THE_SAME)
{ {

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
@ -2100,6 +2100,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());
}
enum binlog_filter_state enum binlog_filter_state
{ {

View File

@ -1196,7 +1196,8 @@ void end_connection(THD *thd)
} }
if (!thd->killed && (net->error && net->vio != 0)) if (!thd->killed && (net->error && net->vio != 0))
thd->print_aborted_warning(1, ER(ER_UNKNOWN_ERROR)); thd->print_aborted_warning(1,
thd->get_stmt_da()->is_error() ? thd->get_stmt_da()->message() : ER(ER_UNKNOWN_ERROR));
} }

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
@ -1588,9 +1588,10 @@ 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_ALL))
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, HA_CHECK_ALL & ~HA_CHECK_DUP);
if (!is_duplicate_key_error) if (!is_duplicate_key_error)
{ {
/* /*
@ -1718,7 +1719,7 @@ 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_ALL))
{ {
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))
@ -1848,7 +1849,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_ALL))
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))

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

@ -427,7 +427,7 @@ MY_LOCALE my_locale_da_DK
/***** LOCALE BEGIN de_AT: German - Austria *****/ /***** LOCALE BEGIN de_AT: German - Austria *****/
static const char *my_locale_month_names_de_AT[13] = static const char *my_locale_month_names_de_AT[13] =
{"Jänner","Feber","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember", NullS }; {"Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember", NullS };
static const char *my_locale_ab_month_names_de_AT[13] = static const char *my_locale_ab_month_names_de_AT[13] =
{"Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez", NullS }; {"Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez", NullS };
static const char *my_locale_day_names_de_AT[8] = static const char *my_locale_day_names_de_AT[8] =

Some files were not shown because too many files have changed in this diff Show More