summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <tomas@poseidon.ndb.mysql.com>2004-10-04 12:26:26 +0000
committerunknown <tomas@poseidon.ndb.mysql.com>2004-10-04 12:26:26 +0000
commit5e458aac1ebca0b1beb752e3bbd0a4d7163adb5f (patch)
tree514c5d951ef4245da7cd594f79f051b8b3728b6d
parentb3b26c05dc01045858ab5d36055812b92fee3690 (diff)
downloadmariadb-git-5e458aac1ebca0b1beb752e3bbd0a4d7163adb5f.tar.gz
bug #5872, transactions should only be restarted with transaction.on flag off if execute_commit has been performed
added testcase for this use force send for all executes mysql-test/r/ndb_blob.result: added testcase for alter table of blob from ndb to myisam mysql-test/t/ndb_blob.test: added testcase for alter table of blob from ndb to myisam sql/ha_ndbcluster.cc: bug #5872, transactions should only be restarted with transaction.on flag off if execute_commit has been performed use force send for all executes
-rw-r--r--mysql-test/r/ndb_blob.result5
-rw-r--r--mysql-test/t/ndb_blob.test5
-rw-r--r--sql/ha_ndbcluster.cc54
3 files changed, 47 insertions, 17 deletions
diff --git a/mysql-test/r/ndb_blob.result b/mysql-test/r/ndb_blob.result
index bb606b46902..cf64ec41ae3 100644
--- a/mysql-test/r/ndb_blob.result
+++ b/mysql-test/r/ndb_blob.result
@@ -397,4 +397,9 @@ select * from t1 order by a;
a b
1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
2 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
+alter table t1 engine=myisam;
+select * from t1 order by a;
+a b
+1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+2 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
drop table t1;
diff --git a/mysql-test/t/ndb_blob.test b/mysql-test/t/ndb_blob.test
index afa1a2c1455..5454dd91d26 100644
--- a/mysql-test/t/ndb_blob.test
+++ b/mysql-test/t/ndb_blob.test
@@ -309,6 +309,7 @@ select count(*) from t1;
drop table t1;
drop database mysqltest;
+# bug #5349
set autocommit=1;
use test;
CREATE TABLE t1 (
@@ -325,4 +326,8 @@ INSERT INTO t1 VALUES
select * from t1 order by a;
alter table t1 engine=ndb;
select * from t1 order by a;
+
+# bug #5872
+alter table t1 engine=myisam;
+select * from t1 order by a;
drop table t1;
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index e48ac8cc75e..045db961c70 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -147,7 +147,25 @@ int execute_no_commit(ha_ndbcluster *h, NdbConnection *trans)
int m_batch_execute= 0;
if (false && m_batch_execute)
return 0;
- return trans->execute(NoCommit);
+ return trans->execute(NoCommit,AbortOnError,1);
+}
+
+inline
+int execute_commit(ha_ndbcluster *h, NdbConnection *trans)
+{
+ int m_batch_execute= 0;
+ if (false && m_batch_execute)
+ return 0;
+ return trans->execute(Commit,AbortOnError,1);
+}
+
+inline
+int execute_no_commit_ie(ha_ndbcluster *h, NdbConnection *trans)
+{
+ int m_batch_execute= 0;
+ if (false && m_batch_execute)
+ return 0;
+ return trans->execute(NoCommit,IgnoreError,1);
}
/*
@@ -1006,7 +1024,7 @@ int ha_ndbcluster::pk_read(const byte *key, uint key_len, byte *buf)
}
}
- if (trans->execute(NoCommit, IgnoreError) != 0)
+ if (execute_no_commit_ie(this,trans) != 0)
{
table->status= STATUS_NOT_FOUND;
DBUG_RETURN(ndb_err(trans));
@@ -1127,7 +1145,7 @@ int ha_ndbcluster::unique_index_read(const byte *key,
}
}
- if (trans->execute(NoCommit, IgnoreError) != 0)
+ if (execute_no_commit_ie(this,trans) != 0)
{
table->status= STATUS_NOT_FOUND;
DBUG_RETURN(ndb_err(trans));
@@ -1197,18 +1215,20 @@ inline int ha_ndbcluster::next_result(byte *buf)
be sent to NDB
*/
DBUG_PRINT("info", ("ops_pending: %d", ops_pending));
- if (current_thd->transaction.on)
- {
- if (ops_pending && (execute_no_commit(this,trans) != 0))
- DBUG_RETURN(ndb_err(trans));
- }
- else
{
- if (ops_pending && (trans->execute(Commit) != 0))
- DBUG_RETURN(ndb_err(trans));
- trans->restart();
+ if (current_thd->transaction.on)
+ {
+ if (execute_no_commit(this,trans) != 0)
+ DBUG_RETURN(ndb_err(trans));
+ }
+ else
+ {
+ if (execute_commit(this,trans) != 0)
+ DBUG_RETURN(ndb_err(trans));
+ DBUG_ASSERT(trans->restart() == 0);
+ }
+ ops_pending= 0;
}
- ops_pending= 0;
contact_ndb= (check == 2);
}
@@ -1639,13 +1659,13 @@ int ha_ndbcluster::write_row(byte *record)
}
else
{
- if (trans->execute(Commit) != 0)
+ if (execute_commit(this,trans) != 0)
{
skip_auto_increment= true;
no_uncommitted_rows_execute_failure();
DBUG_RETURN(ndb_err(trans));
}
- trans->restart();
+ DBUG_ASSERT(trans->restart() == 0);
}
}
if ((has_auto_increment) && (skip_auto_increment))
@@ -2282,7 +2302,7 @@ int ha_ndbcluster::rnd_init(bool scan)
{
if (!scan)
DBUG_RETURN(1);
- cursor->restart();
+ DBUG_ASSERT(cursor->restart() == 0);
}
index_init(table->primary_key);
DBUG_RETURN(0);
@@ -2929,7 +2949,7 @@ int ndbcluster_commit(THD *thd, void *ndb_transaction)
"stmt" : "all"));
DBUG_ASSERT(ndb && trans);
- if (trans->execute(Commit) != 0)
+ if (execute_commit(0,trans) != 0)
{
const NdbError err= trans->getNdbError();
const NdbOperation *error_op= trans->getNdbErrorOperation();