BUG#17772
A crash after ALTER TABLE t1 RENAME ... mysql-test/r/partition.result: New test case mysql-test/t/partition.test: New test case sql/sql_lex.h: Introduced like name for CREATE TABLE t1 LIKE t2 sql/sql_parse.cc: Introduced like name for CREATE TABLE t1 LIKE t2 sql/sql_partition.cc: Introduced like name for CREATE TABLE t1 LIKE t2 sql/sql_yacc.yy: Introduced like name for CREATE TABLE t1 LIKE t2
This commit is contained in:
parent
2d360cd035
commit
01cce283a7
@ -546,4 +546,15 @@ t1 CREATE TABLE `t1` (
|
|||||||
`b` int(11) DEFAULT NULL
|
`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)
|
) 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;
|
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
|
End of 5.1 tests
|
||||||
|
@ -697,4 +697,21 @@ alter table t1 add primary key (b);
|
|||||||
show create table t1;
|
show create table t1;
|
||||||
drop 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
|
--echo End of 5.1 tests
|
||||||
|
@ -761,6 +761,7 @@ typedef struct st_lex
|
|||||||
const uchar *tok_start_prev, *tok_end_prev;
|
const uchar *tok_start_prev, *tok_end_prev;
|
||||||
|
|
||||||
char *length,*dec,*change,*name;
|
char *length,*dec,*change,*name;
|
||||||
|
Table_ident *like_name;
|
||||||
char *help_arg;
|
char *help_arg;
|
||||||
char *backup_dir; /* For RESTORE/BACKUP */
|
char *backup_dir; /* For RESTORE/BACKUP */
|
||||||
char* to_log; /* For PURGE MASTER LOGS TO */
|
char* to_log; /* For PURGE MASTER LOGS TO */
|
||||||
|
@ -2897,9 +2897,9 @@ mysql_execute_command(THD *thd)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* regular create */
|
/* regular create */
|
||||||
if (lex->name)
|
if (lex->like_name)
|
||||||
res= mysql_create_like_table(thd, create_table, &lex->create_info,
|
res= mysql_create_like_table(thd, create_table, &lex->create_info,
|
||||||
(Table_ident *)lex->name);
|
lex->like_name);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res= mysql_create_table(thd, create_table->db,
|
res= mysql_create_table(thd, create_table->db,
|
||||||
|
@ -3741,14 +3741,14 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf,
|
|||||||
ha_legacy_type(default_db_type)));
|
ha_legacy_type(default_db_type)));
|
||||||
if (is_create_table_ind)
|
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
|
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.
|
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_db= table_ident->db.str ? table_ident->db.str : thd->db;
|
||||||
char *src_table= table_ident->table.str;
|
char *src_table= table_ident->table.str;
|
||||||
char buf[FN_REFLEN];
|
char buf[FN_REFLEN];
|
||||||
|
@ -1214,7 +1214,8 @@ create:
|
|||||||
lex->create_info.options=$2 | $4;
|
lex->create_info.options=$2 | $4;
|
||||||
lex->create_info.db_type= lex->thd->variables.table_type;
|
lex->create_info.db_type= lex->thd->variables.table_type;
|
||||||
lex->create_info.default_table_charset= NULL;
|
lex->create_info.default_table_charset= NULL;
|
||||||
lex->name=0;
|
lex->name= 0;
|
||||||
|
lex->like_name= 0;
|
||||||
}
|
}
|
||||||
create2
|
create2
|
||||||
{ Lex->current_select= &Lex->select_lex; }
|
{ Lex->current_select= &Lex->select_lex; }
|
||||||
@ -3272,13 +3273,13 @@ create2:
|
|||||||
| LIKE table_ident
|
| LIKE table_ident
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
LEX *lex=Lex;
|
||||||
if (!(lex->name= (char *)$2))
|
if (!(lex->like_name= $2))
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
| '(' LIKE table_ident ')'
|
| '(' LIKE table_ident ')'
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
LEX *lex=Lex;
|
||||||
if (!(lex->name= (char *)$3))
|
if (!(lex->like_name= $3))
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -4712,8 +4713,8 @@ alter:
|
|||||||
{
|
{
|
||||||
THD *thd= YYTHD;
|
THD *thd= YYTHD;
|
||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
|
lex->name= 0;
|
||||||
lex->sql_command= SQLCOM_ALTER_TABLE;
|
lex->sql_command= SQLCOM_ALTER_TABLE;
|
||||||
lex->name= 0;
|
|
||||||
lex->duplicates= DUP_ERROR;
|
lex->duplicates= DUP_ERROR;
|
||||||
if (!lex->select_lex.add_table_to_list(thd, $4, NULL,
|
if (!lex->select_lex.add_table_to_list(thd, $4, NULL,
|
||||||
TL_OPTION_UPDATING))
|
TL_OPTION_UPDATING))
|
||||||
@ -4722,7 +4723,8 @@ alter:
|
|||||||
lex->key_list.empty();
|
lex->key_list.empty();
|
||||||
lex->col_list.empty();
|
lex->col_list.empty();
|
||||||
lex->select_lex.init_order();
|
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));
|
bzero((char*) &lex->create_info,sizeof(lex->create_info));
|
||||||
lex->create_info.db_type= (handlerton*) &default_hton;
|
lex->create_info.db_type= (handlerton*) &default_hton;
|
||||||
lex->create_info.default_table_charset= NULL;
|
lex->create_info.default_table_charset= NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user