summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2018-03-25 13:02:52 +0200
committerSergei Golubchik <serg@mariadb.org>2018-03-25 13:02:52 +0200
commitc764bc0a78e9359fa208e074bd327f7a852c7cb7 (patch)
treeeeb5d56d225d1fdf97a016c3eae7b93c4e1f6927 /sql
parentd702e463902bca7d94ff8a1a49468a5b7bdb4ba0 (diff)
parent15795b9f9a850d9587f17ef18e1ac7b5af31ec1e (diff)
downloadmariadb-git-c764bc0a78e9359fa208e074bd327f7a852c7cb7.tar.gz
Merge branch '10.1' into 10.2
Diffstat (limited to 'sql')
-rw-r--r--sql/item_cmpfunc.h3
-rw-r--r--sql/item_func.h3
-rw-r--r--sql/item_subselect.cc2
-rw-r--r--sql/opt_subselect.cc4
-rw-r--r--sql/sql_class.cc4
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/sql_prepare.cc4
-rw-r--r--sql/sql_show.cc7
-rw-r--r--sql/wsrep_check_opts.cc3
-rw-r--r--sql/wsrep_mysqld.cc2
-rw-r--r--sql/wsrep_sst.cc23
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: