Browse Source

branches/innodb+: Merge revisions 6130:6364 from branches/zip:

------------------------------------------------------------------------
  r6130 | marko | 2009-11-02 11:42:56 +0200 (Mon, 02 Nov 2009) | 9 lines
  Changed paths:
     M /branches/zip/ChangeLog
     M /branches/zip/btr/btr0sea.c
     M /branches/zip/buf/buf0buf.c
     M /branches/zip/dict/dict0dict.c
     M /branches/zip/fil/fil0fil.c
     M /branches/zip/ibuf/ibuf0ibuf.c
     M /branches/zip/include/btr0sea.h
     M /branches/zip/include/dict0dict.h
     M /branches/zip/include/fil0fil.h
     M /branches/zip/include/ibuf0ibuf.h
     M /branches/zip/include/lock0lock.h
     M /branches/zip/include/log0log.h
     M /branches/zip/include/log0recv.h
     M /branches/zip/include/mem0mem.h
     M /branches/zip/include/mem0pool.h
     M /branches/zip/include/os0file.h
     M /branches/zip/include/pars0pars.h
     M /branches/zip/include/srv0srv.h
     M /branches/zip/include/thr0loc.h
     M /branches/zip/include/trx0i_s.h
     M /branches/zip/include/trx0purge.h
     M /branches/zip/include/trx0rseg.h
     M /branches/zip/include/trx0sys.h
     M /branches/zip/include/trx0undo.h
     M /branches/zip/include/usr0sess.h
     M /branches/zip/lock/lock0lock.c
     M /branches/zip/log/log0log.c
     M /branches/zip/log/log0recv.c
     M /branches/zip/mem/mem0dbg.c
     M /branches/zip/mem/mem0pool.c
     M /branches/zip/os/os0file.c
     M /branches/zip/os/os0sync.c
     M /branches/zip/os/os0thread.c
     M /branches/zip/pars/lexyy.c
     M /branches/zip/pars/pars0lex.l
     M /branches/zip/que/que0que.c
     M /branches/zip/srv/srv0srv.c
     M /branches/zip/srv/srv0start.c
     M /branches/zip/sync/sync0arr.c
     M /branches/zip/sync/sync0sync.c
     M /branches/zip/thr/thr0loc.c
     M /branches/zip/trx/trx0i_s.c
     M /branches/zip/trx/trx0purge.c
     M /branches/zip/trx/trx0rseg.c
     M /branches/zip/trx/trx0sys.c
     M /branches/zip/trx/trx0undo.c
     M /branches/zip/usr/usr0sess.c
     M /branches/zip/ut/ut0mem.c

  branches/zip: Free all resources at shutdown. Set pointers to NULL, so
  that Valgrind will not complain about freed data structures that are
  reachable via pointers.  This addresses Bug #45992 and Bug #46656.

  This patch is mostly based on changes copied from branches/embedded-1.0,
  mainly c5432, c3439, c3134, c2994, c2978, but also some other code was
  copied.  Some added cleanup code is specific to MySQL/InnoDB.

  rb://199 approved by Sunny Bains
  ------------------------------------------------------------------------
  r6134 | marko | 2009-11-04 09:57:29 +0200 (Wed, 04 Nov 2009) | 5 lines
  Changed paths:
     M /branches/zip/ChangeLog
     M /branches/zip/handler/ha_innodb.cc

  branches/zip: innobase_convert_identifier(): Convert table names with
  explain_filename() to address Bug #32430: 'show innodb status'
  causes errors Invalid (old?) table or database name in logs.

  rb://134 approved by Sunny Bains
  ------------------------------------------------------------------------
  r6137 | marko | 2009-11-04 15:24:28 +0200 (Wed, 04 Nov 2009) | 1 line
  Changed paths:
     M /branches/zip/dict/dict0dict.c

  branches/zip: dict_index_too_big_for_undo(): Correct a typo.
  ------------------------------------------------------------------------
  r6153 | vasil | 2009-11-10 15:33:22 +0200 (Tue, 10 Nov 2009) | 145 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc

  branches/zip: Merge r6125:6152 from branches/5.1:

  (everything except the last white-space change was skipped as it is already
  in branches/zip)
    ------------------------------------------------------------------------
    r6127 | vasil | 2009-10-30 11:18:25 +0200 (Fri, 30 Oct 2009) | 18 lines
    Changed paths:
       M /branches/5.1/Makefile.am
       M /branches/5.1/mysql-test/innodb-autoinc.result
       M /branches/5.1/mysql-test/innodb-autoinc.test

    branches/5.1:

    Backport c6121 from branches/zip:
      ------------------------------------------------------------------------
      r6121 | sunny | 2009-10-30 01:42:11 +0200 (Fri, 30 Oct 2009) | 7 lines
      Changed paths:
         M /branches/zip/mysql-test/innodb-autoinc.result

      branches/zip: This test has been problematic for sometime now. The underlying
      bug is that the data dictionaries get out of sync. In the AUTOINC code we
      try and apply salve to the symptoms. In the past MySQL made some unrelated
      change and the dictionaries stopped getting out of sync and this test started
      to fail. Now, it seems they have reverted that changed and the test is
      passing again. I suspect this is not he last time that this test will change.
      ------------------------------------------------------------------------
    ------------------------------------------------------------------------
    r6129 | vasil | 2009-10-30 17:14:22 +0200 (Fri, 30 Oct 2009) | 4 lines
    Changed paths:
       M /branches/5.1/Makefile.am

    branches/5.1:

    Revert a change to Makefile.am that sneaked unnoticed in c6127.
    ------------------------------------------------------------------------
    r6136 | marko | 2009-11-04 12:28:10 +0200 (Wed, 04 Nov 2009) | 15 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc
       M /branches/5.1/include/ha_prototypes.h
       M /branches/5.1/ut/ut0ut.c

    branches/5.1: Port r6134 from branches/zip:

      ------------------------------------------------------------------------
      r6134 | marko | 2009-11-04 07:57:29 +0000 (Wed, 04 Nov 2009) | 5 lines

      branches/zip: innobase_convert_identifier(): Convert table names with
      explain_filename() to address Bug #32430: 'show innodb status'
      causes errors Invalid (old?) table or database name in logs.

      rb://134 approved by Sunny Bains
      ------------------------------------------------------------------------

    innobase_print_identifier(): Replace with innobase_convert_name().

    innobase_convert_identifier(): New function, called by innobase_convert_name().
    ------------------------------------------------------------------------
    r6149 | vasil | 2009-11-09 11:15:01 +0200 (Mon, 09 Nov 2009) | 5 lines
    Changed paths:
       M /branches/5.1/CMakeLists.txt

    branches/5.1:

    Followup to r5700: Adjust the changes so they are the same as in the BZR
    repository.
    ------------------------------------------------------------------------
    r6150 | vasil | 2009-11-09 11:43:31 +0200 (Mon, 09 Nov 2009) | 58 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc

    branches/5.1:

    Merge a part of r2911.5.5 from MySQL:
    (the other part of this was merged in c5700)

      ------------------------------------------------------------
      revno: 2911.5.5
      committer: Vladislav Vaintroub <vvaintroub@mysql.com>
      branch nick: 5.1-innodb_plugin
      timestamp: Wed 2009-06-10 10:59:49 +0200
      message:
        Backport WL#3653 to 5.1 to enable bundled innodb plugin.
        Remove custom DLL loader code from innodb plugin code, use
        symbols exported from mysqld.
      removed:
        storage/innodb_plugin/handler/handler0vars.h
        storage/innodb_plugin/handler/win_delay_loader.cc
      added:
        storage/mysql_storage_engine.cmake
        win/create_def_file.js
      modified:
        CMakeLists.txt
        include/m_ctype.h
        include/my_global.h
        include/my_sys.h
        include/mysql/plugin.h
        libmysqld/CMakeLists.txt
        mysql-test/mysql-test-run.pl
        mysql-test/t/plugin.test
        mysql-test/t/plugin_load-master.opt
        mysys/charset.c
        sql/CMakeLists.txt
        sql/handler.h
        sql/mysql_priv.h
        sql/mysqld.cc
        sql/sql_class.cc
        sql/sql_class.h
        sql/sql_list.h
        sql/sql_profile.h
        storage/Makefile.am
        storage/archive/CMakeLists.txt
        storage/blackhole/CMakeLists.txt
        storage/csv/CMakeLists.txt
        storage/example/CMakeLists.txt
        storage/federated/CMakeLists.txt
        storage/heap/CMakeLists.txt
        storage/innobase/CMakeLists.txt
        storage/innobase/handler/ha_innodb.cc
        storage/innodb_plugin/CMakeLists.txt
        storage/innodb_plugin/handler/ha_innodb.cc
        storage/innodb_plugin/handler/handler0alter.cc
        storage/innodb_plugin/handler/i_s.cc
        storage/innodb_plugin/plug.in
        storage/myisam/CMakeLists.txt
        storage/myisammrg/CMakeLists.txt
        win/Makefile.am
        win/configure.js
    ------------------------------------------------------------------------
    r6152 | vasil | 2009-11-10 15:30:20 +0200 (Tue, 10 Nov 2009) | 4 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc

    branches/5.1:

    White space fixup.
    ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r6157 | jyang | 2009-11-11 14:27:09 +0200 (Wed, 11 Nov 2009) | 10 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc
     A /branches/zip/mysql-test/innodb_bug47167.result
     A /branches/zip/mysql-test/innodb_bug47167.test
     M /branches/zip/mysql-test/innodb_file_format.result

  branches/zip: Fix an issue that a local variable defined
  in innodb_file_format_check_validate() is being referenced
  across function in innodb_file_format_check_update().
  In addition, fix "set global innodb_file_format_check =
  DEFAULT" call.
  Bug #47167: "set global innodb_file_format_check" cannot
  set value by User-Defined Variable."
  rb://169 approved by Sunny Bains and Marko.
  ------------------------------------------------------------------------
  r6159 | vasil | 2009-11-11 15:13:01 +0200 (Wed, 11 Nov 2009) | 37 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc
     M /branches/zip/handler/ha_innodb.h

  branches/zip:

  Merge a change from MySQL:
  (this has been reviewed by Calvin and Marko, and Calvin says Luis has
  incorporated Marko's suggestions)

    ------------------------------------------------------------
    revno: 3092.5.1
    committer: Luis Soares <luis.soares@sun.com>
    branch nick: mysql-5.1-bugteam
    timestamp: Thu 2009-09-24 15:52:52 +0100
    message:
      BUG#42829: binlogging enabled for all schemas regardless of
      binlog-db-db / binlog-ignore-db

      InnoDB will return an error if statement based replication is used
      along with transaction isolation level READ-COMMITTED (or weaker),
      even if the statement in question is filtered out according to the
      binlog-do-db rules set. In this case, an error should not be printed.

      This patch addresses this issue by extending the existing check in
      external_lock to take into account the filter rules before deciding to
      print an error. Furthermore, it also changes decide_logging_format to
      take into consideration whether the statement is filtered out from
      binlog before decision is made.
    added:
      mysql-test/suite/binlog/r/binlog_stm_do_db.result
      mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt
      mysql-test/suite/binlog/t/binlog_stm_do_db.test
    modified:
      sql/sql_base.cc
      sql/sql_class.cc
      storage/innobase/handler/ha_innodb.cc
      storage/innobase/handler/ha_innodb.h
      storage/innodb_plugin/handler/ha_innodb.cc
      storage/innodb_plugin/handler/ha_innodb.h
  ------------------------------------------------------------------------
  r6160 | vasil | 2009-11-11 15:33:49 +0200 (Wed, 11 Nov 2009) | 72 lines
  Changed paths:
     M /branches/zip/include/os0file.h
     M /branches/zip/os/os0file.c

  branches/zip: Merge r6152:6159 from branches/5.1:

  (r6158 was skipped as an equivallent change has already been merged from MySQL)
    ------------------------------------------------------------------------
    r6154 | calvin | 2009-11-11 02:51:17 +0200 (Wed, 11 Nov 2009) | 17 lines
    Changed paths:
       M /branches/5.1/include/os0file.h
       M /branches/5.1/os/os0file.c

    branches/5.1: fix bug#3139: Mysql crashes: 'windows error 995'
    after several selects on a large DB

    During stress environment, Windows AIO may fail with error code
    ERROR_OPERATION_ABORTED. InnoDB does not handle the error, rather
    crashes. The cause of the error is unknown, but likely due to
    faulty hardware or driver.

    This patch introduces a new error code OS_FILE_OPERATION_ABORTED,
    which maps to Windows ERROR_OPERATION_ABORTED (995). When the error
    is detected during AIO, the InnoDB will issue a synchronous retry
    (read/write).

    This patch has been extensively tested by MySQL support.

    Approved by: Marko
    rb://196
    ------------------------------------------------------------------------
    r6158 | vasil | 2009-11-11 14:52:14 +0200 (Wed, 11 Nov 2009) | 37 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc
       M /branches/5.1/handler/ha_innodb.h

    branches/5.1:

    Merge a change from MySQL:
    (this has been reviewed by Calvin and Marko, and Calvin says Luis has
    incorporated Marko's suggestions)

      ------------------------------------------------------------
      revno: 3092.5.1
      committer: Luis Soares <luis.soares@sun.com>
      branch nick: mysql-5.1-bugteam
      timestamp: Thu 2009-09-24 15:52:52 +0100
      message:
        BUG#42829: binlogging enabled for all schemas regardless of
        binlog-db-db / binlog-ignore-db

        InnoDB will return an error if statement based replication is used
        along with transaction isolation level READ-COMMITTED (or weaker),
        even if the statement in question is filtered out according to the
        binlog-do-db rules set. In this case, an error should not be printed.

        This patch addresses this issue by extending the existing check in
        external_lock to take into account the filter rules before deciding to
        print an error. Furthermore, it also changes decide_logging_format to
        take into consideration whether the statement is filtered out from
        binlog before decision is made.
      added:
        mysql-test/suite/binlog/r/binlog_stm_do_db.result
        mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt
        mysql-test/suite/binlog/t/binlog_stm_do_db.test
      modified:
        sql/sql_base.cc
        sql/sql_class.cc
        storage/innobase/handler/ha_innodb.cc
        storage/innobase/handler/ha_innodb.h
        storage/innodb_plugin/handler/ha_innodb.cc
        storage/innodb_plugin/handler/ha_innodb.h

    ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r6161 | vasil | 2009-11-11 15:36:16 +0200 (Wed, 11 Nov 2009) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Add changelog entry for r6160.
  ------------------------------------------------------------------------
  r6162 | vasil | 2009-11-11 16:00:12 +0200 (Wed, 11 Nov 2009) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Add ChangeLog for r6157.
  ------------------------------------------------------------------------
  r6163 | calvin | 2009-11-11 17:53:20 +0200 (Wed, 11 Nov 2009) | 8 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc
     M /branches/zip/handler/ha_innodb.h

  branches/zip: Exclude thd_binlog_filter_ok() when building
  with older version of MySQL.

  thd_binlog_filter_ok() is introduced in MySQL 5.1.41. But the
  plugin can be built with MySQL prior to 5.1.41.

  Approved by Heikki (on IM).
  ------------------------------------------------------------------------
  r6169 | calvin | 2009-11-12 14:40:43 +0200 (Thu, 12 Nov 2009) | 6 lines
  Changed paths:
     A /branches/zip/mysql-test/innodb_bug46676.result
     A /branches/zip/mysql-test/innodb_bug46676.test

  branches/zip: add test case for bug#46676

  This crash is reproducible with InnoDB plugin 1.0.4 + MySQL 5.1.37.
  But no longer reproducible after MySQL 5.1.38 (with plugin 1.0.5).
  Add test case to catch future regression.
  ------------------------------------------------------------------------
  r6170 | marko | 2009-11-12 15:49:08 +0200 (Thu, 12 Nov 2009) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog
     M /branches/zip/handler/ha_innodb.cc
     M /branches/zip/include/db0err.h
     M /branches/zip/row/row0merge.c
     M /branches/zip/row/row0mysql.c

  branches/zip: Allow CREATE INDEX to be interrupted.  (Issue #354)

  rb://183 approved by Heikki Tuuri
  ------------------------------------------------------------------------
  r6175 | vasil | 2009-11-16 20:07:39 +0200 (Mon, 16 Nov 2009) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Wrap line at 78th char in the ChangeLog
  ------------------------------------------------------------------------
  r6177 | calvin | 2009-11-16 20:20:38 +0200 (Mon, 16 Nov 2009) | 2 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip: add an entry to ChangeLog for r6065
  ------------------------------------------------------------------------
  r6179 | marko | 2009-11-17 10:19:34 +0200 (Tue, 17 Nov 2009) | 2 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc

  branches/zip: ha_innobase::change_active_index(): When the history is
  missing, report it to the client, not to the error log.
  ------------------------------------------------------------------------
  r6181 | vasil | 2009-11-17 12:21:41 +0200 (Tue, 17 Nov 2009) | 33 lines
  Changed paths:
     M /branches/zip/mysql-test/innodb-index.test

  branches/zip:

  At the end of innodb-index.test: restore the environment as it was before
  the test was started to silence this warning:

    MTR's internal check of the test case 'main.innodb-index' failed.
    This means that the test case does not preserve the state that existed
    before the test case was executed.  Most likely the test case did not
    do a proper clean-up.
    This is the diff of the states of the servers before and after the
    test case was executed:
    mysqltest: Logging to '/tmp/autotest.sh-20091117_033000-zip.btyZwu/mysql-5.1/mysql-test/var/tmp/check-mysqld_1.log'.
    mysqltest: Results saved in '/tmp/autotest.sh-20091117_033000-zip.btyZwu/mysql-5.1/mysql-test/var/tmp/check-mysqld_1.result'.
    mysqltest: Connecting to server localhost:13000 (socket /tmp/autotest.sh-20091117_033000-zip.btyZwu/mysql-5.1/mysql-test/var/tmp/mysqld.1.sock) as 'root', connection 'default', attempt 0 ...
    mysqltest: ... Connected.
    mysqltest: Start processing test commands from './include/check-testcase.test' ...
    mysqltest: ... Done processing test commands.
    --- /tmp/autotest.sh-20091117_033000-zip.btyZwu/mysql-5.1/mysql-test/var/tmp/check-mysqld_1.result	2009-11-17 13:10:40.000000000 +0300
    +++ /tmp/autotest.sh-20091117_033000-zip.btyZwu/mysql-5.1/mysql-test/var/tmp/check-mysqld_1.reject	2009-11-17 13:10:54.000000000 +0300
    @@ -84,7 +84,7 @@
     INNODB_DOUBLEWRITE	ON
     INNODB_FAST_SHUTDOWN	1
     INNODB_FILE_FORMAT	Antelope
    -INNODB_FILE_FORMAT_CHECK	Antelope
    +INNODB_FILE_FORMAT_CHECK	Barracuda
     INNODB_FILE_PER_TABLE	OFF
     INNODB_FLUSH_LOG_AT_TRX_COMMIT	1
     INNODB_FLUSH_METHOD	

    mysqltest: Result content mismatch

    not ok
  ------------------------------------------------------------------------
  r6182 | marko | 2009-11-17 13:49:15 +0200 (Tue, 17 Nov 2009) | 1 line
  Changed paths:
     M /branches/zip/mysql-test/innodb-consistent-master.opt
     M /branches/zip/mysql-test/innodb-consistent.result
     M /branches/zip/mysql-test/innodb-consistent.test
     M /branches/zip/mysql-test/innodb-use-sys-malloc-master.opt
     M /branches/zip/mysql-test/innodb-use-sys-malloc.result
     M /branches/zip/mysql-test/innodb-use-sys-malloc.test
     M /branches/zip/mysql-test/innodb_bug21704.result
     M /branches/zip/mysql-test/innodb_bug21704.test
     M /branches/zip/mysql-test/innodb_bug40360.test
     M /branches/zip/mysql-test/innodb_bug40565.result
     M /branches/zip/mysql-test/innodb_bug40565.test
     M /branches/zip/mysql-test/innodb_bug41904.result
     M /branches/zip/mysql-test/innodb_bug41904.test
     M /branches/zip/mysql-test/innodb_bug42101-nonzero-master.opt
     M /branches/zip/mysql-test/innodb_bug42101-nonzero.result
     M /branches/zip/mysql-test/innodb_bug42101-nonzero.test
     M /branches/zip/mysql-test/innodb_bug42101.result
     M /branches/zip/mysql-test/innodb_bug42101.test
     M /branches/zip/mysql-test/innodb_bug44032.result
     M /branches/zip/mysql-test/innodb_bug44032.test
     M /branches/zip/mysql-test/innodb_bug44369.result
     M /branches/zip/mysql-test/innodb_bug44369.test
     M /branches/zip/mysql-test/innodb_bug44571.result
     M /branches/zip/mysql-test/innodb_bug44571.test
     M /branches/zip/mysql-test/innodb_bug45357.test
     M /branches/zip/mysql-test/innodb_bug46000.result
     M /branches/zip/mysql-test/innodb_bug46000.test
     M /branches/zip/mysql-test/innodb_bug46676.result
     M /branches/zip/mysql-test/innodb_bug46676.test
     M /branches/zip/mysql-test/innodb_bug47167.result
     M /branches/zip/mysql-test/innodb_bug47167.test
     M /branches/zip/mysql-test/innodb_bug47777.result
     M /branches/zip/mysql-test/innodb_bug47777.test
     M /branches/zip/mysql-test/innodb_file_format.result
     M /branches/zip/mysql-test/innodb_file_format.test

  branches/zip: Set svn:eol-style on mysql-test files.
  ------------------------------------------------------------------------
  r6183 | marko | 2009-11-17 13:51:16 +0200 (Tue, 17 Nov 2009) | 1 line
  Changed paths:
     M /branches/zip/mysql-test/innodb-consistent-master.opt
     M /branches/zip/mysql-test/innodb-master.opt
     M /branches/zip/mysql-test/innodb-semi-consistent-master.opt
     M /branches/zip/mysql-test/innodb-use-sys-malloc-master.opt
     M /branches/zip/mysql-test/innodb_bug42101-nonzero-master.opt

  branches/zip: Prepend loose_ to plugin-only mysql-test options.
  ------------------------------------------------------------------------
  r6184 | marko | 2009-11-17 13:52:01 +0200 (Tue, 17 Nov 2009) | 1 line
  Changed paths:
     M /branches/zip/mysql-test/innodb-index.result
     M /branches/zip/mysql-test/innodb-index.test

  branches/zip: innodb-index.test: Restore innodb_file_format_check.
  ------------------------------------------------------------------------
  r6185 | marko | 2009-11-17 16:44:20 +0200 (Tue, 17 Nov 2009) | 16 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc
     M /branches/zip/mysql-test/innodb.result
     M /branches/zip/mysql-test/innodb.test
     M /branches/zip/mysql-test/innodb_bug44369.result
     M /branches/zip/mysql-test/innodb_bug44369.test
     D /branches/zip/mysql-test/patches/innodb-index.diff
     M /branches/zip/row/row0mysql.c

  branches/zip: Report duplicate table names
  to the client connection, not to the error log.  This change will allow
  innodb-index.test to be re-enabled.  It was previously disabled, because
  mysql-test-run does not like output in the error log.

  row_create_table_for_mysql(): Do not output anything to the error log
  when reporting DB_DUPLICATE_KEY.  Let the caller report the error.
  Add a TODO comment that the dict_table_t object is apparently not freed
  when an error occurs.

  create_table_def(): Convert InnoDB table names to the character set
  of the client connection for reporting.  Use my_error(ER_WRONG_COLUMN_NAME)
  for reporting reserved column names.  Report my_error(ER_TABLE_EXISTS_ERROR)
  when row_create_table_for_mysql() returns DB_DUPLICATE_KEY.

  rb://206
  ------------------------------------------------------------------------
  r6186 | vasil | 2009-11-17 16:48:14 +0200 (Tue, 17 Nov 2009) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Add ChangeLog entry for r6185.
  ------------------------------------------------------------------------
  r6189 | marko | 2009-11-18 11:36:18 +0200 (Wed, 18 Nov 2009) | 5 lines
  Changed paths:
     M /branches/zip/ChangeLog
     M /branches/zip/handler/handler0alter.cc

  branches/zip: ha_innobase::add_index(): When creating the primary key
  and the table is being locked by another transaction,
  do not attempt to drop the table. (Bug #48782)

  Approved by Sunny Bains over IM
  ------------------------------------------------------------------------
  r6194 | vasil | 2009-11-19 09:24:45 +0200 (Thu, 19 Nov 2009) | 5 lines
  Changed paths:
     M /branches/zip/include/univ.i

  branches/zip:

  Increment version number from 1.0.5 to 1.0.6 since 1.0.5 was just released
  by MySQL and we will soon release 1.0.6.
  ------------------------------------------------------------------------
  r6197 | calvin | 2009-11-19 09:32:55 +0200 (Thu, 19 Nov 2009) | 6 lines
  Changed paths:
     M /branches/zip/CMakeLists.txt

  branches/zip: merge the fix of bug#48317 (CMake file)

  Due to MySQL changes to the CMake, it is no longer able
  to build InnoDB plugin as a static library on Windows.
  The fix is proposed by Vlad of MySQL.
  ------------------------------------------------------------------------
  r6198 | vasil | 2009-11-19 09:44:31 +0200 (Thu, 19 Nov 2009) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Add ChangeLog entry for r6197.
  ------------------------------------------------------------------------
  r6199 | vasil | 2009-11-19 12:10:12 +0200 (Thu, 19 Nov 2009) | 31 lines
  Changed paths:
     M /branches/zip/ChangeLog
     M /branches/zip/btr/btr0btr.c
     M /branches/zip/data/data0type.c

  branches/zip: Merge r6159:6198 from branches/5.1:

    ------------------------------------------------------------------------
    r6187 | jyang | 2009-11-18 05:27:30 +0200 (Wed, 18 Nov 2009) | 9 lines
    Changed paths:
       M /branches/5.1/btr/btr0btr.c

    branches/5.1: Fix bug #48469 "when innodb tablespace is
    configured too small, crash and corruption!". Function
    btr_create() did not check the return status of fseg_create(),
    and continue the index creation even there is no sufficient
    space.

    rb://205 Approved by Marko
    ------------------------------------------------------------------------
    r6188 | jyang | 2009-11-18 07:14:23 +0200 (Wed, 18 Nov 2009) | 8 lines
    Changed paths:
       M /branches/5.1/data/data0type.c

    branches/5.1: Fix bug #48526 "Data type for float and
    double is incorrectly reported in InnoDB table monitor".
    Certain datatypes are not printed correctly in
    dtype_print().

    rb://204 Approved by Marko.
    ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r6201 | marko | 2009-11-19 14:09:11 +0200 (Thu, 19 Nov 2009) | 2 lines
  Changed paths:
     M /branches/zip/handler/handler0alter.cc

  branches/zip: ha_innobase::add_index(): Clarify the comment
  on orphaned tables when creating a primary key.
  ------------------------------------------------------------------------
  r6202 | jyang | 2009-11-19 15:01:00 +0200 (Thu, 19 Nov 2009) | 8 lines
  Changed paths:
     M /branches/zip/btr/btr0btr.c

  branches/zip: Function fseg_free() is no longer defined
  in branches/zip. To port fix for bug #48469 to zip,
  we can use btr_free_root() which frees the page,
  and also does not require mini-transaction.

  Approved by Marko.
  ------------------------------------------------------------------------
  r6207 | vasil | 2009-11-20 10:19:14 +0200 (Fri, 20 Nov 2009) | 54 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc

  branches/zip: Merge r6198:6206 from branches/5.1:

  (r6203 was skipped as it is already in branches/zip)

    ------------------------------------------------------------------------
    r6200 | vasil | 2009-11-19 12:14:23 +0200 (Thu, 19 Nov 2009) | 4 lines
    Changed paths:
       M /branches/5.1/btr/btr0btr.c

    branches/5.1:

    White space fixup - indent under the opening (
    ------------------------------------------------------------------------
    r6203 | jyang | 2009-11-19 15:12:22 +0200 (Thu, 19 Nov 2009) | 8 lines
    Changed paths:
       M /branches/5.1/btr/btr0btr.c

    branches/5.1: Use btr_free_root() instead of fseg_free() for
    the fix of bug #48469, because fseg_free() is not defined
    in the zip branch. And we could save one mini-trasaction started
    by fseg_free().

    Approved by Marko.
    ------------------------------------------------------------------------
    r6205 | jyang | 2009-11-20 07:55:48 +0200 (Fri, 20 Nov 2009) | 11 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc

    branches/5.1: Add a special case to handle the Duplicated Key error
    and return DB_ERROR instead. This is to avoid a possible SIGSEGV
    by mysql error handling re-entering the storage layer for dup key
    info without proper table handle.
    This is to prevent a server crash when error situation in bug
    #45961 "DDL on partitioned innodb tables leaves data dictionary
    in an inconsistent state" happens.

    rb://157 approved by Sunny Bains.
    ------------------------------------------------------------------------
    r6206 | jyang | 2009-11-20 09:38:43 +0200 (Fri, 20 Nov 2009) | 5 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc

    branches/5.1: Fix a minor code formating issue for
    the parenthesis iplacement of the if condition in
    rename_table().
    ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r6208 | vasil | 2009-11-20 10:49:24 +0200 (Fri, 20 Nov 2009) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Add ChangeLog entry for c6207.
  ------------------------------------------------------------------------
  r6210 | vasil | 2009-11-20 23:39:48 +0200 (Fri, 20 Nov 2009) | 3 lines
  Changed paths:
     M /branches/zip/trx/trx0i_s.c

  branches/zip:

  Whitespace fixup.
  ------------------------------------------------------------------------
  r6248 | marko | 2009-11-30 12:19:50 +0200 (Mon, 30 Nov 2009) | 1 line
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip: ChangeLog: Document r4922 that was forgotten.
  ------------------------------------------------------------------------
  r6252 | marko | 2009-11-30 12:50:11 +0200 (Mon, 30 Nov 2009) | 23 lines
  Changed paths:
     M /branches/zip/ChangeLog
     M /branches/zip/dict/dict0boot.c
     M /branches/zip/dict/dict0crea.c
     M /branches/zip/dict/dict0load.c
     M /branches/zip/dict/dict0mem.c
     M /branches/zip/fil/fil0fil.c
     M /branches/zip/handler/ha_innodb.cc
     M /branches/zip/include/dict0mem.h
     M /branches/zip/row/row0mysql.c

  branches/zip: Suppress errors about non-found temporary tables.
  Write the is_temp flag to SYS_TABLES.MIX_LEN.

  dict_table_t:🎏 Add a flag for is_temporary, DICT_TF2_TEMPORARY.
  Unlike other flags, this will not be written to the tablespace flags
  or SYS_TABLES.TYPE, but only to SYS_TABLES.MIX_LEN.

  dict_build_table_def_step(): Only pass DICT_TF_BITS to tablespaces.

  dict_check_tablespaces_and_store_max_id(), dict_load_table():
  Suppress errors about temporary tables not being found.

  dict_create_sys_tables_tuple(): Write the DICT_TF2_TEMPORARY flag
  to SYS_TABLES.MIX_LEN.

  fil_space_create(), fil_create_new_single_table_tablespace(): Add assertions
  about space->flags.

  row_drop_table_for_mysql(): Do not complain about non-found temporary tables.

  rb://160 approved by Heikki Tuuri.  This addresses the second part of
  Bug #41609 Crash recovery does not work for InnoDB temporary tables.
  ------------------------------------------------------------------------
  r6263 | vasil | 2009-12-01 14:49:05 +0200 (Tue, 01 Dec 2009) | 4 lines
  Changed paths:
     M /branches/zip/include/univ.i

  branches/zip: Increment version number from 1.0.6 to 1.0.7

  1.0.6 has been released
  ------------------------------------------------------------------------
  r6264 | vasil | 2009-12-01 16:19:44 +0200 (Tue, 01 Dec 2009) | 1 line
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip: Add ChangeLog entry for the release of 1.0.6.
  ------------------------------------------------------------------------
  r6269 | marko | 2009-12-02 11:35:22 +0200 (Wed, 02 Dec 2009) | 2 lines
  Changed paths:
     M /branches/zip/srv/srv0start.c

  branches/zip: innobase_start_or_create_for_mysql(): UNIV_IBUF_DEBUG
  should not break crash recovery, but UNIV_IBUF_COUNT_DEBUG will.
  ------------------------------------------------------------------------
  r6270 | marko | 2009-12-02 11:36:47 +0200 (Wed, 02 Dec 2009) | 1 line
  Changed paths:
     M /branches/zip/srv/srv0start.c

  branches/zip: innobase_start_or_create_for_mysql(): Log the zlib version.
  ------------------------------------------------------------------------
  r6271 | marko | 2009-12-02 11:43:49 +0200 (Wed, 02 Dec 2009) | 2 lines
  Changed paths:
     M /branches/zip/ChangeLog
     M /branches/zip/Makefile.am
     M /branches/zip/include/univ.i
     M /branches/zip/plug.in

  branches/zip: ChangeLog: Document that since r6270, the zlib version number
  will be displayed at start-up.
  ------------------------------------------------------------------------
  r6272 | marko | 2009-12-02 11:46:05 +0200 (Wed, 02 Dec 2009) | 1 line
  Changed paths:
     M /branches/zip/Makefile.am
     M /branches/zip/include/univ.i
     M /branches/zip/plug.in

  branches/zip: Revert changes that were accidentally committed in r6271.
  ------------------------------------------------------------------------
  r6274 | marko | 2009-12-03 14:47:12 +0200 (Thu, 03 Dec 2009) | 6 lines
  Changed paths:
     M /branches/zip/dict/dict0dict.c

  branches/zip: dict_table_check_for_dup_indexes(): Assert that the
  data dictionary mutex is being held while table->indexes is accessed.
  This is already the case.

  Currently, only dict_table_get_next_index() and dict_table_get_first_index()
  are being invoked without holding dict_sys->mutex.
  ------------------------------------------------------------------------
  r6275 | pekka | 2009-12-03 18:32:47 +0200 (Thu, 03 Dec 2009) | 10 lines
  Changed paths:
     M /branches/zip/include/log0recv.h
     M /branches/zip/include/trx0sys.h
     M /branches/zip/log/log0recv.c
     M /branches/zip/trx/trx0sys.c

  branches/zip: Minor changes which allow build with UNIV_HOTBACKUP
  defined to succeed:

  include/trx0sys.h: Allow Hot Backup build to see some
                     TRX_SYS_DOUBLEWRITE_... macros.
  trx/trx0sys.c:     Exclude trx_sys_close() function from Hot Backup build.
  log/log0recv.[ch]: Exclude recv_sys_var_init() function from Hot Backup build.

  This change should not affect !UNIV_HOTBACKUP build.
  ------------------------------------------------------------------------
  r6277 | marko | 2009-12-08 11:13:36 +0200 (Tue, 08 Dec 2009) | 1 line
  Changed paths:
     M /branches/zip/fsp/fsp0fsp.c

  branches/zip: fsp0fsp.c: Add some missing in/out and const qualifiers.
  ------------------------------------------------------------------------
  r6285 | marko | 2009-12-09 09:24:50 +0200 (Wed, 09 Dec 2009) | 13 lines
  Changed paths:
     M /branches/zip/row/row0sel.c

  branches/zip: row_sel_fetch_columns(): Remove redundant code that was
  accidentally added in r1591, which introduced dfield_t::ext in order
  to make the merge sort of fast index creation support externally
  stored columns,

  Initially, I tried to allocate the bit for dfield_t::ext from
  dfield_t::len by making the length 31 bits and mapping UNIV_SQL_NULL
  to something that would fit in it.  Then I decided that it would be
  too risky.  The redundant check was part of the mapping.  The
  condition may have been dfield_is_null() initially.

  This redundant code was noticed by Sergey Petrunya on the MySQL
  internals list.
  ------------------------------------------------------------------------
  r6288 | marko | 2009-12-09 09:51:00 +0200 (Wed, 09 Dec 2009) | 15 lines
  Changed paths:
     M /branches/zip/row/row0upd.c

  branches/zip: row_upd_copy_columns(): Remove redundant code that was
  accidentally added in r1591, which introduced dfield_t::ext in order
  to make the merge sort of fast index creation support externally
  stored columns.

  Initially, I tried to allocate the bit for dfield_t::ext from
  dfield_t::len by making the length 31 bits and mapping UNIV_SQL_NULL
  to something that would fit in it.  Then I decided that it would be
  too risky.  The redundant check was part of the mapping.  The
  condition may have been dfield_is_null() initially.

  This is similar to the redundant code in row_sel_fetch_columns() that
  was noticed by Sergey Petrunya on the MySQL internals list and removed
  in r6285.  As far as I can tell, there are no redundant UNIV_SQL_NULL
  assignments remaining after this change.
  ------------------------------------------------------------------------
  r6305 | marko | 2009-12-14 13:03:57 +0200 (Mon, 14 Dec 2009) | 2 lines
  Changed paths:
     M /branches/zip/row/row0umod.c

  branches/zip: row_undo_mod_del_unmark_sec_and_undo_update(): Add a missing
  const qualifier.
  ------------------------------------------------------------------------
  r6309 | marko | 2009-12-15 14:05:50 +0200 (Tue, 15 Dec 2009) | 3 lines
  Changed paths:
     M /branches/zip/lock/lock0lock.c

  branches/zip: lock_rec_insert_check_and_lock(): Avoid casting away constness.
  Use page_rec_get_next_const() instead. This silences a gcc 4.2.4 warning.
  Reported by Sunny Bains.
  ------------------------------------------------------------------------
  r6312 | marko | 2009-12-16 10:10:36 +0200 (Wed, 16 Dec 2009) | 6 lines
  Changed paths:
     M /branches/zip/fil/fil0fil.c

  branches/zip: fil_close(): Add #ifndef UNIV_HOTBACKUP around a debug
  assertion on mutex.magic_n.  InnoDB Hot Backup is a single-threaded
  program and does not contain mutexes.  This change allows InnoDB Hot
  Backup to be compiled with UNIV_DEBUG.

  Suggested by Michael Izioumtchenko.
  ------------------------------------------------------------------------
  r6321 | marko | 2009-12-16 16:16:33 +0200 (Wed, 16 Dec 2009) | 4 lines
  Changed paths:
     M /branches/zip/row/row0merge.c

  branches/zip: row_merge_drop_temp_indexes(): Revert a hack to
  transaction isolation level that was made unnecessary by r5826 (Issue #337).
  When this function is called, any active data dictionary transaction
  should have been rolled back.
  ------------------------------------------------------------------------
  r6345 | marko | 2009-12-21 10:46:14 +0200 (Mon, 21 Dec 2009) | 7 lines
  Changed paths:
     M /branches/zip/log/log0recv.c

  branches/zip: recv_scan_log_recs(): Non-functional change: Replace a
  debug assertion ut_ad(len > 0) with ut_ad(len >= OS_FILE_LOG_BLOCK_SIZE).

  This change is only for readability, for Issue #428.  Another
  assertion on len being an integer multiple of OS_FILE_LOG_BLOCK_SIZE
  already ensured together with the old ut_ad(len > 0) that actually len
  must be at least OS_FILE_LOG_BLOCK_SIZE.
  ------------------------------------------------------------------------
  r6346 | marko | 2009-12-21 12:03:25 +0200 (Mon, 21 Dec 2009) | 2 lines
  Changed paths:
     M /branches/zip/log/log0recv.c

  branches/zip: recv_recovery_from_checkpoint_finish():
  Revert a change that was accidentally committed in r6345.
  ------------------------------------------------------------------------
  r6348 | marko | 2009-12-22 11:04:34 +0200 (Tue, 22 Dec 2009) | 37 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc
     M /branches/zip/include/ha_prototypes.h
     M /branches/zip/include/trx0trx.h
     M /branches/zip/lock/lock0lock.c
     M /branches/zip/trx/trx0i_s.c
     M /branches/zip/trx/trx0trx.c

  branches/zip: Merge a change from MySQL:
  ------------------------------------------------------------
  revno: 3236
  committer: Satya B <satya.bn@sun.com>
  branch nick: mysql-5.1-bugteam
  timestamp: Tue 2009-12-01 17:48:57 +0530
  message:
    merge to mysql-5.1-bugteam
      ------------------------------------------------------------
      revno: 3234.1.1
      committer: Gleb Shchepa <gshchepa@mysql.com>
      branch nick: mysql-5.1-bugteam
      timestamp: Tue 2009-12-01 14:38:40 +0400
      message:
        Bug #38883 (reopened): thd_security_context is not thread safe, crashes?

        manual merge 5.0-->5.1, updating InnoDB plugin.
      ------------------------------------------------------------
      revno: 1810.3968.13
      committer: Gleb Shchepa <gshchepa@mysql.com>
      branch nick: mysql-5.0-bugteam
      timestamp: Tue 2009-12-01 14:24:44 +0400
      message:
        Bug #38883 (reopened): thd_security_context is not thread safe, crashes?

        The bug 38816 changed the lock that protects THD::query from
        LOCK_thread_count to LOCK_thd_data, but didn't update the associated
        InnoDB functions.

        1. The innobase_mysql_prepare_print_arbitrary_thd and the
        innobase_mysql_end_print_arbitrary_thd InnoDB functions have been
        removed, since now we have a per-thread mutex: now we don't need to wrap
        several inter-thread access tries to THD::query with a single global
        LOCK_thread_count lock, so we can simplify the code.

        2. The innobase_mysql_print_thd function has been modified to lock
        LOCK_thd_data in direct way.
  ------------------------------------------------------------------------
  r6351 | marko | 2009-12-22 11:11:18 +0200 (Tue, 22 Dec 2009) | 1 line
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc

  branches/zip: Remove an obsolete declaration of LOCK_thread_count.
  ------------------------------------------------------------------------
  r6352 | marko | 2009-12-22 12:33:01 +0200 (Tue, 22 Dec 2009) | 104 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc
     M /branches/zip/include/lock0lock.h
     M /branches/zip/include/srv0srv.h
     M /branches/zip/lock/lock0lock.c
     M /branches/zip/log/log0log.c
     M /branches/zip/mysql-test/innodb-autoinc.result
     M /branches/zip/mysql-test/innodb-autoinc.test
     M /branches/zip/row/row0sel.c
     M /branches/zip/srv/srv0srv.c
     M /branches/zip/srv/srv0start.c

  branches/zip: Merge revisions 6206:6350 from branches/5.1,
  except r6347, r6349, r6350 which were committed separately
  to both branches, and r6310, which was backported from zip to 5.1.

    ------------------------------------------------------------------------
    r6206 | jyang | 2009-11-20 09:38:43 +0200 (Fri, 20 Nov 2009) | 3 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc

    branches/5.1: Non-functional change, fix formatting.
    ------------------------------------------------------------------------
    r6230 | sunny | 2009-11-24 23:52:43 +0200 (Tue, 24 Nov 2009) | 3 lines
    Changed paths:
       M /branches/5.1/mysql-test/innodb-autoinc.result

    branches/5.1: Fix autoinc failing test results.
    (this should be skipped when merging 5.1 into zip)
    ------------------------------------------------------------------------
    r6231 | sunny | 2009-11-25 10:26:27 +0200 (Wed, 25 Nov 2009) | 7 lines
    Changed paths:
       M /branches/5.1/mysql-test/innodb-autoinc.result
       M /branches/5.1/mysql-test/innodb-autoinc.test
       M /branches/5.1/row/row0sel.c

    branches/5.1: Fix BUG#49032 - auto_increment field does not initialize to last value in InnoDB Storage Engine.

    We use the appropriate function to read the column value for non-integer
    autoinc column types, namely float and double.

    rb://208. Approved by Marko.
    ------------------------------------------------------------------------
    r6232 | sunny | 2009-11-25 10:27:39 +0200 (Wed, 25 Nov 2009) | 2 lines
    Changed paths:
       M /branches/5.1/row/row0sel.c

    branches/5.1: This is an interim fix, fix white space errors.
    ------------------------------------------------------------------------
    r6233 | sunny | 2009-11-25 10:28:35 +0200 (Wed, 25 Nov 2009) | 2 lines
    Changed paths:
       M /branches/5.1/include/mach0data.h
       M /branches/5.1/include/mach0data.ic
       M /branches/5.1/mysql-test/innodb-autoinc.result
       M /branches/5.1/mysql-test/innodb-autoinc.test
       M /branches/5.1/row/row0sel.c

    branches/5.1: This is an interim fix, fix tests and make read float/double arg const.
    ------------------------------------------------------------------------
    r6234 | sunny | 2009-11-25 10:29:03 +0200 (Wed, 25 Nov 2009) | 2 lines
    Changed paths:
       M /branches/5.1/row/row0sel.c

    branches/5.1: This is an interim fix, fix whitepsace issues.
    ------------------------------------------------------------------------
    r6235 | sunny | 2009-11-26 01:14:42 +0200 (Thu, 26 Nov 2009) | 9 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc
       M /branches/5.1/mysql-test/innodb-autoinc.result
       M /branches/5.1/mysql-test/innodb-autoinc.test

    branches/5.1: Fix Bug#47720 - REPLACE INTO Autoincrement column with negative values.

    This bug is similiar to the negative autoinc filter patch from earlier,
    with the additional handling of filtering out the negative column values
    set explicitly by the user.

    rb://184
    Approved by Heikki.
    ------------------------------------------------------------------------
    r6242 | vasil | 2009-11-27 22:07:12 +0200 (Fri, 27 Nov 2009) | 4 lines
    Changed paths:
       M /branches/5.1/export.sh

    branches/5.1:

    Minor changes to support plugin snapshots.
    ------------------------------------------------------------------------
    r6306 | calvin | 2009-12-14 15:12:46 +0200 (Mon, 14 Dec 2009) | 5 lines
    Changed paths:
       M /branches/5.1/mysql-test/innodb-autoinc.result
       M /branches/5.1/mysql-test/innodb-autoinc.test

    branches/5.1: fix bug#49267: innodb-autoinc.test fails on windows
    because of different case mode

    There is no change to the InnoDB code, only to fix test case by
    changing "T1" to "t1".
    ------------------------------------------------------------------------
    r6324 | jyang | 2009-12-17 06:54:24 +0200 (Thu, 17 Dec 2009) | 8 lines
    Changed paths:
       M /branches/5.1/handler/ha_innodb.cc
       M /branches/5.1/include/lock0lock.h
       M /branches/5.1/include/srv0srv.h
       M /branches/5.1/lock/lock0lock.c
       M /branches/5.1/log/log0log.c
       M /branches/5.1/srv/srv0srv.c
       M /branches/5.1/srv/srv0start.c

    branches/5.1: Fix bug #47814 - Diagnostics are frequently not
    printed after a long lock wait in InnoDB. Separate out the
    lock wait timeout check thread from monitor information
    printing thread.

    rb://200 Approved by Marko.
    ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r6364 | marko | 2009-12-26 21:06:31 +0200 (Sat, 26 Dec 2009) | 4 lines
  Changed paths:
     M /branches/zip/ibuf/ibuf0ibuf.c

  branches/zip: ibuf_bitmap_get_map_page():
  Define a wrapper macro that passes __FILE__, __LINE__ of the caller
  to buf_page_get_gen().
  This will ease the diagnosis of the likes of Issue #135.
  ------------------------------------------------------------------------
pull/374/head
marko 16 years ago
parent
commit
e578585049
  1. 12
      CMakeLists.txt
  2. 101
      ChangeLog
  3. 11
      btr/btr0btr.c
  4. 16
      data/data0type.c
  5. 3
      dict/dict0boot.c
  6. 17
      dict/dict0crea.c
  7. 4
      dict/dict0dict.c
  8. 113
      dict/dict0load.c
  9. 2
      dict/dict0mem.c
  10. 11
      fil/fil0fil.c
  11. 32
      fsp/fsp0fsp.c
  12. 236
      handler/ha_innodb.cc
  13. 9
      handler/ha_innodb.h
  14. 13
      handler/handler0alter.cc
  15. 37
      ibuf/ibuf0ibuf.c
  16. 1
      include/db0err.h
  17. 24
      include/dict0mem.h
  18. 22
      include/ha_prototypes.h
  19. 11
      include/lock0lock.h
  20. 2
      include/log0recv.h
  21. 1
      include/os0file.h
  22. 24
      include/srv0srv.h
  23. 4
      include/trx0sys.h
  24. 4
      include/trx0trx.h
  25. 31
      lock/lock0lock.c
  26. 2
      log/log0log.c
  27. 4
      log/log0recv.c
  28. 78
      mysql-test/innodb-autoinc.result
  29. 49
      mysql-test/innodb-autoinc.test
  30. 2
      mysql-test/innodb-consistent-master.opt
  31. 116
      mysql-test/innodb-consistent.test
  32. 1
      mysql-test/innodb-index.result
  33. 10
      mysql-test/innodb-index.test
  34. 2
      mysql-test/innodb-master.opt
  35. 2
      mysql-test/innodb-semi-consistent-master.opt
  36. 3
      mysql-test/innodb-use-sys-malloc-master.opt
  37. 2
      mysql-test/innodb.result
  38. 2
      mysql-test/innodb.test
  39. 2
      mysql-test/innodb_bug42101-nonzero-master.opt
  40. 14
      mysql-test/innodb_bug44369.result
  41. 10
      mysql-test/innodb_bug44369.test
  42. 2
      mysql-test/innodb_file_format.result
  43. 62
      mysql-test/patches/innodb-index.diff
  44. 54
      os/os0file.c
  45. 34
      row/row0merge.c
  46. 39
      row/row0mysql.c
  47. 30
      row/row0sel.c
  48. 2
      row/row0umod.c
  49. 3
      row/row0upd.c
  50. 179
      srv/srv0srv.c
  51. 32
      srv/srv0start.c
  52. 7
      trx/trx0i_s.c
  53. 2
      trx/trx0sys.c
  54. 4
      trx/trx0trx.c

12
CMakeLists.txt

@ -83,12 +83,12 @@ SET(INNOBASE_SOURCES btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c
ADD_DEFINITIONS(-DHAVE_WINDOWS_ATOMICS -DIB_HAVE_PAUSE_INSTRUCTION)
IF (MYSQL_VERSION_ID GREATER "50137")
IF (WITH_INNOBASE_STORAGE_ENGINE)
MYSQL_STORAGE_ENGINE(INNOBASE)
ELSE (WITH_INNOBASE_STORAGE_ENGINE)
SET (INNODB_SOURCES ${INNOBASE_SOURCES})
MYSQL_STORAGE_ENGINE(INNODB)
ENDIF (WITH_INNOBASE_STORAGE_ENGINE)
MYSQL_STORAGE_ENGINE(INNOBASE)
# Use ha_innodb for plugin name, if plugin is built
GET_TARGET_PROPERTY(LIB_LOCATION ha_innobase LOCATION)
IF(LIB_LOCATION)
SET_TARGET_PROPERTIES(ha_innobase PROPERTIES OUTPUT_NAME ha_innodb)
ENDIF(LIB_LOCATION)
ELSE (MYSQL_VERSION_ID GREATER "50137")
IF (NOT SOURCE_SUBLIBS)
ADD_DEFINITIONS(-D_WIN32 -DMYSQL_SERVER)

101
ChangeLog

@ -1,4 +1,91 @@
2009-01-01 The InnoDB Team
2009-12-02 The InnoDB Team
* srv/srv0start.c: Display the zlib version number at startup.
InnoDB compressed tables use zlib, and the implementation depends
on the zlib function compressBound(), whose definition was slightly
changed in zlib version 1.2.3.1 in 2006. MySQL bundles zlib 1.2.3
from 2005, but some installations use a more recent zlib.
2009-11-30 The InnoDB Team
* dict/dict0crea.c, dict/dict0mem.c, dict/dict0load.c,
dict/dict0boot.c, fil/fil0fil.c, handler/ha_innodb.cc,
include/dict0mem.h, row/row0mysql.c:
Fix the bogus warning messages for non-existing temporary
tables that were reported in
Bug#41609 Crash recovery does not work for InnoDB temporary tables.
The actual crash recovery bug was corrected on 2009-04-29.
2009-11-27 The InnoDB Team
InnoDB Plugin 1.0.6 released
2009-11-20 The InnoDB Team
* handler/ha_innodb.cc:
Add a workaround to prevent a crash due to Bug#45961 DDL on
partitioned innodb tables leaves data dictionary in an inconsistent
state
2009-11-19 The InnoDB Team
* btr/btr0btr.c:
Fix Bug#48469 when innodb tablespace is configured too small, crash
and corruption!
2009-11-19 The InnoDB Team
* data/data0type.c:
Fix Bug#48526 Data type for float and double is incorrectly reported
in InnoDB table monitor
2009-11-19 The InnoDB Team
* CMakeLists.txt:
Fix Bug#48317 cannot build innodb as static library
2009-11-18 The InnoDB Team
* handler/handler0alter.cc:
Fix Bug#48782 On lock wait timeout, CREATE INDEX (creating primary key)
attempts DROP TABLE
2009-11-17 The InnoDB Team
* handler/ha_innodb.cc, mysql-test/innodb.result,
mysql-test/innodb.test, mysql-test/innodb_bug44369.result,
mysql-test/innodb_bug44369.test, mysql-test/patches/innodb-index.diff,
row/row0mysql.c:
Report duplicate table names to the client connection, not to the
error log.
2009-11-12 The InnoDB Team
* handler/ha_innodb.cc, include/db0err.h, row/row0merge.c,
row/row0mysql.c:
Allow CREATE INDEX to be interrupted.
Also, when CHECK TABLE is interrupted, report ER_QUERY_INTERRUPTED.
2009-11-11 The InnoDB Team
* handler/ha_innodb.cc, mysql-test/innodb_bug47167.result,
mysql-test/innodb_bug47167.test, mysql-test/innodb_file_format.result:
Fix Bug#47167 "set global innodb_file_format_check" cannot set value
by User-Defined Variable
2009-11-11 The InnoDB Team
* include/os0file.h, os/os0file.c:
Fix Bug#3139 Mysql crashes: 'windows error 995' after several selects
on a large DB
2009-11-04 The InnoDB Team
* handler/ha_innodb.cc:
Fix Bug#32430 'show innodb status' causes errors
Invalid (old?) table or database name in logs
2009-11-02 The InnoDB Team
* btr/btr0sea.c, buf/buf0buf.c, dict/dict0dict.c, fil/fil0fil.c,
ibuf/ibuf0ibuf.c, include/btr0sea.h, include/dict0dict.h,
@ -85,6 +172,12 @@
Fix Bug#47058 Failure to compile innodb_plugin on solaris 10u7 + spro
cc/CC 5.10
2009-10-13 The InnoDB Team
* buf/buf0flu.c:
Call fsync() on datafiles after a batch of pages is written to disk
even when skip_innodb_doublewrite is set.
2009-10-05 The InnoDB Team
* buf/buf0buf.c:
@ -464,6 +557,12 @@
Fix Bug#44320 InnoDB: missing DB_ROLL_PTR in Table Monitor COLUMNS
output
2009-04-29 The InnoDB Team
* fil/fil0fil.c, include/fil0fil.h, include/mtr0mtr.h,
log/log0recv.c:
Fix Bug#41609 Crash recovery does not work for InnoDB temporary tables
2009-04-23 The InnoDB Team
* row/row0mysql.c:

11
btr/btr0btr.c

@ -793,8 +793,15 @@ btr_create(
} else {
/* It is a non-ibuf tree: create a file segment for leaf
pages */
fseg_create(space, page_no,
PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr);
if (!fseg_create(space, page_no,
PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr)) {
/* Not enough space for new segment, free root
segment before return. */
btr_free_root(space, zip_size, page_no, mtr);
return(FIL_NULL);
}
/* The fseg create acquires a second latch on the page,
therefore we must declare it: */
buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW);

16
data/data0type.c

@ -237,6 +237,22 @@ dtype_print(
fputs("DATA_SYS", stderr);
break;
case DATA_FLOAT:
fputs("DATA_FLOAT", stderr);
break;
case DATA_DOUBLE:
fputs("DATA_DOUBLE", stderr);
break;
case DATA_DECIMAL:
fputs("DATA_DECIMAL", stderr);
break;
case DATA_VARMYSQL:
fputs("DATA_VARMYSQL", stderr);
break;
default:
fprintf(stderr, "type %lu", (ulong) mtype);
break;

3
dict/dict0boot.c

@ -274,6 +274,9 @@ dict_boot(void)
and (TYPE & DICT_TF_FORMAT_MASK) are nonzero and TYPE = table->flags */
dict_mem_table_add_col(table, heap, "TYPE", DATA_INT, 0, 4);
dict_mem_table_add_col(table, heap, "MIX_ID", DATA_BINARY, 0, 0);
/* MIX_LEN may contain additional table flags when
ROW_FORMAT!=REDUNDANT. Currently, these flags include
DICT_TF2_TEMPORARY. */
dict_mem_table_add_col(table, heap, "MIX_LEN", DATA_INT, 0, 4);
dict_mem_table_add_col(table, heap, "CLUSTER_NAME", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, heap, "SPACE", DATA_INT, 0, 4);

17
dict/dict0crea.c

@ -94,13 +94,13 @@ dict_create_sys_tables_tuple(
dfield = dtuple_get_nth_field(entry, 3);
ptr = mem_heap_alloc(heap, 4);
if (table->flags & ~DICT_TF_COMPACT) {
if (table->flags & (~DICT_TF_COMPACT & ~(~0 << DICT_TF_BITS))) {
ut_a(table->flags & DICT_TF_COMPACT);
ut_a(dict_table_get_format(table) >= DICT_TF_FORMAT_ZIP);
ut_a((table->flags & DICT_TF_ZSSIZE_MASK)
<= (DICT_TF_ZSSIZE_MAX << DICT_TF_ZSSIZE_SHIFT));
ut_a(!(table->flags & (~0 << DICT_TF_BITS)));
mach_write_to_4(ptr, table->flags);
ut_a(!(table->flags & (~0 << DICT_TF2_BITS)));
mach_write_to_4(ptr, table->flags & ~(~0 << DICT_TF_BITS));
} else {
mach_write_to_4(ptr, DICT_TABLE_ORDINARY);
}
@ -112,11 +112,12 @@ dict_create_sys_tables_tuple(
ptr = mem_heap_zalloc(heap, 8);
dfield_set_data(dfield, ptr, 8);
/* 7: MIX_LEN (obsolete) --------------------------*/
/* 7: MIX_LEN (additional flags) --------------------------*/
dfield = dtuple_get_nth_field(entry, 5);
ptr = mem_heap_zalloc(heap, 4);
ptr = mem_heap_alloc(heap, 4);
mach_write_to_4(ptr, table->flags >> DICT_TF2_SHIFT);
dfield_set_data(dfield, ptr, 4);
/* 8: CLUSTER_NAME ---------------------*/
@ -230,6 +231,7 @@ dict_build_table_def_step(
dict_table_t* table;
dtuple_t* row;
ulint error;
ulint flags;
const char* path_or_name;
ibool is_path;
mtr_t mtr;
@ -268,9 +270,10 @@ dict_build_table_def_step(
ut_ad(!dict_table_zip_size(table)
|| dict_table_get_format(table) >= DICT_TF_FORMAT_ZIP);
flags = table->flags & ~(~0 << DICT_TF_BITS);
error = fil_create_new_single_table_tablespace(
&space, path_or_name, is_path,
table->flags == DICT_TF_COMPACT ? 0 : table->flags,
flags == DICT_TF_COMPACT ? 0 : flags,
FIL_IBD_FILE_INITIAL_SIZE);
table->space = (unsigned int) space;
@ -286,7 +289,7 @@ dict_build_table_def_step(
mtr_commit(&mtr);
} else {
/* Create in the system tablespace: disallow new features */
table->flags &= DICT_TF_COMPACT;
table->flags &= (~0 << DICT_TF_BITS) | DICT_TF_COMPACT;
}
row = dict_create_sys_tables_tuple(table, node->heap);

4
dict/dict0dict.c

@ -1200,7 +1200,7 @@ dict_index_too_big_for_undo(
= TRX_UNDO_PAGE_HDR - TRX_UNDO_PAGE_HDR_SIZE
+ 2 /* next record pointer */
+ 1 /* type_cmpl */
+ 11 /* trx->undo_no */ - 11 /* table->id */
+ 11 /* trx->undo_no */ + 11 /* table->id */
+ 1 /* rec_get_info_bits() */
+ 11 /* DB_TRX_ID */
+ 11 /* DB_ROLL_PTR */
@ -4775,6 +4775,8 @@ dict_table_check_for_dup_indexes(
const dict_index_t* index1;
const dict_index_t* index2;
ut_ad(mutex_own(&dict_sys->mutex));
/* The primary index _must_ exist */
ut_a(UT_LIST_GET_LEN(table->indexes) > 0);

113
dict/dict0load.c

@ -390,15 +390,35 @@ loop:
mtr_commit(&mtr);
if (space_id != 0 && in_crash_recovery) {
if (space_id == 0) {
/* The system tablespace always exists. */
} else if (in_crash_recovery) {
/* Check that the tablespace (the .ibd file) really
exists; print a warning to the .err log if not */
fil_space_for_table_exists_in_mem(space_id, name,
FALSE, TRUE, TRUE);
}
exists; print a warning to the .err log if not.
Do not print warnings for temporary tables. */
ibool is_temp;
field = rec_get_nth_field_old(rec, 4, &len);
if (0x80000000UL & mach_read_from_4(field)) {
/* ROW_FORMAT=COMPACT: read the is_temp
flag from SYS_TABLES.MIX_LEN. */
field = rec_get_nth_field_old(rec, 7, &len);
is_temp = mach_read_from_4(field)
& DICT_TF2_TEMPORARY;
} else {
/* For tables created with old versions
of InnoDB, SYS_TABLES.MIX_LEN may contain
garbage. Such tables would always be
in ROW_FORMAT=REDUNDANT. Pretend that
all such tables are non-temporary. That is,
do not suppress error printouts about
temporary tables not being found. */
is_temp = FALSE;
}
if (space_id != 0 && !in_crash_recovery) {
fil_space_for_table_exists_in_mem(
space_id, name, is_temp, TRUE, !is_temp);
} else {
/* It is a normal database startup: create the space
object and check that the .ibd file exists. */
@ -894,43 +914,72 @@ err_exit:
(ulong) flags);
goto err_exit;
}
} else {
flags = 0;
}
if (fil_space_for_table_exists_in_mem(space, name, FALSE,
FALSE, FALSE)) {
/* Ok; (if we did a crash recovery then the tablespace
can already be in the memory cache) */
} else {
/* In >= 4.1.9, InnoDB scans the data dictionary also
at a normal mysqld startup. It is an error if the
space object does not exist in memory. */
ut_a(name_of_col_is(sys_tables, sys_index, 4, "N_COLS"));
field = rec_get_nth_field_old(rec, 4, &len);
n_cols = mach_read_from_4(field);
/* The high-order bit of N_COLS is the "compact format" flag.
For tables in that format, MIX_LEN may hold additional flags. */
if (n_cols & 0x80000000UL) {
ulint flags2;
flags |= DICT_TF_COMPACT;
ut_a(name_of_col_is(sys_tables, sys_index, 7, "MIX_LEN"));
field = rec_get_nth_field_old(rec, 7, &len);
flags2 = mach_read_from_4(field);
if (flags2 & (~0 << (DICT_TF2_BITS - DICT_TF2_SHIFT))) {
ut_print_timestamp(stderr);
fputs(" InnoDB: Warning: table ", stderr);
ut_print_filename(stderr, name);
fprintf(stderr, "\n"
"InnoDB: in InnoDB data dictionary"
" has unknown flags %lx.\n",
(ulong) flags2);
flags2 &= ~(~0 << (DICT_TF2_BITS - DICT_TF2_SHIFT));
}
flags |= flags2 << DICT_TF2_SHIFT;
}
/* See if the tablespace is available. */
if (space == 0) {
/* The system tablespace is always available. */
} else if (!fil_space_for_table_exists_in_mem(
space, name,
(flags >> DICT_TF2_SHIFT) & DICT_TF2_TEMPORARY,
FALSE, FALSE)) {
if ((flags >> DICT_TF2_SHIFT) & DICT_TF2_TEMPORARY) {
/* Do not bother to retry opening temporary tables. */
ibd_file_missing = TRUE;
} else {
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: error: space object of table %s,\n"
" InnoDB: error: space object of table");
ut_print_filename(stderr, name);
fprintf(stderr, ",\n"
"InnoDB: space id %lu did not exist in memory."
" Retrying an open.\n",
name, (ulong)space);
(ulong) space);
/* Try to open the tablespace */
if (!fil_open_single_table_tablespace(
TRUE, space, flags, name)) {
/* We failed to find a sensible tablespace
file */
TRUE, space,
flags & ~(~0 << DICT_TF_BITS), name)) {
/* We failed to find a sensible
tablespace file */
ibd_file_missing = TRUE;
}
}
} else {
flags = 0;
}
ut_a(name_of_col_is(sys_tables, sys_index, 4, "N_COLS"));
field = rec_get_nth_field_old(rec, 4, &len);
n_cols = mach_read_from_4(field);
/* The high-order bit of N_COLS is the "compact format" flag. */
if (n_cols & 0x80000000UL) {
flags |= DICT_TF_COMPACT;
}
table = dict_mem_table_create(name, space, n_cols & ~0x80000000UL,

2
dict/dict0mem.c

@ -59,7 +59,7 @@ dict_mem_table_create(
mem_heap_t* heap;
ut_ad(name);
ut_a(!(flags & (~0 << DICT_TF_BITS)));
ut_a(!(flags & (~0 << DICT_TF2_BITS)));
heap = mem_heap_create(DICT_HEAP_SIZE);

11
fil/fil0fil.c

@ -1101,6 +1101,7 @@ fil_space_create(
ROW_FORMAT=REDUNDANT (table->flags == 0). For any other
format, the tablespace flags should equal table->flags. */
ut_a(flags != DICT_TF_COMPACT);
ut_a(!(flags & (~0UL << DICT_TF_BITS)));
try_again:
/*printf(
@ -2586,6 +2587,7 @@ fil_create_new_single_table_tablespace(
ROW_FORMAT=REDUNDANT (table->flags == 0). For any other
format, the tablespace flags should equal table->flags. */
ut_a(flags != DICT_TF_COMPACT);
ut_a(!(flags & (~0UL << DICT_TF_BITS)));
path = fil_make_ibd_name(tablename, is_temp);
@ -2958,8 +2960,10 @@ fil_open_single_table_tablespace(
/* The tablespace flags (FSP_SPACE_FLAGS) should be 0 for
ROW_FORMAT=COMPACT (table->flags == DICT_TF_COMPACT) and
ROW_FORMAT=REDUNDANT (table->flags == 0). For any other
format, the tablespace flags should equal table->flags. */
format, the tablespace flags should be equal to
table->flags & ~(~0 << DICT_TF_BITS). */
ut_a(flags != DICT_TF_COMPACT);
ut_a(!(flags & (~0UL << DICT_TF_BITS)));
file = os_file_create_simple_no_error_handling(
filepath, OS_FILE_OPEN, OS_FILE_READ_ONLY, &success);
@ -3011,7 +3015,8 @@ fil_open_single_table_tablespace(
ut_free(buf2);
if (UNIV_UNLIKELY(space_id != id || space_flags != flags)) {
if (UNIV_UNLIKELY(space_id != id
|| space_flags != (flags & ~(~0 << DICT_TF_BITS)))) {
ut_print_timestamp(stderr);
fputs(" InnoDB: Error: tablespace id and flags in file ",
@ -4784,8 +4789,10 @@ void
fil_close(void)
/*===========*/
{
#ifndef UNIV_HOTBACKUP
/* The mutex should already have been freed. */
ut_ad(fil_system->mutex.magic_n == 0);
#endif /* !UNIV_HOTBACKUP */
hash_table_free(fil_system->spaces);

32
fsp/fsp0fsp.c

@ -386,11 +386,11 @@ UNIV_INLINE
ibool
xdes_get_bit(
/*=========*/
xdes_t* descr, /*!< in: descriptor */
ulint bit, /*!< in: XDES_FREE_BIT or XDES_CLEAN_BIT */
ulint offset, /*!< in: page offset within extent:
0 ... FSP_EXTENT_SIZE - 1 */
mtr_t* mtr) /*!< in: mtr */
const xdes_t* descr, /*!< in: descriptor */
ulint bit, /*!< in: XDES_FREE_BIT or XDES_CLEAN_BIT */
ulint offset, /*!< in: page offset within extent:
0 ... FSP_EXTENT_SIZE - 1 */
mtr_t* mtr) /*!< in: mtr */
{
ulint index;
ulint byte_index;
@ -527,8 +527,8 @@ UNIV_INLINE
ulint
xdes_get_n_used(
/*============*/
xdes_t* descr, /*!< in: descriptor */
mtr_t* mtr) /*!< in: mtr */
const xdes_t* descr, /*!< in: descriptor */
mtr_t* mtr) /*!< in: mtr */
{
ulint i;
ulint count = 0;
@ -551,8 +551,8 @@ UNIV_INLINE
ibool
xdes_is_free(
/*=========*/
xdes_t* descr, /*!< in: descriptor */
mtr_t* mtr) /*!< in: mtr */
const xdes_t* descr, /*!< in: descriptor */
mtr_t* mtr) /*!< in: mtr */
{
if (0 == xdes_get_n_used(descr, mtr)) {
@ -569,8 +569,8 @@ UNIV_INLINE
ibool
xdes_is_full(
/*=========*/
xdes_t* descr, /*!< in: descriptor */
mtr_t* mtr) /*!< in: mtr */
const xdes_t* descr, /*!< in: descriptor */
mtr_t* mtr) /*!< in: mtr */
{
if (FSP_EXTENT_SIZE == xdes_get_n_used(descr, mtr)) {
@ -586,7 +586,7 @@ UNIV_INLINE
void
xdes_set_state(
/*===========*/
xdes_t* descr, /*!< in: descriptor */
xdes_t* descr, /*!< in/out: descriptor */
ulint state, /*!< in: state to set */
mtr_t* mtr) /*!< in: mtr handle */
{
@ -605,8 +605,8 @@ UNIV_INLINE
ulint
xdes_get_state(
/*===========*/
xdes_t* descr, /*!< in: descriptor */
mtr_t* mtr) /*!< in: mtr handle */
const xdes_t* descr, /*!< in: descriptor */
mtr_t* mtr) /*!< in: mtr handle */
{
ulint state;
@ -705,7 +705,7 @@ UNIV_INLINE
xdes_t*
xdes_get_descriptor_with_space_hdr(
/*===============================*/
fsp_header_t* sp_header,/*!< in: space header, x-latched */
fsp_header_t* sp_header,/*!< in/out: space header, x-latched */
ulint space, /*!< in: space id */
ulint offset, /*!< in: page offset;
if equal to the free limit,
@ -1342,7 +1342,7 @@ fsp_fill_free_list(
descriptor page and ibuf bitmap page;
then we do not allocate more extents */
ulint space, /*!< in: space */
fsp_header_t* header, /*!< in: space header */
fsp_header_t* header, /*!< in/out: space header */
mtr_t* mtr) /*!< in: mtr */
{
ulint limit;

236
handler/ha_innodb.cc

@ -110,9 +110,6 @@ extern "C" {
# ifndef MYSQL_PLUGIN_IMPORT
# define MYSQL_PLUGIN_IMPORT /* nothing */
# endif /* MYSQL_PLUGIN_IMPORT */
/* This is needed because of Bug #3596. Let us hope that pthread_mutex_t
is defined the same in both builds: the MySQL server and the InnoDB plugin. */
extern MYSQL_PLUGIN_IMPORT pthread_mutex_t LOCK_thread_count;
#if MYSQL_VERSION_ID < 50124
/* this is defined in mysql_priv.h inside #ifdef MYSQL_SERVER
@ -273,10 +270,10 @@ innobase_file_format_check_on_off(
/************************************************************//**
Validate the file format check config parameters, as a side effect it
sets the srv_check_file_format_at_startup variable.
@return true if valid config value */
@return the format_id if valid config value, otherwise, return -1 */
static
bool
innobase_file_format_check_validate(
int
innobase_file_format_validate_and_set(
/*================================*/
const char* format_check); /*!< in: parameter value */
/****************************************************************//**
@ -789,11 +786,20 @@ convert_error_code_to_mysql(
case DB_SUCCESS:
return(0);
case DB_INTERRUPTED:
my_error(ER_QUERY_INTERRUPTED, MYF(0));
/* fall through */
case DB_ERROR:
default:
return(-1); /* unspecified error */
case DB_DUPLICATE_KEY:
/* Be cautious with returning this error, since
mysql could re-enter the storage layer to get
duplicated key info, the operation requires a
valid table handle and/or transaction information,
which might not always be available in the error
handling stage. */
return(HA_ERR_FOUND_DUPP_KEY);
case DB_FOREIGN_DUPLICATE_KEY:
@ -893,36 +899,6 @@ convert_error_code_to_mysql(
}
}
/*************************************************************//**
If you want to print a thd that is not associated with the current thread,
you must call this function before reserving the InnoDB kernel_mutex, to
protect MySQL from setting thd->query NULL. If you print a thd of the current
thread, we know that MySQL cannot modify thd->query, and it is not necessary
to call this. Call innobase_mysql_end_print_arbitrary_thd() after you release
the kernel_mutex. */
extern "C" UNIV_INTERN
void
innobase_mysql_prepare_print_arbitrary_thd(void)
/*============================================*/
{
ut_ad(!mutex_own(&kernel_mutex));
VOID(pthread_mutex_lock(&LOCK_thread_count));
}
/*************************************************************//**
Releases the mutex reserved by innobase_mysql_prepare_print_arbitrary_thd().
In the InnoDB latching order, the mutex sits right above the
kernel_mutex. In debug builds, we assert that the kernel_mutex is
released before this function is invoked. */
extern "C" UNIV_INTERN
void
innobase_mysql_end_print_arbitrary_thd(void)
/*========================================*/
{
ut_ad(!mutex_own(&kernel_mutex));
VOID(pthread_mutex_unlock(&LOCK_thread_count));
}
/*************************************************************//**
Prints info of a THD object (== user session thread) to the given file. */
extern "C" UNIV_INTERN
@ -1711,15 +1687,19 @@ innobase_convert_identifier(
FALSE=id is an UTF-8 string */
{
char nz[NAME_LEN + 1];
#if MYSQL_VERSION_ID >= 50141
char nz2[NAME_LEN + 1 + EXPLAIN_FILENAME_MAX_EXTRA_LENGTH];
#else /* MYSQL_VERSION_ID >= 50141 */
char nz2[NAME_LEN + 1 + sizeof srv_mysql50_table_name_prefix];
#endif /* MYSQL_VERSION_ID >= 50141 */
const char* s = id;
int q;
if (file_id) {
/* Decode the table name. The filename_to_tablename()
function expects a NUL-terminated string. The input and
output strings buffers must not be shared. */
/* Decode the table name. The MySQL function expects
a NUL-terminated string. The input and output strings
buffers must not be shared. */
if (UNIV_UNLIKELY(idlen > (sizeof nz) - 1)) {
idlen = (sizeof nz) - 1;
@ -1729,7 +1709,13 @@ innobase_convert_identifier(
nz[idlen] = 0;
s = nz2;
#if MYSQL_VERSION_ID >= 50141
idlen = explain_filename((THD*) thd, nz, nz2, sizeof nz2,
EXPLAIN_PARTITIONS_AS_COMMENT);
goto no_quote;
#else /* MYSQL_VERSION_ID >= 50141 */
idlen = filename_to_tablename(nz, nz2, sizeof nz2);
#endif /* MYSQL_VERSION_ID >= 50141 */
}
/* See if the identifier needs to be quoted. */
@ -1740,6 +1726,9 @@ innobase_convert_identifier(
}
if (q == EOF) {
#if MYSQL_VERSION_ID >= 50141
no_quote:
#endif /* MYSQL_VERSION_ID >= 50141 */
if (UNIV_UNLIKELY(idlen > buflen)) {
idlen = buflen;
}
@ -2137,8 +2126,8 @@ mem_free_and_error:
/* Did the user specify a format name that we support ?
As a side effect it will update the variable
srv_check_file_format_at_startup */
if (!innobase_file_format_check_validate(
innobase_file_format_check)) {
if (innobase_file_format_validate_and_set(
innobase_file_format_check) < 0) {
sql_print_error("InnoDB: invalid "
"innodb_file_format_check value: "
@ -4478,24 +4467,29 @@ no_commit:
update the table upper limit. Note: last_value
will be 0 if get_auto_increment() was not called.*/
if (auto_inc <= col_max_value
&& auto_inc >= prebuilt->autoinc_last_value) {
if (auto_inc >= prebuilt->autoinc_last_value) {
set_max_autoinc:
ut_a(prebuilt->autoinc_increment > 0);
/* This should filter out the negative
values set explicitly by the user. */
if (auto_inc <= col_max_value) {
ut_a(prebuilt->autoinc_increment > 0);
ulonglong need;
ulonglong offset;
ulonglong need;
ulonglong offset;
offset = prebuilt->autoinc_offset;
need = prebuilt->autoinc_increment;
offset = prebuilt->autoinc_offset;
need = prebuilt->autoinc_increment;
auto_inc = innobase_next_autoinc(
auto_inc, need, offset, col_max_value);
auto_inc = innobase_next_autoinc(
auto_inc,
need, offset, col_max_value);
err = innobase_set_max_autoinc(auto_inc);
err = innobase_set_max_autoinc(
auto_inc);
if (err != DB_SUCCESS) {
error = err;
if (err != DB_SUCCESS) {
error = err;
}
}
}
break;
@ -5229,8 +5223,10 @@ ha_innobase::change_active_index(
prebuilt->index);
if (UNIV_UNLIKELY(!prebuilt->index_usable)) {
sql_print_warning("InnoDB: insufficient history for index %u",
keynr);
push_warning_printf(user_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
HA_ERR_TABLE_DEF_CHANGED,
"InnoDB: insufficient history for index %u",
keynr);
/* The caller seems to ignore this. Thus, we must check
this again in row_search_for_mysql(). */
DBUG_RETURN(2);
@ -5717,17 +5713,8 @@ create_table_def(
/* First check whether the column to be added has a
system reserved name. */
if (dict_col_name_is_reserved(field->field_name)){
push_warning_printf(
(THD*) trx->mysql_thd,
MYSQL_ERROR::WARN_LEVEL_WARN,
ER_CANT_CREATE_TABLE,
"Error creating table '%s' with "
"column name '%s'. '%s' is a "
"reserved name. Please try to "
"re-create the table with a "
"different column name.",
table->name, (char*) field->field_name,
(char*) field->field_name);
my_error(ER_WRONG_COLUMN_NAME, MYF(0),
field->field_name);
dict_mem_table_free(table);
trx_commit_for_mysql(trx);
@ -5749,6 +5736,14 @@ create_table_def(
error = row_create_table_for_mysql(table, trx);
if (error == DB_DUPLICATE_KEY) {
char buf[100];
innobase_convert_identifier(buf, sizeof buf,
table_name, strlen(table_name),
trx->mysql_thd, TRUE);
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), buf);
}
error_ret:
error = convert_error_code_to_mysql(error, flags, NULL);
@ -6347,6 +6342,10 @@ ha_innobase::create(
goto cleanup;
}
if (create_info->options & HA_LEX_CREATE_TMP_TABLE) {
flags |= DICT_TF2_TEMPORARY << DICT_TF2_SHIFT;
}
error = create_table_def(trx, form, norm_name,
create_info->options & HA_LEX_CREATE_TMP_TABLE ? name2 : NULL,
flags);
@ -6802,6 +6801,24 @@ ha_innobase::rename_table(
innobase_commit_low(trx);
trx_free_for_mysql(trx);
/* Add a special case to handle the Duplicated Key error
and return DB_ERROR instead.
This is to avoid a possible SIGSEGV error from mysql error
handling code. Currently, mysql handles the Duplicated Key
error by re-entering the storage layer and getting dup key
info by calling get_dup_key(). This operation requires a valid
table handle ('row_prebuilt_t' structure) which could no
longer be available in the error handling stage. The suggested
solution is to report a 'table exists' error message (since
the dup key error here is due to an existing table whose name
is the one we are trying to rename to) and return the generic
error code. */
if (error == (int) DB_DUPLICATE_KEY) {
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), to);
error = DB_ERROR;
}
error = convert_error_code_to_mysql(error, 0, NULL);
DBUG_RETURN(error);
@ -7352,11 +7369,15 @@ ha_innobase::check(
ret = row_check_table_for_mysql(prebuilt);
if (ret == DB_SUCCESS) {
switch (ret) {
case DB_SUCCESS:
return(HA_ADMIN_OK);
case DB_INTERRUPTED:
my_error(ER_QUERY_INTERRUPTED, MYF(0));
return(-1);
default:
return(HA_ADMIN_CORRUPT);
}
return(HA_ADMIN_CORRUPT);
}
/*************************************************************//**
@ -7901,8 +7922,12 @@ ha_innobase::external_lock(
{
ulong const binlog_format= thd_binlog_format(thd);
ulong const tx_isolation = thd_tx_isolation(ha_thd());
if (tx_isolation <= ISO_READ_COMMITTED &&
binlog_format == BINLOG_FORMAT_STMT)
if (tx_isolation <= ISO_READ_COMMITTED
&& binlog_format == BINLOG_FORMAT_STMT
#if MYSQL_VERSION_ID > 50140
&& thd_binlog_filter_ok(thd)
#endif /* MYSQL_VERSION_ID > 50140 */
)
{
char buf[256];
my_snprintf(buf, sizeof(buf),
@ -8175,8 +8200,8 @@ innodb_show_status(
mutex_enter(&srv_monitor_file_mutex);
rewind(srv_monitor_file);
srv_printf_innodb_monitor(srv_monitor_file,
&trx_list_start, &trx_list_end);
srv_printf_innodb_monitor(srv_monitor_file, FALSE,
&trx_list_start, &trx_list_end);
flen = ftell(srv_monitor_file);
os_file_set_eof(srv_monitor_file);
@ -9151,8 +9176,7 @@ innobase_xa_prepare(
executing XA PREPARE and XA COMMIT commands.
In this case we cannot know how many minutes or hours
will be between XA PREPARE and XA COMMIT, and we don't want
to block for undefined period of time.
*/
to block for undefined period of time. */
pthread_mutex_lock(&prepare_commit_mutex);
trx->active_trans = 2;
}
@ -9494,25 +9518,24 @@ innobase_file_format_check_on_off(
/************************************************************//**
Validate the file format check config parameters, as a side effect it
sets the srv_check_file_format_at_startup variable.
@return true if valid config value */
@return the format_id if valid config value, otherwise, return -1 */
static
bool
innobase_file_format_check_validate(
int
innobase_file_format_validate_and_set(
/*================================*/
const char* format_check) /*!< in: parameter value */
{
uint format_id;
bool ret = true;
format_id = innobase_file_format_name_lookup(format_check);
if (format_id < DICT_TF_FORMAT_MAX + 1) {
srv_check_file_format_at_startup = format_id;
return((int) format_id);
} else {
ret = false;
return(-1);
}
return(ret);
}
/*************************************************************//**
@ -9547,7 +9570,11 @@ innodb_file_format_name_validate(
if (format_id <= DICT_TF_FORMAT_MAX) {
*static_cast<const char**>(save) = file_format_input;
/* Save a pointer to the name in the
'file_format_name_map' constant array. */
*static_cast<const char**>(save) =
trx_sys_file_format_id_to_name(format_id);
return(0);
}
}
@ -9610,6 +9637,7 @@ innodb_file_format_check_validate(
const char* file_format_input;
char buff[STRING_BUFFER_USUAL_SIZE];
int len = sizeof(buff);
int format_id;
ut_a(save != NULL);
ut_a(value != NULL);
@ -9622,24 +9650,35 @@ innodb_file_format_check_validate(
message if they did so. */
if (innobase_file_format_check_on_off(file_format_input)) {
sql_print_warning(
push_warning_printf(thd,
MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WRONG_ARGUMENTS,
"InnoDB: invalid innodb_file_format_check "
"value; on/off can only be set at startup or "
"in the configuration file");
} else if (innobase_file_format_check_validate(
file_format_input)) {
} else {
format_id = innobase_file_format_validate_and_set(
file_format_input);
*static_cast<const char**>(save) = file_format_input;
if (format_id >= 0) {
/* Save a pointer to the name in the
'file_format_name_map' constant array. */
*static_cast<const char**>(save) =
trx_sys_file_format_id_to_name(
(uint)format_id);
return(0);
return(0);
} else {
sql_print_warning(
"InnoDB: invalid innodb_file_format_check "
"value; can be any format up to %s "
"or its equivalent numeric id",
trx_sys_file_format_id_to_name(
DICT_TF_FORMAT_MAX));
} else {
push_warning_printf(thd,
MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WRONG_ARGUMENTS,
"InnoDB: invalid innodb_file_format_check "
"value; can be any format up to %s "
"or its equivalent numeric id",
trx_sys_file_format_id_to_name(
DICT_TF_FORMAT_MAX));
}
}
}
@ -9909,12 +9948,15 @@ static MYSQL_SYSVAR_STR(file_format, innobase_file_format_name,
innodb_file_format_name_validate,
innodb_file_format_name_update, "Antelope");
/* If a new file format is introduced, the file format
name needs to be updated accordingly. Please refer to
file_format_name_map[] defined in trx0sys.c for the next
file format name. */
static MYSQL_SYSVAR_STR(file_format_check, innobase_file_format_check,
PLUGIN_VAR_OPCMDARG,
"The highest file format in the tablespace.",
innodb_file_format_check_validate,
innodb_file_format_check_update,
"on");
innodb_file_format_check_update, "Barracuda");
static MYSQL_SYSVAR_ULONG(flush_log_at_trx_commit, srv_flush_log_at_trx_commit,
PLUGIN_VAR_OPCMDARG,

9
handler/ha_innodb.h

@ -257,6 +257,15 @@ int thd_binlog_format(const MYSQL_THD thd);
@param all TRUE <=> rollback main transaction.
*/
void thd_mark_transaction_to_rollback(MYSQL_THD thd, bool all);
#if MYSQL_VERSION_ID > 50140
/**
Check if binary logging is filtered for thread's current db.
@param thd Thread handle
@retval 1 the query is not filtered, 0 otherwise.
*/
bool thd_binlog_filter_ok(const MYSQL_THD thd);
#endif /* MYSQL_VERSION_ID > 50140 */
}
typedef struct trx_struct trx_t;

13
handler/handler0alter.cc

@ -765,10 +765,11 @@ err_exit:
ut_ad(error == DB_SUCCESS);
/* Commit the data dictionary transaction in order to release
the table locks on the system tables. Unfortunately, this
means that if MySQL crashes while creating a new primary key
inside row_merge_build_indexes(), indexed_table will not be
dropped on crash recovery. Thus, it will become orphaned. */
the table locks on the system tables. This means that if
MySQL crashes while creating a new primary key inside
row_merge_build_indexes(), indexed_table will not be dropped
by trx_rollback_active(). It will have to be recovered or
dropped by the database administrator. */
trx_commit_for_mysql(trx);
row_mysql_unlock_data_dictionary(trx);
@ -882,7 +883,9 @@ error:
/* fall through */
default:
if (new_primary) {
row_merge_drop_table(trx, indexed_table);
if (indexed_table != innodb_table) {
row_merge_drop_table(trx, indexed_table);
}
} else {
if (!dict_locked) {
row_mysql_lock_data_dictionary(trx);

37
ibuf/ibuf0ibuf.c

@ -777,24 +777,41 @@ page containing the descriptor bits for the file page; the bitmap page
is x-latched */
static
page_t*
ibuf_bitmap_get_map_page(
/*=====================*/
ulint space, /*!< in: space id of the file page */
ulint page_no,/*!< in: page number of the file page */
ulint zip_size,/*!< in: compressed page size in bytes;
0 for uncompressed pages */
mtr_t* mtr) /*!< in: mtr */
ibuf_bitmap_get_map_page_func(
/*==========================*/
ulint space, /*!< in: space id of the file page */
ulint page_no,/*!< in: page number of the file page */
ulint zip_size,/*!< in: compressed page size in bytes;
0 for uncompressed pages */
const char* file, /*!< in: file name */
ulint line, /*!< in: line where called */
mtr_t* mtr) /*!< in: mtr */
{
buf_block_t* block;
block = buf_page_get(space, zip_size,
ibuf_bitmap_page_no_calc(zip_size, page_no),
RW_X_LATCH, mtr);
block = buf_page_get_gen(space, zip_size,
ibuf_bitmap_page_no_calc(zip_size, page_no),
RW_X_LATCH, NULL, BUF_GET,
file, line, mtr);
buf_block_dbg_add_level(block, SYNC_IBUF_BITMAP);
return(buf_block_get_frame(block));
}
/********************************************************************//**
Gets the ibuf bitmap page where the bits describing a given file page are
stored.
@return bitmap page where the file page is mapped, that is, the bitmap
page containing the descriptor bits for the file page; the bitmap page
is x-latched
@param space in: space id of the file page
@param page_no in: page number of the file page
@param zip_size in: compressed page size in bytes; 0 for uncompressed pages
@param mtr in: mini-transaction */
#define ibuf_bitmap_get_map_page(space, page_no, zip_size, mtr) \
ibuf_bitmap_get_map_page_func(space, page_no, zip_size, \
__FILE__, __LINE__, mtr)
/************************************************************************//**
Sets the free bits of the page in the ibuf bitmap. This is done in a separate
mini-transaction, hence this operation does not restrict further work to only

1
include/db0err.h

@ -32,6 +32,7 @@ enum db_err {
/* The following are error codes */
DB_ERROR,
DB_INTERRUPTED,
DB_OUT_OF_MEMORY,
DB_OUT_OF_FILE_SPACE,
DB_LOCK_WAIT,

24
include/dict0mem.h

@ -80,21 +80,39 @@ combination of types */
/** File format */
/* @{ */
#define DICT_TF_FORMAT_SHIFT 5 /* file format */
#define DICT_TF_FORMAT_MASK (127 << DICT_TF_FORMAT_SHIFT)
#define DICT_TF_FORMAT_MASK \
((~(~0 << (DICT_TF_BITS - DICT_TF_FORMAT_SHIFT))) << DICT_TF_FORMAT_SHIFT)
#define DICT_TF_FORMAT_51 0 /*!< InnoDB/MySQL up to 5.1 */
#define DICT_TF_FORMAT_ZIP 1 /*!< InnoDB plugin for 5.1:
compressed tables,
new BLOB treatment */
/** Maximum supported file format */
#define DICT_TF_FORMAT_MAX DICT_TF_FORMAT_ZIP
/* @} */
#define DICT_TF_BITS 6 /*!< number of flag bits */
#if (1 << (DICT_TF_BITS - DICT_TF_FORMAT_SHIFT)) <= DICT_TF_FORMAT_MAX
# error "DICT_TF_BITS is insufficient for DICT_TF_FORMAT_MAX"
#endif
/* @} */
/** @brief Additional table flags.
These flags will be stored in SYS_TABLES.MIX_LEN. All unused flags
will be written as 0. The column may contain garbage for tables
created with old versions of InnoDB that only implemented
ROW_FORMAT=REDUNDANT. */
/* @{ */
#define DICT_TF2_SHIFT DICT_TF_BITS
/*!< Shift value for
table->flags. */
#define DICT_TF2_TEMPORARY 1 /*!< TRUE for tables from
CREATE TEMPORARY TABLE. */
#define DICT_TF2_BITS (DICT_TF2_SHIFT + 1)
/*!< Total number of bits
in table->flags. */
/* @} */
/**********************************************************************//**
Creates a table memory object.
@return own: table object */
@ -374,7 +392,7 @@ struct dict_table_struct{
unsigned space:32;
/*!< space where the clustered index of the
table is placed */
unsigned flags:DICT_TF_BITS;/*!< DICT_TF_COMPACT, ... */
unsigned flags:DICT_TF2_BITS;/*!< DICT_TF_COMPACT, ... */
unsigned ibd_file_missing:1;
/*!< TRUE if this is in a single-table
tablespace and the .ibd file is missing; then

22
include/ha_prototypes.h

@ -153,28 +153,6 @@ get_innobase_type_from_mysql_type(
const void* field) /*!< in: MySQL Field */
__attribute__((nonnull));
/*************************************************************//**
If you want to print a thd that is not associated with the current thread,
you must call this function before reserving the InnoDB kernel_mutex, to
protect MySQL from setting thd->query NULL. If you print a thd of the current
thread, we know that MySQL cannot modify thd->query, and it is not necessary
to call this. Call innobase_mysql_end_print_arbitrary_thd() after you release
the kernel_mutex. */
UNIV_INTERN
void
innobase_mysql_prepare_print_arbitrary_thd(void);
/*============================================*/
/*************************************************************//**
Releases the mutex reserved by innobase_mysql_prepare_print_arbitrary_thd().
In the InnoDB latching order, the mutex sits right above the
kernel_mutex. In debug builds, we assert that the kernel_mutex is
released before this function is invoked. */
UNIV_INTERN
void
innobase_mysql_end_print_arbitrary_thd(void);
/*========================================*/
/******************************************************************//**
Get the variable length bounds of the given character set. */
UNIV_INTERN

11
include/lock0lock.h

@ -613,13 +613,16 @@ lock_rec_print(
FILE* file, /*!< in: file where to print */
const lock_t* lock); /*!< in: record type lock */
/*********************************************************************//**
Prints info of locks for all transactions. */
Prints info of locks for all transactions.
@return FALSE if not able to obtain kernel mutex
and exits without printing info */
UNIV_INTERN
void
ibool
lock_print_info_summary(
/*====================*/
FILE* file); /*!< in: file where to print */
/*********************************************************************//**
FILE* file, /*!< in: file where to print */
ibool nowait);/*!< in: whether to wait for the kernel mutex */
/*************************************************************************
Prints info of locks for each transaction. */
UNIV_INTERN
void

2
include/log0recv.h

@ -258,12 +258,14 @@ void
recv_sys_init(
/*==========*/
ulint available_memory); /*!< in: available memory in bytes */
#ifndef UNIV_HOTBACKUP
/********************************************************//**
Reset the state of the recovery system variables. */
UNIV_INTERN
void
recv_sys_var_init(void);
/*===================*/
#endif /* !UNIV_HOTBACKUP */
/*******************************************************************//**
Empties the hash table of stored log records, applying them to appropriate
pages. */

1
include/os0file.h

@ -153,6 +153,7 @@ log. */
#define OS_FILE_ERROR_NOT_SPECIFIED 77
#define OS_FILE_INSUFFICIENT_RESOURCE 78
#define OS_FILE_AIO_INTERRUPTED 79
#define OS_FILE_OPERATION_ABORTED 80
/* @} */
/** Types for aio operations @{ */

24
include/srv0srv.h

@ -232,7 +232,8 @@ extern ibool srv_print_innodb_tablespace_monitor;
extern ibool srv_print_verbose_log;
extern ibool srv_print_innodb_table_monitor;
extern ibool srv_lock_timeout_and_monitor_active;
extern ibool srv_lock_timeout_active;
extern ibool srv_monitor_active;
extern ibool srv_error_monitor_active;
extern ulong srv_n_spin_wait_rounds;
@ -545,15 +546,23 @@ srv_release_mysql_thread_if_suspended(
MySQL OS thread */
/*********************************************************************//**
A thread which wakes up threads whose lock wait may have lasted too long.
This also prints the info output by various InnoDB monitors.
@return a dummy parameter */
UNIV_INTERN
os_thread_ret_t
srv_lock_timeout_and_monitor_thread(
/*================================*/
srv_lock_timeout_thread(
/*====================*/
void* arg); /*!< in: a dummy parameter required by
os_thread_create */
/*********************************************************************//**
A thread which prints the info output by various InnoDB monitors.
@return a dummy parameter */
UNIV_INTERN
os_thread_ret_t
srv_monitor_thread(
/*===============*/
void* arg); /*!< in: a dummy parameter required by
os_thread_create */
/*************************************************************************
A thread which prints warnings about semaphore waits which have lasted
too long. These can be used to track bugs which cause hangs.
@return a dummy parameter */
@ -564,12 +573,15 @@ srv_error_monitor_thread(
void* arg); /*!< in: a dummy parameter required by
os_thread_create */
/******************************************************************//**
Outputs to a file the output of the InnoDB Monitor. */
Outputs to a file the output of the InnoDB Monitor.
@return FALSE if not all information printed
due to failure to obtain necessary mutex */
UNIV_INTERN
void
ibool
srv_printf_innodb_monitor(
/*======================*/
FILE* file, /*!< in: output stream */
ibool nowait, /*!< in: whether to wait for kernel mutex */
ulint* trx_start, /*!< out: file position of the start of
the list of active transactions */
ulint* trx_end); /*!< out: file position of the end of

4
include/trx0sys.h

@ -333,12 +333,14 @@ UNIV_INTERN
void
trx_sys_file_format_tag_init(void);
/*==============================*/
#ifndef UNIV_HOTBACKUP
/*****************************************************************//**
Shutdown/Close the transaction system. */
UNIV_INTERN
void
trx_sys_close(void);
/*===============*/
#endif /* !UNIV_HOTBACKUP */
/*****************************************************************//**
Get the name representation of the file format from its id.
@return pointer to the name */
@ -495,7 +497,6 @@ this contains the same fields as TRX_SYS_MYSQL_LOG_INFO below */
within that file */
#define TRX_SYS_MYSQL_LOG_NAME 12 /*!< MySQL log file name */
#ifndef UNIV_HOTBACKUP
/** Doublewrite buffer */
/* @{ */
/** The offset of the doublewrite buffer header on the trx system header page */
@ -547,6 +548,7 @@ FIL_PAGE_ARCH_LOG_NO_OR_SPACE_NO. */
#define TRX_SYS_DOUBLEWRITE_BLOCK_SIZE FSP_EXTENT_SIZE
/* @} */
#ifndef UNIV_HOTBACKUP
/** File format tag */
/* @{ */
/** The offset of the file format tag on the trx system header page

4
include/trx0trx.h

@ -338,9 +338,7 @@ trx_commit_step(
/**********************************************************************//**
Prints info about a transaction to the given file. The caller must own the
kernel mutex and must have called
innobase_mysql_prepare_print_arbitrary_thd(), unless he knows that MySQL
or InnoDB cannot meanwhile change the info printed here. */
kernel mutex. */
UNIV_INTERN
void
trx_print(

31
lock/lock0lock.c

@ -4317,19 +4317,26 @@ lock_get_n_rec_locks(void)
#endif /* PRINT_NUM_OF_LOCK_STRUCTS */
/*********************************************************************//**
Prints info of locks for all transactions. */
Prints info of locks for all transactions.
@return FALSE if not able to obtain kernel mutex
and exits without printing info */
UNIV_INTERN
void
ibool
lock_print_info_summary(
/*====================*/
FILE* file) /*!< in: file where to print */
FILE* file, /*!< in: file where to print */
ibool nowait) /*!< in: whether to wait for the kernel mutex */
{
/* We must protect the MySQL thd->query field with a MySQL mutex, and
because the MySQL mutex must be reserved before the kernel_mutex of
InnoDB, we call innobase_mysql_prepare_print_arbitrary_thd() here. */
innobase_mysql_prepare_print_arbitrary_thd();
lock_mutex_enter_kernel();
/* if nowait is FALSE, wait on the kernel mutex,
otherwise return immediately if fail to obtain the
mutex. */
if (!nowait) {
lock_mutex_enter_kernel();
} else if (mutex_enter_nowait(&kernel_mutex)) {
fputs("FAIL TO OBTAIN KERNEL MUTEX, "
"SKIP LOCK INFO PRINTING\n", file);
return(FALSE);
}
if (lock_deadlock_found) {
fputs("------------------------\n"
@ -4361,6 +4368,7 @@ lock_print_info_summary(
"Total number of lock structs in row lock hash table %lu\n",
(ulong) lock_get_n_rec_locks());
#endif /* PRINT_NUM_OF_LOCK_STRUCTS */
return(TRUE);
}
/*********************************************************************//**
@ -4411,7 +4419,6 @@ loop:
if (trx == NULL) {
lock_mutex_exit_kernel();
innobase_mysql_end_print_arbitrary_thd();
ut_ad(lock_validate());
@ -4495,7 +4502,6 @@ loop:
}
lock_mutex_exit_kernel();
innobase_mysql_end_print_arbitrary_thd();
mtr_start(&mtr);
@ -4506,7 +4512,6 @@ loop:
load_page_first = FALSE;
innobase_mysql_prepare_print_arbitrary_thd();
lock_mutex_enter_kernel();
goto loop;
@ -4926,7 +4931,7 @@ lock_rec_insert_check_and_lock(
}
trx = thr_get_trx(thr);
next_rec = page_rec_get_next((rec_t*) rec);
next_rec = page_rec_get_next_const(rec);
next_rec_heap_no = page_rec_get_heap_no(next_rec);
lock_mutex_enter_kernel();

2
log/log0log.c

@ -3095,7 +3095,7 @@ loop:
if (srv_fast_shutdown < 2
&& (srv_error_monitor_active
|| srv_lock_timeout_and_monitor_active)) {
|| srv_lock_timeout_active || srv_monitor_active)) {
mutex_exit(&kernel_mutex);

4
log/log0recv.c

@ -241,6 +241,7 @@ recv_sys_mem_free(void)
}
}
#ifndef UNIV_HOTBACKUP
/************************************************************
Reset the state of the recovery system variables. */
UNIV_INTERN
@ -280,6 +281,7 @@ recv_sys_var_init(void)
recv_max_page_lsn = 0;
}
#endif /* !UNIV_HOTBACKUP */
/************************************************************
Inits the recovery system for a recovery operation. */
@ -2575,7 +2577,7 @@ recv_scan_log_recs(
ut_ad(start_lsn % OS_FILE_LOG_BLOCK_SIZE == 0);
ut_ad(len % OS_FILE_LOG_BLOCK_SIZE == 0);
ut_ad(len > 0);
ut_ad(len >= OS_FILE_LOG_BLOCK_SIZE);
ut_a(store_to_hash <= TRUE);
finished = FALSE;

78
mysql-test/innodb-autoinc.result

@ -1111,18 +1111,82 @@ c1 c2
3 innodb
4 NULL
DROP TABLE t1;
CREATE TABLE T1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) AUTO_INCREMENT=10 ENGINE=InnoDB;
CREATE INDEX i1 on T1(c2);
SHOW CREATE TABLE T1;
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) AUTO_INCREMENT=10 ENGINE=InnoDB;
CREATE INDEX i1 on t1(c2);
SHOW CREATE TABLE t1;
Table Create Table
T1 CREATE TABLE `T1` (
t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL AUTO_INCREMENT,
`c2` int(11) DEFAULT NULL,
PRIMARY KEY (`c1`),
KEY `i1` (`c2`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
INSERT INTO T1 (c2) values (0);
SELECT * FROM T1;
INSERT INTO t1 (c2) values (0);
SELECT * FROM t1;
c1 c2
10 0
DROP TABLE T1;
DROP TABLE t1;
DROP TABLE IF EXISTS t1;
Warnings:
Note 1051 Unknown table 't1'
CREATE TABLE t1(C1 DOUBLE AUTO_INCREMENT KEY, C2 CHAR(10)) ENGINE=InnoDB;
INSERT INTO t1(C1, C2) VALUES (1, 'innodb'), (3, 'innodb');
INSERT INTO t1(C2) VALUES ('innodb');
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`C1` double NOT NULL AUTO_INCREMENT,
`C2` char(10) DEFAULT NULL,
PRIMARY KEY (`C1`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
DROP TABLE t1;
CREATE TABLE t1(C1 FLOAT AUTO_INCREMENT KEY, C2 CHAR(10)) ENGINE=InnoDB;
INSERT INTO t1(C1, C2) VALUES (1, 'innodb'), (3, 'innodb');
INSERT INTO t1(C2) VALUES ('innodb');
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`C1` float NOT NULL AUTO_INCREMENT,
`C2` char(10) DEFAULT NULL,
PRIMARY KEY (`C1`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
DROP TABLE t1;
DROP TABLE IF EXISTS t1;
Warnings:
Note 1051 Unknown table 't1'
CREATE TABLE t1 (c1 INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t1 SET c1 = 1;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
INSERT INTO t1 SET c1 = 2;
INSERT INTO t1 SET c1 = -1;
SELECT * FROM t1;
c1
-1
1
2
INSERT INTO t1 SET c1 = -1;
Got one of the listed errors
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
REPLACE INTO t1 VALUES (-1);
SELECT * FROM t1;
c1
-1
1
2
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
DROP TABLE t1;

49
mysql-test/innodb-autoinc.test

@ -610,9 +610,46 @@ DROP TABLE t1;
# 47125: auto_increment start value is ignored if an index is created
# and engine=innodb
#
CREATE TABLE T1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) AUTO_INCREMENT=10 ENGINE=InnoDB;
CREATE INDEX i1 on T1(c2);
SHOW CREATE TABLE T1;
INSERT INTO T1 (c2) values (0);
SELECT * FROM T1;
DROP TABLE T1;
CREATE TABLE t1 (c1 INT AUTO_INCREMENT, c2 INT, PRIMARY KEY(c1)) AUTO_INCREMENT=10 ENGINE=InnoDB;
CREATE INDEX i1 on t1(c2);
SHOW CREATE TABLE t1;
INSERT INTO t1 (c2) values (0);
SELECT * FROM t1;
DROP TABLE t1;
##
# 49032: Use the correct function to read the AUTOINC column value
#
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(C1 DOUBLE AUTO_INCREMENT KEY, C2 CHAR(10)) ENGINE=InnoDB;
INSERT INTO t1(C1, C2) VALUES (1, 'innodb'), (3, 'innodb');
# Restart the server
-- source include/restart_mysqld.inc
INSERT INTO t1(C2) VALUES ('innodb');
SHOW CREATE TABLE t1;
DROP TABLE t1;
CREATE TABLE t1(C1 FLOAT AUTO_INCREMENT KEY, C2 CHAR(10)) ENGINE=InnoDB;
INSERT INTO t1(C1, C2) VALUES (1, 'innodb'), (3, 'innodb');
# Restart the server
-- source include/restart_mysqld.inc
INSERT INTO t1(C2) VALUES ('innodb');
SHOW CREATE TABLE t1;
DROP TABLE t1;
##
# 47720: REPLACE INTO Autoincrement column with negative values
#
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (c1 INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t1 SET c1 = 1;
SHOW CREATE TABLE t1;
INSERT INTO t1 SET c1 = 2;
INSERT INTO t1 SET c1 = -1;
SELECT * FROM t1;
-- error ER_DUP_ENTRY,1062
INSERT INTO t1 SET c1 = -1;
SHOW CREATE TABLE t1;
REPLACE INTO t1 VALUES (-1);
SELECT * FROM t1;
SHOW CREATE TABLE t1;
DROP TABLE t1;

2
mysql-test/innodb-consistent-master.opt

@ -1 +1 @@
--innodb_lock_wait_timeout=2
--loose-innodb_lock_wait_timeout=2

116
mysql-test/innodb-consistent.test

@ -1,58 +1,58 @@
-- source include/not_embedded.inc
-- source include/have_innodb.inc
--disable_warnings
drop table if exists t1;
--enable_warnings
# REPLACE INTO ... SELECT and INSERT INTO ... SELECT should do
# a consistent read of the source table.
connect (a,localhost,root,,);
connect (b,localhost,root,,);
connection a;
set session transaction isolation level read committed;
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
create table t2 like t1;
insert into t2 values (1),(2),(3),(4),(5),(6),(7);
set autocommit=0;
# REPLACE INTO ... SELECT case
begin;
# this should not result in any locks on t2.
replace into t1 select * from t2;
connection b;
set session transaction isolation level read committed;
set autocommit=0;
# should not cuase a lock wait.
delete from t2 where a=5;
commit;
delete from t2;
commit;
connection a;
commit;
# INSERT INTO ... SELECT case
begin;
# this should not result in any locks on t2.
insert into t1 select * from t2;
connection b;
set session transaction isolation level read committed;
set autocommit=0;
# should not cuase a lock wait.
delete from t2 where a=5;
commit;
delete from t2;
commit;
connection a;
commit;
select * from t1;
drop table t1;
drop table t2;
connection default;
disconnect a;
disconnect b;
-- source include/not_embedded.inc
-- source include/have_innodb.inc
--disable_warnings
drop table if exists t1;
--enable_warnings
# REPLACE INTO ... SELECT and INSERT INTO ... SELECT should do
# a consistent read of the source table.
connect (a,localhost,root,,);
connect (b,localhost,root,,);
connection a;
set session transaction isolation level read committed;
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
create table t2 like t1;
insert into t2 values (1),(2),(3),(4),(5),(6),(7);
set autocommit=0;
# REPLACE INTO ... SELECT case
begin;
# this should not result in any locks on t2.
replace into t1 select * from t2;
connection b;
set session transaction isolation level read committed;
set autocommit=0;
# should not cuase a lock wait.
delete from t2 where a=5;
commit;
delete from t2;
commit;
connection a;
commit;
# INSERT INTO ... SELECT case
begin;
# this should not result in any locks on t2.
insert into t1 select * from t2;
connection b;
set session transaction isolation level read committed;
set autocommit=0;
# should not cuase a lock wait.
delete from t2 where a=5;
commit;
delete from t2;
commit;
connection a;
commit;
select * from t1;
drop table t1;
drop table t2;
connection default;
disconnect a;
disconnect b;

1
mysql-test/innodb-index.result

@ -961,6 +961,7 @@ create index t1u on t1 (u(1));
drop table t1;
set global innodb_file_per_table=0;
set global innodb_file_format=Antelope;
set global innodb_file_format_check=Antelope;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
CREATE TABLE t1(

10
mysql-test/innodb-index.test

@ -1,5 +1,7 @@
-- source include/have_innodb.inc
let $innodb_file_format_check_orig=`select @@innodb_file_format_check`;
create table t1(a int not null, b int, c char(10) not null, d varchar(20)) engine = innodb;
insert into t1 values (5,5,'oo','oo'),(4,4,'tr','tr'),(3,4,'ad','ad'),(2,3,'ak','ak');
commit;
@ -388,6 +390,7 @@ create index t1u on t1 (u(1));
drop table t1;
eval set global innodb_file_per_table=$per_table;
eval set global innodb_file_format=$format;
eval set global innodb_file_format_check=$format;
#
# Test to check whether CREATE INDEX handles implicit foreign key
@ -522,3 +525,10 @@ disconnect a;
disconnect b;
DROP TABLE t1;
#
# restore environment to the state it was before this test execution
#
-- disable_query_log
eval SET GLOBAL innodb_file_format_check=$innodb_file_format_check_orig;

2
mysql-test/innodb-master.opt

@ -1 +1 @@
--binlog_cache_size=32768 --innodb_lock_wait_timeout=1
--binlog_cache_size=32768 --loose_innodb_lock_wait_timeout=1

2
mysql-test/innodb-semi-consistent-master.opt

@ -1 +1 @@
--innodb_lock_wait_timeout=2
--loose-innodb_lock_wait_timeout=2

3
mysql-test/innodb-use-sys-malloc-master.opt

@ -1,2 +1 @@
--innodb-use-sys-malloc=true
--innodb-use-sys-malloc=true
--loose-innodb-use-sys-malloc=true

2
mysql-test/innodb.result

@ -3088,7 +3088,7 @@ ERROR HY000: Lock wait timeout exceeded; try restarting transaction
commit;
drop table t1, t2, t3, t5, t6, t8, t9;
CREATE TABLE t1 (DB_ROW_ID int) engine=innodb;
ERROR HY000: Can't create table 'test.t1' (errno: -1)
ERROR 42000: Incorrect column name 'DB_ROW_ID'
CREATE TABLE t1 (
a BIGINT(20) NOT NULL,
PRIMARY KEY (a)

2
mysql-test/innodb.test

@ -2264,7 +2264,7 @@ disconnect j;
drop table t1, t2, t3, t5, t6, t8, t9;
# bug 18934, "InnoDB crashes when table uses column names like DB_ROW_ID"
--error 1005
--error ER_WRONG_COLUMN_NAME
CREATE TABLE t1 (DB_ROW_ID int) engine=innodb;
#

2
mysql-test/innodb_bug42101-nonzero-master.opt

@ -1 +1 @@
--innodb_commit_concurrency=1
--loose_innodb_commit_concurrency=1

14
mysql-test/innodb_bug44369.result

@ -1,14 +1,6 @@
create table bug44369 (DB_ROW_ID int) engine=innodb;
ERROR HY000: Can't create table 'test.bug44369' (errno: -1)
ERROR 42000: Incorrect column name 'DB_ROW_ID'
create table bug44369 (db_row_id int) engine=innodb;
ERROR HY000: Can't create table 'test.bug44369' (errno: -1)
show warnings;
Level Code Message
Warning 1005 Error creating table 'test/bug44369' with column name 'db_row_id'. 'db_row_id' is a reserved name. Please try to re-create the table with a different column name.
Error 1005 Can't create table 'test.bug44369' (errno: -1)
ERROR 42000: Incorrect column name 'db_row_id'
create table bug44369 (db_TRX_Id int) engine=innodb;
ERROR HY000: Can't create table 'test.bug44369' (errno: -1)
show warnings;
Level Code Message
Warning 1005 Error creating table 'test/bug44369' with column name 'db_TRX_Id'. 'db_TRX_Id' is a reserved name. Please try to re-create the table with a different column name.
Error 1005 Can't create table 'test.bug44369' (errno: -1)
ERROR 42000: Incorrect column name 'db_TRX_Id'

10
mysql-test/innodb_bug44369.test

@ -6,16 +6,12 @@
--source include/have_innodb.inc
# This create table operation should fail.
--error ER_CANT_CREATE_TABLE
--error ER_WRONG_COLUMN_NAME
create table bug44369 (DB_ROW_ID int) engine=innodb;
# This create should fail as well
--error ER_CANT_CREATE_TABLE
--error ER_WRONG_COLUMN_NAME
create table bug44369 (db_row_id int) engine=innodb;
show warnings;
--error ER_CANT_CREATE_TABLE
--error ER_WRONG_COLUMN_NAME
create table bug44369 (db_TRX_Id int) engine=innodb;
show warnings;

2
mysql-test/innodb_file_format.result

@ -30,8 +30,6 @@ select @@innodb_file_format_check;
@@innodb_file_format_check
Barracuda
set global innodb_file_format_check=default;
Warnings:
Warning 1210 Ignoring SET innodb_file_format=on
select @@innodb_file_format_check;
@@innodb_file_format_check
Barracuda

62
mysql-test/patches/innodb-index.diff

@ -1,62 +0,0 @@
This part of the innodb-index test causes mysqld to print some warnings
and subsequently the whole mysql-test suite to fail.
A permanent solution is probably to remove the printouts from the source
code or to somehow tell the mysql-test suite that warnings are expected.
Currently we simply do not execute the problematic tests. Please
coordinate a permanent solution with Marko, who added those tests.
This cannot be proposed to MySQL because it touches files that are not
in the MySQL source repository.
Index: storage/innobase/mysql-test/innodb-index.result
===================================================================
--- storage/innobase/mysql-test/innodb-index.result (revision 2870)
+++ storage/innobase/mysql-test/innodb-index.result (working copy)
@@ -43,19 +43,12 @@ t1 CREATE TABLE `t1` (
`b` int(11) DEFAULT NULL,
`c` char(10) NOT NULL,
`d` varchar(20) DEFAULT NULL,
KEY `d2` (`d`),
KEY `b` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
-CREATE TABLE `t1#1`(a INT PRIMARY KEY) ENGINE=InnoDB;
-alter table t1 add unique index (c), add index (d);
-ERROR HY000: Table 'test.t1#1' already exists
-rename table `t1#1` to `t1#2`;
-alter table t1 add unique index (c), add index (d);
-ERROR HY000: Table 'test.t1#2' already exists
-drop table `t1#2`;
alter table t1 add unique index (c), add index (d);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` int(11) DEFAULT NULL,
Index: storage/innobase/mysql-test/innodb-index.test
===================================================================
--- storage/innobase/mysql-test/innodb-index.test (revision 2870)
+++ storage/innobase/mysql-test/innodb-index.test (working copy)
@@ -14,22 +14,12 @@ select * from t1 force index (d2) order
--error ER_DUP_ENTRY
alter table t1 add unique index (b);
show create table t1;
alter table t1 add index (b);
show create table t1;
-# Check how existing tables interfere with temporary tables.
-CREATE TABLE `t1#1`(a INT PRIMARY KEY) ENGINE=InnoDB;
-
---error 156
-alter table t1 add unique index (c), add index (d);
-rename table `t1#1` to `t1#2`;
---error 156
-alter table t1 add unique index (c), add index (d);
-drop table `t1#2`;
-
alter table t1 add unique index (c), add index (d);
show create table t1;
explain select * from t1 force index(c) order by c;
alter table t1 add primary key (a), drop index c;
show create table t1;
--error ER_MULTIPLE_PRI_KEY

54
os/os0file.c

@ -404,6 +404,13 @@ os_file_get_last_error(
"InnoDB: The error means that there are no"
" sufficient system resources or quota to"
" complete the operation.\n");
} else if (err == ERROR_OPERATION_ABORTED) {
fprintf(stderr,
"InnoDB: The error means that the I/O"
" operation has been aborted\n"
"InnoDB: because of either a thread exit"
" or an application request.\n"
"InnoDB: Retry attempt is made.\n");
} else {
fprintf(stderr,
"InnoDB: Some operating system error numbers"
@ -428,6 +435,8 @@ os_file_get_last_error(
} else if (err == ERROR_WORKING_SET_QUOTA
|| err == ERROR_NO_SYSTEM_RESOURCES) {
return(OS_FILE_INSUFFICIENT_RESOURCE);
} else if (err == ERROR_OPERATION_ABORTED) {
return(OS_FILE_OPERATION_ABORTED);
} else {
return(100 + err);
}
@ -563,6 +572,10 @@ os_file_handle_error_cond_exit(
return(TRUE);
} else if (err == OS_FILE_INSUFFICIENT_RESOURCE) {
os_thread_sleep(100000); /* 100 ms */
return(TRUE);
} else if (err == OS_FILE_OPERATION_ABORTED) {
os_thread_sleep(100000); /* 100 ms */
return(TRUE);
} else {
@ -4148,6 +4161,7 @@ os_aio_windows_handle(
ibool ret_val;
BOOL ret;
DWORD len;
BOOL retry = FALSE;
if (segment == ULINT_UNDEFINED) {
array = os_aio_sync_array;
@ -4203,14 +4217,52 @@ os_aio_windows_handle(
}
}
#endif /* UNIV_DO_FLUSH */
} else if (os_file_handle_error(slot->name, "Windows aio")) {
retry = TRUE;
} else {
os_file_handle_error(slot->name, "Windows aio");
ret_val = FALSE;
}
os_mutex_exit(array->mutex);
if (retry) {
/* retry failed read/write operation synchronously.
No need to hold array->mutex. */
switch (slot->type) {
case OS_FILE_WRITE:
ret = WriteFile(slot->file, slot->buf,
slot->len, &len,
&(slot->control));
break;
case OS_FILE_READ:
ret = ReadFile(slot->file, slot->buf,
slot->len, &len,
&(slot->control));
break;
default:
ut_error;
}
if (!ret && GetLastError() == ERROR_IO_PENDING) {
/* aio was queued successfully!
We want a synchronous i/o operation on a
file where we also use async i/o: in Windows
we must use the same wait mechanism as for
async i/o */
ret = GetOverlappedResult(slot->file,
&(slot->control),
&len, TRUE);
}
ret_val = ret && len == slot->len;
}
os_aio_array_free_slot(array, slot);
return(ret_val);

34
row/row0merge.c

@ -1216,6 +1216,12 @@ row_merge_read_clustered_index(
in order to release the latch on the old page. */
if (btr_pcur_is_after_last_on_page(&pcur)) {
if (UNIV_UNLIKELY(trx_is_interrupted(trx))) {
i = 0;
err = DB_INTERRUPTED;
goto err_exit;
}
btr_pcur_store_position(&pcur, &mtr);
mtr_commit(&mtr);
mtr_start(&mtr);
@ -1573,6 +1579,7 @@ static __attribute__((nonnull))
ulint
row_merge(
/*======*/
trx_t* trx, /*!< in: transaction */
const dict_index_t* index, /*!< in: index being created */
merge_file_t* file, /*!< in/out: file containing
index entries */
@ -1614,6 +1621,10 @@ row_merge(
for (; foffs0 < ihalf && foffs1 < file->offset; foffs0++, foffs1++) {
ulint ahalf; /*!< arithmetic half the input file */
if (UNIV_UNLIKELY(trx_is_interrupted(trx))) {
return(DB_INTERRUPTED);
}
error = row_merge_blocks(index, file, block,
&foffs0, &foffs1, &of, table);
@ -1641,6 +1652,10 @@ row_merge(
/* Copy the last blocks, if there are any. */
while (foffs0 < ihalf) {
if (UNIV_UNLIKELY(trx_is_interrupted(trx))) {
return(DB_INTERRUPTED);
}
if (!row_merge_blocks_copy(index, file, block, &foffs0, &of)) {
return(DB_CORRUPTION);
}
@ -1649,6 +1664,10 @@ row_merge(
ut_ad(foffs0 == ihalf);
while (foffs1 < file->offset) {
if (UNIV_UNLIKELY(trx_is_interrupted(trx))) {
return(DB_INTERRUPTED);
}
if (!row_merge_blocks_copy(index, file, block, &foffs1, &of)) {
return(DB_CORRUPTION);
}
@ -1677,6 +1696,7 @@ static
ulint
row_merge_sort(
/*===========*/
trx_t* trx, /*!< in: transaction */
const dict_index_t* index, /*!< in: index being created */
merge_file_t* file, /*!< in/out: file containing
index entries */
@ -1695,7 +1715,8 @@ row_merge_sort(
do {
ulint error;
error = row_merge(index, file, &half, block, tmpfd, table);
error = row_merge(trx, index, file, &half,
block, tmpfd, table);
if (error != DB_SUCCESS) {
return(error);
@ -2065,15 +2086,6 @@ row_merge_drop_temp_indexes(void)
trx->op_info = "dropping partially created indexes";
row_mysql_lock_data_dictionary(trx);
/* Incomplete transactions may be holding some locks on the
data dictionary tables. However, they should never have been
able to lock the records corresponding to the partially
created indexes that we are attempting to delete, because the
table was locked when the indexes were being created. We will
drop the partially created indexes before the rollback of
incomplete transactions is initiated. Thus, this should not
interfere with the incomplete transactions. */
trx->isolation_level = TRX_ISO_READ_UNCOMMITTED;
err = que_eval_sql(NULL, drop_temp_indexes, FALSE, trx);
ut_a(err == DB_SUCCESS);
@ -2514,7 +2526,7 @@ row_merge_build_indexes(
sorting and inserting. */
for (i = 0; i < n_indexes; i++) {
error = row_merge_sort(indexes[i], &merge_files[i],
error = row_merge_sort(trx, indexes[i], &merge_files[i],
block, &tmpfd, table);
if (error == DB_SUCCESS) {

39
row/row0mysql.c

@ -1880,6 +1880,8 @@ err_exit:
if (UNIV_UNLIKELY(err != DB_SUCCESS)) {
trx->error_state = DB_SUCCESS;
trx_general_rollback_for_mysql(trx, NULL);
/* TO DO: free table? The code below will dereference
table->name, though. */
}
switch (err) {
@ -1898,31 +1900,6 @@ err_exit:
break;
case DB_DUPLICATE_KEY:
ut_print_timestamp(stderr);
fputs(" InnoDB: Error: table ", stderr);
ut_print_name(stderr, trx, TRUE, table->name);
fputs(" already exists in InnoDB internal\n"
"InnoDB: data dictionary. Have you deleted"
" the .frm file\n"
"InnoDB: and not used DROP TABLE?"
" Have you used DROP DATABASE\n"
"InnoDB: for InnoDB tables in"
" MySQL version <= 3.23.43?\n"
"InnoDB: See the Restrictions section"
" of the InnoDB manual.\n"
"InnoDB: You can drop the orphaned table"
" inside InnoDB by\n"
"InnoDB: creating an InnoDB table with"
" the same name in another\n"
"InnoDB: database and copying the .frm file"
" to the current database.\n"
"InnoDB: Then MySQL thinks the table exists,"
" and DROP TABLE will\n"
"InnoDB: succeed.\n"
"InnoDB: You can look for further help from\n"
"InnoDB: " REFMAN "innodb-troubleshooting.html\n",
stderr);
/* We may also get err == DB_ERROR if the .ibd file for the
table already exists */
@ -3287,7 +3264,7 @@ check_next_foreign:
ut_error;
} else {
ibool is_path;
ibool is_temp;
const char* name_or_path;
mem_heap_t* heap;
@ -3300,12 +3277,13 @@ check_next_foreign:
space_id = table->space;
if (table->dir_path_of_temp_table != NULL) {
is_path = TRUE;
name_or_path = mem_heap_strdup(
heap, table->dir_path_of_temp_table);
is_temp = TRUE;
} else {
is_path = FALSE;
name_or_path = name;
is_temp = (table->flags >> DICT_TF2_SHIFT)
& DICT_TF2_TEMPORARY;
}
dict_table_remove_from_cache(table);
@ -3325,8 +3303,8 @@ check_next_foreign:
if (err == DB_SUCCESS && space_id > 0) {
if (!fil_space_for_table_exists_in_mem(space_id,
name_or_path,
is_path,
FALSE, TRUE)) {
is_temp, FALSE,
!is_temp)) {
err = DB_SUCCESS;
fprintf(stderr,
@ -4157,6 +4135,7 @@ row_check_table_for_mysql(
}
if (trx_is_interrupted(prebuilt->trx)) {
ret = DB_INTERRUPTED;
break;
}

30
row/row0sel.c

@ -431,10 +431,6 @@ row_sel_fetch_columns(
data = rec_get_nth_field(rec, offsets,
field_no, &len);
if (len == UNIV_SQL_NULL) {
len = UNIV_SQL_NULL;
}
needs_copy = column->copy_val;
}
@ -4616,6 +4612,7 @@ row_search_autoinc_read_column(
dict_index_t* index, /*!< in: index to read from */
const rec_t* rec, /*!< in: current rec */
ulint col_no, /*!< in: column number */
ulint mtype, /*!< in: column main type */
ibool unsigned_type) /*!< in: signed or unsigned flag */
{
ulint len;
@ -4632,10 +4629,26 @@ row_search_autoinc_read_column(
data = rec_get_nth_field(rec, offsets, col_no, &len);
ut_a(len != UNIV_SQL_NULL);
ut_a(len <= sizeof value);
/* we assume AUTOINC value cannot be negative */
value = mach_read_int_type(data, len, unsigned_type);
switch (mtype) {
case DATA_INT:
ut_a(len <= sizeof value);
value = mach_read_int_type(data, len, unsigned_type);
break;
case DATA_FLOAT:
ut_a(len == sizeof(float));
value = mach_float_read(data);
break;
case DATA_DOUBLE:
ut_a(len == sizeof(double));
value = mach_double_read(data);
break;
default:
ut_error;
}
if (UNIV_LIKELY_NULL(heap)) {
mem_heap_free(heap);
@ -4721,7 +4734,8 @@ row_search_max_autoinc(
dfield->col->prtype & DATA_UNSIGNED);
*value = row_search_autoinc_read_column(
index, rec, i, unsigned_type);
index, rec, i,
dfield->col->mtype, unsigned_type);
}
}

2
row/row0umod.c

@ -451,7 +451,7 @@ row_undo_mod_del_unmark_sec_and_undo_update(
BTR_MODIFY_TREE */
que_thr_t* thr, /*!< in: query thread */
dict_index_t* index, /*!< in: index */
dtuple_t* entry) /*!< in: index entry */
const dtuple_t* entry) /*!< in: index entry */
{
mem_heap_t* heap;
btr_pcur_t pcur;

3
row/row0upd.c

@ -1344,9 +1344,6 @@ row_upd_copy_columns(
data = rec_get_nth_field(rec, offsets,
column->field_nos[SYM_CLUST_FIELD_NO],
&len);
if (len == UNIV_SQL_NULL) {
len = UNIV_SQL_NULL;
}
eval_node_copy_and_alloc_val(column, data, len);
column = UT_LIST_GET_NEXT(col_var_list, column);

179
srv/srv0srv.c

@ -119,7 +119,8 @@ UNIV_INTERN ulint srv_fatal_semaphore_wait_threshold = 600;
in microseconds, in order to reduce the lagging of the purge thread. */
UNIV_INTERN ulint srv_dml_needed_delay = 0;
UNIV_INTERN ibool srv_lock_timeout_and_monitor_active = FALSE;
UNIV_INTERN ibool srv_lock_timeout_active = FALSE;
UNIV_INTERN ibool srv_monitor_active = FALSE;
UNIV_INTERN ibool srv_error_monitor_active = FALSE;
UNIV_INTERN const char* srv_main_thread_op_info = "";
@ -194,7 +195,17 @@ UNIV_INTERN ulong srv_flush_log_at_trx_commit = 1;
the checkpoints. */
UNIV_INTERN char srv_adaptive_flushing = TRUE;
/* The sort order table of the MySQL latin1_swedish_ci character set
/** Maximum number of times allowed to conditionally acquire
mutex before switching to blocking wait on the mutex */
#define MAX_MUTEX_NOWAIT 20
/** Check whether the number of failed nonblocking mutex
acquisition attempts exceeds maximum allowed value. If so,
srv_printf_innodb_monitor() will request mutex acquisition
with mutex_enter(), which will wait until it gets the mutex. */
#define MUTEX_NOWAIT(mutex_skipped) ((mutex_skipped) < MAX_MUTEX_NOWAIT)
/** The sort order table of the MySQL latin1_swedish_ci character set
collation */
UNIV_INTERN const byte* srv_latin1_ordering;
@ -1689,12 +1700,15 @@ srv_refresh_innodb_monitor_stats(void)
}
/******************************************************************//**
Outputs to a file the output of the InnoDB Monitor. */
Outputs to a file the output of the InnoDB Monitor.
@return FALSE if not all information printed
due to failure to obtain necessary mutex */
UNIV_INTERN
void
ibool
srv_printf_innodb_monitor(
/*======================*/
FILE* file, /*!< in: output stream */
ibool nowait, /*!< in: whether to wait for kernel mutex */
ulint* trx_start, /*!< out: file position of the start of
the list of active transactions */
ulint* trx_end) /*!< out: file position of the end of
@ -1703,6 +1717,7 @@ srv_printf_innodb_monitor(
double time_elapsed;
time_t current_time;
ulint n_reserved;
ibool ret;
mutex_enter(&srv_innodb_monitor_mutex);
@ -1752,24 +1767,31 @@ srv_printf_innodb_monitor(
mutex_exit(&dict_foreign_err_mutex);
lock_print_info_summary(file);
if (trx_start) {
long t = ftell(file);
if (t < 0) {
*trx_start = ULINT_UNDEFINED;
} else {
*trx_start = (ulint) t;
/* Only if lock_print_info_summary proceeds correctly,
before we call the lock_print_info_all_transactions
to print all the lock information. */
ret = lock_print_info_summary(file, nowait);
if (ret) {
if (trx_start) {
long t = ftell(file);
if (t < 0) {
*trx_start = ULINT_UNDEFINED;
} else {
*trx_start = (ulint) t;
}
}
}
lock_print_info_all_transactions(file);
if (trx_end) {
long t = ftell(file);
if (t < 0) {
*trx_end = ULINT_UNDEFINED;
} else {
*trx_end = (ulint) t;
lock_print_info_all_transactions(file);
if (trx_end) {
long t = ftell(file);
if (t < 0) {
*trx_end = ULINT_UNDEFINED;
} else {
*trx_end = (ulint) t;
}
}
}
fputs("--------\n"
"FILE I/O\n"
"--------\n", file);
@ -1867,6 +1889,8 @@ srv_printf_innodb_monitor(
"============================\n", file);
mutex_exit(&srv_innodb_monitor_mutex);
fflush(file);
return(ret);
}
/******************************************************************//**
@ -1954,26 +1978,23 @@ srv_export_innodb_status(void)
}
/*********************************************************************//**
A thread which wakes up threads whose lock wait may have lasted too long.
This also prints the info output by various InnoDB monitors.
A thread which prints the info output by various InnoDB monitors.
@return a dummy parameter */
UNIV_INTERN
os_thread_ret_t
srv_lock_timeout_and_monitor_thread(
/*================================*/
srv_monitor_thread(
/*===============*/
void* arg __attribute__((unused)))
/*!< in: a dummy parameter required by
os_thread_create */
{
srv_slot_t* slot;
double time_elapsed;
time_t current_time;
time_t last_table_monitor_time;
time_t last_tablespace_monitor_time;
time_t last_monitor_time;
ibool some_waits;
double wait_time;
ulint i;
ulint mutex_skipped;
ibool last_srv_print_monitor;
#ifdef UNIV_DEBUG_THREAD_CREATION
fprintf(stderr, "Lock timeout thread starts, id %lu\n",
@ -1984,13 +2005,15 @@ srv_lock_timeout_and_monitor_thread(
last_table_monitor_time = time(NULL);
last_tablespace_monitor_time = time(NULL);
last_monitor_time = time(NULL);
mutex_skipped = 0;
last_srv_print_monitor = srv_print_innodb_monitor;
loop:
srv_lock_timeout_and_monitor_active = TRUE;
srv_monitor_active = TRUE;
/* When someone is waiting for a lock, we wake up every second
and check if a timeout has passed for a lock wait */
/* Wake up every 5 seconds to see if we need to print
monitor information. */
os_thread_sleep(1000000);
os_thread_sleep(5000000);
current_time = time(NULL);
@ -2000,14 +2023,40 @@ loop:
last_monitor_time = time(NULL);
if (srv_print_innodb_monitor) {
srv_printf_innodb_monitor(stderr, NULL, NULL);
/* Reset mutex_skipped counter everytime
srv_print_innodb_monitor changes. This is to
ensure we will not be blocked by kernel_mutex
for short duration information printing,
such as requested by sync_array_print_long_waits() */
if (!last_srv_print_monitor) {
mutex_skipped = 0;
last_srv_print_monitor = TRUE;
}
if (!srv_printf_innodb_monitor(stderr,
MUTEX_NOWAIT(mutex_skipped),
NULL, NULL)) {
mutex_skipped++;
} else {
/* Reset the counter */
mutex_skipped = 0;
}
} else {
last_srv_print_monitor = FALSE;
}
if (srv_innodb_status) {
mutex_enter(&srv_monitor_file_mutex);
rewind(srv_monitor_file);
srv_printf_innodb_monitor(srv_monitor_file, NULL,
NULL);
if (!srv_printf_innodb_monitor(srv_monitor_file,
MUTEX_NOWAIT(mutex_skipped),
NULL, NULL)) {
mutex_skipped++;
} else {
mutex_skipped = 0;
}
os_file_set_eof(srv_monitor_file);
mutex_exit(&srv_monitor_file_mutex);
}
@ -2060,6 +2109,56 @@ loop:
}
}
if (srv_shutdown_state >= SRV_SHUTDOWN_CLEANUP) {
goto exit_func;
}
if (srv_print_innodb_monitor
|| srv_print_innodb_lock_monitor
|| srv_print_innodb_tablespace_monitor
|| srv_print_innodb_table_monitor) {
goto loop;
}
srv_monitor_active = FALSE;
goto loop;
exit_func:
srv_monitor_active = FALSE;
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */
os_thread_exit(NULL);
OS_THREAD_DUMMY_RETURN;
}
/*********************************************************************//**
A thread which wakes up threads whose lock wait may have lasted too long.
@return a dummy parameter */
UNIV_INTERN
os_thread_ret_t
srv_lock_timeout_thread(
/*====================*/
void* arg __attribute__((unused)))
/* in: a dummy parameter required by
os_thread_create */
{
srv_slot_t* slot;
ibool some_waits;
double wait_time;
ulint i;
loop:
/* When someone is waiting for a lock, we wake up every second
and check if a timeout has passed for a lock wait */
os_thread_sleep(1000000);
srv_lock_timeout_active = TRUE;
mutex_enter(&kernel_mutex);
some_waits = FALSE;
@ -2110,17 +2209,11 @@ loop:
goto exit_func;
}
if (some_waits || srv_print_innodb_monitor
|| srv_print_innodb_lock_monitor
|| srv_print_innodb_tablespace_monitor
|| srv_print_innodb_table_monitor) {
if (some_waits) {
goto loop;
}
/* No one was waiting for a lock and no monitor was active:
suspend this thread */
srv_lock_timeout_and_monitor_active = FALSE;
srv_lock_timeout_active = FALSE;
#if 0
/* The following synchronisation is disabled, since
@ -2130,7 +2223,7 @@ loop:
goto loop;
exit_func:
srv_lock_timeout_and_monitor_active = FALSE;
srv_lock_timeout_active = FALSE;
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */

32
srv/srv0start.c

@ -105,6 +105,7 @@ Created 2/16/1996 Heikki Tuuri
# include "btr0pcur.h"
# include "thr0loc.h"
# include "os0sync.h" /* for INNODB_RW_LOCKS_USE_ATOMICS */
# include "zlib.h" /* for ZLIB_VERSION */
/** Log sequence number immediately after startup */
UNIV_INTERN ib_uint64_t srv_start_lsn;
@ -143,9 +144,9 @@ static mutex_t ios_mutex;
static ulint ios;
/** io_handler_thread parameters for thread identification */
static ulint n[SRV_MAX_N_IO_THREADS + 5];
static ulint n[SRV_MAX_N_IO_THREADS + 6];
/** io_handler_thread identifiers */
static os_thread_id_t thread_ids[SRV_MAX_N_IO_THREADS + 5];
static os_thread_id_t thread_ids[SRV_MAX_N_IO_THREADS + 6];
/** We use this mutex to test the return value of pthread_mutex_trylock
on successful locking. HP-UX does NOT return 0, though Linux et al do. */
@ -1074,7 +1075,11 @@ innobase_start_or_create_for_mysql(void)
#ifdef UNIV_IBUF_DEBUG
fprintf(stderr,
"InnoDB: !!!!!!!! UNIV_IBUF_DEBUG switched on !!!!!!!!!\n"
"InnoDB: Crash recovery will fail with UNIV_IBUF_DEBUG\n");
# ifdef UNIV_IBUF_COUNT_DEBUG
"InnoDB: !!!!!!!! UNIV_IBUF_COUNT_DEBUG switched on !!!!!!!!!\n"
"InnoDB: Crash recovery will fail with UNIV_IBUF_COUNT_DEBUG\n"
# endif
);
#endif
#ifdef UNIV_SYNC_DEBUG
@ -1101,7 +1106,15 @@ innobase_start_or_create_for_mysql(void)
"InnoDB: The InnoDB memory heap is disabled\n");
}
fprintf(stderr, "InnoDB: %s\n", IB_ATOMICS_STARTUP_MSG);
fputs("InnoDB: " IB_ATOMICS_STARTUP_MSG
"\nInnoDB: Compressed tables use zlib " ZLIB_VERSION
#ifdef UNIV_ZIP_DEBUG
" with validation"
#endif /* UNIV_ZIP_DEBUG */
#ifdef UNIV_ZIP_COPY
" and extra copying"
#endif /* UNIV_ZIP_COPY */
"\n" , stderr);
/* Since InnoDB does not currently clean up all its internal data
structures in MySQL Embedded Server Library server_end(), we
@ -1675,15 +1688,18 @@ innobase_start_or_create_for_mysql(void)
/* fprintf(stderr, "Max allowed record size %lu\n",
page_get_free_space_of_empty() / 2); */
/* Create the thread which watches the timeouts for lock waits
and prints InnoDB monitor info */
os_thread_create(&srv_lock_timeout_and_monitor_thread, NULL,
/* Create the thread which watches the timeouts for lock waits */
os_thread_create(&srv_lock_timeout_thread, NULL,
thread_ids + 2 + SRV_MAX_N_IO_THREADS);
/* Create the thread which warns of long semaphore waits */
os_thread_create(&srv_error_monitor_thread, NULL,
thread_ids + 3 + SRV_MAX_N_IO_THREADS);
/* Create the thread which prints InnoDB monitor info */
os_thread_create(&srv_monitor_thread, NULL,
thread_ids + 4 + SRV_MAX_N_IO_THREADS);
srv_is_being_started = FALSE;
if (trx_doublewrite == NULL) {

7
trx/trx0i_s.c

@ -60,7 +60,7 @@ Created July 17, 2007 Vasil Dimov
/** @brief The maximum number of chunks to allocate for a table cache.
The rows of a table cache are stored in a set of chunks. When a new
row is added a new chunk is allocated if necessary. Assuming that the
row is added a new chunk is allocated if necessary. Assuming that the
first one is 1024 rows (TABLE_CACHE_INITIAL_ROWSNUM) and each
subsequent is N/2 where N is the number of rows we have allocated till
now, then 39th chunk would accommodate 1677416425 rows and all chunks
@ -1205,9 +1205,6 @@ trx_i_s_possibly_fetch_data_into_cache(
return(1);
}
/* We are going to access trx->query in all transactions */
innobase_mysql_prepare_print_arbitrary_thd();
/* We need to read trx_sys and record/table lock queues */
mutex_enter(&kernel_mutex);
@ -1215,8 +1212,6 @@ trx_i_s_possibly_fetch_data_into_cache(
mutex_exit(&kernel_mutex);
innobase_mysql_end_print_arbitrary_thd();
return(0);
}

2
trx/trx0sys.c

@ -1535,6 +1535,7 @@ trx_sys_file_format_id_to_name(
#endif /* !UNIV_HOTBACKUP */
#ifndef UNIV_HOTBACKUP
/*********************************************************************
Shutdown/Close the transaction system. */
UNIV_INTERN
@ -1611,3 +1612,4 @@ trx_sys_close(void)
trx_sys = NULL;
mutex_exit(&kernel_mutex);
}
#endif /* !UNIV_HOTBACKUP */

4
trx/trx0trx.c

@ -1636,9 +1636,7 @@ trx_mark_sql_stat_end(
/**********************************************************************//**
Prints info about a transaction to the given file. The caller must own the
kernel mutex and must have called
innobase_mysql_prepare_print_arbitrary_thd(), unless he knows that MySQL
or InnoDB cannot meanwhile change the info printed here. */
kernel mutex. */
UNIV_INTERN
void
trx_print(

Loading…
Cancel
Save