summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-10-27 19:52:41 +0300
committerunknown <monty@mysql.com>2004-10-27 19:52:41 +0300
commite646f8f2d19fbfd24c8cc4ce62322691e88d12d1 (patch)
treed9b411a738093cebf4896002805fdc91ca117fb1 /sql
parent55833fb49bf8570ee11d4b85b143a9a3975733fa (diff)
parent3bdd7e77fdb66acb4d051dec2b1c4fd136a49f9c (diff)
downloadmariadb-git-e646f8f2d19fbfd24c8cc4ce62322691e88d12d1.tar.gz
Merge with 4.0
BitKeeper/deleted/.del-innodb-lock-master.opt~f76a4a1999728f87: Auto merged innobase/include/trx0sys.h: Auto merged innobase/srv/srv0srv.c: Auto merged innobase/trx/trx0purge.c: Auto merged innobase/trx/trx0rseg.c: Auto merged mysql-test/r/innodb-lock.result: Auto merged mysql-test/t/innodb-lock.test: Auto merged sql/mysql_priv.h: Auto merged sql/set_var.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_parse.cc: Auto merged sql/mysqld.cc: Use local version during merge
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_innodb.h1
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/set_var.cc4
-rw-r--r--sql/sql_base.cc5
-rw-r--r--sql/sql_cache.cc31
-rw-r--r--sql/sql_cache.h6
-rw-r--r--sql/sql_parse.cc2
7 files changed, 43 insertions, 7 deletions
diff --git a/sql/ha_innodb.h b/sql/ha_innodb.h
index 7f7b000a100..c10beacac1b 100644
--- a/sql/ha_innodb.h
+++ b/sql/ha_innodb.h
@@ -198,6 +198,7 @@ extern my_bool innobase_very_fast_shutdown; /* set this to 1 just before
is equivalent to a 'crash' */
extern "C" {
extern ulong srv_max_buf_pool_modified_pct;
+extern ulong srv_max_purge_lag;
extern ulong srv_auto_extend_increment;
extern ulong srv_max_purge_lag;
}
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 18944aebad9..770b7057661 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -681,6 +681,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(THD *thd, char *field_name, enum enum_field_types type,
char *length, char *decimal,
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 66ed273d531..d8c1ed2c975 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -352,6 +352,8 @@ sys_var_thd_ulong sys_net_wait_timeout("wait_timeout",
#ifdef HAVE_INNOBASE_DB
sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct",
&srv_max_buf_pool_modified_pct);
+sys_var_long_ptr sys_innodb_max_purge_lag("innodb_max_purge_lag",
+ &srv_max_purge_lag);
sys_var_thd_bool sys_innodb_table_locks("innodb_table_locks",
&SV::innodb_table_locks);
sys_var_long_ptr sys_innodb_autoextend_increment("innodb_autoextend_increment",
@@ -608,6 +610,7 @@ sys_var *sys_variables[]=
&sys_os,
#ifdef HAVE_INNOBASE_DB
&sys_innodb_max_dirty_pages_pct,
+ &sys_innodb_max_purge_lag,
&sys_innodb_table_locks,
&sys_innodb_max_purge_lag,
&sys_innodb_autoextend_increment,
@@ -704,6 +707,7 @@ struct show_var_st init_vars[]= {
{"innodb_log_files_in_group", (char*) &innobase_log_files_in_group, SHOW_LONG},
{"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR},
{sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS},
+ {sys_innodb_max_purge_lag.name, (char*) &sys_innodb_max_purge_lag, SHOW_SYS},
{sys_innodb_table_locks.name, (char*) &sys_innodb_table_locks, SHOW_SYS},
{sys_innodb_max_purge_lag.name, (char*) &sys_innodb_max_purge_lag, SHOW_SYS},
{"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 9313f8e2c1b..839b92e7e7f 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -806,8 +806,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 0b338ebccb8..be50b48d264 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -1025,9 +1025,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();
#ifndef NO_EMBEDDED_ACCESS_CHECKS
diff --git a/sql/sql_cache.h b/sql/sql_cache.h
index fc458f39e29..c933a2349af 100644
--- a/sql/sql_cache.h
+++ b/sql/sql_cache.h
@@ -143,14 +143,14 @@ struct Query_cache_query
struct Query_cache_table
{
char *tbl;
- uint key_len;
+ uint32 key_len;
uint8 table_type;
inline char *db() { return (char *) data(); }
inline char *table() { return tbl; }
inline void table(char *table) { tbl= table; }
- inline uint key_length() { return key_len; }
- inline void key_length(uint len) { key_len= len; }
+ inline uint32 key_length() { return key_len; }
+ inline void key_length(uint32 len) { key_len= len; }
inline uint8 type() { return table_type; }
inline void type(uint8 t) { table_type= t; }
inline gptr data()
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index e061005ae61..d1f460d918e 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2471,7 +2471,7 @@ unsent_create_error:
if (lex->name && (!lex->name[0] || strlen(lex->name) > NAME_LEN))
{
net_printf(thd, ER_WRONG_TABLE_NAME, lex->name);
- res=0;
+ res= 1;
break;
}
if (!select_lex->db)