diff options
author | sasha@mysql.sashanet.com <> | 2000-08-07 15:28:56 -0600 |
---|---|---|
committer | sasha@mysql.sashanet.com <> | 2000-08-07 15:28:56 -0600 |
commit | 37316bea5a83ccb7477ccd41b459a1c89305d180 (patch) | |
tree | ee6536e9eb1ae43c32de241c459d020cce01ff4e | |
parent | e2483f5923b9991f944e34b30ebbf2945f608167 (diff) | |
download | mariadb-git-37316bea5a83ccb7477ccd41b459a1c89305d180.tar.gz |
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
-rw-r--r-- | repl-tests/test-repl-alter/run.test | 11 | ||||
-rw-r--r-- | repl-tests/test-repl-alter/test.master | 4 | ||||
-rw-r--r-- | sql/item_func.cc | 4 | ||||
-rw-r--r-- | sql/sql_table.cc | 15 |
4 files changed, 27 insertions, 7 deletions
diff --git a/repl-tests/test-repl-alter/run.test b/repl-tests/test-repl-alter/run.test new file mode 100644 index 00000000000..dab79a3d8f3 --- /dev/null +++ b/repl-tests/test-repl-alter/run.test @@ -0,0 +1,11 @@ +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 diff --git a/repl-tests/test-repl-alter/test.master b/repl-tests/test-repl-alter/test.master new file mode 100644 index 00000000000..763154b938e --- /dev/null +++ b/repl-tests/test-repl-alter/test.master @@ -0,0 +1,4 @@ +name age id +Andy 31 00000001 +Jacob 2 00000002 +Caleb 1 00000003 diff --git a/sql/item_func.cc b/sql/item_func.cc index b5e9a0c4035..e59221eb0f5 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1140,7 +1140,9 @@ udf_handler::fix_fields(THD *thd,TABLE_LIST *tables,Item_result_field *func, break; } } - thd->net.last_error[0]=0; + + if(thd) + thd->net.last_error[0]=0; my_bool (*init)(UDF_INIT *, UDF_ARGS *, char *)= (my_bool (*)(UDF_INIT *, UDF_ARGS *, char *)) u_d->func_init; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ed63b12ceb1..6e39a1a962b 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -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 @@ end_temporary: 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; |