summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <mskold@mysql.com>2005-04-19 12:51:20 +0200
committerunknown <mskold@mysql.com>2005-04-19 12:51:20 +0200
commit432bc644c4af6c67f356354ad390fc1250541797 (patch)
tree2024c1376fc8fa5e11632eed866af792adf3e357
parent92a00143d7460c964523494e573508c151b9cba4 (diff)
parentfd9d58c413bf9830d9ee23cfdc54784ead768d25 (diff)
downloadmariadb-git-432bc644c4af6c67f356354ad390fc1250541797.tar.gz
Merge mskold@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/usr/local/home/marty/MySQL/mysql-4.1
-rw-r--r--mysql-test/r/ndb_update.result30
-rw-r--r--mysql-test/t/ndb_update.test15
-rw-r--r--sql/ha_ndbcluster.cc39
3 files changed, 62 insertions, 22 deletions
diff --git a/mysql-test/r/ndb_update.result b/mysql-test/r/ndb_update.result
index 5df5c861cfb..c2247564e65 100644
--- a/mysql-test/r/ndb_update.result
+++ b/mysql-test/r/ndb_update.result
@@ -2,12 +2,32 @@ DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
pk1 INT NOT NULL PRIMARY KEY,
b INT NOT NULL,
-c INT NOT NULL
+c INT NOT NULL UNIQUE
) ENGINE=ndbcluster;
-INSERT INTO t1 VALUES (0, 0, 1),(1,1,2),(2,2,3);
+INSERT INTO t1 VALUES (0, 1, 0),(1,2,1),(2,3,2);
UPDATE t1 set b = c;
select * from t1 order by pk1;
pk1 b c
-0 1 1
-1 2 2
-2 3 3
+0 0 0
+1 1 1
+2 2 2
+UPDATE t1 set pk1 = 4 where pk1 = 1;
+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 '1' for key 1
+select * from t1 order by pk1;
+pk1 b c
+0 0 0
+2 2 2
+4 1 1
+UPDATE t1 set pk1 = pk1 + 10;
+select * from t1 order by pk1;
+pk1 b c
+10 0 0
+12 2 2
+14 1 1
+DROP TABLE IF EXISTS t1;
diff --git a/mysql-test/t/ndb_update.test b/mysql-test/t/ndb_update.test
index 3b0e84e2344..fc489ec4697 100644
--- a/mysql-test/t/ndb_update.test
+++ b/mysql-test/t/ndb_update.test
@@ -14,9 +14,20 @@ DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
pk1 INT NOT NULL PRIMARY KEY,
b INT NOT NULL,
- c INT NOT NULL
+ c INT NOT NULL UNIQUE
) ENGINE=ndbcluster;
-INSERT INTO t1 VALUES (0, 0, 1),(1,1,2),(2,2,3);
+INSERT INTO t1 VALUES (0, 1, 0),(1,2,1),(2,3,2);
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 = 1, c = 2 where pk1 = 4;
+select * from t1 order by pk1;
+UPDATE t1 set pk1 = pk1 + 10;
+select * from t1 order by pk1;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index d14d5f6f5c3..a6b4f928e72 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -1863,8 +1863,10 @@ int ha_ndbcluster::write_row(byte *record)
m_skip_auto_increment= !auto_increment_column_changed;
}
- if ((res= set_primary_key(op)))
- return res;
+ if ((res= (m_primary_key_update ?
+ set_primary_key_from_old_data(op, record)
+ : set_primary_key(op))))
+ return res;
}
// Set non-key attribute(s)
@@ -2001,7 +2003,7 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
{
int read_res, insert_res, delete_res;
- DBUG_PRINT("info", ("primary key update, doing pk read+insert+delete"));
+ DBUG_PRINT("info", ("primary key update, doing pk read+delete+insert"));
// Get all old fields, since we optimize away fields not in query
read_res= complemented_pk_read(old_data, new_data);
if (read_res)
@@ -2009,15 +2011,7 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
DBUG_PRINT("info", ("pk read failed"));
DBUG_RETURN(read_res);
}
- // Insert new row
- insert_res= write_row(new_data);
- if (insert_res)
- {
- DBUG_PRINT("info", ("insert failed"));
- DBUG_RETURN(insert_res);
- }
// Delete old row
- DBUG_PRINT("info", ("insert succeded"));
m_primary_key_update= TRUE;
delete_res= delete_row(old_data);
m_primary_key_update= FALSE;
@@ -2025,9 +2019,23 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
{
DBUG_PRINT("info", ("delete failed"));
// Undo write_row(new_data)
- DBUG_RETURN(delete_row(new_data));
+ DBUG_RETURN(delete_res);
}
- DBUG_PRINT("info", ("insert+delete succeeded"));
+ // Insert new row
+ DBUG_PRINT("info", ("delete succeded"));
+ insert_res= write_row(new_data);
+ if (insert_res)
+ {
+ DBUG_PRINT("info", ("insert failed"));
+ if (trans->commitStatus() == NdbConnection::Started)
+ {
+ m_primary_key_update= TRUE;
+ insert_res= write_row((byte *)old_data);
+ m_primary_key_update= FALSE;
+ }
+ DBUG_RETURN(insert_res);
+ }
+ DBUG_PRINT("info", ("delete+insert succeeded"));
DBUG_RETURN(0);
}
@@ -2125,8 +2133,9 @@ int ha_ndbcluster::delete_row(const byte *record)
no_uncommitted_rows_update(-1);
- // If deleting from cursor, NoCommit will be handled in next_result
- DBUG_RETURN(0);
+ if (!m_primary_key_update)
+ // If deleting from cursor, NoCommit will be handled in next_result
+ DBUG_RETURN(0);
}
else
{