Commit 115eb7df authored by unknown's avatar unknown
Browse files

Merge mysql.com:/windows/Linux_space/MySQL/mysql-4.1

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


mysql-test/r/ndb_lock.result:
  Auto merged
mysql-test/t/ndb_lock.test:
  Auto merged
ndb/include/ndbapi/NdbTransaction.hpp:
  Merge
sql/ha_ndbcluster.cc:
  Merge
sql/ha_ndbcluster.h:
  Merge
parents 492e7b08 87b7363c
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -64,17 +64,26 @@ pk u o
insert into t1 values (1,1,1);
drop table t1;
create table t1 (x integer not null primary key, y varchar(32), z integer, key(z)) engine = ndb;
insert into t1 values (1,'one',1), (2,'two',2),(3,"three",3);
insert into t1 values (1,'one',1);
begin;
select * from t1 where x = 1 for update;
x	y	z
1	one	1
begin;
select * from t1 where x = 2 for update;
select * from t1 where x = 1 for update;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
rollback;
rollback;
insert into t1 values (2,'two',2),(3,"three",3);
begin;
select * from t1 where x = 1 for update;
x	y	z
2	two	2
1	one	1
select * from t1 where x = 1 for update;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
select * from t1 where x = 2 for update;
x	y	z
2	two	2
rollback;
commit;
begin;
+13 −2
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ drop table t1;

create table t1 (x integer not null primary key, y varchar(32), z integer, key(z)) engine = ndb;

insert into t1 values (1,'one',1), (2,'two',2),(3,"three",3); 
insert into t1 values (1,'one',1);

# PK access
connection con1;
@@ -82,11 +82,22 @@ select * from t1 where x = 1 for update;

connection con2;
begin;
select * from t1 where x = 2 for update;
--error 1205
select * from t1 where x = 1 for update;
rollback;

connection con1;
rollback;
insert into t1 values (2,'two',2),(3,"three",3); 
begin;
select * from t1 where x = 1 for update;

connection con2;
--error 1205
select * from t1 where x = 1 for update;
select * from t1 where x = 2 for update;
rollback;

connection con1;
commit;

+2 −0
Original line number Diff line number Diff line
@@ -140,6 +140,7 @@ class NdbTransaction
  friend class NdbIndexOperation;
  friend class NdbIndexScanOperation;
  friend class NdbBlob;
  friend class ha_ndbcluster;
#endif

public:
@@ -791,6 +792,7 @@ private:
  // optim: any blobs
  bool theBlobFlag;
  Uint8 thePendingBlobOps;
  inline bool hasBlobOperation() { return theBlobFlag; }

  static void sendTC_COMMIT_ACK(NdbApiSignal *,
				Uint32 transId1, Uint32 transId2, 
+33 −0
Original line number Diff line number Diff line
@@ -235,6 +235,7 @@ int execute_no_commit(ha_ndbcluster *h, NdbTransaction *trans)
  if (m_batch_execute)
    return 0;
#endif
  h->release_completed_operations(trans);
  return trans->execute(NdbTransaction::NoCommit,
                        NdbTransaction::AbortOnError,
                        h->m_force_send);
@@ -274,6 +275,7 @@ int execute_no_commit_ie(ha_ndbcluster *h, NdbTransaction *trans)
  if (m_batch_execute)
    return 0;
#endif
  h->release_completed_operations(trans);
  return trans->execute(NdbTransaction::NoCommit,
                        NdbTransaction::AO_IgnoreError,
                        h->m_force_send);
@@ -2928,6 +2930,26 @@ int ha_ndbcluster::close_scan()

  NdbScanOperation *cursor= m_active_cursor ? m_active_cursor : m_multi_cursor;
  
  if (m_lock_tuple)
  {
    /*
      Lock level m_lock.type either TL_WRITE_ALLOW_WRITE
      (SELECT FOR UPDATE) or TL_READ_WITH_SHARED_LOCKS (SELECT
      LOCK WITH SHARE MODE) and row was not explictly unlocked 
      with unlock_row() call
    */
      NdbOperation *op;
      // Lock row
      DBUG_PRINT("info", ("Keeping lock on scanned row"));
      
      if (!(op= cursor->lockTuple()))
      {
	m_lock_tuple= false;
	ERR_RETURN(trans->getNdbError());
      }
      m_ops_pending++;      
  }
  m_lock_tuple= false;
  if (m_ops_pending)
  {
    /*
@@ -5986,6 +6008,17 @@ int ha_ndbcluster::write_ndb_file()
  DBUG_RETURN(error);
}

void 
ha_ndbcluster::release_completed_operations(NdbConnection *trans)
{
  if (trans->hasBlobOperation())
  {
    /* We are reading/writing BLOB fields, 
       releasing operation records is unsafe
    */
    return;
  }
  trans->releaseCompletedOperations();
int
ha_ndbcluster::read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
                                      KEY_MULTI_RANGE *ranges, 
+2 −0
Original line number Diff line number Diff line
@@ -716,6 +716,8 @@ static void set_tabname(const char *pathname, char *tabname);
  bool m_force_send;
  ha_rows m_autoincrement_prefetch;
  bool m_transaction_on;
  void release_completed_operations(NdbConnection*);

  Ndb_cond_stack *m_cond_stack;
  bool m_disable_multi_read;
  byte *m_multi_range_result_ptr;