Commit afe397ff authored by unknown's avatar unknown
Browse files

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
parent 723c3a50
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -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
+30 −0
Original line number Diff line number Diff line
@@ -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
+10 −0
Original line number Diff line number Diff line
@@ -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,
+4 −2
Original line number Diff line number Diff line
@@ -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 &
+4 −5
Original line number Diff line number Diff line
@@ -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.