Loading mysql-test/r/ndb_update.result +8 −0 Original line number Diff line number Diff line Loading @@ -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 '*UNKNOWN*' select * from t1 order by pk1; Loading mysql-test/t/ndb_index_unique.test +14 −1 Original line number Diff line number Diff line Loading @@ -91,7 +91,6 @@ select * from t2 order by a; drop table t2; -- error 1121 CREATE TABLE t2 ( a int unsigned NOT NULL PRIMARY KEY, b int unsigned not null, Loading @@ -99,6 +98,20 @@ CREATE TABLE t2 ( UNIQUE (b, c) USING HASH ) engine=ndbcluster; insert t2 values(1,1,NULL),(2,2,2),(3,3,NULL),(4,4,4),(5,5,NULL),(6,6,6),(7,7,NULL),(8,3,NULL),(9,3,NULL); select * from t2 where c IS NULL order by a; select * from t2 where b = 3 AND c IS NULL order by a; select * from t2 where (b = 3 OR b = 5) AND c IS NULL order by a; set @old_ecpd = @@session.engine_condition_pushdown; set engine_condition_pushdown = true; explain select * from t2 where (b = 3 OR b = 5) AND c IS NULL AND a < 9 order by a; select * from t2 where (b = 3 OR b = 5) AND c IS NULL AND a < 9 order by a; set engine_condition_pushdown = @old_ecpd; drop table t2; # # Show use of PRIMARY KEY USING HASH indexes # Loading mysql-test/t/ndb_update.test +5 −0 Original line number Diff line number Diff line Loading @@ -24,7 +24,12 @@ 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; UPDATE IGNORE t1 set pk1 = 1, c = 2 where pk1 = 4; select * from t1 order by pk1; UPDATE t1 set pk1 = pk1 + 10; select * from t1 order by pk1; Loading sql/ha_ndbcluster.cc +16 −0 Original line number Diff line number Diff line Loading @@ -2758,6 +2758,22 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data) DBUG_ENTER("update_row"); m_write_op= TRUE; /* * If IGNORE the ignore constraint violations on primary and unique keys, * but check that it is not part of INSERT ... ON DUPLICATE KEY UPDATE */ if (m_ignore_dup_key && thd->lex->sql_command != SQLCOM_INSERT) { int peek_res= peek_indexed_rows(new_data); if (!peek_res) { DBUG_RETURN(HA_ERR_FOUND_DUPP_KEY); } if (peek_res != HA_ERR_KEY_NOT_FOUND) DBUG_RETURN(peek_res); } statistic_increment(thd->status_var.ha_update_count, &LOCK_status); if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) { Loading storage/ndb/src/common/util/socket_io.cpp +50 −32 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -76,43 +72,65 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, } if(selectRes == -1){ fcntl(socket, F_SETFL, sock_flags); return -1; } const int t = recv(socket, buf, buflen, MSG_PEEK); char* ptr = buf; int len = buflen; do { int t; while((t = recv(socket, ptr, len, MSG_PEEK)) == -1 && errno == EINTR); if(t < 1) { fcntl(socket, F_SETFL, sock_flags); return -1; } for(int i = 0; i<t; i++) { if(buf[i] == '\n'){ int r= recv(socket, buf, i+1, 0); buf[i+1]= 0; if(r < 1) { fcntl(socket, F_SETFL, sock_flags); if(ptr[i] == '\n') { /** * Now consume */ for (len = 1 + i; len; ) { while ((t = recv(socket, ptr, len, 0)) == -1 && errno == EINTR); if (t < 1) return -1; ptr += t; len -= t; } ptr[0]= 0; return ptr - buf; } if(i > 0 && buf[i-1] == '\r'){ buf[i-1] = '\n'; buf[i]= '\0'; } fcntl(socket, F_SETFL, sock_flags); return r; for (int tmp = t; tmp; ) { while ((t = recv(socket, ptr, tmp, 0)) == -1 && errno == EINTR); if (t < 1) { return -1; } ptr += t; len -= t; tmp -= t; } int r= recv(socket, buf, t, 0); if(r>=0) buf[r] = 0; fcntl(socket, F_SETFL, sock_flags); return r; FD_ZERO(&readset); FD_SET(socket, &readset); timeout.tv_sec = (timeout_millis / 1000); timeout.tv_usec = (timeout_millis % 1000) * 1000; const int selectRes = select(socket + 1, &readset, 0, 0, &timeout); if(selectRes != 1){ return -1; } } while (len > 0); return -1; } extern "C" Loading Loading
mysql-test/r/ndb_update.result +8 −0 Original line number Diff line number Diff line Loading @@ -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 '*UNKNOWN*' select * from t1 order by pk1; Loading
mysql-test/t/ndb_index_unique.test +14 −1 Original line number Diff line number Diff line Loading @@ -91,7 +91,6 @@ select * from t2 order by a; drop table t2; -- error 1121 CREATE TABLE t2 ( a int unsigned NOT NULL PRIMARY KEY, b int unsigned not null, Loading @@ -99,6 +98,20 @@ CREATE TABLE t2 ( UNIQUE (b, c) USING HASH ) engine=ndbcluster; insert t2 values(1,1,NULL),(2,2,2),(3,3,NULL),(4,4,4),(5,5,NULL),(6,6,6),(7,7,NULL),(8,3,NULL),(9,3,NULL); select * from t2 where c IS NULL order by a; select * from t2 where b = 3 AND c IS NULL order by a; select * from t2 where (b = 3 OR b = 5) AND c IS NULL order by a; set @old_ecpd = @@session.engine_condition_pushdown; set engine_condition_pushdown = true; explain select * from t2 where (b = 3 OR b = 5) AND c IS NULL AND a < 9 order by a; select * from t2 where (b = 3 OR b = 5) AND c IS NULL AND a < 9 order by a; set engine_condition_pushdown = @old_ecpd; drop table t2; # # Show use of PRIMARY KEY USING HASH indexes # Loading
mysql-test/t/ndb_update.test +5 −0 Original line number Diff line number Diff line Loading @@ -24,7 +24,12 @@ 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; UPDATE IGNORE t1 set pk1 = 1, c = 2 where pk1 = 4; select * from t1 order by pk1; UPDATE t1 set pk1 = pk1 + 10; select * from t1 order by pk1; Loading
sql/ha_ndbcluster.cc +16 −0 Original line number Diff line number Diff line Loading @@ -2758,6 +2758,22 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data) DBUG_ENTER("update_row"); m_write_op= TRUE; /* * If IGNORE the ignore constraint violations on primary and unique keys, * but check that it is not part of INSERT ... ON DUPLICATE KEY UPDATE */ if (m_ignore_dup_key && thd->lex->sql_command != SQLCOM_INSERT) { int peek_res= peek_indexed_rows(new_data); if (!peek_res) { DBUG_RETURN(HA_ERR_FOUND_DUPP_KEY); } if (peek_res != HA_ERR_KEY_NOT_FOUND) DBUG_RETURN(peek_res); } statistic_increment(thd->status_var.ha_update_count, &LOCK_status); if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) { Loading
storage/ndb/src/common/util/socket_io.cpp +50 −32 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -76,43 +72,65 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, } if(selectRes == -1){ fcntl(socket, F_SETFL, sock_flags); return -1; } const int t = recv(socket, buf, buflen, MSG_PEEK); char* ptr = buf; int len = buflen; do { int t; while((t = recv(socket, ptr, len, MSG_PEEK)) == -1 && errno == EINTR); if(t < 1) { fcntl(socket, F_SETFL, sock_flags); return -1; } for(int i = 0; i<t; i++) { if(buf[i] == '\n'){ int r= recv(socket, buf, i+1, 0); buf[i+1]= 0; if(r < 1) { fcntl(socket, F_SETFL, sock_flags); if(ptr[i] == '\n') { /** * Now consume */ for (len = 1 + i; len; ) { while ((t = recv(socket, ptr, len, 0)) == -1 && errno == EINTR); if (t < 1) return -1; ptr += t; len -= t; } ptr[0]= 0; return ptr - buf; } if(i > 0 && buf[i-1] == '\r'){ buf[i-1] = '\n'; buf[i]= '\0'; } fcntl(socket, F_SETFL, sock_flags); return r; for (int tmp = t; tmp; ) { while ((t = recv(socket, ptr, tmp, 0)) == -1 && errno == EINTR); if (t < 1) { return -1; } ptr += t; len -= t; tmp -= t; } int r= recv(socket, buf, t, 0); if(r>=0) buf[r] = 0; fcntl(socket, F_SETFL, sock_flags); return r; FD_ZERO(&readset); FD_SET(socket, &readset); timeout.tv_sec = (timeout_millis / 1000); timeout.tv_usec = (timeout_millis % 1000) * 1000; const int selectRes = select(socket + 1, &readset, 0, 0, &timeout); if(selectRes != 1){ return -1; } } while (len > 0); return -1; } extern "C" Loading