Commit ce10cefd authored by unknown's avatar unknown

Per Heikki's request make trans_register_ha tolerant to multiple registrations

parent 5a28f962
...@@ -505,10 +505,16 @@ void ha_close_connection(THD* thd) ...@@ -505,10 +505,16 @@ void ha_close_connection(THD* thd)
"beginning of transaction" and "beginning of statement"). "beginning of transaction" and "beginning of statement").
Only storage engines registered for the transaction/statement Only storage engines registered for the transaction/statement
will know when to commit/rollback it. will know when to commit/rollback it.
NOTE
trans_register_ha is idempotent - storage engine may register many
times per transaction.
*/ */
void trans_register_ha(THD *thd, bool all, handlerton *ht_arg) void trans_register_ha(THD *thd, bool all, handlerton *ht_arg)
{ {
THD_TRANS *trans; THD_TRANS *trans;
handlerton **ht;
DBUG_ENTER("trans_register_ha"); DBUG_ENTER("trans_register_ha");
DBUG_PRINT("enter",("%s", all ? "all" : "stmt")); DBUG_PRINT("enter",("%s", all ? "all" : "stmt"));
...@@ -520,15 +526,12 @@ void trans_register_ha(THD *thd, bool all, handlerton *ht_arg) ...@@ -520,15 +526,12 @@ void trans_register_ha(THD *thd, bool all, handlerton *ht_arg)
else else
trans= &thd->transaction.stmt; trans= &thd->transaction.stmt;
#ifndef DBUG_OFF for (ht=trans->ht; *ht; ht++)
handlerton **ht=trans->ht; if (*ht == ht_arg)
while (*ht) DBUG_VOID_RETURN;
{
DBUG_ASSERT(*ht != ht_arg);
ht++;
}
#endif
trans->ht[trans->nht++]=ht_arg; trans->ht[trans->nht++]=ht_arg;
DBUG_ASSERT(*ht == ht_arg);
trans->no_2pc|=(ht_arg->prepare==0); trans->no_2pc|=(ht_arg->prepare==0);
if (thd->transaction.xid.is_null()) if (thd->transaction.xid.is_null())
thd->transaction.xid.set(thd->query_id); thd->transaction.xid.set(thd->query_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment