Commit c1d46655 authored by marko's avatar marko

branches/innodb+: Merge revisions 2867:2986 from branches/zip:

  ------------------------------------------------------------------------
  r2867 | marko | 2008-10-24 10:24:17 +0300 (Fri, 24 Oct 2008) | 2 lines

  branches/zip: ChangeLog: Document r2763, r2794, r2683, r2799, r2809, r2866.
  ------------------------------------------------------------------------
  r2869 | vasil | 2008-10-24 11:14:16 +0300 (Fri, 24 Oct 2008) | 4 lines

  branches/zip:

  White space cleanup in ChangeLog
  ------------------------------------------------------------------------
  r2870 | vasil | 2008-10-24 13:36:14 +0300 (Fri, 24 Oct 2008) | 8 lines

  branches/zip:

  Remove a statement that causes the innodb-index test to fail.

  The change in behavior was introduced in MySQL BZR-r2738.

  Suggested by:	Marko
  ------------------------------------------------------------------------
  r2871 | vasil | 2008-10-24 13:48:38 +0300 (Fri, 24 Oct 2008) | 5 lines

  branches/zip:

  Adjust mysql-test/patches/innodb-index.diff after the change to
  mysql-test/innodb-index.(test|result) in r2870.
  ------------------------------------------------------------------------
  r2878 | calvin | 2008-10-27 11:05:42 +0200 (Mon, 27 Oct 2008) | 8 lines

  branches/zip: port the fix of Bug#19424 - InnoDB: Possibly a memory
  overrun of the buffer being freed with 64-bit Microsoft Visual C++.

  The changed file:

  CMakeLists.txt: Removing Win64 compiler optimizations for all 
  innodb/mem/* files.
  ------------------------------------------------------------------------
  r2884 | vasil | 2008-10-27 11:48:46 +0200 (Mon, 27 Oct 2008) | 7 lines

  branches/zip:

  ChangeLog:

  Add entry for the fix of Bug#19424 InnoDB: Possibly a memory overrun of
  the buffer being freed (64-bit Visual C)
  ------------------------------------------------------------------------
  r2886 | calvin | 2008-10-27 22:39:11 +0200 (Mon, 27 Oct 2008) | 8 lines

  branches/zip: This patch is to solve the issue that file handles can
  not cross DLL/EXE boundaries on Windows. In builtin InnoDB, it makes
  call to MySQL server for creating tmp files. innobase_mysql_tmpfile
  is now rewritten for the plugin. 

  rb://5

  Approved by:	Marko
  ------------------------------------------------------------------------
  r2887 | calvin | 2008-10-27 22:48:29 +0200 (Mon, 27 Oct 2008) | 44 lines

  branches/zip: implement the delayloading of externals for the plugin
  on Windows, which includes:

   * Load mysqld.map and insert all symbol/address pairs into hash for
     quick access
   * Resolves all external data variables. The delayloading mechanism
     in MSVC does not support automatic imports of data variables.
     A workaround is to explicitly handle the data import using the delay
     loader during the initialization of the plugin.
   * Resolves all external functions during run-time, by implementing
     the delayed loading helper function delayLoadHelper2, which is
     called by run-time as well as HrLoadAllImportsForDll. 

  The delay loader reuses the hash implementation in InnoDB. The normal
  hash_create (in hash0hash.c) creates hash tables in buffer pool. But
  the delay loader is invoked before the engine is initialized, and 
  buffer pools are not ready yet. Instead, the delay loader has its own
  implementation of hash_create() and hash_table_free(), called
  wdl_hash_create() and wdl_hash_table_free().

  This patch should be used with other two patches in order to build
  a dynamically linked plugin on Windows:
   * patch for tmpfile functions (r2886)
   * patch for "build" files (to be committed)

  The list of file changed:

  handler/handler0vars.h: new file, defines a list of external data
  variables (no external functions).

  handler/win_delay_loader.cc: new file, the implementation of the delay
  loader for Windows plugin.

  handler/ha_innodb.cc: add a header file, and changes for copying the
  system variables.

  handler/handler0alter.cc: add a header file

  handler/i_s.cc: add a header file

  rb://27

  Reviewed by:	Sunny, Marko
  Approved by:	Sunny
  ------------------------------------------------------------------------
  r2888 | calvin | 2008-10-28 01:51:49 +0200 (Tue, 28 Oct 2008) | 25 lines

  branches/zip: for building dynamic plugin on Windows, ha_innodb.dll,
  when INNODB_DYNAMIC_PLUGIN is specified.

  The changes are:

  CMakeLists.txt: add project ha_innodb for dynamic plugin on Windows.
  ha_innodb depends on project mysqld.

  ha_innodb.def: a new file with standard exports for a dynamic plugin.

  Two new files will be added:
   * sql/mysqld.def:	.def file for 32-bit compiler
   * sql/mysqld_x64.def:	.def file for x64 compiler

  It is also required to apply a patch to the MySQL source tree. The 
  patch is described in win-plugin/README:

  win-plugin/win-plugin.diff - a patch to be applied to MySQL source
  tree. When applied, the following files will be modified:
   * CMakeLists.txt:	add INNODB_DYNAMIC_PLUGIN and _USE_32BIT_TIME_T
   * sql/CMakeLists.txt:	add mysqld.def or mysqld_x64.def for mysqld
   * win/configure.js:	add INNODB_DYNAMIC_PLUGIN
   * win/build-vs71.bat:	provide an option to specify CMAKE_BUILD_TYPE
   * win/build-vs8.bat:	provide an option to specify CMAKE_BUILD_TYPE
   * win/build-vs8_x64.bat: provide an option to specify CMAKE_BUILD_TYPE
  ------------------------------------------------------------------------
  r2894 | marko | 2008-10-28 08:36:39 +0200 (Tue, 28 Oct 2008) | 4 lines

  branches/zip: dict_str_starts_with_keyword(): Removed this unused function.

  Spotted by Sunny.
  ------------------------------------------------------------------------
  r2895 | vasil | 2008-10-28 08:40:45 +0200 (Tue, 28 Oct 2008) | 6 lines

  branches/zip:

  ChangeLog:

  add entry for the Windows plugin.
  ------------------------------------------------------------------------
  r2917 | marko | 2008-10-28 23:53:23 +0200 (Tue, 28 Oct 2008) | 3 lines

  branches/zip: innodb_plugin_init(): Do not copy session variables,
  even when the variable is a global variable in the built-in InnoDB.
  ------------------------------------------------------------------------
  r2918 | calvin | 2008-10-29 00:08:11 +0200 (Wed, 29 Oct 2008) | 2 lines

  branches/zip: fix a problem introduced in r2917 - dyn is not
  initialized. Move the check into for().
  ------------------------------------------------------------------------
  r2922 | calvin | 2008-10-29 08:29:01 +0200 (Wed, 29 Oct 2008) | 16 lines

  branches/zip: fix issue #102 - Windows plugin: resolve dbug functions
  during run-time.

  Implement wrapper functions in the plugin. The plugin will get the
  function entries from mysqld.exe during the init, and invoke the
  corresponding functions (in mysqld.exe). The list of functions are:

  	_db_pargs_
  	_db_doprnt_
  	_db_enter_
  	_db_return_
  	_db_dump_

  rb://38

  Approved by:	Marko
  ------------------------------------------------------------------------
  r2923 | marko | 2008-10-29 09:52:30 +0200 (Wed, 29 Oct 2008) | 1 line

  branches/zip: ChangeLog: Mention Bug #27276.
  ------------------------------------------------------------------------
  r2925 | calvin | 2008-10-29 10:09:41 +0200 (Wed, 29 Oct 2008) | 16 lines

  branches/zip: change function names in sql/mysqld.def in order
  to work with 5.1.29-rc.

  In 5.1.29, the following function names are changed:
    _hash_init
    hash_free
    hash_search
    hash_delete

  changed to
    _my_hash_init
    my_hash_free
    my_hash_search
    my_hash_delete

  Approved by:	Marko (on IM)
  ------------------------------------------------------------------------
  r2927 | marko | 2008-10-29 11:43:23 +0200 (Wed, 29 Oct 2008) | 4 lines

  branches/zip: ha_innodb.cc: Make some functions static, so that they will
  not be compiled as weak global symbols.  These functions must not be
  redirected to the built-in InnoDB.
  ------------------------------------------------------------------------
  r2928 | michael | 2008-10-29 19:20:10 +0200 (Wed, 29 Oct 2008) | 4 lines

  Remove unnecessary assert

  Approved by: Heikki, over IM
  ------------------------------------------------------------------------
  r2930 | marko | 2008-10-29 21:39:24 +0200 (Wed, 29 Oct 2008) | 33 lines

  branches/zip: Merge revisions 2854:2929 from branches/5.1,
  except r2924, which was merged from branches/zip r2866 to branches/5.1
  and except r2879 which was merged separately by Calvin:

    ------------------------------------------------------------------------
    r2902 | vasil | 2008-10-28 12:10:25 +0200 (Tue, 28 Oct 2008) | 10 lines

    branches/5.1:

    Fix Bug#38189 innodb_stats_on_metadata missing

    Make the variable innodb_stats_on_metadata visible to the users and
    also settable at runtime. Previously it was only "visible" as a command
    line startup option to mysqld.

    Approved by:    Marko (https://svn.innodb.com/rb/r/36)
    ------------------------------------------------------------------------
    r2929 | marko | 2008-10-29 21:26:14 +0200 (Wed, 29 Oct 2008) | 13 lines

    branches/5.1: dtype_get_sql_null_size(): return the correct storage
    size of a SQL NULL column. (Bug #40369)

    When MySQL Bug #20877 was fixed in r834, this function was
    accidentally modified to return 0 or 1. Apparently, the only impact of
    this bug is that fixed-length columns cannot be updated in-place from
    or to SQL NULL, even in ROW_FORMAT=REDUNDANT.  After this fix,
    fixed-length columns in ROW_FORMAT=REDUNDANT will have a constant
    storage size as they should, no matter if NULL or non-NULL.  The bug
    caused fixed-length NULL columns to occupy 1 byte.

    rb://37 approved by Heikki over IM.
    ------------------------------------------------------------------------

  ------------------------------------------------------------------------
  r2931 | vasil | 2008-10-29 22:10:40 +0200 (Wed, 29 Oct 2008) | 4 lines

  branches/zip:

  Add 2 ChangeLog entries for the 2 bugfixes that were merged from branches/5.1.
  ------------------------------------------------------------------------
  r2935 | vasil | 2008-10-30 12:17:23 +0200 (Thu, 30 Oct 2008) | 17 lines

  branches/zip:

  Fix "Bug#40360 Binlog related errors with binlog off" in InnoDB code in order
  to have a Bug#40360-free InnoDB Plugin 1.0.2.

  The fix does check whether binary logging is enabled in MySQL by accessing the
  opt_bin_log global variable that is defined in sql/mysqld.cc.

  In case MySQL does develop another solution to this via Bug#40360 then we can
  revert this patch (except the mysql-tests).

  The windows-plugin part of this fix will be committed as a separate commit to
  ease eventual merge into branches/5.1 [note from the future: the separate
  commit went into r2936].

  Approved by:	Marko (https://svn.innodb.com/rb/r/39)
  ------------------------------------------------------------------------
  r2936 | vasil | 2008-10-30 12:24:09 +0200 (Thu, 30 Oct 2008) | 7 lines

  branches/zip:

  Followup to r2935: add the Windows Delay Loader stuff for the MySQL
  variable that we are accessing. If someday we have another solution for
  Bug#40360 Binlog related errors with binlog off
  then this should also be reverted.
  ------------------------------------------------------------------------
  r2937 | vasil | 2008-10-30 12:28:47 +0200 (Thu, 30 Oct 2008) | 4 lines

  branches/zip:

  Add ChangeLog entry for Bug#40360 Binlog related errors with binlog off
  ------------------------------------------------------------------------
  r2938 | vasil | 2008-10-30 12:33:28 +0200 (Thu, 30 Oct 2008) | 5 lines

  branches/zip:

  Non-functional change: convert handler/handler0vars.h and
  handler/win_delay_loader.cc from \r\n (dos) to \n (unix) line terminators.
  ------------------------------------------------------------------------
  r2939 | marko | 2008-10-30 12:38:18 +0200 (Thu, 30 Oct 2008) | 2 lines

  branches/zip: Set svn:eol-style native on some recently added text files.
  ------------------------------------------------------------------------
  r2940 | marko | 2008-10-30 12:46:21 +0200 (Thu, 30 Oct 2008) | 1 line

  branches/zip: ChangeLog, ha_innodb.def: Set svn:eol-style native
  ------------------------------------------------------------------------
  r2941 | vasil | 2008-10-30 19:34:27 +0200 (Thu, 30 Oct 2008) | 4 lines

  branches/zip:

  Increment the InnoDB Plugin version from 1.0.1 to 1.0.2.
  ------------------------------------------------------------------------
  r2943 | sunny | 2008-10-31 09:40:29 +0200 (Fri, 31 Oct 2008) | 15 lines

  branches/zip: 
    1. We add a vector of locks to trx_t. This array contains the autoinc
    locks granted to a transaction. There is one per table.

    2. We enforce releasing of these locks in the reverse order from the
    one in which they are acquired. The assumption is that since the
    AUTOINC locks are statement level locks. Nested statements introduced
    by triggers are stacked it should hold.

  There was some cleanup done to the vector code too by adding const and
  some new functions. Rename dict_table_t::auto_inc_lock to autoinc_lock.

  Fix Bug#26316 Triggers create duplicate entries on auto-increment columns
  rb://22
  ------------------------------------------------------------------------
  r2944 | vasil | 2008-10-31 09:44:16 +0200 (Fri, 31 Oct 2008) | 12 lines

  branches/zip:

  Revert our temporary fix for "Bug#40360 Binlog related errors with binlog off"
  (r2935, r2936) and deploy MySQL's one, but put the function
  mysql_bin_log_is_engaged() inside mysql_addons.cc instead of in mysql's log.cc
  and use a different name for it so there is no collision when MySQL adds this
  function in log.cc.

  [note from the future: the windows part of this patch went into r2947]

  Approved by:	Marko (https://svn.innodb.com/rb/r/41/)
  ------------------------------------------------------------------------
  r2945 | sunny | 2008-10-31 09:44:45 +0200 (Fri, 31 Oct 2008) | 2 lines

  branches/zip: Update ChangeLog with r2943 info.
  ------------------------------------------------------------------------
  r2946 | marko | 2008-10-31 10:18:47 +0200 (Fri, 31 Oct 2008) | 2 lines

  branches/zip: Revert the unintended change to univ.i that was made in r2943.
  ------------------------------------------------------------------------
  r2947 | calvin | 2008-10-31 10:38:26 +0200 (Fri, 31 Oct 2008) | 6 lines

  branches/zip: Windows plugin part of r2944

  r2944 has reference to mysql_bin_log.is_open(), which is new in InnoDB.
  Add two new entries and remove one duplicate in mysqld.def & 
  mysqld_x64.def.
  ------------------------------------------------------------------------
  r2948 | vasil | 2008-10-31 11:39:07 +0200 (Fri, 31 Oct 2008) | 9 lines

  branches/zip:

  Fix Mantis issue#106 plugin init error:InnoDB: stats_on_metadata in static
  InnoDB (flags=0x2401) differs from stats_on_metadata in dynamic InnoDB (fl

  Ignore the NOSYSVAR flag in addition to ignoring the READONLY flag.

  Approved by:	Marko (https://svn.innodb.com/rb/r/42/)
  ------------------------------------------------------------------------
  r2949 | vasil | 2008-10-31 11:47:56 +0200 (Fri, 31 Oct 2008) | 4 lines

  branches/zip:

  White-space cleanup in ChangeLog.
  ------------------------------------------------------------------------
  r2951 | marko | 2008-10-31 14:21:43 +0200 (Fri, 31 Oct 2008) | 4 lines

  branches/zip: scripts/install_innodb_plugins_win.sql: New script,
  for installing the InnoDB plugins in Windows.  Copied from
  scripts/install_innodb_plugins.sql.
  ------------------------------------------------------------------------
  r2954 | calvin | 2008-11-04 09:15:26 +0200 (Tue, 04 Nov 2008) | 8 lines

  branches/zip: ignore the failure when builtin_innobase_plugin is not
  available.

  External variable builtin_innobase_plugin is not available when mysqld
  does not have a builtin InnoDB. The init of the Windows plugin should
  not fail in this case. 

  Approved by:	Marko (on IM)
  ------------------------------------------------------------------------
  r2955 | calvin | 2008-11-04 12:43:14 +0200 (Tue, 04 Nov 2008) | 11 lines

  branches/zip: windows plugin - fix references to array variables.

  This problem surfaced when running new test innodb_bug40360.test. Both
  tx_isolation_names and binlog_format_names are name arrays, and
  should be defined as wdl_tx_isolation_names and wdl_binlog_format_names,
  not *wdl_tx_isolation_names and *wdl_binlog_format_names.

  Another array variable is all_charsets, which is already correctly
  defined.

  Approved by:	Marko (on IM)
  ------------------------------------------------------------------------
  r2986 | marko | 2008-11-11 09:28:37 +0200 (Tue, 11 Nov 2008) | 11 lines

  branches/zip: ha_innobase::create(): Remove the dependences on
  DICT_TF_ZSSIZE_MAX, so that the code can be compiled with a different
  uncompressed page size by redefining UNIV_PAGE_SIZE_SHIFT in univ.i.
  Currently, the allowed values are 12, 13, or 14 (4k, 8k, 16k).

  Make the default compressed page size half the uncompressed page size.
  The previous default was 8 kilobytes, which is the same when compiling
  with the default 16k uncompressed page size.

  rb://50 approved by Pekka Lampio and Sunny Bains.
  ------------------------------------------------------------------------
parent 4fb0f799
......@@ -17,6 +17,14 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX")
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX")
ADD_DEFINITIONS(-DMYSQL_SERVER -D_WIN32 -D_LIB)
# Bug 19424 - InnoDB: Possibly a memory overrun of the buffer being freed (64-bit Visual C)
# Removing Win64 compiler optimizations for all innodb/mem/* files.
IF(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_SIZEOF_VOID_P MATCHES 8)
SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/storage/innobase/mem/mem0mem.c
${CMAKE_SOURCE_DIR}/storage/innobase/mem/mem0pool.c
PROPERTIES COMPILE_FLAGS -Od)
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_SIZEOF_VOID_P MATCHES 8)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib
${CMAKE_SOURCE_DIR}/storage/innobase/include
${CMAKE_SOURCE_DIR}/storage/innobase/handler
......@@ -61,4 +69,28 @@ SET(INNOBASE_SOURCES btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c
IF(NOT SOURCE_SUBLIBS)
ADD_LIBRARY(innobase ${INNOBASE_SOURCES})
ADD_DEPENDENCIES(innobase GenError)
IF(INNODB_DYNAMIC_PLUGIN)
# The dynamic plugin requires CMake 2.6.0 or later. Otherwise, the /DELAYLOAD property
# will not be set
CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR)
ADD_LIBRARY(ha_innodb SHARED ${INNOBASE_SOURCES} ha_innodb.def handler/win_delay_loader.cc)
ADD_DEPENDENCIES(ha_innodb GenError mysqld)
# If build type is not specified as Release, default to Debug
# This is a workaround to a problem in CMake 2.6, which does not
# set the path of mysqld.lib correctly
IF(CMAKE_BUILD_TYPE MATCHES Release)
SET(CMAKE_BUILD_TYPE "Release")
ELSE(CMAKE_BUILD_TYPE MATCHES Release)
SET(CMAKE_BUILD_TYPE "Debug")
ENDIF(CMAKE_BUILD_TYPE MATCHES Release)
TARGET_LINK_LIBRARIES(ha_innodb strings zlib)
TARGET_LINK_LIBRARIES(ha_innodb ${CMAKE_SOURCE_DIR}/sql/${CMAKE_BUILD_TYPE}/mysqld.lib)
SET_TARGET_PROPERTIES(ha_innodb PROPERTIES OUTPUT_NAME ha_innodb)
SET_TARGET_PROPERTIES(ha_innodb PROPERTIES LINK_FLAGS "/MAP /MAPINFO:EXPORTS")
SET_TARGET_PROPERTIES(ha_innodb PROPERTIES LINK_FLAGS "/ENTRY:\"_DllMainCRTStartup@12\"")
SET_TARGET_PROPERTIES(ha_innodb PROPERTIES COMPILE_FLAGS "-DMYSQL_DYNAMIC_PLUGIN")
SET_TARGET_PROPERTIES(ha_innodb PROPERTIES LINK_FLAGS "/DELAYLOAD:mysqld.exe")
ENDIF(INNODB_DYNAMIC_PLUGIN)
ENDIF(NOT SOURCE_SUBLIBS)
2008-10-31 The InnoDB Team
* dict/dict0mem.c, include/dict0mem.h, include/lock0lock.h,
include/row0mysql.h, include/trx0trx.h, include/univ.i,
include/ut0vec.h, include/ut0vec.ic, lock/lock0lock.c,
row/row0mysql.c, trx/trx0trx.c:
Fix Bug#26316 Triggers create duplicate entries on auto-increment
columns
2008-10-30 The InnoDB Team
* handler/ha_innodb.cc, handler/handler0vars.h,
handler/win_delay_loader.cc, mysql-test/innodb_bug40360.result,
mysql-test/innodb_bug40360.test:
Fix Bug#40360 Binlog related errors with binlog off
2008-10-29 The InnoDB Team
* include/data0type.ic:
Fix Bug#40369 dtype_get_sql_null_size() returns 0 or 1, not the size
2008-10-29 The InnoDB Team
* handler/ha_innodb.cc, include/srv0srv.h, srv/srv0srv.c:
Fix Bug#38189 innodb_stats_on_metadata missing
2008-10-28 The InnoDB Team
* CMakeLists.txt, ha_innodb.def, handler/ha_innodb.cc,
handler/handler0alter.cc, handler/handler0vars.h, handler/i_s.cc,
handler/win_delay_loader.cc, win-plugin/*:
Implemented the delayloading of externals for the plugin on Windows.
This makes it possible to build a dynamic plugin (ha_innodb.dll) on
Windows.
2008-10-27 The InnoDB Team
* CMakeLists.txt:
Fix Bug#19424 InnoDB: Possibly a memory overrun of the buffer being
freed (64-bit Visual C)
2008-10-23 The InnoDB Team
* ibuf/ibuf0ibuf.c:
ibuf_delete_rec(): When the cursor to the insert buffer record
cannot be restored, do not complain if the tablespace does not
exist, because the insert buffer record may have been discarded by
some other thread. This bug has existed in MySQL/InnoDB since
some other thread. This bug has existed in MySQL/InnoDB since
version 4.1, when innodb_file_per_table was implemented.
This may fix Bug#27276 InnoDB Error: ibuf cursor restoration fails.
2008-10-22 The InnoDB Team
......@@ -27,25 +68,25 @@
2008-10-16 The InnoDB Team
* dict/dict0dict.c,
mysql-test/innodb-index.result, mysql-test/innodb-index.test:
* dict/dict0dict.c, mysql-test/innodb-index.result,
mysql-test/innodb-index.test:
Skip the undo log size check when creating REDUNDANT and COMPACT
tables. In ROW_FORMAT=DYNAMIC and ROW_FORMAT=COMPRESSED, column
tables. In ROW_FORMAT=DYNAMIC and ROW_FORMAT=COMPRESSED, column
prefix indexes require that prefixes of externally stored columns
be written to the undo log. This may make the undo log record
bigger than the record on the B-tree page. The maximum size of an
undo log record is the page size. That must be checked for, in
dict_index_add_to_cache(). However, this restriction must not
bigger than the record on the B-tree page. The maximum size of an
undo log record is the page size. That must be checked for, in
dict_index_add_to_cache(). However, this restriction must not
be enforced on REDUNDANT or COMPACT tables.
2008-10-15 The InnoDB Team
* btr/btr0cur.c, include/btr0cur.h, row/row0ext.c,
row/row0sel.c, row/row0upd.c:
* btr/btr0cur.c, include/btr0cur.h, row/row0ext.c, row/row0sel.c,
row/row0upd.c:
When the server crashes while freeing an externally stored column
of a compressed table, the BTR_EXTERN_LEN field in the BLOB
pointer will be written as 0. Tolerate this in the functions that
deal with externally stored columns. This fixes problems after
pointer will be written as 0. Tolerate this in the functions that
deal with externally stored columns. This fixes problems after
crash recovery, in the rollback of incomplete transactions, and in
the purge of delete-marked records.
......@@ -53,12 +94,12 @@
* btr/btr0btr.c, include/page0zip.h, page/page0zip.c, include/univ.i:
When a B-tree node of a compressed table is split or merged, the
compression may fail. In this case, the entire compressed page
will be copied and the excess records will be deleted. However,
compression may fail. In this case, the entire compressed page
will be copied and the excess records will be deleted. However,
page_zip_copy(), now renamed to page_zip_copy_recs(), copied too
many fields in the page header, overwriting PAGE_BTR_SEG_LEAF and
PAGE_BTR_SEG_TOP when splitting the B-tree root. This caused
corruption of compressed tables. Furthermore, the lock table and
PAGE_BTR_SEG_TOP when splitting the B-tree root. This caused
corruption of compressed tables. Furthermore, the lock table and
the adaptive hash index would be corrupted, because we forgot to
update them when invoking page_zip_copy_recs().
......@@ -69,10 +110,10 @@
* handler/handler0alter.cc, include/row0merge.h, row/row0merge.c,
row/row0mysql.c:
Fix some locking issues, mainly in fast index creation. The
Fix some locking issues, mainly in fast index creation. The
InnoDB data dictionary cache should be latched whenever a
transaction is holding locks on any data dictionary tables.
Otherwise, lock waits or deadlocks could occur. Furthermore, the
Otherwise, lock waits or deadlocks could occur. Furthermore, the
data dictionary transaction must be committed (and the locks
released) before the data dictionary latch is released.
......@@ -92,13 +133,14 @@
2008-10-08 The InnoDB Team
* dict/dict0crea.c, trx/trx0roll.c, include/row0mysql.h,
row/row0merge.c, row/row0mysql.c: When dropping a table, hold the
data dictionary latch until the transaction has been committed.
The data dictionary latch is supposed to prevent lock waits and
deadlocks in the data dictionary tables. Due to this bug,
DROP TABLE could cause a deadlock or hang. Note that because of
Bug#33650 and Bug#39833, MySQL may also drop a (temporary) table
when executing CREATE INDEX or ALTER TABLE ... ADD INDEX.
row/row0merge.c, row/row0mysql.c:
When dropping a table, hold the data dictionary latch until the
transaction has been committed. The data dictionary latch is
supposed to prevent lock waits and deadlocks in the data
dictionary tables. Due to this bug, DROP TABLE could cause a
deadlock or hang. Note that because of Bug#33650 and Bug#39833,
MySQL may also drop a (temporary) table when executing CREATE INDEX
or ALTER TABLE ... ADD INDEX.
2008-10-04 The InnoDB Team
......@@ -137,8 +179,8 @@
* mysql-test/innodb-index.test, mysql-test/innodb-index.result,
mysql-test/innodb-timeout.test, mysql-test/innodb-timeout.result,
srv/srv0srv.c, include/srv0srv.h,
handler/ha_innodb.cc, include/ha_prototypes.h:
srv/srv0srv.c, include/srv0srv.h, handler/ha_innodb.cc,
include/ha_prototypes.h:
Fix Bug#36285 innodb_lock_wait_timeout is not dynamic, not per session
2008-09-19 The InnoDB Team
......@@ -151,15 +193,14 @@
2008-09-17 The InnoDB Team
* mysql-test/innodb.result, mysql-test/innodb-zip.result,
mysql-test/innodb-zip.test, mysql-test/innodb.test,
ibuf/ibuf0ibuf.c, dict/dict0crea.c, dict/dict0load.c, dict/dict0boot.c,
include/dict0dict.h, include/trx0trx.h,
dict/dict0dict.c, trx/trx0trx.c,
include/ha_prototypes.h, handler/ha_innodb.cc:
mysql-test/innodb-zip.test, mysql-test/innodb.test, ibuf/ibuf0ibuf.c,
dict/dict0crea.c, dict/dict0load.c, dict/dict0boot.c,
include/dict0dict.h, include/trx0trx.h, dict/dict0dict.c,
trx/trx0trx.c, include/ha_prototypes.h, handler/ha_innodb.cc:
When creating an index in innodb_strict_mode, check that the
maximum record size will never exceed the B-tree page size limit.
For uncompressed tables, there should always be enough space for
two records in an empty B-tree page. For compressed tables, there
two records in an empty B-tree page. For compressed tables, there
should be enough space for storing two node pointer records or one
data record in an empty page in uncompressed format.
The purpose of this check is to guarantee that INSERT or UPDATE
......@@ -168,12 +209,11 @@
2008-09-17 The InnoDB Team
* btr/btr0cur.c, data/data0data.c, include/page0zip.h,
include/page0zip.ic, page/page0zip.c,
mysql-test/innodb_bug36172.test:
include/page0zip.ic, page/page0zip.c, mysql-test/innodb_bug36172.test:
Prevent infinite B-tree page splits in compressed tables by
ensuring that there will always be enough space for two node
pointer records in an empty B-tree page. Also, require that at
least one data record will fit in an empty compressed page. This
pointer records in an empty B-tree page. Also, require that at
least one data record will fit in an empty compressed page. This
will reduce the maximum size of records in compressed tables.
2008-09-09 The InnoDB Team
......@@ -429,7 +469,7 @@
2008-04-29 The InnoDB Team
* handler/i_s.cc, include/srv0start.h, srv/srv0start.c:
* handler/i_s.cc, include/srv0start.h, srv/srv0start.c:
Fix Bug#36310 InnoDB plugin crash
2008-04-23 The InnoDB Team
......
......@@ -3648,25 +3648,6 @@ dict_create_foreign_constraints_low(
goto loop;
}
/**************************************************************************
Determines whether a string starts with the specified keyword. */
UNIV_INTERN
ibool
dict_str_starts_with_keyword(
/*=========================*/
/* out: TRUE if str starts
with keyword */
void* mysql_thd, /* in: MySQL thread handle */
const char* str, /* in: string to scan for keyword */
const char* keyword) /* in: keyword to look for */
{
struct charset_info_st* cs = innobase_get_charset(mysql_thd);
ibool success;
dict_accept(cs, str, keyword, &success);
return(success);
}
/*************************************************************************
Scans a table create SQL string and adds to the data dictionary the foreign
key constraints declared in the string. This function should be called after
......
......@@ -58,7 +58,7 @@ dict_mem_table_create(
table->cols = mem_heap_alloc(heap, (n_cols + DATA_N_SYS_COLS)
* sizeof(dict_col_t));
table->auto_inc_lock = mem_heap_alloc(heap, lock_get_size());
table->autoinc_lock = mem_heap_alloc(heap, lock_get_size());
mutex_create(&table->autoinc_mutex, SYNC_DICT_AUTOINC_MUTEX);
......
EXPORTS
_mysql_plugin_interface_version_
_mysql_sizeof_struct_st_plugin_
_mysql_plugin_declarations_
This diff is collapsed.
......@@ -18,6 +18,7 @@ extern "C" {
}
#include "ha_innodb.h"
#include "handler0vars.h"
/*****************************************************************
Copies an InnoDB column to a MySQL field. This function is
......
/***********************************************************************
This file contains accessor functions for dynamic plugin on Windows.
(c) 2008 Innobase Oy
***********************************************************************/
#if defined __WIN__ && defined MYSQL_DYNAMIC_PLUGIN
/***********************************************************************
This is a list of externals that can not be resolved by delay loading.
They have to be resolved indirectly via their addresses in the .map file.
All of them are external variables. */
extern CHARSET_INFO* wdl_my_charset_bin;
extern CHARSET_INFO* wdl_my_charset_latin1;
extern CHARSET_INFO* wdl_my_charset_filename;
extern CHARSET_INFO** wdl_system_charset_info;
extern CHARSET_INFO** wdl_default_charset_info;
extern CHARSET_INFO** wdl_all_charsets;
extern system_variables* wdl_global_system_variables;
extern char* wdl_mysql_real_data_home;
extern char** wdl_mysql_data_home;
extern char** wdl_tx_isolation_names;
extern char** wdl_binlog_format_names;
extern char* wdl_reg_ext;
extern pthread_mutex_t* wdl_LOCK_thread_count;
extern key_map* wdl_key_map_full;
extern MY_TMPDIR* wdl_mysql_tmpdir_list;
extern bool* wdl_mysqld_embedded;
extern uint* wdl_lower_case_table_names;
extern ulong* wdl_specialflag;
extern int* wdl_my_umask;
#define my_charset_bin (*wdl_my_charset_bin)
#define my_charset_latin1 (*wdl_my_charset_latin1)
#define my_charset_filename (*wdl_my_charset_filename)
#define system_charset_info (*wdl_system_charset_info)
#define default_charset_info (*wdl_default_charset_info)
#define all_charsets (wdl_all_charsets)
#define global_system_variables (*wdl_global_system_variables)
#define mysql_real_data_home (wdl_mysql_real_data_home)
#define mysql_data_home (*wdl_mysql_data_home)
#define tx_isolation_names (wdl_tx_isolation_names)
#define binlog_format_names (wdl_binlog_format_names)
#define reg_ext (wdl_reg_ext)
#define LOCK_thread_count (*wdl_LOCK_thread_count)
#define key_map_full (*wdl_key_map_full)
#define mysql_tmpdir_list (*wdl_mysql_tmpdir_list)
#define mysqld_embedded (*wdl_mysqld_embedded)
#define lower_case_table_names (*wdl_lower_case_table_names)
#define specialflag (*wdl_specialflag)
#define my_umask (*wdl_my_umask)
#endif
......@@ -25,6 +25,7 @@ extern "C" {
#include "ha_prototypes.h" /* for innobase_convert_name() */
#include "srv0start.h" /* for srv_was_started */
}
#include "handler0vars.h"
static const char plugin_author[] = "Innobase Oy";
......
......@@ -36,3 +36,16 @@ ib_thd_get_thread_id(
{
return((unsigned long) ((THD*) thd)->thread_id);
}
/* http://bugs.mysql.com/40360 */
/* http://lists.mysql.com/commits/57450 */
/**
See if the binary log is engaged for a thread, i.e., open and
LOG_BIN is set.
@return @c true if the binlog is active, @c false otherwise.
*/
my_bool ib_bin_log_is_engaged(const MYSQL_THD thd)
{
return mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG);
}
This diff is collapsed.
......@@ -567,5 +567,5 @@ dtype_get_sql_null_size(
const dtype_t* type) /* in: type */
{
return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len,
type->mbminlen, type->mbmaxlen) > 0);
type->mbminlen, type->mbmaxlen));
}
......@@ -299,17 +299,6 @@ dict_table_replace_index_in_foreign_list(
/*=====================================*/
dict_table_t* table, /* in/out: table */
dict_index_t* index); /* in: index to be replaced */
/**************************************************************************
Determines whether a string starts with the specified keyword. */
UNIV_INTERN
ibool
dict_str_starts_with_keyword(
/*=========================*/
/* out: TRUE if str starts
with keyword */
void* mysql_thd, /* in: MySQL thread handle */
const char* str, /* in: string to scan for keyword */
const char* keyword); /* in: keyword to look for */
/*************************************************************************
Checks if a index is defined for a foreign key constraint. Index is a part
of a foreign key constraint if the index is referenced by foreign key
......
......@@ -24,6 +24,7 @@ Created 1/8/1996 Heikki Tuuri
#include "lock0types.h"
#include "hash0hash.h"
#include "que0types.h"
#include "trx0types.h"
/* Type flags of an index: OR'ing of the flags is allowed to define a
combination of types */
......@@ -381,13 +382,6 @@ struct dict_table_struct{
on the table: we cannot drop the table while
there are foreign key checks running on
it! */
lock_t* auto_inc_lock;/* a buffer for an auto-inc lock
for this table: we allocate the memory here
so that individual transactions can get it
and release it without a need to allocate
space from the lock heap of the trx:
otherwise the lock heap would grow rapidly
if we do a large insert from a select */
dulint query_cache_inv_trx_id;
/* transactions whose trx id < than this
number are not allowed to store to the MySQL
......@@ -438,12 +432,33 @@ struct dict_table_struct{
any latch, because this is only used for
heuristics */
/*----------------------*/
/* The following fields are used by the
AUTOINC code. The actual collection of
tables locked during AUTOINC read/write is
kept in trx_t. In order to quickly determine
whether a transaction has locked the AUTOINC
lock we keep a pointer to the transaction
here in the autoinc_trx variable. This is to
avoid acquiring the kernel mutex and scanning
the vector in trx_t.
When an AUTOINC lock has to wait, the
corresponding lock instance is created on
the trx lock heap rather than use the
pre-allocated instance in autoinc_lock below.*/
lock_t* autoinc_lock;
/* a buffer for an AUTOINC lock
for this table: we allocate the memory here
so that individual transactions can get it
and release it without a need to allocate
space from the lock heap of the trx:
otherwise the lock heap would grow rapidly
if we do a large insert from a select */
mutex_t autoinc_mutex;
/* mutex protecting the autoincrement
counter */
ib_uint64_t autoinc;/* autoinc counter value to give to the
next inserted row */
/*----------------------*/
ulong n_waiting_or_granted_auto_inc_locks;
/* This counter is used to track the number
of granted and pending autoinc locks on this
......@@ -453,6 +468,9 @@ struct dict_table_struct{
acquired the AUTOINC lock or not. Of course
only one transaction can be granted the
lock but there can be multiple waiters. */
const trx_t* autoinc_trx;
/* The transaction that currently holds the
the AUTOINC lock on this table. */
/*----------------------*/
#ifdef UNIV_DEBUG
......
......@@ -18,6 +18,7 @@ Created 5/7/1996 Heikki Tuuri
#include "lock0types.h"
#include "read0types.h"
#include "hash0hash.h"
#include "ut0vec.h"
#ifdef UNIV_DEBUG
extern ibool lock_print_waits;
......@@ -490,14 +491,6 @@ lock_table_unlock(
/*==============*/
lock_t* lock); /* in: lock */
/*************************************************************************
Releases an auto-inc lock a transaction possibly has on a table.
Releases possible other transactions waiting for this lock. */
UNIV_INTERN
void
lock_table_unlock_auto_inc(
/*=======================*/
trx_t* trx); /* in: transaction */
/*************************************************************************
Releases transaction locks, and releases possible other transactions waiting
because of these locks. */
UNIV_INTERN
......@@ -653,6 +646,13 @@ ulint
lock_number_of_rows_locked(
/*=======================*/
trx_t* trx); /* in: transaction */
/***********************************************************************
Release all the transaction's autoinc locks. */
UNIV_INTERN
void
lock_release_autoinc_locks(
/*=======================*/
trx_t* trx); /* in/out: transaction */
/***********************************************************************
Gets the type of a lock. Non-inline version for using outside of the
......
......@@ -15,6 +15,9 @@ here. In a perfect world this file exists but is empty.
Created November 07, 2007 Vasil Dimov
*******************************************************/
#include <my_global.h> /* for my_bool */
#include <mysql/plugin.h> /* for MYSQL_THD */
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
......@@ -32,3 +35,13 @@ ib_thd_get_thread_id(
#ifdef __cplusplus
}
#endif /* __cplusplus */
/* http://bugs.mysql.com/40360 */
/* http://lists.mysql.com/commits/57450 */
/**
See if the binary log is engaged for a thread, i.e., open and
LOG_BIN is set.
@return @c true if the binlog is active, @c false otherwise.
*/
my_bool ib_bin_log_is_engaged(const MYSQL_THD thd);
......@@ -163,12 +163,12 @@ row_update_prebuilt_trx(
handle */
trx_t* trx); /* in: transaction handle */
/*************************************************************************
Unlocks an AUTO_INC type lock possibly reserved by trx. */
Unlocks AUTO_INC type locks that were possibly reserved by a trx. */
UNIV_INTERN
void
row_unlock_table_autoinc_for_mysql(
/*===============================*/
trx_t* trx); /* in: transaction */
trx_t* trx); /* in/out: transaction */
/*************************************************************************
Sets an AUTO_INC type lock on the table mentioned in prebuilt. The
AUTO_INC lock gives exclusive access to the auto-inc counter of the
......
......@@ -132,8 +132,6 @@ extern ulint srv_fast_shutdown; /* If this is 1, do not do a
transactions). */
extern ibool srv_innodb_status;
extern ibool srv_stats_on_metadata;
extern unsigned long long srv_stats_sample_pages;
extern ibool srv_use_doublewrite_buf;
......
......@@ -18,6 +18,7 @@ Created 3/26/1996 Heikki Tuuri
#include "read0types.h"
#include "dict0types.h"
#include "trx0xa.h"
#include "ut0vec.h"
/* Dummy session used currently in MySQL interface */
extern sess_t* trx_dummy_sess;
......@@ -601,9 +602,6 @@ struct trx_struct{
to srv_conc_innodb_enter, if the value
here is > 0, we decrement this by 1 */
/*------------------------------*/
lock_t* auto_inc_lock; /* possible auto-inc lock reserved by
the transaction; note that it is also
in the lock list trx_locks */
dict_index_t* new_rec_locks[2];/* these are normally NULL; if
srv_locks_unsafe_for_binlog is TRUE
or session is using READ COMMITTED
......@@ -735,9 +733,15 @@ struct trx_struct{
trx_undo_arr_t* undo_no_arr; /* array of undo numbers of undo log
records which are currently processed
by a rollback operation */
/*------------------------------*/
ulint n_autoinc_rows; /* no. of AUTO-INC rows required for
an SQL statement. This is useful for
multi-row INSERTs */
ib_vector_t* autoinc_locks; /* AUTOINC locks held by this
transaction. Note that these are
also in the lock list trx_locks. This
vector needs to be freed explicitly
when the trx_t instance is desrtoyed */
/*------------------------------*/
char detailed_error[256]; /* detailed error message for last
error, or empty. */
......
......@@ -11,7 +11,7 @@ Created 1/20/1994 Heikki Tuuri
#define INNODB_VERSION_MAJOR 1
#define INNODB_VERSION_MINOR 0
#define INNODB_VERSION_BUGFIX 1
#define INNODB_VERSION_BUGFIX 2
/* The following is the InnoDB version as shown in
SELECT plugin_version FROM information_schema.plugins;
......
......@@ -175,20 +175,11 @@ ut_fold_string(
/* out: folded value */
const char* str) /* in: null-terminated string */
{
#ifdef UNIV_DEBUG
ulint i = 0;
#endif
ulint fold = 0;
ut_ad(str);
while (*str != '\0') {
#ifdef UNIV_DEBUG
i++;
ut_a(i < 100);
#endif
fold = ut_fold_ulint_pair(fold, (ulint)(*str));
str++;
}
......
......@@ -46,7 +46,16 @@ ulint
ib_vector_size(
/*===========*/
/* out: number of elements in vector */
ib_vector_t* vec); /* in: vector */
const ib_vector_t* vec); /* in: vector */
/********************************************************************
Test whether a vector is empty or not. */
UNIV_INLINE
ibool
ib_vector_is_empty(
/*===============*/
/* out: TRUE if empty */
const ib_vector_t* vec); /* in: vector */
/********************************************************************
Get the n'th element. */
......@@ -58,6 +67,23 @@ ib_vector_get(
ib_vector_t* vec, /* in: vector */
ulint n); /* in: element index to get */
/********************************************************************
Remove the last element from the vector. */
UNIV_INLINE
void*
ib_vector_pop(
/*==========*/
ib_vector_t* vec); /* in: vector */
/********************************************************************
Free the underlying heap of the vector. Note that vec is invalid
after this call. */
UNIV_INLINE
void
ib_vector_free(
/*===========*/
ib_vector_t* vec); /* in,own: vector */
/* See comment at beginning of file. */
struct ib_vector_struct {
mem_heap_t* heap; /* heap */
......
......@@ -5,7 +5,7 @@ ulint
ib_vector_size(
/*===========*/
/* out: number of elements in vector */
ib_vector_t* vec) /* in: vector */
const ib_vector_t* vec) /* in: vector */
{
return(vec->used);
}
......@@ -24,3 +24,47 @@ ib_vector_get(
return(vec->data[n]);
}
/********************************************************************
Remove the last element from the vector. */
UNIV_INLINE
void*
ib_vector_pop(
/*==========*/
/* out: last vector element */
ib_vector_t* vec) /* in/out: vector */
{
void* elem;
ut_a(vec->used > 0);
--vec->used;
elem = vec->data[vec->used];
ut_d(vec->data[vec->used] = NULL);
UNIV_MEM_INVALID(&vec->data[vec->used], sizeof(*vec->data));
return(elem);
}
/********************************************************************
Free the underlying heap of the vector. Note that vec is invalid
after this call. */
UNIV_INLINE
void
ib_vector_free(
/*===========*/
ib_vector_t* vec) /* in, own: vector */
{
mem_heap_free(vec->heap);
}
/********************************************************************
Test whether a vector is empty or not. */
UNIV_INLINE
ibool
ib_vector_is_empty(
/*===============*/ /* out: TRUE if empty else FALSE */
const ib_vector_t* vec) /* in vector to test */
{
return(ib_vector_size(vec) == 0);
}
......@@ -2166,24 +2166,25 @@ static
void
lock_grant(
/*=======*/
lock_t* lock) /* in: waiting lock request */
lock_t* lock) /* in/out: waiting lock request */
{
ut_ad(mutex_own(&kernel_mutex));
lock_reset_lock_and_trx_wait(lock);
if (lock_get_mode(lock) == LOCK_AUTO_INC) {
trx_t* trx = lock->trx;
dict_table_t* table = lock->un_member.tab_lock.table;
if (lock->trx->auto_inc_lock != NULL) {
if (table->autoinc_trx == trx) {
fprintf(stderr,
"InnoDB: Error: trx already had"
" an AUTO-INC lock!\n");
}
/* Store pointer to lock to trx so that we know to
release it at the end of the SQL statement */
} else {
table->autoinc_trx = trx;
lock->trx->auto_inc_lock = lock;
ib_vector_push(trx->autoinc_locks, lock);
}
}
#ifdef UNIV_DEBUG
......@@ -3531,15 +3532,16 @@ lock_table_create(
++table->n_waiting_or_granted_auto_inc_locks;
}
/* For AUTOINC locking we reuse the lock instance only if
there is no wait involved else we allocate the waiting lock
from the transaction lock heap. */
if (type_mode == LOCK_AUTO_INC) {
/* Only one trx can have the lock on the table
at a time: we may use the memory preallocated
to the table object */
lock = table->auto_inc_lock;
lock = table->autoinc_lock;
table->autoinc_trx = trx;
ut_a(trx->auto_inc_lock == NULL);
trx->auto_inc_lock = lock;
ib_vector_push(trx->autoinc_locks, lock);
} else {
lock = mem_heap_alloc(trx->lock_heap, sizeof(lock_t));
}
......@@ -3571,16 +3573,39 @@ lock_table_remove_low(
/*==================*/
lock_t* lock) /* in: table lock */
{
dict_table_t* table;
trx_t* trx;
dict_table_t* table;
ut_ad(mutex_own(&kernel_mutex));
table = lock->un_member.tab_lock.table;
trx = lock->trx;
table = lock->un_member.tab_lock.table;
/* Remove the table from the transaction's AUTOINC vector, if
the lock that is being release is an AUTOINC lock. */
if (lock_get_mode(lock) == LOCK_AUTO_INC) {
/* The table's AUTOINC lock can get transferred to
another transaction before we get here. */
if (table->autoinc_trx == trx) {
table->autoinc_trx = NULL;
}
/* The locks must be freed in the reverse order from
the one in which they were acquired. This is to avoid
traversing the AUTOINC lock vector unnecessarily.
We only store locks that were granted in the
trx->autoinc_locks vector (see lock_table_create()
and lock_grant()). Therefore it can be empty and we
need to check for that. */
if (lock == trx->auto_inc_lock) {
trx->auto_inc_lock = NULL;
if (!ib_vector_is_empty(trx->autoinc_locks)) {
lock_t* autoinc_lock;
autoinc_lock = ib_vector_pop(trx->autoinc_locks);
ut_a(autoinc_lock == lock);
}
ut_a(table->n_waiting_or_granted_auto_inc_locks > 0);
--table->n_waiting_or_granted_auto_inc_locks;
......@@ -3955,24 +3980,6 @@ lock_table_unlock(
mutex_exit(&kernel_mutex);
}
/*************************************************************************
Releases an auto-inc lock a transaction possibly has on a table.
Releases possible other transactions waiting for this lock. */
UNIV_INTERN
void
lock_table_unlock_auto_inc(
/*=======================*/
trx_t* trx) /* in: transaction */
{
if (trx->auto_inc_lock) {
mutex_enter(&kernel_mutex);
lock_table_dequeue(trx->auto_inc_lock);
mutex_exit(&kernel_mutex);
}
}
/*************************************************************************
Releases transaction locks, and releases possible other transactions waiting
because of these locks. */
......@@ -4032,9 +4039,9 @@ lock_release_off_kernel(
lock = UT_LIST_GET_LAST(trx->trx_locks);
}
mem_heap_empty(trx->lock_heap);
ut_a(ib_vector_size(trx->autoinc_locks) == 0);
ut_a(trx->auto_inc_lock == NULL);
mem_heap_empty(trx->lock_heap);
}
/*************************************************************************
......@@ -4054,6 +4061,11 @@ lock_cancel_waiting_and_release(
} else {
ut_ad(lock_get_type_low(lock) & LOCK_TABLE);
if (lock->trx->autoinc_locks != NULL) {
/* Release the transaction's AUTOINC locks/ */
lock_release_autoinc_locks(lock->trx);
}
lock_table_dequeue(lock);
}
......@@ -5386,6 +5398,60 @@ lock_clust_rec_read_check_and_lock_alt(
return(ret);
}
/***********************************************************************
Release the last lock from the transaction's autoinc locks. */
UNIV_INLINE
void
lock_release_autoinc_last_lock(
/*===========================*/
ib_vector_t* autoinc_locks) /* in/out: vector of AUTOINC locks */
{
ulint last;
lock_t* lock;
ut_ad(mutex_own(&kernel_mutex));
ut_a(!ib_vector_is_empty(autoinc_locks));
/* The lock to be release must be the last lock acquired. */
last = ib_vector_size(autoinc_locks) - 1;
lock = ib_vector_get(autoinc_locks, last);
/* Should have only AUTOINC locks in the vector. */
ut_a(lock_get_mode(lock) == LOCK_AUTO_INC);
ut_a(lock_get_type(lock) == LOCK_TABLE);
ut_a(lock->un_member.tab_lock.table != NULL);
/* This will remove the lock from the trx autoinc_locks too. */
lock_table_dequeue(lock);
}
/***********************************************************************
Release all the transaction's autoinc locks. */
UNIV_INTERN
void
lock_release_autoinc_locks(
/*=======================*/
trx_t* trx) /* in/out: transaction */
{
ut_ad(mutex_own(&kernel_mutex));
ut_a(trx->autoinc_locks != NULL);
/* We release the locks in the reverse order. This is to
avoid searching the vector for the element to delete at
the lower level. See (lock_table_remove_low()) for details. */
while (!ib_vector_is_empty(trx->autoinc_locks)) {
/* lock_table_remove_low() will also remove the lock from
the transaction's autoinc_locks vector. */
lock_release_autoinc_last_lock(trx->autoinc_locks);
}
/* Should release all locks. */
ut_a(ib_vector_is_empty(trx->autoinc_locks));
}
/***********************************************************************
Gets the type of a lock. Non-inline version for using outside of the
lock module. */
......
......@@ -69,8 +69,6 @@ t1 CREATE TABLE `t1` (
explain select * from t1 force index(c) order by c;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL c 10 NULL 4
drop index c on t1;
ERROR 42000: This table type requires a primary key
alter table t1 add primary key (a), drop index c;
show create table t1;
Table Create Table
......
......@@ -30,8 +30,6 @@ 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;
--error ER_REQUIRES_PRIMARY_KEY
drop index c on t1;
alter table t1 add primary key (a), drop index c;
show create table t1;
--error ER_MULTIPLE_PRI_KEY
......
SET TX_ISOLATION='READ-COMMITTED';
CREATE TABLE bug40360 (a INT) engine=innodb;
INSERT INTO bug40360 VALUES (1);
DROP TABLE bug40360;
#
# Make sure http://bugs.mysql.com/40360 remains fixed.
#
-- source include/not_embedded.inc
-- source include/have_innodb.inc
SET TX_ISOLATION='READ-COMMITTED';
# This is the default since MySQL 5.1.29 SET BINLOG_FORMAT='STATEMENT';
CREATE TABLE bug40360 (a INT) engine=innodb;
INSERT INTO bug40360 VALUES (1);
DROP TABLE bug40360;
......@@ -11,7 +11,7 @@ in the MySQL source repository.
Index: storage/innobase/mysql-test/innodb-index.result
===================================================================
--- storage/innobase/mysql-test/innodb-index.result (revision 2229)
--- 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,
......@@ -35,7 +35,7 @@ Index: storage/innobase/mysql-test/innodb-index.result
`b` int(11) DEFAULT NULL,
Index: storage/innobase/mysql-test/innodb-index.test
===================================================================
--- storage/innobase/mysql-test/innodb-index.test (revision 2229)
--- 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
......@@ -57,6 +57,6 @@ Index: storage/innobase/mysql-test/innodb-index.test
alter table t1 add unique index (c), add index (d);
show create table t1;
explain select * from t1 force index(c) order by c;
--error ER_REQUIRES_PRIMARY_KEY
drop index c on t1;
alter table t1 add primary key (a), drop index c;
show create table t1;
--error ER_MULTIPLE_PRI_KEY
......@@ -852,19 +852,18 @@ row_update_statistics_if_needed(
}
/*************************************************************************
Unlocks an AUTO_INC type lock possibly reserved by trx. */
Unlocks AUTO_INC type locks that were possibly reserved by a trx. */
UNIV_INTERN
void
row_unlock_table_autoinc_for_mysql(
/*===============================*/
trx_t* trx) /* in: transaction */
trx_t* trx) /* in/out: transaction */
{
if (!trx->auto_inc_lock) {
mutex_enter(&kernel_mutex);
return;
}
lock_release_autoinc_locks(trx);
lock_table_unlock_auto_inc(trx);
mutex_exit(&kernel_mutex);
}
/*************************************************************************
......@@ -881,16 +880,20 @@ row_lock_table_autoinc_for_mysql(
row_prebuilt_t* prebuilt) /* in: prebuilt struct in the MySQL
table handle */
{
trx_t* trx = prebuilt->trx;
ins_node_t* node = prebuilt->ins_node;
que_thr_t* thr;
ulint err;
ibool was_lock_wait;
trx_t* trx = prebuilt->trx;
ins_node_t* node = prebuilt->ins_node;
const dict_table_t* table = prebuilt->table;
que_thr_t* thr;
ulint err;
ibool was_lock_wait;
ut_ad(trx);
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
if (trx->auto_inc_lock) {
/* If we already hold an AUTOINC lock on the table then do nothing.
Note: We peek at the value of the current owner without acquiring
the kernel mutex. **/
if (trx == table->autoinc_trx) {
return(DB_SUCCESS);
}
......
-- execute these to install InnoDB if it is built as a dynamic plugin
INSTALL PLUGIN innodb SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_trx SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_locks SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_lock_waits SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_cmp SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_cmp_reset SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_cmpmem SONAME 'ha_innodb.dll';
INSTALL PLUGIN innodb_cmpmem_reset SONAME 'ha_innodb.dll';
......@@ -299,8 +299,6 @@ UNIV_INTERN ulint srv_fast_shutdown = 0;
/* Generate a innodb_status.<pid> file */
UNIV_INTERN ibool srv_innodb_status = FALSE;
UNIV_INTERN ibool srv_stats_on_metadata = TRUE;
/* When estimating number of different key values in an index, sample
this many index pages */
UNIV_INTERN unsigned long long srv_stats_sample_pages = 8;
......
......@@ -169,8 +169,6 @@ trx_create(
trx->declared_to_be_inside_innodb = FALSE;
trx->n_tickets_to_enter_innodb = 0;
trx->auto_inc_lock = NULL;
trx->global_read_view_heap = mem_heap_create(256);
trx->global_read_view = NULL;
trx->read_view = NULL;
......@@ -181,6 +179,10 @@ trx_create(
trx->n_autoinc_rows = 0;
/* Remember to free the vector explicitly. */
trx->autoinc_locks = ib_vector_create(
mem_heap_create(sizeof(ib_vector_t) + sizeof(void*) * 4), 4);
trx_reset_new_rec_lock_info(trx);
return(trx);
......@@ -305,7 +307,6 @@ trx_free(
ut_a(UT_LIST_GET_LEN(trx->wait_thrs) == 0);
ut_a(!trx->has_search_latch);
ut_a(!trx->auto_inc_lock);
ut_a(trx->dict_operation_lock_mode == 0);
......@@ -323,6 +324,10 @@ trx_free(
ut_a(trx->read_view == NULL);
ut_a(ib_vector_is_empty(trx->autoinc_locks));
/* We allocated a dedicated heap for the vector. */
ib_vector_free(trx->autoinc_locks);
mem_free(trx);
}
......
This directory contains patches that need to be applied to the MySQL
source tree in order to build the dynamic plugin on Windows --
HA_INNODB.DLL. Please note the followings when adding the patches:
* The patch must be applied from the mysql top-level source directory.
patch -p0 < win-plugin.diff
* The patch filenames end in ".diff".
* All patches here are expected to apply cleanly to the latest MySQL 5.1
tree when storage/innobase is replaced with this InnoDB branch.
When applying the patch, the following files will be modified:
* CMakeLists.txt
* sql/CMakeLists.txt
* win/configure.js
* win/build-vs71.bat
* win/build-vs8.bat
* win/build-vs8_x64.bat
Also, two new files will be added:
* sql/mysqld.def
* sql/mysqld_x64.def
You can get "patch" utility for Windows from http://unxutils.sourceforge.net/
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment