|
|||||||||||
|
bk commit into 4.1 tree (tnurnberg:1.2675) BUG#20901
From: Tatjana A Nuernberg <azundris(at)mysql.com>
Date: Mon Sep 17 2007 - 01:54:51 EDT
ChangeSet@1.2675, 2007-09-17 07:54:49+02:00, tnurnberg@mysql.com +5 -0 Bug #20901: CREATE privilege is enough to insert into a table CREATE privilege let you CREATE...SELECT into an existing table, and one you didn't had INSERT on to boot. On existing table, CREATE...SELECT will now fail with an error, CREATE TABLE IF NOT EXISTS...SELECT with a warning; in either case, no rows will be inserted. mysql-test/r/create.result@1.91, 2007-09-17 07:54:47+02:00, tnurnberg@mysql.com +32 -7 Bug #20901: CREATE privilege is enough to insert into a table Prove we can no longer insert into a table we don't have INSERT privilege on with CREATE...SELECT just because we have CREATE. Show that everything else still works. mysql-test/r/grant.result@1.44, 2007-09-17 07:54:47+02:00, tnurnberg@mysql.com +3 -3 Bug #20901: CREATE privilege is enough to insert into a table Sort output for a defined state. mysql-test/t/create.test@1.64, 2007-09-17 07:54:47+02:00, tnurnberg@mysql.com +39 -2 Bug #20901: CREATE privilege is enough to insert into a table Prove we can no longer insert into a table we don't have INSERT privilege on with CREATE...SELECT just because we have CREATE. Show that everything else still works. mysql-test/t/grant.test@1.37, 2007-09-17 07:54:47+02:00, tnurnberg@mysql.com +1 -1 Bug #20901: CREATE privilege is enough to insert into a table Sort output for a defined state. sql/sql_parse.cc@1.500, 2007-09-17 07:54:47+02:00, tnurnberg@mysql.com +24 -2 Bug #20901: CREATE privilege is enough to insert into a table CREATE...SELECT with existing table already fails deep in the bowels of the server, in select_create::prepare() -> create_table_from_items() -> mysql_create_table(). Make sure we also catch CREATE TABLE IF NOT EXISTS...SELECT, in which case we throw a table exists warning and do not insert any rows. Do accomplish this, we check for the combination of CREATE/SELECT, IF NOT EXISTS, on a non-temporary table. In that case, we try to open the target table; if that fails, execution will proceed, otherwise, it will be cut short. diff -Nrup a/mysql-test/r/create.result b/mysql-test/r/create.result --- a/mysql-test/r/create.result 2007-04-02 10:39:23 +02:00@@ -237,15 +237,14 @@ create table if not exists t1 select 1,2 Warnings: Note 1050 Table 't1' already exists create table if not exists t1 select 1,2,3,4; -ERROR 21S01: Column count doesn't match value count at row 1 +Warnings: +Note 1050 Table 't1' already exists create table if not exists t1 select 1; Warnings: Note 1050 Table 't1' already exists select * from t1; 1 2 3 1 2 3 -0 1 2 -0 0 1 drop table t1; create table t1 (a int not null, b int, primary key (a)); insert into t1 values (1,1); @@ -255,17 +254,15 @@ Note 1050 Table 't1' already exists select * from t1; a b 1 1 -0 2 create table if not exists t1 select 3 as 'a',4 as 'b'; Warnings: Note 1050 Table 't1' already exists create table if not exists t1 select 3 as 'a',3 as 'b'; -ERROR 23000: Duplicate entry '3' for key 1 +Warnings: +Note 1050 Table 't1' already exists select * from t1; a b 1 1 -0 2 -3 4 drop table t1; create table `t1 `(a int); ERROR 42000: Incorrect table name 't1 ' @@ -701,3 +698,31 @@ t2 CREATE TABLE `t2` ( drop table t1, t2; create table t1(a set("a,b","c,d") not null); ERROR HY000: Illegal set 'a,b' value found during parsing +create database mysqltest; +use mysqltest; +grant CREATE on mysqltest.* TO mysqltest@localhost; +create table t1 (i INT); +insert into t1 values (1); +ERROR 42000: Access denied for user 'mysqltest'@'localhost' to database 'mysqltest' +create table t2 (i INT); +grant select, insert on mysqltest.t2 TO mysqltest@localhost; +flush privileges; +insert into t2 values (1); +create table if not exists t1 select * from t2; +Warnings: +Note 1050 Table 't1' already exists +create table if not exists t3 select * from t2; +create table t4 select * from t2; +create table t4 select * from t2; +ERROR 42S01: Table 't4' already exists +select * from t1; +i +select * from t3; +i +1 +select * from t4; +i +1 +drop table t1,t2,t3,t4; +drop database mysqltest; +use test; diff -Nrup a/mysql-test/r/grant.result b/mysql-test/r/grant.result --- a/mysql-test/r/grant.result 2007-04-17 13:52:49 +02:00@@ -349,12 +349,12 @@ show grants for grant_user@localhost; Grants for grant_user@localhost GRANT USAGE ON *.* TO 'grant_user'@'localhost' GRANT INSERT (a, d, c, b) ON `test`.`t1` TO 'grant_user'@'localhost' -select Host,Db,User,Table_name,Column_name,Column_priv from mysql.columns_priv; +select Host,Db,User,Table_name,Column_name,Column_priv from mysql.columns_priv order by Column_name; Host Db User Table_name Column_name Column_priv -localhost test grant_user t1 b Insert -localhost test grant_user t1 d Insert localhost test grant_user t1 a Insert revoke ALL PRIVILEGES on t1 from grant_user@localhost; show grants for grant_user@localhost; Grants for grant_user@localhost diff -Nrup a/mysql-test/t/create.test b/mysql-test/t/create.test --- a/mysql-test/t/create.test 2007-04-02 10:39:23 +02:00@@ -202,7 +202,6 @@ drop table t1;
create table t1 select 1,2,3;
# End of 4.1 tests
--- a/mysql-test/t/grant.test 2007-04-17 13:52:49 +02:00@@ -296,7 +296,7 @@ DROP DATABASE testdb10; create table t1(a int, b int, c int, d int); grant insert(b), insert(c), insert(d), insert(a) on t1 to grant_user@localhost; show grants for grant_user@localhost; -select Host,Db,User,Table_name,Column_name,Column_priv from mysql.columns_priv; +select Host,Db,User,Table_name,Column_name,Column_priv from mysql.columns_priv order by Column_name; revoke ALL PRIVILEGES on t1 from grant_user@localhost; show grants for grant_user@localhost; select Host,Db,User,Table_name,Column_name,Column_priv from mysql.columns_priv; diff -Nrup a/sql/sql_parse.cc b/sql/sql_parse.cc --- a/sql/sql_parse.cc 2007-06-12 14:47:34 +02:00 -- MySQL Code Commits Mailing List For list archives: http://lists.mysql.com/commits To unsubscribe: http://lists.mysql.com/commits?unsub=lists@pantek.comReceived on Mon Sep 17 01:48:44 2007 This archive was generated by hypermail 2.1.8 : Sun Oct 07 2007 - 09:30:36 EDT |
||||||||||
|
|||||||||||