mirror of
https://github.com/MariaDB/server.git
synced 2025-10-24 07:13:33 +03:00
Merge ahristov@bk-internal.mysql.com:/home/bk/mysql-5.1-maint
into example.com:/work/bug22369-v2/my51 mysql-test/r/alter_table.result: Auto merged mysql-test/r/grant.result: Auto merged mysql-test/t/grant.test: Auto merged sql/mysql_priv.h: Auto merged sql/sql_parse.cc: Auto merged sql/sql_table.cc: Auto merged mysql-test/t/alter_table.test: manual merge
This commit is contained in:
@@ -854,3 +854,45 @@ Table Create Table
|
||||
`c1` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE `#sql2`, `@0023sql1`;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
CREATE TABLE t1 (
|
||||
int_field INTEGER UNSIGNED NOT NULL,
|
||||
char_field CHAR(10),
|
||||
INDEX(`int_field`)
|
||||
);
|
||||
DESCRIBE t1;
|
||||
Field Type Null Key Default Extra
|
||||
int_field int(10) unsigned NO MUL
|
||||
char_field char(10) YES NULL
|
||||
SHOW INDEXES FROM t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 int_field 1 int_field A NULL NULL NULL BTREE
|
||||
INSERT INTO t1 VALUES (1, "edno"), (1, "edno"), (2, "dve"), (3, "tri"), (5, "pet");
|
||||
"Non-copy data change - new frm, but old data and index files"
|
||||
ALTER TABLE t1
|
||||
CHANGE int_field unsigned_int_field INTEGER UNSIGNED NOT NULL,
|
||||
RENAME t2;
|
||||
SELECT * FROM t1 ORDER BY int_field;
|
||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||
SELECT * FROM t2 ORDER BY unsigned_int_field;
|
||||
unsigned_int_field char_field
|
||||
1 edno
|
||||
1 edno
|
||||
2 dve
|
||||
3 tri
|
||||
5 pet
|
||||
DESCRIBE t2;
|
||||
Field Type Null Key Default Extra
|
||||
unsigned_int_field int(10) unsigned NO MUL
|
||||
char_field char(10) YES NULL
|
||||
DESCRIBE t2;
|
||||
Field Type Null Key Default Extra
|
||||
unsigned_int_field int(10) unsigned NO MUL
|
||||
char_field char(10) YES NULL
|
||||
ALTER TABLE t2 MODIFY unsigned_int_field BIGINT UNSIGNED NOT NULL;
|
||||
DESCRIBE t2;
|
||||
Field Type Null Key Default Extra
|
||||
unsigned_int_field bigint(20) unsigned NO MUL
|
||||
char_field char(10) YES NULL
|
||||
DROP TABLE t2;
|
||||
|
||||
@@ -948,6 +948,71 @@ DROP USER 'mysqltest_1'@'localhost';
|
||||
use test;
|
||||
create user mysqltest1_thisisreallytoolong;
|
||||
ERROR HY000: String 'mysqltest1_thisisreallytoolong' is too long for user name (should be no longer than 16)
|
||||
CREATE DATABASE mysqltest1;
|
||||
CREATE TABLE mysqltest1.t1 (
|
||||
int_field INTEGER UNSIGNED NOT NULL,
|
||||
char_field CHAR(10),
|
||||
INDEX(`int_field`)
|
||||
);
|
||||
CREATE TABLE mysqltest1.t2 (int_field INT);
|
||||
"Now check that we require equivalent grants for "
|
||||
"RENAME TABLE and ALTER TABLE"
|
||||
CREATE USER mysqltest_1@localhost;
|
||||
GRANT SELECT ON mysqltest1.t1 TO mysqltest_1@localhost;
|
||||
SELECT USER();
|
||||
USER()
|
||||
mysqltest_1@localhost
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
RENAME TABLE t1 TO t2;
|
||||
ERROR 42000: ALTER command denied to user 'mysqltest_1'@'localhost' for table 't1'
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
ERROR 42000: DROP,ALTER command denied to user 'mysqltest_1'@'localhost' for table 't1'
|
||||
GRANT DROP ON mysqltest1.t1 TO mysqltest_1@localhost;
|
||||
RENAME TABLE t1 TO t2;
|
||||
ERROR 42000: ALTER command denied to user 'mysqltest_1'@'localhost' for table 't1'
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
ERROR 42000: ALTER command denied to user 'mysqltest_1'@'localhost' for table 't1'
|
||||
GRANT ALTER ON mysqltest1.t1 TO mysqltest_1@localhost;
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, DROP, ALTER ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
RENAME TABLE t1 TO t2;
|
||||
ERROR 42000: INSERT,CREATE command denied to user 'mysqltest_1'@'localhost' for table 't2'
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
ERROR 42000: INSERT,CREATE command denied to user 'mysqltest_1'@'localhost' for table 't2'
|
||||
GRANT INSERT, CREATE ON mysqltest1.t1 TO mysqltest_1@localhost;
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
GRANT INSERT, SELECT, CREATE, ALTER, DROP ON mysqltest1.t2 TO mysqltest_1@localhost;
|
||||
DROP TABLE mysqltest1.t2;
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
RENAME TABLE t1 TO t2;
|
||||
RENAME TABLE t2 TO t1;
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
ALTER TABLE t2 RENAME TO t1;
|
||||
REVOKE DROP, INSERT ON mysqltest1.t1 FROM mysqltest_1@localhost;
|
||||
REVOKE DROP, INSERT ON mysqltest1.t2 FROM mysqltest_1@localhost;
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, CREATE, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, CREATE, ALTER ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
RENAME TABLE t1 TO t2;
|
||||
ERROR 42000: INSERT command denied to user 'mysqltest_1'@'localhost' for table 't2'
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 't1'
|
||||
DROP USER mysqltest_1@localhost;
|
||||
DROP DATABASE mysqltest1;
|
||||
GRANT CREATE ON mysqltest.* TO 1234567890abcdefGHIKL@localhost;
|
||||
ERROR HY000: String '1234567890abcdefGHIKL' is too long for user name (should be no longer than 16)
|
||||
GRANT CREATE ON mysqltest.* TO some_user_name@1234567890abcdefghij1234567890abcdefghij1234567890abcdefghijQWERTY;
|
||||
|
||||
@@ -101,7 +101,7 @@ create table mysqltest.t1 (name char(15));
|
||||
insert into mysqltest.t1 (name) values ("mysqltest");
|
||||
select * from t1;
|
||||
select * from mysqltest.t1;
|
||||
--error 1050
|
||||
--error ER_TABLE_EXISTS_ERROR
|
||||
alter table t1 rename mysqltest.t1;
|
||||
select * from t1;
|
||||
select * from mysqltest.t1;
|
||||
@@ -231,9 +231,9 @@ DROP TABLE t1;
|
||||
# BUG#4717 - check for valid table names
|
||||
#
|
||||
create table t1 (a int);
|
||||
--error 1103
|
||||
--error ER_WRONG_TABLE_NAME
|
||||
alter table t1 rename to ``;
|
||||
--error 1103
|
||||
--error ER_WRONG_TABLE_NAME
|
||||
rename table t1 to ``;
|
||||
drop table t1;
|
||||
|
||||
@@ -325,14 +325,14 @@ drop table t1;
|
||||
CREATE TABLE t1 (a int PRIMARY KEY, b INT UNIQUE);
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
SHOW CREATE TABLE t1;
|
||||
--error 1091
|
||||
--error ER_CANT_DROP_FIELD_OR_KEY
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
DROP TABLE t1;
|
||||
|
||||
# BUG#3899
|
||||
create table t1 (a int, b int, key(a));
|
||||
insert into t1 values (1,1), (2,2);
|
||||
--error 1091
|
||||
--error ER_CANT_DROP_FIELD_OR_KEY
|
||||
alter table t1 drop key no_such_key;
|
||||
alter table t1 drop key a;
|
||||
drop table t1;
|
||||
@@ -343,7 +343,7 @@ drop table t1;
|
||||
# Some platforms (Mac OS X, Windows) will send the error message using small letters.
|
||||
CREATE TABLE T12207(a int) ENGINE=MYISAM;
|
||||
--replace_result t12207 T12207
|
||||
--error 1031
|
||||
--error ER_ILLEGAL_HA
|
||||
ALTER TABLE T12207 DISCARD TABLESPACE;
|
||||
DROP TABLE T12207;
|
||||
|
||||
@@ -367,7 +367,7 @@ drop table t1;
|
||||
# shorter than packed field length.
|
||||
#
|
||||
create table t1 ( a timestamp );
|
||||
--error 1089
|
||||
--error ER_WRONG_SUB_KEY
|
||||
alter table t1 add unique ( a(1) );
|
||||
drop table t1;
|
||||
|
||||
@@ -477,7 +477,7 @@ create table t1 (c1 int);
|
||||
# Move table to other database.
|
||||
alter table t1 rename mysqltest.t1;
|
||||
# Assure that it has moved.
|
||||
--error 1051
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
drop table t1;
|
||||
# Move table back.
|
||||
alter table mysqltest.t1 rename t1;
|
||||
@@ -491,7 +491,7 @@ use mysqltest;
|
||||
# Drop the current db. This de-selects any db.
|
||||
drop database mysqltest;
|
||||
# Now test for correct message.
|
||||
--error 1046
|
||||
--error ER_NO_DB_ERROR
|
||||
alter table test.t1 rename t1;
|
||||
# Check that explicit qualifying works even with no selected db.
|
||||
alter table test.t1 rename test.t1;
|
||||
@@ -650,3 +650,39 @@ INSERT INTO `@0023sql1` VALUES (2);
|
||||
SHOW CREATE TABLE `#sql2`;
|
||||
SHOW CREATE TABLE `@0023sql1`;
|
||||
DROP TABLE `#sql2`, `@0023sql1`;
|
||||
|
||||
#
|
||||
# Bug #22369: Alter table rename combined with other alterations causes lost tables
|
||||
#
|
||||
# This problem happens if the data change is compatible.
|
||||
# Changing to the same type is compatible for example.
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
--enable_warnings
|
||||
CREATE TABLE t1 (
|
||||
int_field INTEGER UNSIGNED NOT NULL,
|
||||
char_field CHAR(10),
|
||||
INDEX(`int_field`)
|
||||
);
|
||||
|
||||
DESCRIBE t1;
|
||||
|
||||
SHOW INDEXES FROM t1;
|
||||
|
||||
INSERT INTO t1 VALUES (1, "edno"), (1, "edno"), (2, "dve"), (3, "tri"), (5, "pet");
|
||||
--echo "Non-copy data change - new frm, but old data and index files"
|
||||
ALTER TABLE t1
|
||||
CHANGE int_field unsigned_int_field INTEGER UNSIGNED NOT NULL,
|
||||
RENAME t2;
|
||||
|
||||
--error ER_NO_SUCH_TABLE
|
||||
SELECT * FROM t1 ORDER BY int_field;
|
||||
SELECT * FROM t2 ORDER BY unsigned_int_field;
|
||||
DESCRIBE t2;
|
||||
DESCRIBE t2;
|
||||
ALTER TABLE t2 MODIFY unsigned_int_field BIGINT UNSIGNED NOT NULL;
|
||||
DESCRIBE t2;
|
||||
|
||||
DROP TABLE t2;
|
||||
|
||||
@@ -822,6 +822,82 @@ create user mysqltest1_thisisreallytoolong;
|
||||
# statements.
|
||||
#
|
||||
|
||||
#
|
||||
# Bug #22369: Alter table rename combined with other alterations causes lost tables
|
||||
#
|
||||
CREATE DATABASE mysqltest1;
|
||||
CREATE TABLE mysqltest1.t1 (
|
||||
int_field INTEGER UNSIGNED NOT NULL,
|
||||
char_field CHAR(10),
|
||||
INDEX(`int_field`)
|
||||
);
|
||||
CREATE TABLE mysqltest1.t2 (int_field INT);
|
||||
|
||||
--echo "Now check that we require equivalent grants for "
|
||||
--echo "RENAME TABLE and ALTER TABLE"
|
||||
CREATE USER mysqltest_1@localhost;
|
||||
GRANT SELECT ON mysqltest1.t1 TO mysqltest_1@localhost;
|
||||
|
||||
--connect (conn42,localhost,mysqltest_1,,mysqltest1);
|
||||
SELECT USER();
|
||||
SHOW GRANTS;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
RENAME TABLE t1 TO t2;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
--disconnect conn42
|
||||
--connection default
|
||||
GRANT DROP ON mysqltest1.t1 TO mysqltest_1@localhost;
|
||||
|
||||
--connect (conn42,localhost,mysqltest_1,,mysqltest1);
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
RENAME TABLE t1 TO t2;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
--disconnect conn42
|
||||
--connection default
|
||||
GRANT ALTER ON mysqltest1.t1 TO mysqltest_1@localhost;
|
||||
|
||||
--connect (conn42,localhost,mysqltest_1,,mysqltest1);
|
||||
SHOW GRANTS;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
RENAME TABLE t1 TO t2;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
--disconnect conn42
|
||||
--connection default
|
||||
GRANT INSERT, CREATE ON mysqltest1.t1 TO mysqltest_1@localhost;
|
||||
--connect (conn42,localhost,mysqltest_1,,mysqltest1);
|
||||
SHOW GRANTS;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
--disconnect conn42
|
||||
--connection default
|
||||
GRANT INSERT, SELECT, CREATE, ALTER, DROP ON mysqltest1.t2 TO mysqltest_1@localhost;
|
||||
DROP TABLE mysqltest1.t2;
|
||||
|
||||
--connect (conn42,localhost,mysqltest_1,,mysqltest1);
|
||||
SHOW GRANTS;
|
||||
RENAME TABLE t1 TO t2;
|
||||
RENAME TABLE t2 TO t1;
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
ALTER TABLE t2 RENAME TO t1;
|
||||
--disconnect conn42
|
||||
--connection default
|
||||
REVOKE DROP, INSERT ON mysqltest1.t1 FROM mysqltest_1@localhost;
|
||||
REVOKE DROP, INSERT ON mysqltest1.t2 FROM mysqltest_1@localhost;
|
||||
|
||||
--connect (conn42,localhost,mysqltest_1,,mysqltest1);
|
||||
SHOW GRANTS;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
RENAME TABLE t1 TO t2;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
--disconnect conn42
|
||||
--connection default
|
||||
|
||||
DROP USER mysqltest_1@localhost;
|
||||
DROP DATABASE mysqltest1;
|
||||
|
||||
# Working with database-level privileges.
|
||||
|
||||
--error ER_WRONG_STRING_LENGTH
|
||||
|
||||
Reference in New Issue
Block a user