diff options
author | Dyre Tjeldvoll <Dyre.Tjeldvoll@oracle.com> | 2017-02-22 20:12:25 +0100 |
---|---|---|
committer | Dyre Tjeldvoll <Dyre.Tjeldvoll@oracle.com> | 2017-02-23 14:48:25 +0100 |
commit | 7849a27cfb1f175888878704d8f6708a23714538 (patch) | |
tree | 02bdc32608f0f600e48ea04bd8075a0a4d770438 | |
parent | b21a0212e41f876cbc9714ceaa7c7154cfcad69e (diff) | |
download | mariadb-git-7849a27cfb1f175888878704d8f6708a23714538.tar.gz |
Bug#25514146: DB_NAME IS IGNORED WHEN CREATING TABLE WITH DATA DIRECTORY
Problem: CREATE TABLE using a fully qualified name with INDEX DIR/DATA DIR
option reports an error when the current database is not SET.
check_access() was incorrectly called with NULL as the database
argument in a situation where the database name was not needed for
the particular privilege being checked. This will cause the current
database to be used, or an error to be reported if there is no current
database.
Fix: Call check_access() with any_db as the database argument in this situation.
-rw-r--r-- | mysql-test/r/symlink.result | 11 | ||||
-rw-r--r-- | mysql-test/t/symlink.test | 16 | ||||
-rw-r--r-- | sql/sql_parse.cc | 6 |
3 files changed, 30 insertions, 3 deletions
diff --git a/mysql-test/r/symlink.result b/mysql-test/r/symlink.result index 20736aec47f..22b64cc346c 100644 --- a/mysql-test/r/symlink.result +++ b/mysql-test/r/symlink.result @@ -213,3 +213,14 @@ t2 CREATE TABLE `t2` ( PRIMARY KEY (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop tables t1, t2; +# +# Test for bug #25514146 DB_NAME IS IGNORED WHEN CREATING TABLE +# WITH DATA DIRECTORY +# +# Make sure we have no current database +CREATE DATABASE x; +USE x; +DROP DATABASE x; +CREATE TABLE test.t1(id INT(11)) ENGINE MYISAM +DATA DIRECTORY "MYSQLTEST_VARDIR/tmp"; +DROP TABLE test.t1; diff --git a/mysql-test/t/symlink.test b/mysql-test/t/symlink.test index 5109137e564..5916d04875b 100644 --- a/mysql-test/t/symlink.test +++ b/mysql-test/t/symlink.test @@ -298,3 +298,19 @@ show create table t1; create table t2 like t1; show create table t2; drop tables t1, t2; + +--echo # +--echo # Test for bug #25514146 DB_NAME IS IGNORED WHEN CREATING TABLE +--echo # WITH DATA DIRECTORY +--echo # + +--echo # Make sure we have no current database +CREATE DATABASE x; +USE x; +DROP DATABASE x; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE test.t1(id INT(11)) ENGINE MYISAM +DATA DIRECTORY "$MYSQLTEST_VARDIR/tmp"; + +DROP TABLE test.t1; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 18cb758c9b5..86763b6e3de 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1,4 +1,4 @@ -/* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -2425,7 +2425,7 @@ case SQLCOM_PREPARE: if (((lex->create_info.used_fields & HA_CREATE_USED_DATADIR) != 0 || (lex->create_info.used_fields & HA_CREATE_USED_INDEXDIR) != 0) && - check_access(thd, FILE_ACL, NULL, NULL, NULL, FALSE, FALSE)) + check_access(thd, FILE_ACL, any_db, NULL, NULL, FALSE, FALSE)) { res= 1; my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "FILE"); @@ -2470,7 +2470,7 @@ case SQLCOM_PREPARE: { partition_info *part_info= thd->lex->part_info; if (part_info != NULL && has_external_data_or_index_dir(*part_info) && - check_access(thd, FILE_ACL, NULL, NULL, NULL, FALSE, FALSE)) + check_access(thd, FILE_ACL, any_db, NULL, NULL, FALSE, FALSE)) { res= -1; goto end_with_restore_list; |