summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/partition.result11
-rw-r--r--mysql-test/t/partition.test17
-rw-r--r--sql/sql_lex.h1
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/sql_partition.cc6
-rw-r--r--sql/sql_yacc.yy12
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;