summaryrefslogtreecommitdiff
path: root/sql/ha_ndbcluster.cc
diff options
context:
space:
mode:
authorunknown <jimw@mysql.com>2005-12-09 15:00:33 -0800
committerunknown <jimw@mysql.com>2005-12-09 15:00:33 -0800
commit4d09673065bba0434909ad09b7f9ecd82752c8db (patch)
tree8e54fb8c42c750aceab7ac826bb3f35b4eabadeb /sql/ha_ndbcluster.cc
parentbb2f4b8124ecd9838b1eafba02be822981b4b181 (diff)
downloadmariadb-git-4d09673065bba0434909ad09b7f9ecd82752c8db.tar.gz
Fix crash in BDB from improper cleanup of transactions, and avoid problem
in NDB that the fix would cause due to improper registration of a transaction that isn't meant to be seen by the handler layer. (Bug #14212) Thanks to Sergei Golubchik for helping with this. mysql-test/r/bdb.result: Add new result mysql-test/t/bdb.test: Add new regression test sql/ha_ndbcluster.cc: Don't register transaction if transactions are "disabled". sql/handler.cc: Commit statement before trying to end transaction.
Diffstat (limited to 'sql/ha_ndbcluster.cc')
-rw-r--r--sql/ha_ndbcluster.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index a0efcd2c4f9..b3d5d86dc52 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -3221,6 +3221,10 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
if (lock_type != F_UNLCK)
{
DBUG_PRINT("info", ("lock_type != F_UNLCK"));
+ if (!thd->transaction.on)
+ m_transaction_on= FALSE;
+ else
+ m_transaction_on= thd->variables.ndb_use_transactions;
if (!thd_ndb->lock_count++)
{
PRINT_OPTION_FLAGS(thd);
@@ -3235,7 +3239,8 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
ERR_RETURN(ndb->getNdbError());
no_uncommitted_rows_reset(thd);
thd_ndb->stmt= trans;
- trans_register_ha(thd, FALSE, &ndbcluster_hton);
+ if (m_transaction_on)
+ trans_register_ha(thd, FALSE, &ndbcluster_hton);
}
else
{
@@ -3250,7 +3255,8 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
ERR_RETURN(ndb->getNdbError());
no_uncommitted_rows_reset(thd);
thd_ndb->all= trans;
- trans_register_ha(thd, TRUE, &ndbcluster_hton);
+ if (m_transaction_on)
+ trans_register_ha(thd, TRUE, &ndbcluster_hton);
/*
If this is the start of a LOCK TABLE, a table look
@@ -3284,10 +3290,6 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
m_ha_not_exact_count= !thd->variables.ndb_use_exact_count;
m_autoincrement_prefetch=
(ha_rows) thd->variables.ndb_autoincrement_prefetch_sz;
- if (!thd->transaction.on)
- m_transaction_on= FALSE;
- else
- m_transaction_on= thd->variables.ndb_use_transactions;
m_active_trans= thd_ndb->all ? thd_ndb->all : thd_ndb->stmt;
DBUG_ASSERT(m_active_trans);