summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormskold/marty@mysql.com/linux.site <>2006-11-30 23:12:33 +0100
committermskold/marty@mysql.com/linux.site <>2006-11-30 23:12:33 +0100
commit23113169624862aead2e77f9545bae5373e33c65 (patch)
tree5fe70a2de06e6502b4c062aace09587dba617b86
parenta172df24a902e586adf62a3258206b60fb1b9cc3 (diff)
parentaa03fbcac99b5d3e871eee8b3128ad9b895d6ef1 (diff)
downloadmariadb-git-23113169624862aead2e77f9545bae5373e33c65.tar.gz
Merge mysql.com:/windows/Linux_space/MySQL/mysql-5.0
into mysql.com:/windows/Linux_space/MySQL/mysql-5.0-ndb
-rw-r--r--sql/ha_ndbcluster.cc18
-rw-r--r--sql/ha_ndbcluster.h2
2 files changed, 11 insertions, 9 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 0672299aa71..49ff0fcb921 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -1610,7 +1610,7 @@ bool ha_ndbcluster::check_all_operations_for_error(NdbTransaction *trans,
* primary key or unique index values
*/
-int ha_ndbcluster::peek_indexed_rows(const byte *record)
+int ha_ndbcluster::peek_indexed_rows(const byte *record, bool check_pk)
{
NdbTransaction *trans= m_active_trans;
NdbOperation *op;
@@ -1623,7 +1623,7 @@ int ha_ndbcluster::peek_indexed_rows(const byte *record)
(NdbOperation::LockMode)get_ndb_lock_type(m_lock.type);
first= NULL;
- if (table->s->primary_key != MAX_KEY)
+ if (check_pk && table->s->primary_key != MAX_KEY)
{
/*
* Fetch any row with colliding primary key
@@ -2216,7 +2216,7 @@ int ha_ndbcluster::write_row(byte *record)
start_bulk_insert will set parameters to ensure that each
write_row is committed individually
*/
- int peek_res= peek_indexed_rows(record);
+ int peek_res= peek_indexed_rows(record, true);
if (!peek_res)
{
@@ -2385,14 +2385,17 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
NdbScanOperation* cursor= m_active_cursor;
NdbOperation *op;
uint i;
+ bool pk_update= (table->s->primary_key != MAX_KEY &&
+ key_cmp(table->s->primary_key, old_data, new_data));
DBUG_ENTER("update_row");
/*
- * If IGNORE the ignore constraint violations on primary and unique keys
+ * 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)
+ if (m_ignore_dup_key && thd->lex->sql_command == SQLCOM_UPDATE)
{
- int peek_res= peek_indexed_rows(new_data);
+ int peek_res= peek_indexed_rows(new_data, pk_update);
if (!peek_res)
{
@@ -2411,8 +2414,7 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
}
/* Check for update of primary key for special handling */
- if ((table->s->primary_key != MAX_KEY) &&
- (key_cmp(table->s->primary_key, old_data, new_data)))
+ if (pk_update)
{
int read_res, insert_res, delete_res, undo_res;
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index 378b50ec85f..5d66a7920f9 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -661,7 +661,7 @@ private:
const NdbOperation *first,
const NdbOperation *last,
uint errcode);
- int peek_indexed_rows(const byte *record);
+ int peek_indexed_rows(const byte *record, bool check_pk);
int unique_index_read(const byte *key, uint key_len,
byte *buf);
int ordered_index_scan(const key_range *start_key,