Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.0
into sanja.is.com.ua:/home/bell/mysql/bk/work-4.0
This commit is contained in:
commit
3abe558fa8
@ -1186,7 +1186,7 @@ os_file_pread(
|
|||||||
os_file_n_pending_preads++;
|
os_file_n_pending_preads++;
|
||||||
os_mutex_exit(os_file_count_mutex);
|
os_mutex_exit(os_file_count_mutex);
|
||||||
|
|
||||||
n_bytes = pread(file, buf, n, offs);
|
n_bytes = pread(file, buf, (ssize_t)n, offs);
|
||||||
|
|
||||||
os_mutex_enter(os_file_count_mutex);
|
os_mutex_enter(os_file_count_mutex);
|
||||||
os_file_n_pending_preads--;
|
os_file_n_pending_preads--;
|
||||||
@ -1211,7 +1211,7 @@ os_file_pread(
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = read(file, buf, n);
|
ret = read(file, buf, (ssize_t)n);
|
||||||
|
|
||||||
os_mutex_exit(os_file_seek_mutexes[i]);
|
os_mutex_exit(os_file_seek_mutexes[i]);
|
||||||
|
|
||||||
@ -1261,7 +1261,7 @@ os_file_pwrite(
|
|||||||
os_file_n_pending_pwrites++;
|
os_file_n_pending_pwrites++;
|
||||||
os_mutex_exit(os_file_count_mutex);
|
os_mutex_exit(os_file_count_mutex);
|
||||||
|
|
||||||
ret = pwrite(file, buf, n, offs);
|
ret = pwrite(file, buf, (ssize_t)n, offs);
|
||||||
|
|
||||||
os_mutex_enter(os_file_count_mutex);
|
os_mutex_enter(os_file_count_mutex);
|
||||||
os_file_n_pending_pwrites--;
|
os_file_n_pending_pwrites--;
|
||||||
@ -1296,7 +1296,7 @@ os_file_pwrite(
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = write(file, buf, n);
|
ret = write(file, buf, (ssize_t)n);
|
||||||
|
|
||||||
if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC
|
if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC
|
||||||
&& srv_unix_file_flush_method != SRV_UNIX_NOSYNC
|
&& srv_unix_file_flush_method != SRV_UNIX_NOSYNC
|
||||||
|
@ -966,6 +966,23 @@ row_ins_foreign_check_on_constraint(
|
|||||||
|
|
||||||
err = row_update_cascade_for_mysql(thr, cascade,
|
err = row_update_cascade_for_mysql(thr, cascade,
|
||||||
foreign->foreign_table);
|
foreign->foreign_table);
|
||||||
|
|
||||||
|
if (foreign->foreign_table->n_foreign_key_checks_running == 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"InnoDB: error: table %s has the counter 0 though there is\n"
|
||||||
|
"InnoDB: a FOREIGN KEY check running on it.\n",
|
||||||
|
foreign->foreign_table->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Release the data dictionary latch for a while, so that we do not
|
||||||
|
starve other threads from doing CREATE TABLE etc. if we have a huge
|
||||||
|
cascaded operation running. The counter n_foreign_key_checks_running
|
||||||
|
will prevent other users from dropping or ALTERing the table when we
|
||||||
|
release the latch. */
|
||||||
|
|
||||||
|
row_mysql_unfreeze_data_dictionary(thr_get_trx(thr));
|
||||||
|
row_mysql_freeze_data_dictionary(thr_get_trx(thr));
|
||||||
|
|
||||||
mtr_start(mtr);
|
mtr_start(mtr);
|
||||||
|
|
||||||
/* Restore pcur position */
|
/* Restore pcur position */
|
||||||
|
@ -2156,8 +2156,8 @@ row_drop_table_for_mysql(
|
|||||||
fputs(" InnoDB: You are trying to drop table ", stderr);
|
fputs(" InnoDB: You are trying to drop table ", stderr);
|
||||||
ut_print_name(stderr, table->name);
|
ut_print_name(stderr, table->name);
|
||||||
fputs("\n"
|
fputs("\n"
|
||||||
"InnoDB: though there are foreign key check running on it.\n"
|
"InnoDB: though there is a foreign key check running on it.\n"
|
||||||
"InnoDB: Adding the table to the background drop queue.\n",
|
"InnoDB: Adding the table to the background drop queue.\n",
|
||||||
stderr);
|
stderr);
|
||||||
|
|
||||||
row_add_table_to_background_drop_list(table);
|
row_add_table_to_background_drop_list(table);
|
||||||
|
@ -704,4 +704,17 @@ Qcache_queries_in_cache 1
|
|||||||
unlock table;
|
unlock table;
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
set query_cache_wlock_invalidate=default;
|
set query_cache_wlock_invalidate=default;
|
||||||
|
CREATE TABLE t1 (id INT PRIMARY KEY);
|
||||||
|
insert into t1 values (1),(2),(3);
|
||||||
|
select * from t1;
|
||||||
|
id
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
create temporary table t1 (a int not null auto_increment
|
||||||
|
primary key);
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
|
drop table t1;
|
||||||
set GLOBAL query_cache_size=0;
|
set GLOBAL query_cache_size=0;
|
||||||
|
@ -521,4 +521,16 @@ unlock table;
|
|||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
set query_cache_wlock_invalidate=default;
|
set query_cache_wlock_invalidate=default;
|
||||||
|
|
||||||
|
#
|
||||||
|
# hiding real table stored in query cache by temporary table
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (id INT PRIMARY KEY);
|
||||||
|
insert into t1 values (1),(2),(3);
|
||||||
|
select * from t1;
|
||||||
|
create temporary table t1 (a int not null auto_increment
|
||||||
|
primary key);
|
||||||
|
select * from t1;
|
||||||
|
drop table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
set GLOBAL query_cache_size=0;
|
set GLOBAL query_cache_size=0;
|
||||||
|
@ -551,6 +551,7 @@ int mysql_ha_flush(THD *thd, TABLE_LIST *tables, uint mode_flags);
|
|||||||
#define MYSQL_HA_FLUSH_ALL 0x02
|
#define MYSQL_HA_FLUSH_ALL 0x02
|
||||||
|
|
||||||
/* sql_base.cc */
|
/* sql_base.cc */
|
||||||
|
#define TMP_TABLE_KEY_EXTRA 8
|
||||||
void set_item_name(Item *item,char *pos,uint length);
|
void set_item_name(Item *item,char *pos,uint length);
|
||||||
bool add_field_to_list(char *field_name, enum enum_field_types type,
|
bool add_field_to_list(char *field_name, enum enum_field_types type,
|
||||||
char *length, char *decimal,
|
char *length, char *decimal,
|
||||||
|
@ -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)
|
for (table=thd->temporary_tables; table ; table=table->next)
|
||||||
{
|
{
|
||||||
if (table->key_length == key_length+8 &&
|
if (table->key_length == key_length + TMP_TABLE_KEY_EXTRA &&
|
||||||
!memcmp(table->table_cache_key,key,key_length+8))
|
!memcmp(table->table_cache_key, key,
|
||||||
|
key_length + TMP_TABLE_KEY_EXTRA))
|
||||||
{
|
{
|
||||||
if (table->query_id == thd->query_id)
|
if (table->query_id == thd->query_id)
|
||||||
{
|
{
|
||||||
|
@ -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++)
|
for (; block_table != block_table_end; block_table++)
|
||||||
{
|
{
|
||||||
TABLE_LIST table_list;
|
TABLE_LIST table_list;
|
||||||
bzero((char*) &table_list,sizeof(table_list));
|
TABLE *tmptable;
|
||||||
|
|
||||||
Query_cache_table *table = block_table->parent;
|
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.db = table->db();
|
||||||
table_list.alias= table_list.real_name= table->table();
|
table_list.alias= table_list.real_name= table->table();
|
||||||
if (check_table_access(thd,SELECT_ACL,&table_list,1))
|
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();
|
char *db = header->db();
|
||||||
header->table(db + db_length + 1);
|
header->table(db + db_length + 1);
|
||||||
|
header->key_len(key_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
Query_cache_block_table *list_root = table_block->table(0);
|
Query_cache_block_table *list_root = table_block->table(0);
|
||||||
|
@ -144,10 +144,13 @@ struct Query_cache_query
|
|||||||
struct Query_cache_table
|
struct Query_cache_table
|
||||||
{
|
{
|
||||||
char *tbl;
|
char *tbl;
|
||||||
|
uint32 key_length;
|
||||||
|
|
||||||
inline char *db() { return (char *) data(); }
|
inline char *db() { return (char *) data(); }
|
||||||
inline char *table() { return tbl; }
|
inline char *table() { return tbl; }
|
||||||
inline void table(char *table) { tbl = table; }
|
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()
|
inline gptr data()
|
||||||
{
|
{
|
||||||
return (gptr)(((byte*)this)+
|
return (gptr)(((byte*)this)+
|
||||||
|
@ -1142,7 +1142,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
if (check_access(thd,CREATE_ACL,db,0,1))
|
if (check_access(thd,CREATE_ACL,db,0,1))
|
||||||
break;
|
break;
|
||||||
mysql_log.write(thd,command,packet);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case COM_DROP_DB: // QQ: To be removed
|
case COM_DROP_DB: // QQ: To be removed
|
||||||
@ -1163,7 +1165,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mysql_log.write(thd,command,db);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case COM_BINLOG_DUMP:
|
case COM_BINLOG_DUMP:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user