Commit a47ef7fc authored by unknown's avatar unknown
Browse files

Merge mskold@bk-internal.mysql.com:/home/bk/mysql-5.1

into  mysql.com:/windows/Linux_space/MySQL/mysql-5.1


sql/ha_ndbcluster.cc:
  Auto merged
parents cf245c8f b2fbb83d
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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;
+14 −1
Original line number Diff line number Diff line
@@ -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,
@@ -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 
#
+5 −0
Original line number Diff line number Diff line
@@ -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;
+16 −0
Original line number Diff line number Diff line
@@ -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)
  {
+50 −32
Original line number Diff line number Diff line
@@ -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);
@@ -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"