diff --git a/mysql-test/r/binlog_row_blackhole.result b/mysql-test/r/binlog_row_blackhole.result index 5c79f27bdf5..941d208a10b 100644 --- a/mysql-test/r/binlog_row_blackhole.result +++ b/mysql-test/r/binlog_row_blackhole.result @@ -92,7 +92,7 @@ insert into t1 values(1); insert ignore into t1 values(1); replace into t1 values(100); create table t2 (a varchar(200)) engine=blackhole; -load data infile '../../std_data/words.dat' into table t2; +load data infile '../std_data_ln/words.dat' into table t2; alter table t1 add b int; alter table t1 drop b; create table t3 like t1; diff --git a/mysql-test/r/federated.result b/mysql-test/r/federated.result index f9b13beb6e5..4391889fec9 100644 --- a/mysql-test/r/federated.result +++ b/mysql-test/r/federated.result @@ -1517,6 +1517,48 @@ bitty drop table federated.t1; drop table federated.t1; DROP TABLE IF EXISTS federated.t1; +Warnings: +Note 1051 Unknown table 't1' +CREATE TABLE federated.t1 ( +`id` int(20) NOT NULL auto_increment, +PRIMARY KEY (`id`)); +DROP TABLE IF EXISTS federated.t1; +Warnings: +Note 1051 Unknown table 't1' +CREATE TABLE federated.t1 ( +`id` int(20) NOT NULL auto_increment, +PRIMARY KEY (`id`) +) +ENGINE="FEDERATED" DEFAULT CHARSET=latin1 +CONNECTION='mysql://root@127.0.0.1:9308/federated/t1'; +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +1 +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +2 +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +3 +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +4 +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +LAST_INSERT_ID() +5 +SELECT * FROM federated.t1; +id +1 +2 +3 +4 +5 +DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; diff --git a/mysql-test/r/rpl_row_flsh_tbls.result b/mysql-test/r/rpl_row_flsh_tbls.result index 503fcc7a368..e2352b8605b 100644 --- a/mysql-test/r/rpl_row_flsh_tbls.result +++ b/mysql-test/r/rpl_row_flsh_tbls.result @@ -30,3 +30,4 @@ flush tables with read lock; start slave; stop slave; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction +drop table t3, t4, t5; diff --git a/mysql-test/r/rpl_row_log.result b/mysql-test/r/rpl_row_log.result index 8784d9d16e2..45b9ae07d5c 100644 --- a/mysql-test/r/rpl_row_log.result +++ b/mysql-test/r/rpl_row_log.result @@ -12,7 +12,7 @@ create table t1(n int not null auto_increment primary key); insert into t1 values (NULL); drop table t1; create table t1 (word char(20) not null); -load data infile '../../std_data/words.dat' into table t1 ignore 1 lines; +load data infile '../std_data_ln/words.dat' into table t1 ignore 1 lines; select count(*) from t1; count(*) 69 diff --git a/mysql-test/t/federated.test b/mysql-test/t/federated.test index a31fcf59074..627244daa6c 100644 --- a/mysql-test/t/federated.test +++ b/mysql-test/t/federated.test @@ -1226,4 +1226,34 @@ drop table federated.t1; connection slave; drop table federated.t1; +# +# BUG# 14768 test auto_increment last_insert_id() +# +connection slave; +DROP TABLE IF EXISTS federated.t1; +CREATE TABLE federated.t1 ( + `id` int(20) NOT NULL auto_increment, + PRIMARY KEY (`id`)); + +connection master; +DROP TABLE IF EXISTS federated.t1; +eval CREATE TABLE federated.t1 ( + `id` int(20) NOT NULL auto_increment, + PRIMARY KEY (`id`) + ) + ENGINE="FEDERATED" DEFAULT CHARSET=latin1 + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1'; + +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +INSERT INTO federated.t1 VALUES (); +SELECT LAST_INSERT_ID(); +SELECT * FROM federated.t1; + source include/federated_cleanup.inc; diff --git a/sql/field.cc b/sql/field.cc index 3d983bb4d12..72e28cbda9c 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -5243,7 +5243,7 @@ int Field_date::store(double nr) else tmp= (longlong) rint(nr); - return Field_date::store(tmp); + return Field_date::store(tmp, TRUE); } @@ -5265,6 +5265,9 @@ int Field_date::store(longlong nr, bool unsigned_val) error= 2; } + if (nr >= 19000000000000.0 && nr <= 99991231235959.0) + nr=floor(nr/1000000.0); // Timestamp to date + if (error) set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, error == 2 ? ER_WARN_DATA_OUT_OF_RANGE : diff --git a/sql/ha_federated.cc b/sql/ha_federated.cc index a4282e5013c..f7e0c1242fe 100644 --- a/sql/ha_federated.cc +++ b/sql/ha_federated.cc @@ -1409,6 +1409,12 @@ static int free_share(FEDERATED_SHARE *share) hash_delete(&federated_open_tables, (byte*) share); my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR)); share->scheme= 0; + if (share->socket) + { + my_free((gptr) share->socket, MYF(MY_ALLOW_ZERO_PTR)); + share->socket= 0; + } + thr_lock_delete(&share->lock); VOID(pthread_mutex_destroy(&share->mutex)); my_free((gptr) share, MYF(0)); @@ -1688,10 +1694,34 @@ int ha_federated::write_row(byte *buf) { DBUG_RETURN(stash_remote_error()); } + /* + If the table we've just written a record to contains an auto_increment field, + then store the last_insert_id() value from the foreign server + */ + if (table->next_number_field) + update_auto_increment(); DBUG_RETURN(0); } +/* + ha_federated::update_auto_increment + + This method ensures that last_insert_id() works properly. What it simply does + is calls last_insert_id() on the foreign database immediately after insert + (if the table has an auto_increment field) and sets the insert id via + thd->insert_id(ID) (as well as storing thd->prev_insert_id) +*/ +void ha_federated::update_auto_increment(void) +{ + THD *thd= current_thd; + DBUG_ENTER("ha_federated::update_auto_increment"); + + thd->insert_id(mysql->last_used_con->insert_id); + DBUG_PRINT("info",("last_insert_id %d", auto_increment_value)); + + DBUG_VOID_RETURN; +} int ha_federated::optimize(THD* thd, HA_CHECK_OPT* check_opt) { diff --git a/sql/ha_federated.h b/sql/ha_federated.h index c596f066098..953f4208bc5 100644 --- a/sql/ha_federated.h +++ b/sql/ha_federated.h @@ -286,6 +286,7 @@ public: void position(const byte *record); //required void info(uint); //required + void update_auto_increment(void); int repair(THD* thd, HA_CHECK_OPT* check_opt); int optimize(THD* thd, HA_CHECK_OPT* check_opt); diff --git a/sql/handler.h b/sql/handler.h index de4623b39b9..92fa581c19c 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -2030,7 +2030,7 @@ int ha_binlog_end(THD *thd); #define ha_reset_logs(a) 0 #define ha_binlog_index_purge_file(a,b) 0 #define ha_reset_slave(a) -#define ha_binlog_log_query(a,b,c,d,e,f); +#define ha_binlog_log_query(a,b,c,d,e,f,g); #define ha_binlog_wait(a) #define ha_binlog_end(a) 0 #endif diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index f653033b9cb..569e5e041c6 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -1183,7 +1183,7 @@ bool Table_triggers_list::process_triggers(THD *thd, trg_event_type event, my_error(ER_TABLEACCESS_DENIED_ERROR, MYF(0), priv_desc, thd->security_ctx->priv_user, thd->security_ctx->host_or_ip, - table->s->table_name); + table->s->table_name.str); sp_restore_security_context(thd, save_ctx); return TRUE; diff --git a/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp index 6947a4902a1..41a705fea2d 100644 --- a/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp +++ b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp @@ -370,7 +370,6 @@ void AsyncFile::openReq(Request* request) const int mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; -retry: if(flags & FsOpenReq::OM_CREATE_IF_NONE){ if((theFd = ::open(theFileName.c_str(), new_flags, mode)) != -1) { close(theFd); @@ -449,9 +448,21 @@ retry: } if(size != 0) { + int err = errno; +#ifdef O_DIRECT + if ((new_flags & O_DIRECT) && off == 0) + { + ndbout_c("error on first write(%d), disable O_DIRECT", err); + new_flags &= ~O_DIRECT; + close(theFd); + theFd = ::open(theFileName.c_str(), new_flags, mode); + if (theFd != -1) + continue; + } +#endif close(theFd); unlink(theFileName.c_str()); - request->error = errno; + request->error = err; return; } off += request->par.open.page_size;