diff options
author | Sergei Golubchik <sergii@pisem.net> | 2013-12-13 14:26:10 +0100 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2013-12-13 14:26:10 +0100 |
commit | ff485d2dc4d5adaf5eef0ccd03ce62adf3bd30b3 (patch) | |
tree | 250676745923651e8199fa2a9985ad2ec716b5bf | |
parent | 0c0fe7a8623db29ae810df9b8c83b49d9ca86cc5 (diff) | |
download | mariadb-git-ff485d2dc4d5adaf5eef0ccd03ce62adf3bd30b3.tar.gz |
MDEV-5438 A view can mask a table that supports discovery
-rw-r--r-- | mysql-test/suite/archive/discover_5438.result | 13 | ||||
-rw-r--r-- | mysql-test/suite/archive/discover_5438.test | 25 | ||||
-rw-r--r-- | sql/sql_acl.cc | 7 | ||||
-rw-r--r-- | sql/sql_table.cc | 2 | ||||
-rw-r--r-- | sql/sql_view.cc | 2 |
5 files changed, 41 insertions, 8 deletions
diff --git a/mysql-test/suite/archive/discover_5438.result b/mysql-test/suite/archive/discover_5438.result new file mode 100644 index 00000000000..b5ab56aa364 --- /dev/null +++ b/mysql-test/suite/archive/discover_5438.result @@ -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; diff --git a/mysql-test/suite/archive/discover_5438.test b/mysql-test/suite/archive/discover_5438.test new file mode 100644 index 00000000000..c05955baaf3 --- /dev/null +++ b/mysql-test/suite/archive/discover_5438.test @@ -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; + + diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 5cf1e3097f4..ae724ae4672 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -5413,12 +5413,7 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list, { if (!(rights & CREATE_ACL)) { - char buf[FN_REFLEN + 1]; - 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)) + if (!ha_table_exists(thd, table_list->db, table_list->table_name, 0)) { my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->alias); DBUG_RETURN(TRUE); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 98a6eee7b16..e0e778a6baf 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -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 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() */ my_error(ER_TABLE_EXISTS_ERROR, MYF(0), alter_ctx.new_alias); diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 505b8b25f89..09ce9c37e2d 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -908,7 +908,7 @@ loop_out: fn_format(path_buff, file.str, dir.str, "", MY_UNPACK_FILENAME); 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) { |