alter_table.test 14.7 KB
Newer Older
1 2 3
#
# Test of alter table
#
4
--disable_warnings
5
drop table if exists t1,t2;
6
drop database if exists mysqltest;
7 8
--enable_warnings

9 10 11 12 13 14 15
create table t1 (
col1 int not null auto_increment primary key,
col2 varchar(30) not null,
col3 varchar (20) not null,
col4 varchar(4) not null,
col5 enum('PENDING', 'ACTIVE', 'DISABLED') not null,
col6 int not null, to_be_deleted int);
16
insert into t1 values (2,4,3,5,"PENDING",1,7);
17 18
alter table t1
add column col4_5 varchar(20) not null after col4,
19 20 21 22 23
add column col7 varchar(30) not null after col5,
add column col8 datetime not null, drop column to_be_deleted,
change column col2 fourth varchar(30) not null after col3,
modify column col6 int not null first;
select * from t1;
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
drop table t1;

create table t1 (bandID MEDIUMINT UNSIGNED NOT NULL PRIMARY KEY, payoutID SMALLINT UNSIGNED NOT NULL);
insert into t1 (bandID,payoutID) VALUES (1,6),(2,6),(3,4),(4,9),(5,10),(6,1),(7,12),(8,12);
alter table t1 add column new_col int, order by payoutid,bandid;
select * from t1;
alter table t1 order by bandid,payoutid;
select * from t1;
drop table t1;

# Check that pack_keys and dynamic length rows are not forced. 

CREATE TABLE t1 (
GROUP_ID int(10) unsigned DEFAULT '0' NOT NULL,
LANG_ID smallint(5) unsigned DEFAULT '0' NOT NULL,
NAME varchar(80) DEFAULT '' NOT NULL,
PRIMARY KEY (GROUP_ID,LANG_ID),
KEY NAME (NAME));
#show table status like "t1";
ALTER TABLE t1 CHANGE NAME NAME CHAR(80) not null;
44
--replace_column 8 #
unknown's avatar
unknown committed
45
SHOW FULL COLUMNS FROM t1;
46 47 48 49 50 51 52 53 54 55 56
DROP TABLE t1;

#
# Test of ALTER TABLE ... ORDER BY
#

create table t1 (n int);
insert into t1 values(9),(3),(12),(10);
alter table t1 order by n;
select * from t1;
drop table t1;
unknown's avatar
unknown committed
57 58 59 60 61 62 63 64 65

CREATE TABLE t1 (
  id int(11) unsigned NOT NULL default '0',
  category_id tinyint(4) unsigned NOT NULL default '0',
  type_id tinyint(4) unsigned NOT NULL default '0',
  body text NOT NULL,
  user_id int(11) unsigned NOT NULL default '0',
  status enum('new','old') NOT NULL default 'new',
  PRIMARY KEY (id)
unknown's avatar
unknown committed
66
) ENGINE=MyISAM;
unknown's avatar
unknown committed
67

unknown's avatar
unknown committed
68 69
ALTER TABLE t1 ORDER BY t1.id, t1.status, t1.type_id, t1.user_id, t1.body;
DROP TABLE t1;
unknown's avatar
unknown committed
70

unknown's avatar
unknown committed
71 72 73 74
#
# The following combination found a hang-bug in MyISAM
#

unknown's avatar
unknown committed
75
CREATE TABLE t1 (AnamneseId int(10) unsigned NOT NULL auto_increment,B BLOB,PRIMARY KEY (AnamneseId)) engine=myisam;
unknown's avatar
unknown committed
76 77 78 79 80 81
insert into t1 values (null,"hello");
LOCK TABLES t1 WRITE;
ALTER TABLE t1 ADD Column new_col int not null;
UNLOCK TABLES;
OPTIMIZE TABLE t1;
DROP TABLE t1;
82

83 84 85 86 87 88 89 90 91 92
#
# Drop and add an auto_increment column
#

create table t1 (i int unsigned not null auto_increment primary key);
insert into t1 values (null),(null),(null),(null);
alter table t1 drop i,add i int unsigned not null auto_increment, drop primary key, add primary key (i);
select * from t1;
drop table t1;

93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
#
# Bug #2628: 'alter table t1 rename mysqltest.t1' silently drops mysqltest.t1 
# if it exists
#
create table t1 (name char(15));
insert into t1 (name) values ("current");
create database mysqltest;
create table mysqltest.t1 (name char(15));
insert into mysqltest.t1 (name) values ("mysqltest");
select * from t1;
select * from mysqltest.t1;
--error 1050
alter table t1 rename mysqltest.t1;
select * from t1;
select * from mysqltest.t1;
drop table t1;
drop database mysqltest;
110

111 112 113 114 115 116 117 118 119 120
#
# ALTER TABLE ... ENABLE/DISABLE KEYS

create table t1 (n1 int not null, n2 int, n3 int, n4 float,
                unique(n1),
                key (n1, n2, n3, n4),
                key (n2, n3, n4, n1),
                key (n3, n4, n1, n2),
                key (n4, n1, n2, n3) );
alter table t1 disable keys;
121
show keys from t1;
unknown's avatar
unknown committed
122 123
#let $1=10000;
let $1=10;
124 125 126 127 128 129
while ($1)
{
 eval insert into t1 values($1,RAND()*1000,RAND()*1000,RAND());
 dec $1;
}
alter table t1 enable keys;
130
show keys from t1;
131
drop table t1;
unknown's avatar
merge  
unknown committed
132

133 134 135 136 137 138 139 140 141
#
# Alter table and rename
#

create table t1 (i int unsigned not null auto_increment primary key);
alter table t1 rename t2;
alter table t2 rename t1, add c char(10) comment "no comment";
show columns from t1;
drop table t1;
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

# implicit analyze

create table t1 (a int, b int);
let $1=100;
while ($1)
{
 eval insert into t1 values(1,$1), (2,$1), (3, $1);
 dec $1;
}
alter table t1 add unique (a,b), add key (b);
show keys from t1;
analyze table t1;
show keys from t1;
drop table t1;

158 159 160 161 162 163 164 165 166
#
# Test of ALTER TABLE DELAYED
#

CREATE TABLE t1 (i int(10), index(i) );
ALTER TABLE t1 DISABLE KEYS;
INSERT DELAYED INTO t1 VALUES(1),(2),(3);
ALTER TABLE t1 ENABLE KEYS;
drop table t1;
167

168 169 170 171 172 173 174 175
#
# Test ALTER TABLE ENABLE/DISABLE keys when things are locked
#

CREATE TABLE t1 (
  Host varchar(16) binary NOT NULL default '',
  User varchar(16) binary NOT NULL default '',
  PRIMARY KEY  (Host,User)
unknown's avatar
unknown committed
176
) ENGINE=MyISAM;
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195

ALTER TABLE t1 DISABLE KEYS;
LOCK TABLES t1 WRITE;
INSERT INTO t1 VALUES ('localhost','root'),('localhost',''),('games','monty');
SHOW INDEX FROM t1;
ALTER TABLE t1 ENABLE KEYS;
UNLOCK TABLES;
CHECK TABLES t1;
DROP TABLE t1;

#
# Test with two keys
#

CREATE TABLE t1 (
  Host varchar(16) binary NOT NULL default '',
  User varchar(16) binary NOT NULL default '',
  PRIMARY KEY  (Host,User),
  KEY  (Host)
unknown's avatar
unknown committed
196
) ENGINE=MyISAM;
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222

ALTER TABLE t1 DISABLE KEYS;
SHOW INDEX FROM t1;
LOCK TABLES t1 WRITE;
INSERT INTO t1 VALUES ('localhost','root'),('localhost','');
SHOW INDEX FROM t1;
ALTER TABLE t1 ENABLE KEYS;
SHOW INDEX FROM t1;
UNLOCK TABLES;
CHECK TABLES t1;

# Test RENAME with LOCK TABLES
LOCK TABLES t1 WRITE;
ALTER TABLE t1 RENAME t2;
UNLOCK TABLES;
select * from t2;
DROP TABLE t2;

#
# Test disable keys with locking
#
CREATE TABLE t1 (
  Host varchar(16) binary NOT NULL default '',
  User varchar(16) binary NOT NULL default '',
  PRIMARY KEY  (Host,User),
  KEY  (Host)
unknown's avatar
unknown committed
223
) ENGINE=MyISAM;
224 225 226 227 228

LOCK TABLES t1 WRITE;
ALTER TABLE t1 DISABLE KEYS;
SHOW INDEX FROM t1;
DROP TABLE t1;
229 230

#
231 232 233 234 235 236 237 238 239
# BUG#4717 - check for valid table names
#
create table t1 (a int);
--error 1103
alter table t1 rename to `t1\\`;
--error 1103
rename table t1 to `t1\\`;
drop table t1;

unknown's avatar
unknown committed
240 241 242 243 244 245 246 247 248 249 250 251 252
#
# BUG#6236 - ALTER TABLE MODIFY should set implicit NOT NULL on PK columns
#
drop table if exists t1, t2;
create table t1 ( a varchar(10) not null primary key ) engine=myisam;
create table t2 ( a varchar(10) not null primary key ) engine=merge union=(t1);
flush tables;
alter table t1 modify a varchar(10);
show create table t2;
flush tables;
alter table t1 modify a varchar(10) not null;
show create table t2;
drop table if exists t1, t2;
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269

# The following is also part of bug #6236 (CREATE TABLE didn't properly count
# not null columns for primary keys)

create table t1 (a int, b int, c int, d int, e int, f int, g int, h int,i int, primary key (a,b,c,d,e,f,g,i,h)) engine=MyISAM;
insert into t1 (a) values(1);
--replace_column 7 X 8 X 9 X 10 X 11 X 12 X 13 X 14 X
show table status like 't1';
alter table t1 modify a int;
--replace_column 7 X 8 X 9 X 10 X 11 X 12 X 13 X 14 X
show table status like 't1';
drop table t1;
create table t1 (a int not null, b int not null, c int not null, d int not null, e int not null, f int not null, g int not null, h int not null,i int not null, primary key (a,b,c,d,e,f,g,i,h)) engine=MyISAM;
insert into t1 (a) values(1);
--replace_column 7 X 8 X 9 X 10 X 11 X 12 X 13 X 14 X
show table status like 't1';
drop table t1;
unknown's avatar
unknown committed
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321

#
# Test that data get converted when character set is changed
# Test that data doesn't get converted when src or dst is BINARY/BLOB
#
set names koi8r;
create table t1 (a char(10) character set koi8r);
insert into t1 values ('');
select a,hex(a) from t1;
alter table t1 change a a char(10) character set cp1251;
select a,hex(a) from t1;
alter table t1 change a a binary(10);
select a,hex(a) from t1;
alter table t1 change a a char(10) character set cp1251;
select a,hex(a) from t1;
alter table t1 change a a char(10) character set koi8r;
select a,hex(a) from t1;
alter table t1 change a a varchar(10) character set cp1251;
select a,hex(a) from t1;
alter table t1 change a a char(10) character set koi8r;
select a,hex(a) from t1;
alter table t1 change a a text character set cp1251;
select a,hex(a) from t1;
alter table t1 change a a char(10) character set koi8r;
select a,hex(a) from t1;
delete from t1;

#
# Test ALTER TABLE .. CHARACTER SET ..
#
show create table t1;
alter table t1 DEFAULT CHARACTER SET latin1;
show create table t1;
alter table t1 CONVERT TO CHARACTER SET latin1;
show create table t1;
alter table t1 DEFAULT CHARACTER SET cp1251;
show create table t1;

drop table t1;

#
# Bug#2821
# Test that table CHARACTER SET does not affect blobs
#
create table t1 (myblob longblob,mytext longtext) 
default charset latin1 collate latin1_general_cs;
show create table t1;
alter table t1 character set latin2;
show create table t1;
drop table t1;

#
unknown's avatar
unknown committed
322
# Bug 2361 (Don't drop UNIQUE with DROP PRIMARY KEY)
323 324
#

325
CREATE TABLE t1 (a int PRIMARY KEY, b INT UNIQUE);
326 327
ALTER TABLE t1 DROP PRIMARY KEY;
SHOW CREATE TABLE t1;
328 329
--error 1091
ALTER TABLE t1 DROP PRIMARY KEY;
330
DROP TABLE t1;
unknown's avatar
unknown committed
331 332 333 334 335 336 337 338

# BUG#3899
create table t1 (a int, b int, key(a));
insert into t1 values (1,1), (2,2);
--error 1091
alter table t1 drop key no_such_key;
alter table t1 drop key a;
drop table t1;
unknown's avatar
unknown committed
339

340 341 342 343 344 345 346 347 348 349 350 351
#
# Bug #6479  ALTER TABLE ... changing charset fails for TEXT columns
#
# The column's character set was changed but the actual data was not
# modified. In other words, the values were reinterpreted
# as UTF8 instead of being converted.
create table t1 (a text) character set koi8r;
insert into t1 values (_koi8r'');
select hex(a) from t1;
alter table t1 convert to character set cp1251;
select hex(a) from t1;
drop table t1;
352 353 354 355 356 357 358 359 360 361 362

#
# Test for bug #7884 "Able to add invalid unique index on TIMESTAMP prefix"
# MySQL should not think that packed field with non-zero decimals is
# geometry field and allow to create prefix index which is
# shorter than packed field length.
#
create table t1 ( a timestamp );
--error 1089
alter table t1 add unique ( a(1) );
drop table t1;
363

unknown's avatar
unknown committed
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
#
# Bug #24395: ALTER TABLE DISABLE KEYS doesn't work when modifying the table
#
# 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;
--enable_warnings
create table t1 (a int, key(a));
show indexes from t1;
--echo "this used not to disable the index"
alter table t1 modify a int, disable keys;
show indexes from t1;

alter table t1 enable keys;
show indexes from t1;

alter table t1 modify a bigint, disable keys;
show indexes from t1;

alter table t1 enable keys;
show indexes from t1;

alter table t1 add b char(10), disable keys;
show indexes from t1;

alter table t1 add c decimal(10,2), enable keys;
show indexes from t1;

--echo "this however did"
alter table t1 disable keys;
show indexes from t1;

desc t1;

alter table t1 add d decimal(15,5);
--echo "The key should still be disabled"
show indexes from t1;

drop table t1;

--echo "Now will test with one unique index"
create table t1(a int, b char(10), unique(a));
show indexes from t1;
alter table t1 disable keys;
show indexes from t1;
alter table t1 enable keys;

--echo "If no copy on noop change, this won't touch the data file"
--echo "Unique index, no change"
alter table t1 modify a int, disable keys;
show indexes from t1;

--echo "Change the type implying data copy"
--echo "Unique index, no change"
alter table t1 modify a bigint, disable keys;
show indexes from t1;

alter table t1 modify a bigint;
show indexes from t1;

alter table t1 modify a int;
show indexes from t1;

drop table t1;

--echo "Now will test with one unique and one non-unique index"
create table t1(a int, b char(10), unique(a), key(b));
show indexes from t1;
alter table t1 disable keys;
show indexes from t1;
alter table t1 enable keys;


--echo "If no copy on noop change, this won't touch the data file"
--echo "The non-unique index will be disabled"
alter table t1 modify a int, disable keys;
show indexes from t1;
alter table t1 enable keys;
show indexes from t1;

--echo "Change the type implying data copy"
--echo "The non-unique index will be disabled"
alter table t1 modify a bigint, disable keys;
show indexes from t1;

--echo "Change again the type, but leave the indexes as_is"
alter table t1 modify a int;
show indexes from t1;
--echo "Try the same. When data is no copied on similar tables, this is noop"
alter table t1 modify a int;
show indexes from t1;

drop table t1;


461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491
#
# Bug#11493 - Alter table rename to default database does not work without
#             db name qualifying
#
create database mysqltest1;
create table t1 (c1 int);
# Move table to other database.
alter table t1 rename mysqltest1.t1;
# Assure that it has moved.
--error 1051
drop table t1;
# Move table back.
alter table mysqltest1.t1 rename t1;
# Assure that it is back.
drop table t1;
# Now test for correct message if no database is selected.
# Create t1 in 'test'.
create table t1 (c1 int);
# Change to other db.
use mysqltest1;
# Drop the current db. This de-selects any db.
drop database mysqltest1;
# Now test for correct message.
--error 1046
alter table test.t1 rename t1;
# Check that explicit qualifying works even with no selected db.
alter table test.t1 rename test.t1;
# Go back to standard 'test' db.
use test;
drop table t1;

492 493 494 495 496 497 498 499 500 501 502
#
# BUG#23404 - ROW_FORMAT=FIXED option is lost is an index is added to the
# table
#
CREATE TABLE t1(a INT) ROW_FORMAT=FIXED;
CREATE INDEX i1 ON t1(a);
SHOW CREATE TABLE t1;
DROP INDEX i1 ON t1;
SHOW CREATE TABLE t1;
DROP TABLE t1;

503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520
#
# Bug#24219 - ALTER TABLE ... RENAME TO ... , DISABLE KEYS leads to crash
#
--disable_warnings
DROP TABLE IF EXISTS bug24219;
DROP TABLE IF EXISTS bug24219_2;
--enable_warnings

CREATE TABLE bug24219 (a INT, INDEX(a));

SHOW INDEX FROM bug24219;

ALTER TABLE bug24219 RENAME TO bug24219_2, DISABLE KEYS;

SHOW INDEX FROM bug24219_2;

DROP TABLE bug24219_2;

521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
#
# Bug#24562 (ALTER TABLE ... ORDER BY ... with complex expression asserts)
#

--disable_warnings
drop table if exists table_24562;
--enable_warnings

create table table_24562(
  section int,
  subsection int,
  title varchar(50));

insert into table_24562 values
(1, 0, "Introduction"),
(1, 1, "Authors"),
(1, 2, "Acknowledgements"),
(2, 0, "Basics"),
(2, 1, "Syntax"),
(2, 2, "Client"),
(2, 3, "Server"),
(3, 0, "Intermediate"),
(3, 1, "Complex queries"),
(3, 2, "Stored Procedures"),
(3, 3, "Stored Functions"),
(4, 0, "Advanced"),
(4, 1, "Replication"),
(4, 2, "Load balancing"),
(4, 3, "High availability"),
(5, 0, "Conclusion");

select * from table_24562;

alter table table_24562 add column reviewer varchar(20),
order by title;

select * from table_24562;

update table_24562 set reviewer="Me" where section=2;
update table_24562 set reviewer="You" where section=3;

alter table table_24562
order by section ASC, subsection DESC;

select * from table_24562;

alter table table_24562
order by table_24562.subsection ASC, table_24562.section DESC;

select * from table_24562;

--error 1064
alter table table_24562 order by 12;
--error 1064
alter table table_24562 order by (section + 12);
--error 1064
alter table table_24562 order by length(title);
--error 1064
alter table table_24562 order by (select 12 from dual);

--error 1054
alter table table_24562 order by no_such_col;

drop table table_24562;

586
# End of 4.1 tests
587