bug #17290 (sp with delete, create and rollback causes MySQLD core)
additional fixes mysql-test/r/partition.result: result fixed mysql-test/t/partition.test: testcase sql/sql_parse.cc: part_info cloning moved here sql/sql_partition.cc: fixes sql/sql_table.cc: part_info cloning removed
This commit is contained in:
parent
723c3a504f
commit
afe397ff66
@ -557,4 +557,29 @@ t2 CREATE TABLE `t2` (
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='no comment' PARTITION BY KEY (a)
|
||||
drop table t2;
|
||||
prepare stmt1 from 'create table t1 (s1 int) partition by hash (s1)';
|
||||
execute stmt1;
|
||||
execute stmt1;
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
drop table t1;
|
||||
CREATE PROCEDURE test.p1(IN i INT)
|
||||
BEGIN
|
||||
DECLARE CONTINUE HANDLER FOR sqlexception BEGIN END;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (num INT,PRIMARY KEY(num));
|
||||
START TRANSACTION;
|
||||
INSERT INTO t1 VALUES(i);
|
||||
savepoint t1_save;
|
||||
INSERT INTO t1 VALUES (14);
|
||||
ROLLBACK to savepoint t1_save;
|
||||
COMMIT;
|
||||
END|
|
||||
CALL test.p1(12);
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
CALL test.p1(13);
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
drop table t1;
|
||||
End of 5.1 tests
|
||||
|
@ -714,4 +714,34 @@ show create table t2;
|
||||
|
||||
drop table t2;
|
||||
|
||||
#
|
||||
# bug #14350 Partitions: crash if prepared statement
|
||||
#
|
||||
prepare stmt1 from 'create table t1 (s1 int) partition by hash (s1)';
|
||||
execute stmt1;
|
||||
--error 1050
|
||||
execute stmt1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# bug 17290 SP with delete, create and rollback to save point causes MySQLD core
|
||||
#
|
||||
delimiter |;
|
||||
eval CREATE PROCEDURE test.p1(IN i INT)
|
||||
BEGIN
|
||||
DECLARE CONTINUE HANDLER FOR sqlexception BEGIN END;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (num INT,PRIMARY KEY(num));
|
||||
START TRANSACTION;
|
||||
INSERT INTO t1 VALUES(i);
|
||||
savepoint t1_save;
|
||||
INSERT INTO t1 VALUES (14);
|
||||
ROLLBACK to savepoint t1_save;
|
||||
COMMIT;
|
||||
END|
|
||||
delimiter ;|
|
||||
CALL test.p1(12);
|
||||
CALL test.p1(13);
|
||||
drop table t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -2357,6 +2357,7 @@ mysql_execute_command(THD *thd)
|
||||
/* Saved variable value */
|
||||
DBUG_ENTER("mysql_execute_command");
|
||||
thd->net.no_send_error= 0;
|
||||
thd->work_part_info= 0;
|
||||
|
||||
/*
|
||||
In many cases first table of main SELECT_LEX have special meaning =>
|
||||
@ -2902,6 +2903,15 @@ mysql_execute_command(THD *thd)
|
||||
lex->like_name);
|
||||
else
|
||||
{
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
partition_info *part_info= thd->lex->part_info;
|
||||
if (part_info && !(part_info= thd->lex->part_info->get_clone()))
|
||||
{
|
||||
res= -1;
|
||||
goto end_with_restore_list;
|
||||
}
|
||||
thd->work_part_info= part_info;
|
||||
#endif
|
||||
res= mysql_create_table(thd, create_table->db,
|
||||
create_table->table_name, &lex->create_info,
|
||||
lex->create_list,
|
||||
|
@ -3760,7 +3760,7 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf,
|
||||
}
|
||||
}
|
||||
else
|
||||
part_info= old_lex->part_info;
|
||||
part_info= thd->work_part_info;
|
||||
}
|
||||
table->part_info= part_info;
|
||||
table->file->set_part_info(part_info);
|
||||
@ -4077,7 +4077,9 @@ uint prep_alter_part_table(THD *thd, TABLE *table, ALTER_INFO *alter_info,
|
||||
if (table->part_info)
|
||||
table->s->version= 0L;
|
||||
|
||||
if (!(thd->work_part_info= thd->lex->part_info->get_clone()))
|
||||
thd->work_part_info= thd->lex->part_info;
|
||||
if (thd->work_part_info &&
|
||||
!(thd->work_part_info= thd->lex->part_info->get_clone()))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
if (alter_info->flags &
|
||||
|
@ -2037,10 +2037,8 @@ bool mysql_create_table_internal(THD *thd,
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
partition_info *part_info;
|
||||
if (!(part_info= thd->lex->part_info->get_clone()))
|
||||
DBUG_RETURN(TRUE);
|
||||
thd->work_part_info= part_info;
|
||||
partition_info *part_info= thd->work_part_info;
|
||||
|
||||
if (!part_info && create_info->db_type->partition_flags &&
|
||||
(create_info->db_type->partition_flags() & HA_USE_AUTO_PARTITION))
|
||||
{
|
||||
@ -2089,7 +2087,8 @@ bool mysql_create_table_internal(THD *thd,
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
if (part_engine_type == &partition_hton)
|
||||
if ((part_engine_type == &partition_hton) &&
|
||||
part_info->default_engine_type)
|
||||
{
|
||||
/*
|
||||
This only happens at ALTER TABLE.
|
||||
|
Loading…
x
Reference in New Issue
Block a user