From 1ef8fe5a16ff5b9dc54c5849a81e7c32784c089d Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 6 Nov 2006 14:50:45 +0100 Subject: [PATCH 1/2] ndb - bug#24011 ndb/src/common/util/socket_io.cpp: Fix problem with cut sockmessages --- ndb/src/common/util/socket_io.cpp | 86 +++++++++++++++++++------------ 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/ndb/src/common/util/socket_io.cpp b/ndb/src/common/util/socket_io.cpp index 58636e6663d..96efbac57d7 100644 --- a/ndb/src/common/util/socket_io.cpp +++ b/ndb/src/common/util/socket_io.cpp @@ -53,10 +53,6 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, if(buflen <= 1) return 0; - int sock_flags= fcntl(socket, F_GETFL); - if(fcntl(socket, F_SETFL, sock_flags | O_NONBLOCK) == -1) - return -1; - fd_set readset; FD_ZERO(&readset); FD_SET(socket, &readset); @@ -71,43 +67,65 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, } if(selectRes == -1){ - fcntl(socket, F_SETFL, sock_flags); return -1; } - buf[0] = 0; - const int t = recv(socket, buf, buflen, MSG_PEEK); - - if(t < 1) + char* ptr = buf; + int len = buflen; + do { - fcntl(socket, F_SETFL, sock_flags); - return -1; - } - - for(int i=0; i< t;i++) - { - if(buf[i] == '\n'){ - recv(socket, buf, i+1, 0); - buf[i] = 0; - - if(i > 0 && buf[i-1] == '\r'){ - i--; - buf[i] = 0; - } - - fcntl(socket, F_SETFL, sock_flags); - return t; + int t; + while((t = recv(socket, ptr, len, MSG_PEEK)) == -1 && errno == EINTR); + + if(t < 1) + { + return -1; } - } - if(t == (buflen - 1)){ - recv(socket, buf, t, 0); - buf[t] = 0; - fcntl(socket, F_SETFL, sock_flags); - return buflen; - } + + for(int i = 0; i 0); + + return -1; } extern "C" From 15155fff77f6d6c98e65b5d304adf6bb5d69d26e Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 29 Nov 2006 11:53:43 +0100 Subject: [PATCH 2/2] bug#24303 Wrong result for UPDATE IGNORE for NDB table: Added test case --- mysql-test/r/ndb_update.result | 8 ++++++++ mysql-test/t/ndb_update.test | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/mysql-test/r/ndb_update.result b/mysql-test/r/ndb_update.result index 164d1bd700c..52236bb0c3d 100644 --- a/mysql-test/r/ndb_update.result +++ b/mysql-test/r/ndb_update.result @@ -17,6 +17,14 @@ pk1 b c 0 0 0 2 2 2 4 1 1 +UPDATE t1 set pk1 = 4 where pk1 = 2; +ERROR 23000: Duplicate entry '4' for key 1 +UPDATE IGNORE t1 set pk1 = 4 where pk1 = 2; +select * from t1 order by pk1; +pk1 b c +0 0 0 +2 2 2 +4 1 1 UPDATE t1 set pk1 = 1, c = 2 where pk1 = 4; ERROR 23000: Duplicate entry '' for key 0 select * from t1 order by pk1; diff --git a/mysql-test/t/ndb_update.test b/mysql-test/t/ndb_update.test index 45e3add4639..5472dd95e9f 100644 --- a/mysql-test/t/ndb_update.test +++ b/mysql-test/t/ndb_update.test @@ -23,6 +23,10 @@ UPDATE t1 set b = c; select * from t1 order by pk1; UPDATE t1 set pk1 = 4 where pk1 = 1; select * from t1 order by pk1; +--error 1062 +UPDATE t1 set pk1 = 4 where pk1 = 2; +UPDATE IGNORE t1 set pk1 = 4 where pk1 = 2; +select * from t1 order by pk1; -- error 1062 UPDATE t1 set pk1 = 1, c = 2 where pk1 = 4; select * from t1 order by pk1;