diff options
-rw-r--r-- | libmysqld/lib_sql.cc | 7 | ||||
-rw-r--r-- | sql/sql_class.h | 3 | ||||
-rw-r--r-- | sql/sql_parse.cc | 14 |
3 files changed, 13 insertions, 11 deletions
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 101e129d615..188227c21f9 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -251,7 +251,7 @@ int emb_next_result(MYSQL *mysql) DBUG_ENTER("emb_next_result"); if (emb_advanced_command(mysql, COM_QUERY,0,0, - thd->query_rest,thd->query_rest_length,1) + thd->query_rest.ptr(),thd->query_rest.length(),1) || emb_mysql_read_query_result(mysql)) DBUG_RETURN(1); @@ -765,11 +765,6 @@ bool Protocol::net_store_data(const char *from, uint length) return false; } -char *memdup_mysql(struct st_mysql *mysql, const char*data, int length) -{ - return memdup_root(&mysql->field_alloc, data, length); -} - #if 0 /* The same as Protocol::net_store_data but does the converstion */ diff --git a/sql/sql_class.h b/sql/sql_class.h index 5034007cd4d..b8cce3096ef 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -565,8 +565,7 @@ public: struct st_mysql_bind *client_params; char *extra_data; ulong extra_length; - char *query_rest; - uint32 query_rest_length; + String query_rest; #endif NET net; // client connection descriptor MEM_ROOT warn_root; // For warnings and errors diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 51e1ebee4ad..69ee43d53d1 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -48,7 +48,6 @@ extern "C" int gethostname(char *name, int namelen); #endif -char *memdup_mysql(struct st_mysql *mysql, const char*data, int length); static int check_for_max_user_connections(THD *thd, USER_CONN *uc); static void decrease_user_connections(USER_CONN *uc); static bool check_db_used(THD *thd,TABLE_LIST *tables); @@ -1420,8 +1419,17 @@ bool dispatch_command(enum enum_server_command command, THD *thd, #ifndef EMBEDDED_LIBRARY mysql_parse(thd, packet, length); #else - thd->query_rest= (char*)memdup_mysql(thd->mysql, packet, length); - thd->query_rest_length= length; + /* + 'packet' can point inside the query_rest's buffer + so we have to do memmove here + */ + if (thd->query_rest.length() > length) + { + memmove(thd->query_rest.c_ptr(), packet, length); + thd->query_rest.length(length); + } + else + thd->query_rest.copy(length); break; #endif /*EMBEDDED_LIBRARY*/ } |