diff options
author | Sergei Golubchik <serg@mariadb.org> | 2018-03-25 13:02:52 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2018-03-25 13:02:52 +0200 |
commit | c764bc0a78e9359fa208e074bd327f7a852c7cb7 (patch) | |
tree | eeb5d56d225d1fdf97a016c3eae7b93c4e1f6927 /sql | |
parent | d702e463902bca7d94ff8a1a49468a5b7bdb4ba0 (diff) | |
parent | 15795b9f9a850d9587f17ef18e1ac7b5af31ec1e (diff) | |
download | mariadb-git-c764bc0a78e9359fa208e074bd327f7a852c7cb7.tar.gz |
Merge branch '10.1' into 10.2
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item_cmpfunc.h | 3 | ||||
-rw-r--r-- | sql/item_func.h | 3 | ||||
-rw-r--r-- | sql/item_subselect.cc | 2 | ||||
-rw-r--r-- | sql/opt_subselect.cc | 4 | ||||
-rw-r--r-- | sql/sql_class.cc | 4 | ||||
-rw-r--r-- | sql/sql_parse.cc | 4 | ||||
-rw-r--r-- | sql/sql_prepare.cc | 4 | ||||
-rw-r--r-- | sql/sql_show.cc | 7 | ||||
-rw-r--r-- | sql/wsrep_check_opts.cc | 3 | ||||
-rw-r--r-- | sql/wsrep_mysqld.cc | 2 | ||||
-rw-r--r-- | sql/wsrep_sst.cc | 23 |
11 files changed, 27 insertions, 32 deletions
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 5f0d2423969..de1b27cff1a 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -345,6 +345,7 @@ public: bool is_null(); longlong val_int(); void cleanup(); + enum Functype functype() const { return IN_OPTIMIZER_FUNC; } const char *func_name() const { return "<in_optimizer>"; } Item_cache **get_cache() { return &cache; } void keep_top_level_cache(); @@ -362,6 +363,8 @@ public: void reset_cache() { cache= NULL; } virtual void print(String *str, enum_query_type query_type); void restore_first_argument(); + Item* get_wrapped_in_subselect_item() + { return args[1]; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) { return get_item_copy<Item_in_optimizer>(thd, mem_root, this); } }; diff --git a/sql/item_func.h b/sql/item_func.h index c9b5841e293..0fb365f8107 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -67,7 +67,8 @@ public: NOW_FUNC, NOW_UTC_FUNC, SYSDATE_FUNC, TRIG_COND_FUNC, SUSERVAR_FUNC, GUSERVAR_FUNC, COLLATE_FUNC, EXTRACT_FUNC, CHAR_TYPECAST_FUNC, FUNC_SP, UDF_FUNC, - NEG_FUNC, GSYSVAR_FUNC, DYNCOL_FUNC, JSON_EXTRACT_FUNC }; + NEG_FUNC, GSYSVAR_FUNC, IN_OPTIMIZER_FUNC, DYNCOL_FUNC, + JSON_EXTRACT_FUNC }; enum Type type() const { return FUNC_ITEM; } virtual enum Functype functype() const { return UNKNOWN_FUNC; } Item_func(THD *thd): Item_func_or_sum(thd), allowed_arg_cols(1) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index d36c34797dc..4214980c36c 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -1827,7 +1827,7 @@ Item_in_subselect::single_value_transformer(JOIN *join) Item* join_having= join->having ? join->having : join->tmp_having; if (!(join_having || select_lex->with_sum_func || select_lex->group_list.elements) && - select_lex->table_list.elements == 0 && + select_lex->table_list.elements == 0 && !join->conds && !select_lex->master_unit()->is_union()) { Item *where_item= (Item*) select_lex->item_list.head(); diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 3ed2a14bef1..9e456bd3969 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -1010,6 +1010,10 @@ bool check_for_outer_joins(List<TABLE_LIST> *join_list) void find_and_block_conversion_to_sj(Item *to_find, List_iterator_fast<Item_in_subselect> &li) { + if (to_find->type() == Item::FUNC_ITEM && + ((Item_func*)to_find)->functype() == Item_func::IN_OPTIMIZER_FUNC) + to_find= ((Item_in_optimizer*)to_find)->get_wrapped_in_subselect_item(); + if (to_find->type() != Item::SUBSELECT_ITEM || ((Item_subselect *) to_find)->substype() != Item_subselect::IN_SUBS) return; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index d854d6de110..ddb848a6576 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -2680,15 +2680,19 @@ Item_change_list::check_and_register_item_tree_change(Item **place, void Item_change_list::rollback_item_tree_changes() { + DBUG_ENTER("THD::rollback_item_tree_changes"); I_List_iterator<Item_change_record> it(change_list); Item_change_record *change; while ((change= it++)) { + DBUG_PRINT("info", ("Rollback: %p (%p) <- %p", + *change->place, change->place, change->old_value)); *change->place= change->old_value; } /* We can forget about changes memory: it's allocated in runtime memroot */ change_list.empty(); + DBUG_VOID_RETURN; } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 96f6196bc08..33039847cb7 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1152,7 +1152,6 @@ static enum enum_server_command fetch_command(THD *thd, char *packet) #ifdef WITH_WSREP static bool wsrep_tables_accessible_when_detached(const TABLE_LIST *tables) { - bool has_tables = false; for (const TABLE_LIST *table= tables; table; table= table->next_global) { TABLE_CATEGORY c; @@ -1165,9 +1164,8 @@ static bool wsrep_tables_accessible_when_detached(const TABLE_LIST *tables) { return false; } - has_tables = true; } - return has_tables; + return true; } #endif /* WITH_WSREP */ #ifndef EMBEDDED_LIBRARY diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 3e1dcc22acd..ee92df7c6b8 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -4657,6 +4657,7 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) Statement stmt_backup; Query_arena *old_stmt_arena; bool error= TRUE; + bool qc_executed= FALSE; char saved_cur_db_name_buf[SAFE_NAME_LEN+1]; LEX_STRING saved_cur_db_name= @@ -4779,6 +4780,7 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) thd->lex->sql_command= SQLCOM_SELECT; status_var_increment(thd->status_var.com_stat[SQLCOM_SELECT]); thd->update_stats(); + qc_executed= TRUE; } } @@ -4817,7 +4819,7 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) thd->set_statement(&stmt_backup); thd->stmt_arena= old_stmt_arena; - if (state == Query_arena::STMT_PREPARED) + if (state == Query_arena::STMT_PREPARED && !qc_executed) state= Query_arena::STMT_EXECUTED; if (error == 0 && this->lex->sql_command == SQLCOM_CALL) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 31be891553e..f8448c7328f 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3606,6 +3606,13 @@ extern ST_SCHEMA_TABLE schema_tables[]; bool schema_table_store_record(THD *thd, TABLE *table) { int error; + + if (thd->killed) + { + thd->send_kill_message(); + return 1; + } + if ((error= table->file->ha_write_tmp_row(table->record[0]))) { TMP_TABLE_PARAM *param= table->pos_in_table_list->schema_table_param; diff --git a/sql/wsrep_check_opts.cc b/sql/wsrep_check_opts.cc index 8da791b3429..032b2d98005 100644 --- a/sql/wsrep_check_opts.cc +++ b/sql/wsrep_check_opts.cc @@ -49,7 +49,7 @@ int wsrep_check_opts() (!strcasecmp(my_bind_addr_str, "127.0.0.1") || !strcasecmp(my_bind_addr_str, "localhost"))) { - WSREP_ERROR("wsrep_sst_method is set to 'mysqldump' yet " + WSREP_WARN("wsrep_sst_method is set to 'mysqldump' yet " "mysqld bind_address is set to '%s', which makes it " "impossible to receive state transfer from another " "node, since mysqld won't accept such connections. " @@ -57,7 +57,6 @@ int wsrep_check_opts() "set bind_address to allow mysql client connections " "from other cluster members (e.g. 0.0.0.0).", my_bind_addr_str); - return 1; } } else diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 8fd16d5a246..a85b5a4ea7b 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -382,7 +382,7 @@ wsrep_view_handler_cb (void* app_ctx, if (!wsrep_before_SE()) { WSREP_DEBUG("[debug]: closing client connections for PRIM"); - wsrep_close_client_connections(TRUE); + wsrep_close_client_connections(FALSE); } ssize_t const req_len= wsrep_sst_prepare (sst_req); diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index ba611fed0c7..e6fdf6cde43 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -79,37 +79,14 @@ static void make_wsrep_defaults_file() } -// TODO: Improve address verification. -static bool sst_receive_address_check (const char* str) -{ - if (!strncasecmp(str, "127.0.0.1", strlen("127.0.0.1")) || - !strncasecmp(str, "localhost", strlen("localhost"))) - { - return 1; - } - - return 0; -} - bool wsrep_sst_receive_address_check (sys_var *self, THD* thd, set_var* var) { - char addr_buf[FN_REFLEN]; - if ((! var->save_result.string_value.str) || (var->save_result.string_value.length > (FN_REFLEN - 1))) // safety { goto err; } - memcpy(addr_buf, var->save_result.string_value.str, - var->save_result.string_value.length); - addr_buf[var->save_result.string_value.length]= 0; - - if (sst_receive_address_check(addr_buf)) - { - goto err; - } - return 0; err: |