summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2004-10-24 11:32:08 +0300
committerunknown <bell@sanja.is.com.ua>2004-10-24 11:32:08 +0300
commit9abe7d272bcd75ef4eb83a33f31a3c9b756317a1 (patch)
treec4c680dcbd645da1d2e320312f09d6eb67db06e0 /sql
parentb8847967c82bfa07811ed9fd1684ece88c5d5361 (diff)
parent5ab6c5e532f682631761f02bec6f894df3930002 (diff)
downloadmariadb-git-9abe7d272bcd75ef4eb83a33f31a3c9b756317a1.tar.gz
Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.0
into sanja.is.com.ua:/home/bell/mysql/bk/work-4.0 sql/sql_parse.cc: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/sql_base.cc5
-rw-r--r--sql/sql_cache.cc32
-rw-r--r--sql/sql_cache.h3
-rw-r--r--sql/sql_parse.cc8
5 files changed, 44 insertions, 5 deletions
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index b5e571e74d0..b123927d09e 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -551,6 +551,7 @@ int mysql_ha_flush(THD *thd, TABLE_LIST *tables, uint mode_flags);
#define MYSQL_HA_FLUSH_ALL 0x02
/* sql_base.cc */
+#define TMP_TABLE_KEY_EXTRA 8
void set_item_name(Item *item,char *pos,uint length);
bool add_field_to_list(char *field_name, enum enum_field_types type,
char *length, char *decimal,
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 72400bf0abb..ddc81053357 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -816,8 +816,9 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name,
for (table=thd->temporary_tables; table ; table=table->next)
{
- if (table->key_length == key_length+8 &&
- !memcmp(table->table_cache_key,key,key_length+8))
+ if (table->key_length == key_length + TMP_TABLE_KEY_EXTRA &&
+ !memcmp(table->table_cache_key, key,
+ key_length + TMP_TABLE_KEY_EXTRA))
{
if (table->query_id == thd->query_id)
{
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index 60f0cfadc8e..f503a63e752 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -971,9 +971,38 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
for (; block_table != block_table_end; block_table++)
{
TABLE_LIST table_list;
- bzero((char*) &table_list,sizeof(table_list));
+ TABLE *tmptable;
Query_cache_table *table = block_table->parent;
+
+ /*
+ Check that we have not temporary tables with same names of tables
+ of this query. If we have such tables, we will not send data from
+ query cache, because temporary tables hide real tables by which
+ query in query cache was made.
+ */
+ for (tmptable= thd->temporary_tables; tmptable ; tmptable= tmptable->next)
+ {
+ if (tmptable->key_length - TMP_TABLE_KEY_EXTRA == table->key_len() &&
+ !memcmp(tmptable->table_cache_key, table->data(),
+ table->key_len()))
+ {
+ DBUG_PRINT("qcache",
+ ("Temporary table detected: '%s.%s'",
+ table_list.db, table_list.alias));
+ STRUCT_UNLOCK(&structure_guard_mutex);
+ /*
+ We should not store result of this query because it contain
+ temporary tables => assign following variable to make check
+ faster.
+ */
+ thd->safe_to_cache_query=0;
+ BLOCK_UNLOCK_RD(query_block);
+ DBUG_RETURN(-1);
+ }
+ }
+
+ bzero((char*) &table_list,sizeof(table_list));
table_list.db = table->db();
table_list.alias= table_list.real_name= table->table();
if (check_table_access(thd,SELECT_ACL,&table_list,1))
@@ -2066,6 +2095,7 @@ Query_cache::insert_table(uint key_len, char *key,
}
char *db = header->db();
header->table(db + db_length + 1);
+ header->key_len(key_len);
}
Query_cache_block_table *list_root = table_block->table(0);
diff --git a/sql/sql_cache.h b/sql/sql_cache.h
index 0c6579250ab..454f0318c12 100644
--- a/sql/sql_cache.h
+++ b/sql/sql_cache.h
@@ -144,10 +144,13 @@ struct Query_cache_query
struct Query_cache_table
{
char *tbl;
+ uint32 key_length;
inline char *db() { return (char *) data(); }
inline char *table() { return tbl; }
inline void table(char *table) { tbl = table; }
+ inline uint32 key_len() { return key_length; }
+ inline void key_len(uint32 len) { key_length= len; }
inline gptr data()
{
return (gptr)(((byte*)this)+
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 1fe9e5093eb..6b3723d89c4 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1142,7 +1142,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
if (check_access(thd,CREATE_ACL,db,0,1))
break;
mysql_log.write(thd,command,packet);
- mysql_create_db(thd,(lower_case_table_names == 2 ? alias : db),0,0);
+ if (mysql_create_db(thd, (lower_case_table_names == 2 ? alias : db),
+ 0, 0) < 0)
+ send_error(&thd->net, thd->killed ? ER_SERVER_SHUTDOWN : 0);
break;
}
case COM_DROP_DB: // QQ: To be removed
@@ -1163,7 +1165,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
break;
}
mysql_log.write(thd,command,db);
- mysql_rm_db(thd, (lower_case_table_names == 2 ? alias : db), 0, 0);
+ if (mysql_rm_db(thd, (lower_case_table_names == 2 ? alias : db),
+ 0, 0) < 0)
+ send_error(&thd->net, thd->killed ? ER_SERVER_SHUTDOWN : 0);
break;
}
case COM_BINLOG_DUMP: