diff --git a/Docs/INFO_SRC b/Docs/INFO_SRC index 56070a85b0386fe6a84a2fb7a8bc9eac68b92a95..bc3dc615ae8c249dbb599b93aa9969cf05b04580 100644 --- a/Docs/INFO_SRC +++ b/Docs/INFO_SRC @@ -1,8 +1,8 @@ -commit: 5a44e1a4024f1760021e5c6fd65773584d60513a -date: 2015-06-09 22:16:26 +0200 -build-date: 2015-06-09 22:25:59 +0200 -short: 5a44e1a +commit: 16c4b3c68b06653592a9500050ad977a38f4ebae +date: 2015-10-09 16:43:59 +0200 +build-date: 2015-10-09 18:51:17 +0200 +short: 16c4b3c branch: HEAD -MySQL source 5.5.44 +MySQL source 5.5.46 diff --git a/VERSION b/VERSION index fa5486099ce6672044219379e0ada3af5993b662..45f770d8f079275609c878146c047c9cb7cf5acb 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ MYSQL_VERSION_MAJOR=5 MYSQL_VERSION_MINOR=5 -MYSQL_VERSION_PATCH=44 +MYSQL_VERSION_PATCH=46 MYSQL_VERSION_EXTRA= diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index e4507f9c8bae5869681851a7f03aba35763233ba..e3edacc351c22cddf124c0a8f78a94260f14508b 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -47,6 +47,7 @@ MYSQL_ADD_EXECUTABLE(mysqldump mysqldump.c ../sql-common/my_user.c) TARGET_LINK_LIBRARIES(mysqldump mysqlclient) MYSQL_ADD_EXECUTABLE(mysqlimport mysqlimport.c) +SET_SOURCE_FILES_PROPERTIES(mysqlimport.c PROPERTIES COMPILE_FLAGS "-DTHREADS") TARGET_LINK_LIBRARIES(mysqlimport mysqlclient) MYSQL_ADD_EXECUTABLE(mysql_upgrade mysql_upgrade.c COMPONENT Server) diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index d513d5d852d352b1dc22842c410751a216ad8ed7..ee6845def680742d4b5906af8b9d68be71aec641 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -1061,7 +1061,7 @@ int main(int argc, char **argv) printf("This installation of MySQL is already upgraded to %s, " "use --force if you still need to run mysql_upgrade\n", MYSQL_SERVER_VERSION); - die(NULL); + goto end; } if (opt_version_check && check_version_match()) @@ -1084,6 +1084,7 @@ int main(int argc, char **argv) /* Create a file indicating upgrade has been performed */ create_mysql_upgrade_info_file(); +end: free_used_memory(); my_end(my_end_arg); exit(0); diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 57492577e9182d2ab0a929f7faa46bbed90f32b6..250dc6098917f600c0bcdb424cac812548eca1d7 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -66,6 +66,7 @@ ulong server_id = 0; ulong bytes_sent = 0L, bytes_received = 0L; ulong mysqld_net_retry_count = 10L; ulong open_files_limit; +ulong opt_binlog_rows_event_max_size; uint test_flags = 0; static uint opt_protocol= 0; static FILE *result_file; @@ -1432,6 +1433,12 @@ that may lead to an endless loop.", "Used to reserve file descriptors for use by this program.", &open_files_limit, &open_files_limit, 0, GET_ULONG, REQUIRED_ARG, MY_NFILE, 8, OS_FILE_LIMIT, 0, 1, 0}, + {"binlog-row-event-max-size", 0, + "The maximum size of a row-based binary log event in bytes. Rows will be " + "grouped into events smaller than this size if possible. " + "This value must be a multiple of 256.", + &opt_binlog_rows_event_max_size, &opt_binlog_rows_event_max_size, 0, + GET_ULONG, REQUIRED_ARG, UINT_MAX, 256, ULONG_MAX, 0, 256, 0}, {"verify-binlog-checksum", 'c', "Verify checksum binlog events.", (uchar**) &opt_verify_binlog_checksum, (uchar**) &opt_verify_binlog_checksum, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, diff --git a/client/mysqlimport.c b/client/mysqlimport.c index 686f26cebeb46ad89a6348ca4136263c38cc1452..a22774bc68467e248e5d53cc6a3b9dc4e2c2245d 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -1,5 +1,6 @@ /* - Copyright (c) 2000, 2012, Oracle and/or its affiliates. + Copyright (c) 2000, 2015, Oracle and/or its affiliates. + Copyright (c) 2011, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,19 +31,14 @@ #include "client_priv.h" #include "mysql_version.h" -#ifdef HAVE_LIBPTHREAD -#include -#endif #include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ /* Global Thread counter */ -uint counter; -#ifdef HAVE_LIBPTHREAD +uint counter= 0; pthread_mutex_t counter_mutex; pthread_cond_t count_threshhold; -#endif static void db_error_with_table(MYSQL *mysql, char *table); static void db_error(MYSQL *mysql); @@ -486,6 +482,11 @@ static void safe_exit(int error, MYSQL *mysql) { if (error && ignore_errors) return; + + /* in multi-threaded mode protect from concurrent safe_exit's */ + if (counter) + pthread_mutex_lock(&counter_mutex); + if (mysql) mysql_close(mysql); @@ -568,7 +569,6 @@ static char *field_escape(char *to,const char *from,uint length) int exitcode= 0; -#ifdef HAVE_LIBPTHREAD pthread_handler_t worker_thread(void *arg) { int error; @@ -608,7 +608,6 @@ pthread_handler_t worker_thread(void *arg) return 0; } -#endif int main(int argc, char **argv) @@ -628,7 +627,6 @@ int main(int argc, char **argv) } sf_leaking_memory=0; /* from now on we cleanup properly */ -#ifdef HAVE_LIBPTHREAD if (opt_use_threads && !lock_tables) { pthread_t mainthread; /* Thread descriptor */ @@ -682,7 +680,6 @@ int main(int argc, char **argv) pthread_attr_destroy(&attr); } else -#endif { MYSQL *mysql= 0; if (!(mysql= db_connect(current_host,current_db,current_user,opt_password))) diff --git a/client/mysqlslap.c b/client/mysqlslap.c index 536535be29400c417b5484b013ded1077a6840f0..03301b01efb7556caddf0fad1d9c5b7764de3e98 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -1,5 +1,6 @@ /* - Copyright (c) 2005, 2012, Oracle and/or its affiliates. + Copyright (c) 2005, 2015, Oracle and/or its affiliates. + Copyright (c) 2010, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -244,7 +245,7 @@ void print_conclusions_csv(conclusions *con); void generate_stats(conclusions *con, option_string *eng, stats *sptr); uint parse_comma(const char *string, uint **range); uint parse_delimiter(const char *script, statement **stmt, char delm); -uint parse_option(const char *origin, option_string **stmt, char delm); +int parse_option(const char *origin, option_string **stmt, char delm); static int drop_schema(MYSQL *mysql, const char *db); uint get_random_string(char *buf); static statement *build_table_string(void); @@ -1259,7 +1260,13 @@ get_options(int *argc,char ***argv) if (num_int_cols_opt) { option_string *str; - parse_option(num_int_cols_opt, &str, ','); + if(parse_option(num_int_cols_opt, &str, ',') == -1) + { + fprintf(stderr, "Invalid value specified for the option " + "'number-int-cols'\n"); + option_cleanup(str); + return 1; + } num_int_cols= atoi(str->string); if (str->option) num_int_cols_index= atoi(str->option); @@ -1270,7 +1277,13 @@ get_options(int *argc,char ***argv) if (num_char_cols_opt) { option_string *str; - parse_option(num_char_cols_opt, &str, ','); + if(parse_option(num_char_cols_opt, &str, ',') == -1) + { + fprintf(stderr, "Invalid value specified for the option " + "'number-char-cols'\n"); + option_cleanup(str); + return 1; + } num_char_cols= atoi(str->string); if (str->option) num_char_cols_index= atoi(str->option); @@ -1507,7 +1520,13 @@ get_options(int *argc,char ***argv) printf("Parsing engines to use.\n"); if (default_engine) - parse_option(default_engine, &engine_options, ','); + { + if(parse_option(default_engine, &engine_options, ',') == -1) + { + fprintf(stderr, "Invalid value specified for the option 'engine'\n"); + return 1; + } + } if (tty_password) opt_password= get_tty_password(NullS); @@ -1984,7 +2003,7 @@ pthread_handler_t run_task(void *p) DBUG_RETURN(0); } -uint +int parse_option(const char *origin, option_string **stmt, char delm) { char *retstr; @@ -2009,6 +2028,13 @@ parse_option(const char *origin, option_string **stmt, char delm) char buffer[HUGE_STRING_LENGTH]= ""; char *buffer_ptr; + /* + Return an error if the length of the any of the comma seprated value + exceeds HUGE_STRING_LENGTH. + */ + if ((size_t)(retstr - ptr) > HUGE_STRING_LENGTH) + return -1; + count++; strncpy(buffer, ptr, (size_t)(retstr - ptr)); /* @@ -2048,6 +2074,13 @@ parse_option(const char *origin, option_string **stmt, char delm) { char *origin_ptr; + /* + Return an error if the length of the any of the comma seprated value + exceeds HUGE_STRING_LENGTH. + */ + if (strlen(ptr) > HUGE_STRING_LENGTH) + return -1; + if ((origin_ptr= strchr(ptr, ':'))) { char *option_ptr; @@ -2058,13 +2091,13 @@ parse_option(const char *origin, option_string **stmt, char delm) option_ptr= (char *)ptr + 1 + tmp->length; /* Move past the : and the first string */ - tmp->option_length= (size_t)((ptr + length) - option_ptr); + tmp->option_length= strlen(option_ptr); tmp->option= my_strndup(option_ptr, tmp->option_length, MYF(MY_FAE)); } else { - tmp->length= (size_t)((ptr + length) - ptr); + tmp->length= strlen(ptr); tmp->string= my_strndup(ptr, tmp->length, MYF(MY_FAE)); } diff --git a/cmake/os/Windows.cmake b/cmake/os/Windows.cmake index 16c2743aa4ae0ac7d5a4cae3b4b168bf9999f40f..5999ae681f726a58063d2e94fccd45017a201cb5 100644 --- a/cmake/os/Windows.cmake +++ b/cmake/os/Windows.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -50,10 +50,12 @@ IF(CMAKE_C_COMPILER MATCHES "icl") SET(MSVC TRUE) ENDIF() -ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE") -ADD_DEFINITIONS("-D_WIN32_WINNT=0x0501") +ADD_DEFINITIONS(-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE) +ADD_DEFINITIONS(-D_WIN32_WINNT=0x0501) +# We do not want the windows.h macros min/max +ADD_DEFINITIONS(-DNOMINMAX) # Speed up build process excluding unused header files -ADD_DEFINITIONS("-DWIN32_LEAN_AND_MEAN") +ADD_DEFINITIONS(-DWIN32_LEAN_AND_MEAN) # Adjust compiler and linker flags IF(MINGW AND CMAKE_SIZEOF_VOID_P EQUAL 4) diff --git a/extra/yassl/README b/extra/yassl/README index da399c3d141e8ac11455b5d3520f93024b004f3f..bf0e1c9f40ff588d58690ceb0a6c1729efc0ce27 100644 --- a/extra/yassl/README +++ b/extra/yassl/README @@ -12,6 +12,35 @@ before calling SSL_new(); *** end Note *** +yaSSL Release notes, version 2.3.8 (9/17/2015) + This release of yaSSL fixes a high security vulnerability. All users + SHOULD update. If using yaSSL for TLS on the server side with private + RSA keys allowing ephemeral key exchange you MUST update and regenerate + the RSA private keys. This report is detailed in: + https://people.redhat.com/~fweimer/rsa-crt-leaks.pdf + yaSSL now detects RSA signature faults and returns an error. + +yaSSL Patch notes, version 2.3.7e (6/26/2015) + This release of yaSSL includes a fix for Date less than comparison. + Previously yaSSL would return true on less than comparisons if the Dates + were equal. Reported by Oracle. No security problem, but if a cert was + generated right now, a server started using it in the same second, and a + client tried to verify it in the same second it would report not yet valid. + +yaSSL Patch notes, version 2.3.7d (6/22/2015) + This release of yaSSL includes a fix for input_buffer set_current with + index 0. SSL_peek() at front of waiting data could trigger. Robert + Golebiowski of Oracle identified and suggested a fix, thanks! + +yaSSL Patch notes, version 2.3.7c (6/12/2015) + This release of yaSSL does certificate DATE comparisons to the second + instead of to the minute, helpful when using freshly generated certs. + Though keep in mind that time sync differences could still show up. + +yaSSL Patch notes, version 2.3.7b (3/18/2015) + This release of yaSSL fixes a potential crash with corrupted private keys. + Also detects bad keys earlier for user. + yaSSL Release notes, version 2.3.7 (12/10/2014) This release of yaSSL fixes the potential to process duplicate handshake messages by explicitly marking/checking received handshake messages. diff --git a/extra/yassl/include/openssl/ssl.h b/extra/yassl/include/openssl/ssl.h index 24acc7e86b91efa1c1a6c3cb86236d91c869e4d8..b0a7592f8700f4232d62eb82f6a82285805c5037 100644 --- a/extra/yassl/include/openssl/ssl.h +++ b/extra/yassl/include/openssl/ssl.h @@ -35,7 +35,7 @@ #include "rsa.h" -#define YASSL_VERSION "2.3.7" +#define YASSL_VERSION "2.3.8" #if defined(__cplusplus) diff --git a/extra/yassl/include/yassl_error.hpp b/extra/yassl/include/yassl_error.hpp index beba7b0b5ddbcbd7f458c6c1c96889b405b906f5..d63244dca90e35ab7f1c80ae607259e776f92254 100644 --- a/extra/yassl/include/yassl_error.hpp +++ b/extra/yassl/include/yassl_error.hpp @@ -53,7 +53,8 @@ enum YasslError { compress_error = 118, decompress_error = 119, pms_version_error = 120, - sanityCipher_error = 121 + sanityCipher_error = 121, + rsaSignFault_error = 122 // !!!! add error message to .cpp !!!! diff --git a/extra/yassl/src/buffer.cpp b/extra/yassl/src/buffer.cpp index ee5e0cc0793222c81c70b1d32b0fb0ca7111624a..532da3875a7c967c95dd618c0b9b22e5eb3d7aa0 100644 --- a/extra/yassl/src/buffer.cpp +++ b/extra/yassl/src/buffer.cpp @@ -165,7 +165,7 @@ void input_buffer::set_error() void input_buffer::set_current(uint i) { - if (error_ == 0 && (i == 0 || check(i - 1, size_) == 0)) + if (error_ == 0 && check(i ? i - 1 : 0, size_) == 0) current_ = i; else error_ = -1; diff --git a/extra/yassl/src/handshake.cpp b/extra/yassl/src/handshake.cpp index 33303b1106dd475f25986c979818184a7a99ff6f..aa2de39333c0d6e277768d715bbf0ce3ece393fb 100644 --- a/extra/yassl/src/handshake.cpp +++ b/extra/yassl/src/handshake.cpp @@ -1172,6 +1172,8 @@ void sendCertificateVerify(SSL& ssl, BufferOutput buffer) CertificateVerify verify; verify.Build(ssl); + if (ssl.GetError()) return; + RecordLayerHeader rlHeader; HandShakeHeader hsHeader; mySTL::auto_ptr out(NEW_YS output_buffer); diff --git a/extra/yassl/src/ssl.cpp b/extra/yassl/src/ssl.cpp index 9c1016ba53dbd21fbd608c13dfd7e69170ebecb2..9516e8b985ef5554485b1a30832be2994bfb6183 100644 --- a/extra/yassl/src/ssl.cpp +++ b/extra/yassl/src/ssl.cpp @@ -37,6 +37,8 @@ #include "file.hpp" // for TaoCrypt Source #include "coding.hpp" // HexDecoder #include "helpers.hpp" // for placement new hack +#include "rsa.hpp" // for TaoCrypt RSA key decode +#include "dsa.hpp" // for TaoCrypt DSA key decode #include #ifdef _WIN32 @@ -54,6 +56,8 @@ namespace yaSSL { int read_file(SSL_CTX* ctx, const char* file, int format, CertType type) { + int ret = SSL_SUCCESS; + if (format != SSL_FILETYPE_ASN1 && format != SSL_FILETYPE_PEM) return SSL_BAD_FILETYPE; @@ -141,8 +145,31 @@ int read_file(SSL_CTX* ctx, const char* file, int format, CertType type) } } } + + if (type == PrivateKey && ctx->privateKey_) { + // see if key is valid early + TaoCrypt::Source rsaSource(ctx->privateKey_->get_buffer(), + ctx->privateKey_->get_length()); + TaoCrypt::RSA_PrivateKey rsaKey; + rsaKey.Initialize(rsaSource); + + if (rsaSource.GetError().What()) { + // rsa failed see if DSA works + + TaoCrypt::Source dsaSource(ctx->privateKey_->get_buffer(), + ctx->privateKey_->get_length()); + TaoCrypt::DSA_PrivateKey dsaKey; + dsaKey.Initialize(dsaSource); + + if (rsaSource.GetError().What()) { + // neither worked + ret = SSL_FAILURE; + } + } + } + fclose(input); - return SSL_SUCCESS; + return ret; } diff --git a/extra/yassl/src/yassl_error.cpp b/extra/yassl/src/yassl_error.cpp index 36e286a73ce4f74d6adaca3a83772503c8ea6e59..fec6a3394ca13c21170226ede131af8b047c4d78 100644 --- a/extra/yassl/src/yassl_error.cpp +++ b/extra/yassl/src/yassl_error.cpp @@ -148,6 +148,10 @@ void SetErrorString(YasslError error, char* buffer) strncpy(buffer, "sanity check on cipher text size error", max); break; + case rsaSignFault_error: + strncpy(buffer, "rsa signature fault error", max); + break; + // openssl errors case SSL_ERROR_WANT_READ : strncpy(buffer, "the read operation would block", max); diff --git a/extra/yassl/src/yassl_imp.cpp b/extra/yassl/src/yassl_imp.cpp index 742d07956dad1f641e559fb9c922118616145b87..e1a410086fb0fd2107c1f08227b02df9f4b2a279 100644 --- a/extra/yassl/src/yassl_imp.cpp +++ b/extra/yassl/src/yassl_imp.cpp @@ -196,9 +196,16 @@ void DH_Server::build(SSL& ssl) sha.update(tmp.get_buffer(), tmp.get_size()); sha.get_digest(&hash[MD5_LEN]); - if (ssl.getSecurity().get_parms().sig_algo_ == rsa_sa_algo) + if (ssl.getSecurity().get_parms().sig_algo_ == rsa_sa_algo) { auth->sign(signature_, hash, sizeof(hash), ssl.getCrypto().get_random()); + // check for rsa signautre fault + if (!auth->verify(hash, sizeof(hash), signature_, + auth->get_signatureLength())) { + ssl.SetError(rsaSignFault_error); + return; + } + } else { auth->sign(signature_, &hash[MD5_LEN], SHA_LEN, ssl.getCrypto().get_random()); @@ -2159,6 +2166,12 @@ void CertificateVerify::Build(SSL& ssl) memcpy(sig.get(), len, VERIFY_HEADER); rsa.sign(sig.get() + VERIFY_HEADER, hashes_.md5_, sizeof(Hashes), ssl.getCrypto().get_random()); + // check for rsa signautre fault + if (!rsa.verify(hashes_.md5_, sizeof(Hashes), sig.get() + VERIFY_HEADER, + rsa.get_cipherLength())) { + ssl.SetError(rsaSignFault_error); + return; + } } else { // DSA DSS dss(cert.get_privateKey(), cert.get_privateKeyLength(), false); diff --git a/extra/yassl/taocrypt/src/asn.cpp b/extra/yassl/taocrypt/src/asn.cpp index d521088d74a01095d745805e94fb56ccfd36edfc..c419ec0a992b8706340e6fdca5e5dbe4fb8cbe2b 100644 --- a/extra/yassl/taocrypt/src/asn.cpp +++ b/extra/yassl/taocrypt/src/asn.cpp @@ -39,7 +39,7 @@ namespace TaoCrypt { namespace { // locals -// to the minute +// to the second bool operator>(tm& a, tm& b) { if (a.tm_year > b.tm_year) @@ -60,13 +60,18 @@ bool operator>(tm& a, tm& b) a.tm_min > b.tm_min) return true; + if (a.tm_year == b.tm_year && a.tm_mon == b.tm_mon && + a.tm_mday == b.tm_mday && a.tm_hour == b.tm_hour && + a.tm_min == b.tm_min && a.tm_sec > b.tm_sec) + return true; + return false; } bool operator<(tm& a, tm&b) { - return !(a>b); + return (b>a); } diff --git a/extra/yassl/taocrypt/src/rsa.cpp b/extra/yassl/taocrypt/src/rsa.cpp index 79a8a8f1c4f21848f5e3454320097da6fb71212d..73f678e2674c270ff89284b34655f1c03c5854ea 100644 --- a/extra/yassl/taocrypt/src/rsa.cpp +++ b/extra/yassl/taocrypt/src/rsa.cpp @@ -140,6 +140,10 @@ word32 RSA_BlockType2::UnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen, void RSA_BlockType1::Pad(const byte* input, word32 inputLen, byte* pkcsBlock, word32 pkcsBlockLen, RandomNumberGenerator&) const { + // sanity checks + if (input == NULL || pkcsBlock == NULL) + return; + // convert from bit length to byte length if (pkcsBlockLen % 8 != 0) { diff --git a/extra/yassl/testsuite/cipher-test.sh b/extra/yassl/testsuite/cipher-test.sh index 5ce29459d074ab749b4f9bf48fdd595250cb5097..d3e6914609739edf724d82a76958ee1b5e5a7206 100644 --- a/extra/yassl/testsuite/cipher-test.sh +++ b/extra/yassl/testsuite/cipher-test.sh @@ -4,6 +4,7 @@ # +no_pid=-1 server_pid=$no_pid diff --git a/mysql-test/disabled.def b/mysql-test/disabled.def index 6dc3066e374ba52b33ba975800afe30bd8b05ea8..310890605ff687cd521694cba1a111f2e87994e9 100644 --- a/mysql-test/disabled.def +++ b/mysql-test/disabled.def @@ -11,9 +11,8 @@ ############################################################################## tablespace : disabled in MariaDB (no TABLESPACE table attribute) events_time_zone : Test is not predictable as it depends on precise timing. -lowercase_table3 : Bug#11762269 2010-06-30 alik main.lowercase_table3 on Mac OSX read_many_rows_innodb : Bug#11748886 2010-11-15 mattiasj report already exists -archive-big : Bug#11817185 2011-03-10 Anitha Disabled since this leads to timeout on Solaris Sparc log_tables-big : Bug#11756699 2010-11-15 mattiasj report already exists mysql_embedded : Bug#12561297 2011-05-14 Anitha Dependent on PB2 changes - eventum#41836 file_contents : MDEV-6526 these files are not installed anymore +lowercase_fs_on : lower_case_table_names=0 is not an error until 10.1 diff --git a/mysql-test/extra/binlog_tests/mix_innodb_myisam_binlog.test b/mysql-test/extra/binlog_tests/mix_innodb_myisam_binlog.test index b41bfeaba7467856b9880422e71ad40f98c6e753..336b11113ec3ce014ea1ed0c83b4c8cb48546636 100644 --- a/mysql-test/extra/binlog_tests/mix_innodb_myisam_binlog.test +++ b/mysql-test/extra/binlog_tests/mix_innodb_myisam_binlog.test @@ -228,7 +228,7 @@ rollback; create table t0 (n int); insert t0 select * from t1; set autocommit=1; -insert into t0 select GET_LOCK("lock1",null); +insert into t0 select GET_LOCK("lock1",0); set autocommit=0; create table t2 (n int) engine=innodb; insert into t2 values (3); diff --git a/mysql-test/include/restart_mysqld.inc b/mysql-test/include/restart_mysqld.inc index 7cb9c7994d8f88ddd713a2eab419ad338e0179f7..ed0fe64a5478839453bd11378db19aa6a2cd1b1a 100644 --- a/mysql-test/include/restart_mysqld.inc +++ b/mysql-test/include/restart_mysqld.inc @@ -1,3 +1,8 @@ +# ==== Usage ==== +# +# [--let $shutdown_timeout= 30] +# [--let $allow_rpl_inited= 1] +# --source include/restart_mysqld.inc if ($rpl_inited) { @@ -7,6 +12,16 @@ if ($rpl_inited) } } +--let $server_shutdown_timeout= 10 +if ($shutdown_timeout) +{ + --let $server_shutdown_timeout= $shutdown_timeout +} +if ($shutdown_timeout == 0) +{ + --let $server_shutdown_timeout= 0 +} + # Write file to make mysql-test-run.pl expect the "crash", but don't start # it until it's told to --let $_server_id= `SELECT @@server_id` @@ -15,7 +30,7 @@ if ($rpl_inited) # Send shutdown to the connected server and give # it 10 seconds to die before zapping it -shutdown_server 10; +shutdown_server $server_shutdown_timeout; # Write file to make mysql-test-run.pl start up the server again --exec echo "restart" > $_expect_file_name diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 566423a1c07cffa98d38e589eff81b158c637e91..26b31d34d3c9eb26e2bd88aed724a9101c66d3c4 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -4806,6 +4806,7 @@ sub extract_warning_lines ($$) { qr|Plugin 'FEEDBACK' registration as a INFORMATION SCHEMA failed|, qr|Failed to setup SSL|, qr|SSL error: Failed to set ciphers to use|, + qr/Plugin 'InnoDB' will be forced to shutdown/, ); my $matched_lines= []; diff --git a/mysql-test/r/func_gconcat.result b/mysql-test/r/func_gconcat.result index f12a0c1127a1781f09aedefdc4f484410e60b621..0bc31a5e85b2a02d14f638779978e49a8c9fb166 100644 --- a/mysql-test/r/func_gconcat.result +++ b/mysql-test/r/func_gconcat.result @@ -1103,3 +1103,19 @@ ORDER BY field; field c,c drop table t3, t2, t1; +# +# MDEV-7821 - Server crashes in Item_func_group_concat::fix_fields on 2nd +# execution of PS +# +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES(1),(2); +PREPARE stmt FROM "SELECT GROUP_CONCAT(t1a.a ORDER BY 1, t1a.a=0) FROM t1 AS t1a, t1 AS t1b GROUP BY t1a.a"; +EXECUTE stmt; +GROUP_CONCAT(t1a.a ORDER BY 1, t1a.a=0) +1,1 +2,2 +EXECUTE stmt; +GROUP_CONCAT(t1a.a ORDER BY 1, t1a.a=0) +1,1 +2,2 +DROP TABLE t1; diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index c7f548ae2bc02870467033f29cd110daf1725a6d..61f63cc7253c771eb2a985b2389cb85b714758ff 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -234,3 +234,20 @@ SELECT if(1, NULL, (SELECT min('hello'))); if(1, NULL, (SELECT min('hello'))) NULL End of 5.2 tests +# +# MDEV-8663: IF Statement returns multiple values erroneously +# (or Assertion `!null_value' failed in Item::send(Protocol*, String*) +# +CREATE TABLE `t1` ( +`datas` VARCHAR(25) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +Warnings: +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1266 Using storage engine MyISAM for table 't1' +INSERT INTO `t1` VALUES ('1,2'), ('2,3'), ('3,4'); +SELECT IF(FIND_IN_SET('1', `datas`), 1.5, IF(FIND_IN_SET('2', `datas`), 2, NULL)) AS `First`, '1' AS `Second`, '2' AS `Third` FROM `t1`; +First Second Third +1.5 1 2 +2.0 1 2 +NULL 1 2 +drop table t1; diff --git a/mysql-test/r/func_misc.result b/mysql-test/r/func_misc.result index d5db28f04b8c67d18499dfb924e32dcfafe93f67..a121bd324eef8d8e8b8f772cc85e706837baa53c 100644 --- a/mysql-test/r/func_misc.result +++ b/mysql-test/r/func_misc.result @@ -361,5 +361,216 @@ set optimizer_switch=@optimizer_switch_save; drop view v_merge, vm; drop table t1,tv; # +# MDEV-4017 - GET_LOCK() with negative timeouts has strange behavior +# +SELECT GET_LOCK('ul1', NULL); +GET_LOCK('ul1', NULL) +NULL +Warnings: +Warning 1411 Incorrect timeout value: 'NULL' for function get_lock +SELECT GET_LOCK('ul1', -1); +GET_LOCK('ul1', -1) +NULL +Warnings: +Warning 1411 Incorrect timeout value: '-1' for function get_lock +# +# MDEV-8624 MariaDB hangs on query with many logical condition +# +CREATE TABLE `t1` ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`submitdate` datetime DEFAULT NULL, +`lastpage` int(11) DEFAULT NULL, +`startlanguage` varchar(20) COLLATE utf8_unicode_ci NOT NULL, +`token` varchar(36) COLLATE utf8_unicode_ci DEFAULT NULL, +`datestamp` datetime NOT NULL, +`startdate` datetime NOT NULL, +`ipaddr` text COLLATE utf8_unicode_ci, +`refurl` text COLLATE utf8_unicode_ci, +`57813X540X1723` text COLLATE utf8_unicode_ci, +`57813X540X1724` text COLLATE utf8_unicode_ci, +`57813X540X1725` text COLLATE utf8_unicode_ci, +`57813X540X1726` double DEFAULT NULL, +`57813X540X1909` double DEFAULT NULL, +`57813X541X17271` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X541X17272` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X541X17273` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X541X17274` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X541X17275` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X541X17276` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X541X17281` text COLLATE utf8_unicode_ci, +`57813X541X17282` text COLLATE utf8_unicode_ci, +`57813X541X17283` text COLLATE utf8_unicode_ci, +`57813X541X17284` text COLLATE utf8_unicode_ci, +`57813X541X17285` text COLLATE utf8_unicode_ci, +`57813X541X17286` text COLLATE utf8_unicode_ci, +`57813X542X18131` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18132` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18133` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18134` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18135` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18136` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18137` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18138` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18139` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X542X18141` text COLLATE utf8_unicode_ci, +`57813X542X18142` text COLLATE utf8_unicode_ci, +`57813X542X18143` text COLLATE utf8_unicode_ci, +`57813X542X18144` text COLLATE utf8_unicode_ci, +`57813X542X18145` text COLLATE utf8_unicode_ci, +`57813X542X18146` text COLLATE utf8_unicode_ci, +`57813X542X18147` text COLLATE utf8_unicode_ci, +`57813X542X18148` text COLLATE utf8_unicode_ci, +`57813X542X18149` text COLLATE utf8_unicode_ci, +`57813X543X18451` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X543X18452` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X543X18453` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X543X18454` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X543X18455` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X543X18456` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X543X18461` text COLLATE utf8_unicode_ci, +`57813X543X18462` text COLLATE utf8_unicode_ci, +`57813X543X18463` text COLLATE utf8_unicode_ci, +`57813X543X18464` text COLLATE utf8_unicode_ci, +`57813X543X18465` text COLLATE utf8_unicode_ci, +`57813X543X18466` text COLLATE utf8_unicode_ci, +`57813X544X18711` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X544X18712` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X544X18713` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X544X18714` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X544X18715` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X544X18716` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X544X18717` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X544X18718` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X544X18721` text COLLATE utf8_unicode_ci, +`57813X544X18722` text COLLATE utf8_unicode_ci, +`57813X544X18723` text COLLATE utf8_unicode_ci, +`57813X544X18724` text COLLATE utf8_unicode_ci, +`57813X544X18725` text COLLATE utf8_unicode_ci, +`57813X544X18726` text COLLATE utf8_unicode_ci, +`57813X544X18727` text COLLATE utf8_unicode_ci, +`57813X544X18728` text COLLATE utf8_unicode_ci, +`57813X546X1902` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X546X1903` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X546X1904` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, +`57813X545X1901` varchar(1) COLLATE utf8_unicode_ci DEFAULT NULL, +PRIMARY KEY (`id`), +KEY `lime_survey_57813_idx` (`token`), +KEY `57813X540X1723` (`57813X540X1723`(100)), +KEY `57813X540X1724` (`57813X540X1724`(100)), +KEY `57813X540X1726` (`57813X540X1726`), +KEY `57813X540X1725` (`57813X540X1725`(100)), +KEY `57813X546X1902` (`57813X546X1902`), +KEY `57813X546X1903` (`57813X546X1903`), +KEY `57813X546X1904` (`57813X546X1904`) +); +SELECT +COUNT(*) as `N`, +ROUND( +( +SUM( +( +( +IF( 57813X541X17271 IS NOT NULL AND 57813X541X17271 != '' AND 57813X541X17271 != '99', 57813X541X17271, 0 ) + +IF( 57813X541X17272 IS NOT NULL AND 57813X541X17272 != '' AND 57813X541X17272 != '99', 57813X541X17272, 0 ) + +IF( 57813X541X17273 IS NOT NULL AND 57813X541X17273 != '' AND 57813X541X17273 != '99', 57813X541X17273, 0 ) + +IF( 57813X541X17274 IS NOT NULL AND 57813X541X17274 != '' AND 57813X541X17274 != '99', 57813X541X17274, 0 ) + +IF( 57813X541X17275 IS NOT NULL AND 57813X541X17275 != '' AND 57813X541X17275 != '99', 57813X541X17275, 0 ) + +IF( 57813X541X17276 IS NOT NULL AND 57813X541X17276 != '' AND 57813X541X17276 != '99', 57813X541X17276, 0 ) + +IF( 57813X542X18131 IS NOT NULL AND 57813X542X18131 != '' AND 57813X542X18131 != '99', 57813X542X18131, 0 ) + +IF( 57813X542X18132 IS NOT NULL AND 57813X542X18132 != '' AND 57813X542X18132 != '99', 57813X542X18132, 0 ) + +IF( 57813X542X18133 IS NOT NULL AND 57813X542X18133 != '' AND 57813X542X18133 != '99', 57813X542X18133, 0 ) + +IF( 57813X542X18134 IS NOT NULL AND 57813X542X18134 != '' AND 57813X542X18134 != '99', 57813X542X18134, 0 ) + +IF( 57813X542X18135 IS NOT NULL AND 57813X542X18135 != '' AND 57813X542X18135 != '99', 57813X542X18135, 0 ) + +IF( 57813X542X18136 IS NOT NULL AND 57813X542X18136 != '' AND 57813X542X18136 != '99', 57813X542X18136, 0 ) + +IF( 57813X542X18137 IS NOT NULL AND 57813X542X18137 != '' AND 57813X542X18137 != '99', 57813X542X18137, 0 ) + +IF( 57813X542X18138 IS NOT NULL AND 57813X542X18138 != '' AND 57813X542X18138 != '99', 57813X542X18138, 0 ) + +IF( 57813X542X18139 IS NOT NULL AND 57813X542X18139 != '' AND 57813X542X18139 != '99', 57813X542X18139, 0 ) + +IF( 57813X543X18451 IS NOT NULL AND 57813X543X18451 != '' AND 57813X543X18451 != '99', 57813X543X18451, 0 ) + +IF( 57813X543X18452 IS NOT NULL AND 57813X543X18452 != '' AND 57813X543X18452 != '99', 57813X543X18452, 0 ) + +IF( 57813X543X18453 IS NOT NULL AND 57813X543X18453 != '' AND 57813X543X18453 != '99', 57813X543X18453, 0 ) + +IF( 57813X543X18454 IS NOT NULL AND 57813X543X18454 != '' AND 57813X543X18454 != '99', 57813X543X18454, 0 ) + +IF( 57813X543X18455 IS NOT NULL AND 57813X543X18455 != '' AND 57813X543X18455 != '99', 57813X543X18455, 0 ) + +IF( 57813X543X18456 IS NOT NULL AND 57813X543X18456 != '' AND 57813X543X18456 != '99', 57813X543X18456, 0 ) + +IF( 57813X544X18711 IS NOT NULL AND 57813X544X18711 != '' AND 57813X544X18711 != '99', 57813X544X18711, 0 ) + +IF( 57813X544X18712 IS NOT NULL AND 57813X544X18712 != '' AND 57813X544X18712 != '99', 57813X544X18712, 0 ) + +IF( 57813X544X18713 IS NOT NULL AND 57813X544X18713 != '' AND 57813X544X18713 != '99', 57813X544X18713, 0 ) + +IF( 57813X544X18714 IS NOT NULL AND 57813X544X18714 != '' AND 57813X544X18714 != '99', 57813X544X18714, 0 ) + +IF( 57813X544X18715 IS NOT NULL AND 57813X544X18715 != '' AND 57813X544X18715 != '99', 57813X544X18715, 0 ) + +IF( 57813X544X18716 IS NOT NULL AND 57813X544X18716 != '' AND 57813X544X18716 != '99', 57813X544X18716, 0 ) + +IF( 57813X544X18717 IS NOT NULL AND 57813X544X18717 != '' AND 57813X544X18717 != '99', 57813X544X18717, 0 ) + +IF( 57813X544X18718 IS NOT NULL AND 57813X544X18718 != '' AND 57813X544X18718 != '99', 57813X544X18718, 0 ) +) +/ +( +IF( 57813X541X17271 IS NOT NULL AND 57813X541X17271 != '' AND 57813X541X17271 != '99', 1, 0 ) + +IF( 57813X541X17272 IS NOT NULL AND 57813X541X17272 != '' AND 57813X541X17272 != '99', 1, 0 ) + +IF( 57813X541X17273 IS NOT NULL AND 57813X541X17273 != '' AND 57813X541X17273 != '99', 1, 0 ) + +IF( 57813X541X17274 IS NOT NULL AND 57813X541X17274 != '' AND 57813X541X17274 != '99', 1, 0 ) + +IF( 57813X541X17275 IS NOT NULL AND 57813X541X17275 != '' AND 57813X541X17275 != '99', 1, 0 ) + +IF( 57813X541X17276 IS NOT NULL AND 57813X541X17276 != '' AND 57813X541X17276 != '99', 1, 0 ) + +IF( 57813X542X18131 IS NOT NULL AND 57813X542X18131 != '' AND 57813X542X18131 != '99', 1, 0 ) + +IF( 57813X542X18132 IS NOT NULL AND 57813X542X18132 != '' AND 57813X542X18132 != '99', 1, 0 ) + +IF( 57813X542X18133 IS NOT NULL AND 57813X542X18133 != '' AND 57813X542X18133 != '99', 1, 0 ) + +IF( 57813X542X18134 IS NOT NULL AND 57813X542X18134 != '' AND 57813X542X18134 != '99', 1, 0 ) + +IF( 57813X542X18135 IS NOT NULL AND 57813X542X18135 != '' AND 57813X542X18135 != '99', 1, 0 ) + +IF( 57813X542X18136 IS NOT NULL AND 57813X542X18136 != '' AND 57813X542X18136 != '99', 1, 0 ) + +IF( 57813X542X18137 IS NOT NULL AND 57813X542X18137 != '' AND 57813X542X18137 != '99', 1, 0 ) + +IF( 57813X542X18138 IS NOT NULL AND 57813X542X18138 != '' AND 57813X542X18138 != '99', 1, 0 ) + +IF( 57813X542X18139 IS NOT NULL AND 57813X542X18139 != '' AND 57813X542X18139 != '99', 1, 0 ) + +IF( 57813X543X18451 IS NOT NULL AND 57813X543X18451 != '' AND 57813X543X18451 != '99', 1, 0 ) + +IF( 57813X543X18452 IS NOT NULL AND 57813X543X18452 != '' AND 57813X543X18452 != '99', 1, 0 ) + +IF( 57813X543X18453 IS NOT NULL AND 57813X543X18453 != '' AND 57813X543X18453 != '99', 1, 0 ) + +IF( 57813X543X18454 IS NOT NULL AND 57813X543X18454 != '' AND 57813X543X18454 != '99', 1, 0 ) + +IF( 57813X543X18455 IS NOT NULL AND 57813X543X18455 != '' AND 57813X543X18455 != '99', 1, 0 ) + +IF( 57813X543X18456 IS NOT NULL AND 57813X543X18456 != '' AND 57813X543X18456 != '99', 1, 0 ) + +IF( 57813X544X18711 IS NOT NULL AND 57813X544X18711 != '' AND 57813X544X18711 != '99', 1, 0 ) + +IF( 57813X544X18712 IS NOT NULL AND 57813X544X18712 != '' AND 57813X544X18712 != '99', 1, 0 ) + +IF( 57813X544X18713 IS NOT NULL AND 57813X544X18713 != '' AND 57813X544X18713 != '99', 1, 0 ) + +IF( 57813X544X18714 IS NOT NULL AND 57813X544X18714 != '' AND 57813X544X18714 != '99', 1, 0 ) + +IF( 57813X544X18715 IS NOT NULL AND 57813X544X18715 != '' AND 57813X544X18715 != '99', 1, 0 ) + +IF( 57813X544X18716 IS NOT NULL AND 57813X544X18716 != '' AND 57813X544X18716 != '99', 1, 0 ) + +IF( 57813X544X18717 IS NOT NULL AND 57813X544X18717 != '' AND 57813X544X18717 != '99', 1, 0 ) + +IF( 57813X544X18718 IS NOT NULL AND 57813X544X18718 != '' AND 57813X544X18718 != '99', 1, 0 ) +) +) +) +/ COUNT(*) ), 4) as `AVG` +FROM `t1` +WHERE `submitdate` IS NOT NULL +AND ( +( 57813X541X17271 IS NOT NULL AND 57813X541X17271 != '' AND 57813X541X17271 != '99' ) OR +( 57813X541X17272 IS NOT NULL AND 57813X541X17272 != '' AND 57813X541X17272 != '99' ) OR +( 57813X541X17273 IS NOT NULL AND 57813X541X17273 != '' AND 57813X541X17273 != '99' ) OR +( 57813X541X17274 IS NOT NULL AND 57813X541X17274 != '' AND 57813X541X17274 != '99' ) OR +( 57813X541X17275 IS NOT NULL AND 57813X541X17275 != '' AND 57813X541X17275 != '99' ) OR +( 57813X541X17276 IS NOT NULL AND 57813X541X17276 != '' AND 57813X541X17276 != '99' ) OR +( 57813X542X18131 IS NOT NULL AND 57813X542X18131 != '' AND 57813X542X18131 != '99' ) OR +( 57813X542X18132 IS NOT NULL AND 57813X542X18132 != '' AND 57813X542X18132 != '99' ) OR +( 57813X542X18133 IS NOT NULL AND 57813X542X18133 != '' AND 57813X542X18133 != '99' ) OR +( 57813X542X18134 IS NOT NULL AND 57813X542X18134 != '' AND 57813X542X18134 != '99' ) OR +( 57813X542X18135 IS NOT NULL AND 57813X542X18135 != '' AND 57813X542X18135 != '99' ) OR +( 57813X542X18136 IS NOT NULL AND 57813X542X18136 != '' AND 57813X542X18136 != '99' ) OR +( 57813X542X18137 IS NOT NULL AND 57813X542X18137 != '' AND 57813X542X18137 != '99' ) OR +( 57813X542X18138 IS NOT NULL AND 57813X542X18138 != '' AND 57813X542X18138 != '99' ) OR +( 57813X542X18139 IS NOT NULL AND 57813X542X18139 != '' AND 57813X542X18139 != '99' ) OR +( 57813X543X18451 IS NOT NULL AND 57813X543X18451 != '' AND 57813X543X18451 != '99' ) OR +( 57813X543X18452 IS NOT NULL AND 57813X543X18452 != '' AND 57813X543X18452 != '99' ) OR +( 57813X543X18453 IS NOT NULL AND 57813X543X18453 != '' AND 57813X543X18453 != '99' ) OR +( 57813X543X18454 IS NOT NULL AND 57813X543X18454 != '' AND 57813X543X18454 != '99' ) OR +( 57813X543X18455 IS NOT NULL AND 57813X543X18455 != '' AND 57813X543X18455 != '99' ) OR +( 57813X543X18456 IS NOT NULL AND 57813X543X18456 != '' AND 57813X543X18456 != '99' ) OR +( 57813X544X18711 IS NOT NULL AND 57813X544X18711 != '' AND 57813X544X18711 != '99' ) OR +( 57813X544X18712 IS NOT NULL AND 57813X544X18712 != '' AND 57813X544X18712 != '99' ) OR +( 57813X544X18713 IS NOT NULL AND 57813X544X18713 != '' AND 57813X544X18713 != '99' ) OR +( 57813X544X18714 IS NOT NULL AND 57813X544X18714 != '' AND 57813X544X18714 != '99' ) OR +( 57813X544X18715 IS NOT NULL AND 57813X544X18715 != '' AND 57813X544X18715 != '99' ) OR +( 57813X544X18716 IS NOT NULL AND 57813X544X18716 != '' AND 57813X544X18716 != '99' ) OR +( 57813X544X18717 IS NOT NULL AND 57813X544X18717 != '' AND 57813X544X18717 != '99' ) OR +( 57813X544X18718 IS NOT NULL AND 57813X544X18718 != '' AND 57813X544X18718 != '99' ) ) +AND 57813X540X1723 = 'Test'; +N AVG +0 NULL +drop table t1; +# # End of 5.5 tests # diff --git a/mysql-test/r/information_schema2.result b/mysql-test/r/information_schema2.result index 3f7f3ecd4e13468638ddaef955399c2ef540122d..7e9bdd7088f38f0ac749ebfbeacef98aa5c62997 100644 --- a/mysql-test/r/information_schema2.result +++ b/mysql-test/r/information_schema2.result @@ -6,15 +6,15 @@ select variable_name from information_schema.session_variables where variable_na (select variable_name from information_schema.session_variables where variable_name = 'basedir'); variable_name BASEDIR -create table t1 (a char); -insert t1 values ('a'),('t'),('z'); -flush status; -select a, exists (select 1 from information_schema.columns where table_schema=concat('tes',a)) from t1; -a exists (select 1 from information_schema.columns where table_schema=concat('tes',a)) -a 0 -t 1 -z 0 -show status like 'created_tmp_tables'; -Variable_name Value -Created_tmp_tables 38 -drop table t1; +create table t1 (x int); +create table t2 (x int); +create table t3 (x int); +create table t4 AS select table_name from information_schema.TABLES where table_schema = database() and table_type = 'BASE TABLE' ; +delete from t4 where table_name not in (select table_name from information_schema.TABLES where table_schema = database() and table_type = 'BASE TABLE'); +select * from t4; +table_name +t1 +t2 +t3 +t4 +drop table t1, t2, t3, t4; diff --git a/mysql-test/r/innodb_load_xa.result b/mysql-test/r/innodb_load_xa.result index e738ca6e3afb9b1e7aad222ad8ad8fbb28b33ec9..8b8de2032e5451843f3eefbf7e88a033996b9ed6 100644 --- a/mysql-test/r/innodb_load_xa.result +++ b/mysql-test/r/innodb_load_xa.result @@ -18,3 +18,5 @@ mysqld-bin.000001 # Query # # use `test`; insert t1 values (2) mysqld-bin.000001 # Query # # COMMIT drop table t1; uninstall plugin innodb; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff --git a/mysql-test/r/loadxml.result b/mysql-test/r/loadxml.result index 7742f456252902bafce50db3641bf48bfbae02ae..1128caf91225c19d91b844790ed24e516c10f03e 100644 --- a/mysql-test/r/loadxml.result +++ b/mysql-test/r/loadxml.result @@ -93,3 +93,30 @@ a b 216 !&bb b; 3 !b3 DROP TABLE t1; +# +# Bug#16171518 LOAD XML DOES NOT HANDLE EMPTY ELEMENTS +# +CREATE TABLE t1 (col1 VARCHAR(3), col2 VARCHAR(3), col3 VARCHAR(3), col4 VARCHAR(4)); +LOAD XML INFILE '../../std_data/bug16171518_1.dat' INTO TABLE t1; +SELECT * FROM t1 ORDER BY col1, col2, col3, col4; +col1 col2 col3 col4 +0bc def ghi jkl +1no NULL pqr stu +2BC DEF GHI JKL +3NO NULL PQR STU +4bc def ghi jkl +5no pqr stu vwx +6BC DEF NULL JKL +7NO PQR STU VWX +8bc def ghi NULL +9kl NULL mno pqr +ABC DEF NULL JKL +MNO NULL STU VWX +DROP TABLE t1; +CREATE TABLE t1 (col1 VARCHAR(3), col2 VARCHAR(3), col3 INTEGER); +LOAD XML INFILE '../../std_data/bug16171518_2.dat' INTO TABLE t1; +SELECT * FROM t1 ORDER BY col1, col2, col3; +col1 col2 col3 +ABC DEF NULL +GHI NULL 123 +DROP TABLE t1; diff --git a/mysql-test/r/lowercase_fs_on.result b/mysql-test/r/lowercase_fs_on.result new file mode 100644 index 0000000000000000000000000000000000000000..a090f46cfbf8b057433dce6a26c06b872430ab6d --- /dev/null +++ b/mysql-test/r/lowercase_fs_on.result @@ -0,0 +1,3 @@ +# +# Bug#20198490 : LOWER_CASE_TABLE_NAMES=0 ON WINDOWS LEADS TO PROBLEMS +# diff --git a/mysql-test/r/lowercase_table3.result b/mysql-test/r/lowercase_table3.result deleted file mode 100644 index 22e80aaeb26b67f5141f85a551f021d684cf4d5e..0000000000000000000000000000000000000000 --- a/mysql-test/r/lowercase_table3.result +++ /dev/null @@ -1,11 +0,0 @@ -call mtr.add_suppression("Cannot find or open table test/BUG29839 from"); -DROP TABLE IF EXISTS t1,T1; -CREATE TABLE t1 (a INT); -SELECT * FROM T1; -a -FLUSH TABLES; -DROP TABLE t1; -CREATE TABLE bug29839 (a INT) ENGINE=INNODB; -SELECT * FROM BUG29839; -ERROR 42S02: Table 'test.BUG29839' doesn't exist -DROP TABLE bug29839; diff --git a/mysql-test/r/merge_recover.result b/mysql-test/r/myisam_recover.result similarity index 62% rename from mysql-test/r/merge_recover.result rename to mysql-test/r/myisam_recover.result index 871c12ca4c001af9e94d43feabef89f65b4a51e7..0829c1e8b82da7443fc47e1b548c8f4e94b88359 100644 --- a/mysql-test/r/merge_recover.result +++ b/mysql-test/r/myisam_recover.result @@ -1,5 +1,7 @@ # -# Test of MyISAM MRG tables with corrupted children. +# Tests for corrupted MyISAM tables and MyISAMMRG tables with corrupted +# children.. +# # Run with --myisam-recover=force option. # # Preparation: we need to make sure that the merge parent @@ -44,20 +46,20 @@ drop procedure p_create; # Switching to connection 'default' # # -# We have to disable the ps-protocol, to avoid +# We have to disable the ps-protocol, to avoid # "Prepared statement needs to be re-prepared" errors # -- table def versions change all the time with full table cache. -# +# drop table if exists t1, t1_mrg, t1_copy; # # Prepare a MERGE engine table, that refers to a corrupted # child. -# +# create table t1 (a int, key(a)) engine=myisam; create table t1_mrg (a int) union (t1) engine=merge; # # Create a table with a corrupted index file: -# save an old index file, insert more rows, +# save an old index file, insert more rows, # overwrite the new index file with the old one. # insert into t1 (a) values (1), (2), (3); @@ -101,3 +103,48 @@ execute stmt; deallocate prepare stmt; set @@global.table_definition_cache=default; set @@global.table_open_cache=default; +# +# 18075170 - sql node restart required to avoid deadlock after +# restore +# +# Check that auto-repair for MyISAM tables can now happen in the +# middle of transaction, without aborting it. +create table t1 (a int, key(a)) engine=myisam; +create table t2 (a int); +insert into t2 values (1); +# Create a table with a corrupted index file: +# save an old index file, insert more rows, +# overwrite the new index file with the old one. +insert into t1 (a) values (1); +flush table t1; +insert into t1 (a) values (4); +flush table t1; +# Check table is needed to mark the table as crashed. +check table t1; +Table Op Msg_type Msg_text +test.t1 check warning Size of datafile is: 14 Should be: 7 +test.t1 check error Record-count is not ok; is 2 Should be: 1 +test.t1 check warning Found 2 key parts. Should be: 1 +test.t1 check error Corrupt +# At this point we have a corrupt t1 +set autocommit = 0; +select * from t2; +a +1 +# Without fix select from t1 will break the transaction. After the fix +# transaction should be active and should hold lock on table t2. Alter +# table from con2 will wait only if the transaction is not broken. +select * from t1; +a +1 +4 +Warnings: +Error 145 Table 't1' is marked as crashed and should be repaired +Error 1194 Table 't1' is marked as crashed and should be repaired +Error 1034 Number of rows changed from 1 to 2 +ALTER TABLE t2 ADD val INT; +# With fix we should have alter table waiting for t2 lock here. +ROLLBACK; +SET autocommit = 1; +# Cleanup +drop table t1, t2; diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index 49fd19927fcc6a5e79761008252cbdb9d74b2a12..43601f4a7c69b528b7a9a9b003895564e665e16e 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -4292,7 +4292,6 @@ Abernathy aberrant aberration drop table words; -mysqlimport: Error: 1146, Table 'test.words' doesn't exist, when using table: words drop table t1; drop table t2; drop table words2; @@ -5281,6 +5280,34 @@ drop table t1, t2; # # End of 5.1 tests # +# +# Bug #20772273 : MYSQLIMPORT --USE-THREADS DOESN'T USE MULTIPLE THREADS +# +CREATE DATABASE db_20772273; +USE db_20772273; +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES (1), (2); +CREATE TABLE t2(a INT); +INSERT INTO t2 VALUES (3), (4); +SELECT * FROM t1; +a +1 +2 +SELECT * FROM t2; +a +3 +4 +SELECT * FROM t1; +a +1 +2 +SELECT * FROM t2; +a +3 +4 +DROP TABLE t1; +DROP TABLE t2; +DROP DATABASE db_20772273; Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] diff --git a/mysql-test/r/partition_error.result b/mysql-test/r/partition_error.result index 0fe1034d447fa285300b1b5943ceec3f738a5cce..0c15ded0d73f5a6d0338ba1864b6d95b0159cb09 100644 --- a/mysql-test/r/partition_error.result +++ b/mysql-test/r/partition_error.result @@ -1089,7 +1089,7 @@ partition by key (a) subpartition by hash (sin(a+b)) (partition x1 (subpartition x11, subpartition x12), partition x2 (subpartition x21, subpartition x22)); -ERROR HY000: It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning +ERROR HY000: This partition function is not allowed select load_file('$MYSQLD_DATADIR/test/t1.par'); load_file('$MYSQLD_DATADIR/test/t1.par') NULL diff --git a/mysql-test/r/sp-group.result b/mysql-test/r/sp-group.result new file mode 100644 index 0000000000000000000000000000000000000000..9744bbee6b6547b3fc671140e7bfd4d44ef35276 --- /dev/null +++ b/mysql-test/r/sp-group.result @@ -0,0 +1,156 @@ +drop table if exists t1; +Warnings: +Note 1051 Unknown table 't1' +drop view if exists view_t1; +Warnings: +Note 1051 Unknown table 'test.view_t1' +SET sql_mode=ONLY_FULL_GROUP_BY; +CREATE TABLE t1 ( +pk INT, +f0 INT, f1 INT, f2 INT, f3 INT, f4 INT, +f5 INT, f6 INT, f7 INT, f8 INT, f9 INT, +PRIMARY KEY (pk) +); +CREATE VIEW view_t1 AS SELECT * FROM t1; +CREATE PROCEDURE s1() +SELECT * FROM ( +INFORMATION_SCHEMA.`INNODB_BUFFER_PAGE_LRU` AS table1 +LEFT JOIN test.view_t1 AS table2 +ON ( table2.`f6` = table1.FREE_PAGE_CLOCK) +) +ORDER BY table1.NUMBER_RECORDS +LIMIT 0 +; +CALL s1; +POOL_ID LRU_POSITION SPACE PAGE_NUMBER PAGE_TYPE FLUSH_TYPE FIX_COUNT IS_HASHED NEWEST_MODIFICATION OLDEST_MODIFICATION ACCESS_TIME TABLE_NAME INDEX_NAME NUMBER_RECORDS DATA_SIZE COMPRESSED_SIZE COMPRESSED IO_FIX IS_OLD FREE_PAGE_CLOCK pk f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 +CALL s1; +POOL_ID LRU_POSITION SPACE PAGE_NUMBER PAGE_TYPE FLUSH_TYPE FIX_COUNT IS_HASHED NEWEST_MODIFICATION OLDEST_MODIFICATION ACCESS_TIME TABLE_NAME INDEX_NAME NUMBER_RECORDS DATA_SIZE COMPRESSED_SIZE COMPRESSED IO_FIX IS_OLD FREE_PAGE_CLOCK pk f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 +drop table t1; +drop view view_t1; +drop procedure s1; +CREATE TABLE A ( +pk INTEGER AUTO_INCREMENT, +col_int_key INTEGER, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk) +) ENGINE=MyISAM; +CREATE VIEW view_A AS SELECT * FROM A; +CREATE TABLE C ( +pk INTEGER AUTO_INCREMENT, +col_int_nokey INTEGER, +col_int_key INTEGER, +col_date_key DATE, +col_date_nokey DATE, +col_time_key TIME, +col_time_nokey TIME, +col_datetime_key DATETIME, +col_datetime_nokey DATETIME, +col_varchar_key VARCHAR(1), +col_varchar_nokey VARCHAR(1), +PRIMARY KEY (pk) +) ENGINE=MyISAM; +CREATE VIEW view_C AS SELECT * FROM C; +CREATE TABLE AA ( +pk INTEGER AUTO_INCREMENT, +col_int_nokey INTEGER, +col_int_key INTEGER, +col_date_key DATE, +col_date_nokey DATE, +col_time_key TIME, +col_time_nokey TIME, +col_datetime_key DATETIME, +col_datetime_nokey DATETIME, +col_varchar_key VARCHAR(1), +col_varchar_nokey VARCHAR(1), +PRIMARY KEY (pk), +KEY (col_varchar_key, col_int_key) +) ENGINE=MyISAM; +CREATE VIEW view_AA AS SELECT * FROM AA; +CREATE TABLE BB ( +pk INTEGER AUTO_INCREMENT, +col_int_key INTEGER, +col_varchar_key VARCHAR(1), +col_varchar_nokey VARCHAR(1), +PRIMARY KEY (pk), +KEY (col_varchar_key, col_int_key) +) ENGINE=MyISAM; +CREATE VIEW view_BB AS SELECT * FROM BB; +CREATE TABLE DD ( +pk INTEGER AUTO_INCREMENT, +col_int_key INTEGER, +col_date_key DATE, +col_time_key TIME, +col_datetime_key DATETIME, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY (col_varchar_key, col_int_key) +) ENGINE=MyISAM; +CREATE VIEW view_DD AS SELECT * FROM DD; +CREATE TRIGGER k BEFORE INSERT ON `DD` FOR EACH ROW INSERT INTO `view_BB` SELECT * FROM `view_A` LIMIT 0 ; +CREATE TRIGGER r BEFORE INSERT ON `A` FOR EACH ROW INSERT INTO `view_AA` SELECT * FROM `view_C` LIMIT 0 ; +ALTER TABLE `DD` DROP PRIMARY KEY; +ERROR 42000: Incorrect table definition; there can be only one auto column and it must be defined as a key +INSERT INTO `view_A` ( `pk` ) VALUES (NULL); +INSERT INTO `DD` ( `pk` ) VALUES (NULL); +INSERT INTO `A` ( `pk` ) VALUES (NULL); +INSERT INTO `view_DD` ( `pk` ) VALUES (NULL); +drop trigger r; +drop trigger k; +drop view view_A,view_AA,view_C,view_BB,view_DD; +drop table A,C,AA,BB,DD; +CREATE TABLE A ( +i INT, +i1 INT, +i2 INT, +d1 DATE, +d2 DATE, +col_time_nokey1 TIME, +col_time_nokey2 TIME, +col_datetime_nokey1 DATETIME, +col_datetime_nokey2 DATETIME, +col_varchar_nokey1 VARCHAR(1), +col_varchar_nokey2 VARCHAR(1) +) ENGINE=MyISAM; +CREATE VIEW view_A AS SELECT * FROM A; +CREATE TABLE B ( +col_varchar_nokey VARCHAR(1) +) ENGINE=MyISAM; +CREATE TABLE AA ( +i INT, +i1 INT, +i2 INT, +d1 DATE, +d2 DATE, +col_time_nokey1 TIME, +col_time_nokey2 TIME, +col_datetime_nokey1 DATETIME, +col_datetime_nokey2 DATETIME, +col_varchar_nokey1 VARCHAR(1), +col_varchar_nokey2 VARCHAR(1) +) ENGINE=MyISAM; +CREATE VIEW view_AA AS SELECT * FROM AA; +CREATE TABLE DD ( +i INT, +i1 INT, +i2 INT, +d1 DATE, +d2 DATE, +col_time_nokey1 TIME, +col_time_nokey2 TIME, +col_datetime_nokey1 DATETIME, +col_datetime_nokey2 DATETIME, +col_varchar_nokey1 VARCHAR(1), +col_varchar_nokey2 VARCHAR(1) +) ENGINE=MyISAM; +CREATE VIEW view_DD AS SELECT * FROM DD; +CREATE TRIGGER tr1 BEFORE INSERT ON `AA` FOR EACH ROW INSERT INTO `view_A` SELECT * FROM `view_AA` LIMIT 0 ; +CREATE TRIGGER tr2 BEFORE INSERT ON `B` FOR EACH ROW INSERT INTO `D` SELECT * FROM `A` LIMIT 0 ; +INSERT INTO `view_AA` ( `i` ) VALUES (1); +INSERT INTO `AA` ( `i` ) VALUES (2); +DELETE FROM `B`; +INSERT INTO `view_DD` ( `i` ) VALUES (1); +INSERT INTO `view_AA` ( `i` ) VALUES (3); +drop trigger tr1; +drop trigger tr2; +drop view view_A, view_AA,view_DD; +drop table A,B,AA,DD; diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 4afde93925d8cb24b644836d636b70047dadd6ac..ba52fd90da640897369b292fa7d38c456beed967 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -81,7 +81,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); ERROR HY000: Incorrect usage of PROCEDURE and subquery SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); -ERROR HY000: Incorrect parameters to procedure 'ANALYSE' +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1))' at line 1 SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; ERROR 42S22: Unknown column 'a' in 'field list' SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; @@ -3590,7 +3590,7 @@ delete from t1 where c <= 1140006215 and (select b from t2 where a = 2) = 1; drop table t1, t2; CREATE TABLE t1 (a INT); CREATE VIEW v1 AS SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); -ERROR 42S22: Unknown column 'no_such_column' in 'where clause' +ERROR 42S22: Unknown column 'no_such_column' in 'IN/ALL/ANY subquery' CREATE VIEW v2 AS SELECT * FROM t1 WHERE no_such_column = (SELECT 1); ERROR 42S22: Unknown column 'no_such_column' in 'where clause' SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); @@ -7015,3 +7015,69 @@ select exists(select 1 from t1 group by `c` in (select `c` from t1)); exists(select 1 from t1 group by `c` in (select `c` from t1)) 0 drop table t1; +# +# MDEV-7565: Server crash with Signal 6 (part 2) +# +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` +From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +ControlRev +NULL +# +# MDEV-7445:Server crash with Signal 6 +# +CREATE PROCEDURE procedure2() +BEGIN +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` + From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +END | +call procedure2(); +ControlRev +NULL +call procedure2(); +ControlRev +NULL +drop procedure procedure2; +SELECT +(SELECT user FROM mysql.user +WHERE h.host in (SELECT host FROM mysql.user) +) AS sq +FROM mysql.host h GROUP BY h.host; +sq +# +# MDEV-7846:Server crashes in Item_subselect::fix +#_fields or fails with Thread stack overrun +# +CREATE TABLE t1 (column1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (3),(9); +CREATE TABLE t2 (column2 INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1),(4); +CREATE TABLE t3 (column3 INT) ENGINE=MyISAM; +INSERT INTO t3 VALUES (6),(8); +CREATE TABLE t4 (column4 INT) ENGINE=MyISAM; +INSERT INTO t4 VALUES (2),(5); +PREPARE stmt FROM " +SELECT ( + SELECT MAX( table1.column1 ) AS field1 + FROM t1 AS table1 + WHERE table3.column3 IN ( SELECT table2.column2 AS field2 FROM t2 AS table2 ) +) AS sq +FROM t3 AS table3, t4 AS table4 GROUP BY sq +"; +EXECUTE stmt; +sq +NULL +EXECUTE stmt; +sq +NULL +deallocate prepare stmt; +drop table t1,t2,t3,t4; diff --git a/mysql-test/r/subselect_mat.result b/mysql-test/r/subselect_mat.result index 7039bbfca150076648b75e03c80d4b0044bf2bf3..e4843929fcb005625f5f025a4368e3634ff02190 100644 --- a/mysql-test/r/subselect_mat.result +++ b/mysql-test/r/subselect_mat.result @@ -2145,6 +2145,24 @@ drop database mysqltest1; drop database mysqltest2; drop database mysqltest3; drop database mysqltest4; +# +# MDEV-7810 Wrong result on execution of a query as a PS +# (both 1st and further executions) +CREATE TABLE t1 (a INT NOT NULL) ENGINE=MyISAM; +INSERT INTO t1 VALUES (0),(8); +SELECT a FROM (SELECT DISTINCT * FROM t1) AS sq WHERE a IN (SELECT MIN(t2.a) FROM (t1 AS t2)); +a +0 +PREPARE stmt FROM " +SELECT a FROM (SELECT DISTINCT * FROM t1) AS sq WHERE a IN (SELECT MIN(t2.a) FROM (t1 AS t2)) +"; +execute stmt; +a +0 +execute stmt; +a +0 +drop table t1; # End of 5.5 tests set @subselect_mat_test_optimizer_switch_value=null; set @@optimizer_switch='materialization=on,in_to_exists=off,semijoin=off'; diff --git a/mysql-test/r/subselect_no_mat.result b/mysql-test/r/subselect_no_mat.result index 9df216da3cb87b5568d8984696defab10b0fc95e..d8d5c4ef60420af9133bef91d99539dc357921c3 100644 --- a/mysql-test/r/subselect_no_mat.result +++ b/mysql-test/r/subselect_no_mat.result @@ -88,7 +88,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); ERROR HY000: Incorrect usage of PROCEDURE and subquery SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); -ERROR HY000: Incorrect parameters to procedure 'ANALYSE' +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1))' at line 1 SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; ERROR 42S22: Unknown column 'a' in 'field list' SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; @@ -3594,7 +3594,7 @@ delete from t1 where c <= 1140006215 and (select b from t2 where a = 2) = 1; drop table t1, t2; CREATE TABLE t1 (a INT); CREATE VIEW v1 AS SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); -ERROR 42S22: Unknown column 'no_such_column' in 'where clause' +ERROR 42S22: Unknown column 'no_such_column' in 'IN/ALL/ANY subquery' CREATE VIEW v2 AS SELECT * FROM t1 WHERE no_such_column = (SELECT 1); ERROR 42S22: Unknown column 'no_such_column' in 'where clause' SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); @@ -7012,6 +7012,72 @@ select exists(select 1 from t1 group by `c` in (select `c` from t1)); exists(select 1 from t1 group by `c` in (select `c` from t1)) 0 drop table t1; +# +# MDEV-7565: Server crash with Signal 6 (part 2) +# +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` +From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +ControlRev +NULL +# +# MDEV-7445:Server crash with Signal 6 +# +CREATE PROCEDURE procedure2() +BEGIN +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` + From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +END | +call procedure2(); +ControlRev +NULL +call procedure2(); +ControlRev +NULL +drop procedure procedure2; +SELECT +(SELECT user FROM mysql.user +WHERE h.host in (SELECT host FROM mysql.user) +) AS sq +FROM mysql.host h GROUP BY h.host; +sq +# +# MDEV-7846:Server crashes in Item_subselect::fix +#_fields or fails with Thread stack overrun +# +CREATE TABLE t1 (column1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (3),(9); +CREATE TABLE t2 (column2 INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1),(4); +CREATE TABLE t3 (column3 INT) ENGINE=MyISAM; +INSERT INTO t3 VALUES (6),(8); +CREATE TABLE t4 (column4 INT) ENGINE=MyISAM; +INSERT INTO t4 VALUES (2),(5); +PREPARE stmt FROM " +SELECT ( + SELECT MAX( table1.column1 ) AS field1 + FROM t1 AS table1 + WHERE table3.column3 IN ( SELECT table2.column2 AS field2 FROM t2 AS table2 ) +) AS sq +FROM t3 AS table3, t4 AS table4 GROUP BY sq +"; +EXECUTE stmt; +sq +NULL +EXECUTE stmt; +sq +NULL +deallocate prepare stmt; +drop table t1,t2,t3,t4; set optimizer_switch=default; select @@optimizer_switch like '%materialization=on%'; @@optimizer_switch like '%materialization=on%' diff --git a/mysql-test/r/subselect_no_opts.result b/mysql-test/r/subselect_no_opts.result index 7b93f277274366293cf69cb1fe7a8bf459ac3f31..78908bc61db3076a114885f94ba8e50579c6898d 100644 --- a/mysql-test/r/subselect_no_opts.result +++ b/mysql-test/r/subselect_no_opts.result @@ -84,7 +84,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); ERROR HY000: Incorrect usage of PROCEDURE and subquery SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); -ERROR HY000: Incorrect parameters to procedure 'ANALYSE' +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1))' at line 1 SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; ERROR 42S22: Unknown column 'a' in 'field list' SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; @@ -3590,7 +3590,7 @@ delete from t1 where c <= 1140006215 and (select b from t2 where a = 2) = 1; drop table t1, t2; CREATE TABLE t1 (a INT); CREATE VIEW v1 AS SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); -ERROR 42S22: Unknown column 'no_such_column' in 'where clause' +ERROR 42S22: Unknown column 'no_such_column' in 'IN/ALL/ANY subquery' CREATE VIEW v2 AS SELECT * FROM t1 WHERE no_such_column = (SELECT 1); ERROR 42S22: Unknown column 'no_such_column' in 'where clause' SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); @@ -7010,4 +7010,70 @@ select exists(select 1 from t1 group by `c` in (select `c` from t1)); exists(select 1 from t1 group by `c` in (select `c` from t1)) 0 drop table t1; +# +# MDEV-7565: Server crash with Signal 6 (part 2) +# +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` +From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +ControlRev +NULL +# +# MDEV-7445:Server crash with Signal 6 +# +CREATE PROCEDURE procedure2() +BEGIN +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` + From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +END | +call procedure2(); +ControlRev +NULL +call procedure2(); +ControlRev +NULL +drop procedure procedure2; +SELECT +(SELECT user FROM mysql.user +WHERE h.host in (SELECT host FROM mysql.user) +) AS sq +FROM mysql.host h GROUP BY h.host; +sq +# +# MDEV-7846:Server crashes in Item_subselect::fix +#_fields or fails with Thread stack overrun +# +CREATE TABLE t1 (column1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (3),(9); +CREATE TABLE t2 (column2 INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1),(4); +CREATE TABLE t3 (column3 INT) ENGINE=MyISAM; +INSERT INTO t3 VALUES (6),(8); +CREATE TABLE t4 (column4 INT) ENGINE=MyISAM; +INSERT INTO t4 VALUES (2),(5); +PREPARE stmt FROM " +SELECT ( + SELECT MAX( table1.column1 ) AS field1 + FROM t1 AS table1 + WHERE table3.column3 IN ( SELECT table2.column2 AS field2 FROM t2 AS table2 ) +) AS sq +FROM t3 AS table3, t4 AS table4 GROUP BY sq +"; +EXECUTE stmt; +sq +NULL +EXECUTE stmt; +sq +NULL +deallocate prepare stmt; +drop table t1,t2,t3,t4; set @optimizer_switch_for_subselect_test=null; diff --git a/mysql-test/r/subselect_no_scache.result b/mysql-test/r/subselect_no_scache.result index b6d3a89ea7ad82634ef943f5640495497b8586dc..d1de4b8f3703ac4775543e2f7bf16e5630740d10 100644 --- a/mysql-test/r/subselect_no_scache.result +++ b/mysql-test/r/subselect_no_scache.result @@ -87,7 +87,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); ERROR HY000: Incorrect usage of PROCEDURE and subquery SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); -ERROR HY000: Incorrect parameters to procedure 'ANALYSE' +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1))' at line 1 SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; ERROR 42S22: Unknown column 'a' in 'field list' SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; @@ -3596,7 +3596,7 @@ delete from t1 where c <= 1140006215 and (select b from t2 where a = 2) = 1; drop table t1, t2; CREATE TABLE t1 (a INT); CREATE VIEW v1 AS SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); -ERROR 42S22: Unknown column 'no_such_column' in 'where clause' +ERROR 42S22: Unknown column 'no_such_column' in 'IN/ALL/ANY subquery' CREATE VIEW v2 AS SELECT * FROM t1 WHERE no_such_column = (SELECT 1); ERROR 42S22: Unknown column 'no_such_column' in 'where clause' SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); @@ -7021,6 +7021,72 @@ select exists(select 1 from t1 group by `c` in (select `c` from t1)); exists(select 1 from t1 group by `c` in (select `c` from t1)) 0 drop table t1; +# +# MDEV-7565: Server crash with Signal 6 (part 2) +# +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` +From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +ControlRev +NULL +# +# MDEV-7445:Server crash with Signal 6 +# +CREATE PROCEDURE procedure2() +BEGIN +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` + From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +END | +call procedure2(); +ControlRev +NULL +call procedure2(); +ControlRev +NULL +drop procedure procedure2; +SELECT +(SELECT user FROM mysql.user +WHERE h.host in (SELECT host FROM mysql.user) +) AS sq +FROM mysql.host h GROUP BY h.host; +sq +# +# MDEV-7846:Server crashes in Item_subselect::fix +#_fields or fails with Thread stack overrun +# +CREATE TABLE t1 (column1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (3),(9); +CREATE TABLE t2 (column2 INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1),(4); +CREATE TABLE t3 (column3 INT) ENGINE=MyISAM; +INSERT INTO t3 VALUES (6),(8); +CREATE TABLE t4 (column4 INT) ENGINE=MyISAM; +INSERT INTO t4 VALUES (2),(5); +PREPARE stmt FROM " +SELECT ( + SELECT MAX( table1.column1 ) AS field1 + FROM t1 AS table1 + WHERE table3.column3 IN ( SELECT table2.column2 AS field2 FROM t2 AS table2 ) +) AS sq +FROM t3 AS table3, t4 AS table4 GROUP BY sq +"; +EXECUTE stmt; +sq +NULL +EXECUTE stmt; +sq +NULL +deallocate prepare stmt; +drop table t1,t2,t3,t4; set optimizer_switch=default; select @@optimizer_switch like '%subquery_cache=on%'; @@optimizer_switch like '%subquery_cache=on%' diff --git a/mysql-test/r/subselect_no_semijoin.result b/mysql-test/r/subselect_no_semijoin.result index d51d211e71de811dbaca6ea98e5ef340898a8f4a..524a5ddc1a6c26286a67ccf6eb4fbaa981ed9730 100644 --- a/mysql-test/r/subselect_no_semijoin.result +++ b/mysql-test/r/subselect_no_semijoin.result @@ -84,7 +84,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); ERROR HY000: Incorrect usage of PROCEDURE and subquery SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); -ERROR HY000: Incorrect parameters to procedure 'ANALYSE' +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1))' at line 1 SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; ERROR 42S22: Unknown column 'a' in 'field list' SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; @@ -3590,7 +3590,7 @@ delete from t1 where c <= 1140006215 and (select b from t2 where a = 2) = 1; drop table t1, t2; CREATE TABLE t1 (a INT); CREATE VIEW v1 AS SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); -ERROR 42S22: Unknown column 'no_such_column' in 'where clause' +ERROR 42S22: Unknown column 'no_such_column' in 'IN/ALL/ANY subquery' CREATE VIEW v2 AS SELECT * FROM t1 WHERE no_such_column = (SELECT 1); ERROR 42S22: Unknown column 'no_such_column' in 'where clause' SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1); @@ -7010,5 +7010,71 @@ select exists(select 1 from t1 group by `c` in (select `c` from t1)); exists(select 1 from t1 group by `c` in (select `c` from t1)) 0 drop table t1; +# +# MDEV-7565: Server crash with Signal 6 (part 2) +# +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` +From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +ControlRev +NULL +# +# MDEV-7445:Server crash with Signal 6 +# +CREATE PROCEDURE procedure2() +BEGIN +Select +(Select Sum(`TestCase`.Revenue) From mysql.slow_log E +Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +) As `ControlRev` + From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; +END | +call procedure2(); +ControlRev +NULL +call procedure2(); +ControlRev +NULL +drop procedure procedure2; +SELECT +(SELECT user FROM mysql.user +WHERE h.host in (SELECT host FROM mysql.user) +) AS sq +FROM mysql.host h GROUP BY h.host; +sq +# +# MDEV-7846:Server crashes in Item_subselect::fix +#_fields or fails with Thread stack overrun +# +CREATE TABLE t1 (column1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (3),(9); +CREATE TABLE t2 (column2 INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1),(4); +CREATE TABLE t3 (column3 INT) ENGINE=MyISAM; +INSERT INTO t3 VALUES (6),(8); +CREATE TABLE t4 (column4 INT) ENGINE=MyISAM; +INSERT INTO t4 VALUES (2),(5); +PREPARE stmt FROM " +SELECT ( + SELECT MAX( table1.column1 ) AS field1 + FROM t1 AS table1 + WHERE table3.column3 IN ( SELECT table2.column2 AS field2 FROM t2 AS table2 ) +) AS sq +FROM t3 AS table3, t4 AS table4 GROUP BY sq +"; +EXECUTE stmt; +sq +NULL +EXECUTE stmt; +sq +NULL +deallocate prepare stmt; +drop table t1,t2,t3,t4; set @optimizer_switch_for_subselect_test=null; set @join_cache_level_for_subselect_test=NULL; diff --git a/mysql-test/r/subselect_sj_mat.result b/mysql-test/r/subselect_sj_mat.result index 58810670395f1563de3f78c62b7befbb305b2f4d..cfcbf612030e5a7b7c2ac3a7d4cf0618a89d8129 100644 --- a/mysql-test/r/subselect_sj_mat.result +++ b/mysql-test/r/subselect_sj_mat.result @@ -2185,4 +2185,22 @@ drop database mysqltest1; drop database mysqltest2; drop database mysqltest3; drop database mysqltest4; +# +# MDEV-7810 Wrong result on execution of a query as a PS +# (both 1st and further executions) +CREATE TABLE t1 (a INT NOT NULL) ENGINE=MyISAM; +INSERT INTO t1 VALUES (0),(8); +SELECT a FROM (SELECT DISTINCT * FROM t1) AS sq WHERE a IN (SELECT MIN(t2.a) FROM (t1 AS t2)); +a +0 +PREPARE stmt FROM " +SELECT a FROM (SELECT DISTINCT * FROM t1) AS sq WHERE a IN (SELECT MIN(t2.a) FROM (t1 AS t2)) +"; +execute stmt; +a +0 +execute stmt; +a +0 +drop table t1; # End of 5.5 tests diff --git a/mysql-test/r/update.result b/mysql-test/r/update.result index 3f3a3ac07df546a94b59368d9eb17a65fba72cc5..3ea585536532e43ce682a1d714212bffc1e7a0ba 100644 --- a/mysql-test/r/update.result +++ b/mysql-test/r/update.result @@ -561,6 +561,21 @@ ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function DROP VIEW v1; DROP FUNCTION f1; DROP TABLE t1; +# Bug #21143080: UPDATE ON VARCHAR AND TEXT COLUMNS PRODUCE INCORRECT +# RESULTS +CREATE TABLE t1 (a VARCHAR(50), b TEXT, c CHAR(50)) ENGINE=INNODB; +INSERT INTO t1 (a, b, c) VALUES ('start trail', '', 'even longer string'); +UPDATE t1 SET b = a, a = 'inject'; +SELECT a, b FROM t1; +a b +inject start trail +UPDATE t1 SET b = c, c = 'inject'; +SELECT c, b FROM t1; +c b +inject even longer string +DROP TABLE t1; +# +# MDEV-3948 Assertion `records_are_comparable(table)' fails in compare_record(const TABLE*) on UPDATE with simple AND condition, index_merge+index_merge_intersection, InnoDB # # Verify that UPDATE does the same number of handler_update # operations, no matter if there is ORDER BY or not. diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index cbacb2c1ef8d0015d8b0a234aa1ca0cbe6cda9d7..57065d74274f1d8f1ddd3fd84cdf24fb5f30c3ed 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -4830,6 +4830,41 @@ View Create View character_set_client collation_connection v4 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v4` AS (select 'BUG#14117018' AS `col1`) union all (select '' AS `col2`) union all (select '' AS `Name_exp_1`) latin1 latin1_swedish_ci DROP VIEW v1, v2, v3, v4, v5; # +# BUG#19886430: VIEW CREATION WITH NAMED COLUMNS, OVER UNION, +# IS REJECTED +# Without the patch, reports an error. +CREATE VIEW v1 (fld1, fld2) AS +SELECT 1 AS a, 2 AS b +UNION ALL +SELECT 1 AS a, 1 AS a; +# The column names are explicitly specified and not duplicates, hence +# succeeds. +CREATE VIEW v2 (fld1, fld2) AS +SELECT 1 AS a, 2 AS a +UNION ALL +SELECT 1 AS a, 1 AS a; +# The column name in the first SELECT are not duplicates, hence succeeds. +CREATE VIEW v3 AS +SELECT 1 AS a, 2 AS b +UNION ALL +SELECT 1 AS a, 1 AS a; +# Should report an error, since the explicitly specified column names are +# duplicates. +CREATE VIEW v4 (fld1, fld1) AS +SELECT 1 AS a, 2 AS b +UNION ALL +SELECT 1 AS a, 1 AS a; +ERROR 42S21: Duplicate column name 'fld1' +# Should report an error, since duplicate column name is specified in the +# First SELECT. +CREATE VIEW v4 AS +SELECT 1 AS a, 2 AS a +UNION ALL +SELECT 1 AS a, 1 AS a; +ERROR 42S21: Duplicate column name 'a' +# Cleanup +DROP VIEW v1, v2, v3; +# # lp:833600 Wrong result with view + outer join + uncorrelated subquery (non-semijoin) # CREATE TABLE t1 ( a int, b int ); @@ -5429,6 +5464,21 @@ View Create View character_set_client collation_connection v2 CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select (`t1`.`b` + 1) AS `c` from `t1` latin1 latin1_swedish_ci drop view v2; drop table t1; +# +# MDEV-8554: Server crashes in base_list_iterator::next_fast on 1st execution of PS with a multi-table update +# +CREATE TABLE t1 (a INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (3),(4); +CREATE TABLE t3 (c INT) ENGINE=MyISAM; +INSERT INTO t3 VALUES (5),(6); +CREATE OR REPLACE ALGORITHM=MERGE VIEW v3 AS SELECT * FROM t3; +PREPARE stmt FROM 'UPDATE t1, t2 SET a = 1 WHERE a IN ( SELECT 0 FROM t3 )'; +UPDATE t1, t2 SET a = 1 WHERE a IN ( SELECT 0 FROM v3 ); +EXECUTE stmt; +DROP TABLE t1, t2, t3; +DROP VIEW v3; # ----------------------------------------------------------------- # -- End of 5.5 tests. # ----------------------------------------------------------------- diff --git a/mysql-test/std_data/bug16171518_1.dat b/mysql-test/std_data/bug16171518_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..b65b9359ce1a6c4a6a67764f3b652cdef85391cb --- /dev/null +++ b/mysql-test/std_data/bug16171518_1.dat @@ -0,0 +1,59 @@ + + + 0bc + def + ghi + jkl + + + 1no + + pqr + stu + + + + 2BC + DEF + GHI + JKL + + + 3NO + + PQR + STU + + + + + + + 6BC + DEF + + JKL + + + 7NO + PQR + STU + VWX + + + + 8bc + def + ghi + + + + 9kl + + mno + pqr + + + + + diff --git a/mysql-test/std_data/bug16171518_2.dat b/mysql-test/std_data/bug16171518_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..8a483337a0f47bb83d3ee47832562f32509a65de --- /dev/null +++ b/mysql-test/std_data/bug16171518_2.dat @@ -0,0 +1,12 @@ + + + ABC + DEF + + + + GHI + + 123 + + diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result index 469e670ae9d22dbf92d343a4f4904b8febcc3789..3604f5e8f8e114996b6aa46db392678f5a0250d8 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result @@ -1409,7 +1409,7 @@ BEGIN #010909 4:46:40 server id 1 end_log_pos # Write_rows: table id # flags: STMT_END_F ### INSERT INTO `test`.`t1` ### SET -### @1=000000124.450000000 /* DECIMAL(10,5) meta=2565 nullable=1 is_null=0 */ +### @1=124.45000 /* DECIMAL(10,5) meta=2565 nullable=1 is_null=0 */ # at # #010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0 SET TIMESTAMP=1000000000/*!*/; @@ -1426,7 +1426,7 @@ BEGIN #010909 4:46:40 server id 1 end_log_pos # Write_rows: table id # flags: STMT_END_F ### INSERT INTO `test`.`t1` ### SET -### @1=-000000543.210000000 /* DECIMAL(10,5) meta=2565 nullable=1 is_null=0 */ +### @1=-543.21000 /* DECIMAL(10,5) meta=2565 nullable=1 is_null=0 */ # at # #010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0 SET TIMESTAMP=1000000000/*!*/; @@ -1443,7 +1443,7 @@ BEGIN #010909 4:46:40 server id 1 end_log_pos # Delete_rows: table id # flags: STMT_END_F ### DELETE FROM `test`.`t1` ### WHERE -### @1=000000124.450000000 /* DECIMAL(10,5) meta=2565 nullable=1 is_null=0 */ +### @1=124.45000 /* DECIMAL(10,5) meta=2565 nullable=1 is_null=0 */ # at # #010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0 SET TIMESTAMP=1000000000/*!*/; diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result index 8e75d203ecc38c4f713b4668310e7bb89cefc84b..e942071abcd1438981b61b16ca00bef39a5f518f 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result @@ -2390,9 +2390,9 @@ BEGIN ### @22=-1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=0 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='1000:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=1000-01-01 00:00:00 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=75601 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2483,9 +2483,9 @@ BEGIN ### @22=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='9999:12:31' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=9999-12-31 23:59:59 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=2146522447 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2659,9 +2659,9 @@ BEGIN ### @22=-2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000001 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=1 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='2008:08:04' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=2008-08-04 16:18:06 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=1217855904 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2752,9 +2752,9 @@ BEGIN ### @22=-1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=0 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='1000:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=1000-01-01 00:00:00 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=75601 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2832,9 +2832,9 @@ BEGIN ### @22=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='9999:12:31' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=9999-12-31 23:59:59 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=2146522447 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2925,9 +2925,9 @@ BEGIN ### @22=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='9999:12:31' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=9999-12-31 23:59:59 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=2146522447 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3005,9 +3005,9 @@ BEGIN ### @22=-1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=0 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='1000:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=1000-01-01 00:00:00 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=75601 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3178,9 +3178,9 @@ BEGIN ### @22=-2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000001 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=1 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='2008:08:04' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=2008-08-04 16:18:06 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=1217855904 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3271,9 +3271,9 @@ BEGIN ### @22=-2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000001 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=1 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='2008:08:04' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=2008-08-04 16:18:06 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=1217855904 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3444,9 +3444,9 @@ BEGIN ### @22=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='9999:12:31' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=9999-12-31 23:59:59 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=2146522447 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3537,9 +3537,9 @@ BEGIN ### @22=-1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=0 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='1000:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=1000-01-01 00:00:00 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=75601 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3630,9 +3630,9 @@ BEGIN ### @22=-2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000001 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=1 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='2008:08:04' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=2008-08-04 16:18:06 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=1217855904 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result index b4ea8551ca62b76ad4e8451fb10f70f117061b8f..29a1704743c51d3ed8e231788253189600748a8e 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result @@ -2390,9 +2390,9 @@ BEGIN ### @22=-1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=0 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='1000:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=1000-01-01 00:00:00 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=75601 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2485,9 +2485,9 @@ BEGIN ### @22=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='9999:12:31' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=9999-12-31 23:59:59 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=2146522447 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2663,9 +2663,9 @@ BEGIN ### @22=-2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000001 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=1 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='2008:08:04' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=2008-08-04 16:18:06 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=1217855904 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2758,9 +2758,9 @@ BEGIN ### @22=-1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=0 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='1000:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=1000-01-01 00:00:00 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=75601 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2838,9 +2838,9 @@ BEGIN ### @22=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='9999:12:31' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=9999-12-31 23:59:59 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=2146522447 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -2933,9 +2933,9 @@ BEGIN ### @22=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='9999:12:31' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=9999-12-31 23:59:59 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=2146522447 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3013,9 +3013,9 @@ BEGIN ### @22=-1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=0 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='1000:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=1000-01-01 00:00:00 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=75601 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3188,9 +3188,9 @@ BEGIN ### @22=-2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000001 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=1 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='2008:08:04' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=2008-08-04 16:18:06 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=1217855904 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3283,9 +3283,9 @@ BEGIN ### @22=-2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000001 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=1 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='2008:08:04' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=2008-08-04 16:18:06 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=1217855904 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3458,9 +3458,9 @@ BEGIN ### @22=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='9999:12:31' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=9999-12-31 23:59:59 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=2146522447 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3553,9 +3553,9 @@ BEGIN ### @22=-1.797... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=0 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000000 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=0 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='1000:01:01' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=1000-01-01 00:00:00 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=75601 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ @@ -3648,9 +3648,9 @@ BEGIN ### @22=-2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @23=2.225... /* DOUBLE meta=8 nullable=1 is_null=0 */ ### @24=1 /* DOUBLE meta=8 nullable=1 is_null=0 */ -### @25=-000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @26=000000009.999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ -### @27=000000001 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @25=-9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @26=9999999999 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ +### @27=1 /* DECIMAL(10,0) meta=2560 nullable=1 is_null=0 */ ### @28='2008:08:04' /* DATE meta=0 nullable=1 is_null=0 */ ### @29=2008-08-04 16:18:06 /* DATETIME meta=0 nullable=1 is_null=0 */ ### @30=1217855904 /* TIMESTAMP meta=0 nullable=0 is_null=0 */ diff --git a/mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result b/mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result index ac36412c360fd17745c06dd6a93afc928d764f82..ed6e711af6b7b83177405d402d4e09a733f549c4 100644 --- a/mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result +++ b/mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result @@ -258,7 +258,7 @@ Warning 1196 Some non-transactional changed tables couldn't be rolled back create table t0 (n int); insert t0 select * from t1; set autocommit=1; -insert into t0 select GET_LOCK("lock1",null); +insert into t0 select GET_LOCK("lock1",0); set autocommit=0; create table t2 (n int) engine=innodb; insert into t2 values (3); diff --git a/mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result b/mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result index c10aa7abd0500d7acef606cbc7ca419f9aa6cfc4..7309c611d298c0c1f07f772869764d32be91b96d 100644 --- a/mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result +++ b/mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result @@ -242,7 +242,7 @@ Warning 1196 Some non-transactional changed tables couldn't be rolled back create table t0 (n int); insert t0 select * from t1; set autocommit=1; -insert into t0 select GET_LOCK("lock1",null); +insert into t0 select GET_LOCK("lock1",0); Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. set autocommit=0; @@ -288,7 +288,7 @@ master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # use `test`; insert t0 select * from t1 master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # BEGIN -master-bin.000001 # Query # # use `test`; insert into t0 select GET_LOCK("lock1",null) +master-bin.000001 # Query # # use `test`; insert into t0 select GET_LOCK("lock1",0) master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; create table t2 (n int) engine=innodb master-bin.000001 # Query # # use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t1`,`ti` diff --git a/mysql-test/suite/engines/iuds/r/strings_charsets_update_delete.result b/mysql-test/suite/engines/iuds/r/strings_charsets_update_delete.result index 08eecb1c17d52648b61184c98cfc97174e7be5cb..c1d0a7f03fb6509142cb1f9446a41f3454f426ed 100644 Binary files a/mysql-test/suite/engines/iuds/r/strings_charsets_update_delete.result and b/mysql-test/suite/engines/iuds/r/strings_charsets_update_delete.result differ diff --git a/mysql-test/suite/innodb/r/add_constraint.result b/mysql-test/suite/innodb/r/add_constraint.result new file mode 100644 index 0000000000000000000000000000000000000000..cbbcb4e8fa868f87caf73c05cab2b24db063e405 --- /dev/null +++ b/mysql-test/suite/innodb/r/add_constraint.result @@ -0,0 +1,13 @@ +# +# Bug #20762798 FK DDL: CRASH IN DICT_FOREIGN_REMOVE_FROM_CACHE +# +create table t1(a int, b int, key(a),key(b))engine=innodb; +create table t2(a int, b int, key(a),key(b))engine=innodb; +alter table t2 add constraint b foreign key (b) references t1(a); +alter table t1 add constraint b1 foreign key (b) references t2(a); +alter table t2 add constraint b1 foreign key (b) references t1(a); +ERROR HY000: Can't create table '#sql-temporary' (errno: 121) +alter table t2 drop foreign key b; +alter table t1 drop foreign key b1; +drop table t2; +drop table t1; diff --git a/mysql-test/suite/innodb/r/innodb-fk-warnings.result b/mysql-test/suite/innodb/r/innodb-fk-warnings.result new file mode 100644 index 0000000000000000000000000000000000000000..542fc972880b634c12957b1f356b785f0e4d8ad0 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-fk-warnings.result @@ -0,0 +1,105 @@ +CREATE TABLE t1 ( +id int(11) NOT NULL PRIMARY KEY, +a int(11) NOT NULL, +b int(11) NOT NULL, +c int not null, +CONSTRAINT test FOREIGN KEY (b) REFERENCES t1 (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +CREATE TABLE t2 ( +id int(11) NOT NULL PRIMARY KEY, +a int(11) NOT NULL, +b int(11) NOT NULL, +c int not null, +CONSTRAINT mytest FOREIGN KEY (c) REFERENCES t1(id), +CONSTRAINT test FOREIGN KEY (b) REFERENCES t2 (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +ERROR HY000: Can't create table 'test.t2' (errno: 121) +show warnings; +Level Code Message +Warning 121 Create or Alter table `test`.`t2` with foreign key constraint failed. Foreign key constraint `test/test` already exists on data dictionary. Foreign key constraint names need to be unique in database. Error in foreign key definition: CONSTRAINT `test` FOREIGN KEY (`b`) REFERENCES `test`.`t2` (`id`). +Error 1005 Can't create table 'test.t2' (errno: 121) +drop table t1; +create table t1(a int) engine=innodb; +create table t2(a int, constraint a foreign key a (a) references t1(a)) engine=innodb; +ERROR HY000: Can't create table 'test.t2' (errno: 150) +show warnings; +Level Code Message +Warning 150 Create table '`test`.`t2`' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns. Error close to foreign key a (a) references t1(a)) engine=innodb. +Error 1005 Can't create table 'test.t2' (errno: 150) +drop table t1; +create table t1(a int not null primary key, b int) engine=innodb; +create table t2(a int, b int, constraint a foreign key a (a) references t1(a), +constraint a foreign key a (a) references t1(b)) engine=innodb; +ERROR HY000: Can't create table 'test.t2' (errno: 150) +show warnings; +Level Code Message +Warning 150 Create table '`test`.`t2`' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns. Error close to foreign key a (a) references t1(b)) engine=innodb. +Error 1005 Can't create table 'test.t2' (errno: 150) +create table t2(a int, b int, constraint a foreign key a (a) references t1(a)) engine=innodb; +alter table t2 add constraint b foreign key (b) references t2(b); +ERROR HY000: Can't create table '#sql-temporary' (errno: 150) +show warnings; +Level Code Message +Warning 150 Alter table '`test`.`t2`' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns. Error close to foreign key (b) references t2(b). +Error 1005 Can't create table '#sql-temporary' (errno: 150) +drop table t2, t1; +create table t1 (f1 integer primary key) engine=innodb; +alter table t1 add constraint c1 foreign key (f1) references t11(f1); +ERROR HY000: Can't create table '#sql-temporary' (errno: 150) +show warnings; +Level Code Message +Warning 150 Alter table `test`.`t1` with foreign key constraint failed. Referenced table `test`.`t11` not found in the data dictionary close to foreign key (f1) references t11(f1). +Error 1005 Can't create table '#sql-temporary' (errno: 150) +drop table t1; +create temporary table t1(a int not null primary key, b int, key(b)) engine=innodb; +create temporary table t2(a int, foreign key(a) references t1(a)) engine=innodb; +ERROR HY000: Can't create table 'test.t2' (errno: 150) +show warnings; +Level Code Message +Warning 150 Create table `mysqld.1`.`t2` with foreign key constraint failed. Referenced table `mysqld.1`.`t1` not found in the data dictionary close to foreign key(a) references t1(a)) engine=innodb. +Error 1005 Can't create table 'test.t2' (errno: 150) +alter table t1 add foreign key(b) references t1(a); +ERROR HY000: Can't create table '#sql-temporary' (errno: 150) +show warnings; +Level Code Message +Warning 150 Alter table `mysqld.1`.`t1` with foreign key constraint failed. Referenced table `mysqld.1`.`t1` not found in the data dictionary close to foreign key(b) references t1(a). +Error 1005 Can't create table '#sql-temporary' (errno: 150) +drop table t1; +create table t1(a int not null primary key, b int, key(b)) engine=innodb; +alter table t1 add foreign key(a,b) references t1(a); +ERROR HY000: Can't create table '#sql-temporary' (errno: 150) +show warnings; +Level Code Message +Warning 150 Alter table `test`.`t1` with foreign key constraint failed. Foreign key constraint parse error in foreign key(a,b) references t1(a) close to ). Too few referenced columns, you have 1 when you should have 2. +Error 1005 Can't create table '#sql-temporary' (errno: 150) +drop table t1; +create table t1(a int not null primary key, b int, key(b)) engine=innodb; +alter table t1 add foreign key(a) references t1(a,b); +ERROR HY000: Can't create table '#sql-temporary' (errno: 150) +show warnings; +Level Code Message +Warning 150 Alter table `test`.`t1` with foreign key constraint failed. Foreign key constraint parse error in foreign key(a) references t1(a,b) close to ). Too few referenced columns, you have 2 when you should have 1. +Error 1005 Can't create table '#sql-temporary' (errno: 150) +drop table t1; +create table t1 (f1 integer not null primary key) engine=innodb; +alter table t1 add constraint c1 foreign key (f1) references t1(f1) on update set null; +ERROR HY000: Can't create table '#sql-temporary' (errno: 150) +show warnings; +Level Code Message +Warning 150 Alter table `test`.`t1` with foreign key constraint failed. You have defined a SET NULL condition but column f1 is defined as NOT NULL in foreign key (f1) references t1(f1) on update set null close to on update set null. +Error 1005 Can't create table '#sql-temporary' (errno: 150) +create table t2(a int not null, foreign key(a) references t1(f1) on delete set null) engine=innodb; +ERROR HY000: Can't create table 'test.t2' (errno: 150) +show warnings; +Level Code Message +Warning 150 Create table `test`.`t2` with foreign key constraint failed. You have defined a SET NULL condition but column a is defined as NOT NULL in foreign key(a) references t1(f1) on delete set null) engine=innodb close to on delete set null) engine=innodb. +Error 1005 Can't create table 'test.t2' (errno: 150) +drop table t1; +create table t1 (id int not null primary key, f1 int, f2 int, key(f1)) engine=innodb; +create table t2(a char(20), key(a), foreign key(a) references t1(f1)) engine=innodb; +ERROR HY000: Can't create table 'test.t2' (errno: 150) +show warnings; +Level Code Message +Warning 150 Create table `test`.`t2` with foreign key constraint failed. Field type or character set for column a does not mach referenced column f1 close to foreign key(a) references t1(f1)) engine=innodb +Error 1005 Can't create table 'test.t2' (errno: 150) +drop table t1; diff --git a/mysql-test/suite/innodb/r/innodb-fk.result b/mysql-test/suite/innodb/r/innodb-fk.result index 3c557534dbdf5974356fde56cb8cafb31f36cb4a..2b53bc21b312051e052a93a8e3746ce3760c5d86 100644 --- a/mysql-test/suite/innodb/r/innodb-fk.result +++ b/mysql-test/suite/innodb/r/innodb-fk.result @@ -50,6 +50,8 @@ CONSTRAINT fk3 FOREIGN KEY (f3) REFERENCES t3 (id) ON DELETE CASCADE ERROR HY000: Can't create table 'test.t2' (errno: 150) show warnings; Level Code Message +Warning 150 Create table `test`.`t2` with foreign key constraint failed. Referenced table `test`.`t3` not found in the data dictionary close to FOREIGN KEY (f3) REFERENCES t3 (id) ON DELETE CASCADE +) ENGINE=InnoDB. Error 1005 Can't create table 'test.t2' (errno: 150) CREATE TABLE t2 ( id int(11) NOT NULL AUTO_INCREMENT, @@ -62,6 +64,7 @@ ALTER TABLE t2 ADD CONSTRAINT fk3 FOREIGN KEY (f3) REFERENCES t3 (id) ON DELETE ERROR HY000: Can't create table '#sql-temporary' (errno: 150) show warnings; Level Code Message +Warning 150 Alter table `test`.`t2` with foreign key constraint failed. Referenced table `test`.`t3` not found in the data dictionary close to FOREIGN KEY (f3) REFERENCES t3 (id) ON DELETE CASCADE. Error 1005 Can't create table '#sql-temporary' (errno: 150) drop table t2; drop table t1; diff --git a/mysql-test/suite/innodb/r/innodb_bug68148.result b/mysql-test/suite/innodb/r/innodb_bug68148.result new file mode 100644 index 0000000000000000000000000000000000000000..88247053389d5d65a5e38ed2c7dce039769128c6 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_bug68148.result @@ -0,0 +1,36 @@ +set global innodb_file_per_table=1; +CREATE TABLE ref_table1 (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB; +CREATE TABLE ref_table2 (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB; +CREATE TABLE `main` ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`ref_id1` int(11) NOT NULL, +`ref_id2` int(11) NOT NULL, +PRIMARY KEY (`id`), +UNIQUE KEY `idx_1` (`ref_id1`,`ref_id2`), +KEY `FK_set_out_analysis_route_id` (`ref_id2`), +CONSTRAINT `FK_1` FOREIGN KEY (`ref_id1`) REFERENCES `ref_table1` (`id`) , +CONSTRAINT `FK_2` FOREIGN KEY (`ref_id2`) REFERENCES `ref_table2` (`id`) +) ENGINE=InnoDB; +SET FOREIGN_KEY_CHECKS=0; +DROP INDEX `idx_1` ON `main`; +SHOW TABLES; +Tables_in_test +main +ref_table1 +ref_table2 +# restart and see if we can still access the main table +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE `main` ADD INDEX `idx_1` (`ref_id1`); +SHOW CREATE TABLE `main`; +Table Create Table +main CREATE TABLE `main` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ref_id1` int(11) NOT NULL, + `ref_id2` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `FK_set_out_analysis_route_id` (`ref_id2`), + KEY `idx_1` (`ref_id1`), + CONSTRAINT `FK_1` FOREIGN KEY (`ref_id1`) REFERENCES `ref_table1` (`id`), + CONSTRAINT `FK_2` FOREIGN KEY (`ref_id2`) REFERENCES `ref_table2` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE main, ref_table1, ref_table2; diff --git a/mysql-test/suite/innodb/r/innodb_uninstall.result b/mysql-test/suite/innodb/r/innodb_uninstall.result new file mode 100644 index 0000000000000000000000000000000000000000..2064269a02e3ffcde0bbc4b4e257c8a422f30033 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_uninstall.result @@ -0,0 +1,22 @@ +install plugin innodb soname 'ha_innodb'; +create table t1(a int not null primary key) engine=innodb; +begin; +insert into t1 values(1); +flush tables; +uninstall plugin innodb; +select sleep(1); +sleep(1) +0 +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +drop table t1; +install plugin innodb soname 'ha_innodb'; +create table t2(a int not null primary key) engine=innodb; +insert into t2 values(1); +drop table t2; +uninstall plugin innodb; +select sleep(1); +sleep(1) +0 +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff --git a/mysql-test/suite/innodb/t/add_constraint.test b/mysql-test/suite/innodb/t/add_constraint.test new file mode 100644 index 0000000000000000000000000000000000000000..eabf06434f4ce4c094da3d5c40b0846ff7a2e902 --- /dev/null +++ b/mysql-test/suite/innodb/t/add_constraint.test @@ -0,0 +1,21 @@ +--source include/have_innodb.inc + +--echo # +--echo # Bug #20762798 FK DDL: CRASH IN DICT_FOREIGN_REMOVE_FROM_CACHE +--echo # + +create table t1(a int, b int, key(a),key(b))engine=innodb; +create table t2(a int, b int, key(a),key(b))engine=innodb; + +alter table t2 add constraint b foreign key (b) references t1(a); +alter table t1 add constraint b1 foreign key (b) references t2(a); + +--replace_regex /'[^']*test\.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error ER_CANT_CREATE_TABLE +alter table t2 add constraint b1 foreign key (b) references t1(a); + +alter table t2 drop foreign key b; +alter table t1 drop foreign key b1; + +drop table t2; +drop table t1; diff --git a/mysql-test/suite/innodb/t/innodb-fk-warnings.test b/mysql-test/suite/innodb/t/innodb-fk-warnings.test new file mode 100644 index 0000000000000000000000000000000000000000..fe92f1345f41af5d56b61ab8d267c68f6ceec46b --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-fk-warnings.test @@ -0,0 +1,130 @@ +--source include/have_innodb.inc + +# +# MDEV-8524: Improve error messaging when there is duplicate key or foreign key names +# +CREATE TABLE t1 ( + id int(11) NOT NULL PRIMARY KEY, + a int(11) NOT NULL, + b int(11) NOT NULL, + c int not null, + CONSTRAINT test FOREIGN KEY (b) REFERENCES t1 (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +# +# Below create table fails because constraint name test +# is reserved for above table. +# +--error 1005 +CREATE TABLE t2 ( + id int(11) NOT NULL PRIMARY KEY, + a int(11) NOT NULL, + b int(11) NOT NULL, + c int not null, + CONSTRAINT mytest FOREIGN KEY (c) REFERENCES t1(id), + CONSTRAINT test FOREIGN KEY (b) REFERENCES t2 (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +show warnings; + +drop table t1; + +# +# MDEV-6697: Improve foreign keys warnings/errors +# + +# +# No index for referenced columns +# +create table t1(a int) engine=innodb; +--error 1005 +create table t2(a int, constraint a foreign key a (a) references t1(a)) engine=innodb; +show warnings; +drop table t1; + +create table t1(a int not null primary key, b int) engine=innodb; +--error 1005 +create table t2(a int, b int, constraint a foreign key a (a) references t1(a), +constraint a foreign key a (a) references t1(b)) engine=innodb; +show warnings; +create table t2(a int, b int, constraint a foreign key a (a) references t1(a)) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +alter table t2 add constraint b foreign key (b) references t2(b); +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +drop table t2, t1; + +# +# Referenced table does not exists +# + +create table t1 (f1 integer primary key) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +alter table t1 add constraint c1 foreign key (f1) references t11(f1); +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +drop table t1; + +# +# Foreign key on temporal tables +# + +create temporary table t1(a int not null primary key, b int, key(b)) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +create temporary table t2(a int, foreign key(a) references t1(a)) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +alter table t1 add foreign key(b) references t1(a); +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +drop table t1; + +# +# Column numbers do not match +# +create table t1(a int not null primary key, b int, key(b)) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +alter table t1 add foreign key(a,b) references t1(a); +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +drop table t1; +create table t1(a int not null primary key, b int, key(b)) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +alter table t1 add foreign key(a) references t1(a,b); +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +drop table t1; + +# +# ON UPDATE/DELETE SET NULL on NOT NULL column +# +create table t1 (f1 integer not null primary key) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +alter table t1 add constraint c1 foreign key (f1) references t1(f1) on update set null; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +create table t2(a int not null, foreign key(a) references t1(f1) on delete set null) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +drop table t1; + +# +# Incorrect types +# +create table t1 (id int not null primary key, f1 int, f2 int, key(f1)) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +--error 1005 +create table t2(a char(20), key(a), foreign key(a) references t1(f1)) engine=innodb; +--replace_regex /'[^']*test.#sql-[0-9a-f_]*'/'#sql-temporary'/ +show warnings; +drop table t1; diff --git a/mysql-test/suite/innodb/t/innodb_bug60229-master.opt b/mysql-test/suite/innodb/t/innodb_bug60229-master.opt deleted file mode 100644 index 9b27aef9bf8e6e42b46e1ecc601977e7df030904..0000000000000000000000000000000000000000 --- a/mysql-test/suite/innodb/t/innodb_bug60229-master.opt +++ /dev/null @@ -1 +0,0 @@ ---lower_case_table_names=0 diff --git a/mysql-test/suite/innodb/t/innodb_bug60229.test b/mysql-test/suite/innodb/t/innodb_bug60229.test index 8dcf15157d694974005a8dd332b3df6029d3dd02..aee0b96a94290ce1a8d363b58193f3af2279384a 100644 --- a/mysql-test/suite/innodb/t/innodb_bug60229.test +++ b/mysql-test/suite/innodb/t/innodb_bug60229.test @@ -2,6 +2,10 @@ # Bug #13083023 - 60229: BROKEN COMPATIBILITY: ERROR WHILE CREATE TABLE # WITH FOREIGN KEY CONSTRAINT. +#Server variable option 'lower_case_table_names' sets '0' as default value +#in case sensitive filesystem. Using 'lower_case_table_names=0' in case of +#insensitive filsystem is not allowed. +-- source include/have_case_sensitive_file_system.inc -- source include/have_innodb.inc CREATE TABLE PERSON ( diff --git a/mysql-test/suite/innodb/t/innodb_bug68148.test b/mysql-test/suite/innodb/t/innodb_bug68148.test new file mode 100644 index 0000000000000000000000000000000000000000..531baa30e48ab9d6c827705edf57922bcf22c16d --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_bug68148.test @@ -0,0 +1,41 @@ +-- source include/have_innodb.inc +-- source include/not_embedded.inc + +# +# Bug #68148: drop index on a foreign key column leads to missing table +# MDEV-8845: Table disappear after modifying FK +# + +set global innodb_file_per_table=1; + +CREATE TABLE ref_table1 (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB; + +CREATE TABLE ref_table2 (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB; + +CREATE TABLE `main` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ref_id1` int(11) NOT NULL, + `ref_id2` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `idx_1` (`ref_id1`,`ref_id2`), + KEY `FK_set_out_analysis_route_id` (`ref_id2`), + CONSTRAINT `FK_1` FOREIGN KEY (`ref_id1`) REFERENCES `ref_table1` (`id`) , + CONSTRAINT `FK_2` FOREIGN KEY (`ref_id2`) REFERENCES `ref_table2` (`id`) +) ENGINE=InnoDB; + +SET FOREIGN_KEY_CHECKS=0; + +DROP INDEX `idx_1` ON `main`; +SHOW TABLES; + +--echo # restart and see if we can still access the main table +--source include/restart_mysqld.inc + +# This is required to access the table +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE `main` ADD INDEX `idx_1` (`ref_id1`); +SHOW CREATE TABLE `main`; + +DROP TABLE main, ref_table1, ref_table2; + + diff --git a/mysql-test/suite/innodb/t/innodb_uninstall.opt b/mysql-test/suite/innodb/t/innodb_uninstall.opt new file mode 100644 index 0000000000000000000000000000000000000000..918855a7b01695d89e5c4fdc3b294e478aa41cda --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_uninstall.opt @@ -0,0 +1,3 @@ +--ignore-builtin-innodb +--loose-innodb + diff --git a/mysql-test/suite/innodb/t/innodb_uninstall.test b/mysql-test/suite/innodb/t/innodb_uninstall.test new file mode 100644 index 0000000000000000000000000000000000000000..34fc8345a02adec2aac899dde72f6fae41c9572c --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb_uninstall.test @@ -0,0 +1,58 @@ +--source include/not_embedded.inc +--source include/not_windows.inc + +if (!$HA_INNODB_SO) { + --skip Need InnoDB plugin +} + +# +# MDEV-8474: InnoDB sets per-connection data unsafely +# Below test caused hang +# +install plugin innodb soname 'ha_innodb'; +create table t1(a int not null primary key) engine=innodb; + +connect (con1, localhost, root); +connection con1; +begin; +insert into t1 values(1); + +connection default; +flush tables; +send uninstall plugin innodb; + +connection con1; +select sleep(1); +disconnect con1; + +connection default; +reap; + +--source include/restart_mysqld.inc + +drop table t1; + +# +# Another test that caused hang. +# + +connect (con1, localhost, root); +connection con1; +install plugin innodb soname 'ha_innodb'; +create table t2(a int not null primary key) engine=innodb; +insert into t2 values(1); +drop table t2; + +connection default; +send uninstall plugin innodb; + +connection con1; +select sleep(1); +disconnect con1; + +connection default; +reap; + +--source include/restart_mysqld.inc + + diff --git a/mysql-test/suite/innodb/t/xa_recovery.test b/mysql-test/suite/innodb/t/xa_recovery.test index ff6da07f6ac2db82730bcbae550605598baaea60..aec606de77ee331660033359fd030f7298fdff49 100644 --- a/mysql-test/suite/innodb/t/xa_recovery.test +++ b/mysql-test/suite/innodb/t/xa_recovery.test @@ -6,6 +6,12 @@ if (`select plugin_auth_version <= "5.5.43-MariaDB-37.2" from information_schema # Embedded server does not support restarting. --source include/not_embedded.inc +# MDEV-8841 - close tables opened by previous tests, +# so they don't get marked crashed when the server gets crashed +--disable_query_log +FLUSH TABLES; +--enable_query_log + CREATE TABLE t1 (a INT) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); connect (con1,localhost,root); diff --git a/mysql-test/suite/jp/t/jp_enum_sjis-master.opt b/mysql-test/suite/jp/t/jp_enum_sjis-master.opt deleted file mode 100644 index 9b27aef9bf8e6e42b46e1ecc601977e7df030904..0000000000000000000000000000000000000000 --- a/mysql-test/suite/jp/t/jp_enum_sjis-master.opt +++ /dev/null @@ -1 +0,0 @@ ---lower_case_table_names=0 diff --git a/mysql-test/suite/jp/t/jp_enum_sjis.test b/mysql-test/suite/jp/t/jp_enum_sjis.test index e1f22f6fe27051eed6aa4a8e1b9b984c2bbe0c1a..1060f83ec06baae6095d834bd0f97778b8942c29 100644 --- a/mysql-test/suite/jp/t/jp_enum_sjis.test +++ b/mysql-test/suite/jp/t/jp_enum_sjis.test @@ -1,3 +1,7 @@ +#Server variable option 'lower_case_table_names' sets '0' as default value +#in case sensitive filesystem. Using 'lower_case_table_names=0' in case of +#insensitive filsystem is not allowed. +-- source include/have_case_sensitive_file_system.inc --source include/have_sjis.inc --source include/have_innodb.inc --character_set sjis diff --git a/mysql-test/suite/jp/t/jp_enum_ucs2-master.opt b/mysql-test/suite/jp/t/jp_enum_ucs2-master.opt deleted file mode 100644 index 9b27aef9bf8e6e42b46e1ecc601977e7df030904..0000000000000000000000000000000000000000 --- a/mysql-test/suite/jp/t/jp_enum_ucs2-master.opt +++ /dev/null @@ -1 +0,0 @@ ---lower_case_table_names=0 diff --git a/mysql-test/suite/jp/t/jp_enum_ucs2.test b/mysql-test/suite/jp/t/jp_enum_ucs2.test index a3d7c47705d2dd857d93785480eaf4a4580ab118..321f895214894a83438ff7e81e40049c4b459a96 100644 --- a/mysql-test/suite/jp/t/jp_enum_ucs2.test +++ b/mysql-test/suite/jp/t/jp_enum_ucs2.test @@ -1,3 +1,7 @@ +#Server variable option 'lower_case_table_names' sets '0' as default value +#in case sensitive filesystem. Using 'lower_case_table_names=0' in case of +#insensitive filsystem is not allowed. +-- source include/have_case_sensitive_file_system.inc --source include/have_ucs2.inc --source include/have_innodb.inc diff --git a/mysql-test/suite/jp/t/jp_enum_ujis-master.opt b/mysql-test/suite/jp/t/jp_enum_ujis-master.opt deleted file mode 100644 index 9b27aef9bf8e6e42b46e1ecc601977e7df030904..0000000000000000000000000000000000000000 --- a/mysql-test/suite/jp/t/jp_enum_ujis-master.opt +++ /dev/null @@ -1 +0,0 @@ ---lower_case_table_names=0 diff --git a/mysql-test/suite/jp/t/jp_enum_ujis.test b/mysql-test/suite/jp/t/jp_enum_ujis.test index 17e41e0691ef0409055f6b747b20942d37753e26..10e8ad55a3c876c9ed64254590047ad47fee5377 100644 --- a/mysql-test/suite/jp/t/jp_enum_ujis.test +++ b/mysql-test/suite/jp/t/jp_enum_ujis.test @@ -1,3 +1,7 @@ +#Server variable option 'lower_case_table_names' sets '0' as default value +#in case sensitive filesystem. Using 'lower_case_table_names=0' in case of +#insensitive filsystem is not allowed. +-- source include/have_case_sensitive_file_system.inc --source include/have_ujis.inc --source include/have_innodb.inc diff --git a/mysql-test/suite/jp/t/jp_enum_utf8-master.opt b/mysql-test/suite/jp/t/jp_enum_utf8-master.opt deleted file mode 100644 index 9b27aef9bf8e6e42b46e1ecc601977e7df030904..0000000000000000000000000000000000000000 --- a/mysql-test/suite/jp/t/jp_enum_utf8-master.opt +++ /dev/null @@ -1 +0,0 @@ ---lower_case_table_names=0 diff --git a/mysql-test/suite/jp/t/jp_enum_utf8.test b/mysql-test/suite/jp/t/jp_enum_utf8.test index ff5978da69c66c035b7f0755d08209a28d00cd38..f67939bd02bd6624274aeadccbf67b9897b9eeb1 100644 --- a/mysql-test/suite/jp/t/jp_enum_utf8.test +++ b/mysql-test/suite/jp/t/jp_enum_utf8.test @@ -1,3 +1,7 @@ +#Server variable option 'lower_case_table_names' sets '0' as default value +#in case sensitive filesystem. Using 'lower_case_table_names=0' in case of +#insensitive filsystem is not allowed. +-- source include/have_case_sensitive_file_system.inc --source include/have_utf8.inc --source include/have_innodb.inc --disable_warnings diff --git a/mysql-test/suite/ndb/r/ndb_restore_discover.result b/mysql-test/suite/ndb/r/ndb_restore_discover.result new file mode 100644 index 0000000000000000000000000000000000000000..de10af870479ed7ad8b64d178e49bda8f66f6065 --- /dev/null +++ b/mysql-test/suite/ndb/r/ndb_restore_discover.result @@ -0,0 +1,33 @@ +# +# 18075170 - sql node restart required to avoid deadlock after +# restore +# +CREATE TABLE t1 (id INT) ENGINE=NDBCluster; +CREATE TABLE t2 (id INT) ENGINE=NDBCluster; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); +DROP TABLE t1; +DROP TABLE t2; +SET autocommit = 0; +SELECT * FROM t1; +id +1 +SELECT * FROM t2; +id +1 +ROLLBACK; +SET autocommit = 1; +drop table t1; +drop table t2; +SET autocommit = 0; +SELECT * FROM t1; +id +1 +SELECT * FROM t2; +id +1 +ALTER TABLE t1 ADD val INT; +ROLLBACK; +SET autocommit = 1; +drop table t1; +drop table t2; diff --git a/mysql-test/suite/ndb/t/ndb_restore_discover.test b/mysql-test/suite/ndb/t/ndb_restore_discover.test new file mode 100644 index 0000000000000000000000000000000000000000..6631c74d5c80910b1ea7238cca8bfc1e17f2cbfe --- /dev/null +++ b/mysql-test/suite/ndb/t/ndb_restore_discover.test @@ -0,0 +1,70 @@ +-- source include/have_ndb.inc +-- source include/count_sessions.inc + +--echo # +--echo # 18075170 - sql node restart required to avoid deadlock after +--echo # restore +--echo # +# Test Auto Discover option within a transaction +# and make sure the transaction is not broken. +CREATE TABLE t1 (id INT) ENGINE=NDBCluster; +CREATE TABLE t2 (id INT) ENGINE=NDBCluster; + +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +-- source include/ndb_backup.inc + +DROP TABLE t1; +DROP TABLE t2; + +-- source include/ndb_restore_master.inc + +SET autocommit = 0; +SELECT * FROM t1; + +# Without fix below select was resulting in DEADLOCK error. With fix select +# should succeed. +SELECT * FROM t2; +ROLLBACK; +SET autocommit = 1; + +drop table t1; +drop table t2; + +# +# Checking lock preservation in transaction +# +# Using existing backup to create the scenario. Tables are deleted as part of +# above test cleanup. Thus restoring the backup will bring the system to +# required state. +-- source include/ndb_restore_master.inc + +SET autocommit = 0; +SELECT * FROM t1; +SELECT * FROM t2; + +connect(con2, localhost, root); +--SEND ALTER TABLE t1 ADD val INT + +connection default; +# Alter from con2 will be in waiting state as there is a lock on t1 from +# default connection due to active transaction. We check for this condition +# then releasing the lock by rollbacking active transaction. +let $wait_condition= + SELECT count(*) = 1 FROM information_schema.processlist WHERE state + LIKE "Waiting%" AND info = "ALTER TABLE t1 ADD val INT"; +--source include/wait_condition.inc +ROLLBACK; +SET autocommit = 1; + +connection con2; +--REAP + +disconnect con2; +connection default; +drop table t1; +drop table t2; + +# Wait till all disconnects are completed +-- source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/perfschema/r/query_cache.result b/mysql-test/suite/perfschema/r/query_cache.result index 8786cd055ca7c0f97644f5f9acc743e65f4bb79f..837c2573a7224bd3a1a906b5a6a1b9cde600c630 100644 --- a/mysql-test/suite/perfschema/r/query_cache.result +++ b/mysql-test/suite/perfschema/r/query_cache.result @@ -38,7 +38,7 @@ spins NULL select * from performance_schema.setup_timers where name='wait'; NAME TIMER_NAME -wait CYCLE +wait {CYCLE_OR_NANOSECOND} show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 1 @@ -53,7 +53,7 @@ spins NULL select * from performance_schema.setup_timers where name='wait'; NAME TIMER_NAME -wait CYCLE +wait {CYCLE_OR_NANOSECOND} show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 1 diff --git a/mysql-test/suite/perfschema/t/query_cache.test b/mysql-test/suite/perfschema/t/query_cache.test index 60d4a648222ebc5e303b69624b3c9a0e41e8ce8a..802e574f89b8866c7809680a4ddda44ecb0ede6d 100644 --- a/mysql-test/suite/perfschema/t/query_cache.test +++ b/mysql-test/suite/perfschema/t/query_cache.test @@ -34,6 +34,7 @@ show status like "Qcache_hits"; select spins from performance_schema.events_waits_current order by event_name limit 1; +--replace_result CYCLE {CYCLE_OR_NANOSECOND} NANOSECOND {CYCLE_OR_NANOSECOND} select * from performance_schema.setup_timers where name='wait'; show status like "Qcache_queries_in_cache"; @@ -42,6 +43,7 @@ show status like "Qcache_hits"; select spins from performance_schema.events_waits_current order by event_name limit 1; +--replace_result CYCLE {CYCLE_OR_NANOSECOND} NANOSECOND {CYCLE_OR_NANOSECOND} select * from performance_schema.setup_timers where name='wait'; show status like "Qcache_queries_in_cache"; diff --git a/mysql-test/suite/plugins/r/feedback_plugin_load.result b/mysql-test/suite/plugins/r/feedback_plugin_load.result index 443b91bf0cca7c4cca974a80da0495f07a60b472..ea6eae986018de35f909befa4951e384b69b88ba 100644 --- a/mysql-test/suite/plugins/r/feedback_plugin_load.result +++ b/mysql-test/suite/plugins/r/feedback_plugin_load.result @@ -1,10 +1,13 @@ select plugin_status from information_schema.plugins where plugin_name='feedback'; plugin_status ACTIVE +SELECT variable_value INTO @feedback_used FROM information_schema.feedback where variable_name = 'FEEDBACK used'; +SELECT variable_value = @feedback_used + 1 FROM information_schema.feedback where variable_name = 'FEEDBACK used'; +variable_value = @feedback_used + 1 +1 select * from information_schema.feedback where variable_name like 'feed%' - and variable_name not like '%_uid'; + and variable_name not like '%_uid' and variable_name not like 'FEEDBACK used'; VARIABLE_NAME VARIABLE_VALUE -FEEDBACK used 1 FEEDBACK version 1.1 FEEDBACK_SEND_RETRY_WAIT 60 FEEDBACK_SEND_TIMEOUT 60 diff --git a/mysql-test/suite/plugins/r/feedback_plugin_send.result b/mysql-test/suite/plugins/r/feedback_plugin_send.result index 2852240ca5b3a3caf894a55223e836636df70560..90a37f7ffbc2c4099c613656ae43f791dfbf696b 100644 --- a/mysql-test/suite/plugins/r/feedback_plugin_send.result +++ b/mysql-test/suite/plugins/r/feedback_plugin_send.result @@ -1,10 +1,13 @@ select plugin_status from information_schema.plugins where plugin_name='feedback'; plugin_status ACTIVE +SELECT variable_value INTO @feedback_used FROM information_schema.feedback where variable_name = 'FEEDBACK used'; +SELECT variable_value = @feedback_used + 1 FROM information_schema.feedback where variable_name = 'FEEDBACK used'; +variable_value = @feedback_used + 1 +1 select * from information_schema.feedback where variable_name like 'feed%' - and variable_name not like '%_uid'; + and variable_name not like '%_uid' and variable_name not like 'FEEDBACK used'; VARIABLE_NAME VARIABLE_VALUE -FEEDBACK used 2 FEEDBACK version 1.1 FEEDBACK_SEND_RETRY_WAIT 60 FEEDBACK_SEND_TIMEOUT 60 diff --git a/mysql-test/suite/plugins/t/feedback_plugin_load.test b/mysql-test/suite/plugins/t/feedback_plugin_load.test index 5ad301667b4763de69adbcc168a46d577ff7849f..f7c62b96b4926a5263906138d0ede1d3540e30f9 100644 --- a/mysql-test/suite/plugins/t/feedback_plugin_load.test +++ b/mysql-test/suite/plugins/t/feedback_plugin_load.test @@ -4,7 +4,24 @@ if (`select count(*) = 0 from information_schema.plugins where plugin_name = 'fe } select plugin_status from information_schema.plugins where plugin_name='feedback'; + +# Every SELECT from INFORMATION_SCHEMA.FEEDBACK increases the value of 'FEEDBACK used'. +# We cannot record the actual value, because the test can be executed more than once, +# but we can check that the value indeed increases as expected. +# There is still a room for some race condition, e.g. if at the very moment +# between first SELECT to store the value and the next SELECT to check that it increases, +# the feedback plugin is activated. But the probability of it is close to 0, +# so lets get back to it if it ever happens. + +# Lets say the plugin was used X times before this SELECT +SELECT variable_value INTO @feedback_used FROM information_schema.feedback where variable_name = 'FEEDBACK used'; + +# Now $feedback_used == X+1, and 'FEEDBACK used' is also X+1. And variable_value is increased again when we run the next SELECT +SELECT variable_value = @feedback_used + 1 FROM information_schema.feedback where variable_name = 'FEEDBACK used'; + +# Now when we are happy with 'FEEDBACK used', we can check everything else + --replace_result https http --sorted_result select * from information_schema.feedback where variable_name like 'feed%' - and variable_name not like '%_uid'; + and variable_name not like '%_uid' and variable_name not like 'FEEDBACK used'; diff --git a/mysql-test/suite/plugins/t/feedback_plugin_send.test b/mysql-test/suite/plugins/t/feedback_plugin_send.test index 45b507f8e789889f3538c08656095f11ab600cb4..31542c33482b5974fab55b683ef75877337eb242 100644 --- a/mysql-test/suite/plugins/t/feedback_plugin_send.test +++ b/mysql-test/suite/plugins/t/feedback_plugin_send.test @@ -14,6 +14,15 @@ if (!$MTR_FEEDBACK_PLUGIN) { # is doing some work in other workers. # sleep 310; + +# The test expects that the plugin will send a report at least 2 times, +# now (5 min after loading) and on server shutdown which happens below. +# Since we have already waited for 5 min, let's be generous +# and make sure the server has enough time to shut down properly. +# We won't lose anything if the shutdown is fast, but if it's slow, the plugin +# will still be able to finish the job and write about it in the error log. + +--let $shutdown_timeout= 60 source include/restart_mysqld.inc; replace_result https http; diff --git a/mysql-test/suite/rpl/r/rpl_alter.result b/mysql-test/suite/rpl/r/rpl_alter.result index 2cffa70d778e661bb4d80bd5179718423a3a22ee..7be3bc576f34bc48831e43e68d4a6ba0697c2236 100644 --- a/mysql-test/suite/rpl/r/rpl_alter.result +++ b/mysql-test/suite/rpl/r/rpl_alter.result @@ -14,4 +14,109 @@ select * from mysqltest.t3; n 45 drop database mysqltest; +use test; +# +# Test bug where ALTER TABLE MODIFY didn't replicate properly +# +create table t1 (a int unsigned primary key, b int); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(10) unsigned NOT NULL, + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +insert into t1 (a) values (1),((1<<32)-1); +select * from t1; +a b +1 NULL +4294967295 NULL +alter table t1 modify a bigint; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) NOT NULL DEFAULT '0', + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +select * from t1; +a b +1 NULL +4294967295 NULL +alter table t1 modify a int unsigned; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(10) unsigned NOT NULL DEFAULT '0', + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +select * from t1; +a b +1 NULL +4294967295 NULL +alter table t1 modify a bigint unsigned; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) unsigned NOT NULL DEFAULT '0', + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +select * from t1; +a b +1 NULL +4294967295 NULL +use test; +select * from t1; +a b +1 NULL +4294967295 NULL +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) unsigned NOT NULL DEFAULT '0', + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +create table t2 (a int unsigned auto_increment primary key, b int); +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(10) unsigned NOT NULL AUTO_INCREMENT, + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t2 modify a bigint; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` bigint(20) NOT NULL DEFAULT '0', + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +alter table t2 modify a bigint auto_increment; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` bigint(20) NOT NULL AUTO_INCREMENT, + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1,t2; +# +# MDEV-8432: Slave cannot replicate signed integer-type values +# with high bit set to 1 +# Test replication when we have int on master and bigint on slave +# +create table t1 (a int unsigned primary key, b int); +SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_NON_LOSSY'; +alter table t1 modify a bigint unsigned; +insert into t1 (a) values (1),((1<<32)-1); +select * from t1; +a b +1 NULL +4294967295 NULL +SET GLOBAL SLAVE_TYPE_CONVERSIONS=''; +drop table t1; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result b/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result index e71bb2e29c9a1ca3aadc6a868b9d4c01a51db68d..c2a0498509b215bb745c1d707b89585586db73e0 100644 --- a/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result +++ b/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result @@ -1,2 +1,4 @@ include/master-slave.inc [connection master] +start slave; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_alter.test b/mysql-test/suite/rpl/t/rpl_alter.test index 630197f8637bcad09a5d4a97d0fa9b50710e4b60..8b8bcfb3d26f55a927f290e985968e699a3ba715 100644 --- a/mysql-test/suite/rpl/t/rpl_alter.test +++ b/mysql-test/suite/rpl/t/rpl_alter.test @@ -15,4 +15,57 @@ drop database mysqltest; sync_slave_with_master; # End of 4.1 tests + +connection master; +use test; + +--echo # +--echo # Test bug where ALTER TABLE MODIFY didn't replicate properly +--echo # + +create table t1 (a int unsigned primary key, b int); +show create table t1; +insert into t1 (a) values (1),((1<<32)-1); +select * from t1; +alter table t1 modify a bigint; +show create table t1; +select * from t1; +alter table t1 modify a int unsigned; +show create table t1; +select * from t1; +alter table t1 modify a bigint unsigned; +show create table t1; +select * from t1; +sync_slave_with_master; +use test; +select * from t1; +show create table t1; +connection master; +# +create table t2 (a int unsigned auto_increment primary key, b int); +show create table t2; +alter table t2 modify a bigint; +show create table t2; +alter table t2 modify a bigint auto_increment; +show create table t2; +drop table t1,t2; + +--echo # +--echo # MDEV-8432: Slave cannot replicate signed integer-type values +--echo # with high bit set to 1 +--echo # Test replication when we have int on master and bigint on slave +--echo # + +create table t1 (a int unsigned primary key, b int); +sync_slave_with_master; +SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_NON_LOSSY'; +alter table t1 modify a bigint unsigned; +connection master; +insert into t1 (a) values (1),((1<<32)-1); +sync_slave_with_master; +select * from t1; +SET GLOBAL SLAVE_TYPE_CONVERSIONS=''; +connection master; +drop table t1; + --source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_innodb_bug30888.opt b/mysql-test/suite/rpl/t/rpl_innodb_bug30888.opt new file mode 100644 index 0000000000000000000000000000000000000000..e6685732d904ebfee5ed99697205f34750c94cd1 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_innodb_bug30888.opt @@ -0,0 +1 @@ +--innodb-flush-log-at-trx-commit=2 diff --git a/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test b/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test index a79a1885a6c344c83ee71f3056efb854c8005a1c..38759c9b16af1b084abc624bf2649f428b4b2424 100644 --- a/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test +++ b/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test @@ -10,3 +10,10 @@ --exec $MYSQL_SLAP --silent --socket=$SLAVE_MYSOCK -q "START SLAVE; STOP SLAVE; SHOW GLOBAL STATUS" -c 2 --number-of-queries=100 --create-schema=test # All done. + +--connection slave +start slave; + +--connection master +--source include/rpl_end.inc + diff --git a/mysql-test/t/func_gconcat.test b/mysql-test/t/func_gconcat.test index 42a30760a863ae321757c23a58aa4d681fbc8fe9..5550eebf1a3936a794848c757fe96446743d7309 100644 --- a/mysql-test/t/func_gconcat.test +++ b/mysql-test/t/func_gconcat.test @@ -821,3 +821,14 @@ FROM ( SELECT * FROM t2 ) AS sq2, t3 ORDER BY field; drop table t3, t2, t1; + +--echo # +--echo # MDEV-7821 - Server crashes in Item_func_group_concat::fix_fields on 2nd +--echo # execution of PS +--echo # +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES(1),(2); +PREPARE stmt FROM "SELECT GROUP_CONCAT(t1a.a ORDER BY 1, t1a.a=0) FROM t1 AS t1a, t1 AS t1b GROUP BY t1a.a"; +EXECUTE stmt; +EXECUTE stmt; +DROP TABLE t1; diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test index 2b89a618aa6b24a9ac5877bac8bced4b079ba328..8fdba77db9bcac01bfd62fb2a33f75ce27c5c100 100644 --- a/mysql-test/t/func_if.test +++ b/mysql-test/t/func_if.test @@ -206,6 +206,20 @@ SELECT if(1, NULL, (SELECT min('hello'))); --echo End of 5.2 tests +--echo # +--echo # MDEV-8663: IF Statement returns multiple values erroneously +--echo # (or Assertion `!null_value' failed in Item::send(Protocol*, String*) +--echo # +CREATE TABLE `t1` ( +`datas` VARCHAR(25) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `t1` VALUES ('1,2'), ('2,3'), ('3,4'); + +SELECT IF(FIND_IN_SET('1', `datas`), 1.5, IF(FIND_IN_SET('2', `datas`), 2, NULL)) AS `First`, '1' AS `Second`, '2' AS `Third` FROM `t1`; + +drop table t1; + --disable_query_log # Restore timezone to default set time_zone= @@global.time_zone; diff --git a/mysql-test/t/func_misc.test b/mysql-test/t/func_misc.test index 24fe1ef79844fb00854e37b38477574179bf570c..5991220e273d9c5b960c51f5879322ad9e35ce4c 100644 --- a/mysql-test/t/func_misc.test +++ b/mysql-test/t/func_misc.test @@ -391,6 +391,210 @@ set optimizer_switch=@optimizer_switch_save; drop view v_merge, vm; drop table t1,tv; +--echo # +--echo # MDEV-4017 - GET_LOCK() with negative timeouts has strange behavior +--echo # +SELECT GET_LOCK('ul1', NULL); +SELECT GET_LOCK('ul1', -1); + +--echo # +--echo # MDEV-8624 MariaDB hangs on query with many logical condition +--echo # +CREATE TABLE `t1` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `submitdate` datetime DEFAULT NULL, + `lastpage` int(11) DEFAULT NULL, + `startlanguage` varchar(20) COLLATE utf8_unicode_ci NOT NULL, + `token` varchar(36) COLLATE utf8_unicode_ci DEFAULT NULL, + `datestamp` datetime NOT NULL, + `startdate` datetime NOT NULL, + `ipaddr` text COLLATE utf8_unicode_ci, + `refurl` text COLLATE utf8_unicode_ci, + `57813X540X1723` text COLLATE utf8_unicode_ci, + `57813X540X1724` text COLLATE utf8_unicode_ci, + `57813X540X1725` text COLLATE utf8_unicode_ci, + `57813X540X1726` double DEFAULT NULL, + `57813X540X1909` double DEFAULT NULL, + `57813X541X17271` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X541X17272` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X541X17273` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X541X17274` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X541X17275` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X541X17276` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X541X17281` text COLLATE utf8_unicode_ci, + `57813X541X17282` text COLLATE utf8_unicode_ci, + `57813X541X17283` text COLLATE utf8_unicode_ci, + `57813X541X17284` text COLLATE utf8_unicode_ci, + `57813X541X17285` text COLLATE utf8_unicode_ci, + `57813X541X17286` text COLLATE utf8_unicode_ci, + `57813X542X18131` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18132` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18133` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18134` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18135` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18136` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18137` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18138` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18139` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X542X18141` text COLLATE utf8_unicode_ci, + `57813X542X18142` text COLLATE utf8_unicode_ci, + `57813X542X18143` text COLLATE utf8_unicode_ci, + `57813X542X18144` text COLLATE utf8_unicode_ci, + `57813X542X18145` text COLLATE utf8_unicode_ci, + `57813X542X18146` text COLLATE utf8_unicode_ci, + `57813X542X18147` text COLLATE utf8_unicode_ci, + `57813X542X18148` text COLLATE utf8_unicode_ci, + `57813X542X18149` text COLLATE utf8_unicode_ci, + `57813X543X18451` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X543X18452` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X543X18453` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X543X18454` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X543X18455` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X543X18456` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X543X18461` text COLLATE utf8_unicode_ci, + `57813X543X18462` text COLLATE utf8_unicode_ci, + `57813X543X18463` text COLLATE utf8_unicode_ci, + `57813X543X18464` text COLLATE utf8_unicode_ci, + `57813X543X18465` text COLLATE utf8_unicode_ci, + `57813X543X18466` text COLLATE utf8_unicode_ci, + `57813X544X18711` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X544X18712` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X544X18713` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X544X18714` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X544X18715` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X544X18716` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X544X18717` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X544X18718` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X544X18721` text COLLATE utf8_unicode_ci, + `57813X544X18722` text COLLATE utf8_unicode_ci, + `57813X544X18723` text COLLATE utf8_unicode_ci, + `57813X544X18724` text COLLATE utf8_unicode_ci, + `57813X544X18725` text COLLATE utf8_unicode_ci, + `57813X544X18726` text COLLATE utf8_unicode_ci, + `57813X544X18727` text COLLATE utf8_unicode_ci, + `57813X544X18728` text COLLATE utf8_unicode_ci, + `57813X546X1902` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X546X1903` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X546X1904` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, + `57813X545X1901` varchar(1) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `lime_survey_57813_idx` (`token`), + KEY `57813X540X1723` (`57813X540X1723`(100)), + KEY `57813X540X1724` (`57813X540X1724`(100)), + KEY `57813X540X1726` (`57813X540X1726`), + KEY `57813X540X1725` (`57813X540X1725`(100)), + KEY `57813X546X1902` (`57813X546X1902`), + KEY `57813X546X1903` (`57813X546X1903`), + KEY `57813X546X1904` (`57813X546X1904`) +); + +SELECT +COUNT(*) as `N`, +ROUND( + ( + SUM( + ( + ( + IF( 57813X541X17271 IS NOT NULL AND 57813X541X17271 != '' AND 57813X541X17271 != '99', 57813X541X17271, 0 ) + + IF( 57813X541X17272 IS NOT NULL AND 57813X541X17272 != '' AND 57813X541X17272 != '99', 57813X541X17272, 0 ) + + IF( 57813X541X17273 IS NOT NULL AND 57813X541X17273 != '' AND 57813X541X17273 != '99', 57813X541X17273, 0 ) + + IF( 57813X541X17274 IS NOT NULL AND 57813X541X17274 != '' AND 57813X541X17274 != '99', 57813X541X17274, 0 ) + + IF( 57813X541X17275 IS NOT NULL AND 57813X541X17275 != '' AND 57813X541X17275 != '99', 57813X541X17275, 0 ) + + IF( 57813X541X17276 IS NOT NULL AND 57813X541X17276 != '' AND 57813X541X17276 != '99', 57813X541X17276, 0 ) + + IF( 57813X542X18131 IS NOT NULL AND 57813X542X18131 != '' AND 57813X542X18131 != '99', 57813X542X18131, 0 ) + + IF( 57813X542X18132 IS NOT NULL AND 57813X542X18132 != '' AND 57813X542X18132 != '99', 57813X542X18132, 0 ) + + IF( 57813X542X18133 IS NOT NULL AND 57813X542X18133 != '' AND 57813X542X18133 != '99', 57813X542X18133, 0 ) + + IF( 57813X542X18134 IS NOT NULL AND 57813X542X18134 != '' AND 57813X542X18134 != '99', 57813X542X18134, 0 ) + + IF( 57813X542X18135 IS NOT NULL AND 57813X542X18135 != '' AND 57813X542X18135 != '99', 57813X542X18135, 0 ) + + IF( 57813X542X18136 IS NOT NULL AND 57813X542X18136 != '' AND 57813X542X18136 != '99', 57813X542X18136, 0 ) + + IF( 57813X542X18137 IS NOT NULL AND 57813X542X18137 != '' AND 57813X542X18137 != '99', 57813X542X18137, 0 ) + + IF( 57813X542X18138 IS NOT NULL AND 57813X542X18138 != '' AND 57813X542X18138 != '99', 57813X542X18138, 0 ) + + IF( 57813X542X18139 IS NOT NULL AND 57813X542X18139 != '' AND 57813X542X18139 != '99', 57813X542X18139, 0 ) + + IF( 57813X543X18451 IS NOT NULL AND 57813X543X18451 != '' AND 57813X543X18451 != '99', 57813X543X18451, 0 ) + + IF( 57813X543X18452 IS NOT NULL AND 57813X543X18452 != '' AND 57813X543X18452 != '99', 57813X543X18452, 0 ) + + IF( 57813X543X18453 IS NOT NULL AND 57813X543X18453 != '' AND 57813X543X18453 != '99', 57813X543X18453, 0 ) + + IF( 57813X543X18454 IS NOT NULL AND 57813X543X18454 != '' AND 57813X543X18454 != '99', 57813X543X18454, 0 ) + + IF( 57813X543X18455 IS NOT NULL AND 57813X543X18455 != '' AND 57813X543X18455 != '99', 57813X543X18455, 0 ) + + IF( 57813X543X18456 IS NOT NULL AND 57813X543X18456 != '' AND 57813X543X18456 != '99', 57813X543X18456, 0 ) + + IF( 57813X544X18711 IS NOT NULL AND 57813X544X18711 != '' AND 57813X544X18711 != '99', 57813X544X18711, 0 ) + + IF( 57813X544X18712 IS NOT NULL AND 57813X544X18712 != '' AND 57813X544X18712 != '99', 57813X544X18712, 0 ) + + IF( 57813X544X18713 IS NOT NULL AND 57813X544X18713 != '' AND 57813X544X18713 != '99', 57813X544X18713, 0 ) + + IF( 57813X544X18714 IS NOT NULL AND 57813X544X18714 != '' AND 57813X544X18714 != '99', 57813X544X18714, 0 ) + + IF( 57813X544X18715 IS NOT NULL AND 57813X544X18715 != '' AND 57813X544X18715 != '99', 57813X544X18715, 0 ) + + IF( 57813X544X18716 IS NOT NULL AND 57813X544X18716 != '' AND 57813X544X18716 != '99', 57813X544X18716, 0 ) + + IF( 57813X544X18717 IS NOT NULL AND 57813X544X18717 != '' AND 57813X544X18717 != '99', 57813X544X18717, 0 ) + + IF( 57813X544X18718 IS NOT NULL AND 57813X544X18718 != '' AND 57813X544X18718 != '99', 57813X544X18718, 0 ) + ) + / + ( + IF( 57813X541X17271 IS NOT NULL AND 57813X541X17271 != '' AND 57813X541X17271 != '99', 1, 0 ) + + IF( 57813X541X17272 IS NOT NULL AND 57813X541X17272 != '' AND 57813X541X17272 != '99', 1, 0 ) + + IF( 57813X541X17273 IS NOT NULL AND 57813X541X17273 != '' AND 57813X541X17273 != '99', 1, 0 ) + + IF( 57813X541X17274 IS NOT NULL AND 57813X541X17274 != '' AND 57813X541X17274 != '99', 1, 0 ) + + IF( 57813X541X17275 IS NOT NULL AND 57813X541X17275 != '' AND 57813X541X17275 != '99', 1, 0 ) + + IF( 57813X541X17276 IS NOT NULL AND 57813X541X17276 != '' AND 57813X541X17276 != '99', 1, 0 ) + + IF( 57813X542X18131 IS NOT NULL AND 57813X542X18131 != '' AND 57813X542X18131 != '99', 1, 0 ) + + IF( 57813X542X18132 IS NOT NULL AND 57813X542X18132 != '' AND 57813X542X18132 != '99', 1, 0 ) + + IF( 57813X542X18133 IS NOT NULL AND 57813X542X18133 != '' AND 57813X542X18133 != '99', 1, 0 ) + + IF( 57813X542X18134 IS NOT NULL AND 57813X542X18134 != '' AND 57813X542X18134 != '99', 1, 0 ) + + IF( 57813X542X18135 IS NOT NULL AND 57813X542X18135 != '' AND 57813X542X18135 != '99', 1, 0 ) + + IF( 57813X542X18136 IS NOT NULL AND 57813X542X18136 != '' AND 57813X542X18136 != '99', 1, 0 ) + + IF( 57813X542X18137 IS NOT NULL AND 57813X542X18137 != '' AND 57813X542X18137 != '99', 1, 0 ) + + IF( 57813X542X18138 IS NOT NULL AND 57813X542X18138 != '' AND 57813X542X18138 != '99', 1, 0 ) + + IF( 57813X542X18139 IS NOT NULL AND 57813X542X18139 != '' AND 57813X542X18139 != '99', 1, 0 ) + + IF( 57813X543X18451 IS NOT NULL AND 57813X543X18451 != '' AND 57813X543X18451 != '99', 1, 0 ) + + IF( 57813X543X18452 IS NOT NULL AND 57813X543X18452 != '' AND 57813X543X18452 != '99', 1, 0 ) + + IF( 57813X543X18453 IS NOT NULL AND 57813X543X18453 != '' AND 57813X543X18453 != '99', 1, 0 ) + + IF( 57813X543X18454 IS NOT NULL AND 57813X543X18454 != '' AND 57813X543X18454 != '99', 1, 0 ) + + IF( 57813X543X18455 IS NOT NULL AND 57813X543X18455 != '' AND 57813X543X18455 != '99', 1, 0 ) + + IF( 57813X543X18456 IS NOT NULL AND 57813X543X18456 != '' AND 57813X543X18456 != '99', 1, 0 ) + + IF( 57813X544X18711 IS NOT NULL AND 57813X544X18711 != '' AND 57813X544X18711 != '99', 1, 0 ) + + IF( 57813X544X18712 IS NOT NULL AND 57813X544X18712 != '' AND 57813X544X18712 != '99', 1, 0 ) + + IF( 57813X544X18713 IS NOT NULL AND 57813X544X18713 != '' AND 57813X544X18713 != '99', 1, 0 ) + + IF( 57813X544X18714 IS NOT NULL AND 57813X544X18714 != '' AND 57813X544X18714 != '99', 1, 0 ) + + IF( 57813X544X18715 IS NOT NULL AND 57813X544X18715 != '' AND 57813X544X18715 != '99', 1, 0 ) + + IF( 57813X544X18716 IS NOT NULL AND 57813X544X18716 != '' AND 57813X544X18716 != '99', 1, 0 ) + + IF( 57813X544X18717 IS NOT NULL AND 57813X544X18717 != '' AND 57813X544X18717 != '99', 1, 0 ) + + IF( 57813X544X18718 IS NOT NULL AND 57813X544X18718 != '' AND 57813X544X18718 != '99', 1, 0 ) + ) + ) + ) + / COUNT(*) ), 4) as `AVG` +FROM `t1` +WHERE `submitdate` IS NOT NULL +AND ( + ( 57813X541X17271 IS NOT NULL AND 57813X541X17271 != '' AND 57813X541X17271 != '99' ) OR + ( 57813X541X17272 IS NOT NULL AND 57813X541X17272 != '' AND 57813X541X17272 != '99' ) OR + ( 57813X541X17273 IS NOT NULL AND 57813X541X17273 != '' AND 57813X541X17273 != '99' ) OR + ( 57813X541X17274 IS NOT NULL AND 57813X541X17274 != '' AND 57813X541X17274 != '99' ) OR + ( 57813X541X17275 IS NOT NULL AND 57813X541X17275 != '' AND 57813X541X17275 != '99' ) OR + ( 57813X541X17276 IS NOT NULL AND 57813X541X17276 != '' AND 57813X541X17276 != '99' ) OR + ( 57813X542X18131 IS NOT NULL AND 57813X542X18131 != '' AND 57813X542X18131 != '99' ) OR + ( 57813X542X18132 IS NOT NULL AND 57813X542X18132 != '' AND 57813X542X18132 != '99' ) OR + ( 57813X542X18133 IS NOT NULL AND 57813X542X18133 != '' AND 57813X542X18133 != '99' ) OR + ( 57813X542X18134 IS NOT NULL AND 57813X542X18134 != '' AND 57813X542X18134 != '99' ) OR + ( 57813X542X18135 IS NOT NULL AND 57813X542X18135 != '' AND 57813X542X18135 != '99' ) OR + ( 57813X542X18136 IS NOT NULL AND 57813X542X18136 != '' AND 57813X542X18136 != '99' ) OR + ( 57813X542X18137 IS NOT NULL AND 57813X542X18137 != '' AND 57813X542X18137 != '99' ) OR + ( 57813X542X18138 IS NOT NULL AND 57813X542X18138 != '' AND 57813X542X18138 != '99' ) OR + ( 57813X542X18139 IS NOT NULL AND 57813X542X18139 != '' AND 57813X542X18139 != '99' ) OR + ( 57813X543X18451 IS NOT NULL AND 57813X543X18451 != '' AND 57813X543X18451 != '99' ) OR + ( 57813X543X18452 IS NOT NULL AND 57813X543X18452 != '' AND 57813X543X18452 != '99' ) OR + ( 57813X543X18453 IS NOT NULL AND 57813X543X18453 != '' AND 57813X543X18453 != '99' ) OR + ( 57813X543X18454 IS NOT NULL AND 57813X543X18454 != '' AND 57813X543X18454 != '99' ) OR + ( 57813X543X18455 IS NOT NULL AND 57813X543X18455 != '' AND 57813X543X18455 != '99' ) OR + ( 57813X543X18456 IS NOT NULL AND 57813X543X18456 != '' AND 57813X543X18456 != '99' ) OR + ( 57813X544X18711 IS NOT NULL AND 57813X544X18711 != '' AND 57813X544X18711 != '99' ) OR + ( 57813X544X18712 IS NOT NULL AND 57813X544X18712 != '' AND 57813X544X18712 != '99' ) OR + ( 57813X544X18713 IS NOT NULL AND 57813X544X18713 != '' AND 57813X544X18713 != '99' ) OR + ( 57813X544X18714 IS NOT NULL AND 57813X544X18714 != '' AND 57813X544X18714 != '99' ) OR + ( 57813X544X18715 IS NOT NULL AND 57813X544X18715 != '' AND 57813X544X18715 != '99' ) OR + ( 57813X544X18716 IS NOT NULL AND 57813X544X18716 != '' AND 57813X544X18716 != '99' ) OR + ( 57813X544X18717 IS NOT NULL AND 57813X544X18717 != '' AND 57813X544X18717 != '99' ) OR + ( 57813X544X18718 IS NOT NULL AND 57813X544X18718 != '' AND 57813X544X18718 != '99' ) ) +AND 57813X540X1723 = 'Test'; + +drop table t1; --echo # --echo # End of 5.5 tests diff --git a/mysql-test/t/information_schema2.test b/mysql-test/t/information_schema2.test index 06bc6d1bf555400217a8b648a96b606003c7f673..9810c5a0aae015f359a4f3304aafd17ad44e38ea 100644 --- a/mysql-test/t/information_schema2.test +++ b/mysql-test/t/information_schema2.test @@ -8,15 +8,12 @@ select variable_name from information_schema.session_variables where variable_na (select variable_name from information_schema.session_variables where variable_name = 'basedir'); # -# information_schema tables inside subqueries, they should not be re-populated -# (i_s.columns needs to scan i_s itself, creating a tmp table for every i_s -# table. if it's re-populated, it'll do that multiple times) +# MDEV-8796 Delete with sub query with information_schema.TABLES deletes too many rows # -create table t1 (a char); -insert t1 values ('a'),('t'),('z'); -flush status; -select a, exists (select 1 from information_schema.columns where table_schema=concat('tes',a)) from t1; -# fix the result in ps-protocol ---replace_result 39 38 -show status like 'created_tmp_tables'; -drop table t1; +create table t1 (x int); +create table t2 (x int); +create table t3 (x int); +create table t4 AS select table_name from information_schema.TABLES where table_schema = database() and table_type = 'BASE TABLE' ; +delete from t4 where table_name not in (select table_name from information_schema.TABLES where table_schema = database() and table_type = 'BASE TABLE'); +select * from t4; +drop table t1, t2, t3, t4; diff --git a/mysql-test/t/innodb_load_xa.test b/mysql-test/t/innodb_load_xa.test index 52862151b22d9a5e939d81e9a37dc80535bbd236..9ecddde5d130117aba99242b6cf5aa9df8aad66b 100644 --- a/mysql-test/t/innodb_load_xa.test +++ b/mysql-test/t/innodb_load_xa.test @@ -16,3 +16,6 @@ commit; --source include/show_binlog_events.inc drop table t1; uninstall plugin innodb; + +--source include/restart_mysqld.inc + diff --git a/mysql-test/t/loadxml.test b/mysql-test/t/loadxml.test index 6faf712b6ce88d2c0c7154793bd0a6063ea2bf6a..93e6e82189f064adb4a22dd0550560cc17c27e45 100644 --- a/mysql-test/t/loadxml.test +++ b/mysql-test/t/loadxml.test @@ -116,3 +116,17 @@ LOAD XML INFILE '../../std_data/loadxml.dat' INTO TABLE t1 ROWS IDENTIFIED BY '' (a,@b) SET b=concat('!',@b); SELECT * FROM t1 ORDER BY a; DROP TABLE t1; + + +--echo # +--echo # Bug#16171518 LOAD XML DOES NOT HANDLE EMPTY ELEMENTS +--echo # +CREATE TABLE t1 (col1 VARCHAR(3), col2 VARCHAR(3), col3 VARCHAR(3), col4 VARCHAR(4)); +LOAD XML INFILE '../../std_data/bug16171518_1.dat' INTO TABLE t1; +SELECT * FROM t1 ORDER BY col1, col2, col3, col4; +DROP TABLE t1; + +CREATE TABLE t1 (col1 VARCHAR(3), col2 VARCHAR(3), col3 INTEGER); +LOAD XML INFILE '../../std_data/bug16171518_2.dat' INTO TABLE t1; +SELECT * FROM t1 ORDER BY col1, col2, col3; +DROP TABLE t1; diff --git a/mysql-test/t/lowercase_fs_on.test b/mysql-test/t/lowercase_fs_on.test new file mode 100644 index 0000000000000000000000000000000000000000..6da3ef32a0bc1d92d6d0515dd87f3e493a82f042 --- /dev/null +++ b/mysql-test/t/lowercase_fs_on.test @@ -0,0 +1,38 @@ +# +# Specific tests for case-insensitive file systems +# i.e. lower_case_filesystem=ON +# +-- source include/have_case_insensitive_file_system.inc +# Embedded server does not support restarting. +--source include/not_embedded.inc + +--echo # +--echo # Bug#20198490 : LOWER_CASE_TABLE_NAMES=0 ON WINDOWS LEADS TO PROBLEMS +--echo # + +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err; + +--error 0,1 +--remove_file $SEARCH_FILE + +#Shutdown the server +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--shutdown_server +--source include/wait_until_disconnected.inc + +#Start the server with --lower_case_table_names=0 in Windows. +--enable_reconnect +--error 1 +--exec $MYSQLD_CMD --lower_case_table_names=0 > $SEARCH_FILE 2>&1 + +#Search for the error messege in the server error log. +let SEARCH_PATTERN= \[ERROR\] The server option \'lower_case_table_names\' is configured to use case sensitive table names but the data directory is on a case-insensitive file system which is an unsupported combination\. Please consider either using a case sensitive file system for your data directory or switching to a case-insensitive table name mode\.; +--source include/search_pattern_in_file.inc + +#Restart the server +--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--source include/wait_until_connected_again.inc + +#Cleanup +--error 0,1 +--remove_file $SEARCH_FILE diff --git a/mysql-test/t/lowercase_table3-master.opt b/mysql-test/t/lowercase_table3-master.opt deleted file mode 100644 index 9b27aef9bf8e6e42b46e1ecc601977e7df030904..0000000000000000000000000000000000000000 --- a/mysql-test/t/lowercase_table3-master.opt +++ /dev/null @@ -1 +0,0 @@ ---lower_case_table_names=0 diff --git a/mysql-test/t/lowercase_table3.test b/mysql-test/t/lowercase_table3.test deleted file mode 100644 index f7ca821128807b6c641d9dfbd6d5529358443a8e..0000000000000000000000000000000000000000 --- a/mysql-test/t/lowercase_table3.test +++ /dev/null @@ -1,37 +0,0 @@ -# -# Test of force of lower-case-table-names=0 -# (User has case insensitive file system and wants to preserve case of -# table names) -# - ---source include/have_innodb.inc ---source include/have_lowercase0.inc ---source include/have_case_insensitive_file_system.inc ---source include/not_windows.inc - -call mtr.add_suppression("Cannot find or open table test/BUG29839 from"); - ---disable_warnings -DROP TABLE IF EXISTS t1,T1; ---enable_warnings - -# -# This is actually an error, but ok as the user has forced this -# by using --lower-case-table-names=0 -CREATE TABLE t1 (a INT); -SELECT * FROM T1; -FLUSH TABLES; -DROP TABLE t1; - -# -# InnoDB should in this case be case sensitive -# Note that this is not true on windows as no this OS, InnoDB is always -# storing things in lower case. -# - -CREATE TABLE bug29839 (a INT) ENGINE=INNODB; ---error ER_NO_SUCH_TABLE -SELECT * FROM BUG29839; -DROP TABLE bug29839; - -# End of 4.1 tests diff --git a/mysql-test/t/merge_recover-master.opt b/mysql-test/t/myisam_recover-master.opt similarity index 100% rename from mysql-test/t/merge_recover-master.opt rename to mysql-test/t/myisam_recover-master.opt diff --git a/mysql-test/t/merge_recover.test b/mysql-test/t/myisam_recover.test similarity index 61% rename from mysql-test/t/merge_recover.test rename to mysql-test/t/myisam_recover.test index f2cb204eeb6697dce7109bba6611de3f43857eaa..49fe9c334608e0aa8e2fe4249fa6fcdd79bc4581 100644 --- a/mysql-test/t/merge_recover.test +++ b/mysql-test/t/myisam_recover.test @@ -1,5 +1,9 @@ +--source include/count_sessions.inc + +--echo # +--echo # Tests for corrupted MyISAM tables and MyISAMMRG tables with corrupted +--echo # children.. --echo # ---echo # Test of MyISAM MRG tables with corrupted children. --echo # Run with --myisam-recover=force option. --echo # --echo # Preparation: we need to make sure that the merge parent @@ -57,10 +61,10 @@ eval $lock; --echo # connection default; --echo # ---echo # We have to disable the ps-protocol, to avoid +--echo # We have to disable the ps-protocol, to avoid --echo # "Prepared statement needs to be re-prepared" errors --echo # -- table def versions change all the time with full table cache. ---echo # +--echo # --disable_ps_protocol --disable_warnings drop table if exists t1, t1_mrg, t1_copy; @@ -69,12 +73,12 @@ let $MYSQLD_DATADIR=`select @@datadir`; --echo # --echo # Prepare a MERGE engine table, that refers to a corrupted --echo # child. ---echo # +--echo # create table t1 (a int, key(a)) engine=myisam; create table t1_mrg (a int) union (t1) engine=merge; --echo # --echo # Create a table with a corrupted index file: ---echo # save an old index file, insert more rows, +--echo # save an old index file, insert more rows, --echo # overwrite the new index file with the old one. --echo # insert into t1 (a) values (1), (2), (3); @@ -111,3 +115,66 @@ set @@global.table_open_cache=default; disconnect con1; connection default; --enable_ps_protocol + +--echo # +--echo # 18075170 - sql node restart required to avoid deadlock after +--echo # restore +--echo # +--echo # Check that auto-repair for MyISAM tables can now happen in the +--echo # middle of transaction, without aborting it. +--enable_prepare_warnings + +connection default; + +create table t1 (a int, key(a)) engine=myisam; +create table t2 (a int); +insert into t2 values (1); + +--echo # Create a table with a corrupted index file: +--echo # save an old index file, insert more rows, +--echo # overwrite the new index file with the old one. +insert into t1 (a) values (1); +flush table t1; +--copy_file $MYSQLD_DATADIR/test/t1.MYI $MYSQLD_DATADIR/test/t1_copy.MYI +insert into t1 (a) values (4); +flush table t1; +--remove_file $MYSQLD_DATADIR/test/t1.MYI +--copy_file $MYSQLD_DATADIR/test/t1_copy.MYI $MYSQLD_DATADIR/test/t1.MYI +--remove_file $MYSQLD_DATADIR/test/t1_copy.MYI + +--echo # Check table is needed to mark the table as crashed. +check table t1; + +--echo # At this point we have a corrupt t1 +set autocommit = 0; +select * from t2; +--echo # Without fix select from t1 will break the transaction. After the fix +--echo # transaction should be active and should hold lock on table t2. Alter +--echo # table from con2 will wait only if the transaction is not broken. +--replace_regex /'.*[\/\\]/'/ +select * from t1; + +connect(con2, localhost, root); +--SEND ALTER TABLE t2 ADD val INT + +connection default; +--echo # With fix we should have alter table waiting for t2 lock here. +let $wait_condition= + SELECT count(*) = 1 FROM information_schema.processlist WHERE state + LIKE "Waiting%" AND info = "ALTER TABLE t2 ADD val INT"; + +--source include/wait_condition.inc +ROLLBACK; +SET autocommit = 1; + +connection con2; +--REAP + +connection default; +disconnect con2; + +--echo # Cleanup +drop table t1, t2; + +# Wait till all disconnects are completed +-- source include/wait_until_count_sessions.inc diff --git a/mysql-test/t/mysql_upgrade.test b/mysql-test/t/mysql_upgrade.test index e4923e5f429a795d19074cc43921cc6b5c1b7a7b..13be03aa9bba02981ea8c60cbb3e4e1c59671b03 100644 --- a/mysql-test/t/mysql_upgrade.test +++ b/mysql-test/t/mysql_upgrade.test @@ -14,7 +14,6 @@ file_exists $MYSQLD_DATADIR/mysql_upgrade_info; --echo Run it again - should say already completed --replace_result $MYSQL_SERVER_VERSION VERSION ---error 1 --exec $MYSQL_UPGRADE 2>&1 # It should have created a file in the MySQL Servers datadir diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 249f16e3a26612e045723557ade55191cb6764f2..e0c0ce346edb6141c87033a65064156f62026d1a 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -901,13 +901,8 @@ select * from t1; create view v1 as select * from v3 where b in (1, 2, 3, 4, 5, 6, 7); -# Disable warnings since LIMIT warning for unsafe statement if -# binlog_format = STATEMENT. Note: after BUG#45832, the warning should -# not be issued. ---disable_warnings create view v2 as select v3.a from v3, v1 where v1.a=v3.a and v3.b=3 limit 1; ---enable_warnings --exec $MYSQL_DUMP --skip-comments test @@ -1777,7 +1772,7 @@ drop table words; --replace_regex /.*mysqlimport(\.exe)*/mysqlimport/ --replace_result mysqldump.exe mysqldump --error 1 ---exec $MYSQL_IMPORT --silent --use-threads=2 test $MYSQLTEST_VARDIR/tmp/t1.txt $MYSQLTEST_VARDIR/tmp/t2.txt $MYSQLTEST_VARDIR/std_data/words.dat $MYSQLTEST_VARDIR/std_data/words2.dat 2>&1 +--exec $MYSQL_IMPORT --silent --use-threads=2 test $MYSQLTEST_VARDIR/tmp/t1.txt $MYSQLTEST_VARDIR/tmp/t2.txt $MYSQLTEST_VARDIR/std_data/words.dat $MYSQLTEST_VARDIR/std_data/words2.dat drop table t1; drop table t2; @@ -2456,6 +2451,35 @@ drop table t1, t2; --echo # End of 5.1 tests --echo # +--echo # +--echo # Bug #20772273 : MYSQLIMPORT --USE-THREADS DOESN'T USE MULTIPLE THREADS +--echo # + +CREATE DATABASE db_20772273; +USE db_20772273; +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES (1), (2); +CREATE TABLE t2(a INT); +INSERT INTO t2 VALUES (3), (4); + +SELECT * FROM t1; +SELECT * FROM t2; + +--exec $MYSQL_DUMP --tab=$MYSQLTEST_VARDIR/tmp/ db_20772273 +--exec $MYSQL db_20772273 < $MYSQLTEST_VARDIR/tmp/t1.sql +--exec $MYSQL db_20772273 < $MYSQLTEST_VARDIR/tmp/t2.sql + +# Test mysqlimport with multiple threads +--exec $MYSQL_IMPORT --silent --use-threads=2 db_20772273 $MYSQLTEST_VARDIR/tmp/t1.txt $MYSQLTEST_VARDIR/tmp/t2.txt + +SELECT * FROM t1; +SELECT * FROM t2; + +#Cleanup +DROP TABLE t1; +DROP TABLE t2; +DROP DATABASE db_20772273; + # # MDEV-6091 mysqldump goes in a loop and segfaults if --dump-slave is specified and it cannot connect to the server # diff --git a/mysql-test/t/partition_error.test b/mysql-test/t/partition_error.test index 64799574140816775aa7a42b4bd5342e690d07a0..6b6e54b10526176f41da85f4dd2c388193819798 100644 --- a/mysql-test/t/partition_error.test +++ b/mysql-test/t/partition_error.test @@ -1146,7 +1146,7 @@ subpartition by hash (rand(a+b)); # # Subpartition by hash, wrong subpartition function # ---error ER_SUBPARTITION_ERROR +--error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED CREATE TABLE t1 ( a int not null, b int not null, diff --git a/mysql-test/t/sp-group.test b/mysql-test/t/sp-group.test new file mode 100644 index 0000000000000000000000000000000000000000..2083ac97595776cada80ae902e4d77d51d0c06fb --- /dev/null +++ b/mysql-test/t/sp-group.test @@ -0,0 +1,187 @@ +--source include/have_innodb.inc + +drop table if exists t1; +drop view if exists view_t1; + +# +# Test case for MDEV 7601, MDEV-7594 and MDEV-7555 +# Server crashes in functions related to stored procedures +# Server crashes in different ways while executing concurrent +# flow involving views and non-empty sql_mode with ONLY_FULL_GROUP_BY +# + +SET sql_mode=ONLY_FULL_GROUP_BY; + +CREATE TABLE t1 ( + pk INT, + f0 INT, f1 INT, f2 INT, f3 INT, f4 INT, + f5 INT, f6 INT, f7 INT, f8 INT, f9 INT, + PRIMARY KEY (pk) +); + +CREATE VIEW view_t1 AS SELECT * FROM t1; +CREATE PROCEDURE s1() + SELECT * FROM ( + INFORMATION_SCHEMA.`INNODB_BUFFER_PAGE_LRU` AS table1 + LEFT JOIN test.view_t1 AS table2 + ON ( table2.`f6` = table1.FREE_PAGE_CLOCK) + ) + ORDER BY table1.NUMBER_RECORDS + LIMIT 0 +; +CALL s1; +CALL s1; + +drop table t1; +drop view view_t1; +drop procedure s1; + +# +# MDEV-7590 +# Server crashes in st_select_lex_unit::cleanup on executing a trigger +# + +CREATE TABLE A ( + pk INTEGER AUTO_INCREMENT, + col_int_key INTEGER, + col_varchar_key VARCHAR(1), + PRIMARY KEY (pk) +) ENGINE=MyISAM; +CREATE VIEW view_A AS SELECT * FROM A; +CREATE TABLE C ( + pk INTEGER AUTO_INCREMENT, + col_int_nokey INTEGER, + col_int_key INTEGER, + col_date_key DATE, + col_date_nokey DATE, + col_time_key TIME, + col_time_nokey TIME, + col_datetime_key DATETIME, + col_datetime_nokey DATETIME, + col_varchar_key VARCHAR(1), + col_varchar_nokey VARCHAR(1), + PRIMARY KEY (pk) +) ENGINE=MyISAM; +CREATE VIEW view_C AS SELECT * FROM C; +CREATE TABLE AA ( + pk INTEGER AUTO_INCREMENT, + col_int_nokey INTEGER, + col_int_key INTEGER, + col_date_key DATE, + col_date_nokey DATE, + col_time_key TIME, + col_time_nokey TIME, + col_datetime_key DATETIME, + col_datetime_nokey DATETIME, + col_varchar_key VARCHAR(1), + col_varchar_nokey VARCHAR(1), + PRIMARY KEY (pk), + KEY (col_varchar_key, col_int_key) +) ENGINE=MyISAM; +CREATE VIEW view_AA AS SELECT * FROM AA; +CREATE TABLE BB ( + pk INTEGER AUTO_INCREMENT, + col_int_key INTEGER, + col_varchar_key VARCHAR(1), + col_varchar_nokey VARCHAR(1), + PRIMARY KEY (pk), + KEY (col_varchar_key, col_int_key) +) ENGINE=MyISAM; +CREATE VIEW view_BB AS SELECT * FROM BB; +CREATE TABLE DD ( + pk INTEGER AUTO_INCREMENT, + col_int_key INTEGER, + col_date_key DATE, + col_time_key TIME, + col_datetime_key DATETIME, + col_varchar_key VARCHAR(1), + PRIMARY KEY (pk), + KEY (col_varchar_key, col_int_key) +) ENGINE=MyISAM; +CREATE VIEW view_DD AS SELECT * FROM DD; +CREATE TRIGGER k BEFORE INSERT ON `DD` FOR EACH ROW INSERT INTO `view_BB` SELECT * FROM `view_A` LIMIT 0 ; +CREATE TRIGGER r BEFORE INSERT ON `A` FOR EACH ROW INSERT INTO `view_AA` SELECT * FROM `view_C` LIMIT 0 ; +--error ER_WRONG_AUTO_KEY +ALTER TABLE `DD` DROP PRIMARY KEY; +INSERT INTO `view_A` ( `pk` ) VALUES (NULL); +--error 0,ER_WRONG_VALUE_COUNT_ON_ROW +INSERT INTO `DD` ( `pk` ) VALUES (NULL); +INSERT INTO `A` ( `pk` ) VALUES (NULL); +--error 0,ER_WRONG_VALUE_COUNT_ON_ROW +INSERT INTO `view_DD` ( `pk` ) VALUES (NULL); + +drop trigger r; +drop trigger k; +drop view view_A,view_AA,view_C,view_BB,view_DD; +drop table A,C,AA,BB,DD; + +# +# MDEV-7581 +# Server crashes in st_select_lex_unit::cleanup after a sequence of statements +# + +CREATE TABLE A ( + i INT, + i1 INT, + i2 INT, + d1 DATE, + d2 DATE, + col_time_nokey1 TIME, + col_time_nokey2 TIME, + col_datetime_nokey1 DATETIME, + col_datetime_nokey2 DATETIME, + col_varchar_nokey1 VARCHAR(1), + col_varchar_nokey2 VARCHAR(1) +) ENGINE=MyISAM; + +CREATE VIEW view_A AS SELECT * FROM A; + +CREATE TABLE B ( + col_varchar_nokey VARCHAR(1) +) ENGINE=MyISAM; + +CREATE TABLE AA ( + i INT, + i1 INT, + i2 INT, + d1 DATE, + d2 DATE, + col_time_nokey1 TIME, + col_time_nokey2 TIME, + col_datetime_nokey1 DATETIME, + col_datetime_nokey2 DATETIME, + col_varchar_nokey1 VARCHAR(1), + col_varchar_nokey2 VARCHAR(1) +) ENGINE=MyISAM; + +CREATE VIEW view_AA AS SELECT * FROM AA; + +CREATE TABLE DD ( + i INT, + i1 INT, + i2 INT, + d1 DATE, + d2 DATE, + col_time_nokey1 TIME, + col_time_nokey2 TIME, + col_datetime_nokey1 DATETIME, + col_datetime_nokey2 DATETIME, + col_varchar_nokey1 VARCHAR(1), + col_varchar_nokey2 VARCHAR(1) +) ENGINE=MyISAM; + +CREATE VIEW view_DD AS SELECT * FROM DD; + +CREATE TRIGGER tr1 BEFORE INSERT ON `AA` FOR EACH ROW INSERT INTO `view_A` SELECT * FROM `view_AA` LIMIT 0 ; +CREATE TRIGGER tr2 BEFORE INSERT ON `B` FOR EACH ROW INSERT INTO `D` SELECT * FROM `A` LIMIT 0 ; + +INSERT INTO `view_AA` ( `i` ) VALUES (1); +INSERT INTO `AA` ( `i` ) VALUES (2); +DELETE FROM `B`; +INSERT INTO `view_DD` ( `i` ) VALUES (1); +INSERT INTO `view_AA` ( `i` ) VALUES (3); + +drop trigger tr1; +drop trigger tr2; +drop view view_A, view_AA,view_DD; +drop table A,B,AA,DD; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index d1c3774947a391f3473721512d4bf2bea3ae673c..67eac0d228cc1a013f009c567e6d80934b2703c4 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -53,7 +53,7 @@ SELECT 1 IN (SELECT 1); SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a)); -- error ER_WRONG_USAGE select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); --- error ER_WRONG_PARAMETERS_TO_PROCEDURE +-- error ER_PARSE_ERROR SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); -- error ER_BAD_FIELD_ERROR SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; @@ -5890,3 +5890,77 @@ DROP TABLE t1,t2; create table t1 (c int); select exists(select 1 from t1 group by `c` in (select `c` from t1)); drop table t1; + +--echo # +--echo # MDEV-7565: Server crash with Signal 6 (part 2) +--echo # +Select + (Select Sum(`TestCase`.Revenue) From mysql.slow_log E + Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) + ) As `ControlRev` +From +(Select 3 as Revenue, 4 as TemplateID) As `TestCase` +Group By TestCase.Revenue, TestCase.TemplateID; + +--echo # +--echo # MDEV-7445:Server crash with Signal 6 +--echo # + +--delimiter | +CREATE PROCEDURE procedure2() +BEGIN + Select + (Select Sum(`TestCase`.Revenue) From mysql.slow_log E + Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) + ) As `ControlRev` + From + (Select 3 as Revenue, 4 as TemplateID) As `TestCase` + Group By TestCase.Revenue, TestCase.TemplateID; + +END | +--delimiter ; +call procedure2(); +call procedure2(); + +drop procedure procedure2; + + +SELECT + (SELECT user FROM mysql.user + WHERE h.host in (SELECT host FROM mysql.user) + ) AS sq +FROM mysql.host h GROUP BY h.host; + + +--echo # +--echo # MDEV-7846:Server crashes in Item_subselect::fix +--echo #_fields or fails with Thread stack overrun +--echo # +CREATE TABLE t1 (column1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (3),(9); + +CREATE TABLE t2 (column2 INT) ENGINE=MyISAM; + +INSERT INTO t2 VALUES (1),(4); + +CREATE TABLE t3 (column3 INT) ENGINE=MyISAM; +INSERT INTO t3 VALUES (6),(8); + +CREATE TABLE t4 (column4 INT) ENGINE=MyISAM; +INSERT INTO t4 VALUES (2),(5); + + +PREPARE stmt FROM " +SELECT ( + SELECT MAX( table1.column1 ) AS field1 + FROM t1 AS table1 + WHERE table3.column3 IN ( SELECT table2.column2 AS field2 FROM t2 AS table2 ) +) AS sq +FROM t3 AS table3, t4 AS table4 GROUP BY sq +"; + +EXECUTE stmt; +EXECUTE stmt; + +deallocate prepare stmt; +drop table t1,t2,t3,t4; diff --git a/mysql-test/t/subselect_sj_mat.test b/mysql-test/t/subselect_sj_mat.test index 912e9d5befdcc284b19b188fc4a7a1908e1e30ac..dd30b21201d964ca0b71111788193a93902a6174 100644 --- a/mysql-test/t/subselect_sj_mat.test +++ b/mysql-test/t/subselect_sj_mat.test @@ -1841,5 +1841,20 @@ drop database mysqltest2; drop database mysqltest3; drop database mysqltest4; ---echo # End of 5.5 tests +--echo # +--echo # MDEV-7810 Wrong result on execution of a query as a PS +--echo # (both 1st and further executions) + +CREATE TABLE t1 (a INT NOT NULL) ENGINE=MyISAM; +INSERT INTO t1 VALUES (0),(8); + +SELECT a FROM (SELECT DISTINCT * FROM t1) AS sq WHERE a IN (SELECT MIN(t2.a) FROM (t1 AS t2)); +PREPARE stmt FROM " +SELECT a FROM (SELECT DISTINCT * FROM t1) AS sq WHERE a IN (SELECT MIN(t2.a) FROM (t1 AS t2)) +"; +execute stmt; +execute stmt; +drop table t1; + +--echo # End of 5.5 tests diff --git a/mysql-test/t/update.test b/mysql-test/t/update.test index daa20509ab6a4f8a09bc297ea7f01a47f9c0a746..be97dd02dc7c47635addc94dd78aa6107723985a 100644 --- a/mysql-test/t/update.test +++ b/mysql-test/t/update.test @@ -506,6 +506,21 @@ DROP VIEW v1; DROP FUNCTION f1; DROP TABLE t1; +--echo # Bug #21143080: UPDATE ON VARCHAR AND TEXT COLUMNS PRODUCE INCORRECT +--echo # RESULTS + +CREATE TABLE t1 (a VARCHAR(50), b TEXT, c CHAR(50)) ENGINE=INNODB; + +INSERT INTO t1 (a, b, c) VALUES ('start trail', '', 'even longer string'); +UPDATE t1 SET b = a, a = 'inject'; +SELECT a, b FROM t1; +UPDATE t1 SET b = c, c = 'inject'; +SELECT c, b FROM t1; + +DROP TABLE t1; + +--echo # +--echo # MDEV-3948 Assertion `records_are_comparable(table)' fails in compare_record(const TABLE*) on UPDATE with simple AND condition, index_merge+index_merge_intersection, InnoDB --echo # --echo # Verify that UPDATE does the same number of handler_update --echo # operations, no matter if there is ORDER BY or not. diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 0432db0ba31ed145e15af5b22a0239c8ffe00a8a..fe04cdfecec88d7618dc737c67dd8ca2f2b793df 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -4741,6 +4741,50 @@ SHOW CREATE VIEW v4; DROP VIEW v1, v2, v3, v4, v5; + +--echo # +--echo # BUG#19886430: VIEW CREATION WITH NAMED COLUMNS, OVER UNION, +--echo # IS REJECTED + +--echo # Without the patch, reports an error. +CREATE VIEW v1 (fld1, fld2) AS + SELECT 1 AS a, 2 AS b + UNION ALL + SELECT 1 AS a, 1 AS a; + +--echo # The column names are explicitly specified and not duplicates, hence +--echo # succeeds. +CREATE VIEW v2 (fld1, fld2) AS + SELECT 1 AS a, 2 AS a + UNION ALL + SELECT 1 AS a, 1 AS a; + +--echo # The column name in the first SELECT are not duplicates, hence succeeds. +CREATE VIEW v3 AS + SELECT 1 AS a, 2 AS b + UNION ALL + SELECT 1 AS a, 1 AS a; + +--echo # Should report an error, since the explicitly specified column names are +--echo # duplicates. +--error ER_DUP_FIELDNAME +CREATE VIEW v4 (fld1, fld1) AS + SELECT 1 AS a, 2 AS b + UNION ALL + SELECT 1 AS a, 1 AS a; + +--echo # Should report an error, since duplicate column name is specified in the +--echo # First SELECT. +--error ER_DUP_FIELDNAME +CREATE VIEW v4 AS + SELECT 1 AS a, 2 AS a + UNION ALL + SELECT 1 AS a, 1 AS a; + +--echo # Cleanup +DROP VIEW v1, v2, v3; + + # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc @@ -5380,6 +5424,27 @@ show create view v2; drop view v2; drop table t1; +--echo # +--echo # MDEV-8554: Server crashes in base_list_iterator::next_fast on 1st execution of PS with a multi-table update +--echo # +CREATE TABLE t1 (a INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1),(2); # Not necessary, the table can be empty + +CREATE TABLE t2 (b INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (3),(4); # Not necessary, the table can be empty + +CREATE TABLE t3 (c INT) ENGINE=MyISAM; +INSERT INTO t3 VALUES (5),(6); # Not necessary, the table can be empty + +CREATE OR REPLACE ALGORITHM=MERGE VIEW v3 AS SELECT * FROM t3; + +PREPARE stmt FROM 'UPDATE t1, t2 SET a = 1 WHERE a IN ( SELECT 0 FROM t3 )'; +UPDATE t1, t2 SET a = 1 WHERE a IN ( SELECT 0 FROM v3 ); +EXECUTE stmt; + +DROP TABLE t1, t2, t3; +DROP VIEW v3; + --echo # ----------------------------------------------------------------- --echo # -- End of 5.5 tests. --echo # ----------------------------------------------------------------- diff --git a/mysys/ptr_cmp.c b/mysys/ptr_cmp.c index a481b4d961cf295d4938542795291e5ef01e7ab6..6e373e989724ebdd614ecfc58c867f004c70aff3 100644 --- a/mysys/ptr_cmp.c +++ b/mysys/ptr_cmp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -91,6 +91,7 @@ static int ptr_compare(size_t *compare_length, uchar **a, uchar **b) reg3 int length= *compare_length; reg1 uchar *first,*last; + DBUG_ASSERT(length > 0); first= *a; last= *b; while (--length) { diff --git a/regex/regcomp.c b/regex/regcomp.c index abc18174f5653374fbbeb2a939ed0280b6b6891d..b1074a1d79ccdd62969e75312e212555948dd436 100644 --- a/regex/regcomp.c +++ b/regex/regcomp.c @@ -1,3 +1,11 @@ +/* Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved. + See file COPYRIGHT for details. + + This file was modified by Oracle on 2015-05-18 for 32-bit compatibility. + + Modifications copyright (c) 2015, Oracle and/or its affiliates. All rights + reserved. */ + #include #include #include @@ -133,12 +141,26 @@ CHARSET_INFO *charset; } else len = strlen((char *)pattern); + /* + Find the maximum len we can safely process + without a rollover and a mis-malloc. + p->ssize is a sopno is a long (32+ bit signed); + size_t is 16+ bit unsigned. + */ + { + size_t new_ssize = len / (size_t)2 * (size_t)3 + (size_t)1; /* ugh */ + if ((new_ssize < len) || /* size_t rolled over */ + ((SIZE_T_MAX / sizeof(sop)) < new_ssize) || /* malloc arg */ + (new_ssize > LONG_MAX)) /* won't fit in ssize */ + return(REG_ESPACE); /* MY_REG_ESPACE or MY_REG_INVARG */ + p->ssize = new_ssize; + } + /* do the mallocs early so failure handling is easy */ g = (struct re_guts *)malloc(sizeof(struct re_guts) + (NC-1)*sizeof(cat_t)); if (g == NULL) return(REG_ESPACE); - p->ssize = (long) (len/(size_t)2*(size_t)3 + (size_t)1); /* ugh */ p->strip = (sop *)malloc(p->ssize * sizeof(sop)); p->slen = 0; if (p->strip == NULL) { diff --git a/sql/field.cc b/sql/field.cc index a24ffe286004e5cff7bfc00ab32104d4934a8477..aeeacf7f88da9e819d5c9555c2956bcecbe02041 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7612,7 +7612,8 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs) } Field_blob::store_length(length); - if (table->copy_blobs || length <= MAX_FIELD_WIDTH) + if ((table->copy_blobs || length <= MAX_FIELD_WIDTH) && + from != value.ptr()) { // Must make a copy value.copy(from, length, cs); from= value.ptr(); diff --git a/sql/field.h b/sql/field.h index 130d33e46c40303c009caaa8fc9298c6af5668cd..b20bedbecc95e4565dab2d46c7f38ba7c02d4f0d 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1,7 +1,7 @@ #ifndef FIELD_INCLUDED #define FIELD_INCLUDED -/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2008, 2014, SkySQL Ab. +/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. + Copyright (c) 2008, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -638,6 +638,16 @@ class Field /* Hash value */ virtual void hash(ulong *nr, ulong *nr2); +/** + Checks whether a string field is part of write_set. + + @return + FALSE - If field is not char/varchar/.... + - If field is char/varchar/.. and is not part of write set. + TRUE - If field is char/varchar/.. and is part of write set. +*/ + virtual bool is_updatable() const { return FALSE; } + /* Check whether the field can be used as a join attribute in hash join */ virtual bool hash_join_is_possible() { return TRUE; } virtual bool eq_cmp_as_binary() { return TRUE; } @@ -824,6 +834,11 @@ class Field_longstr :public Field_str int store_decimal(const my_decimal *d); uint32 max_data_length() const; + bool is_updatable() const + { + DBUG_ASSERT(table && table->write_set); + return bitmap_is_set(table->write_set, field_index); + } }; /* base class for float and double and decimal (old one) */ diff --git a/sql/field_conv.cc b/sql/field_conv.cc index d6a53a9a2fc2ce5ca09f4a2687c0862d05d9ba32..d24f31e4fa1676f0a6c575ce745d93f959e2d8ab 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -1,7 +1,6 @@ /* - Copyright (c) 2000, 2012, Oracle and/or its affiliates. - Copyright (c) 2010, 2012, Monty Program Ab - + Copyright (c) 2000, 2015, Oracle and/or its affiliates. + Copyright (c) 2010, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -863,15 +862,10 @@ int field_conv(Field *to,Field *from) { // Be sure the value is stored Field_blob *blob=(Field_blob*) to; from->val_str(&blob->value); - /* - Copy value if copy_blobs is set, or source is not a string and - we have a pointer to its internal string conversion buffer. - */ - if (to->table->copy_blobs || - (!blob->value.is_alloced() && - from->real_type() != MYSQL_TYPE_STRING && - from->real_type() != MYSQL_TYPE_VARCHAR)) + + if (!blob->value.is_alloced() && from->is_updatable()) blob->value.copy(); + return blob->store(blob->value.ptr(),blob->value.length(),from->charset()); } if (from->real_type() == MYSQL_TYPE_ENUM && diff --git a/sql/item.cc b/sql/item.cc index f8d1c85f44752a901634c8a6576035005a4411f3..878c9604ca27f7a4b54da7c935e79f5c1678c987 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1146,18 +1146,24 @@ Item *Item::safe_charset_converter(CHARSET_INFO *tocs) because Item_singlerow_subselect later calls Item_cache-specific methods, e.g. row[i]->store() and row[i]->cache_value(). - Let's wrap Item_func_conv_charset to a new Item_cache, + Let's wrap Item_func_conv_charset in a new Item_cache, so the Item_cache-specific methods can still be used for Item_singlerow_subselect::row[i] safely. + As a bonus we cache the converted value, instead of converting every time + TODO: we should eventually check all other use cases of change_item_tree(). Perhaps some more potentially dangerous substitution examples exist. */ Item *Item_cache::safe_charset_converter(CHARSET_INFO *tocs) { - Item_func_conv_charset *conv= new Item_func_conv_charset(example, tocs, 1); + if (!example) + return Item::safe_charset_converter(tocs); + Item *conv= example->safe_charset_converter(tocs); + if (conv == example) + return this; Item_cache *cache; - if (!conv || !conv->safe || !(cache= new Item_cache_str(conv))) + if (!conv || !(cache= new Item_cache_str(conv))) return NULL; // Safe conversion is not possible, or OEM cache->setup(conv); cache->fixed= false; // Make Item::fix_fields() happy @@ -4409,18 +4415,23 @@ static bool mark_as_dependent(THD *thd, SELECT_LEX *last, SELECT_LEX *current, Item_ident *resolved_item, Item_ident *mark_item) { - const char *db_name= (resolved_item->db_name ? - resolved_item->db_name : ""); - const char *table_name= (resolved_item->table_name ? - resolved_item->table_name : ""); + DBUG_ENTER("mark_as_dependent"); + /* store pointer on SELECT_LEX from which item is dependent */ if (mark_item && mark_item->can_be_depended) + { + DBUG_PRINT("info", ("mark_item: %p lex: %p", mark_item, last)); mark_item->depended_from= last; - if (current->mark_as_dependent(thd, last, /** resolved_item psergey-thu - **/mark_item)) - return TRUE; + } + if (current->mark_as_dependent(thd, last, + /** resolved_item psergey-thu **/ mark_item)) + DBUG_RETURN(TRUE); if (thd->lex->describe & DESCRIBE_EXTENDED) { + const char *db_name= (resolved_item->db_name ? + resolved_item->db_name : ""); + const char *table_name= (resolved_item->table_name ? + resolved_item->table_name : ""); push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, ER_WARN_FIELD_RESOLVED, ER(ER_WARN_FIELD_RESOLVED), db_name, (db_name[0] ? "." : ""), @@ -4428,7 +4439,7 @@ static bool mark_as_dependent(THD *thd, SELECT_LEX *last, SELECT_LEX *current, resolved_item->field_name, current->select_number, last->select_number); } - return FALSE; + DBUG_RETURN(FALSE); } @@ -4877,7 +4888,7 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference) non aggregated fields of the outer select. */ marker= select->cur_pos_in_select_list; - select->non_agg_fields.push_back(this); + select->join->non_agg_fields.push_back(this); } if (*from_field != view_ref_found) { @@ -5293,9 +5304,10 @@ bool Item_field::fix_fields(THD *thd, Item **reference) fixed= 1; if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY && !outer_fixed && !thd->lex->in_sum_func && - thd->lex->current_select->cur_pos_in_select_list != UNDEF_POS) + thd->lex->current_select->cur_pos_in_select_list != UNDEF_POS && + thd->lex->current_select->join) { - thd->lex->current_select->non_agg_fields.push_back(this); + thd->lex->current_select->join->non_agg_fields.push_back(this); marker= thd->lex->current_select->cur_pos_in_select_list; } mark_non_agg_field: @@ -6742,7 +6754,7 @@ Item_ref::Item_ref(Name_resolution_context *context_arg, /* This constructor used to create some internals references over fixed items */ - if (ref && *ref && (*ref)->fixed) + if ((set_properties_only= (ref && *ref && (*ref)->fixed))) set_properties(); } @@ -6786,7 +6798,7 @@ Item_ref::Item_ref(TABLE_LIST *view_arg, Item **item, /* This constructor is used to create some internal references over fixed items */ - if (ref && *ref && (*ref)->fixed) + if ((set_properties_only= (ref && *ref && (*ref)->fixed))) set_properties(); } @@ -6861,7 +6873,11 @@ bool Item_ref::fix_fields(THD *thd, Item **reference) DBUG_ASSERT(fixed == 0); SELECT_LEX *current_sel= thd->lex->current_select; - if (!ref || ref == not_found_item) + if (set_properties_only) + { + /* do nothing */ + } + else if (!ref || ref == not_found_item) { DBUG_ASSERT(reference_trough_name != 0); if (!(ref= resolve_ref_in_select_and_group(thd, this, @@ -6879,7 +6895,7 @@ bool Item_ref::fix_fields(THD *thd, Item **reference) { /* The current reference cannot be resolved in this query. */ my_error(ER_BAD_FIELD_ERROR,MYF(0), - this->full_name(), current_thd->where); + this->full_name(), thd->where); goto error; } @@ -7014,7 +7030,7 @@ bool Item_ref::fix_fields(THD *thd, Item **reference) goto error; thd->change_item_tree(reference, fld); mark_as_dependent(thd, last_checked_context->select_lex, - thd->lex->current_select, fld, fld); + current_sel, fld, fld); /* A reference is resolved to a nest level that's outer or the same as the nest level of the enclosing set function : adjust the value of @@ -7031,7 +7047,7 @@ bool Item_ref::fix_fields(THD *thd, Item **reference) { /* The item was not a table field and not a reference */ my_error(ER_BAD_FIELD_ERROR, MYF(0), - this->full_name(), current_thd->where); + this->full_name(), thd->where); goto error; } /* Should be checked in resolve_ref_in_select_and_group(). */ diff --git a/sql/item.h b/sql/item.h index 4aaa67d9a1d9efae5c0ca8077f2dd8c8b97064fb..f8e8ead47dd6428a6765b87a43511daf2515a9de 100644 --- a/sql/item.h +++ b/sql/item.h @@ -631,7 +631,7 @@ class Item { */ uint name_length; /* Length of name */ uint decimals; - int8 marker; + int marker; bool maybe_null; /* If item may be null */ bool in_rollup; /* If used in GROUP BY list of a query with ROLLUP */ @@ -2946,6 +2946,7 @@ class Item_ref :public Item_ident { protected: void set_properties(); + bool set_properties_only; // the item doesn't need full fix_fields public: enum Ref_Type { REF, DIRECT_REF, VIEW_REF, OUTER_REF, AGGREGATE_REF }; Field *result_field; /* Save result here */ @@ -2955,7 +2956,7 @@ class Item_ref :public Item_ident const char *db_arg, const char *table_name_arg, const char *field_name_arg) :Item_ident(context_arg, db_arg, table_name_arg, field_name_arg), - result_field(0), ref(0), reference_trough_name(1) {} + set_properties_only(0), result_field(0), ref(0), reference_trough_name(1) {} /* This constructor is used in two scenarios: A) *item = NULL @@ -2978,7 +2979,7 @@ class Item_ref :public Item_ident /* Constructor need to process subselect with temporary tables (see Item) */ Item_ref(THD *thd, Item_ref *item) - :Item_ident(thd, item), result_field(item->result_field), ref(item->ref) {} + :Item_ident(thd, item), set_properties_only(0), result_field(item->result_field), ref(item->ref) {} enum Type type() const { return REF_ITEM; } enum Type real_type() const { return ref ? (*ref)->type() : REF_ITEM; } diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 998cb1cbd64c193e6df3bcb8fba0472a24afc79f..0c48592eb9f6e3aac3f99152bdfd885e6ebb8a29 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1442,9 +1442,36 @@ bool Item_in_optimizer::eval_not_null_tables(uchar *opt_arg) bool Item_in_optimizer::fix_left(THD *thd, Item **ref) { DBUG_ENTER("Item_in_optimizer::fix_left"); - if ((!args[0]->fixed && args[0]->fix_fields(thd, args)) || - (!cache && !(cache= Item_cache::get_cache(args[0])))) + /* + Here we will store pointer on place of main storage of left expression. + For usual IN (ALL/ANY) it is subquery left_expr. + For other cases (MAX/MIN optimization, non-transformed EXISTS (10.0)) + it is args[0]. + */ + Item **ref0= args; + if (args[1]->type() == Item::SUBSELECT_ITEM && + ((Item_subselect *)args[1])->is_in_predicate()) + { + /* + left_expr->fix_fields() may cause left_expr to be substituted for + another item. (e.g. an Item_field may be changed into Item_ref). This + transformation is undone at the end of statement execution (e.g. the + Item_ref is deleted). However, Item_in_optimizer::args[0] may keep + the pointer to the post-transformation item. Because of that, on the + next execution we need to copy args[1]->left_expr again. + */ + ref0= &(((Item_in_subselect *)args[1])->left_expr); + args[0]= ((Item_in_subselect *)args[1])->left_expr; + } + if ((!(*ref0)->fixed && (*ref0)->fix_fields(thd, ref0)) || + (!cache && !(cache= Item_cache::get_cache(*ref0)))) DBUG_RETURN(1); + /* + During fix_field() expression could be substituted. + So we copy changes before use + */ + if (args[0] != (*ref0)) + args[0]= (*ref0); DBUG_PRINT("info", ("actual fix fields")); cache->setup(args[0]); @@ -1500,6 +1527,16 @@ bool Item_in_optimizer::fix_left(THD *thd, Item **ref) bool Item_in_optimizer::fix_fields(THD *thd, Item **ref) { DBUG_ASSERT(fixed == 0); + Item_subselect *sub= 0; + uint col; + + /* + MAX/MIN optimization can convert the subquery into + expr + Item_singlerow_subselect + */ + if (args[1]->type() == Item::SUBSELECT_ITEM) + sub= (Item_subselect *)args[1]; + if (fix_left(thd, ref)) return TRUE; if (args[0]->maybe_null) @@ -1507,10 +1544,10 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref) if (!args[1]->fixed && args[1]->fix_fields(thd, args+1)) return TRUE; - Item_in_subselect * sub= (Item_in_subselect *)args[1]; - if (args[0]->cols() != sub->engine->cols()) + if ((sub && ((col= args[0]->cols()) != sub->engine->cols())) || + (!sub && (args[1]->cols() != (col= 1)))) { - my_error(ER_OPERAND_COLUMNS, MYF(0), args[0]->cols()); + my_error(ER_OPERAND_COLUMNS, MYF(0), col); return TRUE; } if (args[1]->maybe_null) @@ -2692,7 +2729,8 @@ Item_func_if::str_op(String *str) String *res=arg->val_str(str); if (res) res->set_charset(collation.collation); - null_value=arg->null_value; + if ((null_value=arg->null_value)) + res= NULL; return res; } @@ -2703,7 +2741,8 @@ Item_func_if::decimal_op(my_decimal *decimal_value) DBUG_ASSERT(fixed == 1); Item *arg= args[0]->val_bool() ? args[1] : args[2]; my_decimal *value= arg->val_decimal(decimal_value); - null_value= arg->null_value; + if ((null_value= arg->null_value)) + value= NULL; return value; } diff --git a/sql/item_func.cc b/sql/item_func.cc index ed08555133f6d13576f9e47c0996719bf6052e67..eb5b63f549e0e898599ba82e716ea6bddf66bac7 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -887,7 +887,7 @@ String *Item_func_hybrid_result_type::val_str(String *str) case DECIMAL_RESULT: { my_decimal decimal_value, *val; - if (!(val= decimal_op(&decimal_value))) + if (!(val= decimal_op_with_null_check(&decimal_value))) return 0; // null is set my_decimal_round(E_DEC_FATAL_ERROR, val, decimals, FALSE, val); str->set_charset(collation.collation); @@ -914,24 +914,22 @@ String *Item_func_hybrid_result_type::val_str(String *str) if (is_temporal_type(field_type())) { MYSQL_TIME ltime; - if (date_op(<ime, - field_type() == MYSQL_TYPE_TIME ? TIME_TIME_ONLY : 0) || - str->alloc(MAX_DATE_STRING_REP_LENGTH)) - { - null_value= 1; + if (date_op_with_null_check(<ime) || + (null_value= str->alloc(MAX_DATE_STRING_REP_LENGTH))) return (String *) 0; - } ltime.time_type= mysql_type_to_time_type(field_type()); str->length(my_TIME_to_str(<ime, const_cast(str->ptr()), decimals)); str->set_charset(&my_charset_bin); + DBUG_ASSERT(!null_value); return str; } - return str_op(&str_value); + return str_op_with_null_check(&str_value); case TIME_RESULT: case ROW_RESULT: case IMPOSSIBLE_RESULT: DBUG_ASSERT(0); } + DBUG_ASSERT(!null_value || (str == NULL)); return str; } @@ -944,7 +942,7 @@ double Item_func_hybrid_result_type::val_real() { my_decimal decimal_value, *val; double result; - if (!(val= decimal_op(&decimal_value))) + if (!(val= decimal_op_with_null_check(&decimal_value))) return 0.0; // null is set my_decimal2double(E_DEC_FATAL_ERROR, val, &result); return result; @@ -961,18 +959,14 @@ double Item_func_hybrid_result_type::val_real() if (is_temporal_type(field_type())) { MYSQL_TIME ltime; - if (date_op(<ime, - field_type() == MYSQL_TYPE_TIME ? TIME_TIME_ONLY : 0 )) - { - null_value= 1; + if (date_op_with_null_check(<ime)) return 0; - } ltime.time_type= mysql_type_to_time_type(field_type()); return TIME_to_double(<ime); } char *end_not_used; int err_not_used; - String *res= str_op(&str_value); + String *res= str_op_with_null_check(&str_value); return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(), &end_not_used, &err_not_used) : 0.0); } @@ -992,7 +986,7 @@ longlong Item_func_hybrid_result_type::val_int() case DECIMAL_RESULT: { my_decimal decimal_value, *val; - if (!(val= decimal_op(&decimal_value))) + if (!(val= decimal_op_with_null_check(&decimal_value))) return 0; // null is set longlong result; my_decimal2int(E_DEC_FATAL_ERROR, val, unsigned_flag, &result); @@ -1007,18 +1001,14 @@ longlong Item_func_hybrid_result_type::val_int() if (is_temporal_type(field_type())) { MYSQL_TIME ltime; - if (date_op(<ime, - field_type() == MYSQL_TYPE_TIME ? TIME_TIME_ONLY : 0)) - { - null_value= 1; + if (date_op_with_null_check(<ime)) return 0; - } ltime.time_type= mysql_type_to_time_type(field_type()); return TIME_to_ulonglong(<ime); } int err_not_used; String *res; - if (!(res= str_op(&str_value))) + if (!(res= str_op_with_null_check(&str_value))) return 0; char *end= (char*) res->ptr() + res->length(); @@ -1040,17 +1030,21 @@ my_decimal *Item_func_hybrid_result_type::val_decimal(my_decimal *decimal_value) DBUG_ASSERT(fixed == 1); switch (cached_result_type) { case DECIMAL_RESULT: - val= decimal_op(decimal_value); + val= decimal_op_with_null_check(decimal_value); break; case INT_RESULT: { longlong result= int_op(); + if (null_value) + return NULL; int2my_decimal(E_DEC_FATAL_ERROR, result, unsigned_flag, decimal_value); break; } case REAL_RESULT: { double result= (double)real_op(); + if (null_value) + return NULL; double2my_decimal(E_DEC_FATAL_ERROR, result, decimal_value); break; } @@ -1059,19 +1053,20 @@ my_decimal *Item_func_hybrid_result_type::val_decimal(my_decimal *decimal_value) if (is_temporal_type(field_type())) { MYSQL_TIME ltime; - if (date_op(<ime, - field_type() == MYSQL_TYPE_TIME ? TIME_TIME_ONLY : 0)) + if (date_op_with_null_check(<ime)) { my_decimal_set_zero(decimal_value); - null_value= 1; return 0; } ltime.time_type= mysql_type_to_time_type(field_type()); return date2my_decimal(<ime, decimal_value); } String *res; - if (!(res= str_op(&str_value))) + if (!(res= str_op_with_null_check(&str_value))) + { + null_value= 1; return NULL; + } str2my_decimal(E_DEC_FATAL_ERROR, (char*) res->ptr(), res->length(), res->charset(), decimal_value); @@ -1094,7 +1089,7 @@ bool Item_func_hybrid_result_type::get_date(MYSQL_TIME *ltime, case DECIMAL_RESULT: { my_decimal value, *res; - if (!(res= decimal_op(&value)) || + if (!(res= decimal_op_with_null_check(&value)) || decimal_to_datetime_with_warn(res, ltime, fuzzydate, field_name_or_null())) goto err; @@ -1124,7 +1119,7 @@ bool Item_func_hybrid_result_type::get_date(MYSQL_TIME *ltime, return date_op(ltime, fuzzydate); char buff[40]; String tmp(buff,sizeof(buff), &my_charset_bin),*res; - if (!(res= str_op(&tmp)) || + if (!(res= str_op_with_null_check(&tmp)) || str_to_datetime_with_warn(res->charset(), res->ptr(), res->length(), ltime, fuzzydate) <= MYSQL_TIMESTAMP_ERROR) goto err; @@ -4184,7 +4179,25 @@ longlong Item_func_get_lock::val_int() it's not guaranteed to be same as on master. */ if (thd->slave_thread) + { + null_value= 0; DBUG_RETURN(1); + } + + if (args[1]->null_value || + (!args[1]->unsigned_flag && ((longlong) timeout < 0))) + { + char buf[22]; + if (args[1]->null_value) + strmov(buf, "NULL"); + else + llstr(((longlong) timeout), buf); + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WRONG_VALUE_FOR_TYPE, ER(ER_WRONG_VALUE_FOR_TYPE), + "timeout", buf, "get_lock"); + null_value= 1; + DBUG_RETURN(0); + } mysql_mutex_lock(&LOCK_user_locks); diff --git a/sql/item_func.h b/sql/item_func.h index 4b11238c10db03a716fc6a38a3d458cf1c2fcd81..33fa49f9168eb7d4c84a9c5627422bd1a4aa9885 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -377,17 +377,17 @@ class Item_func :public Item_result_field void no_rows_in_result() { - bool_func_call_args info; - info.original_func_item= this; - info.bool_function= &Item::no_rows_in_result; - walk(&Item::call_bool_func_processor, FALSE, (uchar*) &info); + for (uint i= 0; i < arg_count; i++) + { + args[i]->no_rows_in_result(); + } } void restore_to_before_no_rows_in_result() { - bool_func_call_args info; - info.original_func_item= this; - info.bool_function= &Item::restore_to_before_no_rows_in_result; - walk(&Item::call_bool_func_processor, FALSE, (uchar*) &info); + for (uint i= 0; i < arg_count; i++) + { + args[i]->no_rows_in_result(); + } } }; @@ -411,6 +411,29 @@ class Item_real_func :public Item_func class Item_func_hybrid_result_type: public Item_func { + /* + Helper methods to make sure that the result of + decimal_op(), str_op() and date_op() is properly synched with null_value. + */ + bool date_op_with_null_check(MYSQL_TIME *ltime) + { + bool rc= date_op(ltime, + field_type() == MYSQL_TYPE_TIME ? TIME_TIME_ONLY : 0); + DBUG_ASSERT(!rc ^ null_value); + return rc; + } + String *str_op_with_null_check(String *str) + { + String *res= str_op(str); + DBUG_ASSERT((res != NULL) ^ null_value); + return res; + } + my_decimal *decimal_op_with_null_check(my_decimal *decimal_buffer) + { + my_decimal *res= decimal_op(decimal_buffer); + DBUG_ASSERT((res != NULL) ^ null_value); + return res; + } protected: Item_result cached_result_type; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 62df666b71fa7a4cf5a4ee6df8fd6a4563fd7c29..1107945ae9962b9a69296dd5206d9007f3f5d2ee 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -464,6 +464,7 @@ void Item_subselect::recalc_used_tables(st_select_lex *new_parent, { List_iterator it(upper_refs); Ref_to_outside *upper; + DBUG_ENTER("recalc_used_tables"); used_tables_cache= 0; while ((upper= it++)) @@ -523,6 +524,8 @@ void Item_subselect::recalc_used_tables(st_select_lex *new_parent, he has done const table detection, and that will be our chance to update const_tables_cache. */ + DBUG_PRINT("exit", ("used_tables_cache: %llx", used_tables_cache)); + DBUG_VOID_RETURN; } @@ -1360,7 +1363,7 @@ Item_in_subselect::Item_in_subselect(Item * left_exp, upper_item(0) { DBUG_ENTER("Item_in_subselect::Item_in_subselect"); - left_expr= left_exp; + left_expr_orig= left_expr= left_exp; func= &eq_creator; init(select_lex, new select_exists_subselect(this)); max_columns= UINT_MAX; @@ -1384,7 +1387,7 @@ Item_allany_subselect::Item_allany_subselect(Item * left_exp, :Item_in_subselect(), func_creator(fc), all(all_arg) { DBUG_ENTER("Item_allany_subselect::Item_allany_subselect"); - left_expr= left_exp; + left_expr_orig= left_expr= left_exp; func= func_creator(all_arg); init(select_lex, new select_exists_subselect(this)); max_columns= 1; @@ -1989,7 +1992,7 @@ bool Item_allany_subselect::is_maxmin_applicable(JOIN *join) */ bool -Item_in_subselect::create_single_in_to_exists_cond(JOIN * join, +Item_in_subselect::create_single_in_to_exists_cond(JOIN *join, Item **where_item, Item **having_item) { @@ -1999,7 +2002,6 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN * join, during JOIN::optimize: this->tmp_having= this->having; this->having= 0; */ Item* join_having= join->having ? join->having : join->tmp_having; - DBUG_ENTER("Item_in_subselect::create_single_in_to_exists_cond"); *where_item= NULL; @@ -2584,15 +2586,13 @@ Item_in_subselect::select_in_like_transformer(JOIN *join) arena= thd->activate_stmt_arena_if_needed(&backup); if (!optimizer) { - result= (!(optimizer= new Item_in_optimizer(left_expr, this))); + result= (!(optimizer= new Item_in_optimizer(left_expr_orig, this))); if (result) goto out; } thd->lex->current_select= current->return_after_parsing(); result= optimizer->fix_left(thd, optimizer->arguments()); - /* fix_fields can change reference to left_expr, we need reassign it */ - left_expr= optimizer->arguments()[0]; thd->lex->current_select= current; if (changed) @@ -2651,10 +2651,12 @@ bool Item_in_subselect::fix_fields(THD *thd_arg, Item **ref) { uint outer_cols_num; List *inner_cols; + char const *save_where= thd->where; if (test_strategy(SUBS_SEMI_JOIN)) return !( (*ref)= new Item_int(1)); + thd->where= "IN/ALL/ANY subquery"; /* Check if the outer and inner IN operands match in those cases when we will not perform IN=>EXISTS transformation. Currently this is when we @@ -2685,7 +2687,7 @@ bool Item_in_subselect::fix_fields(THD *thd_arg, Item **ref) if (outer_cols_num != inner_cols->elements) { my_error(ER_OPERAND_COLUMNS, MYF(0), outer_cols_num); - return TRUE; + goto err; } if (outer_cols_num > 1) { @@ -2695,20 +2697,24 @@ bool Item_in_subselect::fix_fields(THD *thd_arg, Item **ref) { inner_col= inner_col_it++; if (inner_col->check_cols(left_expr->element_index(i)->cols())) - return TRUE; + goto err; } } } - if (thd_arg->lex->is_view_context_analysis() && - left_expr && !left_expr->fixed && + if (left_expr && !left_expr->fixed && left_expr->fix_fields(thd_arg, &left_expr)) - return TRUE; + goto err; else - if (Item_subselect::fix_fields(thd_arg, ref)) - return TRUE; + if (Item_subselect::fix_fields(thd_arg, ref)) + goto err; fixed= TRUE; + thd->where= save_where; return FALSE; + +err: + thd->where= save_where; + return TRUE; } diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 592e7711a109dcfbb9a7d9d482ba9378c3b7799d..0ee5f73eb35e8e0885049f4624d565a32b164f1a 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -449,6 +449,12 @@ class Item_in_subselect :public Item_exists_subselect Item **having_item); public: Item *left_expr; + /* + Important for PS/SP: left_expr_orig is the item that left_expr originally + pointed at. That item is allocated on the statement arena, while + left_expr could later be changed to something on the execution arena. + */ + Item *left_expr_orig; /* Priority of this predicate in the convert-to-semi-join-nest process. */ int sj_convert_priority; /* diff --git a/sql/item_sum.cc b/sql/item_sum.cc index d8970ca26b5d499024c8db7db95036f327af815a..adf48f6feecf20b705ebcaf292095ae87ebf22e3 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -3514,9 +3514,17 @@ bool Item_func_group_concat::setup(THD *thd) "all_fields". The resulting field list is used as input to create tmp table columns. */ - if (arg_count_order && - setup_order(thd, args, context->table_list, list, all_fields, *order)) - DBUG_RETURN(TRUE); + if (arg_count_order) + { + uint n_elems= arg_count_order + all_fields.elements; + ref_pointer_array= static_cast(thd->alloc(sizeof(Item*) * n_elems)); + if (!ref_pointer_array) + DBUG_RETURN(TRUE); + memcpy(ref_pointer_array, args, arg_count * sizeof(Item*)); + if (setup_order(thd, ref_pointer_array, context->table_list, list, + all_fields, *order)) + DBUG_RETURN(TRUE); + } count_field_types(select_lex, tmp_table_param, all_fields, 0); tmp_table_param->force_copy_fields= force_copy_fields; diff --git a/sql/item_sum.h b/sql/item_sum.h index f074cc6c822b1339e1de7054c3a88a748658f7fb..86093f5d4f58d0e4d1bf475877f3f6ea409df88b 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -1394,6 +1394,7 @@ class Item_func_group_concat : public Item_sum String *separator; TREE tree_base; TREE *tree; + Item **ref_pointer_array; /** If DISTINCT is used with this GROUP_CONCAT, this member is used to filter diff --git a/sql/log.cc b/sql/log.cc index 9722f20869da76db26b086fdd96abe9db86a032e..0940cb9b56c6eb061a1b05abcfbe28a18482430a 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -3676,6 +3676,7 @@ int MYSQL_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included) { int error; char *to_purge_if_included= NULL; + ulonglong log_space_reclaimed= 0; DBUG_ENTER("purge_first_log"); DBUG_ASSERT(is_open()); @@ -3724,17 +3725,13 @@ int MYSQL_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included) DBUG_EXECUTE_IF("crash_before_purge_logs", DBUG_SUICIDE();); - mysql_mutex_lock(&rli->log_space_lock); rli->relay_log.purge_logs(to_purge_if_included, included, - 0, 0, &rli->log_space_total); - mysql_mutex_unlock(&rli->log_space_lock); + 0, 0, &log_space_reclaimed); - /* - Ok to broadcast after the critical region as there is no risk of - the mutex being destroyed by this thread later - this helps save - context switches - */ + mysql_mutex_lock(&rli->log_space_lock); + rli->log_space_total-= log_space_reclaimed; mysql_cond_broadcast(&rli->log_space_cond); + mysql_mutex_unlock(&rli->log_space_lock); /* * Need to update the log pos because purge logs has been called @@ -3783,8 +3780,8 @@ int MYSQL_BIN_LOG::update_log_index(LOG_INFO* log_info, bool need_update_threads @param need_mutex @param need_update_threads If we want to update the log coordinates of all threads. False for relay logs, true otherwise. - @param freed_log_space If not null, decrement this variable of - the amount of log space freed + @param reclaimeed_log_space If not null, increment this variable to + the amount of log space freed @note If any of the logs before the deleted one is in use, @@ -3800,10 +3797,10 @@ int MYSQL_BIN_LOG::update_log_index(LOG_INFO* log_info, bool need_update_threads */ int MYSQL_BIN_LOG::purge_logs(const char *to_log, - bool included, - bool need_mutex, - bool need_update_threads, - ulonglong *decrease_log_space) + bool included, + bool need_mutex, + bool need_update_threads, + ulonglong *reclaimed_space) { int error= 0; bool exit_loop= 0; @@ -3868,7 +3865,7 @@ int MYSQL_BIN_LOG::purge_logs(const char *to_log, err: /* Read each entry from purge_index_file and delete the file. */ if (is_inited_purge_index_file() && - (error= purge_index_entry(thd, decrease_log_space, FALSE))) + (error= purge_index_entry(thd, reclaimed_space, FALSE))) sql_print_error("MSYQL_BIN_LOG::purge_logs failed to process registered files" " that would be purged."); close_purge_index_file(); @@ -3973,7 +3970,7 @@ int MYSQL_BIN_LOG::register_create_index_entry(const char *entry) DBUG_RETURN(register_purge_index_entry(entry)); } -int MYSQL_BIN_LOG::purge_index_entry(THD *thd, ulonglong *decrease_log_space, +int MYSQL_BIN_LOG::purge_index_entry(THD *thd, ulonglong *reclaimed_space, bool need_mutex) { DBUG_ENTER("MYSQL_BIN_LOG:purge_index_entry"); @@ -4093,8 +4090,8 @@ int MYSQL_BIN_LOG::purge_index_entry(THD *thd, ulonglong *decrease_log_space, DBUG_PRINT("info",("purging %s",log_info.log_file_name)); if (!my_delete(log_info.log_file_name, MYF(0))) { - if (decrease_log_space) - *decrease_log_space-= s.st_size; + if (reclaimed_space) + *reclaimed_space+= s.st_size; } else { diff --git a/sql/log_event.cc b/sql/log_event.cc index e63884eaeab01480a15351207a034e55dfc68570..c962f19f703d266eaaecbd2bd73d38a027aa4f3e 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1249,9 +1249,10 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet, } data_len= uint4korr(buf + EVENT_LEN_OFFSET); if (data_len < LOG_EVENT_MINIMAL_HEADER_LEN || - data_len > current_thd->variables.max_allowed_packet) + data_len > max(current_thd->variables.max_allowed_packet, + opt_binlog_rows_event_max_size + MAX_LOG_EVENT_HEADER)) { - DBUG_PRINT("error",("data_len: %ld", data_len)); + DBUG_PRINT("error",("data_len: %lu", data_len)); result= ((data_len < LOG_EVENT_MINIMAL_HEADER_LEN) ? LOG_READ_BOGUS : LOG_READ_TOO_LARGE); goto end; @@ -1372,7 +1373,7 @@ failed my_b_read")); */ DBUG_RETURN(0); } - uint data_len = uint4korr(head + EVENT_LEN_OFFSET); + ulong data_len = uint4korr(head + EVENT_LEN_OFFSET); char *buf= 0; const char *error= 0; Log_event *res= 0; @@ -1381,7 +1382,8 @@ failed my_b_read")); uint max_allowed_packet= thd ? slave_max_allowed_packet:~(uint)0; #endif - if (data_len > max_allowed_packet) + if (data_len > max(max_allowed_packet, + opt_binlog_rows_event_max_size + MAX_LOG_EVENT_HEADER)) { error = "Event too big"; goto err; @@ -1415,7 +1417,7 @@ failed my_b_read")); { DBUG_ASSERT(error != 0); sql_print_error("Error in Log_event::read_log_event(): " - "'%s', data_len: %d, event_type: %d", + "'%s', data_len: %lu, event_type: %d", error,data_len,head[EVENT_TYPE_OFFSET]); my_free(buf); /* @@ -2010,15 +2012,10 @@ log_event_print_value(IO_CACHE *file, const uchar *ptr, my_decimal dec; binary2my_decimal(E_DEC_FATAL_ERROR, (uchar*) ptr, &dec, precision, decimals); - int i, end; - char buff[512], *pos; - pos= buff; - pos+= sprintf(buff, "%s", dec.sign() ? "-" : ""); - end= ROUND_UP(dec.frac) + ROUND_UP(dec.intg)-1; - for (i=0; i < end; i++) - pos+= sprintf(pos, "%09d.", dec.buf[i]); - pos+= sprintf(pos, "%09d", dec.buf[i]); - my_b_printf(file, "%s", buff); + int length= DECIMAL_MAX_STR_LENGTH; + char buff[DECIMAL_MAX_STR_LENGTH + 1]; + decimal2string(&dec, buff, &length, 0, 0, 0); + my_b_write(file, (uchar*)buff, length); my_snprintf(typestr, typestr_length, "DECIMAL(%d,%d)", precision, decimals); return bin_size; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 0178f927baba190c4e33d4a002beeaa90928775f..3ad7b84829d95e935d87dd40933b9e0b81a0c410 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2488,7 +2488,6 @@ void unlink_thd(THD *thd) thd->add_status_to_global(); mysql_mutex_lock(&LOCK_thread_count); - thread_count--; thd->unlink(); /* Used by binlog_reset_master. It would be cleaner to use @@ -2496,6 +2495,16 @@ void unlink_thd(THD *thd) sync feature has been shut down at this point. */ DBUG_EXECUTE_IF("sleep_after_lock_thread_count_before_delete_thd", sleep(5);); + if (unlikely(abort_loop)) + { + /* + During shutdown, we have to delete thd inside the mutex + to not refer to mutexes that may be deleted during shutdown + */ + delete thd; + thd= 0; + } + thread_count--; mysql_mutex_unlock(&LOCK_thread_count); delete thd; @@ -3875,13 +3884,24 @@ static int init_common_variables() { if (lower_case_table_names_used) { +#if MYSQL_VERSION_ID < 100100 if (global_system_variables.log_warnings) - sql_print_warning("\ -You have forced lower_case_table_names to 0 through a command-line \ -option, even though your file system '%s' is case insensitive. This means \ -that you can corrupt a MyISAM table by accessing it with different cases. \ -You should consider changing lower_case_table_names to 1 or 2", - mysql_real_data_home); + sql_print_warning("You have forced lower_case_table_names to 0 through " + "a command-line option, even though your file system " + "'%s' is case insensitive. This means that you can " + "corrupt your tables if you access them using names " + "with different letter case. You should consider " + "changing lower_case_table_names to 1 or 2", + mysql_real_data_home); +#else + sql_print_error("The server option 'lower_case_table_names' is " + "configured to use case sensitive table names but the " + "data directory resides on a case-insensitive file system. " + "Please use a case sensitive file system for your data " + "directory or switch to a case-insensitive table name " + "mode."); +#endif + return 1; } else { diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 17b24aa70fd6360d66efde886ec4f0ce762e3582..f4ac47fee9617a6630ae45b1b5c600e9888c29cb 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2008, 2014, Monty Program Ab. +/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. + Copyright (c) 2008, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -4081,10 +4081,19 @@ int find_used_partitions(PART_PRUNE_PARAM *ppar, SEL_ARG *key_tree) key_tree->min_flag | key_tree->max_flag, &subpart_iter); - DBUG_ASSERT(res); /* We can't get "no satisfying subpartitions" */ + if (res == 0) + { + /* + The only case where we can get "no satisfying subpartitions" + returned from the above call is when an error has occurred. + */ + DBUG_ASSERT(range_par->thd->is_error()); + return 0; + } + if (res == -1) goto pop_and_go_right; /* all subpartitions satisfy */ - + uint32 subpart_id; bitmap_clear_all(&ppar->subparts_bitmap); while ((subpart_id= subpart_iter.get_next(&subpart_iter)) != diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index ebf640c2987a812c42f4171274a8ca4bbf3338a8..827290fd15bf46cc2092863730da7553bb2fc2ff 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -620,6 +620,18 @@ int check_and_do_in_subquery_rewrites(JOIN *join) thd->stmt_arena->state != Query_arena::PREPARED) */ { + SELECT_LEX *current= thd->lex->current_select; + thd->lex->current_select= current->return_after_parsing(); + char const *save_where= thd->where; + thd->where= "IN/ALL/ANY subquery"; + + bool failure= !in_subs->left_expr->fixed && + in_subs->left_expr->fix_fields(thd, &in_subs->left_expr); + thd->lex->current_select= current; + thd->where= save_where; + if (failure) + DBUG_RETURN(-1); /* purecov: deadcode */ + /* Check if the left and right expressions have the same # of columns, i.e. we don't have a case like @@ -633,18 +645,6 @@ int check_and_do_in_subquery_rewrites(JOIN *join) my_error(ER_OPERAND_COLUMNS, MYF(0), in_subs->left_expr->cols()); DBUG_RETURN(-1); } - - SELECT_LEX *current= thd->lex->current_select; - thd->lex->current_select= current->return_after_parsing(); - char const *save_where= thd->where; - thd->where= "IN/ALL/ANY subquery"; - - bool failure= !in_subs->left_expr->fixed && - in_subs->left_expr->fix_fields(thd, &in_subs->left_expr); - thd->lex->current_select= current; - thd->where= save_where; - if (failure) - DBUG_RETURN(-1); /* purecov: deadcode */ } DBUG_PRINT("info", ("Checking if subq can be converted to semi-join")); @@ -703,6 +703,12 @@ int check_and_do_in_subquery_rewrites(JOIN *join) if (!optimizer_flag(thd, OPTIMIZER_SWITCH_IN_TO_EXISTS) && !optimizer_flag(thd, OPTIMIZER_SWITCH_MATERIALIZATION)) my_error(ER_ILLEGAL_SUBQUERY_OPTIMIZER_SWITCHES, MYF(0)); + /* + Transform each subquery predicate according to its overloaded + transformer. + */ + if (subselect->select_transformer(join)) + DBUG_RETURN(-1); /* If the subquery predicate is IN/=ANY, analyse and set all possible @@ -754,12 +760,6 @@ int check_and_do_in_subquery_rewrites(JOIN *join) allany_subs->add_strategy(strategy); } - /* - Transform each subquery predicate according to its overloaded - transformer. - */ - if (subselect->select_transformer(join)) - DBUG_RETURN(-1); } } DBUG_RETURN(0); @@ -1592,8 +1592,19 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred) if (subq_pred->left_expr->cols() == 1) { nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr); + /* + Create Item_func_eq. Note that + 1. this is done on the statement, not execution, arena + 2. if it's a PS then this happens only once - on the first execution. + On following re-executions, the item will be fix_field-ed normally. + 3. Thus it should be created as if it was fix_field'ed, in particular + all pointers to items in the execution arena should be protected + with thd->change_item_tree + */ Item_func_eq *item_eq= - new Item_func_eq(subq_pred->left_expr, subq_lex->ref_pointer_array[0]); + new Item_func_eq(subq_pred->left_expr_orig, subq_lex->ref_pointer_array[0]); + if (subq_pred->left_expr_orig != subq_pred->left_expr) + thd->change_item_tree(item_eq->arguments(), subq_pred->left_expr); item_eq->in_equality_no= 0; sj_nest->sj_on_expr= and_items(sj_nest->sj_on_expr, item_eq); } diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 1bfa8864cb98549a55ae910b814cb744e271b24f..d8b901701cb183819a4834026422a068d1f71d95 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -1,4 +1,5 @@ -/* Copyright (c) 2006, 2013, Oracle and/or its affiliates. +/* Copyright (c) 2006, 2015, Oracle and/or its affiliates. + Copyright (c) 2010, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1109,15 +1110,22 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type, { int err= 0; + /* Check for partition expression. */ if (!list_of_part_fields) { DBUG_ASSERT(part_expr); err= part_expr->walk(&Item::check_partition_func_processor, 0, NULL); - if (!err && is_sub_partitioned() && !list_of_subpart_fields) - err= subpart_expr->walk(&Item::check_partition_func_processor, 0, - NULL); } + + /* Check for sub partition expression. */ + if (!err && is_sub_partitioned() && !list_of_subpart_fields) + { + DBUG_ASSERT(subpart_expr); + err= subpart_expr->walk(&Item::check_partition_func_processor, 0, + NULL); + } + if (err) { my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0)); diff --git a/sql/rpl_handler.cc b/sql/rpl_handler.cc index 9480a9e0454f8b2f2a07eec462466b59cb30b593..5b75d6c30eaad3543cd5fe742faea6742ffa3b3a 100644 --- a/sql/rpl_handler.cc +++ b/sql/rpl_handler.cc @@ -38,8 +38,6 @@ typedef struct Trans_binlog_info { char log_file[FN_REFLEN]; } Trans_binlog_info; -static pthread_key(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO); - int get_user_var_int(const char *name, long long int *value, int *null_value) { @@ -143,13 +141,6 @@ int delegates_init() } #endif - if (pthread_key_create(&RPL_TRANS_BINLOG_INFO, NULL)) - { - sql_print_error("Error while creating pthread specific data key for replication. " - "Please report a bug."); - return 1; - } - return 0; } @@ -195,27 +186,27 @@ void delegates_destroy() int Trans_delegate::after_commit(THD *thd, bool all) { Trans_param param; + Trans_binlog_info *log_info; bool is_real_trans= (all || thd->transaction.all.ha_list == 0); + int ret= 0; param.flags = is_real_trans ? TRANS_IS_REAL_TRANS : 0; - Trans_binlog_info *log_info= - my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO); + log_info= thd->semisync_info; - param.log_file= log_info ? log_info->log_file : 0; + param.log_file= log_info && log_info->log_file[0] ? log_info->log_file : 0; param.log_pos= log_info ? log_info->log_pos : 0; - int ret= 0; FOREACH_OBSERVER(ret, after_commit, false, (¶m)); /* This is the end of a real transaction or autocommit statement, we - can free the memory allocated for binlog file and position. + can mark the memory unused. */ if (is_real_trans && log_info) { - my_pthread_setspecific_ptr(RPL_TRANS_BINLOG_INFO, NULL); - my_free(log_info); + log_info->log_file[0]= 0; + log_info->log_pos= 0; } return ret; } @@ -223,27 +214,27 @@ int Trans_delegate::after_commit(THD *thd, bool all) int Trans_delegate::after_rollback(THD *thd, bool all) { Trans_param param; + Trans_binlog_info *log_info; bool is_real_trans= (all || thd->transaction.all.ha_list == 0); + int ret= 0; param.flags = is_real_trans ? TRANS_IS_REAL_TRANS : 0; - Trans_binlog_info *log_info= - my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO); - - param.log_file= log_info ? log_info->log_file : 0; + log_info= thd->semisync_info; + + param.log_file= log_info && log_info->log_file[0] ? log_info->log_file : 0; param.log_pos= log_info ? log_info->log_pos : 0; - int ret= 0; FOREACH_OBSERVER(ret, after_rollback, false, (¶m)); /* This is the end of a real transaction or autocommit statement, we - can free the memory allocated for binlog file and position. + can mark the memory unused. */ if (is_real_trans && log_info) { - my_pthread_setspecific_ptr(RPL_TRANS_BINLOG_INFO, NULL); - my_free(log_info); + log_info->log_file[0]= 0; + log_info->log_pos= 0; } return ret; } @@ -254,25 +245,24 @@ int Binlog_storage_delegate::after_flush(THD *thd, bool synced) { Binlog_storage_param param; + Trans_binlog_info *log_info; uint32 flags=0; + int ret= 0; + if (synced) flags |= BINLOG_STORAGE_IS_SYNCED; - Trans_binlog_info *log_info= - my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO); - - if (!log_info) + if (!(log_info= thd->semisync_info)) { if(!(log_info= - (Trans_binlog_info *)my_malloc(sizeof(Trans_binlog_info), MYF(0)))) + (Trans_binlog_info*) my_malloc(sizeof(Trans_binlog_info), MYF(0)))) return 1; - my_pthread_setspecific_ptr(RPL_TRANS_BINLOG_INFO, log_info); + thd->semisync_info= log_info; } - + strcpy(log_info->log_file, log_file+dirname_length(log_file)); log_info->log_pos = log_pos; - int ret= 0; FOREACH_OBSERVER(ret, after_flush, false, (¶m, log_info->log_file, log_info->log_pos, flags)); return ret; diff --git a/sql/rpl_utility.cc b/sql/rpl_utility.cc index e05ad5a8d43d4a2c8b179c37f7a45a5eb4ab04d0..9a20f71f4f7517b33b7d158262dee2ce6fd860ee 100644 --- a/sql/rpl_utility.cc +++ b/sql/rpl_utility.cc @@ -876,6 +876,7 @@ TABLE *table_def::create_conversion_table(THD *thd, Relay_log_info *rli, TABLE * { Create_field *field_def= (Create_field*) alloc_root(thd->mem_root, sizeof(Create_field)); + bool unsigned_flag= 0; if (field_list.push_back(field_def)) DBUG_RETURN(NULL); @@ -885,8 +886,7 @@ TABLE *table_def::create_conversion_table(THD *thd, Relay_log_info *rli, TABLE * uint32 max_length= max_display_length_for_field(type(col), field_metadata(col)); - switch(type(col)) - { + switch(type(col)) { int precision; case MYSQL_TYPE_ENUM: case MYSQL_TYPE_SET: @@ -925,6 +925,18 @@ TABLE *table_def::create_conversion_table(THD *thd, Relay_log_info *rli, TABLE * pack_length= field_metadata(col) & 0x00ff; break; + case MYSQL_TYPE_TINY: + case MYSQL_TYPE_SHORT: + case MYSQL_TYPE_INT24: + case MYSQL_TYPE_LONG: + case MYSQL_TYPE_LONGLONG: + /* + As we don't know if the integer was signed or not on the master, + assume we have same sign on master and slave. This is true when not + using conversions so it should be true also when using conversions. + */ + unsigned_flag= ((Field_num*) target_table->field[col])->unsigned_flag; + break; default: break; } @@ -932,12 +944,13 @@ TABLE *table_def::create_conversion_table(THD *thd, Relay_log_info *rli, TABLE * DBUG_PRINT("debug", ("sql_type: %d, target_field: '%s', max_length: %d, decimals: %d," " maybe_null: %d, unsigned_flag: %d, pack_length: %u", type(col), target_table->field[col]->field_name, - max_length, decimals, TRUE, FALSE, pack_length)); + max_length, decimals, TRUE, unsigned_flag, + pack_length)); field_def->init_for_tmp_table(type(col), max_length, decimals, TRUE, // maybe_null - FALSE, // unsigned_flag + unsigned_flag, pack_length); field_def->charset= target_table->field[col]->charset(); field_def->interval= interval; diff --git a/sql/slave.cc b/sql/slave.cc index 2fe7ebb575d2e23f9c4c3ab46b32f7b4e5a4ea0d..fe96b1de008fcacea1477dbecf15ff000f55d0b7 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3556,9 +3556,7 @@ pthread_handler_t handle_slave_sql(void *arg) rli->clear_error(); //tell the I/O thread to take relay_log_space_limit into account from now on - mysql_mutex_lock(&rli->log_space_lock); rli->ignore_log_space_limit= 0; - mysql_mutex_unlock(&rli->log_space_lock); rli->trans_retries= 0; // start from "no error" DBUG_PRINT("info", ("rli->trans_retries: %lu", rli->trans_retries)); @@ -5228,14 +5226,8 @@ static Log_event* next_event(Relay_log_info* rli) rli->ignore_log_space_limit= true; } - /* - If the I/O thread is blocked, unblock it. Ok to broadcast - after unlock, because the mutex is only destroyed in - ~Relay_log_info(), i.e. when rli is destroyed, and rli will - not be destroyed before we exit the present function. - */ - mysql_mutex_unlock(&rli->log_space_lock); mysql_cond_broadcast(&rli->log_space_cond); + mysql_mutex_unlock(&rli->log_space_lock); // Note that wait_for_update_relay_log unlocks lock_log ! rli->relay_log.wait_for_update_relay_log(rli->sql_thd); // re-acquire data lock since we released it earlier diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index c4ef699c049cba5b5da4c41780f52d020d7efd3c..4588c741cb433c6777c2538eeb708b3dd634c643 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -4652,16 +4652,19 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables, tl && number-- && tl != first_not_own_table; tl= tl->next_global) { - sctx = test(tl->security_ctx) ? tl->security_ctx : thd->security_ctx; + TABLE_LIST *const t_ref= + tl->correspondent_table ? tl->correspondent_table : tl; + sctx = test(t_ref->security_ctx) ? t_ref->security_ctx : + thd->security_ctx; const ACL_internal_table_access *access= - get_cached_table_access(&tl->grant.m_internal, - tl->get_db_name(), - tl->get_table_name()); + get_cached_table_access(&t_ref->grant.m_internal, + t_ref->get_db_name(), + t_ref->get_table_name()); if (access) { - switch(access->check(orig_want_access, &tl->grant.privilege)) + switch(access->check(orig_want_access, &t_ref->grant.privilege)) { case ACL_INTERNAL_ACCESS_GRANTED: /* @@ -4685,33 +4688,33 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables, if (!want_access) continue; // ok - if (!(~tl->grant.privilege & want_access) || - tl->is_anonymous_derived_table() || tl->schema_table) + if (!(~t_ref->grant.privilege & want_access) || + t_ref->is_anonymous_derived_table() || t_ref->schema_table) { /* - It is subquery in the FROM clause. VIEW set tl->derived after + It is subquery in the FROM clause. VIEW set t_ref->derived after table opening, but this function always called before table opening. */ - if (!tl->referencing_view) + if (!t_ref->referencing_view) { /* If it's a temporary table created for a subquery in the FROM clause, or an INFORMATION_SCHEMA table, drop the request for a privilege. */ - tl->grant.want_privilege= 0; + t_ref->grant.want_privilege= 0; } continue; } GRANT_TABLE *grant_table= table_hash_search(sctx->host, sctx->ip, - tl->get_db_name(), + t_ref->get_db_name(), sctx->priv_user, - tl->get_table_name(), + t_ref->get_table_name(), FALSE); if (!grant_table) { - want_access &= ~tl->grant.privilege; + want_access &= ~t_ref->grant.privilege; goto err; // No grants } @@ -4722,17 +4725,17 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables, if (any_combination_will_do) continue; - tl->grant.grant_table= grant_table; // Remember for column test - tl->grant.version= grant_version; - tl->grant.privilege|= grant_table->privs; - tl->grant.want_privilege= ((want_access & COL_ACLS) & ~tl->grant.privilege); + t_ref->grant.grant_table= grant_table; // Remember for column test + t_ref->grant.version= grant_version; + t_ref->grant.privilege|= grant_table->privs; + t_ref->grant.want_privilege= ((want_access & COL_ACLS) & ~t_ref->grant.privilege); - if (!(~tl->grant.privilege & want_access)) + if (!(~t_ref->grant.privilege & want_access)) continue; - if (want_access & ~(grant_table->cols | tl->grant.privilege)) + if (want_access & ~(grant_table->cols | t_ref->grant.privilege)) { - want_access &= ~(grant_table->cols | tl->grant.privilege); + want_access &= ~(grant_table->cols | t_ref->grant.privilege); goto err; // impossible } } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index fcd17b25b2d7b2bf9516fed68ff6fe4484b16363..1403fe91e552d99889e8df5a76d27c3793022875 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1682,13 +1682,20 @@ bool close_temporary_tables(THD *thd) if (!thd->temporary_tables) DBUG_RETURN(FALSE); + /* + Ensure we don't have open HANDLERs for tables we are about to close. + This is necessary when close_temporary_tables() is called as part + of execution of BINLOG statement (e.g. for format description event). + */ + mysql_ha_rm_temporary_tables(thd); if (!mysql_bin_log.is_open()) { TABLE *tmp_next; - for (table= thd->temporary_tables; table; table= tmp_next) + for (TABLE *t= thd->temporary_tables; t; t= tmp_next) { - tmp_next= table->next; - close_temporary(table, 1, 1); + tmp_next= t->next; + mysql_lock_remove(thd, thd->lock, t); + close_temporary(t, 1, 1); } thd->temporary_tables= 0; DBUG_RETURN(FALSE); @@ -1783,6 +1790,7 @@ bool close_temporary_tables(THD *thd) strlen(table->s->table_name.str)); s_query.append(','); next= table->next; + mysql_lock_remove(thd, thd->lock, table); close_temporary(table, 1, 1); } thd->clear_error(); @@ -4064,10 +4072,11 @@ request_backoff_action(enum_open_table_action action_arg, * We met a broken table that needs repair, or a table that is not present on this MySQL server and needs re-discovery. To perform the action, we need an exclusive metadata lock on - the table. Acquiring an X lock while holding other shared - locks is very deadlock-prone. If this is a multi- statement - transaction that holds metadata locks for completed - statements, we don't do it, and report an error instead. + the table. Acquiring X lock while holding other shared + locks can easily lead to deadlocks. We rely on MDL deadlock + detector to discover them. If this is a multi-statement + transaction that holds metadata locks for completed statements, + we should keep these locks after discovery/repair. The action type in this case is OT_DISCOVER or OT_REPAIR. * Our attempt to acquire an MDL lock lead to a deadlock, detected by the MDL deadlock detector. The current @@ -4108,7 +4117,7 @@ request_backoff_action(enum_open_table_action action_arg, keep tables open between statements and a livelock is not possible. */ - if (action_arg != OT_REOPEN_TABLES && m_has_locks) + if (action_arg == OT_BACKOFF_AND_RETRY && m_has_locks) { my_error(ER_LOCK_DEADLOCK, MYF(0)); m_thd->mark_transaction_to_rollback(true); @@ -4135,6 +4144,32 @@ request_backoff_action(enum_open_table_action action_arg, } +/** + An error handler to mark transaction to rollback on DEADLOCK error + during DISCOVER / REPAIR. +*/ +class MDL_deadlock_discovery_repair_handler : public Internal_error_handler +{ +public: + virtual bool handle_condition(THD *thd, + uint sql_errno, + const char* sqlstate, + MYSQL_ERROR::enum_warning_level level, + const char* msg, + MYSQL_ERROR ** cond_hdl) + { + if (sql_errno == ER_LOCK_DEADLOCK) + { + thd->mark_transaction_to_rollback(true); + } + /* + We have marked this transaction to rollback. Return false to allow + error to be reported or handled by other handlers. + */ + return false; + } +}; + /** Recover from failed attempt of open table by performing requested action. @@ -4150,6 +4185,12 @@ Open_table_context:: recover_from_failed_open() { bool result= FALSE; + MDL_deadlock_discovery_repair_handler handler; + /* + Install error handler to mark transaction to rollback on DEADLOCK error. + */ + m_thd->push_internal_handler(&handler); + /* Execute the action. */ switch (m_action) { @@ -4171,7 +4212,12 @@ recover_from_failed_open() m_thd->warning_info->clear_warning_info(m_thd->query_id); m_thd->clear_error(); // Clear error message - m_thd->mdl_context.release_transactional_locks(); + /* + Rollback to start of the current statement to release exclusive lock + on table which was discovered but preserve locks from previous statements + in current transaction. + */ + m_thd->mdl_context.rollback_to_savepoint(start_of_statement_svp()); break; } case OT_REPAIR: @@ -4185,12 +4231,18 @@ recover_from_failed_open() m_failed_table->table_name, FALSE); result= auto_repair_table(m_thd, m_failed_table); - m_thd->mdl_context.release_transactional_locks(); + /* + Rollback to start of the current statement to release exclusive lock + on table which was discovered but preserve locks from previous statements + in current transaction. + */ + m_thd->mdl_context.rollback_to_savepoint(start_of_statement_svp()); break; } default: DBUG_ASSERT(0); } + m_thd->pop_internal_handler(); /* Reset the pointers to conflicting MDL request and the TABLE_LIST element, set when we need auto-discovery or repair, @@ -6859,6 +6911,7 @@ find_field_in_tables(THD *thd, Item_ident *item, if (item->cached_table) { + DBUG_PRINT("info", ("using cached table")); /* This shortcut is used by prepared statements. We assume that TABLE_LIST *first_table is not changed during query execution (which diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 76b2031f553d9c9790011355780dbf6fb274f984..7b97d5839fc6d1a41c8164eb926c7ddaf4ea81f7 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -877,6 +877,7 @@ THD::THD() file_id = 0; query_id= 0; query_name_consts= 0; + semisync_info= 0; db_charset= global_system_variables.collation_database; bzero(ha_data, sizeof(ha_data)); mysys_var=0; @@ -1263,6 +1264,7 @@ void THD::init(void) bzero((char *) &status_var, sizeof(status_var)); bzero((char *) &org_status_var, sizeof(org_status_var)); start_bytes_received= 0; + status_in_global= 0; if (variables.sql_log_bin) variables.option_bits|= OPTION_BIN_LOG; @@ -1366,6 +1368,7 @@ void THD::change_user(void) cleanup(); reset_killed(); cleanup_done= 0; + status_in_global= 0; init(); stmt_map.reset(); my_hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0, @@ -1491,6 +1494,7 @@ THD::~THD() mysql_audit_free_thd(this); if (rli_slave) rli_slave->cleanup_after_session(); + my_free(semisync_info); #endif free_root(&main_mem_root, MYF(0)); diff --git a/sql/sql_class.h b/sql/sql_class.h index 67db1662f107cd249247aa0bcb478de0b2b5bf51..68563ab12b2475c62fb320173548eab7872ca656 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -47,7 +47,6 @@ class Reprepare_observer; class Relay_log_info; - class Query_log_event; class Load_log_event; class Slave_log_event; @@ -59,6 +58,7 @@ class Rows_log_event; class Sroutine_hash_entry; class User_level_lock; class user_var_entry; +struct Trans_binlog_info; enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE }; enum enum_ha_read_modes { RFIRST, RNEXT, RPREV, RLAST, RKEY, RNEXT_SAME }; @@ -1670,6 +1670,9 @@ class THD :public Statement, */ const char *where; + /* Needed by MariaDB semi sync replication */ + Trans_binlog_info *semisync_info; + ulong client_capabilities; /* What the client supports */ ulong max_client_packet_length; @@ -1733,11 +1736,11 @@ class THD :public Statement, /* Do not set socket timeouts for wait_timeout (used with threadpool) */ bool skip_wait_timeout; - /* container for handler's private per-connection data */ - Ha_data ha_data[MAX_HA]; - bool prepare_derived_at_open; + /* Set to 1 if status of this THD is already in global status */ + bool status_in_global; + /* To signal that the tmp table to be created is created for materialized derived table or a view. @@ -1746,6 +1749,9 @@ class THD :public Statement, bool save_prep_leaf_list; + /* container for handler's private per-connection data */ + Ha_data ha_data[MAX_HA]; + #ifndef MYSQL_CLIENT binlog_cache_mngr * binlog_setup_trx_data(); @@ -3116,6 +3122,8 @@ class THD :public Statement, { mysql_mutex_lock(&LOCK_status); add_to_status(&global_status_var, &status_var); + /* Mark that this THD status has already been added in global status */ + status_in_global= 1; mysql_mutex_unlock(&LOCK_status); } diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index c099a2af4967b2624dc447353e214dda9e08a0a1..f5c79e59bf24cb9eb2bbff86ee5e70b1903d7eba 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2001, 2013, Oracle and/or its affiliates. - Copyright (c) 2011, 2013, Monty Program Ab. +/* Copyright (c) 2001, 2015, Oracle and/or its affiliates. + Copyright (c) 2011, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1187,3 +1187,36 @@ void mysql_ha_set_explicit_lock_duration(THD *thd) DBUG_VOID_RETURN; } + +/** + Remove temporary tables from the HANDLER's hash table. The reason + for having a separate function, rather than calling + mysql_ha_rm_tables() is that it is not always feasible (e.g. in + close_temporary_tables) to obtain a TABLE_LIST containing the + temporary tables. + + @See close_temporary_tables + @param thd Thread identifier. +*/ +void mysql_ha_rm_temporary_tables(THD *thd) +{ + DBUG_ENTER("mysql_ha_rm_temporary_tables"); + + TABLE_LIST *tmp_handler_tables= NULL; + for (uint i= 0; i < thd->handler_tables_hash.records; i++) + { + TABLE_LIST *handler_table= reinterpret_cast + (my_hash_element(&thd->handler_tables_hash, i)); + + if (handler_table->table && handler_table->table->s->tmp_table) + { + handler_table->next_local= tmp_handler_tables; + tmp_handler_tables= handler_table; + } + } + + if (tmp_handler_tables) + mysql_ha_rm_tables(thd, tmp_handler_tables); + + DBUG_VOID_RETURN; +} diff --git a/sql/sql_handler.h b/sql/sql_handler.h index 133f553675e64ea4327e43bab8df93a10910cf8a..7fe5ae5bba8cd92c3d29871451818423804e8e2e 100644 --- a/sql/sql_handler.h +++ b/sql/sql_handler.h @@ -1,6 +1,8 @@ #ifndef SQL_HANDLER_INCLUDED #define SQL_HANDLER_INCLUDED -/* Copyright (C) 2010 Monty Program Ab +/* Copyright (c) 2006, 2015, Oracle and/or its affiliates. + Copyright (C) 2010, 2015, MariaDB + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. @@ -73,6 +75,7 @@ void mysql_ha_flush_tables(THD *thd, TABLE_LIST *all_tables); void mysql_ha_rm_tables(THD *thd, TABLE_LIST *tables); void mysql_ha_cleanup(THD *thd); void mysql_ha_set_explicit_lock_duration(THD *thd); +void mysql_ha_rm_temporary_tables(THD *thd); SQL_HANDLER *mysql_ha_read_prepare(THD *thd, TABLE_LIST *tables, enum enum_ha_read_modes mode, char *keyname, diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 4500c4492c42506b2e637d7a586fff532b7cc030..640ee5d1ec9ebbe093ee42bc6629d4df96bbfa59 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2014, SkySQL Ab. + Copyright (c) 2000, 2015, Oracle and/or its affiliates. + Copyright (c) 2010, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -3842,7 +3842,6 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, /* Add selected items to field list */ List_iterator_fast it(*items); Item *item; - Field *tmp_field; DBUG_ENTER("create_table_from_items"); tmp_table.alias= 0; @@ -3857,24 +3856,49 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, while ((item=it++)) { - Create_field *cr_field; - Field *field, *def_field; + Field *tmp_table_field; if (item->type() == Item::FUNC_ITEM) { if (item->result_type() != STRING_RESULT) - field= item->tmp_table_field(&tmp_table); + tmp_table_field= item->tmp_table_field(&tmp_table); else - field= item->tmp_table_field_from_field_type(&tmp_table, 0); + tmp_table_field= item->tmp_table_field_from_field_type(&tmp_table, + false); } else - field= create_tmp_field(thd, &tmp_table, item, item->type(), - (Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0, - 0); - if (!field || - !(cr_field=new Create_field(field,(item->type() == Item::FIELD_ITEM ? - ((Item_field *)item)->field : - (Field*) 0)))) - DBUG_RETURN(0); + { + Field *from_field, * default_field; + tmp_table_field= create_tmp_field(thd, &tmp_table, item, item->type(), + (Item ***) NULL, &from_field, &default_field, + 0, 0, 0, 0, 0); + } + + if (!tmp_table_field) + DBUG_RETURN(NULL); + + Field *table_field; + + switch (item->type()) + { + /* + We have to take into account both the real table's fields and + pseudo-fields used in trigger's body. These fields are used + to copy defaults values later inside constructor of + the class Create_field. + */ + case Item::FIELD_ITEM: + case Item::TRIGGER_FIELD_ITEM: + table_field= ((Item_field *) item)->field; + break; + default: + table_field= NULL; + } + + Create_field *cr_field= new Create_field(tmp_table_field, table_field); + + if (!cr_field) + DBUG_RETURN(NULL); + if (item->maybe_null) cr_field->flags &= ~NOT_NULL_FLAG; alter_info->create_list.push_back(cr_field); @@ -3942,7 +3966,7 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, { if (!thd->is_error()) // CREATE ... IF NOT EXISTS my_ok(thd); // succeed, but did nothing - DBUG_RETURN(0); + DBUG_RETURN(NULL); } } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 1d62acdbe4b4193bef9a505b3af92553319c2297..9ccafa75ca74842c1fade71fefb54e19886675af 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1917,7 +1917,6 @@ void st_select_lex::init_select() with_sum_func= 0; is_correlated= 0; cur_pos_in_select_list= UNDEF_POS; - non_agg_fields.empty(); cond_value= having_value= Item::COND_UNDEF; inner_refs_list.empty(); insert_tables= 0; @@ -1925,6 +1924,7 @@ void st_select_lex::init_select() m_non_agg_field_used= false; m_agg_func_used= false; name_visibility_map= 0; + join= 0; } /* diff --git a/sql/sql_lex.h b/sql/sql_lex.h index a0f8e4568000c635696365732c85fce0664d0075..aa59d76245b30644bd7587a30930831f5dbca229 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -877,8 +877,6 @@ class st_select_lex: public st_select_lex_node bool no_wrap_view_item; /* exclude this select from check of unique_table() */ bool exclude_from_table_unique_test; - /* List of fields that aren't under an aggregate function */ - List non_agg_fields; /* index in the select list of the expression currently being fixed */ int cur_pos_in_select_list; diff --git a/sql/sql_load.cc b/sql/sql_load.cc index b4f8b107f9b0e577555efe7577f7cd2eba244b47..75ddf80ea66857d069ad828e3a6bb8af5ecf9ebe 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2010, 2014, Monty Progrm Ab + Copyright (c) 2000, 2015, Oracle and/or its affiliates. + Copyright (c) 2010, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -2012,8 +2012,15 @@ int READ_INFO::read_xml() break; case '/': /* close tag */ - level--; chr= my_tospace(GET); + /* Decrease the 'level' only when (i) It's not an */ + /* (without space) empty tag i.e. or, (ii) */ + /* It is of format */ + if(chr != '>' || in_tag) + { + level--; + in_tag= false; + } if(chr != '>') /* if this is an empty tag */ tag.length(0); /* we should keep tag value */ while(chr != '>' && chr != my_b_EOF) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 4ad3f9ab8c56aa1418751accdbbb85ebf688733f..a52d55b47e9ecebb315f666514b66a4a1e02096f 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2008, 2014, SkySQL Ab. +/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. + Copyright (c) 2008, 2015, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -5197,9 +5197,12 @@ check_table_access(THD *thd, ulong requirements,TABLE_LIST *tables, for (; i < number && tables != first_not_own_table && tables; tables= tables->next_global, i++) { + TABLE_LIST *const table_ref= tables->correspondent_table ? + tables->correspondent_table : tables; + ulong want_access= requirements; - if (tables->security_ctx) - sctx= tables->security_ctx; + if (table_ref->security_ctx) + sctx= table_ref->security_ctx; else sctx= backup_ctx; @@ -5207,26 +5210,26 @@ check_table_access(THD *thd, ulong requirements,TABLE_LIST *tables, Register access for view underlying table. Remove SHOW_VIEW_ACL, because it will be checked during making view */ - tables->grant.orig_want_privilege= (want_access & ~SHOW_VIEW_ACL); + table_ref->grant.orig_want_privilege= (want_access & ~SHOW_VIEW_ACL); - if (tables->schema_table_reformed) + if (table_ref->schema_table_reformed) { - if (check_show_access(thd, tables)) + if (check_show_access(thd, table_ref)) goto deny; continue; } - DBUG_PRINT("info", ("derived: %d view: %d", tables->derived != 0, - tables->view != 0)); - if (tables->is_anonymous_derived_table() || - (tables->table && tables->table->s && - (int)tables->table->s->tmp_table)) + DBUG_PRINT("info", ("derived: %d view: %d", table_ref->derived != 0, + table_ref->view != 0)); + if (table_ref->is_anonymous_derived_table() || + (table_ref->table && table_ref->table->s && + (int)table_ref->table->s->tmp_table)) continue; thd->security_ctx= sctx; - if (check_access(thd, want_access, tables->get_db_name(), - &tables->grant.privilege, - &tables->grant.m_internal, + if (check_access(thd, want_access, table_ref->get_db_name(), + &table_ref->grant.privilege, + &table_ref->grant.m_internal, 0, no_errors)) goto deny; } @@ -5653,6 +5656,8 @@ void THD::reset_for_next_command() thd->reset_current_stmt_binlog_format_row(); thd->binlog_unsafe_warning_flags= 0; + thd->save_prep_leaf_list= false; + DBUG_PRINT("debug", ("is_current_stmt_binlog_format_row(): %d", thd->is_current_stmt_binlog_format_row())); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index fb7cafc595f8587ba3edf806fec1ce5785838433..e960a3d7c457f45ea86522616cab2a1644a2a131 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4904,6 +4904,8 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, KEY_FIELD *key_fields, *end, *field; uint sz; uint m= max(select_lex->max_equal_elems,1); + DBUG_ENTER("update_ref_and_keys"); + DBUG_PRINT("enter", ("normal_tables: %llx", normal_tables)); SELECT_LEX *sel=thd->lex->current_select; sel->cond_count= 0; @@ -4950,7 +4952,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, sz= max(sizeof(KEY_FIELD),sizeof(SARGABLE_PARAM))* ((sel->cond_count*2 + sel->between_count)*m+1); if (!(key_fields=(KEY_FIELD*) thd->alloc(sz))) - return TRUE; /* purecov: inspected */ + DBUG_RETURN(TRUE); /* purecov: inspected */ and_level= 0; field= end= key_fields; *sargables= (SARGABLE_PARAM *) key_fields + @@ -4959,7 +4961,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, (*sargables)[0].field= 0; if (my_init_dynamic_array(keyuse,sizeof(KEYUSE),20,64)) - return TRUE; + DBUG_RETURN(TRUE); if (cond) { @@ -5009,16 +5011,16 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab, for ( ; field != end ; field++) { if (add_key_part(keyuse,field)) - return TRUE; + DBUG_RETURN(TRUE); } if (select_lex->ftfunc_list->elements) { if (add_ft_keys(keyuse,join_tab,cond,normal_tables)) - return TRUE; + DBUG_RETURN(TRUE); } - return FALSE; + DBUG_RETURN(FALSE); } @@ -14700,6 +14702,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case Item::FIELD_ITEM: case Item::DEFAULT_VALUE_ITEM: case Item::INSERT_VALUE_ITEM: + case Item::TRIGGER_FIELD_ITEM: { Item_field *field= (Item_field*) item; bool orig_modify= modify_item; @@ -17148,6 +17151,10 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab, if (return_tab < join->return_tab) join->return_tab= return_tab; + /* check for errors evaluating the condition */ + if (join->thd->is_error()) + DBUG_RETURN(NESTED_LOOP_ERROR); + if (join->return_tab < join_tab) DBUG_RETURN(NESTED_LOOP_OK); /* @@ -20705,7 +20712,7 @@ setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, Item_field *field; int cur_pos_in_select_list= 0; List_iterator li(fields); - List_iterator naf_it(thd->lex->current_select->non_agg_fields); + List_iterator naf_it(thd->lex->current_select->join->non_agg_fields); field= naf_it++; while (field && (item=li++)) diff --git a/sql/sql_select.h b/sql/sql_select.h index de5baeee1519e3b7c237ac6807fb29077ff024ad..4f807ff5b93c3a4d7fedb712e041c5eb77e24b30 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -922,6 +922,9 @@ class JOIN :public Sql_alloc Item *pre_sort_idx_pushed_cond; void clean_pre_sort_join_tab(); + /* List of fields that aren't under an aggregate function */ + List non_agg_fields; + /* For "Using temporary+Using filesort" queries, JOIN::join_tab can point to either: @@ -1301,6 +1304,7 @@ class JOIN :public Sql_alloc all_fields= fields_arg; if (&fields_list != &fields_arg) /* Avoid valgrind-warning */ fields_list= fields_arg; + non_agg_fields.empty(); bzero((char*) &keyuse,sizeof(keyuse)); tmp_table_param.init(); tmp_table_param.end_write_records= HA_POS_ERROR; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 22484748523b7d8caf6099052e94bca022a65e2d..86fc11ca2360f1dcc40a4fa06e60456ba72eb311 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3109,7 +3109,10 @@ void calc_sum_of_all_status(STATUS_VAR *to) /* Add to this status from existing threads */ while ((tmp= it++)) - add_to_status(to, &tmp->status_var); + { + if (!tmp->status_in_global) + add_to_status(to, &tmp->status_var); + } mysql_mutex_unlock(&LOCK_thread_count); DBUG_VOID_RETURN; @@ -7727,13 +7730,14 @@ bool get_schema_tables_result(JOIN *join, TABLE_LIST *table_list= tab->table->pos_in_table_list; if (table_list->schema_table && thd->fill_information_schema_tables()) { -#if MYSQL_VERSION_ID > 100105 -#error I_S tables only need to be re-populated if make_cond_for_info_schema() will preserve outer fields - bool is_subselect= (&lex->unit != lex->current_select->master_unit() && - lex->current_select->master_unit()->item); -#else -#define is_subselect false -#endif + /* + I_S tables only need to be re-populated if make_cond_for_info_schema() + preserves outer fields + */ + bool is_subselect= &lex->unit != lex->current_select->master_unit() && + lex->current_select->master_unit()->item && + tab->select_cond && + tab->select_cond->used_tables() & OUTER_REF_TABLE_BIT; /* A value of 0 indicates a dummy implementation */ if (table_list->schema_table->fill_table == 0) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 4139aa7d9553f9a8bf1471efb70ce96e45f8e19a..6e589e2b8d4f7691ba3ae65e50aae5da113a6a0a 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4010,6 +4010,12 @@ static bool check_if_created_table_can_be_opened(THD *thd, result= (open_table_def(thd, &share, 0) || open_table_from_share(thd, &share, "", 0, (uint) READ_ALL, 0, &table, TRUE)); + /* + Assert that the change list is empty as no partition function currently + needs to modify item tree. May need call THD::rollback_item_tree_changes + later before calling closefrm if the change list is not empty. + */ + DBUG_ASSERT(thd->change_list.is_empty()); if (! result) (void) closefrm(&table, 0); diff --git a/sql/sql_test.cc b/sql/sql_test.cc index ec426e39ee35e5ab7930deb3669bd4398fad3795..dc6bc8187ffc8bba9031b0750bb8ab20678f9253 100644 --- a/sql/sql_test.cc +++ b/sql/sql_test.cc @@ -248,7 +248,7 @@ TEST_join(JOIN *join) #define FT_KEYPART (MAX_REF_PARTS+10) -void print_keyuse(KEYUSE *keyuse) +static void print_keyuse(KEYUSE *keyuse) { char buff[256]; char buf2[64]; @@ -266,14 +266,11 @@ void print_keyuse(KEYUSE *keyuse) else fieldname= key_info->key_part[keyuse->keypart].field->field_name; ll2str(keyuse->used_tables, buf2, 16, 0); - DBUG_LOCK_FILE; fprintf(DBUG_FILE, "KEYUSE: %s.%s=%s optimize: %u used_tables: %s " "ref_table_rows: %lu keypart_map: %0lx\n", keyuse->table->alias.c_ptr(), fieldname, str.ptr(), (uint) keyuse->optimize, buf2, (ulong) keyuse->ref_table_rows, (ulong) keyuse->keypart_map); - DBUG_UNLOCK_FILE; - //key_part_map keypart_map; --?? there can be several? } @@ -282,9 +279,9 @@ void print_keyuse_array(DYNAMIC_ARRAY *keyuse_array) { DBUG_LOCK_FILE; fprintf(DBUG_FILE, "KEYUSE array (%d elements)\n", keyuse_array->elements); - DBUG_UNLOCK_FILE; for(uint i=0; i < keyuse_array->elements; i++) print_keyuse((KEYUSE*)dynamic_array_ptr(keyuse_array, i)); + DBUG_UNLOCK_FILE; } diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 6e2e6e06ff7f95b4ab19c61784a9c63090b16fba..87d3e86b2c7d5393e3d11e5e5f172e33e258d04a 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1021,7 +1021,6 @@ bool st_select_lex::cleanup() { error= (bool) ((uint) error | (uint) lex_unit->cleanup()); } - non_agg_fields.empty(); inner_refs_list.empty(); exclude_from_table_unique_test= FALSE; DBUG_RETURN(error); @@ -1032,6 +1031,7 @@ void st_select_lex::cleanup_all_joins(bool full) { SELECT_LEX_UNIT *unit; SELECT_LEX *sl; + DBUG_ENTER("st_select_lex::cleanup_all_joins"); if (join) join->cleanup(full); @@ -1039,6 +1039,7 @@ void st_select_lex::cleanup_all_joins(bool full) for (unit= first_inner_unit(); unit; unit= unit->next_unit()) for (sl= unit->first_select(); sl; sl= sl->next_select()) sl->cleanup_all_joins(full); + DBUG_VOID_RETURN; } diff --git a/sql/sql_yacc.cc b/sql/sql_yacc.cc index 99085102a31f300c8e10fc471ef29f8c6586c501..6aee2510f130057360e12ecf49a3f5f713dd447f 100644 --- a/sql/sql_yacc.cc +++ b/sql/sql_yacc.cc @@ -3660,114 +3660,114 @@ static const yytype_uint16 yyrline[] = 10529, 10530, 10534, 10535, 10536, 10540, 10541, 10542, 10543, 10544, 10545, 10549, 10550, 10551, 10552, 10553, 10557, 10558, 10559, 10560, 10561, 10565, 10566, 10567, 10568, 10569, 10573, 10578, 10579, 10583, - 10584, 10587, 10590, 10589, 10620, 10621, 10625, 10626, 10630, 10640, - 10640, 10650, 10651, 10655, 10674, 10707, 10706, 10719, 10727, 10718, - 10729, 10741, 10753, 10752, 10770, 10769, 10780, 10780, 10796, 10803, - 10825, 10845, 10857, 10862, 10861, 10871, 10877, 10884, 10889, 10894, - 10904, 10905, 10909, 10920, 10921, 10925, 10936, 10937, 10941, 10942, - 10950, 10958, 10949, 10968, 10975, 10967, 10985, 10993, 10994, 11002, - 11006, 11007, 11018, 11019, 11023, 11032, 11033, 11034, 11036, 11035, - 11046, 11047, 11051, 11052, 11054, 11053, 11057, 11056, 11062, 11063, - 11067, 11068, 11072, 11082, 11083, 11087, 11088, 11093, 11092, 11106, - 11107, 11111, 11116, 11124, 11125, 11133, 11135, 11135, 11143, 11151, - 11142, 11173, 11174, 11178, 11186, 11187, 11191, 11201, 11202, 11209, - 11208, 11224, 11223, 11235, 11234, 11246, 11245, 11259, 11260, 11264, - 11277, 11293, 11294, 11298, 11299, 11303, 11304, 11305, 11310, 11309, - 11330, 11332, 11335, 11337, 11340, 11341, 11344, 11348, 11352, 11356, - 11360, 11364, 11368, 11372, 11376, 11384, 11387, 11397, 11396, 11411, - 11418, 11426, 11434, 11442, 11450, 11458, 11465, 11467, 11469, 11478, - 11482, 11487, 11486, 11492, 11491, 11496, 11505, 11512, 11521, 11530, - 11535, 11537, 11539, 11541, 11543, 11545, 11552, 11560, 11562, 11570, - 11577, 11584, 11594, 11601, 11607, 11615, 11623, 11627, 11631, 11638, - 11645, 11652, 11659, 11666, 11673, 11679, 11686, 11693, 11698, 11703, - 11711, 11713, 11715, 11720, 11721, 11724, 11726, 11730, 11731, 11735, - 11736, 11740, 11741, 11745, 11746, 11750, 11751, 11754, 11756, 11763, - 11774, 11773, 11789, 11788, 11798, 11799, 11803, 11804, 11805, 11809, - 11810, 11811, 11826, 11825, 11838, 11847, 11837, 11849, 11853, 11854, - 11868, 11869, 11874, 11876, 11878, 11880, 11882, 11884, 11886, 11888, - 11890, 11892, 11894, 11896, 11901, 11903, 11905, 11907, 11909, 11911, - 11913, 11918, 11919, 11923, 11924, 11928, 11927, 11937, 11938, 11942, - 11942, 11944, 11945, 11949, 11950, 11955, 11954, 11965, 11969, 11973, - 11986, 11985, 11999, 12000, 12001, 12004, 12005, 12006, 12010, 12015, - 12025, 12037, 12048, 12058, 12068, 12036, 12076, 12077, 12081, 12082, - 12086, 12087, 12095, 12099, 12100, 12101, 12104, 12106, 12110, 12111, - 12115, 12120, 12127, 12132, 12139, 12141, 12145, 12146, 12150, 12155, - 12163, 12164, 12167, 12169, 12177, 12179, 12183, 12184, 12185, 12189, - 12191, 12196, 12197, 12206, 12207, 12211, 12212, 12216, 12229, 12252, - 12264, 12275, 12294, 12302, 12314, 12322, 12337, 12357, 12358, 12359, - 12367, 12368, 12369, 12376, 12382, 12388, 12394, 12400, 12406, 12435, - 12463, 12464, 12465, 12469, 12479, 12489, 12495, 12504, 12519, 12520, - 12524, 12533, 12548, 12552, 12598, 12602, 12619, 12623, 12701, 12725, - 12755, 12756, 12772, 12782, 12786, 12792, 12798, 12808, 12814, 12823, - 12833, 12834, 12862, 12876, 12890, 12905, 12906, 12916, 12917, 12927, - 12928, 12929, 12933, 12949, 12970, 12985, 12986, 12987, 12988, 12989, - 12990, 12991, 12992, 12993, 12994, 12995, 12996, 12997, 12998, 12999, - 13000, 13001, 13002, 13003, 13004, 13005, 13006, 13007, 13008, 13009, - 13010, 13011, 13012, 13013, 13014, 13015, 13016, 13017, 13018, 13019, - 13020, 13021, 13022, 13023, 13024, 13025, 13026, 13027, 13028, 13029, - 13030, 13031, 13032, 13033, 13034, 13035, 13036, 13037, 13038, 13039, - 13040, 13041, 13042, 13043, 13053, 13054, 13055, 13056, 13057, 13058, - 13059, 13060, 13061, 13062, 13063, 13064, 13065, 13066, 13067, 13068, - 13069, 13070, 13071, 13072, 13073, 13074, 13075, 13076, 13077, 13078, - 13079, 13080, 13081, 13082, 13083, 13084, 13085, 13086, 13087, 13088, - 13089, 13090, 13091, 13092, 13093, 13094, 13095, 13096, 13097, 13098, - 13099, 13100, 13101, 13102, 13103, 13104, 13105, 13106, 13107, 13108, - 13109, 13110, 13111, 13112, 13113, 13114, 13115, 13116, 13117, 13118, - 13119, 13120, 13121, 13122, 13123, 13124, 13125, 13126, 13127, 13128, - 13129, 13130, 13131, 13132, 13133, 13134, 13135, 13136, 13137, 13138, - 13139, 13140, 13141, 13142, 13143, 13144, 13145, 13146, 13147, 13148, - 13149, 13150, 13151, 13152, 13153, 13154, 13155, 13156, 13157, 13158, - 13159, 13160, 13161, 13162, 13163, 13164, 13165, 13166, 13167, 13168, - 13169, 13170, 13171, 13172, 13173, 13174, 13175, 13176, 13177, 13178, - 13179, 13180, 13181, 13182, 13183, 13184, 13185, 13186, 13187, 13188, - 13189, 13190, 13191, 13192, 13193, 13194, 13195, 13196, 13197, 13198, - 13199, 13200, 13201, 13202, 13203, 13204, 13205, 13206, 13207, 13208, - 13209, 13210, 13211, 13212, 13213, 13214, 13215, 13216, 13217, 13218, - 13219, 13220, 13221, 13222, 13223, 13224, 13225, 13226, 13227, 13228, - 13229, 13230, 13231, 13232, 13233, 13234, 13235, 13236, 13237, 13238, - 13239, 13240, 13241, 13242, 13243, 13244, 13245, 13246, 13247, 13248, - 13249, 13250, 13251, 13252, 13253, 13254, 13255, 13256, 13257, 13258, - 13259, 13260, 13261, 13262, 13263, 13264, 13265, 13266, 13267, 13268, - 13269, 13270, 13271, 13272, 13273, 13274, 13275, 13276, 13277, 13278, - 13279, 13280, 13281, 13282, 13283, 13284, 13285, 13286, 13287, 13288, - 13289, 13290, 13291, 13292, 13293, 13294, 13295, 13296, 13297, 13298, - 13299, 13300, 13301, 13302, 13303, 13304, 13305, 13306, 13307, 13308, - 13309, 13310, 13311, 13312, 13313, 13314, 13315, 13316, 13317, 13318, - 13319, 13320, 13321, 13322, 13323, 13324, 13325, 13326, 13327, 13328, - 13329, 13330, 13331, 13332, 13333, 13334, 13335, 13336, 13337, 13338, - 13339, 13340, 13341, 13342, 13343, 13344, 13345, 13352, 13351, 13366, - 13367, 13371, 13372, 13376, 13376, 13456, 13457, 13458, 13459, 13463, - 13464, 13468, 13469, 13470, 13471, 13475, 13476, 13477, 13478, 13482, - 13483, 13487, 13528, 13546, 13557, 13569, 13582, 13597, 13616, 13642, - 13655, 13681, 13724, 13738, 13739, 13740, 13741, 13745, 13746, 13755, - 13767, 13768, 13769, 13775, 13781, 13793, 13792, 13808, 13809, 13813, - 13814, 13818, 13833, 13834, 13835, 13840, 13841, 13846, 13845, 13865, - 13877, 13890, 13889, 13923, 13924, 13928, 13929, 13933, 13934, 13935, - 13936, 13938, 13937, 13950, 13951, 13952, 13953, 13954, 13960, 13965, - 13971, 13982, 13993, 13997, 14007, 14012, 14019, 14031, 14043, 14052, - 14054, 14058, 14059, 14066, 14068, 14072, 14073, 14078, 14077, 14081, - 14080, 14084, 14083, 14087, 14086, 14089, 14090, 14091, 14092, 14093, - 14094, 14095, 14096, 14097, 14098, 14099, 14100, 14101, 14102, 14103, - 14104, 14105, 14106, 14107, 14108, 14109, 14110, 14111, 14112, 14113, - 14114, 14118, 14119, 14123, 14124, 14128, 14138, 14148, 14161, 14176, - 14189, 14202, 14214, 14219, 14227, 14232, 14239, 14239, 14240, 14240, - 14243, 14270, 14275, 14281, 14287, 14293, 14297, 14301, 14302, 14306, - 14333, 14335, 14339, 14343, 14347, 14354, 14355, 14359, 14360, 14364, - 14365, 14369, 14370, 14376, 14382, 14388, 14398, 14397, 14407, 14408, - 14413, 14414, 14415, 14420, 14421, 14422, 14426, 14427, 14431, 14443, - 14452, 14462, 14471, 14485, 14486, 14491, 14490, 14506, 14507, 14508, - 14512, 14513, 14517, 14517, 14539, 14540, 14544, 14545, 14546, 14550, - 14554, 14561, 14564, 14562, 14578, 14585, 14606, 14630, 14632, 14636, - 14637, 14641, 14642, 14650, 14651, 14652, 14653, 14659, 14665, 14675, - 14677, 14679, 14684, 14685, 14686, 14687, 14688, 14692, 14693, 14694, - 14695, 14696, 14697, 14707, 14708, 14713, 14726, 14739, 14741, 14743, - 14748, 14753, 14755, 14757, 14763, 14764, 14766, 14772, 14771, 14788, - 14789, 14793, 14798, 14806, 14806, 14830, 14831, 14836, 14837, 14839, - 14841, 14859, 14865, 14870, 14852, 14931, 14948, 14972, 15003, 15007, - 15016, 15039, 14968, 15102, 15126, 15135, 15142, 15101, 15162, 15166, - 15170, 15174, 15178, 15182, 15189, 15196, 15203, 15213, 15214, 15218, - 15219, 15220, 15224, 15225, 15230, 15232, 15231, 15237, 15238, 15242, - 15249, 15259, 15265, 15276 + 10584, 10587, 10590, 10589, 10632, 10633, 10637, 10638, 10642, 10652, + 10652, 10662, 10663, 10667, 10686, 10719, 10718, 10731, 10739, 10730, + 10741, 10753, 10765, 10764, 10782, 10781, 10792, 10792, 10808, 10815, + 10837, 10857, 10869, 10874, 10873, 10883, 10889, 10896, 10901, 10906, + 10916, 10917, 10921, 10932, 10933, 10937, 10948, 10949, 10953, 10954, + 10962, 10970, 10961, 10980, 10987, 10979, 10997, 11005, 11006, 11014, + 11018, 11019, 11030, 11031, 11035, 11044, 11045, 11046, 11048, 11047, + 11058, 11059, 11063, 11064, 11066, 11065, 11069, 11068, 11074, 11075, + 11079, 11080, 11084, 11094, 11095, 11099, 11100, 11105, 11104, 11118, + 11119, 11123, 11128, 11136, 11137, 11145, 11147, 11147, 11155, 11163, + 11154, 11185, 11186, 11190, 11198, 11199, 11203, 11213, 11214, 11221, + 11220, 11236, 11235, 11247, 11246, 11258, 11257, 11271, 11272, 11276, + 11289, 11305, 11306, 11310, 11311, 11315, 11316, 11317, 11322, 11321, + 11342, 11344, 11347, 11349, 11352, 11353, 11356, 11360, 11364, 11368, + 11372, 11376, 11380, 11384, 11388, 11396, 11399, 11409, 11408, 11423, + 11430, 11438, 11446, 11454, 11462, 11470, 11477, 11479, 11481, 11490, + 11494, 11499, 11498, 11504, 11503, 11508, 11517, 11524, 11533, 11542, + 11547, 11549, 11551, 11553, 11555, 11557, 11564, 11572, 11574, 11582, + 11589, 11596, 11606, 11613, 11619, 11627, 11635, 11639, 11643, 11650, + 11657, 11664, 11671, 11678, 11685, 11691, 11698, 11705, 11710, 11715, + 11723, 11725, 11727, 11732, 11733, 11736, 11738, 11742, 11743, 11747, + 11748, 11752, 11753, 11757, 11758, 11762, 11763, 11766, 11768, 11775, + 11786, 11785, 11801, 11800, 11810, 11811, 11815, 11816, 11817, 11821, + 11822, 11823, 11838, 11837, 11850, 11859, 11849, 11861, 11865, 11866, + 11880, 11881, 11886, 11888, 11890, 11892, 11894, 11896, 11898, 11900, + 11902, 11904, 11906, 11908, 11913, 11915, 11917, 11919, 11921, 11923, + 11925, 11930, 11931, 11935, 11936, 11940, 11939, 11949, 11950, 11954, + 11954, 11956, 11957, 11961, 11962, 11967, 11966, 11977, 11981, 11985, + 11998, 11997, 12011, 12012, 12013, 12016, 12017, 12018, 12022, 12027, + 12037, 12049, 12060, 12070, 12080, 12048, 12088, 12089, 12093, 12094, + 12098, 12099, 12107, 12111, 12112, 12113, 12116, 12118, 12122, 12123, + 12127, 12132, 12139, 12144, 12151, 12153, 12157, 12158, 12162, 12167, + 12175, 12176, 12179, 12181, 12189, 12191, 12195, 12196, 12197, 12201, + 12203, 12208, 12209, 12218, 12219, 12223, 12224, 12228, 12241, 12264, + 12276, 12287, 12306, 12314, 12326, 12334, 12349, 12369, 12370, 12371, + 12379, 12380, 12381, 12388, 12394, 12400, 12406, 12412, 12418, 12447, + 12475, 12476, 12477, 12481, 12491, 12501, 12507, 12516, 12531, 12532, + 12536, 12545, 12560, 12564, 12610, 12614, 12631, 12635, 12713, 12737, + 12767, 12768, 12784, 12794, 12798, 12804, 12810, 12820, 12826, 12835, + 12845, 12846, 12874, 12888, 12902, 12917, 12918, 12928, 12929, 12939, + 12940, 12941, 12945, 12961, 12982, 12997, 12998, 12999, 13000, 13001, + 13002, 13003, 13004, 13005, 13006, 13007, 13008, 13009, 13010, 13011, + 13012, 13013, 13014, 13015, 13016, 13017, 13018, 13019, 13020, 13021, + 13022, 13023, 13024, 13025, 13026, 13027, 13028, 13029, 13030, 13031, + 13032, 13033, 13034, 13035, 13036, 13037, 13038, 13039, 13040, 13041, + 13042, 13043, 13044, 13045, 13046, 13047, 13048, 13049, 13050, 13051, + 13052, 13053, 13054, 13055, 13065, 13066, 13067, 13068, 13069, 13070, + 13071, 13072, 13073, 13074, 13075, 13076, 13077, 13078, 13079, 13080, + 13081, 13082, 13083, 13084, 13085, 13086, 13087, 13088, 13089, 13090, + 13091, 13092, 13093, 13094, 13095, 13096, 13097, 13098, 13099, 13100, + 13101, 13102, 13103, 13104, 13105, 13106, 13107, 13108, 13109, 13110, + 13111, 13112, 13113, 13114, 13115, 13116, 13117, 13118, 13119, 13120, + 13121, 13122, 13123, 13124, 13125, 13126, 13127, 13128, 13129, 13130, + 13131, 13132, 13133, 13134, 13135, 13136, 13137, 13138, 13139, 13140, + 13141, 13142, 13143, 13144, 13145, 13146, 13147, 13148, 13149, 13150, + 13151, 13152, 13153, 13154, 13155, 13156, 13157, 13158, 13159, 13160, + 13161, 13162, 13163, 13164, 13165, 13166, 13167, 13168, 13169, 13170, + 13171, 13172, 13173, 13174, 13175, 13176, 13177, 13178, 13179, 13180, + 13181, 13182, 13183, 13184, 13185, 13186, 13187, 13188, 13189, 13190, + 13191, 13192, 13193, 13194, 13195, 13196, 13197, 13198, 13199, 13200, + 13201, 13202, 13203, 13204, 13205, 13206, 13207, 13208, 13209, 13210, + 13211, 13212, 13213, 13214, 13215, 13216, 13217, 13218, 13219, 13220, + 13221, 13222, 13223, 13224, 13225, 13226, 13227, 13228, 13229, 13230, + 13231, 13232, 13233, 13234, 13235, 13236, 13237, 13238, 13239, 13240, + 13241, 13242, 13243, 13244, 13245, 13246, 13247, 13248, 13249, 13250, + 13251, 13252, 13253, 13254, 13255, 13256, 13257, 13258, 13259, 13260, + 13261, 13262, 13263, 13264, 13265, 13266, 13267, 13268, 13269, 13270, + 13271, 13272, 13273, 13274, 13275, 13276, 13277, 13278, 13279, 13280, + 13281, 13282, 13283, 13284, 13285, 13286, 13287, 13288, 13289, 13290, + 13291, 13292, 13293, 13294, 13295, 13296, 13297, 13298, 13299, 13300, + 13301, 13302, 13303, 13304, 13305, 13306, 13307, 13308, 13309, 13310, + 13311, 13312, 13313, 13314, 13315, 13316, 13317, 13318, 13319, 13320, + 13321, 13322, 13323, 13324, 13325, 13326, 13327, 13328, 13329, 13330, + 13331, 13332, 13333, 13334, 13335, 13336, 13337, 13338, 13339, 13340, + 13341, 13342, 13343, 13344, 13345, 13346, 13347, 13348, 13349, 13350, + 13351, 13352, 13353, 13354, 13355, 13356, 13357, 13364, 13363, 13378, + 13379, 13383, 13384, 13388, 13388, 13468, 13469, 13470, 13471, 13475, + 13476, 13480, 13481, 13482, 13483, 13487, 13488, 13489, 13490, 13494, + 13495, 13499, 13540, 13558, 13569, 13581, 13594, 13609, 13628, 13654, + 13667, 13693, 13736, 13750, 13751, 13752, 13753, 13757, 13758, 13767, + 13779, 13780, 13781, 13787, 13793, 13805, 13804, 13820, 13821, 13825, + 13826, 13830, 13845, 13846, 13847, 13852, 13853, 13858, 13857, 13877, + 13889, 13902, 13901, 13935, 13936, 13940, 13941, 13945, 13946, 13947, + 13948, 13950, 13949, 13962, 13963, 13964, 13965, 13966, 13972, 13977, + 13983, 13994, 14005, 14009, 14019, 14024, 14031, 14043, 14055, 14064, + 14066, 14070, 14071, 14078, 14080, 14084, 14085, 14090, 14089, 14093, + 14092, 14096, 14095, 14099, 14098, 14101, 14102, 14103, 14104, 14105, + 14106, 14107, 14108, 14109, 14110, 14111, 14112, 14113, 14114, 14115, + 14116, 14117, 14118, 14119, 14120, 14121, 14122, 14123, 14124, 14125, + 14126, 14130, 14131, 14135, 14136, 14140, 14150, 14160, 14173, 14188, + 14201, 14214, 14226, 14231, 14239, 14244, 14251, 14251, 14252, 14252, + 14255, 14282, 14287, 14293, 14299, 14305, 14309, 14313, 14314, 14318, + 14345, 14347, 14351, 14355, 14359, 14366, 14367, 14371, 14372, 14376, + 14377, 14381, 14382, 14388, 14394, 14400, 14410, 14409, 14419, 14420, + 14425, 14426, 14427, 14432, 14433, 14434, 14438, 14439, 14443, 14455, + 14464, 14474, 14483, 14497, 14498, 14503, 14502, 14518, 14519, 14520, + 14524, 14525, 14529, 14529, 14551, 14552, 14556, 14557, 14558, 14562, + 14566, 14573, 14576, 14574, 14590, 14597, 14618, 14642, 14644, 14648, + 14649, 14653, 14654, 14662, 14663, 14664, 14665, 14671, 14677, 14687, + 14689, 14691, 14696, 14697, 14698, 14699, 14700, 14704, 14705, 14706, + 14707, 14708, 14709, 14719, 14720, 14725, 14738, 14751, 14753, 14755, + 14760, 14765, 14767, 14769, 14775, 14776, 14778, 14784, 14783, 14800, + 14801, 14805, 14810, 14818, 14818, 14842, 14843, 14848, 14849, 14851, + 14853, 14871, 14877, 14882, 14864, 14943, 14960, 14984, 15015, 15019, + 15028, 15051, 14980, 15114, 15138, 15147, 15154, 15113, 15174, 15178, + 15182, 15186, 15190, 15194, 15201, 15208, 15215, 15225, 15226, 15230, + 15231, 15232, 15236, 15237, 15242, 15244, 15243, 15249, 15250, 15254, + 15261, 15271, 15277, 15288 }; #endif @@ -31782,27 +31782,45 @@ YYSTYPE yylval; if (add_proc_to_list(lex->thd, item)) MYSQL_YYABORT; Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + + /* + PROCEDURE CLAUSE cannot handle subquery as one of its parameter, + so set expr_allows_subselect as false to disallow any subqueries + further. Reset expr_allows_subselect back to true once the + parameters are reduced. + */ + Lex->expr_allows_subselect= false; + } + break; + + case 1573: + +/* Line 1455 of yacc.c */ +#line 10625 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Subqueries are allowed from now.*/ + Lex->expr_allows_subselect= true; } break; case 1574: /* Line 1455 of yacc.c */ -#line 10620 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10632 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1575: /* Line 1455 of yacc.c */ -#line 10621 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10633 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1578: /* Line 1455 of yacc.c */ -#line 10631 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10643 "/home/buildbot/git/sql/sql_yacc.yy" { if (add_proc_to_list(thd, (yyvsp[(2) - (3)].item))) MYSQL_YYABORT; @@ -31814,7 +31832,7 @@ YYSTYPE yylval; case 1579: /* Line 1455 of yacc.c */ -#line 10640 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10652 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (!lex->describe && (!(lex->result= new select_dumpvar()))) @@ -31825,21 +31843,21 @@ YYSTYPE yylval; case 1580: /* Line 1455 of yacc.c */ -#line 10646 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10658 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1582: /* Line 1455 of yacc.c */ -#line 10651 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10663 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1583: /* Line 1455 of yacc.c */ -#line 10656 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10668 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (lex->result) @@ -31863,7 +31881,7 @@ YYSTYPE yylval; case 1584: /* Line 1455 of yacc.c */ -#line 10675 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10687 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; sp_variable_t *t; @@ -31897,7 +31915,7 @@ YYSTYPE yylval; case 1585: /* Line 1455 of yacc.c */ -#line 10707 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10719 "/home/buildbot/git/sql/sql_yacc.yy" { if (! Lex->parsing_options.allows_select_into) { @@ -31910,7 +31928,7 @@ YYSTYPE yylval; case 1587: /* Line 1455 of yacc.c */ -#line 10719 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10731 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->uncacheable(UNCACHEABLE_SIDEEFFECT); @@ -31923,14 +31941,14 @@ YYSTYPE yylval; case 1588: /* Line 1455 of yacc.c */ -#line 10727 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10739 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->exchange->cs= (yyvsp[(4) - (4)].charset); } break; case 1590: /* Line 1455 of yacc.c */ -#line 10730 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10742 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (!lex->describe) @@ -31947,7 +31965,7 @@ YYSTYPE yylval; case 1591: /* Line 1455 of yacc.c */ -#line 10742 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10754 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); } @@ -31956,7 +31974,7 @@ YYSTYPE yylval; case 1592: /* Line 1455 of yacc.c */ -#line 10753 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10765 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command = SQLCOM_DO; @@ -31967,7 +31985,7 @@ YYSTYPE yylval; case 1593: /* Line 1455 of yacc.c */ -#line 10759 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10771 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->insert_list= (yyvsp[(3) - (3)].item_list); } @@ -31976,7 +31994,7 @@ YYSTYPE yylval; case 1594: /* Line 1455 of yacc.c */ -#line 10770 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10782 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command = SQLCOM_DROP_TABLE; @@ -31990,21 +32008,21 @@ YYSTYPE yylval; case 1595: /* Line 1455 of yacc.c */ -#line 10779 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10791 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1596: /* Line 1455 of yacc.c */ -#line 10780 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10792 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1597: /* Line 1455 of yacc.c */ -#line 10781 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10793 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; Alter_drop *ad= new Alter_drop(Alter_drop::KEY, (yyvsp[(3) - (6)].lex_str).str); @@ -32025,7 +32043,7 @@ YYSTYPE yylval; case 1598: /* Line 1455 of yacc.c */ -#line 10797 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10809 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_DROP_DB; @@ -32037,7 +32055,7 @@ YYSTYPE yylval; case 1599: /* Line 1455 of yacc.c */ -#line 10804 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10816 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; sp_name *spname; @@ -32064,7 +32082,7 @@ YYSTYPE yylval; case 1600: /* Line 1455 of yacc.c */ -#line 10826 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10838 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; LEX_STRING db= {0, 0}; @@ -32089,7 +32107,7 @@ YYSTYPE yylval; case 1601: /* Line 1455 of yacc.c */ -#line 10846 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10858 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (lex->sphead) @@ -32106,7 +32124,7 @@ YYSTYPE yylval; case 1602: /* Line 1455 of yacc.c */ -#line 10858 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10870 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_DROP_USER; } @@ -32115,7 +32133,7 @@ YYSTYPE yylval; case 1603: /* Line 1455 of yacc.c */ -#line 10862 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10874 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_DROP_VIEW; @@ -32128,14 +32146,14 @@ YYSTYPE yylval; case 1604: /* Line 1455 of yacc.c */ -#line 10870 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10882 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1605: /* Line 1455 of yacc.c */ -#line 10872 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10884 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->drop_if_exists= (yyvsp[(3) - (4)].num); Lex->spname= (yyvsp[(4) - (4)].spname); @@ -32146,7 +32164,7 @@ YYSTYPE yylval; case 1606: /* Line 1455 of yacc.c */ -#line 10878 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10890 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_DROP_TRIGGER; @@ -32158,7 +32176,7 @@ YYSTYPE yylval; case 1607: /* Line 1455 of yacc.c */ -#line 10885 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10897 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= DROP_TABLESPACE; @@ -32168,7 +32186,7 @@ YYSTYPE yylval; case 1608: /* Line 1455 of yacc.c */ -#line 10890 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10902 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= DROP_LOGFILE_GROUP; @@ -32178,7 +32196,7 @@ YYSTYPE yylval; case 1609: /* Line 1455 of yacc.c */ -#line 10895 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10907 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_DROP_SERVER; Lex->drop_if_exists= (yyvsp[(3) - (4)].num); @@ -32190,7 +32208,7 @@ YYSTYPE yylval; case 1612: /* Line 1455 of yacc.c */ -#line 10910 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10922 "/home/buildbot/git/sql/sql_yacc.yy" { if (!Select->add_table_to_list(thd, (yyvsp[(1) - (1)].table), NULL, TL_OPTION_UPDATING, @@ -32203,7 +32221,7 @@ YYSTYPE yylval; case 1615: /* Line 1455 of yacc.c */ -#line 10926 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10938 "/home/buildbot/git/sql/sql_yacc.yy" { if (!Select->add_table_to_list(thd, (yyvsp[(1) - (1)].table), NULL, TL_OPTION_UPDATING | TL_OPTION_ALIAS, @@ -32216,35 +32234,35 @@ YYSTYPE yylval; case 1616: /* Line 1455 of yacc.c */ -#line 10936 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10948 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= 0; } break; case 1617: /* Line 1455 of yacc.c */ -#line 10937 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10949 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= 1; } break; case 1618: /* Line 1455 of yacc.c */ -#line 10941 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10953 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= 0; } break; case 1619: /* Line 1455 of yacc.c */ -#line 10942 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10954 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= 1; } break; case 1620: /* Line 1455 of yacc.c */ -#line 10950 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10962 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_INSERT; @@ -32256,7 +32274,7 @@ YYSTYPE yylval; case 1621: /* Line 1455 of yacc.c */ -#line 10958 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10970 "/home/buildbot/git/sql/sql_yacc.yy" { Select->set_lock_for_tables((yyvsp[(3) - (5)].lock_type)); Lex->current_select= &Lex->select_lex; @@ -32266,14 +32284,14 @@ YYSTYPE yylval; case 1622: /* Line 1455 of yacc.c */ -#line 10963 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10975 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1623: /* Line 1455 of yacc.c */ -#line 10968 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10980 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command = SQLCOM_REPLACE; @@ -32285,7 +32303,7 @@ YYSTYPE yylval; case 1624: /* Line 1455 of yacc.c */ -#line 10975 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10987 "/home/buildbot/git/sql/sql_yacc.yy" { Select->set_lock_for_tables((yyvsp[(3) - (4)].lock_type)); Lex->current_select= &Lex->select_lex; @@ -32295,14 +32313,14 @@ YYSTYPE yylval; case 1625: /* Line 1455 of yacc.c */ -#line 10980 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10992 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1626: /* Line 1455 of yacc.c */ -#line 10985 "/home/buildbot/git/sql/sql_yacc.yy" +#line 10997 "/home/buildbot/git/sql/sql_yacc.yy" { /* If it is SP we do not allow insert optimisation when result of @@ -32316,14 +32334,14 @@ YYSTYPE yylval; case 1627: /* Line 1455 of yacc.c */ -#line 10993 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11005 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } break; case 1628: /* Line 1455 of yacc.c */ -#line 10995 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11007 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->keyword_delayed_begin_offset= (uint)(YYLIP->get_tok_start() - thd->query()); @@ -32336,21 +32354,21 @@ YYSTYPE yylval; case 1629: /* Line 1455 of yacc.c */ -#line 11002 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11014 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lock_type)= TL_WRITE; } break; case 1630: /* Line 1455 of yacc.c */ -#line 11006 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11018 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lock_type)= (yyvsp[(1) - (1)].lock_type); } break; case 1631: /* Line 1455 of yacc.c */ -#line 11008 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11020 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->keyword_delayed_begin_offset= (uint)(YYLIP->get_tok_start() - thd->query()); @@ -32363,21 +32381,21 @@ YYSTYPE yylval; case 1632: /* Line 1455 of yacc.c */ -#line 11018 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11030 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1633: /* Line 1455 of yacc.c */ -#line 11019 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11031 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1634: /* Line 1455 of yacc.c */ -#line 11024 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11036 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->field_list.empty(); @@ -32389,28 +32407,28 @@ YYSTYPE yylval; case 1635: /* Line 1455 of yacc.c */ -#line 11032 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11044 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1636: /* Line 1455 of yacc.c */ -#line 11033 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11045 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1637: /* Line 1455 of yacc.c */ -#line 11034 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11046 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1638: /* Line 1455 of yacc.c */ -#line 11036 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11048 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (!(lex->insert_list = new List_item) || @@ -32422,63 +32440,63 @@ YYSTYPE yylval; case 1640: /* Line 1455 of yacc.c */ -#line 11046 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11058 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->field_list.push_back((yyvsp[(3) - (3)].item)); } break; case 1641: /* Line 1455 of yacc.c */ -#line 11047 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11059 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->field_list.push_back((yyvsp[(1) - (1)].item)); } break; case 1642: /* Line 1455 of yacc.c */ -#line 11051 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11063 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1643: /* Line 1455 of yacc.c */ -#line 11052 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11064 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1644: /* Line 1455 of yacc.c */ -#line 11054 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11066 "/home/buildbot/git/sql/sql_yacc.yy" { Select->set_braces(0);} break; case 1645: /* Line 1455 of yacc.c */ -#line 11055 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11067 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1646: /* Line 1455 of yacc.c */ -#line 11057 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11069 "/home/buildbot/git/sql/sql_yacc.yy" { Select->set_braces(1);} break; case 1647: /* Line 1455 of yacc.c */ -#line 11058 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11070 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1652: /* Line 1455 of yacc.c */ -#line 11073 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11085 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (lex->field_list.push_back((yyvsp[(1) - (3)].item)) || @@ -32490,35 +32508,35 @@ YYSTYPE yylval; case 1653: /* Line 1455 of yacc.c */ -#line 11082 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11094 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1654: /* Line 1455 of yacc.c */ -#line 11083 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11095 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1655: /* Line 1455 of yacc.c */ -#line 11087 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11099 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1656: /* Line 1455 of yacc.c */ -#line 11088 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11100 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1657: /* Line 1455 of yacc.c */ -#line 11093 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11105 "/home/buildbot/git/sql/sql_yacc.yy" { if (!(Lex->insert_list = new List_item)) MYSQL_YYABORT; @@ -32528,7 +32546,7 @@ YYSTYPE yylval; case 1658: /* Line 1455 of yacc.c */ -#line 11098 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11110 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (lex->many_values.push_back(lex->insert_list)) @@ -32539,14 +32557,14 @@ YYSTYPE yylval; case 1659: /* Line 1455 of yacc.c */ -#line 11106 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11118 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1661: /* Line 1455 of yacc.c */ -#line 11112 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11124 "/home/buildbot/git/sql/sql_yacc.yy" { if (Lex->insert_list->push_back((yyvsp[(3) - (3)].item))) MYSQL_YYABORT; @@ -32556,7 +32574,7 @@ YYSTYPE yylval; case 1662: /* Line 1455 of yacc.c */ -#line 11117 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11129 "/home/buildbot/git/sql/sql_yacc.yy" { if (Lex->insert_list->push_back((yyvsp[(1) - (1)].item))) MYSQL_YYABORT; @@ -32566,14 +32584,14 @@ YYSTYPE yylval; case 1663: /* Line 1455 of yacc.c */ -#line 11124 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11136 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)= (yyvsp[(1) - (1)].item);} break; case 1664: /* Line 1455 of yacc.c */ -#line 11126 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11138 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)= new (thd->mem_root) Item_default_value(Lex->current_context()); if ((yyval.item) == NULL) @@ -32584,14 +32602,14 @@ YYSTYPE yylval; case 1666: /* Line 1455 of yacc.c */ -#line 11135 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11147 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->duplicates= DUP_UPDATE; } break; case 1668: /* Line 1455 of yacc.c */ -#line 11143 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11155 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; mysql_init_select(lex); @@ -32603,7 +32621,7 @@ YYSTYPE yylval; case 1669: /* Line 1455 of yacc.c */ -#line 11151 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11163 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->select_lex.table_list.elements > 1) @@ -32627,14 +32645,14 @@ YYSTYPE yylval; case 1670: /* Line 1455 of yacc.c */ -#line 11169 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11181 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1673: /* Line 1455 of yacc.c */ -#line 11179 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11191 "/home/buildbot/git/sql/sql_yacc.yy" { if (add_item_to_list(thd, (yyvsp[(1) - (3)].item)) || add_value_to_list(thd, (yyvsp[(3) - (3)].item))) MYSQL_YYABORT; @@ -32644,7 +32662,7 @@ YYSTYPE yylval; case 1676: /* Line 1455 of yacc.c */ -#line 11192 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11204 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->update_list.push_back((yyvsp[(1) - (3)].item)) || @@ -32656,21 +32674,21 @@ YYSTYPE yylval; case 1677: /* Line 1455 of yacc.c */ -#line 11201 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11213 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lock_type)= TL_WRITE_DEFAULT; } break; case 1678: /* Line 1455 of yacc.c */ -#line 11202 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11214 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } break; case 1679: /* Line 1455 of yacc.c */ -#line 11209 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11221 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_DELETE; @@ -32686,7 +32704,7 @@ YYSTYPE yylval; case 1681: /* Line 1455 of yacc.c */ -#line 11224 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11236 "/home/buildbot/git/sql/sql_yacc.yy" { if (!Select->add_table_to_list(thd, (yyvsp[(2) - (2)].table), NULL, TL_OPTION_UPDATING, YYPS->m_lock_type, @@ -32700,14 +32718,14 @@ YYSTYPE yylval; case 1682: /* Line 1455 of yacc.c */ -#line 11233 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11245 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1683: /* Line 1455 of yacc.c */ -#line 11235 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11247 "/home/buildbot/git/sql/sql_yacc.yy" { mysql_init_multi_delete(Lex); YYPS->m_lock_type= TL_READ_DEFAULT; @@ -32718,7 +32736,7 @@ YYSTYPE yylval; case 1684: /* Line 1455 of yacc.c */ -#line 11241 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11253 "/home/buildbot/git/sql/sql_yacc.yy" { if (multi_delete_set_locks_and_link_aux_tables(Lex)) MYSQL_YYABORT; @@ -32728,7 +32746,7 @@ YYSTYPE yylval; case 1685: /* Line 1455 of yacc.c */ -#line 11246 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11258 "/home/buildbot/git/sql/sql_yacc.yy" { mysql_init_multi_delete(Lex); YYPS->m_lock_type= TL_READ_DEFAULT; @@ -32739,7 +32757,7 @@ YYSTYPE yylval; case 1686: /* Line 1455 of yacc.c */ -#line 11252 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11264 "/home/buildbot/git/sql/sql_yacc.yy" { if (multi_delete_set_locks_and_link_aux_tables(Lex)) MYSQL_YYABORT; @@ -32749,7 +32767,7 @@ YYSTYPE yylval; case 1689: /* Line 1455 of yacc.c */ -#line 11265 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11277 "/home/buildbot/git/sql/sql_yacc.yy" { Table_ident *ti= new Table_ident((yyvsp[(1) - (2)].lex_str)); if (ti == NULL) @@ -32767,7 +32785,7 @@ YYSTYPE yylval; case 1690: /* Line 1455 of yacc.c */ -#line 11278 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11290 "/home/buildbot/git/sql/sql_yacc.yy" { Table_ident *ti= new Table_ident(thd, (yyvsp[(1) - (4)].lex_str), (yyvsp[(3) - (4)].lex_str), 0); if (ti == NULL) @@ -32785,56 +32803,56 @@ YYSTYPE yylval; case 1691: /* Line 1455 of yacc.c */ -#line 11293 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11305 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1692: /* Line 1455 of yacc.c */ -#line 11294 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11306 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1693: /* Line 1455 of yacc.c */ -#line 11298 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11310 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1694: /* Line 1455 of yacc.c */ -#line 11299 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11311 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1695: /* Line 1455 of yacc.c */ -#line 11303 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11315 "/home/buildbot/git/sql/sql_yacc.yy" { Select->options|= OPTION_QUICK; } break; case 1696: /* Line 1455 of yacc.c */ -#line 11304 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11316 "/home/buildbot/git/sql/sql_yacc.yy" { YYPS->m_lock_type= TL_WRITE_LOW_PRIORITY; } break; case 1697: /* Line 1455 of yacc.c */ -#line 11305 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11317 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ignore= 1; } break; case 1698: /* Line 1455 of yacc.c */ -#line 11310 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11322 "/home/buildbot/git/sql/sql_yacc.yy" { LEX* lex= Lex; lex->sql_command= SQLCOM_TRUNCATE; @@ -32850,7 +32868,7 @@ YYSTYPE yylval; case 1699: /* Line 1455 of yacc.c */ -#line 11321 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11333 "/home/buildbot/git/sql/sql_yacc.yy" { LEX* lex= thd->lex; DBUG_ASSERT(!lex->m_stmt); @@ -32863,7 +32881,7 @@ YYSTYPE yylval; case 1706: /* Line 1455 of yacc.c */ -#line 11345 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11357 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_CPU; } @@ -32872,7 +32890,7 @@ YYSTYPE yylval; case 1707: /* Line 1455 of yacc.c */ -#line 11349 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11361 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_MEMORY; } @@ -32881,7 +32899,7 @@ YYSTYPE yylval; case 1708: /* Line 1455 of yacc.c */ -#line 11353 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11365 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_BLOCK_IO; } @@ -32890,7 +32908,7 @@ YYSTYPE yylval; case 1709: /* Line 1455 of yacc.c */ -#line 11357 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11369 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_CONTEXT; } @@ -32899,7 +32917,7 @@ YYSTYPE yylval; case 1710: /* Line 1455 of yacc.c */ -#line 11361 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11373 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_PAGE_FAULTS; } @@ -32908,7 +32926,7 @@ YYSTYPE yylval; case 1711: /* Line 1455 of yacc.c */ -#line 11365 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11377 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_IPC; } @@ -32917,7 +32935,7 @@ YYSTYPE yylval; case 1712: /* Line 1455 of yacc.c */ -#line 11369 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11381 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_SWAPS; } @@ -32926,7 +32944,7 @@ YYSTYPE yylval; case 1713: /* Line 1455 of yacc.c */ -#line 11373 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11385 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_SOURCE; } @@ -32935,7 +32953,7 @@ YYSTYPE yylval; case 1714: /* Line 1455 of yacc.c */ -#line 11377 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11389 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_options|= PROFILE_ALL; } @@ -32944,7 +32962,7 @@ YYSTYPE yylval; case 1715: /* Line 1455 of yacc.c */ -#line 11384 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11396 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_query_id= 0; } @@ -32953,7 +32971,7 @@ YYSTYPE yylval; case 1716: /* Line 1455 of yacc.c */ -#line 11388 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11400 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->profile_query_id= atoi((yyvsp[(3) - (3)].lex_str).str); } @@ -32962,7 +32980,7 @@ YYSTYPE yylval; case 1717: /* Line 1455 of yacc.c */ -#line 11397 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11409 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->wild=0; @@ -32975,7 +32993,7 @@ YYSTYPE yylval; case 1718: /* Line 1455 of yacc.c */ -#line 11405 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11417 "/home/buildbot/git/sql/sql_yacc.yy" { Select->parsing_place= NO_MATTER; } @@ -32984,7 +33002,7 @@ YYSTYPE yylval; case 1719: /* Line 1455 of yacc.c */ -#line 11412 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11424 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_DATABASES; @@ -32996,7 +33014,7 @@ YYSTYPE yylval; case 1720: /* Line 1455 of yacc.c */ -#line 11419 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11431 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_TABLES; @@ -33009,7 +33027,7 @@ YYSTYPE yylval; case 1721: /* Line 1455 of yacc.c */ -#line 11427 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11439 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_TRIGGERS; @@ -33022,7 +33040,7 @@ YYSTYPE yylval; case 1722: /* Line 1455 of yacc.c */ -#line 11435 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11447 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_EVENTS; @@ -33035,7 +33053,7 @@ YYSTYPE yylval; case 1723: /* Line 1455 of yacc.c */ -#line 11443 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11455 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_TABLE_STATUS; @@ -33048,7 +33066,7 @@ YYSTYPE yylval; case 1724: /* Line 1455 of yacc.c */ -#line 11451 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11463 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; @@ -33061,7 +33079,7 @@ YYSTYPE yylval; case 1725: /* Line 1455 of yacc.c */ -#line 11459 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11471 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_PLUGINS; @@ -33073,21 +33091,21 @@ YYSTYPE yylval; case 1726: /* Line 1455 of yacc.c */ -#line 11466 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11478 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_info.db_type= (yyvsp[(2) - (3)].db_type); } break; case 1727: /* Line 1455 of yacc.c */ -#line 11468 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11480 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_info.db_type= NULL; } break; case 1728: /* Line 1455 of yacc.c */ -#line 11470 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11482 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_FIELDS; @@ -33101,7 +33119,7 @@ YYSTYPE yylval; case 1729: /* Line 1455 of yacc.c */ -#line 11479 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11491 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_SHOW_BINLOGS; } @@ -33110,7 +33128,7 @@ YYSTYPE yylval; case 1730: /* Line 1455 of yacc.c */ -#line 11483 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11495 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; } @@ -33119,7 +33137,7 @@ YYSTYPE yylval; case 1731: /* Line 1455 of yacc.c */ -#line 11487 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11499 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; @@ -33129,7 +33147,7 @@ YYSTYPE yylval; case 1733: /* Line 1455 of yacc.c */ -#line 11492 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11504 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS; @@ -33139,7 +33157,7 @@ YYSTYPE yylval; case 1735: /* Line 1455 of yacc.c */ -#line 11497 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11509 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_KEYS; @@ -33153,7 +33171,7 @@ YYSTYPE yylval; case 1736: /* Line 1455 of yacc.c */ -#line 11506 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11518 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; @@ -33165,7 +33183,7 @@ YYSTYPE yylval; case 1737: /* Line 1455 of yacc.c */ -#line 11513 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11525 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_AUTHORS; @@ -33179,7 +33197,7 @@ YYSTYPE yylval; case 1738: /* Line 1455 of yacc.c */ -#line 11522 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11534 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; @@ -33193,7 +33211,7 @@ YYSTYPE yylval; case 1739: /* Line 1455 of yacc.c */ -#line 11531 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11543 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_PRIVILEGES; @@ -33203,42 +33221,42 @@ YYSTYPE yylval; case 1740: /* Line 1455 of yacc.c */ -#line 11536 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11548 "/home/buildbot/git/sql/sql_yacc.yy" { (void) create_select_for_variable("warning_count"); } break; case 1741: /* Line 1455 of yacc.c */ -#line 11538 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11550 "/home/buildbot/git/sql/sql_yacc.yy" { (void) create_select_for_variable("error_count"); } break; case 1742: /* Line 1455 of yacc.c */ -#line 11540 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11552 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_SHOW_WARNS;} break; case 1743: /* Line 1455 of yacc.c */ -#line 11542 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11554 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_SHOW_ERRORS;} break; case 1744: /* Line 1455 of yacc.c */ -#line 11544 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11556 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_SHOW_PROFILES; } break; case 1745: /* Line 1455 of yacc.c */ -#line 11546 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11558 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_PROFILE; @@ -33250,7 +33268,7 @@ YYSTYPE yylval; case 1746: /* Line 1455 of yacc.c */ -#line 11553 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11565 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_STATUS; @@ -33263,14 +33281,14 @@ YYSTYPE yylval; case 1747: /* Line 1455 of yacc.c */ -#line 11561 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11573 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} break; case 1748: /* Line 1455 of yacc.c */ -#line 11563 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11575 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_VARIABLES; @@ -33283,7 +33301,7 @@ YYSTYPE yylval; case 1749: /* Line 1455 of yacc.c */ -#line 11571 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11583 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_CHARSETS; @@ -33295,7 +33313,7 @@ YYSTYPE yylval; case 1750: /* Line 1455 of yacc.c */ -#line 11578 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11590 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_COLLATIONS; @@ -33307,7 +33325,7 @@ YYSTYPE yylval; case 1751: /* Line 1455 of yacc.c */ -#line 11585 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11597 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_GRANTS; @@ -33322,7 +33340,7 @@ YYSTYPE yylval; case 1752: /* Line 1455 of yacc.c */ -#line 11595 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11607 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_GRANTS; @@ -33334,7 +33352,7 @@ YYSTYPE yylval; case 1753: /* Line 1455 of yacc.c */ -#line 11602 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11614 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command=SQLCOM_SHOW_CREATE_DB; Lex->create_info.options=(yyvsp[(3) - (4)].num); @@ -33345,7 +33363,7 @@ YYSTYPE yylval; case 1754: /* Line 1455 of yacc.c */ -#line 11608 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11620 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command = SQLCOM_SHOW_CREATE; @@ -33358,7 +33376,7 @@ YYSTYPE yylval; case 1755: /* Line 1455 of yacc.c */ -#line 11616 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11628 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command = SQLCOM_SHOW_CREATE; @@ -33371,7 +33389,7 @@ YYSTYPE yylval; case 1756: /* Line 1455 of yacc.c */ -#line 11624 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11636 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_SHOW_MASTER_STAT; } @@ -33380,7 +33398,7 @@ YYSTYPE yylval; case 1757: /* Line 1455 of yacc.c */ -#line 11628 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11640 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; } @@ -33389,7 +33407,7 @@ YYSTYPE yylval; case 1758: /* Line 1455 of yacc.c */ -#line 11632 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11644 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_CLIENT_STATS; @@ -33401,7 +33419,7 @@ YYSTYPE yylval; case 1759: /* Line 1455 of yacc.c */ -#line 11639 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11651 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_USER_STATS; @@ -33413,7 +33431,7 @@ YYSTYPE yylval; case 1760: /* Line 1455 of yacc.c */ -#line 11646 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11658 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_TABLE_STATS; @@ -33425,7 +33443,7 @@ YYSTYPE yylval; case 1761: /* Line 1455 of yacc.c */ -#line 11653 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11665 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_INDEX_STATS; @@ -33437,7 +33455,7 @@ YYSTYPE yylval; case 1762: /* Line 1455 of yacc.c */ -#line 11660 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11672 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; @@ -33449,7 +33467,7 @@ YYSTYPE yylval; case 1763: /* Line 1455 of yacc.c */ -#line 11667 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11679 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; @@ -33461,7 +33479,7 @@ YYSTYPE yylval; case 1764: /* Line 1455 of yacc.c */ -#line 11674 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11686 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; @@ -33472,7 +33490,7 @@ YYSTYPE yylval; case 1765: /* Line 1455 of yacc.c */ -#line 11680 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11692 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_STATUS_PROC; @@ -33484,7 +33502,7 @@ YYSTYPE yylval; case 1766: /* Line 1455 of yacc.c */ -#line 11687 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11699 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_STATUS_FUNC; @@ -33496,7 +33514,7 @@ YYSTYPE yylval; case 1767: /* Line 1455 of yacc.c */ -#line 11694 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11706 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command= SQLCOM_SHOW_PROC_CODE; Lex->spname= (yyvsp[(3) - (3)].spname); @@ -33506,7 +33524,7 @@ YYSTYPE yylval; case 1768: /* Line 1455 of yacc.c */ -#line 11699 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11711 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; Lex->spname= (yyvsp[(3) - (3)].spname); @@ -33516,7 +33534,7 @@ YYSTYPE yylval; case 1769: /* Line 1455 of yacc.c */ -#line 11704 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11716 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->spname= (yyvsp[(3) - (3)].spname); Lex->sql_command = SQLCOM_SHOW_CREATE_EVENT; @@ -33526,84 +33544,84 @@ YYSTYPE yylval; case 1770: /* Line 1455 of yacc.c */ -#line 11712 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11724 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } break; case 1771: /* Line 1455 of yacc.c */ -#line 11714 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11726 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } break; case 1772: /* Line 1455 of yacc.c */ -#line 11716 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11728 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; } break; case 1777: /* Line 1455 of yacc.c */ -#line 11730 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11742 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.simple_string)= 0; } break; case 1778: /* Line 1455 of yacc.c */ -#line 11731 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11743 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.simple_string)= (yyvsp[(2) - (2)].lex_str).str; } break; case 1779: /* Line 1455 of yacc.c */ -#line 11735 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11747 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->verbose=0; } break; case 1780: /* Line 1455 of yacc.c */ -#line 11736 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11748 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->verbose=1; } break; case 1783: /* Line 1455 of yacc.c */ -#line 11745 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11757 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->mi.log_file_name = 0; } break; case 1784: /* Line 1455 of yacc.c */ -#line 11746 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11758 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->mi.log_file_name = (yyvsp[(2) - (2)].lex_str).str; } break; case 1785: /* Line 1455 of yacc.c */ -#line 11750 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11762 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->mi.pos = 4; /* skip magic number */ } break; case 1786: /* Line 1455 of yacc.c */ -#line 11751 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11763 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->mi.pos = (yyvsp[(2) - (2)].ulonglong_number); } break; case 1788: /* Line 1455 of yacc.c */ -#line 11757 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11769 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->wild= new (thd->mem_root) String((yyvsp[(2) - (2)].lex_str).str, (yyvsp[(2) - (2)].lex_str).length, system_charset_info); @@ -33615,7 +33633,7 @@ YYSTYPE yylval; case 1789: /* Line 1455 of yacc.c */ -#line 11764 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11776 "/home/buildbot/git/sql/sql_yacc.yy" { Select->where= normalize_cond((yyvsp[(2) - (2)].item)); if ((yyvsp[(2) - (2)].item)) @@ -33626,7 +33644,7 @@ YYSTYPE yylval; case 1790: /* Line 1455 of yacc.c */ -#line 11774 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11786 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; mysql_init_select(lex); @@ -33642,7 +33660,7 @@ YYSTYPE yylval; case 1791: /* Line 1455 of yacc.c */ -#line 11785 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11797 "/home/buildbot/git/sql/sql_yacc.yy" { Select->parsing_place= NO_MATTER; } @@ -33651,14 +33669,14 @@ YYSTYPE yylval; case 1792: /* Line 1455 of yacc.c */ -#line 11789 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11801 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->describe|= DESCRIBE_NORMAL; } break; case 1793: /* Line 1455 of yacc.c */ -#line 11791 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11803 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->select_lex.options|= SELECT_DESCRIBE; @@ -33668,42 +33686,42 @@ YYSTYPE yylval; case 1796: /* Line 1455 of yacc.c */ -#line 11803 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11815 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1797: /* Line 1455 of yacc.c */ -#line 11804 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11816 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->describe|= DESCRIBE_EXTENDED; } break; case 1798: /* Line 1455 of yacc.c */ -#line 11805 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11817 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->describe|= DESCRIBE_PARTITIONS; } break; case 1799: /* Line 1455 of yacc.c */ -#line 11809 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11821 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1800: /* Line 1455 of yacc.c */ -#line 11810 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11822 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->wild= (yyvsp[(1) - (1)].string); } break; case 1801: /* Line 1455 of yacc.c */ -#line 11812 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11824 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length, @@ -33716,7 +33734,7 @@ YYSTYPE yylval; case 1802: /* Line 1455 of yacc.c */ -#line 11826 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11838 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_FLUSH; @@ -33728,14 +33746,14 @@ YYSTYPE yylval; case 1803: /* Line 1455 of yacc.c */ -#line 11833 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11845 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1804: /* Line 1455 of yacc.c */ -#line 11838 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11850 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_TABLES; /* @@ -33750,28 +33768,28 @@ YYSTYPE yylval; case 1805: /* Line 1455 of yacc.c */ -#line 11847 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11859 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1806: /* Line 1455 of yacc.c */ -#line 11848 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11860 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1808: /* Line 1455 of yacc.c */ -#line 11853 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11865 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1809: /* Line 1455 of yacc.c */ -#line 11855 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11867 "/home/buildbot/git/sql/sql_yacc.yy" { TABLE_LIST *tables= Lex->query_tables; Lex->type|= REFRESH_READ_LOCK | (yyvsp[(4) - (4)].num); @@ -33787,91 +33805,91 @@ YYSTYPE yylval; case 1811: /* Line 1455 of yacc.c */ -#line 11870 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11882 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1812: /* Line 1455 of yacc.c */ -#line 11875 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11887 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_ERROR_LOG; } break; case 1813: /* Line 1455 of yacc.c */ -#line 11877 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11889 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_ENGINE_LOG; } break; case 1814: /* Line 1455 of yacc.c */ -#line 11879 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11891 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_GENERAL_LOG; } break; case 1815: /* Line 1455 of yacc.c */ -#line 11881 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11893 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_SLOW_LOG; } break; case 1816: /* Line 1455 of yacc.c */ -#line 11883 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11895 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_BINARY_LOG; } break; case 1817: /* Line 1455 of yacc.c */ -#line 11885 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11897 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_RELAY_LOG; } break; case 1818: /* Line 1455 of yacc.c */ -#line 11887 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11899 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_QUERY_CACHE_FREE; } break; case 1819: /* Line 1455 of yacc.c */ -#line 11889 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11901 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_HOSTS; } break; case 1820: /* Line 1455 of yacc.c */ -#line 11891 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11903 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_GRANT; } break; case 1821: /* Line 1455 of yacc.c */ -#line 11893 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11905 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_LOG; } break; case 1822: /* Line 1455 of yacc.c */ -#line 11895 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11907 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_STATUS; } break; case 1823: /* Line 1455 of yacc.c */ -#line 11897 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11909 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_SLAVE; Lex->reset_slave_info.all= false; @@ -33881,84 +33899,84 @@ YYSTYPE yylval; case 1824: /* Line 1455 of yacc.c */ -#line 11902 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11914 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_CLIENT_STATS; } break; case 1825: /* Line 1455 of yacc.c */ -#line 11904 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11916 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_USER_STATS; } break; case 1826: /* Line 1455 of yacc.c */ -#line 11906 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11918 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_TABLE_STATS; } break; case 1827: /* Line 1455 of yacc.c */ -#line 11908 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11920 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_INDEX_STATS; } break; case 1828: /* Line 1455 of yacc.c */ -#line 11910 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11922 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_MASTER; } break; case 1829: /* Line 1455 of yacc.c */ -#line 11912 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11924 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_DES_KEY_FILE; } break; case 1830: /* Line 1455 of yacc.c */ -#line 11914 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11926 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_USER_RESOURCES; } break; case 1831: /* Line 1455 of yacc.c */ -#line 11918 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11930 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1832: /* Line 1455 of yacc.c */ -#line 11919 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11931 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1833: /* Line 1455 of yacc.c */ -#line 11923 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11935 "/home/buildbot/git/sql/sql_yacc.yy" {(yyval.num)= 0;} break; case 1834: /* Line 1455 of yacc.c */ -#line 11924 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11936 "/home/buildbot/git/sql/sql_yacc.yy" {(yyval.num)= REFRESH_CHECKPOINT; } break; case 1835: /* Line 1455 of yacc.c */ -#line 11928 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11940 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_RESET; lex->type=0; @@ -33968,56 +33986,56 @@ YYSTYPE yylval; case 1836: /* Line 1455 of yacc.c */ -#line 11933 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11945 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1839: /* Line 1455 of yacc.c */ -#line 11942 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11954 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_SLAVE; } break; case 1840: /* Line 1455 of yacc.c */ -#line 11943 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11955 "/home/buildbot/git/sql/sql_yacc.yy" { } break; case 1841: /* Line 1455 of yacc.c */ -#line 11944 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11956 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_MASTER; } break; case 1842: /* Line 1455 of yacc.c */ -#line 11945 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11957 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->type|= REFRESH_QUERY_CACHE;} break; case 1843: /* Line 1455 of yacc.c */ -#line 11949 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11961 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->reset_slave_info.all= false; } break; case 1844: /* Line 1455 of yacc.c */ -#line 11950 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11962 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->reset_slave_info.all= true; } break; case 1845: /* Line 1455 of yacc.c */ -#line 11955 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11967 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->type=0; @@ -34028,14 +34046,14 @@ YYSTYPE yylval; case 1846: /* Line 1455 of yacc.c */ -#line 11961 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11973 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1848: /* Line 1455 of yacc.c */ -#line 11970 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11982 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->to_log = (yyvsp[(2) - (2)].lex_str).str; } @@ -34044,7 +34062,7 @@ YYSTYPE yylval; case 1849: /* Line 1455 of yacc.c */ -#line 11974 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11986 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->value_list.empty(); @@ -34056,7 +34074,7 @@ YYSTYPE yylval; case 1850: /* Line 1455 of yacc.c */ -#line 11986 "/home/buildbot/git/sql/sql_yacc.yy" +#line 11998 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->value_list.empty(); @@ -34068,7 +34086,7 @@ YYSTYPE yylval; case 1851: /* Line 1455 of yacc.c */ -#line 11993 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12005 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->kill_signal= (killed_state) ((yyvsp[(3) - (5)].num) | (yyvsp[(4) - (5)].num)); } @@ -34077,49 +34095,49 @@ YYSTYPE yylval; case 1852: /* Line 1455 of yacc.c */ -#line 11999 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12011 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= (int) KILL_HARD_BIT; } break; case 1853: /* Line 1455 of yacc.c */ -#line 12000 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12012 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= (int) KILL_HARD_BIT; } break; case 1854: /* Line 1455 of yacc.c */ -#line 12001 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12013 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= 0; } break; case 1855: /* Line 1455 of yacc.c */ -#line 12004 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12016 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= (int) KILL_CONNECTION; } break; case 1856: /* Line 1455 of yacc.c */ -#line 12005 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12017 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= (int) KILL_CONNECTION; } break; case 1857: /* Line 1455 of yacc.c */ -#line 12006 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12018 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= (int) KILL_QUERY; } break; case 1858: /* Line 1455 of yacc.c */ -#line 12011 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12023 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->value_list.push_front((yyval.item)); Lex->kill_type= KILL_TYPE_ID; @@ -34129,7 +34147,7 @@ YYSTYPE yylval; case 1859: /* Line 1455 of yacc.c */ -#line 12016 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12028 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->users_list.push_back((yyvsp[(2) - (2)].lex_user)); Lex->kill_type= KILL_TYPE_USER; @@ -34139,7 +34157,7 @@ YYSTYPE yylval; case 1860: /* Line 1455 of yacc.c */ -#line 12026 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12038 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command=SQLCOM_CHANGE_DB; @@ -34150,7 +34168,7 @@ YYSTYPE yylval; case 1861: /* Line 1455 of yacc.c */ -#line 12037 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12049 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; @@ -34166,7 +34184,7 @@ YYSTYPE yylval; case 1862: /* Line 1455 of yacc.c */ -#line 12048 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12060 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_LOAD; @@ -34181,7 +34199,7 @@ YYSTYPE yylval; case 1863: /* Line 1455 of yacc.c */ -#line 12058 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12070 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (!Select->add_table_to_list(thd, (yyvsp[(12) - (12)].table), NULL, TL_OPTION_UPDATING, @@ -34196,56 +34214,56 @@ YYSTYPE yylval; case 1864: /* Line 1455 of yacc.c */ -#line 12068 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12080 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->exchange->cs= (yyvsp[(14) - (14)].charset); } break; case 1865: /* Line 1455 of yacc.c */ -#line 12072 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12084 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1866: /* Line 1455 of yacc.c */ -#line 12076 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12088 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.filetype)= FILETYPE_CSV; } break; case 1867: /* Line 1455 of yacc.c */ -#line 12077 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12089 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.filetype)= FILETYPE_XML; } break; case 1868: /* Line 1455 of yacc.c */ -#line 12081 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12093 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)=0;} break; case 1869: /* Line 1455 of yacc.c */ -#line 12082 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12094 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)=1;} break; case 1870: /* Line 1455 of yacc.c */ -#line 12086 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12098 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lock_type)= TL_WRITE_DEFAULT; } break; case 1871: /* Line 1455 of yacc.c */ -#line 12088 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12100 "/home/buildbot/git/sql/sql_yacc.yy" { /* Ignore this option in SP to avoid problem with query cache and @@ -34258,35 +34276,35 @@ YYSTYPE yylval; case 1872: /* Line 1455 of yacc.c */ -#line 12095 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12107 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } break; case 1873: /* Line 1455 of yacc.c */ -#line 12099 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12111 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->duplicates=DUP_ERROR; } break; case 1874: /* Line 1455 of yacc.c */ -#line 12100 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12112 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->duplicates=DUP_REPLACE; } break; case 1875: /* Line 1455 of yacc.c */ -#line 12101 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12113 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ignore= 1; } break; case 1880: /* Line 1455 of yacc.c */ -#line 12116 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12128 "/home/buildbot/git/sql/sql_yacc.yy" { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->field_term= (yyvsp[(3) - (3)].string); @@ -34296,7 +34314,7 @@ YYSTYPE yylval; case 1881: /* Line 1455 of yacc.c */ -#line 12121 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12133 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; DBUG_ASSERT(lex->exchange != 0); @@ -34308,7 +34326,7 @@ YYSTYPE yylval; case 1882: /* Line 1455 of yacc.c */ -#line 12128 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12140 "/home/buildbot/git/sql/sql_yacc.yy" { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->enclosed= (yyvsp[(3) - (3)].string); @@ -34318,7 +34336,7 @@ YYSTYPE yylval; case 1883: /* Line 1455 of yacc.c */ -#line 12133 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12145 "/home/buildbot/git/sql/sql_yacc.yy" { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->escaped= (yyvsp[(3) - (3)].string); @@ -34328,7 +34346,7 @@ YYSTYPE yylval; case 1888: /* Line 1455 of yacc.c */ -#line 12151 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12163 "/home/buildbot/git/sql/sql_yacc.yy" { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->line_term= (yyvsp[(3) - (3)].string); @@ -34338,7 +34356,7 @@ YYSTYPE yylval; case 1889: /* Line 1455 of yacc.c */ -#line 12156 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12168 "/home/buildbot/git/sql/sql_yacc.yy" { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->line_start= (yyvsp[(3) - (3)].string); @@ -34348,21 +34366,21 @@ YYSTYPE yylval; case 1890: /* Line 1455 of yacc.c */ -#line 12163 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12175 "/home/buildbot/git/sql/sql_yacc.yy" { } break; case 1891: /* Line 1455 of yacc.c */ -#line 12165 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12177 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->exchange->line_term = (yyvsp[(4) - (4)].string); } break; case 1893: /* Line 1455 of yacc.c */ -#line 12170 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12182 "/home/buildbot/git/sql/sql_yacc.yy" { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->skip_lines= atol((yyvsp[(2) - (3)].lex_str).str); @@ -34372,63 +34390,63 @@ YYSTYPE yylval; case 1894: /* Line 1455 of yacc.c */ -#line 12177 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12189 "/home/buildbot/git/sql/sql_yacc.yy" { } break; case 1895: /* Line 1455 of yacc.c */ -#line 12179 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12191 "/home/buildbot/git/sql/sql_yacc.yy" { } break; case 1896: /* Line 1455 of yacc.c */ -#line 12183 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12195 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1897: /* Line 1455 of yacc.c */ -#line 12184 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12196 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1898: /* Line 1455 of yacc.c */ -#line 12185 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12197 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1899: /* Line 1455 of yacc.c */ -#line 12190 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12202 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->field_list.push_back((yyvsp[(3) - (3)].item)); } break; case 1900: /* Line 1455 of yacc.c */ -#line 12192 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12204 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->field_list.push_back((yyvsp[(1) - (1)].item)); } break; case 1901: /* Line 1455 of yacc.c */ -#line 12196 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12208 "/home/buildbot/git/sql/sql_yacc.yy" {(yyval.item)= (yyvsp[(1) - (1)].item);} break; case 1902: /* Line 1455 of yacc.c */ -#line 12198 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12210 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)= new (thd->mem_root) Item_user_var_as_out_param((yyvsp[(2) - (2)].lex_str)); if ((yyval.item) == NULL) @@ -34439,21 +34457,21 @@ YYSTYPE yylval; case 1903: /* Line 1455 of yacc.c */ -#line 12206 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12218 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1904: /* Line 1455 of yacc.c */ -#line 12207 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12219 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1907: /* Line 1455 of yacc.c */ -#line 12217 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12229 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->update_list.push_back((yyvsp[(1) - (5)].item)) || @@ -34466,7 +34484,7 @@ YYSTYPE yylval; case 1908: /* Line 1455 of yacc.c */ -#line 12230 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12242 "/home/buildbot/git/sql/sql_yacc.yy" { LEX_STRING tmp; CHARSET_INFO *cs_con= thd->variables.collation_connection; @@ -34494,7 +34512,7 @@ YYSTYPE yylval; case 1909: /* Line 1455 of yacc.c */ -#line 12253 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12265 "/home/buildbot/git/sql/sql_yacc.yy" { uint repertoire= Lex->text_string_is_7bit ? MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; @@ -34511,7 +34529,7 @@ YYSTYPE yylval; case 1910: /* Line 1455 of yacc.c */ -#line 12265 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12277 "/home/buildbot/git/sql/sql_yacc.yy" { Item_string *str= new (thd->mem_root) Item_string((yyvsp[(2) - (2)].lex_str).str, (yyvsp[(2) - (2)].lex_str).length, (yyvsp[(1) - (2)].charset)); @@ -34527,7 +34545,7 @@ YYSTYPE yylval; case 1911: /* Line 1455 of yacc.c */ -#line 12276 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12288 "/home/buildbot/git/sql/sql_yacc.yy" { Item_string* item= (Item_string*) (yyvsp[(1) - (2)].item); item->append((yyvsp[(2) - (2)].lex_str).str, (yyvsp[(2) - (2)].lex_str).length); @@ -34548,7 +34566,7 @@ YYSTYPE yylval; case 1912: /* Line 1455 of yacc.c */ -#line 12295 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12307 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.string)= new (thd->mem_root) String((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length, @@ -34561,7 +34579,7 @@ YYSTYPE yylval; case 1913: /* Line 1455 of yacc.c */ -#line 12303 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12315 "/home/buildbot/git/sql/sql_yacc.yy" { Item *tmp= new (thd->mem_root) Item_hex_hybrid((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length); if (tmp == NULL) @@ -34578,7 +34596,7 @@ YYSTYPE yylval; case 1914: /* Line 1455 of yacc.c */ -#line 12315 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12327 "/home/buildbot/git/sql/sql_yacc.yy" { Item *tmp= new (thd->mem_root) Item_hex_string((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length); if (tmp == NULL) @@ -34591,7 +34609,7 @@ YYSTYPE yylval; case 1915: /* Line 1455 of yacc.c */ -#line 12323 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12335 "/home/buildbot/git/sql/sql_yacc.yy" { Item *tmp= new (thd->mem_root) Item_bin_string((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length); if (tmp == NULL) @@ -34608,7 +34626,7 @@ YYSTYPE yylval; case 1916: /* Line 1455 of yacc.c */ -#line 12338 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12350 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -34630,21 +34648,21 @@ YYSTYPE yylval; case 1917: /* Line 1455 of yacc.c */ -#line 12357 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12369 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = (yyvsp[(1) - (1)].item); } break; case 1918: /* Line 1455 of yacc.c */ -#line 12358 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12370 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = (yyvsp[(2) - (2)].item_num); } break; case 1919: /* Line 1455 of yacc.c */ -#line 12360 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12372 "/home/buildbot/git/sql/sql_yacc.yy" { (yyvsp[(2) - (2)].item_num)->max_length++; (yyval.item)= (yyvsp[(2) - (2)].item_num)->neg(); @@ -34654,21 +34672,21 @@ YYSTYPE yylval; case 1920: /* Line 1455 of yacc.c */ -#line 12367 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12379 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = (yyvsp[(1) - (1)].item); } break; case 1921: /* Line 1455 of yacc.c */ -#line 12368 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12380 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = (yyvsp[(1) - (1)].item_num); } break; case 1922: /* Line 1455 of yacc.c */ -#line 12370 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12382 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = new (thd->mem_root) Item_null(); if ((yyval.item) == NULL) @@ -34680,7 +34698,7 @@ YYSTYPE yylval; case 1923: /* Line 1455 of yacc.c */ -#line 12377 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12389 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)= new (thd->mem_root) Item_int((char*) "FALSE",0,1); if ((yyval.item) == NULL) @@ -34691,7 +34709,7 @@ YYSTYPE yylval; case 1924: /* Line 1455 of yacc.c */ -#line 12383 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12395 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)= new (thd->mem_root) Item_int((char*) "TRUE",1,1); if ((yyval.item) == NULL) @@ -34702,7 +34720,7 @@ YYSTYPE yylval; case 1925: /* Line 1455 of yacc.c */ -#line 12389 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12401 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = new (thd->mem_root) Item_hex_hybrid((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length); if ((yyval.item) == NULL) @@ -34713,7 +34731,7 @@ YYSTYPE yylval; case 1926: /* Line 1455 of yacc.c */ -#line 12395 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12407 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = new (thd->mem_root) Item_hex_string((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length); if ((yyval.item) == NULL) @@ -34724,7 +34742,7 @@ YYSTYPE yylval; case 1927: /* Line 1455 of yacc.c */ -#line 12401 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12413 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)= new (thd->mem_root) Item_bin_string((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length); if ((yyval.item) == NULL) @@ -34735,7 +34753,7 @@ YYSTYPE yylval; case 1928: /* Line 1455 of yacc.c */ -#line 12407 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12419 "/home/buildbot/git/sql/sql_yacc.yy" { Item *tmp= new (thd->mem_root) Item_hex_string((yyvsp[(2) - (2)].lex_str).str, (yyvsp[(2) - (2)].lex_str).length); if (tmp == NULL) @@ -34769,7 +34787,7 @@ YYSTYPE yylval; case 1929: /* Line 1455 of yacc.c */ -#line 12436 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12448 "/home/buildbot/git/sql/sql_yacc.yy" { Item *tmp= new (thd->mem_root) Item_bin_string((yyvsp[(2) - (2)].lex_str).str, (yyvsp[(2) - (2)].lex_str).length); if (tmp == NULL) @@ -34802,28 +34820,28 @@ YYSTYPE yylval; case 1930: /* Line 1455 of yacc.c */ -#line 12463 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12475 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = (yyvsp[(2) - (2)].item); } break; case 1931: /* Line 1455 of yacc.c */ -#line 12464 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12476 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = (yyvsp[(2) - (2)].item); } break; case 1932: /* Line 1455 of yacc.c */ -#line 12465 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12477 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item) = (yyvsp[(2) - (2)].item); } break; case 1933: /* Line 1455 of yacc.c */ -#line 12470 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12482 "/home/buildbot/git/sql/sql_yacc.yy" { int error; (yyval.item_num)= new (thd->mem_root) @@ -34838,7 +34856,7 @@ YYSTYPE yylval; case 1934: /* Line 1455 of yacc.c */ -#line 12480 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12492 "/home/buildbot/git/sql/sql_yacc.yy" { int error; (yyval.item_num)= new (thd->mem_root) @@ -34853,7 +34871,7 @@ YYSTYPE yylval; case 1935: /* Line 1455 of yacc.c */ -#line 12490 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12502 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item_num)= new (thd->mem_root) Item_uint((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length); if ((yyval.item_num) == NULL) @@ -34864,7 +34882,7 @@ YYSTYPE yylval; case 1936: /* Line 1455 of yacc.c */ -#line 12496 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12508 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item_num)= new (thd->mem_root) Item_decimal((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length, thd->charset()); @@ -34878,7 +34896,7 @@ YYSTYPE yylval; case 1937: /* Line 1455 of yacc.c */ -#line 12505 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12517 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item_num)= new (thd->mem_root) Item_float((yyvsp[(1) - (1)].lex_str).str, (yyvsp[(1) - (1)].lex_str).length); if (((yyval.item_num) == NULL) || (thd->is_error())) @@ -34891,21 +34909,21 @@ YYSTYPE yylval; case 1938: /* Line 1455 of yacc.c */ -#line 12519 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12531 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)=(yyvsp[(1) - (1)].item); } break; case 1939: /* Line 1455 of yacc.c */ -#line 12520 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12532 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)=(yyvsp[(1) - (1)].item); } break; case 1940: /* Line 1455 of yacc.c */ -#line 12525 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12537 "/home/buildbot/git/sql/sql_yacc.yy" { SELECT_LEX *sel= Select; (yyval.item)= new (thd->mem_root) Item_field(Lex->current_context(), @@ -34919,7 +34937,7 @@ YYSTYPE yylval; case 1941: /* Line 1455 of yacc.c */ -#line 12534 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12546 "/home/buildbot/git/sql/sql_yacc.yy" { SELECT_LEX *sel= Select; const char* schema= thd->client_capabilities & CLIENT_NO_SCHEMA ? @@ -34936,14 +34954,14 @@ YYSTYPE yylval; case 1942: /* Line 1455 of yacc.c */ -#line 12548 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12560 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)=(yyvsp[(1) - (1)].item); } break; case 1943: /* Line 1455 of yacc.c */ -#line 12553 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12565 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -34994,14 +35012,14 @@ YYSTYPE yylval; case 1944: /* Line 1455 of yacc.c */ -#line 12598 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12610 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)= (yyvsp[(1) - (1)].item); } break; case 1945: /* Line 1455 of yacc.c */ -#line 12603 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12615 "/home/buildbot/git/sql/sql_yacc.yy" { SELECT_LEX *sel=Select; if ((sel->parsing_place != IN_HAVING) || @@ -35023,14 +35041,14 @@ YYSTYPE yylval; case 1946: /* Line 1455 of yacc.c */ -#line 12619 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12631 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)= (yyvsp[(1) - (1)].item); } break; case 1947: /* Line 1455 of yacc.c */ -#line 12624 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12636 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; @@ -35113,7 +35131,7 @@ YYSTYPE yylval; case 1948: /* Line 1455 of yacc.c */ -#line 12702 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12714 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; SELECT_LEX *sel= lex->current_select; @@ -35142,7 +35160,7 @@ YYSTYPE yylval; case 1949: /* Line 1455 of yacc.c */ -#line 12726 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12738 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; SELECT_LEX *sel= lex->current_select; @@ -35174,14 +35192,14 @@ YYSTYPE yylval; case 1950: /* Line 1455 of yacc.c */ -#line 12755 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12767 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str)=(yyvsp[(1) - (1)].lex_str);} break; case 1951: /* Line 1455 of yacc.c */ -#line 12757 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12769 "/home/buildbot/git/sql/sql_yacc.yy" { TABLE_LIST *table= Select->table_list.first; if (my_strcasecmp(table_alias_charset, (yyvsp[(1) - (5)].lex_str).str, table->db)) @@ -35202,7 +35220,7 @@ YYSTYPE yylval; case 1952: /* Line 1455 of yacc.c */ -#line 12773 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12785 "/home/buildbot/git/sql/sql_yacc.yy" { TABLE_LIST *table= Select->table_list.first; if (my_strcasecmp(table_alias_charset, (yyvsp[(1) - (3)].lex_str).str, table->alias)) @@ -35217,14 +35235,14 @@ YYSTYPE yylval; case 1953: /* Line 1455 of yacc.c */ -#line 12782 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12794 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str)=(yyvsp[(2) - (2)].lex_str);} break; case 1954: /* Line 1455 of yacc.c */ -#line 12787 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12799 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.table)= new Table_ident((yyvsp[(1) - (1)].lex_str)); if ((yyval.table) == NULL) @@ -35235,7 +35253,7 @@ YYSTYPE yylval; case 1955: /* Line 1455 of yacc.c */ -#line 12793 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12805 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.table)= new Table_ident(thd, (yyvsp[(1) - (3)].lex_str),(yyvsp[(3) - (3)].lex_str),0); if ((yyval.table) == NULL) @@ -35246,7 +35264,7 @@ YYSTYPE yylval; case 1956: /* Line 1455 of yacc.c */ -#line 12799 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12811 "/home/buildbot/git/sql/sql_yacc.yy" { /* For Delphi */ (yyval.table)= new Table_ident((yyvsp[(2) - (2)].lex_str)); @@ -35258,7 +35276,7 @@ YYSTYPE yylval; case 1957: /* Line 1455 of yacc.c */ -#line 12809 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12821 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.table)= new Table_ident((yyvsp[(1) - (2)].lex_str)); if ((yyval.table) == NULL) @@ -35269,7 +35287,7 @@ YYSTYPE yylval; case 1958: /* Line 1455 of yacc.c */ -#line 12815 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12827 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.table)= new Table_ident(thd, (yyvsp[(1) - (4)].lex_str),(yyvsp[(3) - (4)].lex_str),0); if ((yyval.table) == NULL) @@ -35280,7 +35298,7 @@ YYSTYPE yylval; case 1959: /* Line 1455 of yacc.c */ -#line 12824 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12836 "/home/buildbot/git/sql/sql_yacc.yy" { LEX_STRING db={(char*) any_db,3}; (yyval.table)= new Table_ident(thd, db,(yyvsp[(1) - (1)].lex_str),0); @@ -35292,14 +35310,14 @@ YYSTYPE yylval; case 1960: /* Line 1455 of yacc.c */ -#line 12833 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12845 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str)= (yyvsp[(1) - (1)].lex_str); } break; case 1961: /* Line 1455 of yacc.c */ -#line 12835 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12847 "/home/buildbot/git/sql/sql_yacc.yy" { if (thd->charset_is_system_charset) { @@ -35329,7 +35347,7 @@ YYSTYPE yylval; case 1962: /* Line 1455 of yacc.c */ -#line 12863 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12875 "/home/buildbot/git/sql/sql_yacc.yy" { if (thd->charset_is_system_charset) (yyval.lex_str)= (yyvsp[(1) - (1)].lex_str); @@ -35345,7 +35363,7 @@ YYSTYPE yylval; case 1963: /* Line 1455 of yacc.c */ -#line 12877 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12889 "/home/buildbot/git/sql/sql_yacc.yy" { if (thd->charset_is_collation_connection) (yyval.lex_str)= (yyvsp[(1) - (1)].lex_str); @@ -35361,7 +35379,7 @@ YYSTYPE yylval; case 1964: /* Line 1455 of yacc.c */ -#line 12891 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12903 "/home/buildbot/git/sql/sql_yacc.yy" { if (thd->charset_is_character_set_filesystem) (yyval.lex_str)= (yyvsp[(1) - (1)].lex_str); @@ -35378,14 +35396,14 @@ YYSTYPE yylval; case 1965: /* Line 1455 of yacc.c */ -#line 12905 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12917 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str)=(yyvsp[(1) - (1)].lex_str); } break; case 1966: /* Line 1455 of yacc.c */ -#line 12907 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12919 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str).str= thd->strmake((yyvsp[(1) - (1)].symbol).str, (yyvsp[(1) - (1)].symbol).length); if ((yyval.lex_str).str == NULL) @@ -35397,14 +35415,14 @@ YYSTYPE yylval; case 1967: /* Line 1455 of yacc.c */ -#line 12916 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12928 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str)=(yyvsp[(1) - (1)].lex_str); } break; case 1968: /* Line 1455 of yacc.c */ -#line 12918 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12930 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str).str= thd->strmake((yyvsp[(1) - (1)].symbol).str, (yyvsp[(1) - (1)].symbol).length); if ((yyval.lex_str).str == NULL) @@ -35416,28 +35434,28 @@ YYSTYPE yylval; case 1969: /* Line 1455 of yacc.c */ -#line 12927 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12939 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str)=(yyvsp[(1) - (1)].lex_str);} break; case 1970: /* Line 1455 of yacc.c */ -#line 12928 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12940 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str)=(yyvsp[(1) - (1)].lex_str);} break; case 1971: /* Line 1455 of yacc.c */ -#line 12929 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12941 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_str)=(yyvsp[(1) - (1)].lex_str);} break; case 1972: /* Line 1455 of yacc.c */ -#line 12934 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12946 "/home/buildbot/git/sql/sql_yacc.yy" { if (!((yyval.lex_user)=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) MYSQL_YYABORT; @@ -35458,7 +35476,7 @@ YYSTYPE yylval; case 1973: /* Line 1455 of yacc.c */ -#line 12950 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12962 "/home/buildbot/git/sql/sql_yacc.yy" { if (!((yyval.lex_user)=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) MYSQL_YYABORT; @@ -35484,7 +35502,7 @@ YYSTYPE yylval; case 1974: /* Line 1455 of yacc.c */ -#line 12971 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12983 "/home/buildbot/git/sql/sql_yacc.yy" { if (!((yyval.lex_user)=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) MYSQL_YYABORT; @@ -35500,2471 +35518,2471 @@ YYSTYPE yylval; case 1975: /* Line 1455 of yacc.c */ -#line 12985 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12997 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1976: /* Line 1455 of yacc.c */ -#line 12986 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12998 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1977: /* Line 1455 of yacc.c */ -#line 12987 "/home/buildbot/git/sql/sql_yacc.yy" +#line 12999 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1978: /* Line 1455 of yacc.c */ -#line 12988 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13000 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1979: /* Line 1455 of yacc.c */ -#line 12989 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13001 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1980: /* Line 1455 of yacc.c */ -#line 12990 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13002 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1981: /* Line 1455 of yacc.c */ -#line 12991 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13003 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1982: /* Line 1455 of yacc.c */ -#line 12992 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13004 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1983: /* Line 1455 of yacc.c */ -#line 12993 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13005 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1984: /* Line 1455 of yacc.c */ -#line 12994 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13006 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1985: /* Line 1455 of yacc.c */ -#line 12995 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13007 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1986: /* Line 1455 of yacc.c */ -#line 12996 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13008 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1987: /* Line 1455 of yacc.c */ -#line 12997 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13009 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1988: /* Line 1455 of yacc.c */ -#line 12998 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13010 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1989: /* Line 1455 of yacc.c */ -#line 12999 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13011 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1990: /* Line 1455 of yacc.c */ -#line 13000 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13012 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1991: /* Line 1455 of yacc.c */ -#line 13001 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13013 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1992: /* Line 1455 of yacc.c */ -#line 13002 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13014 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1993: /* Line 1455 of yacc.c */ -#line 13003 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13015 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1994: /* Line 1455 of yacc.c */ -#line 13004 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13016 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1995: /* Line 1455 of yacc.c */ -#line 13005 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13017 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1996: /* Line 1455 of yacc.c */ -#line 13006 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13018 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1997: /* Line 1455 of yacc.c */ -#line 13007 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13019 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1998: /* Line 1455 of yacc.c */ -#line 13008 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13020 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 1999: /* Line 1455 of yacc.c */ -#line 13009 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13021 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2000: /* Line 1455 of yacc.c */ -#line 13010 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13022 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2001: /* Line 1455 of yacc.c */ -#line 13011 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13023 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2002: /* Line 1455 of yacc.c */ -#line 13012 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13024 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2003: /* Line 1455 of yacc.c */ -#line 13013 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13025 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2004: /* Line 1455 of yacc.c */ -#line 13014 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13026 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2005: /* Line 1455 of yacc.c */ -#line 13015 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13027 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2006: /* Line 1455 of yacc.c */ -#line 13016 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13028 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2007: /* Line 1455 of yacc.c */ -#line 13017 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13029 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2008: /* Line 1455 of yacc.c */ -#line 13018 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13030 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2009: /* Line 1455 of yacc.c */ -#line 13019 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13031 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2010: /* Line 1455 of yacc.c */ -#line 13020 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13032 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2011: /* Line 1455 of yacc.c */ -#line 13021 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13033 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2012: /* Line 1455 of yacc.c */ -#line 13022 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13034 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2013: /* Line 1455 of yacc.c */ -#line 13023 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13035 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2014: /* Line 1455 of yacc.c */ -#line 13024 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13036 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2015: /* Line 1455 of yacc.c */ -#line 13025 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13037 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2016: /* Line 1455 of yacc.c */ -#line 13026 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13038 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2017: /* Line 1455 of yacc.c */ -#line 13027 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13039 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2018: /* Line 1455 of yacc.c */ -#line 13028 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13040 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2019: /* Line 1455 of yacc.c */ -#line 13029 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13041 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2020: /* Line 1455 of yacc.c */ -#line 13030 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13042 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2021: /* Line 1455 of yacc.c */ -#line 13031 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13043 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2022: /* Line 1455 of yacc.c */ -#line 13032 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13044 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2023: /* Line 1455 of yacc.c */ -#line 13033 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13045 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2024: /* Line 1455 of yacc.c */ -#line 13034 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13046 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2025: /* Line 1455 of yacc.c */ -#line 13035 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13047 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2026: /* Line 1455 of yacc.c */ -#line 13036 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13048 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2027: /* Line 1455 of yacc.c */ -#line 13037 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13049 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2028: /* Line 1455 of yacc.c */ -#line 13038 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13050 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2029: /* Line 1455 of yacc.c */ -#line 13039 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13051 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2030: /* Line 1455 of yacc.c */ -#line 13040 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13052 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2031: /* Line 1455 of yacc.c */ -#line 13041 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13053 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2032: /* Line 1455 of yacc.c */ -#line 13042 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13054 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2033: /* Line 1455 of yacc.c */ -#line 13043 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13055 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2034: /* Line 1455 of yacc.c */ -#line 13053 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13065 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2035: /* Line 1455 of yacc.c */ -#line 13054 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13066 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2036: /* Line 1455 of yacc.c */ -#line 13055 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13067 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2037: /* Line 1455 of yacc.c */ -#line 13056 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13068 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2038: /* Line 1455 of yacc.c */ -#line 13057 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13069 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2039: /* Line 1455 of yacc.c */ -#line 13058 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13070 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2040: /* Line 1455 of yacc.c */ -#line 13059 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13071 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2041: /* Line 1455 of yacc.c */ -#line 13060 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13072 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2042: /* Line 1455 of yacc.c */ -#line 13061 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13073 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2043: /* Line 1455 of yacc.c */ -#line 13062 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13074 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2044: /* Line 1455 of yacc.c */ -#line 13063 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13075 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2045: /* Line 1455 of yacc.c */ -#line 13064 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13076 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2046: /* Line 1455 of yacc.c */ -#line 13065 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13077 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2047: /* Line 1455 of yacc.c */ -#line 13066 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13078 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2048: /* Line 1455 of yacc.c */ -#line 13067 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13079 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2049: /* Line 1455 of yacc.c */ -#line 13068 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13080 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2050: /* Line 1455 of yacc.c */ -#line 13069 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13081 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2051: /* Line 1455 of yacc.c */ -#line 13070 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13082 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2052: /* Line 1455 of yacc.c */ -#line 13071 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13083 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2053: /* Line 1455 of yacc.c */ -#line 13072 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13084 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2054: /* Line 1455 of yacc.c */ -#line 13073 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13085 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2055: /* Line 1455 of yacc.c */ -#line 13074 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13086 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2056: /* Line 1455 of yacc.c */ -#line 13075 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13087 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2057: /* Line 1455 of yacc.c */ -#line 13076 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13088 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2058: /* Line 1455 of yacc.c */ -#line 13077 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13089 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2059: /* Line 1455 of yacc.c */ -#line 13078 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13090 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2060: /* Line 1455 of yacc.c */ -#line 13079 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13091 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2061: /* Line 1455 of yacc.c */ -#line 13080 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13092 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2062: /* Line 1455 of yacc.c */ -#line 13081 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13093 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2063: /* Line 1455 of yacc.c */ -#line 13082 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13094 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2064: /* Line 1455 of yacc.c */ -#line 13083 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13095 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2065: /* Line 1455 of yacc.c */ -#line 13084 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13096 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2066: /* Line 1455 of yacc.c */ -#line 13085 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13097 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2067: /* Line 1455 of yacc.c */ -#line 13086 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13098 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2068: /* Line 1455 of yacc.c */ -#line 13087 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13099 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2069: /* Line 1455 of yacc.c */ -#line 13088 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13100 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2070: /* Line 1455 of yacc.c */ -#line 13089 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13101 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2071: /* Line 1455 of yacc.c */ -#line 13090 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13102 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2072: /* Line 1455 of yacc.c */ -#line 13091 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13103 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2073: /* Line 1455 of yacc.c */ -#line 13092 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13104 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2074: /* Line 1455 of yacc.c */ -#line 13093 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13105 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2075: /* Line 1455 of yacc.c */ -#line 13094 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13106 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2076: /* Line 1455 of yacc.c */ -#line 13095 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13107 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2077: /* Line 1455 of yacc.c */ -#line 13096 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13108 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2078: /* Line 1455 of yacc.c */ -#line 13097 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13109 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2079: /* Line 1455 of yacc.c */ -#line 13098 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13110 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2080: /* Line 1455 of yacc.c */ -#line 13099 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13111 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2081: /* Line 1455 of yacc.c */ -#line 13100 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13112 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2082: /* Line 1455 of yacc.c */ -#line 13101 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13113 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2083: /* Line 1455 of yacc.c */ -#line 13102 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13114 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2084: /* Line 1455 of yacc.c */ -#line 13103 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13115 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2085: /* Line 1455 of yacc.c */ -#line 13104 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13116 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2086: /* Line 1455 of yacc.c */ -#line 13105 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13117 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2087: /* Line 1455 of yacc.c */ -#line 13106 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13118 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2088: /* Line 1455 of yacc.c */ -#line 13107 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13119 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2089: /* Line 1455 of yacc.c */ -#line 13108 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13120 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2090: /* Line 1455 of yacc.c */ -#line 13109 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13121 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2091: /* Line 1455 of yacc.c */ -#line 13110 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13122 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2092: /* Line 1455 of yacc.c */ -#line 13111 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13123 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2093: /* Line 1455 of yacc.c */ -#line 13112 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13124 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2094: /* Line 1455 of yacc.c */ -#line 13113 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13125 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2095: /* Line 1455 of yacc.c */ -#line 13114 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13126 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2096: /* Line 1455 of yacc.c */ -#line 13115 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13127 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2097: /* Line 1455 of yacc.c */ -#line 13116 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13128 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2098: /* Line 1455 of yacc.c */ -#line 13117 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13129 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2099: /* Line 1455 of yacc.c */ -#line 13118 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13130 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2100: /* Line 1455 of yacc.c */ -#line 13119 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13131 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2101: /* Line 1455 of yacc.c */ -#line 13120 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13132 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2102: /* Line 1455 of yacc.c */ -#line 13121 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13133 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2103: /* Line 1455 of yacc.c */ -#line 13122 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13134 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2104: /* Line 1455 of yacc.c */ -#line 13123 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13135 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2105: /* Line 1455 of yacc.c */ -#line 13124 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13136 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2106: /* Line 1455 of yacc.c */ -#line 13125 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13137 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2107: /* Line 1455 of yacc.c */ -#line 13126 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13138 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2108: /* Line 1455 of yacc.c */ -#line 13127 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13139 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2109: /* Line 1455 of yacc.c */ -#line 13128 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13140 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2110: /* Line 1455 of yacc.c */ -#line 13129 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13141 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2111: /* Line 1455 of yacc.c */ -#line 13130 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13142 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2112: /* Line 1455 of yacc.c */ -#line 13131 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13143 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2113: /* Line 1455 of yacc.c */ -#line 13132 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13144 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2114: /* Line 1455 of yacc.c */ -#line 13133 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13145 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2115: /* Line 1455 of yacc.c */ -#line 13134 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13146 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2116: /* Line 1455 of yacc.c */ -#line 13135 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13147 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2117: /* Line 1455 of yacc.c */ -#line 13136 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13148 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2118: /* Line 1455 of yacc.c */ -#line 13137 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13149 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2119: /* Line 1455 of yacc.c */ -#line 13138 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13150 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2120: /* Line 1455 of yacc.c */ -#line 13139 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13151 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2121: /* Line 1455 of yacc.c */ -#line 13140 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13152 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2122: /* Line 1455 of yacc.c */ -#line 13141 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13153 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2123: /* Line 1455 of yacc.c */ -#line 13142 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13154 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2124: /* Line 1455 of yacc.c */ -#line 13143 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13155 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2125: /* Line 1455 of yacc.c */ -#line 13144 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13156 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2126: /* Line 1455 of yacc.c */ -#line 13145 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13157 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2127: /* Line 1455 of yacc.c */ -#line 13146 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13158 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2128: /* Line 1455 of yacc.c */ -#line 13147 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13159 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2129: /* Line 1455 of yacc.c */ -#line 13148 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13160 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2130: /* Line 1455 of yacc.c */ -#line 13149 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13161 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2131: /* Line 1455 of yacc.c */ -#line 13150 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13162 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2132: /* Line 1455 of yacc.c */ -#line 13151 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13163 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2133: /* Line 1455 of yacc.c */ -#line 13152 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13164 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2134: /* Line 1455 of yacc.c */ -#line 13153 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13165 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2135: /* Line 1455 of yacc.c */ -#line 13154 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13166 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2136: /* Line 1455 of yacc.c */ -#line 13155 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13167 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2137: /* Line 1455 of yacc.c */ -#line 13156 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13168 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2138: /* Line 1455 of yacc.c */ -#line 13157 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13169 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2139: /* Line 1455 of yacc.c */ -#line 13158 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13170 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2140: /* Line 1455 of yacc.c */ -#line 13159 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13171 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2141: /* Line 1455 of yacc.c */ -#line 13160 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13172 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2142: /* Line 1455 of yacc.c */ -#line 13161 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13173 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2143: /* Line 1455 of yacc.c */ -#line 13162 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13174 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2144: /* Line 1455 of yacc.c */ -#line 13163 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13175 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2145: /* Line 1455 of yacc.c */ -#line 13164 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13176 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2146: /* Line 1455 of yacc.c */ -#line 13165 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13177 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2147: /* Line 1455 of yacc.c */ -#line 13166 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13178 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2148: /* Line 1455 of yacc.c */ -#line 13167 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13179 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2149: /* Line 1455 of yacc.c */ -#line 13168 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13180 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2150: /* Line 1455 of yacc.c */ -#line 13169 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13181 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2151: /* Line 1455 of yacc.c */ -#line 13170 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13182 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2152: /* Line 1455 of yacc.c */ -#line 13171 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13183 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2153: /* Line 1455 of yacc.c */ -#line 13172 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13184 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2154: /* Line 1455 of yacc.c */ -#line 13173 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13185 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2155: /* Line 1455 of yacc.c */ -#line 13174 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13186 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2156: /* Line 1455 of yacc.c */ -#line 13175 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13187 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2157: /* Line 1455 of yacc.c */ -#line 13176 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13188 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2158: /* Line 1455 of yacc.c */ -#line 13177 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13189 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2159: /* Line 1455 of yacc.c */ -#line 13178 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13190 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2160: /* Line 1455 of yacc.c */ -#line 13179 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13191 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2161: /* Line 1455 of yacc.c */ -#line 13180 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13192 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2162: /* Line 1455 of yacc.c */ -#line 13181 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13193 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2163: /* Line 1455 of yacc.c */ -#line 13182 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13194 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2164: /* Line 1455 of yacc.c */ -#line 13183 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13195 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2165: /* Line 1455 of yacc.c */ -#line 13184 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13196 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2166: /* Line 1455 of yacc.c */ -#line 13185 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13197 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2167: /* Line 1455 of yacc.c */ -#line 13186 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13198 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2168: /* Line 1455 of yacc.c */ -#line 13187 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13199 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2169: /* Line 1455 of yacc.c */ -#line 13188 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13200 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2170: /* Line 1455 of yacc.c */ -#line 13189 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13201 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2171: /* Line 1455 of yacc.c */ -#line 13190 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13202 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2172: /* Line 1455 of yacc.c */ -#line 13191 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13203 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2173: /* Line 1455 of yacc.c */ -#line 13192 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13204 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2174: /* Line 1455 of yacc.c */ -#line 13193 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13205 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2175: /* Line 1455 of yacc.c */ -#line 13194 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13206 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2176: /* Line 1455 of yacc.c */ -#line 13195 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13207 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2177: /* Line 1455 of yacc.c */ -#line 13196 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13208 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2178: /* Line 1455 of yacc.c */ -#line 13197 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13209 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2179: /* Line 1455 of yacc.c */ -#line 13198 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13210 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2180: /* Line 1455 of yacc.c */ -#line 13199 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13211 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2181: /* Line 1455 of yacc.c */ -#line 13200 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13212 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2182: /* Line 1455 of yacc.c */ -#line 13201 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13213 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2183: /* Line 1455 of yacc.c */ -#line 13202 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13214 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2184: /* Line 1455 of yacc.c */ -#line 13203 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13215 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2185: /* Line 1455 of yacc.c */ -#line 13204 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13216 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2186: /* Line 1455 of yacc.c */ -#line 13205 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13217 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2187: /* Line 1455 of yacc.c */ -#line 13206 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13218 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2188: /* Line 1455 of yacc.c */ -#line 13207 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13219 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2189: /* Line 1455 of yacc.c */ -#line 13208 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13220 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2190: /* Line 1455 of yacc.c */ -#line 13209 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13221 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2191: /* Line 1455 of yacc.c */ -#line 13210 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13222 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2192: /* Line 1455 of yacc.c */ -#line 13211 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13223 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2193: /* Line 1455 of yacc.c */ -#line 13212 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13224 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2194: /* Line 1455 of yacc.c */ -#line 13213 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13225 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2195: /* Line 1455 of yacc.c */ -#line 13214 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13226 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2196: /* Line 1455 of yacc.c */ -#line 13215 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13227 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2197: /* Line 1455 of yacc.c */ -#line 13216 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13228 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2198: /* Line 1455 of yacc.c */ -#line 13217 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13229 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2199: /* Line 1455 of yacc.c */ -#line 13218 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13230 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2200: /* Line 1455 of yacc.c */ -#line 13219 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13231 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2201: /* Line 1455 of yacc.c */ -#line 13220 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13232 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2202: /* Line 1455 of yacc.c */ -#line 13221 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13233 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2203: /* Line 1455 of yacc.c */ -#line 13222 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13234 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2204: /* Line 1455 of yacc.c */ -#line 13223 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13235 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2205: /* Line 1455 of yacc.c */ -#line 13224 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13236 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2206: /* Line 1455 of yacc.c */ -#line 13225 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13237 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2207: /* Line 1455 of yacc.c */ -#line 13226 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13238 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2208: /* Line 1455 of yacc.c */ -#line 13227 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13239 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2209: /* Line 1455 of yacc.c */ -#line 13228 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13240 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2210: /* Line 1455 of yacc.c */ -#line 13229 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13241 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2211: /* Line 1455 of yacc.c */ -#line 13230 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13242 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2212: /* Line 1455 of yacc.c */ -#line 13231 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13243 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2213: /* Line 1455 of yacc.c */ -#line 13232 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13244 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2214: /* Line 1455 of yacc.c */ -#line 13233 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13245 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2215: /* Line 1455 of yacc.c */ -#line 13234 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13246 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2216: /* Line 1455 of yacc.c */ -#line 13235 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13247 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2217: /* Line 1455 of yacc.c */ -#line 13236 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13248 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2218: /* Line 1455 of yacc.c */ -#line 13237 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13249 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2219: /* Line 1455 of yacc.c */ -#line 13238 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13250 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2220: /* Line 1455 of yacc.c */ -#line 13239 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13251 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2221: /* Line 1455 of yacc.c */ -#line 13240 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13252 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2222: /* Line 1455 of yacc.c */ -#line 13241 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13253 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2223: /* Line 1455 of yacc.c */ -#line 13242 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13254 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2224: /* Line 1455 of yacc.c */ -#line 13243 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13255 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2225: /* Line 1455 of yacc.c */ -#line 13244 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13256 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2226: /* Line 1455 of yacc.c */ -#line 13245 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13257 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2227: /* Line 1455 of yacc.c */ -#line 13246 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13258 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2228: /* Line 1455 of yacc.c */ -#line 13247 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13259 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2229: /* Line 1455 of yacc.c */ -#line 13248 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13260 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2230: /* Line 1455 of yacc.c */ -#line 13249 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13261 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2231: /* Line 1455 of yacc.c */ -#line 13250 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13262 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2232: /* Line 1455 of yacc.c */ -#line 13251 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13263 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2233: /* Line 1455 of yacc.c */ -#line 13252 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13264 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2234: /* Line 1455 of yacc.c */ -#line 13253 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13265 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2235: /* Line 1455 of yacc.c */ -#line 13254 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13266 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2236: /* Line 1455 of yacc.c */ -#line 13255 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13267 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2237: /* Line 1455 of yacc.c */ -#line 13256 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13268 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2238: /* Line 1455 of yacc.c */ -#line 13257 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13269 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2239: /* Line 1455 of yacc.c */ -#line 13258 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13270 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2240: /* Line 1455 of yacc.c */ -#line 13259 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13271 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2241: /* Line 1455 of yacc.c */ -#line 13260 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13272 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2242: /* Line 1455 of yacc.c */ -#line 13261 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13273 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2243: /* Line 1455 of yacc.c */ -#line 13262 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13274 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2244: /* Line 1455 of yacc.c */ -#line 13263 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13275 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2245: /* Line 1455 of yacc.c */ -#line 13264 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13276 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2246: /* Line 1455 of yacc.c */ -#line 13265 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13277 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2247: /* Line 1455 of yacc.c */ -#line 13266 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13278 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2248: /* Line 1455 of yacc.c */ -#line 13267 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13279 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2249: /* Line 1455 of yacc.c */ -#line 13268 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13280 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2250: /* Line 1455 of yacc.c */ -#line 13269 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13281 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2251: /* Line 1455 of yacc.c */ -#line 13270 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13282 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2252: /* Line 1455 of yacc.c */ -#line 13271 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13283 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2253: /* Line 1455 of yacc.c */ -#line 13272 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13284 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2254: /* Line 1455 of yacc.c */ -#line 13273 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13285 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2255: /* Line 1455 of yacc.c */ -#line 13274 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13286 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2256: /* Line 1455 of yacc.c */ -#line 13275 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13287 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2257: /* Line 1455 of yacc.c */ -#line 13276 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13288 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2258: /* Line 1455 of yacc.c */ -#line 13277 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13289 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2259: /* Line 1455 of yacc.c */ -#line 13278 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13290 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2260: /* Line 1455 of yacc.c */ -#line 13279 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13291 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2261: /* Line 1455 of yacc.c */ -#line 13280 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13292 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2262: /* Line 1455 of yacc.c */ -#line 13281 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13293 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2263: /* Line 1455 of yacc.c */ -#line 13282 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13294 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2264: /* Line 1455 of yacc.c */ -#line 13283 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13295 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2265: /* Line 1455 of yacc.c */ -#line 13284 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13296 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2266: /* Line 1455 of yacc.c */ -#line 13285 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13297 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2267: /* Line 1455 of yacc.c */ -#line 13286 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13298 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2268: /* Line 1455 of yacc.c */ -#line 13287 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13299 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2269: /* Line 1455 of yacc.c */ -#line 13288 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13300 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2270: /* Line 1455 of yacc.c */ -#line 13289 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13301 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2271: /* Line 1455 of yacc.c */ -#line 13290 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13302 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2272: /* Line 1455 of yacc.c */ -#line 13291 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13303 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2273: /* Line 1455 of yacc.c */ -#line 13292 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13304 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2274: /* Line 1455 of yacc.c */ -#line 13293 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13305 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2275: /* Line 1455 of yacc.c */ -#line 13294 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13306 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2276: /* Line 1455 of yacc.c */ -#line 13295 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13307 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2277: /* Line 1455 of yacc.c */ -#line 13296 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13308 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2278: /* Line 1455 of yacc.c */ -#line 13297 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13309 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2279: /* Line 1455 of yacc.c */ -#line 13298 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13310 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2280: /* Line 1455 of yacc.c */ -#line 13299 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13311 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2281: /* Line 1455 of yacc.c */ -#line 13300 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13312 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2282: /* Line 1455 of yacc.c */ -#line 13301 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13313 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2283: /* Line 1455 of yacc.c */ -#line 13302 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13314 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2284: /* Line 1455 of yacc.c */ -#line 13303 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13315 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2285: /* Line 1455 of yacc.c */ -#line 13304 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13316 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2286: /* Line 1455 of yacc.c */ -#line 13305 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13317 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2287: /* Line 1455 of yacc.c */ -#line 13306 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13318 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2288: /* Line 1455 of yacc.c */ -#line 13307 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13319 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2289: /* Line 1455 of yacc.c */ -#line 13308 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13320 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2290: /* Line 1455 of yacc.c */ -#line 13309 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13321 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2291: /* Line 1455 of yacc.c */ -#line 13310 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13322 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2292: /* Line 1455 of yacc.c */ -#line 13311 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13323 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2293: /* Line 1455 of yacc.c */ -#line 13312 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13324 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2294: /* Line 1455 of yacc.c */ -#line 13313 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13325 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2295: /* Line 1455 of yacc.c */ -#line 13314 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13326 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2296: /* Line 1455 of yacc.c */ -#line 13315 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13327 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2297: /* Line 1455 of yacc.c */ -#line 13316 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13328 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2298: /* Line 1455 of yacc.c */ -#line 13317 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13329 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2299: /* Line 1455 of yacc.c */ -#line 13318 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13330 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2300: /* Line 1455 of yacc.c */ -#line 13319 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13331 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2301: /* Line 1455 of yacc.c */ -#line 13320 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13332 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2302: /* Line 1455 of yacc.c */ -#line 13321 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13333 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2303: /* Line 1455 of yacc.c */ -#line 13322 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13334 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2304: /* Line 1455 of yacc.c */ -#line 13323 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13335 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2305: /* Line 1455 of yacc.c */ -#line 13324 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13336 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2306: /* Line 1455 of yacc.c */ -#line 13325 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13337 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2307: /* Line 1455 of yacc.c */ -#line 13326 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13338 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2308: /* Line 1455 of yacc.c */ -#line 13327 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13339 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2309: /* Line 1455 of yacc.c */ -#line 13328 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13340 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2310: /* Line 1455 of yacc.c */ -#line 13329 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13341 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2311: /* Line 1455 of yacc.c */ -#line 13330 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13342 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2312: /* Line 1455 of yacc.c */ -#line 13331 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13343 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2313: /* Line 1455 of yacc.c */ -#line 13332 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13344 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2314: /* Line 1455 of yacc.c */ -#line 13333 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13345 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2315: /* Line 1455 of yacc.c */ -#line 13334 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13346 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2316: /* Line 1455 of yacc.c */ -#line 13335 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13347 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2317: /* Line 1455 of yacc.c */ -#line 13336 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13348 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2318: /* Line 1455 of yacc.c */ -#line 13337 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13349 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2319: /* Line 1455 of yacc.c */ -#line 13338 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13350 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2320: /* Line 1455 of yacc.c */ -#line 13339 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13351 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2321: /* Line 1455 of yacc.c */ -#line 13340 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13352 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2322: /* Line 1455 of yacc.c */ -#line 13341 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13353 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2323: /* Line 1455 of yacc.c */ -#line 13342 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13354 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2324: /* Line 1455 of yacc.c */ -#line 13343 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13355 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2325: /* Line 1455 of yacc.c */ -#line 13344 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13356 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2326: /* Line 1455 of yacc.c */ -#line 13345 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13357 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2327: /* Line 1455 of yacc.c */ -#line 13352 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13364 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_SET_OPTION; @@ -37979,28 +37997,28 @@ YYSTYPE yylval; case 2328: /* Line 1455 of yacc.c */ -#line 13362 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13374 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2329: /* Line 1455 of yacc.c */ -#line 13366 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13378 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2330: /* Line 1455 of yacc.c */ -#line 13367 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13379 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2333: /* Line 1455 of yacc.c */ -#line 13376 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13388 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -38035,7 +38053,7 @@ YYSTYPE yylval; case 2334: /* Line 1455 of yacc.c */ -#line 13406 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13418 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -38088,105 +38106,105 @@ YYSTYPE yylval; case 2335: /* Line 1455 of yacc.c */ -#line 13456 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13468 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2336: /* Line 1455 of yacc.c */ -#line 13457 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13469 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_GLOBAL; } break; case 2337: /* Line 1455 of yacc.c */ -#line 13458 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13470 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_SESSION; } break; case 2338: /* Line 1455 of yacc.c */ -#line 13459 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13471 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_SESSION; } break; case 2339: /* Line 1455 of yacc.c */ -#line 13463 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13475 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= OPT_DEFAULT; } break; case 2340: /* Line 1455 of yacc.c */ -#line 13464 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13476 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->one_shot_set= 1; (yyval.num)= OPT_SESSION; } break; case 2341: /* Line 1455 of yacc.c */ -#line 13468 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13480 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_SESSION; } break; case 2342: /* Line 1455 of yacc.c */ -#line 13469 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13481 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_GLOBAL; } break; case 2343: /* Line 1455 of yacc.c */ -#line 13470 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13482 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_SESSION; } break; case 2344: /* Line 1455 of yacc.c */ -#line 13471 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13483 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_SESSION; } break; case 2345: /* Line 1455 of yacc.c */ -#line 13475 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13487 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_DEFAULT; } break; case 2346: /* Line 1455 of yacc.c */ -#line 13476 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13488 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_GLOBAL; } break; case 2347: /* Line 1455 of yacc.c */ -#line 13477 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13489 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_SESSION; } break; case 2348: /* Line 1455 of yacc.c */ -#line 13478 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13490 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.var_type)=OPT_SESSION; } break; case 2351: /* Line 1455 of yacc.c */ -#line 13488 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13500 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; LEX_STRING *name= &(yyvsp[(2) - (4)].variable).base_name; @@ -38232,7 +38250,7 @@ YYSTYPE yylval; case 2352: /* Line 1455 of yacc.c */ -#line 13529 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13541 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->option_type= (yyvsp[(1) - (5)].var_type); @@ -38252,7 +38270,7 @@ YYSTYPE yylval; case 2353: /* Line 1455 of yacc.c */ -#line 13547 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13559 "/home/buildbot/git/sql/sql_yacc.yy" { Item_func_set_user_var *item; item= new (thd->mem_root) Item_func_set_user_var((yyvsp[(2) - (4)].lex_str), (yyvsp[(4) - (4)].item)); @@ -38268,7 +38286,7 @@ YYSTYPE yylval; case 2354: /* Line 1455 of yacc.c */ -#line 13558 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13570 "/home/buildbot/git/sql/sql_yacc.yy" { struct sys_var_with_base tmp= (yyvsp[(4) - (6)].variable); /* Lookup if necessary: must be a system variable. */ @@ -38285,7 +38303,7 @@ YYSTYPE yylval; case 2355: /* Line 1455 of yacc.c */ -#line 13570 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13582 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; CHARSET_INFO *cs2; @@ -38303,7 +38321,7 @@ YYSTYPE yylval; case 2356: /* Line 1455 of yacc.c */ -#line 13583 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13595 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; sp_pcontext *spc= lex->spcont; @@ -38323,7 +38341,7 @@ YYSTYPE yylval; case 2357: /* Line 1455 of yacc.c */ -#line 13598 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13610 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; CHARSET_INFO *cs2; @@ -38347,7 +38365,7 @@ YYSTYPE yylval; case 2358: /* Line 1455 of yacc.c */ -#line 13617 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13629 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; LEX_USER *user; @@ -38378,7 +38396,7 @@ YYSTYPE yylval; case 2359: /* Line 1455 of yacc.c */ -#line 13643 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13655 "/home/buildbot/git/sql/sql_yacc.yy" { set_var_password *var= new set_var_password((yyvsp[(3) - (5)].lex_user),(yyvsp[(5) - (5)].simple_string)); if (var == NULL) @@ -38393,7 +38411,7 @@ YYSTYPE yylval; case 2360: /* Line 1455 of yacc.c */ -#line 13656 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13668 "/home/buildbot/git/sql/sql_yacc.yy" { sp_pcontext *spc= thd->lex->spcont; sp_variable_t *spv; @@ -38424,7 +38442,7 @@ YYSTYPE yylval; case 2361: /* Line 1455 of yacc.c */ -#line 13682 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13694 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (check_reserved_words(&(yyvsp[(1) - (3)].lex_str))) @@ -38472,7 +38490,7 @@ YYSTYPE yylval; case 2362: /* Line 1455 of yacc.c */ -#line 13725 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13737 "/home/buildbot/git/sql/sql_yacc.yy" { sys_var *tmp=find_sys_var(thd, (yyvsp[(3) - (3)].lex_str).str, (yyvsp[(3) - (3)].lex_str).length); if (!tmp) @@ -38488,42 +38506,42 @@ YYSTYPE yylval; case 2363: /* Line 1455 of yacc.c */ -#line 13738 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13750 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.tx_isolation)= ISO_READ_UNCOMMITTED; } break; case 2364: /* Line 1455 of yacc.c */ -#line 13739 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13751 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.tx_isolation)= ISO_READ_COMMITTED; } break; case 2365: /* Line 1455 of yacc.c */ -#line 13740 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13752 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.tx_isolation)= ISO_REPEATABLE_READ; } break; case 2366: /* Line 1455 of yacc.c */ -#line 13741 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13753 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.tx_isolation)= ISO_SERIALIZABLE; } break; case 2367: /* Line 1455 of yacc.c */ -#line 13745 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13757 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.simple_string)=(yyvsp[(1) - (1)].lex_str).str;} break; case 2368: /* Line 1455 of yacc.c */ -#line 13747 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13759 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.simple_string)= (yyvsp[(3) - (4)].lex_str).length ? thd->variables.old_passwords ? Item_func_old_password::alloc(thd, (yyvsp[(3) - (4)].lex_str).str, (yyvsp[(3) - (4)].lex_str).length) : @@ -38537,7 +38555,7 @@ YYSTYPE yylval; case 2369: /* Line 1455 of yacc.c */ -#line 13756 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13768 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.simple_string)= (yyvsp[(3) - (4)].lex_str).length ? Item_func_old_password::alloc(thd, (yyvsp[(3) - (4)].lex_str).str, (yyvsp[(3) - (4)].lex_str).length) : @@ -38550,21 +38568,21 @@ YYSTYPE yylval; case 2370: /* Line 1455 of yacc.c */ -#line 13767 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13779 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)=(yyvsp[(1) - (1)].item); } break; case 2371: /* Line 1455 of yacc.c */ -#line 13768 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13780 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)=0; } break; case 2372: /* Line 1455 of yacc.c */ -#line 13770 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13782 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)=new (thd->mem_root) Item_string("ON", 2, system_charset_info); if ((yyval.item) == NULL) @@ -38575,7 +38593,7 @@ YYSTYPE yylval; case 2373: /* Line 1455 of yacc.c */ -#line 13776 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13788 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)=new (thd->mem_root) Item_string("ALL", 3, system_charset_info); if ((yyval.item) == NULL) @@ -38586,7 +38604,7 @@ YYSTYPE yylval; case 2374: /* Line 1455 of yacc.c */ -#line 13782 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13794 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.item)=new (thd->mem_root) Item_string("binary", 6, system_charset_info); if ((yyval.item) == NULL) @@ -38597,7 +38615,7 @@ YYSTYPE yylval; case 2375: /* Line 1455 of yacc.c */ -#line 13793 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13805 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; @@ -38613,28 +38631,28 @@ YYSTYPE yylval; case 2376: /* Line 1455 of yacc.c */ -#line 13804 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13816 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2377: /* Line 1455 of yacc.c */ -#line 13808 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13820 "/home/buildbot/git/sql/sql_yacc.yy" { } break; case 2378: /* Line 1455 of yacc.c */ -#line 13809 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13821 "/home/buildbot/git/sql/sql_yacc.yy" { } break; case 2381: /* Line 1455 of yacc.c */ -#line 13819 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13831 "/home/buildbot/git/sql/sql_yacc.yy" { thr_lock_type lock_type= (thr_lock_type) (yyvsp[(3) - (3)].num); bool lock_for_write= (lock_type >= TL_WRITE_ALLOW_WRITE); @@ -38651,21 +38669,21 @@ YYSTYPE yylval; case 2382: /* Line 1455 of yacc.c */ -#line 13833 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13845 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= TL_READ_NO_INSERT; } break; case 2383: /* Line 1455 of yacc.c */ -#line 13834 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13846 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= TL_WRITE_DEFAULT; } break; case 2384: /* Line 1455 of yacc.c */ -#line 13836 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13848 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); } @@ -38674,21 +38692,21 @@ YYSTYPE yylval; case 2385: /* Line 1455 of yacc.c */ -#line 13840 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13852 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= TL_WRITE_LOW_PRIORITY; } break; case 2386: /* Line 1455 of yacc.c */ -#line 13841 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13853 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= TL_READ; } break; case 2387: /* Line 1455 of yacc.c */ -#line 13846 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13858 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; @@ -38704,14 +38722,14 @@ YYSTYPE yylval; case 2388: /* Line 1455 of yacc.c */ -#line 13857 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13869 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2389: /* Line 1455 of yacc.c */ -#line 13866 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13878 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->sphead) @@ -38728,7 +38746,7 @@ YYSTYPE yylval; case 2390: /* Line 1455 of yacc.c */ -#line 13878 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13890 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->sphead) @@ -38745,7 +38763,7 @@ YYSTYPE yylval; case 2391: /* Line 1455 of yacc.c */ -#line 13890 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13902 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (lex->sphead) @@ -38770,7 +38788,7 @@ YYSTYPE yylval; case 2392: /* Line 1455 of yacc.c */ -#line 13910 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13922 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->expr_allows_subselect= TRUE; /* Stored functions are not supported for HANDLER READ. */ @@ -38786,63 +38804,63 @@ YYSTYPE yylval; case 2393: /* Line 1455 of yacc.c */ -#line 13923 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13935 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ident= null_lex_str; } break; case 2394: /* Line 1455 of yacc.c */ -#line 13924 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13936 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ident= (yyvsp[(1) - (2)].lex_str); } break; case 2395: /* Line 1455 of yacc.c */ -#line 13928 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13940 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ha_read_mode = RFIRST; } break; case 2396: /* Line 1455 of yacc.c */ -#line 13929 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13941 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ha_read_mode = RNEXT; } break; case 2397: /* Line 1455 of yacc.c */ -#line 13933 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13945 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ha_read_mode = RFIRST; } break; case 2398: /* Line 1455 of yacc.c */ -#line 13934 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13946 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ha_read_mode = RNEXT; } break; case 2399: /* Line 1455 of yacc.c */ -#line 13935 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13947 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ha_read_mode = RPREV; } break; case 2400: /* Line 1455 of yacc.c */ -#line 13936 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13948 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ha_read_mode = RLAST; } break; case 2401: /* Line 1455 of yacc.c */ -#line 13938 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13950 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->ha_read_mode = RKEY; @@ -38855,56 +38873,56 @@ YYSTYPE yylval; case 2402: /* Line 1455 of yacc.c */ -#line 13946 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13958 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2403: /* Line 1455 of yacc.c */ -#line 13950 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13962 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.ha_rkey_mode)=HA_READ_KEY_EXACT; } break; case 2404: /* Line 1455 of yacc.c */ -#line 13951 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13963 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_NEXT; } break; case 2405: /* Line 1455 of yacc.c */ -#line 13952 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13964 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_PREV; } break; case 2406: /* Line 1455 of yacc.c */ -#line 13953 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13965 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.ha_rkey_mode)=HA_READ_AFTER_KEY; } break; case 2407: /* Line 1455 of yacc.c */ -#line 13954 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13966 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.ha_rkey_mode)=HA_READ_BEFORE_KEY; } break; case 2408: /* Line 1455 of yacc.c */ -#line 13961 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13973 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2409: /* Line 1455 of yacc.c */ -#line 13966 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13978 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_REVOKE; @@ -38915,7 +38933,7 @@ YYSTYPE yylval; case 2410: /* Line 1455 of yacc.c */ -#line 13972 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13984 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->columns.elements) @@ -38931,7 +38949,7 @@ YYSTYPE yylval; case 2411: /* Line 1455 of yacc.c */ -#line 13983 "/home/buildbot/git/sql/sql_yacc.yy" +#line 13995 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->columns.elements) @@ -38947,7 +38965,7 @@ YYSTYPE yylval; case 2412: /* Line 1455 of yacc.c */ -#line 13994 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14006 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_REVOKE_ALL; } @@ -38956,7 +38974,7 @@ YYSTYPE yylval; case 2413: /* Line 1455 of yacc.c */ -#line 13998 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14010 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->users_list.push_front ((yyvsp[(3) - (5)].lex_user)); @@ -38968,14 +38986,14 @@ YYSTYPE yylval; case 2414: /* Line 1455 of yacc.c */ -#line 14008 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14020 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2415: /* Line 1455 of yacc.c */ -#line 14014 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14026 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_GRANT; @@ -38986,7 +39004,7 @@ YYSTYPE yylval; case 2416: /* Line 1455 of yacc.c */ -#line 14021 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14033 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->columns.elements) @@ -39002,7 +39020,7 @@ YYSTYPE yylval; case 2417: /* Line 1455 of yacc.c */ -#line 14033 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14045 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; if (lex->columns.elements) @@ -39018,7 +39036,7 @@ YYSTYPE yylval; case 2418: /* Line 1455 of yacc.c */ -#line 14044 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14056 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->users_list.push_front ((yyvsp[(3) - (6)].lex_user)); @@ -39030,14 +39048,14 @@ YYSTYPE yylval; case 2421: /* Line 1455 of yacc.c */ -#line 14058 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14070 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2422: /* Line 1455 of yacc.c */ -#line 14060 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14072 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->all_privileges= 1; Lex->grant= GLOBAL_ACLS; @@ -39047,259 +39065,259 @@ YYSTYPE yylval; case 2427: /* Line 1455 of yacc.c */ -#line 14078 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14090 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->which_columns = SELECT_ACL;} break; case 2428: /* Line 1455 of yacc.c */ -#line 14079 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14091 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2429: /* Line 1455 of yacc.c */ -#line 14081 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14093 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->which_columns = INSERT_ACL;} break; case 2430: /* Line 1455 of yacc.c */ -#line 14082 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14094 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2431: /* Line 1455 of yacc.c */ -#line 14084 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14096 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->which_columns = UPDATE_ACL; } break; case 2432: /* Line 1455 of yacc.c */ -#line 14085 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14097 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2433: /* Line 1455 of yacc.c */ -#line 14087 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14099 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->which_columns = REFERENCES_ACL;} break; case 2434: /* Line 1455 of yacc.c */ -#line 14088 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14100 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2435: /* Line 1455 of yacc.c */ -#line 14089 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14101 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= DELETE_ACL;} break; case 2436: /* Line 1455 of yacc.c */ -#line 14090 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14102 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2437: /* Line 1455 of yacc.c */ -#line 14091 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14103 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= INDEX_ACL;} break; case 2438: /* Line 1455 of yacc.c */ -#line 14092 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14104 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= ALTER_ACL;} break; case 2439: /* Line 1455 of yacc.c */ -#line 14093 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14105 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= CREATE_ACL;} break; case 2440: /* Line 1455 of yacc.c */ -#line 14094 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14106 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= DROP_ACL;} break; case 2441: /* Line 1455 of yacc.c */ -#line 14095 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14107 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= EXECUTE_ACL;} break; case 2442: /* Line 1455 of yacc.c */ -#line 14096 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14108 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= RELOAD_ACL;} break; case 2443: /* Line 1455 of yacc.c */ -#line 14097 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14109 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= SHUTDOWN_ACL;} break; case 2444: /* Line 1455 of yacc.c */ -#line 14098 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14110 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= PROCESS_ACL;} break; case 2445: /* Line 1455 of yacc.c */ -#line 14099 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14111 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= FILE_ACL;} break; case 2446: /* Line 1455 of yacc.c */ -#line 14100 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14112 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= GRANT_ACL;} break; case 2447: /* Line 1455 of yacc.c */ -#line 14101 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14113 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= SHOW_DB_ACL;} break; case 2448: /* Line 1455 of yacc.c */ -#line 14102 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14114 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= SUPER_ACL;} break; case 2449: /* Line 1455 of yacc.c */ -#line 14103 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14115 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= CREATE_TMP_ACL;} break; case 2450: /* Line 1455 of yacc.c */ -#line 14104 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14116 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= LOCK_TABLES_ACL; } break; case 2451: /* Line 1455 of yacc.c */ -#line 14105 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14117 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= REPL_SLAVE_ACL; } break; case 2452: /* Line 1455 of yacc.c */ -#line 14106 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14118 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= REPL_CLIENT_ACL; } break; case 2453: /* Line 1455 of yacc.c */ -#line 14107 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14119 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= CREATE_VIEW_ACL; } break; case 2454: /* Line 1455 of yacc.c */ -#line 14108 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14120 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= SHOW_VIEW_ACL; } break; case 2455: /* Line 1455 of yacc.c */ -#line 14109 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14121 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= CREATE_PROC_ACL; } break; case 2456: /* Line 1455 of yacc.c */ -#line 14110 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14122 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= ALTER_PROC_ACL; } break; case 2457: /* Line 1455 of yacc.c */ -#line 14111 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14123 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= CREATE_USER_ACL; } break; case 2458: /* Line 1455 of yacc.c */ -#line 14112 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14124 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= EVENT_ACL;} break; case 2459: /* Line 1455 of yacc.c */ -#line 14113 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14125 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= TRIGGER_ACL; } break; case 2460: /* Line 1455 of yacc.c */ -#line 14114 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14126 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= CREATE_TABLESPACE_ACL; } break; case 2461: /* Line 1455 of yacc.c */ -#line 14118 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14130 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2462: /* Line 1455 of yacc.c */ -#line 14119 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14131 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2465: /* Line 1455 of yacc.c */ -#line 14129 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14141 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (lex->x509_subject) @@ -39314,7 +39332,7 @@ YYSTYPE yylval; case 2466: /* Line 1455 of yacc.c */ -#line 14139 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14151 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (lex->x509_issuer) @@ -39329,7 +39347,7 @@ YYSTYPE yylval; case 2467: /* Line 1455 of yacc.c */ -#line 14149 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14161 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (lex->ssl_cipher) @@ -39344,7 +39362,7 @@ YYSTYPE yylval; case 2468: /* Line 1455 of yacc.c */ -#line 14162 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14174 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; size_t dummy; @@ -39364,7 +39382,7 @@ YYSTYPE yylval; case 2469: /* Line 1455 of yacc.c */ -#line 14177 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14189 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->current_select->db = (yyvsp[(1) - (3)].lex_str).str; @@ -39382,7 +39400,7 @@ YYSTYPE yylval; case 2470: /* Line 1455 of yacc.c */ -#line 14190 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14202 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->current_select->db = NULL; @@ -39400,7 +39418,7 @@ YYSTYPE yylval; case 2471: /* Line 1455 of yacc.c */ -#line 14203 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14215 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (!lex->current_select->add_table_to_list(lex->thd, (yyvsp[(1) - (1)].table),NULL, @@ -39414,7 +39432,7 @@ YYSTYPE yylval; case 2472: /* Line 1455 of yacc.c */ -#line 14215 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14227 "/home/buildbot/git/sql/sql_yacc.yy" { if (Lex->users_list.push_back((yyvsp[(1) - (1)].lex_user))) MYSQL_YYABORT; @@ -39424,7 +39442,7 @@ YYSTYPE yylval; case 2473: /* Line 1455 of yacc.c */ -#line 14220 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14232 "/home/buildbot/git/sql/sql_yacc.yy" { if (Lex->users_list.push_back((yyvsp[(3) - (3)].lex_user))) MYSQL_YYABORT; @@ -39434,7 +39452,7 @@ YYSTYPE yylval; case 2474: /* Line 1455 of yacc.c */ -#line 14228 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14240 "/home/buildbot/git/sql/sql_yacc.yy" { if (Lex->users_list.push_back((yyvsp[(1) - (1)].lex_user))) MYSQL_YYABORT; @@ -39444,7 +39462,7 @@ YYSTYPE yylval; case 2475: /* Line 1455 of yacc.c */ -#line 14233 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14245 "/home/buildbot/git/sql/sql_yacc.yy" { if (Lex->users_list.push_back((yyvsp[(3) - (3)].lex_user))) MYSQL_YYABORT; @@ -39454,7 +39472,7 @@ YYSTYPE yylval; case 2480: /* Line 1455 of yacc.c */ -#line 14244 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14256 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_user)=(yyvsp[(1) - (4)].lex_user); (yyvsp[(1) - (4)].lex_user)->password=(yyvsp[(4) - (4)].lex_str); if ((yyvsp[(4) - (4)].lex_str).length) @@ -39486,7 +39504,7 @@ YYSTYPE yylval; case 2481: /* Line 1455 of yacc.c */ -#line 14271 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14283 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_user)= (yyvsp[(1) - (5)].lex_user); (yyvsp[(1) - (5)].lex_user)->password= (yyvsp[(5) - (5)].lex_str); @@ -39496,7 +39514,7 @@ YYSTYPE yylval; case 2482: /* Line 1455 of yacc.c */ -#line 14276 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14288 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_user)= (yyvsp[(1) - (4)].lex_user); (yyvsp[(1) - (4)].lex_user)->plugin= (yyvsp[(4) - (4)].lex_str); @@ -39507,7 +39525,7 @@ YYSTYPE yylval; case 2483: /* Line 1455 of yacc.c */ -#line 14282 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14294 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_user)= (yyvsp[(1) - (6)].lex_user); (yyvsp[(1) - (6)].lex_user)->plugin= (yyvsp[(4) - (6)].lex_str); @@ -39518,14 +39536,14 @@ YYSTYPE yylval; case 2484: /* Line 1455 of yacc.c */ -#line 14288 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14300 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.lex_user)= (yyvsp[(1) - (1)].lex_user); (yyvsp[(1) - (1)].lex_user)->password= null_lex_str; } break; case 2485: /* Line 1455 of yacc.c */ -#line 14293 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14305 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->grant |= lex->which_columns; @@ -39535,7 +39553,7 @@ YYSTYPE yylval; case 2489: /* Line 1455 of yacc.c */ -#line 14307 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14319 "/home/buildbot/git/sql/sql_yacc.yy" { String *new_str = new (thd->mem_root) String((const char*) (yyvsp[(1) - (1)].lex_str).str,(yyvsp[(1) - (1)].lex_str).length,system_charset_info); if (new_str == NULL) @@ -39565,7 +39583,7 @@ YYSTYPE yylval; case 2491: /* Line 1455 of yacc.c */ -#line 14336 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14348 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ssl_type=SSL_TYPE_SPECIFIED; } @@ -39574,7 +39592,7 @@ YYSTYPE yylval; case 2492: /* Line 1455 of yacc.c */ -#line 14340 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14352 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ssl_type=SSL_TYPE_ANY; } @@ -39583,7 +39601,7 @@ YYSTYPE yylval; case 2493: /* Line 1455 of yacc.c */ -#line 14344 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14356 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ssl_type=SSL_TYPE_X509; } @@ -39592,7 +39610,7 @@ YYSTYPE yylval; case 2494: /* Line 1455 of yacc.c */ -#line 14348 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14360 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->ssl_type=SSL_TYPE_NONE; } @@ -39601,49 +39619,49 @@ YYSTYPE yylval; case 2495: /* Line 1455 of yacc.c */ -#line 14354 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14366 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2497: /* Line 1455 of yacc.c */ -#line 14359 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14371 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2498: /* Line 1455 of yacc.c */ -#line 14360 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14372 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= GRANT_ACL;} break; case 2499: /* Line 1455 of yacc.c */ -#line 14364 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14376 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2500: /* Line 1455 of yacc.c */ -#line 14365 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14377 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2501: /* Line 1455 of yacc.c */ -#line 14369 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14381 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->grant |= GRANT_ACL;} break; case 2502: /* Line 1455 of yacc.c */ -#line 14371 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14383 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->mqh.questions=(yyvsp[(2) - (2)].ulong_num); @@ -39654,7 +39672,7 @@ YYSTYPE yylval; case 2503: /* Line 1455 of yacc.c */ -#line 14377 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14389 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->mqh.updates=(yyvsp[(2) - (2)].ulong_num); @@ -39665,7 +39683,7 @@ YYSTYPE yylval; case 2504: /* Line 1455 of yacc.c */ -#line 14383 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14395 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->mqh.conn_per_hour= (yyvsp[(2) - (2)].ulong_num); @@ -39676,7 +39694,7 @@ YYSTYPE yylval; case 2505: /* Line 1455 of yacc.c */ -#line 14389 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14401 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->mqh.user_conn= (yyvsp[(2) - (2)].num); @@ -39687,7 +39705,7 @@ YYSTYPE yylval; case 2506: /* Line 1455 of yacc.c */ -#line 14398 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14410 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command = SQLCOM_BEGIN; @@ -39698,84 +39716,84 @@ YYSTYPE yylval; case 2507: /* Line 1455 of yacc.c */ -#line 14403 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14415 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2508: /* Line 1455 of yacc.c */ -#line 14407 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14419 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2509: /* Line 1455 of yacc.c */ -#line 14408 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14420 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2510: /* Line 1455 of yacc.c */ -#line 14413 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14425 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } break; case 2511: /* Line 1455 of yacc.c */ -#line 14414 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14426 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.m_yes_no_unk)= TVL_NO; } break; case 2512: /* Line 1455 of yacc.c */ -#line 14415 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14427 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.m_yes_no_unk)= TVL_YES; } break; case 2513: /* Line 1455 of yacc.c */ -#line 14420 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14432 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } break; case 2514: /* Line 1455 of yacc.c */ -#line 14421 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14433 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.m_yes_no_unk)= TVL_YES; } break; case 2515: /* Line 1455 of yacc.c */ -#line 14422 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14434 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.m_yes_no_unk)= TVL_NO; } break; case 2516: /* Line 1455 of yacc.c */ -#line 14426 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14438 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2517: /* Line 1455 of yacc.c */ -#line 14427 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14439 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2518: /* Line 1455 of yacc.c */ -#line 14432 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14444 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_COMMIT; @@ -39789,7 +39807,7 @@ YYSTYPE yylval; case 2519: /* Line 1455 of yacc.c */ -#line 14444 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14456 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_ROLLBACK; @@ -39803,7 +39821,7 @@ YYSTYPE yylval; case 2520: /* Line 1455 of yacc.c */ -#line 14454 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14466 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; @@ -39814,7 +39832,7 @@ YYSTYPE yylval; case 2521: /* Line 1455 of yacc.c */ -#line 14463 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14475 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_SAVEPOINT; @@ -39825,7 +39843,7 @@ YYSTYPE yylval; case 2522: /* Line 1455 of yacc.c */ -#line 14472 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14484 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; @@ -39836,14 +39854,14 @@ YYSTYPE yylval; case 2523: /* Line 1455 of yacc.c */ -#line 14485 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14497 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2525: /* Line 1455 of yacc.c */ -#line 14491 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14503 "/home/buildbot/git/sql/sql_yacc.yy" { if (add_select_to_union_list(Lex, (bool)(yyvsp[(2) - (2)].num), TRUE)) MYSQL_YYABORT; @@ -39853,7 +39871,7 @@ YYSTYPE yylval; case 2526: /* Line 1455 of yacc.c */ -#line 14496 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14508 "/home/buildbot/git/sql/sql_yacc.yy" { /* Remove from the name resolution context stack the context of the @@ -39866,42 +39884,42 @@ YYSTYPE yylval; case 2527: /* Line 1455 of yacc.c */ -#line 14506 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14518 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= 0; } break; case 2528: /* Line 1455 of yacc.c */ -#line 14507 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14519 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= 1; } break; case 2529: /* Line 1455 of yacc.c */ -#line 14508 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14520 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)= 1; } break; case 2530: /* Line 1455 of yacc.c */ -#line 14512 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14524 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.is_not_empty)= false; } break; case 2531: /* Line 1455 of yacc.c */ -#line 14513 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14525 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.is_not_empty)= true; } break; case 2532: /* Line 1455 of yacc.c */ -#line 14517 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14529 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; DBUG_ASSERT(lex->current_select->linkage != GLOBAL_OPTIONS_TYPE); @@ -39921,7 +39939,7 @@ YYSTYPE yylval; case 2533: /* Line 1455 of yacc.c */ -#line 14532 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14544 "/home/buildbot/git/sql/sql_yacc.yy" { thd->lex->current_select->no_table_names_allowed= 0; thd->where= ""; @@ -39931,28 +39949,28 @@ YYSTYPE yylval; case 2536: /* Line 1455 of yacc.c */ -#line 14544 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14556 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)=1; } break; case 2537: /* Line 1455 of yacc.c */ -#line 14545 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14557 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)=1; } break; case 2538: /* Line 1455 of yacc.c */ -#line 14546 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14558 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.num)=0; } break; case 2539: /* Line 1455 of yacc.c */ -#line 14551 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14563 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.select_lex)= Lex->current_select->master_unit()->first_select(); } @@ -39961,7 +39979,7 @@ YYSTYPE yylval; case 2540: /* Line 1455 of yacc.c */ -#line 14555 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14567 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.select_lex)= Lex->current_select->master_unit()->first_select(); } @@ -39970,7 +39988,7 @@ YYSTYPE yylval; case 2542: /* Line 1455 of yacc.c */ -#line 14564 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14576 "/home/buildbot/git/sql/sql_yacc.yy" { if (add_select_to_union_list(Lex, (bool)(yyvsp[(3) - (3)].num), FALSE)) MYSQL_YYABORT; @@ -39980,7 +39998,7 @@ YYSTYPE yylval; case 2543: /* Line 1455 of yacc.c */ -#line 14570 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14582 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->pop_context(); (yyval.select_lex)= (yyvsp[(1) - (6)].select_lex); @@ -39990,7 +40008,7 @@ YYSTYPE yylval; case 2544: /* Line 1455 of yacc.c */ -#line 14579 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14591 "/home/buildbot/git/sql/sql_yacc.yy" { (yyval.select_lex)= (yyvsp[(2) - (3)].select_lex); } @@ -39999,7 +40017,7 @@ YYSTYPE yylval; case 2545: /* Line 1455 of yacc.c */ -#line 14585 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14597 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; if (!lex->expr_allows_subselect || @@ -40023,7 +40041,7 @@ YYSTYPE yylval; case 2546: /* Line 1455 of yacc.c */ -#line 14606 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14618 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex=Lex; @@ -40051,14 +40069,14 @@ YYSTYPE yylval; case 2551: /* Line 1455 of yacc.c */ -#line 14641 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14653 "/home/buildbot/git/sql/sql_yacc.yy" { Select->options|= SELECT_STRAIGHT_JOIN; } break; case 2552: /* Line 1455 of yacc.c */ -#line 14643 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14655 "/home/buildbot/git/sql/sql_yacc.yy" { if (check_simple_select()) MYSQL_YYABORT; @@ -40071,28 +40089,28 @@ YYSTYPE yylval; case 2553: /* Line 1455 of yacc.c */ -#line 14650 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14662 "/home/buildbot/git/sql/sql_yacc.yy" { Select->options|= SELECT_DISTINCT; } break; case 2554: /* Line 1455 of yacc.c */ -#line 14651 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14663 "/home/buildbot/git/sql/sql_yacc.yy" { Select->options|= SELECT_SMALL_RESULT; } break; case 2555: /* Line 1455 of yacc.c */ -#line 14652 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14664 "/home/buildbot/git/sql/sql_yacc.yy" { Select->options|= SELECT_BIG_RESULT; } break; case 2556: /* Line 1455 of yacc.c */ -#line 14654 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14666 "/home/buildbot/git/sql/sql_yacc.yy" { if (check_simple_select()) MYSQL_YYABORT; @@ -40103,7 +40121,7 @@ YYSTYPE yylval; case 2557: /* Line 1455 of yacc.c */ -#line 14660 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14672 "/home/buildbot/git/sql/sql_yacc.yy" { if (check_simple_select()) MYSQL_YYABORT; @@ -40114,35 +40132,35 @@ YYSTYPE yylval; case 2558: /* Line 1455 of yacc.c */ -#line 14665 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14677 "/home/buildbot/git/sql/sql_yacc.yy" { Select->options|= SELECT_ALL; } break; case 2559: /* Line 1455 of yacc.c */ -#line 14676 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14688 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2560: /* Line 1455 of yacc.c */ -#line 14678 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14690 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2561: /* Line 1455 of yacc.c */ -#line 14680 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14692 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2575: /* Line 1455 of yacc.c */ -#line 14713 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14725 "/home/buildbot/git/sql/sql_yacc.yy" { /* We have to distinguish missing DEFINER-clause from case when @@ -40158,7 +40176,7 @@ YYSTYPE yylval; case 2576: /* Line 1455 of yacc.c */ -#line 14727 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14739 "/home/buildbot/git/sql/sql_yacc.yy" { thd->lex->definer= get_current_user(thd, (yyvsp[(3) - (3)].lex_user)); } @@ -40167,77 +40185,77 @@ YYSTYPE yylval; case 2577: /* Line 1455 of yacc.c */ -#line 14740 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14752 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2578: /* Line 1455 of yacc.c */ -#line 14742 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14754 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2579: /* Line 1455 of yacc.c */ -#line 14744 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14756 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2580: /* Line 1455 of yacc.c */ -#line 14749 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14761 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_mode= VIEW_CREATE_OR_REPLACE; } break; case 2581: /* Line 1455 of yacc.c */ -#line 14754 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14766 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_algorithm= DTYPE_ALGORITHM_UNDEFINED; } break; case 2582: /* Line 1455 of yacc.c */ -#line 14756 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14768 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_algorithm= VIEW_ALGORITHM_MERGE; } break; case 2583: /* Line 1455 of yacc.c */ -#line 14758 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14770 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_algorithm= VIEW_ALGORITHM_TMPTABLE; } break; case 2584: /* Line 1455 of yacc.c */ -#line 14763 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14775 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_suid= VIEW_SUID_DEFAULT; } break; case 2585: /* Line 1455 of yacc.c */ -#line 14765 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14777 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_suid= VIEW_SUID_DEFINER; } break; case 2586: /* Line 1455 of yacc.c */ -#line 14767 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14779 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_suid= VIEW_SUID_INVOKER; } break; case 2587: /* Line 1455 of yacc.c */ -#line 14772 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14784 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; lex->sql_command= SQLCOM_CREATE_VIEW; @@ -40254,14 +40272,14 @@ YYSTYPE yylval; case 2589: /* Line 1455 of yacc.c */ -#line 14788 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14800 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2591: /* Line 1455 of yacc.c */ -#line 14794 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14806 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->view_list.push_back((LEX_STRING*) sql_memdup(&(yyvsp[(1) - (1)].lex_str), sizeof(LEX_STRING))); @@ -40271,7 +40289,7 @@ YYSTYPE yylval; case 2592: /* Line 1455 of yacc.c */ -#line 14799 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14811 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->view_list.push_back((LEX_STRING*) sql_memdup(&(yyvsp[(3) - (3)].lex_str), sizeof(LEX_STRING))); @@ -40281,7 +40299,7 @@ YYSTYPE yylval; case 2593: /* Line 1455 of yacc.c */ -#line 14806 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14818 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->parsing_options.allows_variable= FALSE; @@ -40295,7 +40313,7 @@ YYSTYPE yylval; case 2594: /* Line 1455 of yacc.c */ -#line 14815 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14827 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; uint len= YYLIP->get_cpp_ptr() - lex->create_view_select.str; @@ -40313,35 +40331,35 @@ YYSTYPE yylval; case 2597: /* Line 1455 of yacc.c */ -#line 14836 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14848 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_check= VIEW_CHECK_NONE; } break; case 2598: /* Line 1455 of yacc.c */ -#line 14838 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14850 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_check= VIEW_CHECK_CASCADED; } break; case 2599: /* Line 1455 of yacc.c */ -#line 14840 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14852 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_check= VIEW_CHECK_CASCADED; } break; case 2600: /* Line 1455 of yacc.c */ -#line 14842 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14854 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->create_view_check= VIEW_CHECK_LOCAL; } break; case 2601: /* Line 1455 of yacc.c */ -#line 14859 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14871 "/home/buildbot/git/sql/sql_yacc.yy" { /* $8 */ Lex->raw_trg_on_table_name_begin= YYLIP->get_tok_start(); } @@ -40350,7 +40368,7 @@ YYSTYPE yylval; case 2602: /* Line 1455 of yacc.c */ -#line 14865 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14877 "/home/buildbot/git/sql/sql_yacc.yy" { /* $12 */ Lex->raw_trg_on_table_name_end= YYLIP->get_tok_start(); } @@ -40359,7 +40377,7 @@ YYSTYPE yylval; case 2603: /* Line 1455 of yacc.c */ -#line 14870 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14882 "/home/buildbot/git/sql/sql_yacc.yy" { /* $15 */ LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -40393,7 +40411,7 @@ YYSTYPE yylval; case 2604: /* Line 1455 of yacc.c */ -#line 14899 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14911 "/home/buildbot/git/sql/sql_yacc.yy" { /* $17 */ LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -40422,7 +40440,7 @@ YYSTYPE yylval; case 2605: /* Line 1455 of yacc.c */ -#line 14933 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14945 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; if (is_native_function(thd, & (yyvsp[(4) - (8)].lex_str))) @@ -40443,7 +40461,7 @@ YYSTYPE yylval; case 2606: /* Line 1455 of yacc.c */ -#line 14950 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14962 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; if (is_native_function(thd, & (yyvsp[(3) - (7)].lex_str))) @@ -40464,7 +40482,7 @@ YYSTYPE yylval; case 2607: /* Line 1455 of yacc.c */ -#line 14972 "/home/buildbot/git/sql/sql_yacc.yy" +#line 14984 "/home/buildbot/git/sql/sql_yacc.yy" { /* $5 */ LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -40499,7 +40517,7 @@ YYSTYPE yylval; case 2608: /* Line 1455 of yacc.c */ -#line 15003 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15015 "/home/buildbot/git/sql/sql_yacc.yy" { /* $8 */ Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); } @@ -40508,7 +40526,7 @@ YYSTYPE yylval; case 2609: /* Line 1455 of yacc.c */ -#line 15007 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15019 "/home/buildbot/git/sql/sql_yacc.yy" { /* $10 */ LEX *lex= Lex; lex->charset= NULL; @@ -40522,7 +40540,7 @@ YYSTYPE yylval; case 2610: /* Line 1455 of yacc.c */ -#line 15016 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15028 "/home/buildbot/git/sql/sql_yacc.yy" { /* $12 */ LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -40550,7 +40568,7 @@ YYSTYPE yylval; case 2611: /* Line 1455 of yacc.c */ -#line 15039 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15051 "/home/buildbot/git/sql/sql_yacc.yy" { /* $14 */ LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -40563,7 +40581,7 @@ YYSTYPE yylval; case 2612: /* Line 1455 of yacc.c */ -#line 15047 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15059 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; sp_head *sp= lex->sphead; @@ -40620,7 +40638,7 @@ YYSTYPE yylval; case 2613: /* Line 1455 of yacc.c */ -#line 15102 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15114 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; sp_head *sp; @@ -40649,7 +40667,7 @@ YYSTYPE yylval; case 2614: /* Line 1455 of yacc.c */ -#line 15126 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15138 "/home/buildbot/git/sql/sql_yacc.yy" { const char* tmp_param_begin; @@ -40662,7 +40680,7 @@ YYSTYPE yylval; case 2615: /* Line 1455 of yacc.c */ -#line 15135 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15147 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; @@ -40674,7 +40692,7 @@ YYSTYPE yylval; case 2616: /* Line 1455 of yacc.c */ -#line 15142 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15154 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= thd->lex; @@ -40686,7 +40704,7 @@ YYSTYPE yylval; case 2617: /* Line 1455 of yacc.c */ -#line 15149 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -40700,7 +40718,7 @@ YYSTYPE yylval; case 2618: /* Line 1455 of yacc.c */ -#line 15163 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15175 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_XA_START; } @@ -40709,7 +40727,7 @@ YYSTYPE yylval; case 2619: /* Line 1455 of yacc.c */ -#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15179 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_XA_END; } @@ -40718,7 +40736,7 @@ YYSTYPE yylval; case 2620: /* Line 1455 of yacc.c */ -#line 15171 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15183 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_XA_PREPARE; } @@ -40727,7 +40745,7 @@ YYSTYPE yylval; case 2621: /* Line 1455 of yacc.c */ -#line 15175 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15187 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_XA_COMMIT; } @@ -40736,7 +40754,7 @@ YYSTYPE yylval; case 2622: /* Line 1455 of yacc.c */ -#line 15179 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15191 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_XA_ROLLBACK; } @@ -40745,7 +40763,7 @@ YYSTYPE yylval; case 2623: /* Line 1455 of yacc.c */ -#line 15183 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15195 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->sql_command = SQLCOM_XA_RECOVER; } @@ -40754,7 +40772,7 @@ YYSTYPE yylval; case 2624: /* Line 1455 of yacc.c */ -#line 15190 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15202 "/home/buildbot/git/sql/sql_yacc.yy" { MYSQL_YYABORT_UNLESS((yyvsp[(1) - (1)].string)->length() <= MAXGTRIDSIZE); if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID)))) @@ -40766,7 +40784,7 @@ YYSTYPE yylval; case 2625: /* Line 1455 of yacc.c */ -#line 15197 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15209 "/home/buildbot/git/sql/sql_yacc.yy" { MYSQL_YYABORT_UNLESS((yyvsp[(1) - (3)].string)->length() <= MAXGTRIDSIZE && (yyvsp[(3) - (3)].string)->length() <= MAXBQUALSIZE); if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID)))) @@ -40778,7 +40796,7 @@ YYSTYPE yylval; case 2626: /* Line 1455 of yacc.c */ -#line 15204 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15216 "/home/buildbot/git/sql/sql_yacc.yy" { MYSQL_YYABORT_UNLESS((yyvsp[(1) - (5)].string)->length() <= MAXGTRIDSIZE && (yyvsp[(3) - (5)].string)->length() <= MAXBQUALSIZE); if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID)))) @@ -40790,84 +40808,84 @@ YYSTYPE yylval; case 2627: /* Line 1455 of yacc.c */ -#line 15213 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15225 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2628: /* Line 1455 of yacc.c */ -#line 15214 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15226 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2629: /* Line 1455 of yacc.c */ -#line 15218 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15230 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->xa_opt=XA_NONE; } break; case 2630: /* Line 1455 of yacc.c */ -#line 15219 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15231 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->xa_opt=XA_JOIN; } break; case 2631: /* Line 1455 of yacc.c */ -#line 15220 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15232 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->xa_opt=XA_RESUME; } break; case 2632: /* Line 1455 of yacc.c */ -#line 15224 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15236 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->xa_opt=XA_NONE; } break; case 2633: /* Line 1455 of yacc.c */ -#line 15225 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15237 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->xa_opt=XA_ONE_PHASE; } break; case 2634: /* Line 1455 of yacc.c */ -#line 15230 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15242 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->xa_opt=XA_NONE; } break; case 2635: /* Line 1455 of yacc.c */ -#line 15232 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15244 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->xa_opt=XA_SUSPEND; } break; case 2637: /* Line 1455 of yacc.c */ -#line 15237 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15249 "/home/buildbot/git/sql/sql_yacc.yy" {} break; case 2638: /* Line 1455 of yacc.c */ -#line 15238 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15250 "/home/buildbot/git/sql/sql_yacc.yy" { Lex->xa_opt=XA_FOR_MIGRATE; } break; case 2639: /* Line 1455 of yacc.c */ -#line 15243 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15255 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_INSTALL_PLUGIN; @@ -40879,7 +40897,7 @@ YYSTYPE yylval; case 2640: /* Line 1455 of yacc.c */ -#line 15250 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15262 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_INSTALL_PLUGIN; @@ -40891,7 +40909,7 @@ YYSTYPE yylval; case 2641: /* Line 1455 of yacc.c */ -#line 15260 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15272 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_UNINSTALL_PLUGIN; @@ -40902,7 +40920,7 @@ YYSTYPE yylval; case 2642: /* Line 1455 of yacc.c */ -#line 15266 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15278 "/home/buildbot/git/sql/sql_yacc.yy" { LEX *lex= Lex; lex->sql_command= SQLCOM_UNINSTALL_PLUGIN; @@ -40914,7 +40932,7 @@ YYSTYPE yylval; case 2643: /* Line 1455 of yacc.c */ -#line 15277 "/home/buildbot/git/sql/sql_yacc.yy" +#line 15289 "/home/buildbot/git/sql/sql_yacc.yy" { YYERROR; } @@ -40923,7 +40941,7 @@ YYSTYPE yylval; /* Line 1455 of yacc.c */ -#line 40927 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" +#line 40945 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ec246ae807968a954549bc57222e20939880cb6e..a49dea6380e32e78b0b69f82914da5443a099dbc 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -10612,8 +10612,20 @@ procedure_clause: if (add_proc_to_list(lex->thd, item)) MYSQL_YYABORT; Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + + /* + PROCEDURE CLAUSE cannot handle subquery as one of its parameter, + so set expr_allows_subselect as false to disallow any subqueries + further. Reset expr_allows_subselect back to true once the + parameters are reduced. + */ + Lex->expr_allows_subselect= false; } '(' procedure_list ')' + { + /* Subqueries are allowed from now.*/ + Lex->expr_allows_subselect= true; + } ; procedure_list: diff --git a/sql/table.cc b/sql/table.cc index e4dee77171d195a32d150863bec5293735edb262..f521056aaee089ac9cfa186aafc55931fc9f1391 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -5194,7 +5194,7 @@ Item *Field_iterator_table::create_item(THD *thd) if (item && thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY && !thd->lex->in_sum_func && select->cur_pos_in_select_list != UNDEF_POS) { - select->non_agg_fields.push_back(item); + select->join->non_agg_fields.push_back(item); item->marker= select->cur_pos_in_select_list; select->set_non_agg_field_used(true); } diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 861f2a9bd0db7d0709b4c17ba4dfbb57f4a9012d..cc494a7cd7a783e7fc762d7f5f387ca8588aa968 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -88,6 +88,18 @@ IF(NOT CMAKE_CROSSCOMPILING) CHECK_C_SOURCE_RUNS( "#include int main() + { + unsigned char c; + + __atomic_test_and_set(&c, __ATOMIC_ACQUIRE); + __atomic_clear(&c, __ATOMIC_RELEASE); + return(0); + }" + HAVE_IB_GCC_ATOMIC_TEST_AND_SET + ) + CHECK_C_SOURCE_RUNS( + "#include + int main() { __sync_synchronize(); return(0); @@ -110,6 +122,10 @@ IF(HAVE_IB_GCC_ATOMIC_BUILTINS) ADD_DEFINITIONS(-DHAVE_IB_GCC_ATOMIC_BUILTINS=1) ENDIF() +IF(HAVE_IB_GCC_ATOMIC_TEST_AND_SET) + ADD_DEFINITIONS(-DHAVE_IB_GCC_ATOMIC_TEST_AND_SET=1) +ENDIF() + IF(HAVE_IB_GCC_SYNC_SYNCHRONISE) ADD_DEFINITIONS(-DHAVE_IB_GCC_SYNC_SYNCHRONISE=1) ENDIF() diff --git a/storage/innobase/btr/btr0cur.c b/storage/innobase/btr/btr0cur.c index 51dcb498327f00b489d93b8f1d5f3c8b5f8b394b..3b533909e676d5295a980b4bb7056397472060f4 100644 --- a/storage/innobase/btr/btr0cur.c +++ b/storage/innobase/btr/btr0cur.c @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1994, 2013, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1994, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Portions of this file contain modifications contributed and copyrighted by @@ -2085,6 +2085,7 @@ btr_cur_optimistic_update( ulint max_size; ulint new_rec_size; ulint old_rec_size; + ulint max_ins_size = 0; dtuple_t* new_entry; roll_ptr_t roll_ptr; trx_t* trx; @@ -2195,6 +2196,11 @@ btr_cur_optimistic_update( : (old_rec_size + page_get_max_insert_size_after_reorganize(page, 1)); + if (!page_zip) { + max_ins_size = page_get_max_insert_size_after_reorganize( + page, 1); + } + if (!(((max_size >= BTR_CUR_PAGE_REORGANIZE_LIMIT) && (max_size >= new_rec_size)) || (page_get_n_recs(page) <= 1))) { @@ -2246,10 +2252,14 @@ btr_cur_optimistic_update( rec = btr_cur_insert_if_possible(cursor, new_entry, 0/*n_ext*/, mtr); ut_a(rec); /* <- We calculated above the insert would fit */ - if (page_zip && !dict_index_is_clust(index) + if (!dict_index_is_clust(index) && page_is_leaf(page)) { /* Update the free bits in the insert buffer. */ - ibuf_update_free_bits_zip(block, mtr); + if (page_zip) { + ibuf_update_free_bits_zip(block, mtr); + } else { + ibuf_update_free_bits_low(block, max_ins_size, mtr); + } } /* Restore the old explicit lock state on the record */ @@ -2358,6 +2368,7 @@ btr_cur_pessimistic_update( ulint n_reserved; ulint n_ext; ulint* offsets = NULL; + ulint max_ins_size = 0; *big_rec = NULL; @@ -2495,6 +2506,11 @@ btr_cur_pessimistic_update( ut_ad(flags & BTR_KEEP_POS_FLAG); } + if (!page_zip) { + max_ins_size = page_get_max_insert_size_after_reorganize( + page, 1); + } + /* Store state of explicit locks on rec on the page infimum record, before deleting rec. The page infimum acts as a dummy carrier of the locks, taking care also of lock releases, before we can move the locks @@ -2540,10 +2556,15 @@ btr_cur_pessimistic_update( big_rec_vec != NULL && (flags & BTR_KEEP_POS_FLAG), mtr); - if (page_zip && !dict_index_is_clust(index) + if (!dict_index_is_clust(index) && page_is_leaf(page)) { /* Update the free bits in the insert buffer. */ - ibuf_update_free_bits_zip(block, mtr); + if (page_zip) { + ibuf_update_free_bits_zip(block, mtr); + } else { + ibuf_update_free_bits_low(block, max_ins_size, + mtr); + } } err = DB_SUCCESS; diff --git a/storage/innobase/dict/dict0crea.c b/storage/innobase/dict/dict0crea.c index ac8a1eac03cf7a2918b7adb3f6541852bb5c1289..dcbca492b084862967705df9918100ab9ee1ffac 100644 --- a/storage/innobase/dict/dict0crea.c +++ b/storage/innobase/dict/dict0crea.c @@ -1419,6 +1419,104 @@ dict_create_add_foreign_field_to_dictionary( table, foreign, trx)); } +/********************************************************************//** +Construct foreign key constraint defintion from data dictionary information. +*/ +UNIV_INTERN +char* +dict_foreign_def_get( +/*=================*/ + dict_foreign_t* foreign,/*!< in: foreign */ + trx_t* trx) /*!< in: trx */ +{ + char* fk_def = mem_heap_alloc(foreign->heap, 4*1024); + const char* tbname; + char tablebuf[MAX_TABLE_NAME_LEN + 1] = ""; + int i; + char* bufend; + + tbname = dict_remove_db_name(foreign->id); + bufend = innobase_convert_name(tablebuf, MAX_TABLE_NAME_LEN, + tbname, strlen(tbname), trx->mysql_thd, FALSE); + tablebuf[bufend - tablebuf] = '\0'; + + sprintf(fk_def, + (char *)"CONSTRAINT %s FOREIGN KEY (", (char *)tablebuf); + + for(i = 0; i < foreign->n_fields; i++) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + foreign->foreign_col_names[i], + strlen(foreign->foreign_col_names[i]), + trx->mysql_thd, FALSE); + strcat(fk_def, buf); + if (i < foreign->n_fields-1) { + strcat(fk_def, (char *)","); + } + } + + strcat(fk_def,(char *)") REFERENCES "); + + bufend = innobase_convert_name(tablebuf, MAX_TABLE_NAME_LEN, + foreign->referenced_table_name, + strlen(foreign->referenced_table_name), + trx->mysql_thd, TRUE); + tablebuf[bufend - tablebuf] = '\0'; + + strcat(fk_def, tablebuf); + strcat(fk_def, " ("); + + for(i = 0; i < foreign->n_fields; i++) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + bufend = innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + foreign->referenced_col_names[i], + strlen(foreign->referenced_col_names[i]), + trx->mysql_thd, FALSE); + buf[bufend - buf] = '\0'; + strcat(fk_def, buf); + if (i < foreign->n_fields-1) { + strcat(fk_def, (char *)","); + } + } + strcat(fk_def, (char *)")"); + + return fk_def; +} + +/********************************************************************//** +Convert foreign key column names from data dictionary to SQL-layer. +*/ +static +void +dict_foreign_def_get_fields( +/*========================*/ + dict_foreign_t* foreign,/*!< in: foreign */ + trx_t* trx, /*!< in: trx */ + char** field, /*!< out: foreign column */ + char** field2, /*!< out: referenced column */ + int col_no) /*!< in: column number */ +{ + char* bufend; + char* fieldbuf = mem_heap_alloc(foreign->heap, MAX_TABLE_NAME_LEN+1); + char* fieldbuf2 = mem_heap_alloc(foreign->heap, MAX_TABLE_NAME_LEN+1); + + bufend = innobase_convert_name(fieldbuf, MAX_TABLE_NAME_LEN, + foreign->foreign_col_names[col_no], + strlen(foreign->foreign_col_names[col_no]), + trx->mysql_thd, FALSE); + + fieldbuf[bufend - fieldbuf] = '\0'; + + bufend = innobase_convert_name(fieldbuf2, MAX_TABLE_NAME_LEN, + foreign->referenced_col_names[col_no], + strlen(foreign->referenced_col_names[col_no]), + trx->mysql_thd, FALSE); + + fieldbuf2[bufend - fieldbuf2] = '\0'; + *field = fieldbuf; + *field2 = fieldbuf2; +} + /********************************************************************//** Add a single foreign key definition to the data dictionary tables in the database. We also generate names to constraints that were not named by the @@ -1501,6 +1599,29 @@ dict_create_add_foreign_to_dictionary( if (error != DB_SUCCESS) { + if (error == DB_DUPLICATE_KEY) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + char tablename[MAX_TABLE_NAME_LEN + 1] = ""; + char* fk_def; + + innobase_convert_name(tablename, MAX_TABLE_NAME_LEN, + table->name, strlen(table->name), + trx->mysql_thd, TRUE); + + innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + foreign->id, strlen(foreign->id), trx->mysql_thd, FALSE); + + fk_def = dict_foreign_def_get(foreign, trx); + + ib_push_warning(trx, error, + "Create or Alter table %s with foreign key constraint" + " failed. Foreign key constraint %s" + " already exists on data dictionary." + " Foreign key constraint names need to be unique in database." + " Error in foreign key definition: %s.", + tablename, buf, fk_def); + } + return(error); } @@ -1509,6 +1630,26 @@ dict_create_add_foreign_to_dictionary( i, table, foreign, trx); if (error != DB_SUCCESS) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + char tablename[MAX_TABLE_NAME_LEN + 1] = ""; + char* field=NULL; + char* field2=NULL; + char* fk_def; + + innobase_convert_name(tablename, MAX_TABLE_NAME_LEN, + table->name, strlen(table->name), + trx->mysql_thd, TRUE); + innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + foreign->id, strlen(foreign->id), trx->mysql_thd, FALSE); + fk_def = dict_foreign_def_get(foreign, trx); + dict_foreign_def_get_fields(foreign, trx, &field, &field2, i); + + ib_push_warning(trx, error, + "Create or Alter table %s with foreign key constraint" + " failed. Error adding foreign key constraint name %s" + " fields %s or %s to the dictionary." + " Error in foreign key definition: %s.", + tablename, buf, i+1, fk_def); return(error); } @@ -1593,7 +1734,7 @@ dict_create_add_foreigns_to_dictionary( foreign = UT_LIST_GET_NEXT(foreign_list, foreign)) { error = dict_create_add_foreign_to_dictionary(&number, table, - foreign, trx); + foreign, trx); if (error != DB_SUCCESS) { diff --git a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c index cbb17fc5a6fae2aaabb012f67e44e4f913a89380..ad9003853256c2d0bde9a7ec519d8c8926057b08 100644 --- a/storage/innobase/dict/dict0dict.c +++ b/storage/innobase/dict/dict0dict.c @@ -2534,8 +2534,9 @@ dict_foreign_remove_from_cache( const ib_rbt_node_t* node = rbt_lookup(rbt, foreign->id); - if (node) { - dict_foreign_t* val = *(dict_foreign_t**) node->value; + if (node != NULL) { + dict_foreign_t* val + = *(dict_foreign_t**) node->value; if (val == foreign) { rbt_delete(rbt, foreign->id); @@ -2555,9 +2556,10 @@ dict_foreign_remove_from_cache( if (rbt != NULL && foreign->id != NULL) { const ib_rbt_node_t* node = rbt_lookup(rbt, foreign->id); - if (node) { - dict_foreign_t* val = *(dict_foreign_t**) node->value; + if (node != NULL) { + dict_foreign_t* val + = *(dict_foreign_t**) node->value; if (val == foreign) { rbt_delete(rbt, foreign->id); @@ -2614,6 +2616,11 @@ dict_foreign_find( DBUG_RETURN(NULL); } +#define DB_FOREIGN_KEY_IS_PREFIX_INDEX 200 +#define DB_FOREIGN_KEY_COL_NOT_NULL 201 +#define DB_FOREIGN_KEY_COLS_NOT_EQUAL 202 +#define DB_FOREIGN_KEY_INDEX_NOT_FOUND 203 + /*********************************************************************//** Tries to find an index whose first fields are the columns in the array, in the same order and is not marked for deletion and is not the same @@ -2631,12 +2638,21 @@ dict_foreign_find_index( ibool check_charsets, /*!< in: whether to check charsets. only has an effect if types_idx != NULL */ - ulint check_null) + ulint check_null, /*!< in: nonzero if none of the columns must be declared NOT NULL */ + ulint* error, /*!< out: error code */ + ulint* err_col_no, + /*!< out: column number where error happened */ + dict_index_t** err_index) + /*!< out: index where error happened */ { dict_index_t* index; + if (error) { + *error = DB_FOREIGN_KEY_INDEX_NOT_FOUND; + } + index = dict_table_get_first_index(table); while (index != NULL) { @@ -2662,6 +2678,12 @@ dict_foreign_find_index( /* We do not accept column prefix indexes here */ + if (error && err_col_no && err_index) { + *error = DB_FOREIGN_KEY_IS_PREFIX_INDEX; + *err_col_no = i; + *err_index = index; + } + break; } @@ -2673,6 +2695,11 @@ dict_foreign_find_index( if (check_null && (field->col->prtype & DATA_NOT_NULL)) { + if (error && err_col_no && err_index) { + *error = DB_FOREIGN_KEY_COL_NOT_NULL; + *err_col_no = i; + *err_index = index; + } return(NULL); } @@ -2682,6 +2709,12 @@ dict_foreign_find_index( i), check_charsets)) { + if (error && err_col_no && err_index) { + *error = DB_FOREIGN_KEY_COLS_NOT_EQUAL; + *err_col_no = i; + *err_index = index; + } + break; } } @@ -2689,6 +2722,10 @@ dict_foreign_find_index( if (i == n_cols) { /* We found a matching index */ + if (error) { + *error = DB_SUCCESS; + } + return(index); } } @@ -2720,7 +2757,7 @@ dict_foreign_find_equiv_index( foreign->foreign_table, foreign->foreign_col_names, foreign->n_fields, foreign->foreign_index, TRUE, /* check types */ - FALSE/* allow columns to be NULL */)); + FALSE/* allow columns to be NULL */, NULL, NULL, NULL)); } #endif /* !UNIV_HOTBACKUP */ @@ -2883,11 +2920,15 @@ dict_foreign_add_to_cache( } if (for_in_cache->referenced_table == NULL && ref_table) { + ulint index_error; + ulint err_col; + dict_index_t *err_index=NULL; + index = dict_foreign_find_index( ref_table, for_in_cache->referenced_col_names, for_in_cache->n_fields, for_in_cache->foreign_index, - check_charsets, FALSE); + check_charsets, FALSE, &index_error, &err_col, &err_index); if (index == NULL && !(ignore_err & DICT_ERR_IGNORE_FK_NOKEY)) { @@ -2919,6 +2960,9 @@ dict_foreign_add_to_cache( } if (for_in_cache->foreign_table == NULL && for_table) { + ulint index_error; + ulint err_col; + dict_index_t* err_index=NULL; index = dict_foreign_find_index( for_table, @@ -2927,7 +2971,8 @@ dict_foreign_add_to_cache( for_in_cache->referenced_index, check_charsets, for_in_cache->type & (DICT_FOREIGN_ON_DELETE_SET_NULL - | DICT_FOREIGN_ON_UPDATE_SET_NULL)); + | DICT_FOREIGN_ON_UPDATE_SET_NULL), + &index_error, &err_col, &err_index); if (index == NULL && !(ignore_err & DICT_ERR_IGNORE_FK_NOKEY)) { @@ -3538,6 +3583,8 @@ static void dict_foreign_report_syntax_err( /*===========================*/ + const char* fmt, /*!< in: syntax err msg */ + const char* oper, /*!< in: operation */ const char* name, /*!< in: table name */ const char* start_of_latest_foreign, /*!< in: start of the foreign key clause @@ -3548,11 +3595,101 @@ dict_foreign_report_syntax_err( mutex_enter(&dict_foreign_err_mutex); dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\nSyntax error close to:\n%s\n", - start_of_latest_foreign, ptr); + fprintf(ef, fmt, oper, name, start_of_latest_foreign, ptr); mutex_exit(&dict_foreign_err_mutex); } +/*********************************************************************//** +Push warning message to SQL-layer based on foreign key constraint +index match error. */ +static +void +dict_foreign_push_index_error( +/*==========================*/ + trx_t* trx, /*!< in: trx */ + const char* operation, /*!< in: operation create or alter + */ + const char* create_name, /*!< in: table name in create or + alter table */ + const char* latest_foreign, /*!< in: start of latest foreign key + constraint name */ + const char** columns, /*!< in: foreign key columns */ + ulint index_error, /*!< in: error code */ + ulint err_col, /*!< in: column where error happened + */ + dict_index_t* err_index, /*!< in: index where error happened + */ + dict_table_t* table, /*!< in: table */ + FILE* ef) /*!< in: output stream */ +{ + switch (index_error) { + case DB_FOREIGN_KEY_INDEX_NOT_FOUND: { + fprintf(ef, + "%s table '%s' with foreign key constraint" + " failed. There is no index in the referenced" + " table where the referenced columns appear" + " as the first columns. Error close to %s.\n", + operation, create_name, latest_foreign); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table '%s' with foreign key constraint" + " failed. There is no index in the referenced" + " table where the referenced columns appear" + " as the first columns. Error close to %s.", + operation, create_name, latest_foreign); + break; + } + case DB_FOREIGN_KEY_IS_PREFIX_INDEX: { + fprintf(ef, + "%s table '%s' with foreign key constraint" + " failed. There is only prefix index in the referenced" + " table where the referenced columns appear" + " as the first columns. Error close to %s.\n", + operation, create_name, latest_foreign); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table '%s' with foreign key constraint" + " failed. There is only prefix index in the referenced" + " table where the referenced columns appear" + " as the first columns. Error close to %s.", + operation, create_name, latest_foreign); + break; + } + case DB_FOREIGN_KEY_COL_NOT_NULL: { + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. You have defined a SET NULL condition but " + "field %s on index is defined as NOT NULL close to %s\n", + operation, create_name, columns[err_col], latest_foreign); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. You have defined a SET NULL condition but " + "field %s on index is defined as NOT NULL close to %s", + operation, create_name, columns[err_col], latest_foreign); + break; + } + case DB_FOREIGN_KEY_COLS_NOT_EQUAL: { + dict_field_t* field; + const char* col_name; + field = dict_index_get_nth_field(err_index, err_col); + + col_name = dict_table_get_col_name( + table, dict_col_get_no(field->col)); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. Field type or character set for column %s " + "does not mach referenced column %s close to %s\n", + operation, create_name, columns[err_col], col_name, latest_foreign); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Field type or character set for column %s " + "does not mach referenced column %s close to %s", + operation, create_name, columns[err_col], col_name, latest_foreign); + break; + } + default: + ut_error; + } +} + /*********************************************************************//** Scans a table create SQL string and adds to the data dictionary the foreign key constraints declared in the string. This function should be called after @@ -3581,15 +3718,20 @@ dict_create_foreign_constraints_low( DB_CANNOT_ADD_CONSTRAINT if any foreign keys are found. */ { - dict_table_t* table; - dict_table_t* referenced_table; - dict_table_t* table_to_alter; + dict_table_t* table = NULL; + dict_table_t* referenced_table = NULL; + dict_table_t* table_to_alter = NULL; + dict_table_t* table_to_create = NULL; ulint highest_id_so_far = 0; - dict_index_t* index; - dict_foreign_t* foreign; + dict_index_t* index = NULL; + dict_foreign_t* foreign = NULL; const char* ptr = sql_string; const char* start_of_latest_foreign = sql_string; + const char* start_of_latest_set = NULL; FILE* ef = dict_foreign_err_file; + ulint index_error = DB_SUCCESS; + dict_index_t* err_index = NULL; + ulint err_col; const char* constraint_name; ibool success; ulint error; @@ -3602,29 +3744,68 @@ dict_create_foreign_constraints_low( ulint n_on_updates; const dict_col_t*columns[500]; const char* column_names[500]; + const char* ref_column_names[500]; const char* referenced_table_name; + const char* create_table_name; + const char* orig; + char create_name[MAX_TABLE_NAME_LEN + 1]; + const char operation[8]; ut_ad(mutex_own(&(dict_sys->mutex))); table = dict_table_get_low(name, DICT_ERR_IGNORE_NONE); + /* First check if we are actually doing an ALTER TABLE, and in that + case look for the table being altered */ + ptr = dict_accept(cs, ptr, "ALTER", &success); + + strcpy((char *)operation, success ? "Alter " : "Create "); + + if (!success) { + orig = ptr; + ptr = dict_scan_to(ptr, "CREATE"); + ptr = dict_scan_to(ptr, "TABLE"); + ptr = dict_accept(cs, ptr, "TABLE", &success); + + if (success) { + ptr = dict_scan_table_name(cs, ptr, &table_to_create, name, + &success, heap, &create_table_name); + } + + if (success) { + char *bufend; + bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, + create_table_name, strlen(create_table_name), + trx->mysql_thd, TRUE); + create_name[bufend-create_name]='\0'; + ptr = orig; + } else { + char *bufend; + ptr = orig; + bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, + name, strlen(name), trx->mysql_thd, TRUE); + create_name[bufend-create_name]='\0'; + } + + goto loop; + } if (table == NULL) { mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, - "Cannot find the table in the internal" - " data dictionary of InnoDB.\n" - "Create table statement:\n%s\n", sql_string); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, "%s table %s with foreign key constraint" + " failed. Table %s not found from data dictionary." + " Error close to %s.\n", + operation, create_name, create_name, start_of_latest_foreign); mutex_exit(&dict_foreign_err_mutex); - + ib_push_warning(trx, DB_ERROR, + "%s table %s with foreign key constraint" + " failed. Table %s not found from data dictionary." + " Error close to %s.", + operation, create_name, create_name, start_of_latest_foreign); return(DB_ERROR); } - /* First check if we are actually doing an ALTER TABLE, and in that - case look for the table being altered */ - - ptr = dict_accept(cs, ptr, "ALTER", &success); - + /* If not alter table jump to loop */ if (!success) { goto loop; @@ -3639,13 +3820,40 @@ dict_create_foreign_constraints_low( /* We are doing an ALTER TABLE: scan the table name we are altering */ + orig = ptr; ptr = dict_scan_table_name(cs, ptr, &table_to_alter, name, &success, heap, &referenced_table_name); + + if (table_to_alter) { + char *bufend; + bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, + table_to_alter->name, strlen(table_to_alter->name), + trx->mysql_thd, TRUE); + create_name[bufend-create_name]='\0'; + } else { + char *bufend; + bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, + referenced_table_name, strlen(referenced_table_name), + trx->mysql_thd, TRUE); + create_name[bufend-create_name]='\0'; + + } + if (!success) { - fprintf(stderr, - "InnoDB: Error: could not find" - " the table being ALTERED in:\n%s\n", - sql_string); + mutex_enter(&dict_foreign_err_mutex); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. Table %s not found from data dictionary." + " Error close to %s.\n", + operation, create_name, create_name, orig); + mutex_exit(&dict_foreign_err_mutex); + + ib_push_warning(trx, DB_ERROR, + "%s table %s with foreign key constraint" + " failed. Table %s not found from data dictionary." + " Error close to %s.", + operation, create_name, create_name, orig); return(DB_ERROR); } @@ -3711,7 +3919,19 @@ dict_create_foreign_constraints_low( if so, immediately reject the command if the table is a temporary one. For now, this kludge will work. */ if (reject_fks && (UT_LIST_GET_LEN(table->foreign_list) > 0)) { + mutex_enter(&dict_foreign_err_mutex); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, "%s table %s with foreign key constraint" + " failed. Temporary tables can't have foreign key constraints." + " Error close to %s.\n", + operation, create_name, start_of_latest_foreign); + mutex_exit(&dict_foreign_err_mutex); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Temporary tables can't have foreign key constraints." + " Error close to %s.", + operation, create_name, start_of_latest_foreign); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3747,11 +3967,21 @@ dict_create_foreign_constraints_low( if (!success) { /* MySQL allows also an index id before the '('; we skip it */ + orig = ptr; ptr = dict_skip_word(cs, ptr, &success); if (!success) { dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3771,15 +4001,26 @@ dict_create_foreign_constraints_low( /* Scan the columns in the first list */ col_loop1: ut_a(i < (sizeof column_names) / sizeof *column_names); + orig = ptr; ptr = dict_scan_col(cs, ptr, &success, table, columns + i, heap, column_names + i); if (!success) { mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\nCannot resolve column name close to:\n%s\n", - start_of_latest_foreign, ptr); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + mutex_exit(&dict_foreign_err_mutex); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); + return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3791,11 +4032,22 @@ dict_create_foreign_constraints_low( goto col_loop1; } + orig = ptr; ptr = dict_accept(cs, ptr, ")", &success); if (!success) { dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); + return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3803,27 +4055,41 @@ dict_create_foreign_constraints_low( as the first fields and in the right order */ index = dict_foreign_find_index(table, column_names, i, - NULL, TRUE, FALSE); + NULL, TRUE, FALSE, &index_error, &err_col, &err_index); if (!index) { mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); + dict_foreign_error_report_low(ef, create_name); fputs("There is no index in table ", ef); - ut_print_name(ef, NULL, TRUE, name); + ut_print_name(ef, NULL, TRUE, create_name); fprintf(ef, " where the columns appear\n" "as the first columns. Constraint:\n%s\n" "See " REFMAN "innodb-foreign-key-constraints.html\n" "for correct foreign key definition.\n", start_of_latest_foreign); - mutex_exit(&dict_foreign_err_mutex); - return(DB_CHILD_NO_INDEX); + dict_foreign_push_index_error(trx, operation, create_name, start_of_latest_foreign, + column_names, index_error, err_col, err_index, table, ef); + + mutex_exit(&dict_foreign_err_mutex); + return(DB_CANNOT_ADD_CONSTRAINT); } + + orig = ptr; ptr = dict_accept(cs, ptr, "REFERENCES", &success); if (!success || !my_isspace(cs, *ptr)) { dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3872,24 +4138,50 @@ dict_create_foreign_constraints_low( checking of foreign key constraints! */ if (!success || (!referenced_table && trx->check_foreigns)) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + char* bufend; + + bufend = innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + referenced_table_name, strlen(referenced_table_name), + trx->mysql_thd, TRUE); + buf[bufend - buf] = '\0'; + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint failed. Referenced table %s not found in the data dictionary " + "close to %s.", + operation, create_name, buf, start_of_latest_foreign); + dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\nCannot resolve table name close to:\n" - "%s\n", - start_of_latest_foreign, ptr); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint failed. Referenced table %s not found in the data dictionary " + "close to %s.\n", + operation, create_name, buf, start_of_latest_foreign); + mutex_exit(&dict_foreign_err_mutex); return(DB_CANNOT_ADD_CONSTRAINT); } + orig = ptr; ptr = dict_accept(cs, ptr, "(", &success); if (!success) { dict_foreign_free(foreign); - dict_foreign_report_syntax_err(name, start_of_latest_foreign, - ptr); + dict_foreign_report_syntax_err( + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); + return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3897,20 +4189,29 @@ dict_create_foreign_constraints_low( i = 0; col_loop2: + orig = ptr; ptr = dict_scan_col(cs, ptr, &success, referenced_table, columns + i, - heap, column_names + i); + heap, ref_column_names + i); i++; if (!success) { dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\nCannot resolve column name close to:\n" - "%s\n", - start_of_latest_foreign, ptr); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + mutex_exit(&dict_foreign_err_mutex); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3920,13 +4221,25 @@ dict_create_foreign_constraints_low( goto col_loop2; } + orig = ptr; ptr = dict_accept(cs, ptr, ")", &success); if (!success || foreign->n_fields != i) { + + dict_foreign_report_syntax_err( + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s. Too few referenced columns.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s. Too few referenced columns, you have %d when you should have %d.", + operation, create_name, start_of_latest_foreign, orig, i, foreign->n_fields); + dict_foreign_free(foreign); - dict_foreign_report_syntax_err(name, start_of_latest_foreign, - ptr); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3936,6 +4249,7 @@ dict_create_foreign_constraints_low( scan_on_conditions: /* Loop here as long as we can find ON ... conditions */ + start_of_latest_set = ptr; ptr = dict_accept(cs, ptr, "ON", &success); if (!success) { @@ -3946,13 +4260,24 @@ dict_create_foreign_constraints_low( ptr = dict_accept(cs, ptr, "DELETE", &success); if (!success) { + orig = ptr; ptr = dict_accept(cs, ptr, "UPDATE", &success); if (!success) { dict_foreign_free(foreign); dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3984,12 +4309,22 @@ dict_create_foreign_constraints_low( ptr = dict_accept(cs, ptr, "NO", &success); if (success) { + orig = ptr; ptr = dict_accept(cs, ptr, "ACTION", &success); if (!success) { dict_foreign_free(foreign); dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4003,42 +4338,73 @@ dict_create_foreign_constraints_low( goto scan_on_conditions; } + orig = ptr; ptr = dict_accept(cs, ptr, "SET", &success); if (!success) { dict_foreign_free(foreign); - dict_foreign_report_syntax_err(name, start_of_latest_foreign, - ptr); + dict_foreign_report_syntax_err( + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + return(DB_CANNOT_ADD_CONSTRAINT); } + orig = ptr; ptr = dict_accept(cs, ptr, "NULL", &success); if (!success) { dict_foreign_free(foreign); - dict_foreign_report_syntax_err(name, start_of_latest_foreign, - ptr); + dict_foreign_report_syntax_err( + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); return(DB_CANNOT_ADD_CONSTRAINT); } for (j = 0; j < foreign->n_fields; j++) { if ((dict_index_get_nth_col(foreign->foreign_index, j)->prtype) & DATA_NOT_NULL) { + const dict_col_t* col + = dict_index_get_nth_col(foreign->foreign_index, j); + const char* col_name = dict_table_get_col_name(foreign->foreign_index->table, + dict_col_get_no(col)); /* It is not sensible to define SET NULL if the column is not allowed to be NULL! */ - dict_foreign_free(foreign); - mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\n" - "You have defined a SET NULL condition" - " though some of the\n" - "columns are defined as NOT NULL.\n", - start_of_latest_foreign); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. You have defined a SET NULL condition but column %s is defined as NOT NULL" + " in %s close to %s.\n", + operation, create_name, col_name, start_of_latest_foreign, start_of_latest_set); mutex_exit(&dict_foreign_err_mutex); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. You have defined a SET NULL condition but column %s is defined as NOT NULL" + " in %s close to %s.", + operation, create_name, col_name, start_of_latest_foreign, start_of_latest_set); + + dict_foreign_free(foreign); return(DB_CANNOT_ADD_CONSTRAINT); } } @@ -4055,16 +4421,22 @@ dict_create_foreign_constraints_low( if (n_on_deletes > 1 || n_on_updates > 1) { /* It is an error to define more than 1 action */ - dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\n" - "You have twice an ON DELETE clause" - " or twice an ON UPDATE clause.\n", - start_of_latest_foreign); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. You have more than one on delete or on update clause" + " in %s close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); mutex_exit(&dict_foreign_err_mutex); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. You have more than one on delete or on update clause" + " in %s close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + dict_foreign_free(foreign); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4074,13 +4446,13 @@ dict_create_foreign_constraints_low( if (referenced_table) { index = dict_foreign_find_index(referenced_table, - column_names, i, - foreign->foreign_index, - TRUE, FALSE); + ref_column_names, i, + foreign->foreign_index, + TRUE, FALSE, &index_error, &err_col, &err_index); if (!index) { dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); + dict_foreign_error_report_low(ef, create_name); fprintf(ef, "%s:\n" "Cannot find an index in the" " referenced table where the\n" @@ -4098,9 +4470,13 @@ dict_create_foreign_constraints_low( "innodb-foreign-key-constraints.html\n" "for correct foreign key definition.\n", start_of_latest_foreign); + + dict_foreign_push_index_error(trx, operation, create_name, start_of_latest_foreign, + column_names, index_error, err_col, err_index, referenced_table, ef); + mutex_exit(&dict_foreign_err_mutex); - return(DB_PARENT_NO_INDEX); + return(DB_CANNOT_ADD_CONSTRAINT); } } else { ut_a(trx->check_foreigns == FALSE); @@ -4118,7 +4494,7 @@ dict_create_foreign_constraints_low( i * sizeof(void*)); for (i = 0; i < foreign->n_fields; i++) { foreign->referenced_col_names[i] - = mem_heap_strdup(foreign->heap, column_names[i]); + = mem_heap_strdup(foreign->heap, ref_column_names[i]); } /* We found an ok constraint definition: add to the lists */ @@ -5251,7 +5627,8 @@ dict_table_replace_index_in_foreign_list( foreign->referenced_table, foreign->referenced_col_names, foreign->n_fields, index, - /*check_charsets=*/TRUE, /*check_null=*/FALSE); + /*check_charsets=*/TRUE, /*check_null=*/FALSE, + NULL, NULL, NULL); ut_ad(new_index || !trx->check_foreigns); ut_ad(!new_index || new_index->table == index->table); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 7c17f20ce406ea8dbdd8de47c33bb2b80fb59a88..2bdbdf7a19f8f2ec849feaa8caa30cb5cfdd5489 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -1597,6 +1597,7 @@ check_trx_exists( if (trx == NULL) { trx = innobase_trx_allocate(thd); + thd_set_ha_data(thd, innodb_hton_ptr, trx); } else if (UNIV_UNLIKELY(trx->magic_n != TRX_MAGIC_N)) { mem_analyze_corruption(trx); ut_error; @@ -12303,3 +12304,29 @@ ib_warn_row_too_big(const dict_table_t* table) " ROW_FORMAT=COMPRESSED ": "" , prefix ? DICT_MAX_FIXED_COL_LEN : 0); } + +/********************************************************************//** +Helper function to push warnings from InnoDB internals to SQL-layer. */ +extern "C" UNIV_INTERN +void +ib_push_warning( + trx_t* trx, /*!< in: trx */ + ulint error, /*!< in: error code to push as warning */ + const char *format,/*!< in: warning message */ + ...) +{ + va_list args; + THD *thd = (THD *)trx->mysql_thd; + char *buf; +#define MAX_BUF_SIZE 4*1024 + + va_start(args, format); + buf = (char *)my_malloc(MAX_BUF_SIZE, MYF(MY_WME)); + vsprintf(buf,format, args); + + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + convert_error_code_to_mysql(error, 0, thd), + buf); + my_free(buf); + va_end(args); +} diff --git a/storage/innobase/include/dict0crea.h b/storage/innobase/include/dict0crea.h index 9faf580b0cc0e15985dff7d0595bb053a18ceec1..a58bcb181aa8f8c5a9b526c7a7ec82847e8fd530 100644 --- a/storage/innobase/include/dict0crea.h +++ b/storage/innobase/include/dict0crea.h @@ -106,6 +106,17 @@ UNIV_INTERN ulint dict_create_or_check_foreign_constraint_tables(void); /*================================================*/ + +/********************************************************************//** +Construct foreign key constraint defintion from data dictionary information. +*/ +UNIV_INTERN +char* +dict_foreign_def_get( +/*=================*/ + dict_foreign_t* foreign,/*!< in: foreign */ + trx_t* trx); /*!< in: trx */ + /********************************************************************//** Adds foreign key definitions to data dictionary tables in the database. We look at table->foreign_list, and also generate names to constraints that were diff --git a/storage/innobase/include/ha_prototypes.h b/storage/innobase/include/ha_prototypes.h index 3859b45e8d112622ce4a4e510193a6d232f59003..a69d3d126a0af10c61e1fdf549ce2209147070a5 100644 --- a/storage/innobase/include/ha_prototypes.h +++ b/storage/innobase/include/ha_prototypes.h @@ -326,5 +326,14 @@ innobase_convert_to_filename_charset( const char* from, /* in: identifier to convert */ ulint len); /* in: length of 'to', in bytes */ +/********************************************************************//** +Helper function to push warnings from InnoDB internals to SQL-layer. */ +UNIV_INTERN +void +ib_push_warning( + trx_t* trx, /*!< in: trx */ + ulint error, /*!< in: error code to push as warning */ + const char *format,/*!< in: warning message */ + ...); #endif diff --git a/storage/innobase/include/os0sync.h b/storage/innobase/include/os0sync.h index 7fd1fde5e76cfa050d5e2c8f8e0f67617a822f42..22b0fa420eb4369f48541748492d13cac0b4de02 100644 --- a/storage/innobase/include/os0sync.h +++ b/storage/innobase/include/os0sync.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved. +Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Portions of this file contain modifications contributed and copyrighted by @@ -37,6 +37,20 @@ Created 9/6/1995 Heikki Tuuri #include "univ.i" #include "ut0lst.h" +#if defined __i386__ || defined __x86_64__ || defined _M_IX86 \ + || defined _M_X64 || defined __WIN__ + +#define IB_STRONG_MEMORY_MODEL + +#endif /* __i386__ || __x86_64__ || _M_IX86 || M_X64 || __WIN__ */ + +#ifdef HAVE_WINDOWS_ATOMICS +typedef LONG lock_word_t; /*!< On Windows, InterlockedExchange operates + on LONG variable */ +#else +typedef byte lock_word_t; +#endif + #ifdef __WIN__ /** Native event (slow)*/ typedef HANDLE os_native_event_t; @@ -321,31 +335,61 @@ amount of increment. */ # define os_atomic_increment_ulint(ptr, amount) \ os_atomic_increment(ptr, amount) -/**********************************************************//** -Returns the old value of *ptr, atomically sets *ptr to new_val */ - -#if defined(__powerpc__) || defined(__aarch64__) -/* - os_atomic_test_and_set_byte_release() should imply a release barrier before - setting, and a full barrier after. But __sync_lock_test_and_set() is only - documented as an aquire barrier. So on PowerPC we need to add the full - barrier explicitly. */ -# define os_atomic_test_and_set_byte_release(ptr, new_val) \ - do { __sync_lock_release(ptr); \ - __sync_synchronize(); } while (0) -#else -/* - On x86, __sync_lock_test_and_set() happens to be full barrier, due to - LOCK prefix. -*/ -# define os_atomic_test_and_set_byte_release(ptr, new_val) \ - __sync_lock_test_and_set(ptr, (byte) new_val) -#endif -/* - os_atomic_test_and_set_byte_acquire() is a full memory barrier on x86. But - in general, just an aquire barrier should be sufficient. */ -# define os_atomic_test_and_set_byte_acquire(ptr, new_val) \ - __sync_lock_test_and_set(ptr, (byte) new_val) +# if defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET) + +/** Do an atomic test-and-set. +@param[in,out] ptr Memory location to set to non-zero +@return the previous value */ +static inline +lock_word_t +os_atomic_test_and_set(volatile lock_word_t* ptr) +{ + return(__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE)); +} + +/** Do an atomic clear. +@param[in,out] ptr Memory location to set to zero */ +static inline +void +os_atomic_clear(volatile lock_word_t* ptr) +{ + __atomic_clear(ptr, __ATOMIC_RELEASE); +} + +# elif defined(IB_STRONG_MEMORY_MODEL) + +/** Do an atomic test and set. +@param[in,out] ptr Memory location to set to non-zero +@return the previous value */ +static inline +lock_word_t +os_atomic_test_and_set(volatile lock_word_t* ptr) +{ + return(__sync_lock_test_and_set(ptr, 1)); +} + +/** Do an atomic release. + +In theory __sync_lock_release should be used to release the lock. +Unfortunately, it does not work properly alone. The workaround is +that more conservative __sync_lock_test_and_set is used instead. + +Performance regression was observed at some conditions for Intel +architecture. Disable release barrier on Intel architecture for now. +@param[in,out] ptr Memory location to write to +@return the previous value */ +static inline +lock_word_t +os_atomic_clear(volatile lock_word_t* ptr) +{ + return(__sync_lock_test_and_set(ptr, 0)); +} + +# else + +# error "Unsupported platform" + +# endif /* HAVE_IB_GCC_ATOMIC_TEST_AND_SET */ #elif defined(HAVE_IB_SOLARIS_ATOMICS) @@ -394,13 +438,25 @@ amount of increment. */ # define os_atomic_increment_ulint(ptr, amount) \ atomic_add_long_nv(ptr, amount) -/**********************************************************//** -Returns the old value of *ptr, atomically sets *ptr to new_val */ - -# define os_atomic_test_and_set_byte_acquire(ptr, new_val) \ - atomic_swap_uchar(ptr, new_val) -# define os_atomic_test_and_set_byte_release(ptr, new_val) \ - atomic_swap_uchar(ptr, new_val) +/** Do an atomic xchg and set to non-zero. +@param[in,out] ptr Memory location to set to non-zero +@return the previous value */ +static inline +lock_word_t +os_atomic_test_and_set(volatile lock_word_t* ptr) +{ + return(atomic_swap_uchar(ptr, 1)); +} + +/** Do an atomic xchg and set to zero. +@param[in,out] ptr Memory location to set to zero +@return the previous value */ +static inline +lock_word_t +os_atomic_clear(volatile lock_word_t* ptr) +{ + return(atomic_swap_uchar(ptr, 0)); +} #elif defined(HAVE_WINDOWS_ATOMICS) @@ -442,15 +498,27 @@ amount of increment. */ # define os_atomic_increment_ulint(ptr, amount) \ ((ulint) (win_xchg_and_add(ptr, amount) + amount)) -/**********************************************************//** -Returns the old value of *ptr, atomically sets *ptr to new_val. -InterlockedExchange() operates on LONG, and the LONG will be -clobbered */ - -# define os_atomic_test_and_set_byte_acquire(ptr, new_val) \ - ((byte) InterlockedExchange(ptr, new_val)) -# define os_atomic_test_and_set_byte_release(ptr, new_val) \ - ((byte) InterlockedExchange(ptr, new_val)) +/** Do an atomic test and set. +InterlockedExchange() operates on LONG, and the LONG will be clobbered +@param[in,out] ptr Memory location to set to non-zero +@return the previous value */ +static inline +lock_word_t +os_atomic_test_and_set(volatile lock_word_t* ptr) +{ + return(InterlockedExchange(ptr, 1)); +} + +/** Do an atomic release. +InterlockedExchange() operates on LONG, and the LONG will be clobbered +@param[in,out] ptr Memory location to set to zero +@return the previous value */ +static inline +lock_word_t +os_atomic_clear(volatile lock_word_t* ptr) +{ + return(InterlockedExchange(ptr, 0)); +} #else # define IB_ATOMICS_STARTUP_MSG \ diff --git a/storage/innobase/include/row0purge.h b/storage/innobase/include/row0purge.h index fa9c9291d5d2afbc93c2f242655346ee8862af57..9a638c80493c10fd7eb2094c87dfc36904a51291 100644 --- a/storage/innobase/include/row0purge.h +++ b/storage/innobase/include/row0purge.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1997, 2009, Innobase Oy. All Rights Reserved. +Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -111,6 +111,17 @@ struct purge_node_struct{ purge of a row */ }; +#ifdef UNIV_DEBUG +/***********************************************************//** +Validate the persisent cursor in the purge node. The purge node has two +references to the clustered index record - one via the ref member, and the +other via the persistent cursor. These two references must match each +other if the found_clust flag is set. +@return true if the persistent cursor is consistent with the ref member.*/ +ibool +row_purge_validate_pcur(purge_node_t* node); +#endif /* UNIV_DEBUG */ + #ifndef UNIV_NONINL #include "row0purge.ic" #endif diff --git a/storage/innobase/include/sync0sync.h b/storage/innobase/include/sync0sync.h index 78f5b8dd02c9fd20317e3b2a2acec5f0c432dfb1..bc8d0d27be328af8493d4c48ab40cb317414fd51 100644 --- a/storage/innobase/include/sync0sync.h +++ b/storage/innobase/include/sync0sync.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2012, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Portions of this file contain modifications contributed and copyrighted by @@ -45,13 +45,6 @@ Created 9/5/1995 Heikki Tuuri extern my_bool timed_mutexes; #endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */ -#ifdef HAVE_WINDOWS_ATOMICS -typedef LONG lock_word_t; /*!< On Windows, InterlockedExchange operates - on LONG variable */ -#else -typedef byte lock_word_t; -#endif - #if defined UNIV_PFS_MUTEX || defined UNIV_PFS_RWLOCK /* There are mutexes/rwlocks that we want to exclude from instrumentation even if their corresponding performance schema diff --git a/storage/innobase/include/sync0sync.ic b/storage/innobase/include/sync0sync.ic index 8cf3eb45c3bc21f726efb4061ac7b2be3c7836eb..1120da8a3beab6233d60f8f8c23e8fa276888b47 100644 --- a/storage/innobase/include/sync0sync.ic +++ b/storage/innobase/include/sync0sync.ic @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved. +Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Portions of this file contain modifications contributed and copyrighted by @@ -80,7 +80,7 @@ mutex_test_and_set( mutex_t* mutex) /*!< in: mutex */ { #if defined(HAVE_ATOMIC_BUILTINS) - return(os_atomic_test_and_set_byte_acquire(&mutex->lock_word, 1)); + return(os_atomic_test_and_set(&mutex->lock_word)); #else ibool ret; @@ -108,10 +108,7 @@ mutex_reset_lock_word( mutex_t* mutex) /*!< in: mutex */ { #if defined(HAVE_ATOMIC_BUILTINS) - /* In theory __sync_lock_release should be used to release the lock. - Unfortunately, it does not work properly alone. The workaround is - that more conservative __sync_lock_test_and_set is used instead. */ - os_atomic_test_and_set_byte_release(&mutex->lock_word, 0); + os_atomic_clear(&mutex->lock_word); #else mutex->lock_word = 0; diff --git a/storage/innobase/lock/lock0lock.c b/storage/innobase/lock/lock0lock.c index e6ce07428e87f8b5951646cda805352cb828b3d3..559b3687b79128716f027938f00b63ae22552126 100644 --- a/storage/innobase/lock/lock0lock.c +++ b/storage/innobase/lock/lock0lock.c @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -2457,16 +2457,16 @@ lock_rec_inherit_to_gap( /* If srv_locks_unsafe_for_binlog is TRUE or session is using READ COMMITTED isolation level, we do not want locks set by an UPDATE or a DELETE to be inherited as gap type locks. But we - DO want S-locks set by a consistency constraint to be inherited also - then. */ + DO want S-locks/X-locks (taken for replace) set by a consistency + constraint to be inherited also then. */ while (lock != NULL) { if (!lock_rec_get_insert_intention(lock) && !((srv_locks_unsafe_for_binlog || lock->trx->isolation_level <= TRX_ISO_READ_COMMITTED) - && lock_get_mode(lock) == LOCK_X)) { - + && lock_get_mode(lock) == + (lock->trx->duplicates ? LOCK_S : LOCK_X))) { lock_rec_add_to_queue(LOCK_REC | LOCK_GAP | lock_get_mode(lock), heir_block, heir_heap_no, diff --git a/storage/innobase/os/os0file.c b/storage/innobase/os/os0file.c index 8fc22fbd119eea1bdfbf436e4af981cd0c92293d..d792e7a61d835d7f6196619ef9444b509acc580e 100644 --- a/storage/innobase/os/os0file.c +++ b/storage/innobase/os/os0file.c @@ -1,6 +1,6 @@ /*********************************************************************** -Copyright (c) 1995, 2010, Innobase Oy. All Rights Reserved. +Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Percona Inc. Portions of this file contain modifications contributed and copyrighted @@ -1276,16 +1276,19 @@ os_file_create_simple_no_error_handling_func( #else /* __WIN__ */ os_file_t file; int create_flag; + const char* mode_str = NULL; ut_a(name); if (create_mode == OS_FILE_OPEN) { + mode_str = "OPEN"; if (access_type == OS_FILE_READ_ONLY) { create_flag = O_RDONLY; } else { create_flag = O_RDWR; } } else if (create_mode == OS_FILE_CREATE) { + mode_str = "CREATE"; create_flag = O_RDWR | O_CREAT | O_EXCL; } else { create_flag = 0; @@ -1310,6 +1313,14 @@ os_file_create_simple_no_error_handling_func( #endif } else { *success = TRUE; + + /* This function is always called for data files, we should + disable OS caching (O_DIRECT) here as we do in + os_file_create_func(), so we open the same file in the same + mode, see man page of open(2). */ + if (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT) { + os_file_set_nocache(file, name, mode_str); + } } return(file); diff --git a/storage/innobase/row/row0purge.c b/storage/innobase/row/row0purge.c index efcfdc3bac540c94b7ff71bb5f736733534dc7c8..9018582f5d6dd208f3f883e1773568dfe4fcd24c 100644 --- a/storage/innobase/row/row0purge.c +++ b/storage/innobase/row/row0purge.c @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1997, 2011, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -43,6 +43,7 @@ Created 3/14/1997 Heikki Tuuri #include "row0vers.h" #include "row0mysql.h" #include "log0log.h" +#include "rem0cmp.h" /************************************************************************* IMPORTANT NOTE: Any operation that generates redo MUST check that there @@ -80,7 +81,7 @@ row_purge_node_create( /***********************************************************//** Repositions the pcur in the purge node on the clustered index record, -if found. +if found. If the record is not found, close pcur. @return TRUE if the record was found */ static ibool @@ -90,23 +91,28 @@ row_purge_reposition_pcur( purge_node_t* node, /*!< in: row purge node */ mtr_t* mtr) /*!< in: mtr */ { - ibool found; - if (node->found_clust) { - found = btr_pcur_restore_position(mode, &(node->pcur), mtr); + ut_ad(row_purge_validate_pcur(node)); - return(found); - } + node->found_clust = btr_pcur_restore_position( + mode, &(node->pcur), mtr); + + } else { + + node->found_clust = row_search_on_row_ref( + &(node->pcur), mode, node->table, node->ref, mtr); - found = row_search_on_row_ref(&(node->pcur), mode, node->table, - node->ref, mtr); - node->found_clust = found; + if (node->found_clust) { + btr_pcur_store_position(&(node->pcur), mtr); + } + } - if (found) { - btr_pcur_store_position(&(node->pcur), mtr); + /* Close the current cursor if we fail to position it correctly. */ + if (!node->found_clust) { + btr_pcur_close(&node->pcur); } - return(found); + return(node->found_clust); } /***********************************************************//** @@ -143,8 +149,8 @@ row_purge_remove_clust_if_poss_low( if (!success) { /* The record is already removed */ - - btr_pcur_commit_specify_mtr(pcur, &mtr); + /* Persistent cursor is closed if reposition fails. */ + mtr_commit(&mtr); return(TRUE); } @@ -258,7 +264,12 @@ row_purge_poss_sec( btr_pcur_get_rec(&node->pcur), &mtr, index, entry); - btr_pcur_commit_specify_mtr(&node->pcur, &mtr); + /* Persistent cursor is closed if reposition fails. */ + if (node->found_clust) { + btr_pcur_commit_specify_mtr(&node->pcur, &mtr); + } else { + mtr_commit(&mtr); + } return(can_delete); } @@ -806,3 +817,53 @@ row_purge_step( return(thr); } + +#ifdef UNIV_DEBUG +/***********************************************************//** +Validate the persisent cursor in the purge node. The purge node has two +references to the clustered index record - one via the ref member, and the +other via the persistent cursor. These two references must match each +other if the found_clust flag is set. +@return true if the stored copy of persistent cursor is consistent +with the ref member.*/ +ibool +row_purge_validate_pcur( + purge_node_t* node) +{ + dict_index_t* clust_index; + ulint* offsets; + int st; + + if (!node->found_clust) { + return(TRUE); + } + + if (node->index == NULL) { + return(TRUE); + } + + if (node->pcur.old_stored != BTR_PCUR_OLD_STORED) { + return(TRUE); + } + + clust_index = node->pcur.btr_cur.index; + + offsets = rec_get_offsets(node->pcur.old_rec, clust_index, NULL, + node->pcur.old_n_fields, &node->heap); + + /* Here we are comparing the purge ref record and the stored initial + part in persistent cursor. Both cases we store n_uniq fields of the + cluster index and so it is fine to do the comparison. We note this + dependency here as pcur and ref belong to different modules. */ + st = cmp_dtuple_rec(node->ref, node->pcur.old_rec, offsets); + + if (st != 0) { + fprintf(stderr, "Purge node pcur validation failed\n"); + dtuple_print(stderr, node->ref); + rec_print(stderr, node->pcur.old_rec, clust_index); + return(FALSE); + } + + return(TRUE); +} +#endif /* UNIV_DEBUG */ diff --git a/storage/perfschema/pfs_timer.cc b/storage/perfschema/pfs_timer.cc index 302548c97c2e8d43ebc570a838b1fe4a9f6c8649..3191a0514e77ccfb3ce0c573f89e049cc9db64d7 100644 --- a/storage/perfschema/pfs_timer.cc +++ b/storage/perfschema/pfs_timer.cc @@ -1,5 +1,4 @@ -/* Copyright (c) 2008 MySQL AB, 2010 Sun Microsystems, Inc. - Use is subject to license terms. +/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -89,6 +88,46 @@ void init_timers(void) (double)pfs_timer_info.ticks.frequency); else tick_to_pico= 0; + + /* + Depending on the platform and build options, some timers may not be + available. Pick best replacements. + */ + + /* + For WAIT, the cycle timer is used by default. However, it is not available + on all architectures. Fall back to the nanosecond timer in this case. It is + unlikely that neither cycle nor nanosecond are available, but we continue + probing less resolution timers anyway for consistency with other events. + */ + if (cycle_to_pico != 0) + { + /* Normal case. */ + wait_timer= TIMER_NAME_CYCLE; + } + else if (nanosec_to_pico != 0) + { + /* Robustness, no known cases. */ + wait_timer= TIMER_NAME_NANOSEC; + } + else if (microsec_to_pico != 0) + { + /* Robustness, no known cases. */ + wait_timer= TIMER_NAME_MICROSEC; + } + else if (millisec_to_pico != 0) + { + /* Robustness, no known cases. */ + wait_timer= TIMER_NAME_MILLISEC; + } + else + { + /* + Will never be reached on any architecture, but must provide a default if + no other timers are available. + */ + wait_timer= TIMER_NAME_TICK; + } } ulonglong get_timer_value(enum_timer_name timer_name) diff --git a/util/tests/sm-basic.cc b/storage/tokudb/ft-index/util/tests/sm-basic.cc similarity index 100% rename from util/tests/sm-basic.cc rename to storage/tokudb/ft-index/util/tests/sm-basic.cc diff --git a/util/tests/sm-crash-double-free.cc b/storage/tokudb/ft-index/util/tests/sm-crash-double-free.cc similarity index 100% rename from util/tests/sm-crash-double-free.cc rename to storage/tokudb/ft-index/util/tests/sm-crash-double-free.cc diff --git a/mysql-test/suite/tokudb.bugs/r/db805.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db805.result similarity index 100% rename from mysql-test/suite/tokudb.bugs/r/db805.result rename to storage/tokudb/mysql-test/tokudb_bugs/r/db805.result diff --git a/mysql-test/suite/tokudb.bugs/r/db806.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db806.result similarity index 100% rename from mysql-test/suite/tokudb.bugs/r/db806.result rename to storage/tokudb/mysql-test/tokudb_bugs/r/db806.result diff --git a/mysql-test/suite/tokudb.bugs/r/db811.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db811.result similarity index 100% rename from mysql-test/suite/tokudb.bugs/r/db811.result rename to storage/tokudb/mysql-test/tokudb_bugs/r/db811.result diff --git a/mysql-test/suite/tokudb.bugs/r/db811s.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db811s.result similarity index 100% rename from mysql-test/suite/tokudb.bugs/r/db811s.result rename to storage/tokudb/mysql-test/tokudb_bugs/r/db811s.result diff --git a/mysql-test/suite/tokudb.bugs/r/db823.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db823.result similarity index 100% rename from mysql-test/suite/tokudb.bugs/r/db823.result rename to storage/tokudb/mysql-test/tokudb_bugs/r/db823.result diff --git a/mysql-test/suite/tokudb.bugs/t/db805.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db805.test similarity index 100% rename from mysql-test/suite/tokudb.bugs/t/db805.test rename to storage/tokudb/mysql-test/tokudb_bugs/t/db805.test diff --git a/mysql-test/suite/tokudb.bugs/t/db806.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db806.test similarity index 100% rename from mysql-test/suite/tokudb.bugs/t/db806.test rename to storage/tokudb/mysql-test/tokudb_bugs/t/db806.test diff --git a/mysql-test/suite/tokudb.bugs/t/db811.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db811.test similarity index 100% rename from mysql-test/suite/tokudb.bugs/t/db811.test rename to storage/tokudb/mysql-test/tokudb_bugs/t/db811.test diff --git a/mysql-test/suite/tokudb.bugs/t/db811s.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db811s.test similarity index 100% rename from mysql-test/suite/tokudb.bugs/t/db811s.test rename to storage/tokudb/mysql-test/tokudb_bugs/t/db811s.test diff --git a/mysql-test/suite/tokudb.bugs/t/db823.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db823.test similarity index 100% rename from mysql-test/suite/tokudb.bugs/t/db823.test rename to storage/tokudb/mysql-test/tokudb_bugs/t/db823.test diff --git a/storage/xtradb/buf/buf0buf.c b/storage/xtradb/buf/buf0buf.c index f8966e9b15c8e19691a768515c592f536add3e83..6ef9ac0d16ab80092be97cd87584cc7f6ee5491c 100644 --- a/storage/xtradb/buf/buf0buf.c +++ b/storage/xtradb/buf/buf0buf.c @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Portions of this file contain modifications contributed and copyrighted by @@ -1666,6 +1666,10 @@ buf_pool_watch_set( /* buf_pool->watch is protected by zip_mutex for now */ mutex_enter(&buf_pool->zip_mutex); + + /* The maximum number of purge threads should never exceed + BUF_POOL_WATCH_SIZE. So there is no way for purge thread + instance to hold a watch when setting another watch. */ for (i = 0; i < BUF_POOL_WATCH_SIZE; i++) { bpage = &buf_pool->watch[i]; diff --git a/storage/xtradb/dict/dict0crea.c b/storage/xtradb/dict/dict0crea.c index c88979b20f964b36af4682fe91324847c0f7384c..f7663b999b74c70a56b99716f017fda0fabdcd25 100644 --- a/storage/xtradb/dict/dict0crea.c +++ b/storage/xtradb/dict/dict0crea.c @@ -1626,6 +1626,104 @@ dict_create_add_foreign_field_to_dictionary( table, foreign, trx)); } +/********************************************************************//** +Construct foreign key constraint defintion from data dictionary information. +*/ +UNIV_INTERN +char* +dict_foreign_def_get( +/*=================*/ + dict_foreign_t* foreign,/*!< in: foreign */ + trx_t* trx) /*!< in: trx */ +{ + char* fk_def = mem_heap_alloc(foreign->heap, 4*1024); + const char* tbname; + char tablebuf[MAX_TABLE_NAME_LEN + 1] = ""; + int i; + char* bufend; + + tbname = dict_remove_db_name(foreign->id); + bufend = innobase_convert_name(tablebuf, MAX_TABLE_NAME_LEN, + tbname, strlen(tbname), trx->mysql_thd, FALSE); + tablebuf[bufend - tablebuf] = '\0'; + + sprintf(fk_def, + (char *)"CONSTRAINT %s FOREIGN KEY (", (char *)tablebuf); + + for(i = 0; i < foreign->n_fields; i++) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + foreign->foreign_col_names[i], + strlen(foreign->foreign_col_names[i]), + trx->mysql_thd, FALSE); + strcat(fk_def, buf); + if (i < foreign->n_fields-1) { + strcat(fk_def, (char *)","); + } + } + + strcat(fk_def,(char *)") REFERENCES "); + + bufend = innobase_convert_name(tablebuf, MAX_TABLE_NAME_LEN, + foreign->referenced_table_name, + strlen(foreign->referenced_table_name), + trx->mysql_thd, TRUE); + tablebuf[bufend - tablebuf] = '\0'; + + strcat(fk_def, tablebuf); + strcat(fk_def, " ("); + + for(i = 0; i < foreign->n_fields; i++) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + bufend = innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + foreign->referenced_col_names[i], + strlen(foreign->referenced_col_names[i]), + trx->mysql_thd, FALSE); + buf[bufend - buf] = '\0'; + strcat(fk_def, buf); + if (i < foreign->n_fields-1) { + strcat(fk_def, (char *)","); + } + } + strcat(fk_def, (char *)")"); + + return fk_def; +} + +/********************************************************************//** +Convert foreign key column names from data dictionary to SQL-layer. +*/ +static +void +dict_foreign_def_get_fields( +/*========================*/ + dict_foreign_t* foreign,/*!< in: foreign */ + trx_t* trx, /*!< in: trx */ + char** field, /*!< out: foreign column */ + char** field2, /*!< out: referenced column */ + int col_no) /*!< in: column number */ +{ + char* bufend; + char* fieldbuf = mem_heap_alloc(foreign->heap, MAX_TABLE_NAME_LEN+1); + char* fieldbuf2 = mem_heap_alloc(foreign->heap, MAX_TABLE_NAME_LEN+1); + + bufend = innobase_convert_name(fieldbuf, MAX_TABLE_NAME_LEN, + foreign->foreign_col_names[col_no], + strlen(foreign->foreign_col_names[col_no]), + trx->mysql_thd, FALSE); + + fieldbuf[bufend - fieldbuf] = '\0'; + + bufend = innobase_convert_name(fieldbuf2, MAX_TABLE_NAME_LEN, + foreign->referenced_col_names[col_no], + strlen(foreign->referenced_col_names[col_no]), + trx->mysql_thd, FALSE); + + fieldbuf2[bufend - fieldbuf2] = '\0'; + *field = fieldbuf; + *field2 = fieldbuf2; +} + /********************************************************************//** Add a single foreign key definition to the data dictionary tables in the database. We also generate names to constraints that were not named by the @@ -1708,6 +1806,29 @@ dict_create_add_foreign_to_dictionary( if (error != DB_SUCCESS) { + if (error == DB_DUPLICATE_KEY) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + char tablename[MAX_TABLE_NAME_LEN + 1] = ""; + char* fk_def; + + innobase_convert_name(tablename, MAX_TABLE_NAME_LEN, + table->name, strlen(table->name), + trx->mysql_thd, TRUE); + + innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + foreign->id, strlen(foreign->id), trx->mysql_thd, FALSE); + + fk_def = dict_foreign_def_get(foreign, trx); + + ib_push_warning(trx, error, + "Create or Alter table %s with foreign key constraint" + " failed. Foreign key constraint %s" + " already exists on data dictionary." + " Foreign key constraint names need to be unique in database." + " Error in foreign key definition: %s.", + tablename, buf, fk_def); + } + return(error); } @@ -1716,6 +1837,26 @@ dict_create_add_foreign_to_dictionary( i, table, foreign, trx); if (error != DB_SUCCESS) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + char tablename[MAX_TABLE_NAME_LEN + 1] = ""; + char* field=NULL; + char* field2=NULL; + char* fk_def; + + innobase_convert_name(tablename, MAX_TABLE_NAME_LEN, + table->name, strlen(table->name), + trx->mysql_thd, TRUE); + innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + foreign->id, strlen(foreign->id), trx->mysql_thd, FALSE); + fk_def = dict_foreign_def_get(foreign, trx); + dict_foreign_def_get_fields(foreign, trx, &field, &field2, i); + + ib_push_warning(trx, error, + "Create or Alter table %s with foreign key constraint" + " failed. Error adding foreign key constraint name %s" + " fields %s or %s to the dictionary." + " Error in foreign key definition: %s.", + tablename, buf, i+1, fk_def); return(error); } @@ -1800,7 +1941,7 @@ dict_create_add_foreigns_to_dictionary( foreign = UT_LIST_GET_NEXT(foreign_list, foreign)) { error = dict_create_add_foreign_to_dictionary(&number, table, - foreign, trx); + foreign, trx); if (error != DB_SUCCESS) { diff --git a/storage/xtradb/dict/dict0dict.c b/storage/xtradb/dict/dict0dict.c index bd0fdf6e9b90433d6add213f275fbb5a7a3ee235..cd8e41590332bcf1905f53385da089f818bb9236 100644 --- a/storage/xtradb/dict/dict0dict.c +++ b/storage/xtradb/dict/dict0dict.c @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -2663,12 +2663,14 @@ dict_foreign_remove_from_cache( foreign); rbt = foreign->referenced_table->referenced_rbt; + if (rbt != NULL && foreign->id != NULL) { const ib_rbt_node_t* node = rbt_lookup(rbt, foreign->id); - if (node) { - dict_foreign_t* val = *(dict_foreign_t**) node->value; + if (node != NULL) { + dict_foreign_t* val + = *(dict_foreign_t**) node->value; if (val == foreign) { rbt_delete(rbt, foreign->id); @@ -2689,8 +2691,9 @@ dict_foreign_remove_from_cache( const ib_rbt_node_t* node = rbt_lookup(rbt, foreign->id); - if (node) { - dict_foreign_t* val = *(dict_foreign_t**) node->value; + if (node != NULL) { + dict_foreign_t* val + = *(dict_foreign_t**) node->value; if (val == foreign) { rbt_delete(rbt, foreign->id); @@ -2747,6 +2750,11 @@ dict_foreign_find( DBUG_RETURN(NULL); } +#define DB_FOREIGN_KEY_IS_PREFIX_INDEX 200 +#define DB_FOREIGN_KEY_COL_NOT_NULL 201 +#define DB_FOREIGN_KEY_COLS_NOT_EQUAL 202 +#define DB_FOREIGN_KEY_INDEX_NOT_FOUND 203 + /*********************************************************************//** Tries to find an index whose first fields are the columns in the array, in the same order and is not marked for deletion and is not the same @@ -2764,12 +2772,21 @@ dict_foreign_find_index( ibool check_charsets, /*!< in: whether to check charsets. only has an effect if types_idx != NULL */ - ulint check_null) + ulint check_null, /*!< in: nonzero if none of the columns must be declared NOT NULL */ + ulint* error, /*!< out: error code */ + ulint* err_col_no, + /*!< out: column number where error happened */ + dict_index_t** err_index) + /*!< out: index where error happened */ { dict_index_t* index; + if (error) { + *error = DB_FOREIGN_KEY_INDEX_NOT_FOUND; + } + index = dict_table_get_first_index(table); while (index != NULL) { @@ -2795,6 +2812,12 @@ dict_foreign_find_index( /* We do not accept column prefix indexes here */ + if (error && err_col_no && err_index) { + *error = DB_FOREIGN_KEY_IS_PREFIX_INDEX; + *err_col_no = i; + *err_index = index; + } + break; } @@ -2806,6 +2829,11 @@ dict_foreign_find_index( if (check_null && (field->col->prtype & DATA_NOT_NULL)) { + if (error && err_col_no && err_index) { + *error = DB_FOREIGN_KEY_COL_NOT_NULL; + *err_col_no = i; + *err_index = index; + } return(NULL); } @@ -2815,6 +2843,12 @@ dict_foreign_find_index( i), check_charsets)) { + if (error && err_col_no && err_index) { + *error = DB_FOREIGN_KEY_COLS_NOT_EQUAL; + *err_col_no = i; + *err_index = index; + } + break; } } @@ -2822,6 +2856,10 @@ dict_foreign_find_index( if (i == n_cols) { /* We found a matching index */ + if (error) { + *error = DB_SUCCESS; + } + return(index); } } @@ -2853,7 +2891,7 @@ dict_foreign_find_equiv_index( foreign->foreign_table, foreign->foreign_col_names, foreign->n_fields, foreign->foreign_index, TRUE, /* check types */ - FALSE/* allow columns to be NULL */)); + FALSE/* allow columns to be NULL */, NULL, NULL, NULL)); } #endif /* !UNIV_HOTBACKUP */ @@ -3016,11 +3054,15 @@ dict_foreign_add_to_cache( } if (for_in_cache->referenced_table == NULL && ref_table) { + ulint index_error; + ulint err_col; + dict_index_t *err_index=NULL; + index = dict_foreign_find_index( ref_table, for_in_cache->referenced_col_names, for_in_cache->n_fields, for_in_cache->foreign_index, - check_charsets, FALSE); + check_charsets, FALSE, &index_error, &err_col, &err_index); if (index == NULL && !(ignore_err & DICT_ERR_IGNORE_FK_NOKEY)) { @@ -3052,6 +3094,9 @@ dict_foreign_add_to_cache( } if (for_in_cache->foreign_table == NULL && for_table) { + ulint index_error; + ulint err_col; + dict_index_t* err_index=NULL; index = dict_foreign_find_index( for_table, @@ -3060,7 +3105,8 @@ dict_foreign_add_to_cache( for_in_cache->referenced_index, check_charsets, for_in_cache->type & (DICT_FOREIGN_ON_DELETE_SET_NULL - | DICT_FOREIGN_ON_UPDATE_SET_NULL)); + | DICT_FOREIGN_ON_UPDATE_SET_NULL), + &index_error, &err_col, &err_index); if (index == NULL && !(ignore_err & DICT_ERR_IGNORE_FK_NOKEY)) { @@ -3671,6 +3717,8 @@ static void dict_foreign_report_syntax_err( /*===========================*/ + const char* fmt, /*!< in: syntax err msg */ + const char* oper, /*!< in: operation */ const char* name, /*!< in: table name */ const char* start_of_latest_foreign, /*!< in: start of the foreign key clause @@ -3681,11 +3729,101 @@ dict_foreign_report_syntax_err( mutex_enter(&dict_foreign_err_mutex); dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\nSyntax error close to:\n%s\n", - start_of_latest_foreign, ptr); + fprintf(ef, fmt, oper, name, start_of_latest_foreign, ptr); mutex_exit(&dict_foreign_err_mutex); } +/*********************************************************************//** +Push warning message to SQL-layer based on foreign key constraint +index match error. */ +static +void +dict_foreign_push_index_error( +/*==========================*/ + trx_t* trx, /*!< in: trx */ + const char* operation, /*!< in: operation create or alter + */ + const char* create_name, /*!< in: table name in create or + alter table */ + const char* latest_foreign, /*!< in: start of latest foreign key + constraint name */ + const char** columns, /*!< in: foreign key columns */ + ulint index_error, /*!< in: error code */ + ulint err_col, /*!< in: column where error happened + */ + dict_index_t* err_index, /*!< in: index where error happened + */ + dict_table_t* table, /*!< in: table */ + FILE* ef) /*!< in: output stream */ +{ + switch (index_error) { + case DB_FOREIGN_KEY_INDEX_NOT_FOUND: { + fprintf(ef, + "%s table '%s' with foreign key constraint" + " failed. There is no index in the referenced" + " table where the referenced columns appear" + " as the first columns. Error close to %s.\n", + operation, create_name, latest_foreign); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table '%s' with foreign key constraint" + " failed. There is no index in the referenced" + " table where the referenced columns appear" + " as the first columns. Error close to %s.", + operation, create_name, latest_foreign); + break; + } + case DB_FOREIGN_KEY_IS_PREFIX_INDEX: { + fprintf(ef, + "%s table '%s' with foreign key constraint" + " failed. There is only prefix index in the referenced" + " table where the referenced columns appear" + " as the first columns. Error close to %s.\n", + operation, create_name, latest_foreign); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table '%s' with foreign key constraint" + " failed. There is only prefix index in the referenced" + " table where the referenced columns appear" + " as the first columns. Error close to %s.", + operation, create_name, latest_foreign); + break; + } + case DB_FOREIGN_KEY_COL_NOT_NULL: { + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. You have defined a SET NULL condition but " + "field %s on index is defined as NOT NULL close to %s\n", + operation, create_name, columns[err_col], latest_foreign); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. You have defined a SET NULL condition but " + "field %s on index is defined as NOT NULL close to %s", + operation, create_name, columns[err_col], latest_foreign); + break; + } + case DB_FOREIGN_KEY_COLS_NOT_EQUAL: { + dict_field_t* field; + const char* col_name; + field = dict_index_get_nth_field(err_index, err_col); + + col_name = dict_table_get_col_name( + table, dict_col_get_no(field->col)); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. Field type or character set for column %s " + "does not mach referenced column %s close to %s\n", + operation, create_name, columns[err_col], col_name, latest_foreign); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Field type or character set for column %s " + "does not mach referenced column %s close to %s", + operation, create_name, columns[err_col], col_name, latest_foreign); + break; + } + default: + ut_error; + } +} + /*********************************************************************//** Scans a table create SQL string and adds to the data dictionary the foreign key constraints declared in the string. This function should be called after @@ -3714,15 +3852,20 @@ dict_create_foreign_constraints_low( DB_CANNOT_ADD_CONSTRAINT if any foreign keys are found. */ { - dict_table_t* table; - dict_table_t* referenced_table; - dict_table_t* table_to_alter; + dict_table_t* table = NULL; + dict_table_t* referenced_table = NULL; + dict_table_t* table_to_alter = NULL; + dict_table_t* table_to_create = NULL; ulint highest_id_so_far = 0; - dict_index_t* index; - dict_foreign_t* foreign; + dict_index_t* index = NULL; + dict_foreign_t* foreign = NULL; const char* ptr = sql_string; const char* start_of_latest_foreign = sql_string; + const char* start_of_latest_set = NULL; FILE* ef = dict_foreign_err_file; + ulint index_error = DB_SUCCESS; + dict_index_t* err_index = NULL; + ulint err_col; const char* constraint_name; ibool success; ulint error; @@ -3735,29 +3878,68 @@ dict_create_foreign_constraints_low( ulint n_on_updates; const dict_col_t*columns[500]; const char* column_names[500]; + const char* ref_column_names[500]; const char* referenced_table_name; + const char* create_table_name; + const char* orig; + char create_name[MAX_TABLE_NAME_LEN + 1]; + const char operation[8]; ut_ad(mutex_own(&(dict_sys->mutex))); table = dict_table_get_low(name, DICT_ERR_IGNORE_NONE); + /* First check if we are actually doing an ALTER TABLE, and in that + case look for the table being altered */ + ptr = dict_accept(cs, ptr, "ALTER", &success); + + strcpy((char *)operation, success ? "Alter " : "Create "); + + if (!success) { + orig = ptr; + ptr = dict_scan_to(ptr, "CREATE"); + ptr = dict_scan_to(ptr, "TABLE"); + ptr = dict_accept(cs, ptr, "TABLE", &success); + + if (success) { + ptr = dict_scan_table_name(cs, ptr, &table_to_create, name, + &success, heap, &create_table_name); + } + + if (success) { + char *bufend; + bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, + create_table_name, strlen(create_table_name), + trx->mysql_thd, TRUE); + create_name[bufend-create_name]='\0'; + ptr = orig; + } else { + char *bufend; + ptr = orig; + bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, + name, strlen(name), trx->mysql_thd, TRUE); + create_name[bufend-create_name]='\0'; + } + + goto loop; + } if (table == NULL) { mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, - "Cannot find the table in the internal" - " data dictionary of InnoDB.\n" - "Create table statement:\n%s\n", sql_string); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, "%s table %s with foreign key constraint" + " failed. Table %s not found from data dictionary." + " Error close to %s.\n", + operation, create_name, create_name, start_of_latest_foreign); mutex_exit(&dict_foreign_err_mutex); - + ib_push_warning(trx, DB_ERROR, + "%s table %s with foreign key constraint" + " failed. Table %s not found from data dictionary." + " Error close to %s.", + operation, create_name, create_name, start_of_latest_foreign); return(DB_ERROR); } - /* First check if we are actually doing an ALTER TABLE, and in that - case look for the table being altered */ - - ptr = dict_accept(cs, ptr, "ALTER", &success); - + /* If not alter table jump to loop */ if (!success) { goto loop; @@ -3772,13 +3954,40 @@ dict_create_foreign_constraints_low( /* We are doing an ALTER TABLE: scan the table name we are altering */ + orig = ptr; ptr = dict_scan_table_name(cs, ptr, &table_to_alter, name, &success, heap, &referenced_table_name); + + if (table_to_alter) { + char *bufend; + bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, + table_to_alter->name, strlen(table_to_alter->name), + trx->mysql_thd, TRUE); + create_name[bufend-create_name]='\0'; + } else { + char *bufend; + bufend = innobase_convert_name((char *)create_name, MAX_TABLE_NAME_LEN, + referenced_table_name, strlen(referenced_table_name), + trx->mysql_thd, TRUE); + create_name[bufend-create_name]='\0'; + + } + if (!success) { - fprintf(stderr, - "InnoDB: Error: could not find" - " the table being ALTERED in:\n%s\n", - sql_string); + mutex_enter(&dict_foreign_err_mutex); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. Table %s not found from data dictionary." + " Error close to %s.\n", + operation, create_name, create_name, orig); + mutex_exit(&dict_foreign_err_mutex); + + ib_push_warning(trx, DB_ERROR, + "%s table %s with foreign key constraint" + " failed. Table %s not found from data dictionary." + " Error close to %s.", + operation, create_name, create_name, orig); return(DB_ERROR); } @@ -3844,7 +4053,19 @@ dict_create_foreign_constraints_low( if so, immediately reject the command if the table is a temporary one. For now, this kludge will work. */ if (reject_fks && (UT_LIST_GET_LEN(table->foreign_list) > 0)) { + mutex_enter(&dict_foreign_err_mutex); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, "%s table %s with foreign key constraint" + " failed. Temporary tables can't have foreign key constraints." + " Error close to %s.\n", + operation, create_name, start_of_latest_foreign); + mutex_exit(&dict_foreign_err_mutex); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Temporary tables can't have foreign key constraints." + " Error close to %s.", + operation, create_name, start_of_latest_foreign); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3880,11 +4101,21 @@ dict_create_foreign_constraints_low( if (!success) { /* MySQL allows also an index id before the '('; we skip it */ + orig = ptr; ptr = dict_skip_word(cs, ptr, &success); if (!success) { dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3904,15 +4135,26 @@ dict_create_foreign_constraints_low( /* Scan the columns in the first list */ col_loop1: ut_a(i < (sizeof column_names) / sizeof *column_names); + orig = ptr; ptr = dict_scan_col(cs, ptr, &success, table, columns + i, heap, column_names + i); if (!success) { mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\nCannot resolve column name close to:\n%s\n", - start_of_latest_foreign, ptr); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + mutex_exit(&dict_foreign_err_mutex); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); + return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3924,11 +4166,22 @@ dict_create_foreign_constraints_low( goto col_loop1; } + orig = ptr; ptr = dict_accept(cs, ptr, ")", &success); if (!success) { dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); + return(DB_CANNOT_ADD_CONSTRAINT); } @@ -3936,27 +4189,41 @@ dict_create_foreign_constraints_low( as the first fields and in the right order */ index = dict_foreign_find_index(table, column_names, i, - NULL, TRUE, FALSE); + NULL, TRUE, FALSE, &index_error, &err_col, &err_index); if (!index) { mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); + dict_foreign_error_report_low(ef, create_name); fputs("There is no index in table ", ef); - ut_print_name(ef, NULL, TRUE, name); + ut_print_name(ef, NULL, TRUE, create_name); fprintf(ef, " where the columns appear\n" "as the first columns. Constraint:\n%s\n" "See " REFMAN "innodb-foreign-key-constraints.html\n" "for correct foreign key definition.\n", start_of_latest_foreign); - mutex_exit(&dict_foreign_err_mutex); - return(DB_CHILD_NO_INDEX); + dict_foreign_push_index_error(trx, operation, create_name, start_of_latest_foreign, + column_names, index_error, err_col, err_index, table, ef); + + mutex_exit(&dict_foreign_err_mutex); + return(DB_CANNOT_ADD_CONSTRAINT); } + + orig = ptr; ptr = dict_accept(cs, ptr, "REFERENCES", &success); if (!success || !my_isspace(cs, *ptr)) { dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4005,24 +4272,50 @@ dict_create_foreign_constraints_low( checking of foreign key constraints! */ if (!success || (!referenced_table && trx->check_foreigns)) { + char buf[MAX_TABLE_NAME_LEN + 1] = ""; + char* bufend; + + bufend = innobase_convert_name(buf, MAX_TABLE_NAME_LEN, + referenced_table_name, strlen(referenced_table_name), + trx->mysql_thd, TRUE); + buf[bufend - buf] = '\0'; + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint failed. Referenced table %s not found in the data dictionary " + "close to %s.", + operation, create_name, buf, start_of_latest_foreign); + dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\nCannot resolve table name close to:\n" - "%s\n", - start_of_latest_foreign, ptr); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint failed. Referenced table %s not found in the data dictionary " + "close to %s.\n", + operation, create_name, buf, start_of_latest_foreign); + mutex_exit(&dict_foreign_err_mutex); return(DB_CANNOT_ADD_CONSTRAINT); } + orig = ptr; ptr = dict_accept(cs, ptr, "(", &success); if (!success) { dict_foreign_free(foreign); - dict_foreign_report_syntax_err(name, start_of_latest_foreign, - ptr); + dict_foreign_report_syntax_err( + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); + return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4030,20 +4323,29 @@ dict_create_foreign_constraints_low( i = 0; col_loop2: + orig = ptr; ptr = dict_scan_col(cs, ptr, &success, referenced_table, columns + i, - heap, column_names + i); + heap, ref_column_names + i); i++; if (!success) { dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\nCannot resolve column name close to:\n" - "%s\n", - start_of_latest_foreign, ptr); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, orig); + mutex_exit(&dict_foreign_err_mutex); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, orig); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4053,13 +4355,25 @@ dict_create_foreign_constraints_low( goto col_loop2; } + orig = ptr; ptr = dict_accept(cs, ptr, ")", &success); if (!success || foreign->n_fields != i) { + + dict_foreign_report_syntax_err( + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s. Too few referenced columns\n", + operation, create_name, start_of_latest_foreign, orig); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s. Too few referenced columns, you have %d when you should have %d.", + operation, create_name, start_of_latest_foreign, orig, i, foreign->n_fields); + dict_foreign_free(foreign); - dict_foreign_report_syntax_err(name, start_of_latest_foreign, - ptr); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4069,6 +4383,7 @@ dict_create_foreign_constraints_low( scan_on_conditions: /* Loop here as long as we can find ON ... conditions */ + start_of_latest_set = ptr; ptr = dict_accept(cs, ptr, "ON", &success); if (!success) { @@ -4079,13 +4394,24 @@ dict_create_foreign_constraints_low( ptr = dict_accept(cs, ptr, "DELETE", &success); if (!success) { + orig = ptr; ptr = dict_accept(cs, ptr, "UPDATE", &success); if (!success) { dict_foreign_free(foreign); dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4117,12 +4443,22 @@ dict_create_foreign_constraints_low( ptr = dict_accept(cs, ptr, "NO", &success); if (success) { + orig = ptr; ptr = dict_accept(cs, ptr, "ACTION", &success); if (!success) { dict_foreign_free(foreign); dict_foreign_report_syntax_err( - name, start_of_latest_foreign, ptr); + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4136,42 +4472,73 @@ dict_create_foreign_constraints_low( goto scan_on_conditions; } + orig = ptr; ptr = dict_accept(cs, ptr, "SET", &success); if (!success) { dict_foreign_free(foreign); - dict_foreign_report_syntax_err(name, start_of_latest_foreign, - ptr); + dict_foreign_report_syntax_err( + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + return(DB_CANNOT_ADD_CONSTRAINT); } + orig = ptr; ptr = dict_accept(cs, ptr, "NULL", &success); if (!success) { dict_foreign_free(foreign); - dict_foreign_report_syntax_err(name, start_of_latest_foreign, - ptr); + dict_foreign_report_syntax_err( + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. Foreign key constraint parse error in %s" + " close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); return(DB_CANNOT_ADD_CONSTRAINT); } for (j = 0; j < foreign->n_fields; j++) { if ((dict_index_get_nth_col(foreign->foreign_index, j)->prtype) & DATA_NOT_NULL) { + const dict_col_t* col + = dict_index_get_nth_col(foreign->foreign_index, j); + const char* col_name = dict_table_get_col_name(foreign->foreign_index->table, + dict_col_get_no(col)); /* It is not sensible to define SET NULL if the column is not allowed to be NULL! */ - dict_foreign_free(foreign); - mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\n" - "You have defined a SET NULL condition" - " though some of the\n" - "columns are defined as NOT NULL.\n", - start_of_latest_foreign); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. You have defined a SET NULL condition but column %s is defined as NOT NULL" + " in %s close to %s.\n", + operation, create_name, col_name, start_of_latest_foreign, start_of_latest_set); mutex_exit(&dict_foreign_err_mutex); + + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. You have defined a SET NULL condition but column %s is defined as NOT NULL" + " in %s close to %s.", + operation, create_name, col_name, start_of_latest_foreign, start_of_latest_set); + + dict_foreign_free(foreign); return(DB_CANNOT_ADD_CONSTRAINT); } } @@ -4188,16 +4555,22 @@ dict_create_foreign_constraints_low( if (n_on_deletes > 1 || n_on_updates > 1) { /* It is an error to define more than 1 action */ - dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); - fprintf(ef, "%s:\n" - "You have twice an ON DELETE clause" - " or twice an ON UPDATE clause.\n", - start_of_latest_foreign); + dict_foreign_error_report_low(ef, create_name); + fprintf(ef, + "%s table %s with foreign key constraint" + " failed. You have more than one on delete or on update clause" + " in %s close to %s.\n", + operation, create_name, start_of_latest_foreign, start_of_latest_set); mutex_exit(&dict_foreign_err_mutex); + ib_push_warning(trx, DB_CANNOT_ADD_CONSTRAINT, + "%s table %s with foreign key constraint" + " failed. You have more than one on delete or on update clause" + " in %s close to %s.", + operation, create_name, start_of_latest_foreign, start_of_latest_set); + dict_foreign_free(foreign); return(DB_CANNOT_ADD_CONSTRAINT); } @@ -4207,13 +4580,13 @@ dict_create_foreign_constraints_low( if (referenced_table) { index = dict_foreign_find_index(referenced_table, - column_names, i, - foreign->foreign_index, - TRUE, FALSE); + ref_column_names, i, + foreign->foreign_index, + TRUE, FALSE, &index_error, &err_col, &err_index); if (!index) { dict_foreign_free(foreign); mutex_enter(&dict_foreign_err_mutex); - dict_foreign_error_report_low(ef, name); + dict_foreign_error_report_low(ef, create_name); fprintf(ef, "%s:\n" "Cannot find an index in the" " referenced table where the\n" @@ -4231,9 +4604,13 @@ dict_create_foreign_constraints_low( "innodb-foreign-key-constraints.html\n" "for correct foreign key definition.\n", start_of_latest_foreign); + + dict_foreign_push_index_error(trx, operation, create_name, start_of_latest_foreign, + column_names, index_error, err_col, err_index, referenced_table, ef); + mutex_exit(&dict_foreign_err_mutex); - return(DB_PARENT_NO_INDEX); + return(DB_CANNOT_ADD_CONSTRAINT); } } else { ut_a(trx->check_foreigns == FALSE); @@ -4251,7 +4628,7 @@ dict_create_foreign_constraints_low( i * sizeof(void*)); for (i = 0; i < foreign->n_fields; i++) { foreign->referenced_col_names[i] - = mem_heap_strdup(foreign->heap, column_names[i]); + = mem_heap_strdup(foreign->heap, ref_column_names[i]); } /* We found an ok constraint definition: add to the lists */ @@ -5796,7 +6173,8 @@ dict_table_replace_index_in_foreign_list( foreign->referenced_table, foreign->referenced_col_names, foreign->n_fields, index, - /*check_charsets=*/TRUE, /*check_null=*/FALSE); + /*check_charsets=*/TRUE, /*check_null=*/FALSE, + NULL, NULL, NULL); ut_ad(new_index || !trx->check_foreigns); ut_ad(!new_index || new_index->table == index->table); diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 5034e7e70e15b1e099146fe61658564ddfe73809..37a029dd210928a257b47eb0357f27c8dff512cf 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2000, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2000, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. @@ -1853,6 +1853,7 @@ check_trx_exists( if (trx == NULL) { trx = innobase_trx_allocate(thd); + thd_set_ha_data(thd, innodb_hton_ptr, trx); } else if (UNIV_UNLIKELY(trx->magic_n != TRX_MAGIC_N)) { mem_analyze_corruption(trx); ut_error; @@ -9119,6 +9120,13 @@ ha_innobase::estimate_rows_upper_bound(void) estimate = 2 * local_data_file_length / dict_index_calc_min_rec_len(index); + /* Set num_rows less than MERGEBUFF to simulate the case where we do + not have enough space to merge the externally sorted file blocks. */ + DBUG_EXECUTE_IF("set_num_rows_lt_MERGEBUFF", + estimate = 2; + DBUG_SET("-d,set_num_rows_lt_MERGEBUFF"); + ); + prebuilt->trx->op_info = (char*)""; DBUG_RETURN((ha_rows) estimate); @@ -9398,17 +9406,6 @@ ha_innobase::info_low( prebuilt->trx->op_info = "returning various info to MySQL"; } - my_snprintf(path, sizeof(path), "%s/%s%s", - mysql_data_home, ib_table->name, reg_ext); - - unpack_filename(path,path); - - /* Note that we do not know the access time of the table, - nor the CHECK TABLE time, nor the UPDATE or INSERT time. */ - - if (os_file_get_status(path,&stat_info)) { - stats.create_time = (ulong) stat_info.ctime; - } } if (flag & HA_STATUS_VARIABLE) { @@ -9652,6 +9649,20 @@ ha_innobase::info_low( } dict_table_stats_unlock(ib_table, RW_S_LATCH); + + my_snprintf(path, sizeof(path), "%s/%s%s", + mysql_data_home, + table->s->normalized_path.str, + reg_ext); + + unpack_filename(path,path); + + /* Note that we do not know the access time of the table, + nor the CHECK TABLE time, nor the UPDATE or INSERT time. */ + + if (os_file_get_status(path,&stat_info)) { + stats.create_time = (ulong) stat_info.ctime; + } } if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) { @@ -14106,3 +14117,28 @@ ha_innobase::idx_cond_push( DBUG_RETURN(NULL); } +/********************************************************************//** +Helper function to push warnings from InnoDB internals to SQL-layer. */ +extern "C" UNIV_INTERN +void +ib_push_warning( + trx_t* trx, /*!< in: trx */ + ulint error, /*!< in: error code to push as warning */ + const char *format,/*!< in: warning message */ + ...) +{ + va_list args; + THD *thd = (THD *)trx->mysql_thd; + char *buf; +#define MAX_BUF_SIZE 4*1024 + + va_start(args, format); + buf = (char *)my_malloc(MAX_BUF_SIZE, MYF(MY_WME)); + vsprintf(buf,format, args); + + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + convert_error_code_to_mysql(error, 0, thd), + buf); + my_free(buf); + va_end(args); +} diff --git a/storage/xtradb/include/dict0crea.h b/storage/xtradb/include/dict0crea.h index 762ab54a35309296c3425a4ed72301196a19f439..c67910f0d55092255ffbaa5028bc82dcfcd198a6 100644 --- a/storage/xtradb/include/dict0crea.h +++ b/storage/xtradb/include/dict0crea.h @@ -121,6 +121,17 @@ UNIV_INTERN ulint dict_create_or_check_foreign_constraint_tables(void); /*================================================*/ + +/********************************************************************//** +Construct foreign key constraint defintion from data dictionary information. +*/ +UNIV_INTERN +char* +dict_foreign_def_get( +/*=================*/ + dict_foreign_t* foreign,/*!< in: foreign */ + trx_t* trx); /*!< in: trx */ + /********************************************************************//** Adds foreign key definitions to data dictionary tables in the database. We look at table->foreign_list, and also generate names to constraints that were diff --git a/storage/xtradb/include/ha_prototypes.h b/storage/xtradb/include/ha_prototypes.h index ec2ba77f7849c8422d76f5f0b335772651c895b9..ad0abb88ff6a5f83eb41c7a598ab8d1d63fab5bf 100644 --- a/storage/xtradb/include/ha_prototypes.h +++ b/storage/xtradb/include/ha_prototypes.h @@ -353,5 +353,14 @@ innobase_convert_to_filename_charset( const char* from, /* in: identifier to convert */ ulint len); /* in: length of 'to', in bytes */ +/********************************************************************//** +Helper function to push warnings from InnoDB internals to SQL-layer. */ +UNIV_INTERN +void +ib_push_warning( + trx_t* trx, /*!< in: trx */ + ulint error, /*!< in: error code to push as warning */ + const char *format,/*!< in: warning message */ + ...); #endif diff --git a/storage/xtradb/include/row0purge.h b/storage/xtradb/include/row0purge.h index fa9c9291d5d2afbc93c2f242655346ee8862af57..64353bc843471b36dca541d81b49f16116e60831 100644 --- a/storage/xtradb/include/row0purge.h +++ b/storage/xtradb/include/row0purge.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1997, 2009, Innobase Oy. All Rights Reserved. +Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -111,6 +111,18 @@ struct purge_node_struct{ purge of a row */ }; +#ifdef UNIV_DEBUG +/***********************************************************//** +Validate the persisent cursor in the purge node. The purge node has two +references to the clustered index record - one via the ref member, and the +other via the persistent cursor. These two references must match each +other if the found_clust flag is set. +@return true if the persistent cursor is consistent with the ref member.*/ +UNIV_INTERN +ibool +row_purge_validate_pcur(purge_node_t* node); +#endif /* UNIV_DEBUG */ + #ifndef UNIV_NONINL #include "row0purge.ic" #endif diff --git a/storage/xtradb/include/srv0srv.h b/storage/xtradb/include/srv0srv.h index 181a58bf355c16ce6ed2f5efdeb3ce3ddbf28efd..3b9424726eab797bb373828a4cf86333c34d3603 100644 --- a/storage/xtradb/include/srv0srv.h +++ b/storage/xtradb/include/srv0srv.h @@ -270,7 +270,6 @@ extern ulong srv_ibuf_active_contract; extern ulong srv_ibuf_accel_rate; extern ulint srv_checkpoint_age_target; extern ulong srv_flush_neighbor_pages; -extern ulint srv_deprecated_enable_unsafe_group_commit; extern ulong srv_read_ahead; extern ulong srv_adaptive_flushing_method; diff --git a/storage/xtradb/include/univ.i b/storage/xtradb/include/univ.i index c31a0f2086267a9fc703ab0f9a5e47614f5e99c9..7c19ceb9397ba8c11e1b8266231c5ad9df9ea006 100644 --- a/storage/xtradb/include/univ.i +++ b/storage/xtradb/include/univ.i @@ -64,10 +64,10 @@ component, i.e. we show M.N.P as M.N */ (INNODB_VERSION_MAJOR << 8 | INNODB_VERSION_MINOR) #ifndef PERCONA_INNODB_VERSION -#define PERCONA_INNODB_VERSION 37.2 +#define PERCONA_INNODB_VERSION 37.4 #endif -#define INNODB_VERSION_STR "5.5.43-MariaDB-" IB_TO_STR(PERCONA_INNODB_VERSION) +#define INNODB_VERSION_STR "5.5.45-MariaDB-" IB_TO_STR(PERCONA_INNODB_VERSION) #define REFMAN "http://dev.mysql.com/doc/refman/" \ IB_TO_STR(MYSQL_MAJOR_VERSION) "." \ diff --git a/storage/xtradb/os/os0file.c b/storage/xtradb/os/os0file.c index e33f086c9490d5355332818489eabba2b4644fe0..3cec27f5c970971ccfff6bded3d8da6e6b155df5 100644 --- a/storage/xtradb/os/os0file.c +++ b/storage/xtradb/os/os0file.c @@ -1,6 +1,6 @@ /*********************************************************************** -Copyright (c) 1995, 2010, Innobase Oy. All Rights Reserved. +Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Percona Inc. Portions of this file contain modifications contributed and copyrighted @@ -1376,16 +1376,19 @@ os_file_create_simple_no_error_handling_func( #else /* __WIN__ */ os_file_t file; int create_flag; + const char* mode_str = NULL; ut_a(name); if (create_mode == OS_FILE_OPEN) { + mode_str = "OPEN"; if (access_type == OS_FILE_READ_ONLY) { create_flag = O_RDONLY; } else { create_flag = O_RDWR; } } else if (create_mode == OS_FILE_CREATE) { + mode_str = "CREATE"; create_flag = O_RDWR | O_CREAT | O_EXCL; } else { create_flag = 0; @@ -1410,6 +1413,14 @@ os_file_create_simple_no_error_handling_func( #endif } else { *success = TRUE; + + /* This function is always called for data files, we should + disable OS caching (O_DIRECT) here as we do in + os_file_create_func(), so we open the same file in the same + mode, see man page of open(2). */ + if (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT) { + os_file_set_nocache(file, name, mode_str); + } } return(file); diff --git a/storage/xtradb/row/row0purge.c b/storage/xtradb/row/row0purge.c index efcfdc3bac540c94b7ff71bb5f736733534dc7c8..1e87016bc5e90d4f2bb6d29173c84ca054050396 100644 --- a/storage/xtradb/row/row0purge.c +++ b/storage/xtradb/row/row0purge.c @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1997, 2011, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -43,6 +43,7 @@ Created 3/14/1997 Heikki Tuuri #include "row0vers.h" #include "row0mysql.h" #include "log0log.h" +#include "rem0cmp.h" /************************************************************************* IMPORTANT NOTE: Any operation that generates redo MUST check that there @@ -80,7 +81,7 @@ row_purge_node_create( /***********************************************************//** Repositions the pcur in the purge node on the clustered index record, -if found. +if found. If the record is not found, close pcur. @return TRUE if the record was found */ static ibool @@ -90,23 +91,28 @@ row_purge_reposition_pcur( purge_node_t* node, /*!< in: row purge node */ mtr_t* mtr) /*!< in: mtr */ { - ibool found; - if (node->found_clust) { - found = btr_pcur_restore_position(mode, &(node->pcur), mtr); + ut_ad(row_purge_validate_pcur(node)); - return(found); - } + node->found_clust = btr_pcur_restore_position( + mode, &(node->pcur), mtr); + + } else { - found = row_search_on_row_ref(&(node->pcur), mode, node->table, - node->ref, mtr); - node->found_clust = found; + node->found_clust = row_search_on_row_ref( + &(node->pcur), mode, node->table, node->ref, mtr); - if (found) { - btr_pcur_store_position(&(node->pcur), mtr); + if (node->found_clust) { + btr_pcur_store_position(&(node->pcur), mtr); + } } - return(found); + /* Close the current cursor if we fail to position it correctly. */ + if (!node->found_clust) { + btr_pcur_close(&node->pcur); + } + + return(node->found_clust); } /***********************************************************//** @@ -143,8 +149,8 @@ row_purge_remove_clust_if_poss_low( if (!success) { /* The record is already removed */ - - btr_pcur_commit_specify_mtr(pcur, &mtr); + /* Persistent cursor is closed if reposition fails. */ + mtr_commit(&mtr); return(TRUE); } @@ -258,7 +264,12 @@ row_purge_poss_sec( btr_pcur_get_rec(&node->pcur), &mtr, index, entry); - btr_pcur_commit_specify_mtr(&node->pcur, &mtr); + /* Persistent cursor is closed if reposition fails. */ + if (node->found_clust) { + btr_pcur_commit_specify_mtr(&node->pcur, &mtr); + } else { + mtr_commit(&mtr); + } return(can_delete); } @@ -806,3 +817,54 @@ row_purge_step( return(thr); } + +#ifdef UNIV_DEBUG +/***********************************************************//** +Validate the persisent cursor in the purge node. The purge node has two +references to the clustered index record - one via the ref member, and the +other via the persistent cursor. These two references must match each +other if the found_clust flag is set. +@return true if the stored copy of persistent cursor is consistent +with the ref member.*/ +UNIV_INTERN +ibool +row_purge_validate_pcur( + purge_node_t* node) +{ + dict_index_t* clust_index; + ulint* offsets; + int st; + + if (!node->found_clust) { + return(TRUE); + } + + if (node->index == NULL) { + return(TRUE); + } + + if (node->pcur.old_stored != BTR_PCUR_OLD_STORED) { + return(TRUE); + } + + clust_index = node->pcur.btr_cur.index; + + offsets = rec_get_offsets(node->pcur.old_rec, clust_index, NULL, + node->pcur.old_n_fields, &node->heap); + + /* Here we are comparing the purge ref record and the stored initial + part in persistent cursor. Both cases we store n_uniq fields of the + cluster index and so it is fine to do the comparison. We note this + dependency here as pcur and ref belong to different modules. */ + st = cmp_dtuple_rec(node->ref, node->pcur.old_rec, offsets); + + if (st != 0) { + fprintf(stderr, "Purge node pcur validation failed\n"); + dtuple_print(stderr, node->ref); + rec_print(stderr, node->pcur.old_rec, clust_index); + return(FALSE); + } + + return(TRUE); +} +#endif /* UNIV_DEBUG */ diff --git a/storage/xtradb/srv/srv0srv.c b/storage/xtradb/srv/srv0srv.c index 55d08ceb26c998b3bfa5b78bbcbcfcd9662018fa..5efb5d016c67de8ad5bbbe219923498c62a7fa9f 100644 --- a/storage/xtradb/srv/srv0srv.c +++ b/storage/xtradb/srv/srv0srv.c @@ -438,7 +438,6 @@ UNIV_INTERN ulong srv_ibuf_accel_rate = 100; UNIV_INTERN ulint srv_checkpoint_age_target = 0; UNIV_INTERN ulong srv_flush_neighbor_pages = 1; /* 0:disable 1:area 2:contiguous */ -UNIV_INTERN ulint srv_deprecated_enable_unsafe_group_commit = 0; UNIV_INTERN ulong srv_read_ahead = 3; /* 1: random 2: linear 3: Both */ UNIV_INTERN ulong srv_adaptive_flushing_method = 0; /* 0: native 1: estimate 2: keep_average */ diff --git a/storage/xtradb/srv/srv0start.c b/storage/xtradb/srv/srv0start.c index 39a61935aed33ff8f89021722c3f7c363effaaa5..e4f4047393dfe77e412bdcd38516bc0b97db7c25 100644 --- a/storage/xtradb/srv/srv0start.c +++ b/storage/xtradb/srv/srv0start.c @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2009, Percona Inc. @@ -2501,9 +2501,9 @@ innobase_shutdown_for_mysql(void) ibuf_close(); log_shutdown(); - lock_sys_close(); trx_sys_file_format_close(); trx_sys_close(); + lock_sys_close(); mutex_free(&srv_monitor_file_mutex); mutex_free(&srv_dict_tmpfile_mutex); diff --git a/storage/xtradb/sync/sync0arr.c b/storage/xtradb/sync/sync0arr.c index 73cd6ea1739054244c8de0ee603436b360b3b372..3bf53696148f6ca6f6bc2f47ce7b4142415e8ad0 100644 --- a/storage/xtradb/sync/sync0arr.c +++ b/storage/xtradb/sync/sync0arr.c @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1995, 2011, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2013, 2014, MariaDB Corporation. All Rights Reserved. @@ -1114,8 +1114,9 @@ sync_array_output_info( os_thread_id_t r; fprintf(file, - "OS WAIT ARRAY INFO: reservation count %ld, signal count %ld\n", - (long) arr->res_count, (long) arr->sg_count); + "OS WAIT ARRAY INFO: reservation count " ULINTPF + ", signal count " ULINTPF "\n", + arr->res_count, arr->sg_count); i = 0; count = 0; diff --git a/storage/xtradb/trx/trx0trx.c b/storage/xtradb/trx/trx0trx.c index bc511504db97d8ee72626b650fc860bbb6283750..11b0de49e10310d2ac38437f57b978ee9beb56ec 100644 --- a/storage/xtradb/trx/trx0trx.c +++ b/storage/xtradb/trx/trx0trx.c @@ -768,9 +768,9 @@ trx_lists_init_at_db_start(void) " anyway.\n"); trx->state = TRX_ACTIVE; - trx_reserve_descriptor( - trx); } + + trx_reserve_descriptor(trx); } else { trx->state = TRX_COMMITTED_IN_MEMORY; diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh index aaeed444e2f9f2e1c47f0c99e02a3afbae1d27d0..5af4783f9195a52a620922ac64f6d96c80406c95 100644 --- a/support-files/mysql.spec.sh +++ b/support-files/mysql.spec.sh @@ -635,7 +635,7 @@ install -m 644 "%{malloc_lib_source}" \ # Check local settings to support them. if [ -x %{_bindir}/my_print_defaults ] then - mysql_datadir=`%{_bindir}/my_print_defaults server mysqld | grep '^--datadir=' | sed -n 's/--datadir=//p'` + mysql_datadir=`%{_bindir}/my_print_defaults server mysqld | grep '^--datadir=' | tail -1 | sed -n 's/--datadir=//p'` PID_FILE_PATT=`%{_bindir}/my_print_defaults server mysqld | grep '^--pid-file=' | sed -n 's/--pid-file=//p'` fi if [ -z "$mysql_datadir" ] @@ -740,7 +740,7 @@ esac STATUS_FILE=$mysql_datadir/RPM_UPGRADE_MARKER -if [ -f $STATUS_FILE ]; then +if [ -f "$STATUS_FILE" ]; then echo "Some previous upgrade was not finished:" ls -ld $STATUS_FILE echo "Please check its status, then do" @@ -811,7 +811,7 @@ fi # Check local settings to support them. if [ -x %{_bindir}/my_print_defaults ] then - mysql_datadir=`%{_bindir}/my_print_defaults server mysqld | grep '^--datadir=' | sed -n 's/--datadir=//p'` + mysql_datadir=`%{_bindir}/my_print_defaults server mysqld | grep '^--datadir=' | tail -1 | sed -n 's/--datadir=//p'` fi if [ -z "$mysql_datadir" ] then @@ -824,8 +824,8 @@ STATUS_FILE=$mysql_datadir/RPM_UPGRADE_MARKER # ---------------------------------------------------------------------- # Create data directory if needed, check whether upgrade or install # ---------------------------------------------------------------------- -if [ ! -d $mysql_datadir ] ; then mkdir -m 755 $mysql_datadir; fi -if [ -f $STATUS_FILE ] ; then +if [ ! -d "$mysql_datadir" ] ; then mkdir -m 755 "$mysql_datadir" ; fi +if [ -f "$STATUS_FILE" ] ; then SERVER_TO_START=`grep '^SERVER_TO_START=' $STATUS_FILE | cut -c17-` else SERVER_TO_START='' @@ -1003,7 +1003,7 @@ fi # Check local settings to support them. if [ -x %{_bindir}/my_print_defaults ] then - mysql_datadir=`%{_bindir}/my_print_defaults server mysqld | grep '^--datadir=' | sed -n 's/--datadir=//p'` + mysql_datadir=`%{_bindir}/my_print_defaults server mysqld | grep '^--datadir=' | tail -1 | sed -n 's/--datadir=//p'` fi if [ -z "$mysql_datadir" ] then @@ -1014,7 +1014,7 @@ NEW_VERSION=%{mysql_version}-%{release} STATUS_FILE=$mysql_datadir/RPM_UPGRADE_MARKER-LAST # Note the difference! STATUS_HISTORY=$mysql_datadir/RPM_UPGRADE_HISTORY -if [ -f $STATUS_FILE ] ; then +if [ -f "$STATUS_FILE" ] ; then SERVER_TO_START=`grep '^SERVER_TO_START=' $STATUS_FILE | cut -c17-` else # This should never happen, but let's be prepared diff --git a/vio/viosslfactories.c b/vio/viosslfactories.c index 78916f843e0d4ca1c28f07ac2c9217efd2824908..c889b90a2e25fe4166877e5832c216d79c801a7e 100644 --- a/vio/viosslfactories.c +++ b/vio/viosslfactories.c @@ -21,31 +21,42 @@ static my_bool ssl_algorithms_added = FALSE; static my_bool ssl_error_strings_loaded= FALSE; -/* the function below was generated with "openssl dhparam -2 -C 1024" */ +/* the function below was generated with "openssl dhparam -2 -C 2048" */ static -DH *get_dh1024() +DH *get_dh2048() { - static unsigned char dh1024_p[]={ - 0xEC,0x46,0x7E,0xF9,0x4E,0x10,0x29,0xDC,0x44,0x97,0x71,0xFD, - 0x71,0xC6,0x9F,0x0D,0xD1,0x09,0xF6,0x58,0x6F,0xAD,0xCA,0xF4, - 0x37,0xD5,0xC3,0xBD,0xC3,0x9A,0x51,0x66,0x2C,0x58,0xBD,0x02, - 0xBD,0xBA,0xBA,0xFC,0xE7,0x0E,0x5A,0xE5,0x97,0x81,0xC3,0xF3, - 0x28,0x2D,0xAD,0x00,0x91,0xEF,0xF8,0xF0,0x5D,0xE9,0xE7,0x18, - 0xE2,0xAD,0xC4,0x70,0xC5,0x3C,0x12,0x8A,0x80,0x6A,0x9F,0x3B, - 0x00,0xA2,0x8F,0xA9,0x26,0xB0,0x0E,0x7F,0xED,0xF6,0xC2,0x03, - 0x81,0xB5,0xC5,0x41,0xD0,0x00,0x2B,0x21,0xD4,0x4B,0x74,0xA6, - 0xD7,0x1A,0x0E,0x82,0xC8,0xEE,0xD4,0xB1,0x6F,0xB4,0x79,0x01, - 0x8A,0xF1,0x12,0xD7,0x3C,0xFD,0xCB,0x9B,0xAE,0x1C,0xA9,0x0F, - 0x3D,0x0F,0xF8,0xD6,0x7D,0xDE,0xD6,0x0B, + static unsigned char dh2048_p[]={ + 0xA1,0xBB,0x7C,0x20,0xC5,0x5B,0xC0,0x7B,0x21,0x8B,0xD6,0xA8, + 0x15,0xFC,0x3B,0xBA,0xAB,0x9F,0xDF,0x68,0xC4,0x79,0x78,0x0D, + 0xC1,0x12,0x64,0xE4,0x15,0xC9,0x66,0xDB,0xF6,0xCB,0xB3,0x39, + 0x02,0x5B,0x78,0x62,0xFB,0x09,0xAE,0x09,0x6B,0xDD,0xD4,0x5D, + 0x97,0xBC,0xDC,0x7F,0xE6,0xD6,0xF1,0xCB,0xF5,0xEB,0xDA,0xA7, + 0x2E,0x5A,0x43,0x2B,0xE9,0x40,0xE2,0x85,0x00,0x1C,0xC0,0x0A, + 0x98,0x77,0xA9,0x31,0xDE,0x0B,0x75,0x4D,0x1E,0x1F,0x16,0x83, + 0xCA,0xDE,0xBD,0x21,0xFC,0xC1,0x82,0x37,0x36,0x33,0x0B,0x66, + 0x06,0x3C,0xF3,0xAF,0x21,0x57,0x57,0x80,0xF6,0x94,0x1B,0xA9, + 0xD4,0xF6,0x8F,0x18,0x62,0x0E,0xC4,0x22,0xF9,0x5B,0x62,0xCC, + 0x3F,0x19,0x95,0xCF,0x4B,0x00,0xA6,0x6C,0x0B,0xAF,0x9F,0xD5, + 0xFA,0x3D,0x6D,0xDA,0x30,0x83,0x07,0x91,0xAC,0x15,0xFF,0x8F, + 0x59,0x54,0xEA,0x25,0xBC,0x4E,0xEB,0x6A,0x54,0xDF,0x75,0x09, + 0x72,0x0F,0xEF,0x23,0x70,0xE0,0xA8,0x04,0xEA,0xFF,0x90,0x54, + 0xCD,0x84,0x18,0xC0,0x75,0x91,0x99,0x0F,0xA1,0x78,0x0C,0x07, + 0xB7,0xC5,0xDE,0x55,0x06,0x7B,0x95,0x68,0x2C,0x33,0x39,0xBC, + 0x2C,0xD0,0x6D,0xDD,0xFA,0xDC,0xB5,0x8F,0x82,0x39,0xF8,0x67, + 0x44,0xF1,0xD8,0xF7,0x78,0x11,0x9A,0x77,0x9B,0x53,0x47,0xD6, + 0x2B,0x5D,0x67,0xB8,0xB7,0xBC,0xC1,0xD7,0x79,0x62,0x15,0xC2, + 0xC5,0x83,0x97,0xA7,0xF8,0xB4,0x9C,0xF6,0x8F,0x9A,0xC7,0xDA, + 0x1B,0xBB,0x87,0x07,0xA7,0x71,0xAD,0xB2,0x8A,0x50,0xF8,0x26, + 0x12,0xB7,0x3E,0x0B, }; - static unsigned char dh1024_g[]={ + static unsigned char dh2048_g[]={ 0x02, }; DH *dh; if ((dh=DH_new()) == NULL) return(NULL); - dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL); - dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL); + dh->p=BN_bin2bn(dh2048_p,sizeof(dh2048_p),NULL); + dh->g=BN_bin2bn(dh2048_g,sizeof(dh2048_g),NULL); if ((dh->p == NULL) || (dh->g == NULL)) { DH_free(dh); return(NULL); } return(dh); @@ -259,7 +270,7 @@ new_VioSSLFd(const char *key_file, const char *cert_file, } /* DH stuff */ - dh=get_dh1024(); + dh=get_dh2048(); SSL_CTX_set_tmp_dh(ssl_fd->ssl_context, dh); DH_free(dh); diff --git a/win/packaging/ca/CustomAction.cpp b/win/packaging/ca/CustomAction.cpp index 17bfca1debb909869c2f0cf15573cdf603267c41..3cb8520b65d4a184ae7fe480b1894ff6d9f1a87a 100644 --- a/win/packaging/ca/CustomAction.cpp +++ b/win/packaging/ca/CustomAction.cpp @@ -17,6 +17,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define UNICODE #endif +#undef NOMINMAX + #include #include #include