diff options
author | unknown <mskold@mysql.com> | 2005-04-19 12:51:20 +0200 |
---|---|---|
committer | unknown <mskold@mysql.com> | 2005-04-19 12:51:20 +0200 |
commit | 432bc644c4af6c67f356354ad390fc1250541797 (patch) | |
tree | 2024c1376fc8fa5e11632eed866af792adf3e357 | |
parent | 92a00143d7460c964523494e573508c151b9cba4 (diff) | |
parent | fd9d58c413bf9830d9ee23cfdc54784ead768d25 (diff) | |
download | mariadb-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.result | 30 | ||||
-rw-r--r-- | mysql-test/t/ndb_update.test | 15 | ||||
-rw-r--r-- | sql/ha_ndbcluster.cc | 39 |
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 { |