diff options
author | unknown <hery.ramilison@oracle.com> | 2011-11-17 09:00:58 +0100 |
---|---|---|
committer | Build Team <MYSQL-RE_WW@oracle.com> | 2011-11-17 09:00:58 +0100 |
commit | 93773656e8934439a5c7a320d3eabb0c02a3c947 (patch) | |
tree | 1dd794717469322a1b041143778258b1fc84fbff /sql/sql_parse.cc | |
parent | 8fe4023e518aa372557bff4cc8dcc56c9227f5b3 (diff) | |
parent | d1ba9b328fbc90a5201c39ea597a236a93462d4e (diff) | |
download | mariadb-git-93773656e8934439a5c7a320d3eabb0c02a3c947.tar.gz |
Merge from mysql-5.5.18-release
Diffstat (limited to 'sql/sql_parse.cc')
-rw-r--r-- | sql/sql_parse.cc | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e3da697ec78..32ccb8f2c5f 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -536,6 +536,8 @@ static void handle_bootstrap_impl(THD *thd) query= (char *) thd->memdup_w_gap(buff, length + 1, thd->db_length + 1 + QUERY_CACHE_FLAGS_SIZE); + size_t db_len= 0; + memcpy(query + length + 1, (char *) &db_len, sizeof(size_t)); thd->set_query_and_id(query, length, thd->charset(), next_query_id()); DBUG_PRINT("query",("%-.4096s",thd->query())); #if defined(ENABLED_PROFILING) @@ -1218,6 +1220,14 @@ bool dispatch_command(enum enum_server_command command, THD *thd, case COM_REFRESH: { int not_used; + + /* + Initialize thd->lex since it's used in many base functions, such as + open_tables(). Otherwise, it remains unitialized and may cause crash + during execution of COM_REFRESH. + */ + lex_start(thd); + status_var_increment(thd->status_var.com_stat[SQLCOM_FLUSH]); ulong options= (ulong) (uchar) packet[0]; if (trans_commit_implicit(thd)) @@ -1629,13 +1639,30 @@ bool alloc_query(THD *thd, const char *packet, uint packet_length) pos--; packet_length--; } - /* We must allocate some extra memory for query cache */ + /* We must allocate some extra memory for query cache + + The query buffer layout is: + buffer :== + <statement> The input statement(s) + '\0' Terminating null char (1 byte) + <length> Length of following current database name (size_t) + <db_name> Name of current database + <flags> Flags struct + */ if (! (query= (char*) thd->memdup_w_gap(packet, packet_length, - 1 + thd->db_length + + 1 + sizeof(size_t) + thd->db_length + QUERY_CACHE_FLAGS_SIZE))) return TRUE; query[packet_length]= '\0'; + /* + Space to hold the name of the current database is allocated. We + also store this length, in case current database is changed during + execution. We might need to reallocate the 'query' buffer + */ + char *len_pos = (query + packet_length + 1); + memcpy(len_pos, (char *) &thd->db_length, sizeof(size_t)); + thd->set_query(query, packet_length); /* Reclaim some memory */ |