InnoDB Change History

Starting from 4.0.22 and 4.1.5, all InnoDB changes are included in the MySQL Change History, and this manual section is no longer separately maintained.

MySQL/InnoDB-4.0.21, September 10, 2004

Functionality added or changed:

  • Renamed the innodb.status.<pid> files (created in the data directory) to innodb_status.<pid>. This avoids problems on filesystems that do not allow multiple periods in filenames.

  • Added innodb_status_file system variable to mysqld to control whether output from SHOW INNODB STATUS is written to a innodb_status.<pid> file in the data directory. By default, the file is not created. To create it, start mysqld with the --innodb_status_file=1 option.

  • Changes for NetWare to exit InnoDB gracefully on NetWare even in a case of an assertion failure, instead of intentionally crashing the `mysqld' server process.

Bugs fixed:

  • Fixed a bug in ON DELETE CASCADE and ON UPDATE CASCADE foreign key constraints: long chains of cascaded operations would cause a stack overflow and crash the server. Cascaded operations are now limited to 15 levels. (Bug #4446)

  • Fixed a possible bug in LOCK TABLES introduced in MySQL/InnoDB-4.0.19: The count of tables explicitly locked by a transaction was incremented only after the locks were granted, but decremented when the lock structures were destroyed.

  • Fixed a bug in UNLOCK TABLES in AUTOCOMMIT=0 mode, introduced in MySQL/InnoDB-4.0.19: The memory allocated for some locks acquired by the transaction could be deallocated before those locks were released. The bug can lead to crashes and memory corruption of the buffer pool when the transaction acquires a large number of locks (table locks or row-level locks).

  • Increment the InnoDB watchdog timeout during CHECK TABLE. A long-running CHECK TABLE would cause InnoDB to complain about a 'long semaphore wait', and crash the server, if a query had to wait more than 600 seconds behind that CHECK TABLE operation. (Bug #2694)

  • If you configure innodb_additional_mem_pool_size so small that InnoDB memory allocation spills over from it, then every 4 billionth spill may cause memory corruption. A symptom is a printout like below in the .err log. The workaround is to make innodb_additional_mem_pool_size big enough to hold all memory allocation. Use SHOW INNODB STATUS to determine that there is plenty of free space available in the additional mem pool, and the total allocated memory stays rather constant.

    InnoDB: Error: Mem area size is 0. Possibly a memory overrun of the
    InnoDB: previous allocated area!
    InnoDB: Apparent memory corruption: mem dump  len 500; hex
    
  • The special meaning of the table names innodb_monitor, innodb_lock_monitor, innodb_tablespace_monitor, innodb_table_monitor, and innodb_validate in CREATE TABLE and DROP TABLE statements was accidentally removed in MySQL/InnoDB-4.0.19. The diagnostic functions attached to these special table names (see the section called “SHOW INNODB STATUS and the InnoDB Monitors”) are accessible again in MySQL/InnoDB-4.0.21.

  • When the private SQL parser of InnoDB was modified in MySQL/InnoDB-4.0.19 in order to allow the use of the apostrophe (‘'’) in table and column names, the fix relied on a previously unused function mem_realloc(), whose implementation was incorrect. As a result, InnoDB can incorrectly parse column and table names as the empty string. The InnoDB realloc() implementation has been corrected in MySQL/InnoDB-4.0.21.

  • Fixed a glitch introduced in 4.0.18 and 4.1.2: in SHOW TABLE STATUS InnoDB systematically overestimated the row count by 1 if the table fit on a single 16 kB data page.

  • InnoDB created temporary files with the C library function tmpfile(). On Windows, the files would be created in the root directory of the current file system. To correct this behavior, the invocations of tmpfile() were replaced with code that uses the function create_temp_file() in the MySQL portability layer. (Bug #3998)

  • If ALTER TABLE ... DROP FOREIGN KEY ... fails because of a wrong constraint name, return a table handler error number 150 instead of 152.

  • If there was little file I/O in InnoDB, but the insert buffer was used, it could happen that 'Pending normal aio reads' was bigger than 0, but the I/O handler thread did not get waken up in 600 seconds. This resulted in a hang, and crashing of InnoDB.

  • If we RENAMEd a table, InnoDB forgot to load the FOREIGN KEY constraints that reference the new table name, and forgot to check that they are compatible with the table.

MySQL/InnoDB-4.1.4, August 31, 2004

Functionality added or changed:

  • Important: Made internal representation of TIMESTAMP values in InnoDB in 4.1 to be the same as in 4.0. This difference resulted in incorrect datetime values in TIMESTAMP columns in InnoDB tables after an upgrade from 4.0 to 4.1. (Bug #4492) Warning: extra steps during upgrade required! This means that if you are upgrading from 4.1.x, where x <= 3, to 4.1.4 you should use mysqldump for saving and then restoring your InnoDB tables with TIMESTAMP columns. No conversion is needed if you upgrade from 3.23 or 4.0 to 4.1.4 or later.

  • Added a new startup option innodb_locks_unsafe_for_binlog. This option forces InnoDB not to use next-key locking in searches and index scans.

  • Added innodb_status_file system variable to mysqld to control whether output from SHOW INNODB STATUS is written to a innodb_status.<pid> file in the data directory. By default, the file is not created. To create it, start mysqld with the --innodb_status_file=1 option.

  • Changes for NetWare to exit InnoDB gracefully on NetWare even in a case of an assertion failure, instead of intentionally crashing the mysqld server process.

Bugs fixed:

  • Fixed a bug in ON DELETE CASCADE and ON UPDATE CASCADE foreign key constraints: long chains of cascaded operations would cause a stack overflow and crash the server. Cascaded operations are now limited to 15 levels. (Bug #4446)

  • Increment the InnoDB watchdog timeout during CHECK TABLE. (Bug #2694)

  • If you configure innodb_additional_mem_pool_size so small that InnoDB memory allocation spills over from it, then every 4 billionth spill may cause memory corruption. A symptom is a printout like below in the .err log.

    InnoDB: Error: Mem area size is 0. Possibly a memory overrun of the
    InnoDB: previous allocated area!
    InnoDB: Apparent memory corruption: mem dump  len 500; hex
    
  • Fixed a glitch introduced in 4.0.18 and 4.1.2: in SHOW TABLE STATUS InnoDB systematically overestimated the row count by 1 if the table fit on a single 16 kB data page.

  • InnoDB created temporary files with the C library function tmpfile(). On Windows, the files would be created in the root directory of the current file system. To correct this behavior, the invocations of tmpfile() were replaced with code that uses the function create_temp_file() in the MySQL portability layer. (Bug #3998)

  • If we RENAMEd a table, InnoDB forgot to load the foreign key constraints that reference the new table name, and forgot to check that they are compatible with the table.

  • If there was little file I/O in InnoDB, but the insert buffer was used, it could happen that 'Pending normal aio reads' was bigger than 0, but the I/O handler thread did not get waken up in 600 seconds. This resulted in a hang, and an intentional crashing of mysqld.

MySQL/InnoDB-4.1.3, June 28, 2004

Functionality added or changed:

  • Important: Starting from MySQL 4.1.3, InnoDB uses the same character set comparison functions as MySQL for non-latin1_swedish_ci character strings that are not BINARY. This changes the sorting order of space and characters < ASCII(32) in those character sets. For latin1_swedish_ci character strings and BINARY strings, InnoDB uses its own pad-spaces-at-end comparison method, which stays unchanged. If you have an InnoDB table created with MySQL 4.1.2 or earlier, with an index on a non-latin1 character set (in the case of 4.1.0 and 4.1.1 with any character set) CHAR/VARCHAR/or TEXT column that is not BINARY but may contain characters < ASCII(32), then you should do ALTER TABLE or OPTIMIZE table on it to regenerate the index, after upgrading to MySQL 4.1.3 or later.

  • OPTIMIZE TABLE for InnoDB tables is now mapped to ALTER TABLE rather than to ANALYZE TABLE.

  • Added an interface for storing the binlog offset in the InnoDB log and flushing the log.

Bugs fixed:

  • The critical bug in 4.1.2 (crash recovery skipping all .ibd files if you specify innodb_file_per_table on Unix) has been fixed. The bug was a combination of two bugs. Crash recovery ignored the files, because the attempt to lock them in the wrong mode failed. From now on, locks will only be obtained for regular files opened in read/write mode, and crash recovery will stop if an .ibd file for a table exists in a database directory but is unaccessible.

  • Do not remember the original select_lock_type inside LOCK TABLES. (Bug #4047)

  • The special meaning of the table names innodb_monitor, innodb_lock_monitor, innodb_tablespace_monitor, innodb_table_monitor, and innodb_validate in CREATE TABLE and DROP TABLE statements was accidentally removed in MySQL/InnoDB-4.1.2. The diagnostic functions attached to these special table names (see the section called “SHOW INNODB STATUS and the InnoDB Monitors”) are accessible again in MySQL/InnoDB-4.1.3.

  • When the private SQL parser of InnoDB was modified in MySQL/InnoDB-4.0.19 in order to allow the use of the apostrophe (‘'’) in table and column names, the fix relied on a previously unused function mem_realloc(), whose implementation was incorrect. As a result, InnoDB can incorrectly parse column and table names as the empty string. The InnoDB realloc() implementation has been corrected in MySQL/InnoDB-4.1.3.

  • In a clean-up of MySQL/InnoDB-4.1.2, the code for invalidating the query cache was broken. Now the query cache should be correctly invalidated for tables affected by ON UPDATE CASCADE or ON DELETE CASCADE constraints.

  • Fixed a bug: in LIKE 'abc%', the '%' did not match the empty string if the character set was not latin1_swedish_ci. This bug was fixed by changing the sorting order in these character sets. See the above note about data conversion in 4.1.3.

MySQL/InnoDB-4.1.2, May 30, 2004

NOTE: CRITICAL BUG in 4.1.2 if you specify innodb_file_per_table in my.cnf on Unix. In crash recovery InnoDB will skip the crash recovery for all .ibd files and those tables become CORRUPT! The symptom is a message Unable to lock ...ibd with lock 1, error: 9: fcntl: Bad file descriptor in the .err log in crash recovery.

Functionality added or changed:

  • Support multiple character sets. Note that tables created in other collations than latin1_swedish_ci cannot be accessed in MySQL/InnoDB 4.0.

  • Automatically create a suitable index on a FOREIGN KEY, if the user does not create one. Removes most of the cases of Error 1005 (errno 150) in table creation.

  • Do not assert in log0log.c, line 856 if ib_logfiles are too small for innodb_thread_concurrency. Instead, print instructions how to adjust my.cnf and call exit(1).

  • If MySQL tries to SELECT from an InnoDB table without setting any table locks, print a descriptive error message and assert; some subquery bugs were of this type.

  • Allow a key part length in InnoDB to be up to 3,500 bytes; this is needed so that you can create an index on a column with 255 UTF-8 characters.

  • All new features from InnoDB-4.0.17, InnoDB-4.0.18, InnoDB-4.0.19 and InnoDB-4.0.20.

Bugs fixed:

  • If you configure innodb_additional_mem_pool_size so small that InnoDB memory allocation spills over from it, then every 4 billionth spill may cause memory corruption. A symptom is a printout like below in the .err log.

    InnoDB: Error: Mem area size is 0. Possibly a memory overrun of the
    InnoDB: previous allocated area!
    InnoDB: Apparent memory corruption: mem dump  len 500; hex
    
  • Improved portability to 64-bit platforms, especially Win64.

  • Fixed an assertion failure when a purge of a table was not possible because of missing .ibd file.

  • Fixed a bug: do not retrieve all columns in a table if we only need the 'ref' of the row (usually, the PRIMARY KEY) to calculate an ORDER BY. (Bug #1942)

  • On Unix-like systems, obtain an exclusive advisory lock on InnoDB files, to prevent corruption when multiple instances of MySQL are running on the same set of data files. The Windows version of InnoDB already took a mandatory lock on the files. (Bug #3608)

  • Added a missing space to the output format of SHOW INNODB STATUS; reported by Jocelyn Fournier.

  • All bugfixes from InnoDB-4.0.17, InnoDB-4.0.18, InnoDB-4.0.19 and InnoDB-4.0.20.

MySQL/InnoDB-4.0.20, May 18, 2004

Bugs fixed:

  • Apostrophe characters now are recognized by the internal InnoDB parser and can be used within quoted table and column identifiers in FOREIGN KEY clauses.

  • Make LOCK TABLE aware of InnoDB row-level locks and InnoDB aware of locks set with LOCK TABLE. (Bug #3299)

  • Fixed race conditions in SHOW INNODB STATUS. (Bug #3596)

MySQL/InnoDB-4.0.19, May 4, 2004

Functionality added or changed:

  • Better error message when the server has to crash because the buffer pool is exhausted by the lock table or the adaptive hash index.

  • Print always the count of pending pread() and pwrite() calls if there is a long semaphore wait.

  • Improve space utilization when rows of 1,500 to 8,000 bytes are inserted in the order of the primary key.

  • Remove potential buffer overflow errors by sending diagnostic output to stderr or files instead of stdout or fixed-size memory buffers. As a side effect, the output of SHOW INNODB STATUS will be written to a file <datadir>/innodb.status.<pid> every 15 seconds.

Bugs fixed:

  • Fixed a bug: DROP DATABASE did not work if FOREIGN KEY references were defined within the database. (Bug #3058)

  • Remove unnecessary files, functions and variables. Many of these were needed in the standalone version of InnoDB. Remove debug functions and variables from non-debug build.

  • Add diagnostic code to analyze an assertion failure in ha_innodb.cc on line 2020 reported by a user. (Bug #2903)

  • Fixed a bug: in a FOREIGN KEY, ON UPDATE CASCADE was not triggered if the update changed a string to another value identical in alphabetical ordering, for example, ‘abc’ -> ‘aBc’.

  • Protect the reading of the latest foreign key error explanation buffer with a mutex; in theory, a race condition could cause SHOW INNODB STATUS print garbage characters after the error info.

  • Fixed a bug: The row count and key cardinality estimate was grossly too small if each clustered index page only contained one record.

  • Parse CONSTRAINT FOREIGN KEY correctly. (Bug #3332)

  • Fixed a memory corruption bug on Windows. The bug is present in all InnoDB versions in Windows, but it depends on how the linker places a static array in srv0srv.c, whether the bug shows itself. 4 bytes were overwritten with a pointer to a statically allocated string ‘get windows aio return value’.

  • Fix a glitch reported by Philippe Lewicki on the general mailing list: do not print a warning to the .err log if read_key fails with a lock wait timeout error 146.

  • Allow quotes to be embedded in strings in the private SQL parser of InnoDB, so that ‘'’ can be used in InnoDB table and column names. Display quotes within identifiers properly.

  • Debugging: Allow UNIV_SYNC_DEBUG to be disabled while UNIV_DEBUG is enabled.

  • Debugging: Handle magic numbers in a more consistent way.

MySQL/InnoDB-4.0.18, February 13, 2004

  • Do not allow dropping a table referenced by a FOREIGN KEY constraint, unless the user does SET FOREIGN_KEY_CHECKS=0. The error message here is somewhat misleading “Cannot delete or update a parent row...”, and must be changed in a future version 4.1.x.

  • Make InnoDB to remember the CONSTRAINT name given by a user for a FOREIGN KEY.

  • Change the print format of FOREIGN KEY constraints spanning multiple databases to `db_name`.`tbl_name`. But when parsing them, we must also accept `db_name.tbl_name`, because that was the output format in < 4.0.18.

  • An optimization in locking: If AUTOCOMMIT=1, then we do not need to make a plain SELECT set shared locks even on the SERIALIZABLE isolation level, because we know that the transaction is read-only. A read-only transaction can always be performed on the REPEATABLE READ level, and that does not endanger the serializability.

  • Implement an automatic downgrade from >= 4.1.1 -> 4.0.18 if the user has not created tables in .ibd files or used other 4.1.x features. Consult the manual section on multiple tablespaces carefully if you want to downgrade!

  • Fixed a bug: MySQL should not allow REPLACE to internally perform an UPDATE if the table is referenced by a FOREIGN KEY. The MySQL manual states that REPLACE must resolve a duplicate-key error semantically with DELETE(s) + INSERT, and not by an UPDATE. In versions < 4.0.18 and < 4.1.2, MySQL could resolve a duplicate key conflict in REPLACE by doing an UPDATE on the existing row, and FOREIGN KEY checks could behave in a semantically wrong way. (Bug #2418)

  • Fixed a bug: generate FOREIGN KEY constraint identifiers locally for each table, in the form db_name/tbl_name_ibfk_number. If the user gives the constraint name explicitly, then remember it. These changes should ensure that foreign key id's in a slave are the same as in the master, and DROP FOREIGN KEY does not break replication. (Bug #2167)

  • Fixed a bug: allow quoting of identifiers in InnoDB's FOREIGN KEY definitions with a backtick (`) and a double quote ("). You can now use also spaces in table and column names, if you quote the identifiers. (Bug #1725, Bug #2424)

  • Fixed a bug: FOREIGN KEY ... ON UPDATE/DELETE NO ACTION must check the foreign key constraint, not ignore it. Since we do not have deferred constraints in InnoDB, this bugfix makes InnoDB to check NO ACTION constraints immediately, like it checks RESTRICT constraints.

  • Fixed a bug: InnoDB crashed in RENAME TABLE if db_name.tbl_name is shorter than 5 characters. (Bug #2689)

  • Fixed a bug: in SHOW TABLE STATUS, InnoDB row count and index cardinality estimates wrapped around at 512 million in 32-bit computers. Note that unless MySQL is compiled with the BIG_TABLES option, they will still wrap around at 4 billion.

  • Fixed a bug: If there was a UNIQUE secondary index, and NULL values in that unique index, then with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many. This bug was introduced in 4.0.16. (Bug #2483)

MySQL/InnoDB-5.0.0, December 24, 2003

  • Important note: If you upgrade to MySQL 4.1.1 or higher, it is difficult to downgrade back to 4.0 or 4.1.0! That is because, for earlier versions, InnoDB is not aware of multiple tablespaces.

  • InnoDB in 5.0.0 is essentially the same as InnoDB-4.1.1 with the bugfixes of InnoDB-4.0.17 included.

MySQL/InnoDB-4.0.17, December 17, 2003

  • Fixed a bug: If you created a column prefix secondary index and updated it so that the last characters in the column prefix were spaces, InnoDB would assert in row0upd.c, line 713. The same assertion failed if you updated a column in an ordinary secondary index so that the new value was alphabetically equivalent, but had a different length. This could happen, for example, in the UTF8 character set if you updated a letter to its accented or umlaut form.

  • Fixed a bug: InnoDB could think that a secondary index record was not locked though it had been updated to an alphabetically equivalent value, for example, 'abc' -> 'aBc'.

  • Fixed a bug: If you updated a secondary index column to an alphabetically equivalent value, and rolled back your update, InnoDB failed to restore the field in the secondary index to its original value.

  • There are still several outstanding non-critical bugs reported in the MySQL bugs database. Their fixing has been delayed, because resources were allocated to the 4.1.1 release.

MySQL/InnoDB-4.1.1, December 4, 2003

  • Important note: If you upgrade to MySQL 4.1.1 or higher, you cannot downgrade to a version lower than 4.1.1 any more! That is because, for earlier versions, InnoDB is not aware of multiple tablespaces.

  • Multiple tablespaces now available for InnoDB. You can store each InnoDB type table and its indexes into a separate .ibd file into a MySQL database directory, into the same directory where the .frm file is stored.

  • The MySQL query cache now works for InnoDB tables also if AUTOCOMMIT=0, or the statements are enclosed inside BEGIN ... COMMIT.

  • Reduced InnoDB memory consumption by a few megabytes if one sets the buffer pool size < 8MB.

  • You can use raw disk partitions also in Windows.

MySQL/InnoDB-4.0.16, October 22, 2003

  • Fixed a bug: in contrary to what was said in the manual, in a locking read InnoDB set two record locks if a unique exact match search condition was used on a multi-column unique key. For a single column unique key it worked right.

  • Fixed a bug: If you used the rename trick #sql... -> rsql... to recover a temporary table, InnoDB asserted in row_mysql_lock_data_dictionary().

  • There are several outstanding non-critical bugs reported in the MySQL bugs database. Their fixing has been delayed, because resources are allocated to the upcoming 4.1.1 release.

MySQL/InnoDB-3.23.58, September 15, 2003

  • Fixed a bug: InnoDB could make the index page directory corrupt in the first B-tree page splits after mysqld startup. A symptom would be an assertion failure in page0page.c, in function page_dir_find_slot().

  • Fixed a bug: InnoDB could in rare cases return an extraneous row if a rollback, purge, and a SELECT coincided.

  • Fixed a possible hang over the btr0sea.c latch if SELECT was used inside LOCK TABLES.

  • Fixed a bug: If a single DELETE statement first managed to delete some rows and then failed in a FOREIGN KEY error or a Table is full error, MySQL did not roll back the whole SQL statement as it should.

MySQL/InnoDB-4.0.15, September 10, 2003

  • Fixed a bug: If you updated a row so that the 8000 byte maximum length (without BLOB and TEXT) was exceeded, InnoDB simply removed the record from the clustered index. In a similar insert, InnoDB would leak reserved file space extents, which would only be freed at the next mysqld startup.

  • Fixed a bug: If you used big BLOB values, and your log files were relatively small, InnoDB could in a big BLOB operation temporarily write over the log produced after the latest checkpoint. If InnoDB would crash at that moment, then the crash recovery would fail, because InnoDB would not be able to scan the log even up to the latest checkpoint. Starting from this version, InnoDB tries to ensure the latest checkpoint is young enough. If that is not possible, InnoDB prints a warning to the .err log of MySQL and advises you to make the log files bigger.

  • Fixed a bug: setting innodb_fast_shutdown=0 had no effect.

  • Fixed a bug introduced in 4.0.13: If a CREATE TABLE ended in a comment, that could cause a memory overrun.

  • Fixed a bug: If InnoDB printed Operating system error number .. in a file operation to the .err log in Windows, the error number explanation was wrong. Workaround: look at section 13.2 of http://www.innodb.com/ibman.php about Windows error numbers.

  • Fixed a bug: If you created a column prefix PRIMARY KEY like in t(a CHAR(200), PRIMARY KEY (a(10))) on a fixed-length CHAR column, InnoDB would crash even in a simple SELECT. A CHECK TABLE would report the table as corrupt, also in the case where the created key was not PRIMARY.

MySQL/InnoDB-4.0.14, July 22, 2003

  • InnoDB now supports the SAVEPOINT and ROLLBACK TO SAVEPOINT SQL statements. See http://www.innodb.com/ibman.php#Savepoints for the syntax.

  • You can now create column prefix keys like in CREATE TABLE t (a BLOB, INDEX (a(10))).

  • You can also use O_DIRECT as the innodb_flush_method on the latest versions of Linux and FreeBSD. Beware of possible bugs in those operating systems, though.

  • Fixed the checksum calculation of data pages. Previously most OS file system corruption went unnoticed. Note that if you downgrade from version >= 4.0.14 to an earlier version < 4.0.14 then in the first startup(s) InnoDB will print warnings:

    InnoDB: Warning: An inconsistent page in the doublewrite buffer
    InnoDB: space id 2552202359 page number 8245, 127'th page in dblwr buf.
    

    but that is not dangerous and can be ignored.

  • Modified the buffer pool replacement algorithm so that it tries to flush modified pages if there are no replaceable pages in the last 10 % of the LRU list. This can reduce disk I/O if the workload is a mixture of reads and writes.

  • The buffer pool checkpoint flush algorithm now tries to flush also close neighbors of the page at the end of the flush list. This can speed up database shutdown, and can also speed up disk writes if InnoDB log files are very small compared to the buffer pool size.

  • In 4.0.13 we made SHOW INNODB STATUS to print detailed info on the latest UNIQUE KEY error, but storing that information could slow down REPLACE significantly. We no longer store or print the info.

  • Fixed a bug: SET FOREIGN_KEY_CHECKS=0 was not replicated properly in the MySQL replication. The fix will not be backported to 3.23.

  • Fixed a bug: the parameter innodb_max_dirty_pages_pct forgot to take into account the free pages in the buffer pool. This could lead to excessive flushing even though there were lots of free pages in the buffer pool. Workaround: SET GLOBAL innodb_max_dirty_pages_pct = 100.

  • Fixed a bug: If there were big index scans then a file read request could starve and InnoDB could assert because of a very long semaphore wait.

  • Fixed a bug: If AUTOCOMMIT=1 then inside LOCK TABLES MySQL failed to do the commit after an updating SQL statement if binary logging was not on, and for SELECT statements did not commit regardless of binary logging state.

  • Fixed a bug: InnoDB could make the index page directory corrupt in the first B-tree page splits after a mysqld startup. A symptom would be an assertion in page0page.c, in function page_dir_find_slot().

  • Fixed a bug: If in a FOREIGN KEY with an UPDATE CASCADE clause the parent column was of a different internal storage length than the child column, then a cascaded update would make the column length wrong in the child table and corrupt the child table. Because of MySQL's 'silent column specification changes' a fixed-length CHAR column can change internally to a VARCHAR and cause this error.

  • Fixed a bug: If a non-latin1 character set was used and if in a FOREIGN KEY the parent column was of a different internal storage length than the child column, then all inserts to the child table would fail in a foreign key error.

  • Fixed a bug: InnoDB could complain that it cannot find the clustered index record, or in rare cases return an extraneous row if a rollback, purge, and a SELECT coincided.

  • Fixed a possible hang over the btr0sea.c latch if SELECT was used inside LOCK TABLES.

  • Fixed a bug: contrary to what the release note of 4.0.13 said, the group commit still did not work if the MySQL binary logging was on.

  • Fixed a bug: os_event_wait() did not work properly in Unix, which might have caused starvation in various log operations.

  • Fixed a bug: If a single DELETE statement first managed to delete some rows and then failed in a FOREIGN KEY error or a 'Table is full error', MySQL did not roll back the whole SQL statement as it should, and also wrote the failed statement to the binary log, reporting there a non-zero error_code.

  • Fixed a bug: the maximum allowed number of columns in a table is 1000, but InnoDB did not check that limit in CREATE TABLE, and a subsequent INSERT or SELECT from that table could cause an assertion.

MySQL/InnoDB-3.23.57, June 20, 2003

  • Changed the default value of innodb_flush_log_at_trx_commit from 0 to 1. If you have not specified it explicitly in your my.cnf, and your application runs much slower with this new release, it is because the value 1 causes a log flush to disk at each transaction commit.

  • Fixed a bug: InnoDB forgot to call pthread_mutex_destroy() when a table was dropped. That could cause memory leakage on FreeBSD and other non-Linux Unixes.

  • Fixed a bug: MySQL could erroneously return 'Empty set' if InnoDB estimated an index range size to 0 records though the range was not empty; MySQL also failed to do the next-key locking in the case of an empty index range.

  • Fixed a bug: GROUP BY and DISTINCT could treat NULL values inequal.

MySQL/InnoDB-4.0.13, May 20, 2003

  • InnoDB now supports ALTER TABLE DROP FOREIGN KEY. You have to use SHOW CREATE TABLE to find the internally generated foreign key ID when you want to drop a foreign key.

  • SHOW INNODB STATUS now prints detailed information of the latest detected FOREIGN KEY and UNIQUE KEY errors. If you do not understand why InnoDB gives the error 150 from a CREATE TABLE, you can use this statement to study the reason.

  • ANALYZE TABLE now works also for InnoDB type tables. It makes 10 random dives to each of the index trees and updates index cardinality estimates accordingly. Note that because these are only estimates, repeated runs of ANALYZE TABLE may produce different numbers. MySQL uses index cardinality estimates only in join optimization. If some join is not optimized in the right way, you may try using ANALYZE TABLE.

  • InnoDB group commit capability now works also when MySQL binary logging is switched on. There have to be > 2 client threads for the group commit to become active.

  • Changed the default value of innodb_flush_log_at_trx_commit from 0 to 1. If you have not specified it explicitly in your my.cnf, and your application runs much slower with this new release, it is because the value 1 causes a log flush to disk at each transaction commit.

  • Added a new global settable MySQL system variable innodb_max_dirty_pages_pct. It is an integer in the range 0 - 100. The default is 90. The main thread in InnoDB tries to flush pages from the buffer pool so that at most this many percents are not yet flushed at any time.

  • If innodb_force_recovery=6, do not let InnoDB do repair of corrupt pages based on the doublewrite buffer.

  • InnoDB startup now happens faster because it does not set the memory in the buffer pool to zero.

  • Fixed a bug: The InnoDB parser for FOREIGN KEY definitions was confused by the keywords 'foreign key' inside MySQL comments.

  • Fixed a bug: If you dropped a table to which there was a FOREIGN KEY reference, and later created the same table with non-matching column types, InnoDB could assert in dict0load.c, in function dict_load_table().

  • Fixed a bug: GROUP BY and DISTINCT could treat NULL values as not equal. MySQL also failed to do the next-key locking in the case of an empty index range.

  • Fixed a bug: Do not commit the current transaction when a MyISAM table is updated; this also makes CREATE TABLE not to commit an InnoDB transaction, even when binary logging is enabled.

  • Fixed a bug: We did not allow ON DELETE SET NULL to modify the same table where the delete was made; we can allow it because that cannot produce infinite loops in cascaded operations.

  • Fixed a bug: Allow HANDLER PREV and NEXT also after positioning the cursor with a unique search on the primary key.

  • Fixed a bug: If MIN() or MAX() resulted in a deadlock or a lock wait timeout, MySQL did not return an error, but returned NULL as the function value.

  • Fixed a bug: InnoDB forgot to call pthread_mutex_destroy() when a table was dropped. That could cause memory leakage on FreeBSD and other non-Linux Unix systems.

MySQL/InnoDB-4.1.0, April 3, 2003

  • InnoDB now supports up to 64GB of buffer pool memory in a Windows 32-bit Intel computer. This is possible because InnoDB can use the AWE extension of Windows to address memory over the 4GB limit of a 32-bit process. A new startup variable innodb_buffer_pool_awe_mem_mb enables AWE and sets the size of the buffer pool in megabytes.

  • Reduced the size of buffer headers and the lock table. InnoDB uses 2 % less memory.

MySQL/InnoDB-3.23.56, March 17, 2003

  • Fixed a major bug in InnoDB query optimization: queries of type SELECT ... WHERE indexcolumn < x and SELECT ... WHERE indexcolumn > x could cause a table scan even if the selectivity would have been very good.

  • Fixed a potential bug if MySQL calls store_lock with TL_IGNORE in the middle of a query.

MySQL/InnoDB-4.0.12, March 18, 2003

  • In crash recovery InnoDB now prints the progress in percents of a transaction rollback.

  • Fixed a bug/feature: If your application program used mysql_use_result(), and used >= 2 connections to send SQL queries, it could deadlock on the adaptive hash S-latch in btr0sea.c. Now mysqld releases the S-latch whenever it passes data from a SELECT to the client.

  • Fixed a bug: MySQL could erroneously return 'Empty set' if InnoDB estimated an index range size to 0 records though the range was not empty; MySQL also failed to do the next-key locking in the case of an empty index range.

MySQL/InnoDB-4.0.11, February 25, 2003

  • Fixed a bug introduced in 4.0.10: SELECT ... FROM ... ORDER BY ... DESC could hang in an infinite loop.

  • An outstanding bug: SET FOREIGN_KEY_CHECKS=0 is not replicated properly in the MySQL replication.

MySQL/InnoDB-4.0.10, February 4, 2003

  • In INSERT INTO t1 SELECT ... FROM t2 WHERE ... MySQL previously set a table level read lock on t2. This lock is now removed.

  • Increased SHOW INNODB STATUS maximum printed length to 200KB.

  • Fixed a major bug in InnoDB query optimization: queries of type SELECT ... WHERE indexcolumn < x and SELECT ... WHERE indexcolumn > x could cause a table scan even if the selectivity would have been very good.

  • Fixed a bug: purge could cause a hang in a BLOB table where the primary key index tree was of height 1. Symptom: semaphore waits caused by an X-latch set in btr_free_externally_stored_field().

  • Fixed a bug: using InnoDB HANDLER commands on a fresh handle crashed mysqld in ha_innobase::change_active_index().

  • Fixed a bug: If MySQL estimated a query in the middle of a SELECT statement, InnoDB could hang on the adaptive hash index latch in btr0sea.c.

  • Fixed a bug: InnoDB could report table corruption and assert in page_dir_find_owner_slot() if an adaptive hash index search coincided with purge or an insert.

  • Fixed a bug: some filesystem snapshot tool in Windows 2000 could cause an InnoDB file write to fail with error 33 ERROR_LOCK_VIOLATION. In synchronous writes InnoDB now retries the write 100 times at 1 second intervals.

  • Fixed a bug: REPLACE INTO t1 SELECT ... did not work if t1 has an auto-inc column.

  • An outstanding bug: SET FOREIGN_KEY_CHECKS=0 is not replicated properly in the MySQL replication.

MySQL/InnoDB-3.23.55, January 24, 2003

  • In INSERT INTO t1 SELECT ... FROM t2 WHERE ... MySQL previously set a table level read lock on t2. This lock is now removed.

  • Fixed a bug: If the combined size of InnoDB log files was >= 2GB in a 32-bit computer, InnoDB would write log in a wrong position. That could make crash recovery and InnoDB Hot Backup to fail in log scan.

  • Fixed a bug: index cursor restoration could theoretically fail.

  • Fixed a bug: an assertion in btr0sea.c, in function btr_search_info_update_slow could theoretically fail in a race of 3 threads.

  • Fixed a bug: purge could cause a hang in a BLOB table where the primary key index tree was of height 1. Symptom: semaphore waits caused by an X-latch set in btr_free_externally_stored_field().

  • Fixed a bug: If MySQL estimated a query in the middle of a SELECT statement, InnoDB could hang on the adaptive hash index latch in btr0sea.c.

  • Fixed a bug: InnoDB could report table corruption and assert in page_dir_find_owner_slot() if an adaptive hash index search coincided with purge or an insert.

  • Fixed a bug: some filesystem snapshot tool in Windows 2000 could cause an InnoDB file write to fail with error 33 ERROR_LOCK_VIOLATION. In synchronous writes InnoDB now retries the write 100 times at 1 second intervals.

  • An outstanding bug: SET FOREIGN_KEY_CHECKS=0 is not replicated properly in the MySQL replication. The fix will appear in 4.0.11 and will probably not be backported to 3.23.

  • Fixed bug in InnoDB page0cur.c file in function page_cur_search_with_match which caused InnoDB to remain on the same page forever. This bug is evident only in tables with more than one page.

MySQL/InnoDB-4.0.9, January 14, 2003

  • Removed the warning message: 'InnoDB: Out of memory in additional memory pool.'

  • Fixed a bug: If the combined size of InnoDB log files was >= 2GB in a 32-bit computer, InnoDB would write log in a wrong position. That could make crash recovery and InnoDB Hot Backup to fail.

  • Fixed a bug: index cursor restoration could theoretically fail.

MySQL/InnoDB-4.0.8, January 7, 2003

  • InnoDB now supports also FOREIGN KEY (...) REFERENCES ...(...) [ON UPDATE CASCADE | ON UPDATE SET NULL | ON UPDATE RESTRICT | ON UPDATE NO ACTION].

  • Tables and indexes now reserve 4 % less space in the tablespace. Also existing tables reserve less space. By upgrading to 4.0.8 you will see more free space in "InnoDB free" in SHOW TABLE STATUS.

  • Fixed bugs: updating the PRIMARY KEY of a row would generate a foreign key error on all FOREIGN KEYs which referenced secondary keys of the row to be updated. Also, if a referencing FOREIGN KEY constraint only referenced the first columns in an index, and there were more columns in that index, updating the additional columns generated a foreign key error.

  • Fixed a bug: If an index contains some column twice, and that column is updated, the table will become corrupt. From now on InnoDB prevents creation of such indexes.

  • Fixed a bug: removed superfluous error 149 and 150 printouts from the .err log when a locking SELECT caused a deadlock or a lock wait timeout.

  • Fixed a bug: an assertion in btr0sea.c, in function btr_search_info_update_slow could theoretically fail in a race of 3 threads.

  • Fixed a bug: one could not switch a session transaction isolation level back to REPEATABLE READ after setting it to something else.

MySQL/InnoDB-4.0.7, December 26, 2002

  • InnoDB in 4.0.7 is essentially the same as in 4.0.6.

MySQL/InnoDB-4.0.6, December 19, 2002

  • Since innodb_log_arch_dir has no relevance under MySQL, there is no need to specify it any more in my.cnf.

  • LOAD DATA INFILE in AUTOCOMMIT=1 mode no longer does implicit commits for each 1MB of written binary log.

  • Fixed a bug introduced in 4.0.4: LOCK TABLES ... READ LOCAL should not set row locks on the rows read. This caused deadlocks and lock wait timeouts in mysqldump.

  • Fixed two bugs introduced in 4.0.4: in AUTO_INCREMENT, REPLACE could cause the counter to be left 1 too low. A deadlock or a lock wait timeout could cause the same problem.

  • Fixed a bug: TRUNCATE on a TEMPORARY table crashed InnoDB.

  • Fixed a bug introduced in 4.0.5: If binary logging was not switched on, INSERT INTO ... SELECT ... or CREATE TABLE ... SELECT ... could cause InnoDB to hang on a semaphore created in btr0sea.c, line 128. Workaround: switch binary logging on.

  • Fixed a bug: in replication issuing SLAVE STOP in the middle of a multiple-statement transaction could cause that SLAVE START would only perform a part of the transaction. A similar error could occur if the slave crashed and was restarted.

MySQL/InnoDB-3.23.54, December 12, 2002

  • Fixed a bug: the InnoDB range estimator greatly exaggerated the size of a short index range if the paths to the endpoints of the range in the index tree happened to branch already in the root. This could cause unnecessary table scans in SQL queries.

  • Fixed a bug: ORDER BY could fail if you had not created a primary key to a table, but had defined several indexes of which at least one was a UNIQUE index with all its columns declared as NOT NULL.

  • Fixed a bug: a lock wait timeout in connection with ON DELETE CASCADE could cause corruption in indexes.

  • Fixed a bug: If a SELECT was done with a unique key from a primary index, and the search matched to a delete-marked record, InnoDB could erroneously return the NEXT record.

  • Fixed a bug introduced in 3.23.53: LOCK TABLES ... READ LOCAL should not set row locks on the rows read. This caused deadlocks and lock wait timeouts in mysqldump.

  • Fixed a bug: If an index contains some column twice, and that column is updated, the table will become corrupt. From now on InnoDB prevents creation of such indexes.

MySQL/InnoDB-4.0.5, November 18, 2002

  • InnoDB now supports also transaction isolation levels READ COMMITTED and READ UNCOMMITTED. READ COMMITTED more closely emulates Oracle and makes porting of applications from Oracle to MySQL easier.

  • Deadlock resolution is now selective: we try to pick as victims transactions with less modified or inserted rows.

  • FOREIGN KEY definitions are now aware of the lower_case_table_names setting in my.cnf.

  • SHOW CREATE TABLE does not output the database name to a FOREIGN KEY definition if the referred table is in the same database as the table.

  • InnoDB does a consistency check to most index pages before writing them to a data file.

  • If you set innodb_force_recovery > 0, InnoDB tries to jump over corrupt index records and pages when doing SELECT * FROM table. This helps in dumping.

  • InnoDB now again uses asynchronous unbuffered I/O in Windows 2000 and XP; only unbuffered simulated async I/O in NT, 95/98/ME.

  • Fixed a bug: the InnoDB range estimator greatly exaggerated the size of a short index range if the paths to the endpoints of the range in the index tree happened to branch already in the root. This could cause unnecessary table scans in SQL queries. The fix will also be backported to 3.23.54.

  • Fixed a bug present in 3.23.52, 4.0.3, 4.0.4: InnoDB startup could take very long or even crash on some Windows 95/98/ME computers.

  • Fixed a bug: the AUTO-INC lock was held to the end of the transaction if it was granted after a lock wait. This could cause unnecessary deadlocks.

  • Fixed a bug: If SHOW INNODB STATUS, innodb_monitor, or innodb_lock_monitor had to print several hundred transactions in one report, and the output became truncated, InnoDB would hang, printing to the error log many waits for a mutex created at srv0srv.c, line 1621.

  • Fixed a bug: SHOW INNODB STATUS on Unix always reported average file read size as 0 bytes.

  • Fixed a potential bug in 4.0.4: InnoDB now does ORDER BY ... DESC like MyISAM.

  • Fixed a bug: DROP TABLE could cause crash or a hang if there was a rollback concurrently running on the table. The fix will be backported to 3.23 only if this appears a real problem for users.

  • Fixed a bug: ORDER BY could fail if you had not created a primary key to a table, but had defined several indexes of which at least one was a UNIQUE index with all its columns declared as NOT NULL.

  • Fixed a bug: a lock wait timeout in connection with ON DELETE CASCADE could cause corruption in indexes.

  • Fixed a bug: If a SELECT was done with a unique key from a primary index, and the search matched to a delete-marked record, InnoDB could return the NEXT record.

  • Outstanding bugs: in 4.0.4 two bugs were introduced to AUTO_INCREMENT. REPLACE can cause the counter to be left 1 too low. A deadlock or a lock wait timeout can cause the same problem. These will be fixed in 4.0.6.

MySQL/InnoDB-3.23.53, October 9, 2002

  • We again use unbuffered disk I/O to data files in Windows. Windows XP and Windows 2000 read performance seems to be very poor with normal I/O.

  • Tuned range estimator so that index range scans are preferred over full index scans.

  • Allow dropping and creating a table even if innodb_force_recovery is set. One can use this to drop a table which would cause a crash in rollback or purge, or if a failed table import causes a runaway rollback in recovery.

  • Fixed a bug present in 3.23.52, 4.0.3, 4.0.4: InnoDB startup could take very long or even crash on some Windows 95/98/ME computers.

  • Fixed a bug: fast shutdown (which is the default) sometimes was slowed down by purge and insert buffer merge.

  • Fixed a bug: doing a big SELECT from a table where no rows were visible in a consistent read could cause a very long (> 600 seconds) semaphore wait in btr0cur.c line 310.

  • Fixed a bug: the AUTO-INC lock was held to the end of the transaction if it was granted after a lock wait. This could cause unnecessary deadlocks.

  • Fixed a bug: If you created a temporary table inside LOCK TABLES, and used that temporary table, that caused an assertion failure in ha_innobase.cc.

  • Fixed a bug: If SHOW INNODB STATUS, innodb_monitor, or innodb_lock_monitor had to print several hundred transactions in one report, and the output became truncated, InnoDB would hang, printing to the error log many waits for a mutex created at srv0srv.c, line 1621.

  • Fixed a bug: SHOW INNODB STATUS on Unix always reported average file read size as 0 bytes.

MySQL/InnoDB-4.0.4, October 2, 2002

  • We again use unbuffered disk I/O in Windows. Windows XP and Windows 2000 read performance seems to be very poor with normal I/O.

  • Increased the maximum key length of InnoDB tables from 500 to 1024 bytes.

  • Increased the table comment field in SHOW TABLE STATUS so that up to 16000 characters of foreign key definitions can be printed there.

  • The auto-increment counter is no longer incremented if an insert of a row immediately fails in an error.

  • Allow dropping and creating a table even if innodb_force_recovery is set. One can use this to drop a table which would cause a crash in rollback or purge, or if a failed table import causes a runaway rollback in recovery.

  • Fixed a bug: Using ORDER BY primarykey DESC in 4.0.3 causes an assertion failure in btr0pcur.c, line 203.

  • Fixed a bug: fast shutdown (which is the default) sometimes was slowed down by purge and insert buffer merge.

  • Fixed a bug: doing a big SELECT from a table where no rows were visible in a consistent read could cause a very long (> 600 seconds) semaphore wait in btr0cur.c line 310.

  • Fixed a bug: If the MySQL query cache was used, it did not get invalidated by a modification done by ON DELETE CASCADE or ...SET NULL.

  • Fixed a bug: If you created a temporary table inside LOCK TABLES, and used that temporary table, that caused an assertion failure in ha_innodb.cc.

  • Fixed a bug: If you set innodb_flush_log_at_trx_commit to 1, SHOW VARIABLES would show its value as 16 million.

MySQL/InnoDB-4.0.3, August 28, 2002

  • Removed unnecessary deadlocks when inserts have to wait for a locking read, update, or delete to release its next-key lock.

  • The MySQL HANDLER SQL commands now work also for InnoDB type tables. InnoDB does the HANDLER reads always as consistent reads. HANDLER is a direct access path to read individual indexes of tables. In some cases, HANDLER can be used as a substitute of server-side cursors.

  • Fixed a bug in 4.0.2: even a simple insert could crash the AIX version.

  • Fixed a bug: If you used in a table name characters whose code is > 127, in DROP TABLE InnoDB could assert on line 155 of pars0sym.c.

  • Compilation from source now provides a working version both on HP-UX-11 and HP-UX-10.20. The source of 4.0.2 worked only on 11, and the source of 3.23.52 only on 10.20.

  • Fixed a bug: If compiled on 64-bit Solaris, InnoDB produced a bus error at startup.

MySQL/InnoDB-3.23.52, August 16, 2002

  • The feature set of 3.23 will be frozen from this version on. New features will go the 4.0 branch, and only bugfixes will be made to the 3.23 branch.

  • Many CPU-bound join queries now run faster. On Windows also many other CPU-bound queries run faster.

  • A new SQL command SHOW INNODB STATUS returns the output of the InnoDB Monitor to the client. The InnoDB Monitor now prints detailed information on the latest detected deadlock.

  • InnoDB made the SQL query optimizer to avoid too much index-only range scans and choose full table scans instead. This is now fixed.

  • BEGIN and COMMIT are now added in the binary log around transactions. The MySQL replication now respects transaction borders: a user will no longer see half transactions in replication slaves.

  • A replication slave now prints in crash recovery the last master binary log position it was able to recover to.

  • A new setting innodb_flush_log_at_trx_commit=2 makes InnoDB to write the log to the operating system file cache at each commit. This is almost as fast as the setting innodb_flush_log_at_trx_commit=0, and the setting 2 also has the nice feature that in a crash where the operating system does not crash, no committed transaction is lost. If the operating system crashes or there is a power outage, then the setting 2 is no safer than the setting 0.

  • Added checksum fields to log blocks.

  • SET FOREIGN_KEY_CHECKS=0 helps in importing tables in an arbitrary order which does not respect the foreign key rules.

  • SET UNIQUE_CHECKS=0 speeds up table imports into InnoDB if you have UNIQUE constraints on secondary indexes. This flag should be used only if you are certain that the input records contain no UNIQUE constraint violations.

  • SHOW TABLE STATUS now lists also possible ON DELETE CASCADE or ON DELETE SET NULL in the comment field of the table.

  • When CHECK TABLE is run on any InnoDB type table, it now checks also the adaptive hash index for all tables.

  • If you defined ON DELETE CASCADE or SET NULL and updated the referenced key in the parent row, InnoDB deleted or updated the child row. This is now changed to conform to standard SQL: you get the error 'Cannot delete parent row'.

  • Improved the auto-increment algorithm: now the first insert or SHOW TABLE STATUS initializes the auto-increment counter for the table. This removes almost all surprising deadlocks caused by SHOW TABLE STATUS.

  • Aligned some buffers used in reading and writing to data files. This allows using unbuffered raw devices as data files in Linux.

  • Fixed a bug: If you updated the primary key of a table so that only the case of characters changed, that could cause assertion failures, mostly in page0page.ic line 515.

  • Fixed a bug: If you delete or update a row referenced in a foreign key constraint and the foreign key check has to wait for a lock, then the check may report an erroneous result. This affects also the ON DELETE... operation.

  • Fixed a bug: A deadlock or a lock wait timeout error in InnoDB causes InnoDB to roll back the whole transaction, but MySQL could still write the earlier SQL statements to the binary log, even though InnoDB rolled them back. This could, for example, cause replicated databases to get out-of-sync.

  • Fixed a bug: If the database happened to crash in the middle of a commit, then the recovery might leak tablespace pages.

  • Fixed a bug: If you specified a non-latin1 character set in my.cnf, then, in contrary to what is stated in the manual, in a foreign key constraint a string type column had to have the same length specification in the referencing table and the referenced table.

  • Fixed a bug: DROP TABLE or DROP DATABASE could fail if there simultaneously was a CREATE TABLE running.

  • Fixed a bug: If you configured the buffer pool bigger than 2GB in a 32-bit computer, InnoDB would assert in buf0buf.ic line 214.

  • Fixed a bug: on 64-bit computers updating rows which contained the SQL NULL in some column could cause the undo log and the ordinary log to become corrupt.

  • Fixed a bug: innodb_log_monitor caused a hang if it suppressed lock prints for a page.

  • Fixed a bug: in the HP-UX-10.20 version mutexes would leak and cause race conditions and crashes in any part of InnoDB code.

  • Fixed a bug: If you ran in the AUTOCOMMIT mode, executed a SELECT, and immediately after that a RENAME TABLE, then RENAME would fail and MySQL would complain about error 1192.

  • Fixed a bug: If compiled on 64-bit Solaris, InnoDB produced a bus error at startup.

MySQL/InnoDB-4.0.2, July 10, 2002

  • InnoDB is essentially the same as InnoDB-3.23.51.

  • If no innodb_data_file_path is specified, InnoDB at the database creation now creates a 10MB auto-extending data file ibdata1 to the datadir of MySQL. In 4.0.1 the file was 64MB and not auto-extending.

MySQL/InnoDB-3.23.51, June 12, 2002

  • Fixed a bug: a join could result in a seg fault in copying of a BLOB or TEXT column if some of the BLOB or TEXT columns in the table contained SQL NULL values.

  • Fixed a bug: If you added self-referential foreign key constraints with ON DELETE CASCADE to tables and a row deletion caused InnoDB to attempt the deletion of the same row twice because of a cascading delete, then you got an assertion failure.

  • Fixed a bug: If you use MySQL 'user level locks' and close a connection, then InnoDB may assert in ha_innobase.cc, line 302.

MySQL/InnoDB-3.23.50, April 23, 2002

  • InnoDB now supports an auto-extending last data file. You do not need to preallocate the whole data file at the database startup.

  • Made several changes to facilitate the use of the InnoDB Hot Backup tool. It is a separate non-free tool you can use to take online backups of your database without shutting down the server or setting any locks.

  • If you want to run the InnoDB Hot Backup tool on an auto-extending data file you have to upgrade it to version ibbackup-0.35.

  • The log scan phase in crash recovery will now run much faster.

  • Starting from this server version, the hot backup tool truncates unused ends in the backup InnoDB data files.

  • To allow the hot backup tool to work, on Windows we no longer use unbuffered I/O or native async I/O; instead we use the same simulated async I/O as on Unix.

  • You can now define the ON DELETE CASCADE or ON DELETE SET NULL clause on foreign keys.

  • FOREIGN KEY constraints now survive ALTER TABLE and CREATE INDEX.

  • We suppress the FOREIGN KEY check if any of the column values in the foreign key or referenced key to be checked is the SQL NULL. This is compatible with Oracle, for example.

  • SHOW CREATE TABLE now lists also foreign key constraints. Also mysqldump no longer forgets about foreign keys in table definitions.

  • You can now add a new foreign key constraint with ALTER TABLE ... ADD CONSTRAINT FOREIGN KEY (...) REFERENCES ... (...).

  • FOREIGN KEY definitions now allow backticks around table and column names.

  • MySQL command SET TRANSACTION ISOLATION LEVEL ... has now the following effect on InnoDB tables: If a transaction is defined as SERIALIZABLE then InnoDB conceptually adds LOCK IN SHARE MODE to all consistent reads. If a transaction is defined to have any other isolation level, then InnoDB obeys its default locking strategy which is REPEATABLE READ.

  • SHOW TABLE STATUS no longer sets an x-lock at the end of an auto-increment index if the auto-increment counter has already been initialized. This removes in almost all cases the surprising deadlocks caused by SHOW TABLE STATUS.

  • Fixed a bug: in a CREATE TABLE statement the string 'foreign' followed by a non-space character confused the FOREIGN KEY parser and caused table creation to fail with errno 150.

MySQL/InnoDB-3.23.49, February 17, 2002

  • Fixed a bug: If you called DROP DATABASE for a database on which there simultaneously were running queries, the MySQL server could crash or hang. Crashes fixed, but a full fix has to wait some changes in the MySQL layer of code.

  • Fixed a bug: on Windows one had to put the database name in lowercase for DROP DATABASE to work. Fixed in 3.23.49: case no longer matters on Windows. On Unix, the database name remains case sensitive.

  • Fixed a bug: If one defined a non-latin1 character set as the default character set, then definition of foreign key constraints could fail in an assertion failure in dict0crea.c, reporting an internal error 17.

MySQL/InnoDB-3.23.48, February 9, 2002

  • Tuned the SQL optimizer to favor more often index searches over table scans.

  • Fixed a performance problem when several large SELECT queries are run concurrently on a multiprocessor Linux computer. Large CPU-bound SELECT queries will now also generally run faster on all platforms.

  • If MySQL binary logging is used, InnoDB now prints after crash recovery the latest MySQL binary log file name and the position in that file (= byte offset) InnoDB was able to recover to. This is useful, for example, when resynchronizing a master and a slave database in replication.

  • Added better error messages to help in installation problems.

  • One can now recover also MySQL temporary tables which have become orphaned inside the InnoDB tablespace.

  • InnoDB now prevents a FOREIGN KEY declaration where the signedness is not the same in the referencing and referenced integer columns.

  • Fixed a bug: calling SHOW CREATE TABLE or SHOW TABLE STATUS could cause memory corruption and make mysqld to crash. Especially at risk was mysqldump, because it calls frequently SHOW CREATE TABLE.

  • Fixed a bug: If on Unix you did an ALTER TABLE to an InnoDB table and simultaneously did queries to it, mysqld could crash with an assertion failure in row0row.c, line 474.

  • Fixed a bug: If inserts to several tables containing an auto-inc column were wrapped inside one LOCK TABLES, InnoDB asserted in lock0lock.c.

  • In 3.23.47 we allowed several NULLS in a UNIQUE secondary index. But CHECK TABLE was not relaxed: it reports the table as corrupt. CHECK TABLE no longer complains in this situation.

  • Fixed a bug: on Sparc and other high-endian processors SHOW VARIABLES showed innodb_flush_log_at_trx_commit and other boolean-valued startup parameters always OFF even if they were switched on.

  • Fixed a bug: If you ran mysqld-max-nt as a service on Windows NT/2000, the service shutdown did not always wait long enough for the InnoDB shutdown to finish.

MySQL/InnoDB-3.23.47, December 28, 2001

  • Recovery happens now faster, especially in a lightly loaded system, because background checkpointing has been made more frequent.

  • InnoDB allows now several similar key values in a UNIQUE secondary index if those values contain SQL NULLs. Thus the convention is now the same as in MyISAM tables.

  • InnoDB gives a better row count estimate for a table which contains BLOBs.

  • In a FOREIGN KEY constraint InnoDB is now case-insensitive to column names, and in Windows also to table names.

  • InnoDB allows a FOREIGN KEY column of CHAR type to refer to a column of VARCHAR type, and vice versa. MySQL silently changes the type of some columns between CHAR and VARCHAR, and these silent changes do not hinder FOREIGN KEY declaration any more.

  • Recovery has been made more resilient to corruption of log files.

  • Unnecessary statistics calculation has been removed from queries which generate a temporary table. Some ORDER BY and DISTINCT queries will now run much faster.

  • MySQL now knows that the table scan of an InnoDB table is done through the primary key. This will save a sort in some ORDER BY queries.

  • The maximum key length of InnoDB tables is again restricted to 500 bytes. The MySQL interpreter is not able to handle longer keys.

  • The default value of innodb_lock_wait_timeout was changed from infinite to 50 seconds, the default value of innodb_file_io_threads from 9 to 4.

MySQL/InnoDB-4.0.1, December 23, 2001

  • InnoDB is the same as in 3.23.47.

  • In 4.0.0 the MySQL interpreter did not know the syntax LOCK IN SHARE MODE. This has been fixed.

  • In 4.0.0 multiple-table delete did not work for transactional tables. This has been fixed.

MySQL/InnoDB-3.23.46, November 30, 2001

  • This is the same as 3.23.45.

MySQL/InnoDB-3.23.45, November 23, 2001

  • This is a bugfix release.

  • In versions 3.23.42-.44 when creating a table on Windows, you have to use lowercase letters in the database name to be able to access the table. Fixed in 3.23.45.

  • InnoDB now flushes stdout and stderr every 10 seconds: If these are redirected to files, the file contents can be better viewed with an editor.

  • Fixed an assertion failure in .44, in trx0trx.c, line 178 when you drop a table which has the .frm file but does not exist inside InnoDB.

  • Fixed a bug in the insert buffer. The insert buffer tree could get into an inconsistent state, causing a crash, and also crashing the recovery. This bug could appear especially in large table imports or alterations.

  • Fixed a bug in recovery: InnoDB could go into an infinite loop constantly printing a warning message that it cannot find free blocks from the buffer pool.

  • Fixed a bug: when you created a temporary table of the InnoDB type, and then used ALTER TABLE to it, the MySQL server could crash.

  • Prevented creation of MySQL system tables 'mysql.user', 'mysql.host', or 'mysql.db', in the InnoDB type.

  • Fixed a bug which can cause an assertion failure in 3.23.44 in srv0srv.c, line 1728.

MySQL/InnoDB-3.23.44, November 2, 2001

  • You can define foreign key constraints on InnoDB tables. An example: FOREIGN KEY (col1) REFERENCES table2(col2).

  • You can create data files larger than 4GB in those filesystems that allow it.

  • Improved InnoDB monitors, including a new innodb_table_monitor which allows you to print the contents of the InnoDB internal data dictionary.

  • DROP DATABASE will now work also for InnoDB tables.

  • Accent characters in the default character set latin1 will be ordered according to the MySQL ordering.<br> NOTE: If you are using latin1 and have inserted characters whose code is > 127 to an indexed CHAR column, you should run CHECK TABLE on your table when you upgrade to 3.23.43, and drop and reimport the table if CHECK TABLE reports an error!

  • InnoDB will calculate better table cardinality estimates.

  • Change in deadlock resolution: in .43 a deadlock rolls back only the SQL statement, in .44 it will roll back the whole transaction.

  • Deadlock, lock wait timeout, and foreign key constraint violations (no parent row, child rows exist) now return native MySQL error codes 1213, 1205, 1216, 1217, respectively.

  • A new my.cnf parameter innodb_thread_concurrency helps in performance tuning in high concurrency environments.

  • A new my.cnf option innodb_force_recovery will help you in dumping tables from a corrupted database.

  • A new my.cnf option innodb_fast_shutdown will speed up shutdown. Normally InnoDB does a full purge and an insert buffer merge at shutdown.

  • Raised maximum key length to 7000 bytes from a previous limit of 500 bytes.

  • Fixed a bug in replication of auto-inc columns with multiline inserts.

  • Fixed a bug when the case of letters changes in an update of an indexed secondary column.

  • Fixed a hang when there are more than 24 data files.

  • Fixed a crash when MAX(col) is selected from an empty table, and col is a not the first column in a multi-column index.

  • Fixed a bug in purge which could cause crashes.

MySQL/InnoDB-3.23.43, October 4, 2001

  • This is essentially the same as InnoDB-3.23.42.

MySQL/InnoDB-3.23.42, September 9, 2001

  • Fixed a bug which corrupted the table if the primary key of a > 8000-byte row was updated.

  • There are now 3 types of InnoDB Monitors: innodb_monitor, innodb_lock_monitor, and innodb_tablespace_monitor. innodb_monitor now prints also buffer pool hit rate and the total number of rows inserted, updated, deleted, read.

  • Fixed a bug in RENAME TABLE.

  • Fixed a bug in replication with an auto-increment column.

MySQL/InnoDB-3.23.41, August 13, 2001

  • Support for < 4GB rows. The previous limit was 8000 bytes.

  • Use the doublewrite file flush method.

  • Raw disk partitions supported as data files.

  • InnoDB Monitor.

  • Several hang bugs fixed and an ORDER BY bug (“Sort aborted”) fixed.

MySQL/InnoDB-3.23.40, July 16, 2001

  • Only a few rare bugs fixed.

MySQL/InnoDB-3.23.39, June 13, 2001

  • CHECK TABLE now works for InnoDB tables.

  • A new my.cnf parameter innodb_unix_file_flush_method introduced. It can be used to tune disk write performance.

  • An auto-increment column now gets new values past the transaction mechanism. This saves CPU time and eliminates transaction deadlocks in new value assignment.

  • Several bugfixes, most notably the rollback bug in 3.23.38.

MySQL/InnoDB-3.23.38, May 12, 2001

  • The new syntax SELECT ... LOCK IN SHARE MODE is introduced.

  • InnoDB now calls fsync() after every disk write and calculates a checksum for every database page it writes or reads, which will reveal disk defects.

  • Several bugfixes.