Commit 37316bea authored by sasha@mysql.sashanet.com's avatar sasha@mysql.sashanet.com
Browse files

fixed coredump in UDF

added Monty's patch for alter table and LAST_INSERT_ID()
added a test case for replication of ALTER TABLE on a table with auto_increment
parent e2483f59
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
source ../include/master-slave.inc;
connection master;
drop table if exists test;
CREATE TABLE test (name varchar(64), age smallint(3));
INSERT INTO  test SET name='Andy', age=31;
INSERT test SET name='Jacob', age=2;
INSERT into test SET name='Caleb', age=1;
ALTER TABLE test ADD id int(8) ZEROFILL AUTO_INCREMENT PRIMARY KEY;
@test.master select * from test;
connection slave;
@test.master select * from test;
 No newline at end of file
+4 −0
Original line number Diff line number Diff line
name	age	id	
Andy	31	00000001	
Jacob	2	00000002	
Caleb	1	00000003	
+3 −1
Original line number Diff line number Diff line
@@ -1140,6 +1140,8 @@ udf_handler::fix_fields(THD *thd,TABLE_LIST *tables,Item_result_field *func,
	break;
      }
    }
    
    if(thd)
     thd->net.last_error[0]=0;
    my_bool (*init)(UDF_INIT *, UDF_ARGS *, char *)=
      (my_bool (*)(UDF_INIT *, UDF_ARGS *,  char *))
+9 −6
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ static char *make_unique_key_name(const char *field_name,KEY *start,KEY *end);
static int copy_data_between_tables(TABLE *from,TABLE *to,
				    List<create_field> &create,
				    enum enum_duplicates handle_duplicates,
				    ulong *copied,ulong *deleted);
				    ha_rows *copied,ha_rows *deleted);

/*****************************************************************************
** Remove all possbile tables and give a compact errormessage for all
@@ -992,7 +992,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
  char tmp_name[80],old_name[32],new_name_buff[FN_REFLEN],
    *table_name,*db;
  bool use_timestamp=0;
  ulong copied,deleted;
  ha_rows copied,deleted;
  ulonglong next_insert_id;
  uint save_time_stamp,db_create_options;
  enum db_type old_db_type,new_db_type;
  DBUG_ENTER("mysql_alter_table");
@@ -1333,11 +1334,13 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
  if (use_timestamp)
    new_table->time_stamp=0;
  new_table->next_number_field=new_table->found_next_number_field;
  thd->count_cuted_fields=1;			/* calc cuted fields */
  thd->count_cuted_fields=1;			// calc cuted fields
  thd->cuted_fields=0L;
  thd->proc_info="copy to tmp table";
  next_insert_id=thd->next_insert_id;		// Remember for loggin
  error=copy_data_between_tables(table,new_table,create_list,handle_duplicates,
				 &copied,&deleted);
  thd->last_insert_id=next_insert_id;		// Needed for correct log
  thd->count_cuted_fields=0;			/* Don`t calc cuted fields */
  new_table->time_stamp=save_time_stamp;

@@ -1474,8 +1477,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
  VOID(pthread_mutex_unlock(&LOCK_open));

end_temporary:
  sprintf(tmp_name,ER(ER_INSERT_INFO),copied+deleted,deleted,
	  thd->cuted_fields);
  sprintf(tmp_name,ER(ER_INSERT_INFO),(ulong) (copied+deleted),
	  (ulong) deleted, thd->cuted_fields);
  send_ok(&thd->net,copied+deleted,0L,tmp_name);
  thd->some_tables_deleted=0;
  DBUG_RETURN(0);
@@ -1488,7 +1491,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
static int
copy_data_between_tables(TABLE *from,TABLE *to,List<create_field> &create,
			 enum enum_duplicates handle_duplicates,
			 ulong *copied,ulong *deleted)
			 ha_rows *copied,ha_rows *deleted)
{
  int error;
  Copy_field *copy,*copy_end;