From a90934f371a8979dca5461418b17f34deda5d14e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Tue, 3 Nov 2015 11:31:42 +0200 Subject: [PATCH] Imported Upstream version 5.5.46 --- Docs/INFO_SRC | 10 +- VERSION | 2 +- client/CMakeLists.txt | 3 +- client/mysql_upgrade.c | 3 +- client/mysqlbinlog.cc | 7 + client/mysqlimport.c | 19 +- client/mysqlslap.c | 49 +- cmake/os/Windows.cmake | 10 +- extra/yassl/README | 29 + extra/yassl/include/openssl/ssl.h | 2 +- extra/yassl/include/yassl_error.hpp | 3 +- extra/yassl/src/buffer.cpp | 2 +- extra/yassl/src/handshake.cpp | 2 + extra/yassl/src/ssl.cpp | 29 +- extra/yassl/src/yassl_error.cpp | 4 + extra/yassl/src/yassl_imp.cpp | 15 +- extra/yassl/taocrypt/src/asn.cpp | 9 +- extra/yassl/taocrypt/src/rsa.cpp | 4 + extra/yassl/testsuite/cipher-test.sh | 1 + mysql-test/disabled.def | 3 +- .../mix_innodb_myisam_binlog.test | 2 +- mysql-test/include/restart_mysqld.inc | 17 +- mysql-test/mysql-test-run.pl | 1 + mysql-test/r/func_gconcat.result | 16 + mysql-test/r/func_if.result | 17 + mysql-test/r/func_misc.result | 211 ++ mysql-test/r/information_schema2.result | 24 +- mysql-test/r/innodb_load_xa.result | 2 + mysql-test/r/loadxml.result | 27 + mysql-test/r/lowercase_fs_on.result | 3 + mysql-test/r/lowercase_table3.result | 11 - ...e_recover.result => myisam_recover.result} | 57 +- mysql-test/r/mysqldump.result | 29 +- mysql-test/r/partition_error.result | 2 +- mysql-test/r/sp-group.result | 156 ++ mysql-test/r/subselect.result | 70 +- mysql-test/r/subselect_mat.result | 18 + mysql-test/r/subselect_no_mat.result | 70 +- mysql-test/r/subselect_no_opts.result | 70 +- mysql-test/r/subselect_no_scache.result | 70 +- mysql-test/r/subselect_no_semijoin.result | 70 +- mysql-test/r/subselect_sj_mat.result | 18 + mysql-test/r/update.result | 15 + mysql-test/r/view.result | 50 + mysql-test/std_data/bug16171518_1.dat | 59 + mysql-test/std_data/bug16171518_2.dat | 12 + .../binlog/r/binlog_mysqlbinlog_row.result | 6 +- .../r/binlog_mysqlbinlog_row_innodb.result | 72 +- .../r/binlog_mysqlbinlog_row_myisam.result | 72 +- .../r/binlog_row_mix_innodb_myisam.result | 2 +- .../r/binlog_stm_mix_innodb_myisam.result | 4 +- .../r/strings_charsets_update_delete.result | Bin 112951 -> 113361 bytes .../suite/innodb/r/add_constraint.result | 13 + .../suite/innodb/r/innodb-fk-warnings.result | 105 + mysql-test/suite/innodb/r/innodb-fk.result | 3 + .../suite/innodb/r/innodb_bug68148.result | 36 + .../suite/innodb/r/innodb_uninstall.result | 22 + mysql-test/suite/innodb/t/add_constraint.test | 21 + .../suite/innodb/t/innodb-fk-warnings.test | 130 + .../suite/innodb/t/innodb_bug60229-master.opt | 1 - .../suite/innodb/t/innodb_bug60229.test | 4 + .../suite/innodb/t/innodb_bug68148.test | 41 + .../suite/innodb/t/innodb_uninstall.opt | 3 + .../suite/innodb/t/innodb_uninstall.test | 58 + mysql-test/suite/innodb/t/xa_recovery.test | 6 + mysql-test/suite/jp/t/jp_enum_sjis-master.opt | 1 - mysql-test/suite/jp/t/jp_enum_sjis.test | 4 + mysql-test/suite/jp/t/jp_enum_ucs2-master.opt | 1 - mysql-test/suite/jp/t/jp_enum_ucs2.test | 4 + mysql-test/suite/jp/t/jp_enum_ujis-master.opt | 1 - mysql-test/suite/jp/t/jp_enum_ujis.test | 4 + mysql-test/suite/jp/t/jp_enum_utf8-master.opt | 1 - mysql-test/suite/jp/t/jp_enum_utf8.test | 4 + .../suite/ndb/r/ndb_restore_discover.result | 33 + .../suite/ndb/t/ndb_restore_discover.test | 70 + .../suite/perfschema/r/query_cache.result | 4 +- .../suite/perfschema/t/query_cache.test | 2 + .../plugins/r/feedback_plugin_load.result | 7 +- .../plugins/r/feedback_plugin_send.result | 7 +- .../suite/plugins/t/feedback_plugin_load.test | 19 +- .../suite/plugins/t/feedback_plugin_send.test | 9 + mysql-test/suite/rpl/r/rpl_alter.result | 105 + .../r/show_status_stop_slave_race-7126.result | 2 + mysql-test/suite/rpl/t/rpl_alter.test | 53 + .../suite/rpl/t/rpl_innodb_bug30888.opt | 1 + .../t/show_status_stop_slave_race-7126.test | 7 + mysql-test/t/func_gconcat.test | 11 + mysql-test/t/func_if.test | 14 + mysql-test/t/func_misc.test | 204 ++ mysql-test/t/information_schema2.test | 19 +- mysql-test/t/innodb_load_xa.test | 3 + mysql-test/t/loadxml.test | 14 + mysql-test/t/lowercase_fs_on.test | 38 + mysql-test/t/lowercase_table3-master.opt | 1 - mysql-test/t/lowercase_table3.test | 37 - ...r-master.opt => myisam_recover-master.opt} | 0 ...merge_recover.test => myisam_recover.test} | 77 +- mysql-test/t/mysql_upgrade.test | 1 - mysql-test/t/mysqldump.test | 36 +- mysql-test/t/partition_error.test | 2 +- mysql-test/t/sp-group.test | 187 ++ mysql-test/t/subselect.test | 76 +- mysql-test/t/subselect_sj_mat.test | 17 +- mysql-test/t/update.test | 15 + mysql-test/t/view.test | 65 + mysys/ptr_cmp.c | 3 +- regex/regcomp.c | 24 +- sql/field.cc | 3 +- sql/field.h | 19 +- sql/field_conv.cc | 16 +- sql/item.cc | 56 +- sql/item.h | 7 +- sql/item_cmpfunc.cc | 53 +- sql/item_func.cc | 71 +- sql/item_func.h | 39 +- sql/item_subselect.cc | 34 +- sql/item_subselect.h | 6 + sql/item_sum.cc | 14 +- sql/item_sum.h | 1 + sql/log.cc | 33 +- sql/log_event.cc | 25 +- sql/mysqld.cc | 34 +- sql/opt_range.cc | 17 +- sql/opt_subselect.cc | 49 +- sql/partition_info.cc | 16 +- sql/rpl_handler.cc | 54 +- sql/rpl_utility.cc | 21 +- sql/slave.cc | 10 +- sql/sql_acl.cc | 43 +- sql/sql_base.cc | 73 +- sql/sql_class.cc | 4 + sql/sql_class.h | 16 +- sql/sql_handler.cc | 37 +- sql/sql_handler.h | 5 +- sql/sql_insert.cc | 56 +- sql/sql_lex.cc | 2 +- sql/sql_lex.h | 2 - sql/sql_load.cc | 13 +- sql/sql_parse.cc | 35 +- sql/sql_select.cc | 19 +- sql/sql_select.h | 4 + sql/sql_show.cc | 20 +- sql/sql_table.cc | 6 + sql/sql_test.cc | 7 +- sql/sql_union.cc | 3 +- sql/sql_yacc.cc | 2164 +++++++++-------- sql/sql_yacc.yy | 12 + sql/table.cc | 2 +- storage/innobase/CMakeLists.txt | 18 +- storage/innobase/btr/btr0cur.c | 31 +- storage/innobase/dict/dict0crea.c | 143 +- storage/innobase/dict/dict0dict.c | 539 +++- storage/innobase/handler/ha_innodb.cc | 27 + storage/innobase/include/dict0crea.h | 11 + storage/innobase/include/ha_prototypes.h | 9 + storage/innobase/include/os0sync.h | 152 +- storage/innobase/include/row0purge.h | 13 +- storage/innobase/include/sync0sync.h | 9 +- storage/innobase/include/sync0sync.ic | 9 +- storage/innobase/lock/lock0lock.c | 10 +- storage/innobase/os/os0file.c | 13 +- storage/innobase/row/row0purge.c | 93 +- storage/perfschema/pfs_timer.cc | 43 +- .../tokudb/ft-index/util}/tests/sm-basic.cc | 0 .../util}/tests/sm-crash-double-free.cc | 0 .../mysql-test/tokudb_bugs}/r/db805.result | 0 .../mysql-test/tokudb_bugs}/r/db806.result | 0 .../mysql-test/tokudb_bugs}/r/db811.result | 0 .../mysql-test/tokudb_bugs}/r/db811s.result | 0 .../mysql-test/tokudb_bugs}/r/db823.result | 0 .../mysql-test/tokudb_bugs}/t/db805.test | 0 .../mysql-test/tokudb_bugs}/t/db806.test | 0 .../mysql-test/tokudb_bugs}/t/db811.test | 0 .../mysql-test/tokudb_bugs}/t/db811s.test | 0 .../mysql-test/tokudb_bugs}/t/db823.test | 0 storage/xtradb/buf/buf0buf.c | 6 +- storage/xtradb/dict/dict0crea.c | 143 +- storage/xtradb/dict/dict0dict.c | 542 ++++- storage/xtradb/handler/ha_innodb.cc | 60 +- storage/xtradb/include/dict0crea.h | 11 + storage/xtradb/include/ha_prototypes.h | 9 + storage/xtradb/include/row0purge.h | 14 +- storage/xtradb/include/srv0srv.h | 1 - storage/xtradb/include/univ.i | 4 +- storage/xtradb/os/os0file.c | 13 +- storage/xtradb/row/row0purge.c | 94 +- storage/xtradb/srv/srv0srv.c | 1 - storage/xtradb/srv/srv0start.c | 4 +- storage/xtradb/sync/sync0arr.c | 7 +- storage/xtradb/trx/trx0trx.c | 4 +- support-files/mysql.spec.sh | 14 +- vio/viosslfactories.c | 47 +- win/packaging/ca/CustomAction.cpp | 2 + 193 files changed, 6348 insertions(+), 1934 deletions(-) create mode 100644 mysql-test/r/lowercase_fs_on.result delete mode 100644 mysql-test/r/lowercase_table3.result rename mysql-test/r/{merge_recover.result => myisam_recover.result} (62%) create mode 100644 mysql-test/r/sp-group.result create mode 100644 mysql-test/std_data/bug16171518_1.dat create mode 100644 mysql-test/std_data/bug16171518_2.dat create mode 100644 mysql-test/suite/innodb/r/add_constraint.result create mode 100644 mysql-test/suite/innodb/r/innodb-fk-warnings.result create mode 100644 mysql-test/suite/innodb/r/innodb_bug68148.result create mode 100644 mysql-test/suite/innodb/r/innodb_uninstall.result create mode 100644 mysql-test/suite/innodb/t/add_constraint.test create mode 100644 mysql-test/suite/innodb/t/innodb-fk-warnings.test delete mode 100644 mysql-test/suite/innodb/t/innodb_bug60229-master.opt create mode 100644 mysql-test/suite/innodb/t/innodb_bug68148.test create mode 100644 mysql-test/suite/innodb/t/innodb_uninstall.opt create mode 100644 mysql-test/suite/innodb/t/innodb_uninstall.test delete mode 100644 mysql-test/suite/jp/t/jp_enum_sjis-master.opt delete mode 100644 mysql-test/suite/jp/t/jp_enum_ucs2-master.opt delete mode 100644 mysql-test/suite/jp/t/jp_enum_ujis-master.opt delete mode 100644 mysql-test/suite/jp/t/jp_enum_utf8-master.opt create mode 100644 mysql-test/suite/ndb/r/ndb_restore_discover.result create mode 100644 mysql-test/suite/ndb/t/ndb_restore_discover.test create mode 100644 mysql-test/suite/rpl/t/rpl_innodb_bug30888.opt create mode 100644 mysql-test/t/lowercase_fs_on.test delete mode 100644 mysql-test/t/lowercase_table3-master.opt delete mode 100644 mysql-test/t/lowercase_table3.test rename mysql-test/t/{merge_recover-master.opt => myisam_recover-master.opt} (100%) rename mysql-test/t/{merge_recover.test => myisam_recover.test} (61%) create mode 100644 mysql-test/t/sp-group.test rename {util => storage/tokudb/ft-index/util}/tests/sm-basic.cc (100%) rename {util => storage/tokudb/ft-index/util}/tests/sm-crash-double-free.cc (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/r/db805.result (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/r/db806.result (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/r/db811.result (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/r/db811s.result (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/r/db823.result (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/t/db805.test (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/t/db806.test (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/t/db811.test (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/t/db811s.test (100%) rename {mysql-test/suite/tokudb.bugs => storage/tokudb/mysql-test/tokudb_bugs}/t/db823.test (100%) diff --git a/Docs/INFO_SRC b/Docs/INFO_SRC index 56070a85..bc3dc615 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 fa548609..45f770d8 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 e4507f9c..e3edacc3 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 d513d5d8..ee6845de 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 57492577..250dc609 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 686f26ce..a22774bc 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 536535be..03301b01 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 16c2743a..5999ae68 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 da399c3d..bf0e1c9f 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 24acc7e8..b0a7592f 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 beba7b0b..d63244dc 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 ee5e0cc0..532da387 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 33303b11..aa2de393 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 9c1016ba..9516e8b9 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 36e286a7..fec6a339 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 742d0795..e1a41008 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 d521088d..c419ec0a 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 79a8a8f1..73f678e2 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 5ce29459..d3e69146 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 6dc3066e..31089060 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 b41bfeab..336b1111 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 7cb9c799..ed0fe64a 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 566423a1..26b31d34 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 f12a0c11..0bc31a5e 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 c7f548ae..61f63cc7 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 d5db28f0..a121bd32 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 3f7f3ecd..7e9bdd70 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 e738ca6e..8b8de203 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 7742f456..1128caf9 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 00000000..a090f46c --- /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 22e80aae..00000000 --- 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 871c12ca..0829c1e8 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 49fd1992..43601f4a 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 0fe1034d..0c15ded0 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 00000000..9744bbee --- /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 4afde939..ba52fd90 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 7039bbfc..e4843929 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 9df216da..d8d5c4ef 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 7b93f277..78908bc6 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 b6d3a89e..d1de4b8f 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 d51d211e..524a5ddc 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 58810670..cfcbf612 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 3f3a3ac0..3ea58553 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 cbacb2c1..57065d74 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 00000000..b65b9359 --- /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 00000000..8a483337 --- /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 469e670a..3604f5e8 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 8e75d203..e942071a 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 b4ea8551..29a17047 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 ac36412c..ed6e711a 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 c10aa7ab..7309c611 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 GIT binary patch delta 459 zcmdn~iS6Q7whf!DLc$Y^@-p+%i>!_mBLUr2br$Ey?Gns G7A62bv!3?= delta 44 ycmcckm2LYcwhf!DCg)p;PnNef1Jehs?@az=^P*YbZo9r6' (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 00000000..6da3ef32 --- /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 9b27aef9..00000000 --- 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 f7ca8211..00000000 --- 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 f2cb204e..49fe9c33 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 e4923e5f..13be03aa 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 249f16e3..e0c0ce34 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 64799574..6b6e54b1 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 00000000..2083ac97 --- /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 d1c37749..67eac0d2 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 912e9d5b..dd30b212 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 daa20509..be97dd02 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 0432db0b..fe04cdfe 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 a481b4d9..6e373e98 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 abc18174..b1074a1d 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 a24ffe28..aeeacf7f 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 130d33e4..b20bedbe 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 d6a53a9a..d24f31e4 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 f8d1c85f..878c9604 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 4aaa67d9..f8e8ead4 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 998cb1cb..0c48592e 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 ed085551..eb5b63f5 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 4b11238c..33fa49f9 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 62df666b..1107945a 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 592e7711..0ee5f73e 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 d8970ca2..adf48f6f 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 f074cc6c..86093f5d 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 9722f208..0940cb9b 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 e63884ea..c962f19f 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 0178f927..3ad7b848 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 17b24aa7..f4ac47fe 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 ebf640c2..827290fd 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 1bfa8864..d8b90170 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 9480a9e0..5b75d6c3 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 e05ad5a8..9a20f71f 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 2fe7ebb5..fe96b1de 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 c4ef699c..4588c741 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 fcd17b25..1403fe91 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 76b2031f..7b97d583 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 67db1662..68563ab1 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 c099a2af..f5c79e59 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 133f5536..7fe5ae5b 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 4500c449..640ee5d1 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 1d62acdb..9ccafa75 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 a0f8e456..aa59d762 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 b4f8b107..75ddf80e 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 4ad3f9ab..a52d55b4 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 fb7cafc5..e960a3d7 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 de5baeee..4f807ff5 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 22484748..86fc11ca 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 4139aa7d..6e589e2b 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 ec426e39..dc6bc818 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 6e2e6e06..87d3e86b 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 99085102..6aee2510 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 ec246ae8..a49dea63 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 e4dee771..f521056a 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 861f2a9b..cc494a7c 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 51dcb498..3b533909 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 ac8a1eac..dcbca492 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 cbb17fc5..ad900385 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 7c17f20c..2bdbdf7a 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 9faf580b..a58bcb18 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 3859b45e..a69d3d12 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 7fd1fde5..22b0fa42 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 fa9c9291..9a638c80 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 78f5b8dd..bc8d0d27 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 8cf3eb45..1120da8a 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 e6ce0742..559b3687 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 8fc22fbd..d792e7a6 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 efcfdc3b..9018582f 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 302548c9..3191a051 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 f8966e9b..6ef9ac0d 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 c88979b2..f7663b99 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 bd0fdf6e..cd8e4159 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 5034e7e7..37a029dd 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 762ab54a..c67910f0 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 ec2ba77f..ad0abb88 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 fa9c9291..64353bc8 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 181a58bf..3b942472 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 c31a0f20..7c19ceb9 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 e33f086c..3cec27f5 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 efcfdc3b..1e87016b 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 55d08ceb..5efb5d01 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 39a61935..e4f40473 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 73cd6ea1..3bf53696 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 bc511504..11b0de49 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 aaeed444..5af4783f 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 78916f84..c889b90a 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 17bfca1d..3cb8520b 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 -- GitLab