diff options
-rw-r--r-- | mysql-test/r/partition.result | 11 | ||||
-rw-r--r-- | mysql-test/t/partition.test | 17 | ||||
-rw-r--r-- | sql/sql_lex.h | 1 | ||||
-rw-r--r-- | sql/sql_parse.cc | 4 | ||||
-rw-r--r-- | sql/sql_partition.cc | 6 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 12 |
6 files changed, 41 insertions, 10 deletions
diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index feed5483827..f31692bea0a 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -546,4 +546,15 @@ t1 CREATE TABLE `t1` ( `b` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY LIST (a) (PARTITION p1 VALUES IN (1) ENGINE = MyISAM, PARTITION p2 VALUES IN (2) ENGINE = MyISAM) drop table t1; +create table t1 (a int unsigned not null auto_increment primary key) +partition by key(a); +alter table t1 rename t2, add c char(10), comment "no comment"; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(10) unsigned NOT NULL AUTO_INCREMENT, + `c` char(10) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='no comment' PARTITION BY KEY (a) +drop table t2; End of 5.1 tests diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index bac8b6573e6..73949733426 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -697,4 +697,21 @@ alter table t1 add primary key (b); show create table t1; drop table t1; +############################################ +# +# Author: Mikael Ronstrom +# Date: 2006-03-01 +# Purpose +# Bug 17772: Crash at ALTER TABLE with rename +# and add column + comment on +# partitioned table +# +############################################ +create table t1 (a int unsigned not null auto_increment primary key) +partition by key(a); +alter table t1 rename t2, add c char(10), comment "no comment"; +show create table t2; + +drop table t2; + --echo End of 5.1 tests diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 59ebdd2a1cc..954c3be17c6 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -761,6 +761,7 @@ typedef struct st_lex const uchar *tok_start_prev, *tok_end_prev; char *length,*dec,*change,*name; + Table_ident *like_name; char *help_arg; char *backup_dir; /* For RESTORE/BACKUP */ char* to_log; /* For PURGE MASTER LOGS TO */ diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 871c8bdff9f..96c6c7fa8f3 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2897,9 +2897,9 @@ mysql_execute_command(THD *thd) else { /* regular create */ - if (lex->name) + if (lex->like_name) res= mysql_create_like_table(thd, create_table, &lex->create_info, - (Table_ident *)lex->name); + lex->like_name); else { res= mysql_create_table(thd, create_table->db, diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 18793d43016..03fa046094a 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -3741,14 +3741,14 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf, ha_legacy_type(default_db_type))); if (is_create_table_ind) { - if (old_lex->name) + if (old_lex->like_name) { /* This code is executed when we do a CREATE TABLE t1 LIKE t2 - old_lex->name contains the t2 and the table we are opening has + old_lex->like_name contains the t2 and the table we are opening has name t1. */ - Table_ident *table_ident= (Table_ident *)old_lex->name; + Table_ident *table_ident= old_lex->like_name; char *src_db= table_ident->db.str ? table_ident->db.str : thd->db; char *src_table= table_ident->table.str; char buf[FN_REFLEN]; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index c5b7acb5eb3..15012571369 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1214,7 +1214,8 @@ create: lex->create_info.options=$2 | $4; lex->create_info.db_type= lex->thd->variables.table_type; lex->create_info.default_table_charset= NULL; - lex->name=0; + lex->name= 0; + lex->like_name= 0; } create2 { Lex->current_select= &Lex->select_lex; } @@ -3272,13 +3273,13 @@ create2: | LIKE table_ident { LEX *lex=Lex; - if (!(lex->name= (char *)$2)) + if (!(lex->like_name= $2)) YYABORT; } | '(' LIKE table_ident ')' { LEX *lex=Lex; - if (!(lex->name= (char *)$3)) + if (!(lex->like_name= $3)) YYABORT; } ; @@ -4712,8 +4713,8 @@ alter: { THD *thd= YYTHD; LEX *lex= thd->lex; + lex->name= 0; lex->sql_command= SQLCOM_ALTER_TABLE; - lex->name= 0; lex->duplicates= DUP_ERROR; if (!lex->select_lex.add_table_to_list(thd, $4, NULL, TL_OPTION_UPDATING)) @@ -4722,7 +4723,8 @@ alter: lex->key_list.empty(); lex->col_list.empty(); lex->select_lex.init_order(); - lex->select_lex.db=lex->name=0; + lex->select_lex.db=lex->name= 0; + lex->like_name= 0; bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.db_type= (handlerton*) &default_hton; lex->create_info.default_table_charset= NULL; |