Hi Guilhem,
On Wed, Jun 13, 2007 at 02:27:56PM +0200, Guilhem Bichot wrote:
> Hello Marko!
>
> On Wed, Jun 13, 2007 at 12:05:32PM +0300, Marko Mäkelä wrote:
> > I wonder if the following is correct behavior. This is from
> > innodb.test:
> >
> > create table t1 (i int, j int ) ENGINE=innodb;
> > insert into t1 values (1,2);
> > select * from t1 where i=1 and j=2;
> > create index ax1 on t1 (i,j);
> > select * from t1 where i=1 and j=2;
> >
> > If I set a breakpoint on innobase_commit, it gets invoked for the
> > INSERT, but not for the CREATE TABLE or CREATE INDEX statements.
> >
> > I have the impression that this behavior has been changed in the past
> > few weeks.
> >
> > The documentation of CREATE INDEX doesn't mention transactions. I
> > suppose that InnoDB is not the only transactional engine where data
> > dictionary operations are not truly transactional. Is it OK for the
> > engine to commit the transaction when it feels like that, or should
> > MySQL instead invoke commit?
>
> Strange, I see innobase_commit called by this CREATE INDEX both in 5.1
> and 5.0. There is a ha_commit_stmt() in copy_data_between_tables().
> Which version and which source tree are you on?
You're right, innobase_commit is indeed called for CREATE INDEX in 5.1,
more specifically, in this revision:
ChangeSet@stripped, 2007-06-07 16:37:15+02:00, joerg@trift2. +8 -0
Merge trift2.:/MySQL/M50/push-5.0
into trift2.:/MySQL/M51/push-5.1
MERGE: 1.1810.2945.41
However, I should have said that I have been debugging fast index creation
that we are planning to release as a 5.1 plugin. There, innobase_commit is
called *before* ha_innobase::add_index() but not after it. If I remove
the call to innobase_commit_low() at the end of that function, many tests
will fail.
I'm sorry for misleading you. I didn't enable the breakpoint on
innobase_commit() until after ha_innobase::add_index() was called.
I wonder what the correct behavior is. I would expect MySQL to commit
before and after handler::add_index().
Marko