Commit 05c17f2a authored by unknown's avatar unknown

Fix bug #13424 locking view with query cache enabled crashes server

For LOCK view is opened but not prepared thus leaving 'table' field set to
NULL. invalidate_locked_for_write() wasn't checking that and call to 
invalidate_table(NULL) crashes server.

To invalidate_locked_for_write() added check that ensures that table is
completely opened.


sql/sql_cache.cc:
  Fix bug #13424 locking view with query cache enabled crashes server
  Added check that table is completely opened.
mysql-test/t/view_query_cache.test:
  Test case for bug#13424 locking view with query cache enabled crashes server
mysql-test/r/view_query_cache.result:
  Test case for bug#13424 locking view with query cache enabled crashes server
parent 6f126ba4
...@@ -123,4 +123,13 @@ select * from v3; ...@@ -123,4 +123,13 @@ select * from v3;
a b a b
drop view v3; drop view v3;
drop table t1, t2; drop table t1, t2;
create table t1(f1 int);
insert into t1 values(1),(2),(3);
create view v1 as select * from t1;
set query_cache_wlock_invalidate=1;
lock tables v1 read /*!32311 local */;
unlock tables;
set query_cache_wlock_invalidate=default;
drop view v1;
drop table t1;
set GLOBAL query_cache_size=default; set GLOBAL query_cache_size=default;
...@@ -84,4 +84,16 @@ select * from v3; ...@@ -84,4 +84,16 @@ select * from v3;
drop view v3; drop view v3;
drop table t1, t2; drop table t1, t2;
#
# Bug #13424 locking view with query cache enabled crashes server
#
create table t1(f1 int);
insert into t1 values(1),(2),(3);
create view v1 as select * from t1;
set query_cache_wlock_invalidate=1;
lock tables v1 read /*!32311 local */;
unlock tables;
set query_cache_wlock_invalidate=default;
drop view v1;
drop table t1;
set GLOBAL query_cache_size=default; set GLOBAL query_cache_size=default;
...@@ -1295,7 +1295,8 @@ void Query_cache::invalidate_locked_for_write(TABLE_LIST *tables_used) ...@@ -1295,7 +1295,8 @@ void Query_cache::invalidate_locked_for_write(TABLE_LIST *tables_used)
DUMP(this); DUMP(this);
for (; tables_used; tables_used= tables_used->next_local) for (; tables_used; tables_used= tables_used->next_local)
{ {
if (tables_used->lock_type & (TL_WRITE_LOW_PRIORITY | TL_WRITE)) if (tables_used->lock_type & (TL_WRITE_LOW_PRIORITY | TL_WRITE) &&
tables_used->table)
invalidate_table(tables_used->table); invalidate_table(tables_used->table);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment