MDEV-5438 A view can mask a table that supports discovery

This commit is contained in:
Sergei Golubchik 2013-12-13 14:26:10 +01:00
parent 0c0fe7a862
commit ff485d2dc4
5 changed files with 41 additions and 8 deletions

View File

@ -0,0 +1,13 @@
create table t1 (a int) engine=archive;
create view t1 as select "I am a view" as a;
ERROR 42S01: Table 't1' already exists
drop table t1;
create table t1 (a int) engine=archive;
grant select on test.t1 to foo@bar;
drop user foo@bar;
drop table t1;
create table t1 (a int) engine=archive;
create table t2 (a int);
alter table t2 rename t1;
ERROR 42S01: Table 't1' already exists
drop table t2, t1;

View File

@ -0,0 +1,25 @@
#
# MDEV-5438 - A view can mask a table that supports discovery
#
# in a few places the server was still using !access(path, F_OK) to
# determine whether a table exists
#
source include/have_archive.inc;
create table t1 (a int) engine=archive;
--error ER_TABLE_EXISTS_ERROR
create view t1 as select "I am a view" as a;
drop table t1;
create table t1 (a int) engine=archive;
grant select on test.t1 to foo@bar;
drop user foo@bar;
drop table t1;
create table t1 (a int) engine=archive;
create table t2 (a int);
--error ER_TABLE_EXISTS_ERROR
alter table t2 rename t1;
drop table t2, t1;

View File

@ -5413,12 +5413,7 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
{ {
if (!(rights & CREATE_ACL)) if (!(rights & CREATE_ACL))
{ {
char buf[FN_REFLEN + 1]; if (!ha_table_exists(thd, table_list->db, table_list->table_name, 0))
build_table_filename(buf, sizeof(buf) - 1, table_list->db,
table_list->table_name, reg_ext, 0);
fn_format(buf, buf, "", "", MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS |
MY_RETURN_REAL_PATH | MY_APPEND_EXT);
if (access(buf,F_OK))
{ {
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->alias); my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->alias);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);

View File

@ -7840,7 +7840,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
Table maybe does not exist, but we got an exclusive lock Table maybe does not exist, but we got an exclusive lock
on the name, now we can safely try to find out for sure. on the name, now we can safely try to find out for sure.
*/ */
if (!access(alter_ctx.get_new_filename(), F_OK)) if (ha_table_exists(thd, alter_ctx.new_db, alter_ctx.new_name, 0))
{ {
/* Table will be closed in do_command() */ /* Table will be closed in do_command() */
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), alter_ctx.new_alias); my_error(ER_TABLE_EXISTS_ERROR, MYF(0), alter_ctx.new_alias);

View File

@ -908,7 +908,7 @@ loop_out:
fn_format(path_buff, file.str, dir.str, "", MY_UNPACK_FILENAME); fn_format(path_buff, file.str, dir.str, "", MY_UNPACK_FILENAME);
path.length= strlen(path_buff); path.length= strlen(path_buff);
if (!access(path.str, F_OK)) if (ha_table_exists(thd, view->db, view->table_name, NULL))
{ {
if (mode == VIEW_CREATE_NEW) if (mode == VIEW_CREATE_NEW)
{ {