Released on 12 Jun 2007
MySQL 4.1.23 Changelog

End of Product Lifecycle. Active development and support for MySQL Database Server versions 3.23, 4.0, and 4.1 has ended. For details, see Please consider upgrading to a recent version. Further updates to the content of this manual will be minimal. All formats of this manual will continue to be available until 31 Dec 2010.

This is a bugfix release for the MySQL 4.1 release family.

Functionality Added or Changed

  • Incompatible Change: Previously, the DATE_FORMAT() function returned a binary string. Now it returns a string with a character set and collation given by character_set_connection and collation_connection so that it can return month and weekday names containing non-ASCII characters. (Bug #22646)

  • Incompatible Change: The prepared_stmt_count system variable has been converted to the Prepared_stmt_count global status variable (viewable with the SHOW GLOBAL STATUS statement). (Bug #23159)

  • Important Change: When using a MERGE table, the definition of the table and the underlying MyISAM tables are checked each time the tables are opened for access (including any SELECT or INSERT statement). Each table is compared for column order, types, sizes, and associated indexes. If there is a difference in any one of the tables, the statement will fail.

  • The --memlock option relies on system calls that are unreliable on some operating systems. If a crash occurs, the server now checks whether --memlock was specified and if so issues some information about possible workarounds. (Bug #22860)

  • If the user specified the server options --max-connections=N or --table-cache=M , a warning would be given in some cases that some values were recalculated, with the result that --table-cache could be assigned greater value.

    In such cases, both the warning and the increase in the --table-cache value were completely harmless. Note also that it is not possible for the MySQL Server to predict or to control limitations on the maximum number of open files, since this is determined by the operating system.

    The value of --table-cache is no longer increased automatically, and a warning is now given only if some values had to be decreased due to operating system limits. (Bug #21915)

  • The server now includes a timestamp in error messages that are logged as a result of unhandled signals (such as mysqld got signal 11 messages). (Bug #24878)

  • mysqldump --single-transaction now uses START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ rather than BEGIN to start a transaction, so that a consistent snapshot will be used on those servers that support it. (Bug #19660)

  • INSERT DELAYED statements on BLACKHOLE tables are now rejected, due to the fact that the BLACKHOLE storage engine does not support them. (Bug #27998)

  • A dependency on the Intel runtime libraries existed in the shared-xxx RPMs for the IA-64 CPU of some versions of MySQL 4.1 (4.1.16, 4.1.20, and 4.1.22). This has been resolved. (Bug #18776)

Bugs Fixed

  • Security Fix: The requirement of the DROP privilege for RENAME TABLE was not enforced. (Bug #27515, CVE-2007-2691)

  • Performance: InnoDB showed substandard performance with multiple queries running concurrently. (Bug #15815)

  • Performance: InnoDB exhibited thread thrashing with more than 50 concurrent connections under an update-intensive workload. (Bug #22868)

  • Incompatible Change: INSERT DELAYED statements are not supported for MERGE tables, but the MERGE storage engine was not rejecting such statements, resulting in table corruption. Applications previously using INSERT DELAYED into MERGE table will break when upgrading to versions with this fix. To avoid the problem, remove DELAYED from such statements. (Bug #26464)

  • Incompatible Change: For ENUM columns that had enumeration values containing commas, the commas were mapped to 0xff internally. However, this rendered the commas indistinguishable from true 0xff characters in the values. This no longer occurs. However, the fix requires that you dump and reload any tables that have ENUM columns containing any true 0xff values. Dump the tables using mysqldump with the current server before upgrading from a version of MySQL 4.1 older than 4.1.23 to version 4.1.23 or newer. (Bug #24660)

  • MySQL Cluster: In some circumstances, shutting down the cluster could cause connected mysqld processes to crash. (Bug #25668)

  • MySQL Cluster: The management client command node_id STATUS displayed the message Node node_id: not connected when node_id was not the node ID of a data node.


    The ALL STATUS command in the cluster management client still displays status information for data nodes only. This is by design. See Section 15.5.2, “Commands in the MySQL Cluster Management Client”, for more information.

    (Bug #21715)

  • MySQL Cluster: When an API node sent more than 1024 signals in a single batch, NDB would process only the first 1024 of these, and then hang. (Bug #28443)

  • Replication: Transient errors in replication from master to slave may trigger multiple Got fatal error 1236: 'binlog truncated in the middle of event' errors on the slave. (Bug #4053)

  • Replication: Changes to the lc_time_names system variable were not replicated. (Bug #22645)

  • Replication: SQL statements close to the size of max_allowed_packet could produce binary log events larger than max_allowed_packet that could not be read by slave servers. (Bug #19402)

  • Replication: GRANT statements were not replicated if the server was started with the --replicate-ignore-table or --replicate-wild-ignore-table option. (Bug #25482)

  • Replication: If a slave server closed its relay log (for example, due to an error during log rotation), the I/O thread did not recognize this and still tried to write to the log, causing a server crash. (Bug #10798)

  • Cluster Replication: Some queries that updated multiple tables were not backed up correctly. (Bug #27748)

  • Cluster API: was not versioned. (Bug #13522)

  • When opening a corrupted .frm file during a query, the server crashes. (Bug #24358)

  • ISNULL(DATE(NULL)) and ISNULL(CAST(NULL AS DATE)) erroneously returned false. (Bug #23938)

  • The error message for error number 137 did not report which database/table combination reported the problem. (Bug #27173)

  • A return value of -1 from user-defined handlers was not handled well and could result in conflicts with server code. (Bug #24987)

  • X() IS NULL and Y() IS NULL comparisons failed when X() and Y() returned NULL. (Bug #26038)

  • DOUBLE values such as 20070202191048.000000 were being treated as illegal arguments by WEEK(). (Bug #23616)

  • The mysqlserver.lib library on Windows had many missing symbols. (Bug #29007)

  • LAST_DAY('0000-00-00') could cause a server crash. (Bug #23653)

  • SET lc_time_names = value permitted only exact literal values, not expression values. (Bug #22647)

  • The server could send incorrect column count information to the client for queries that produce a larger number of columns than can fit in a two-byte number. (Bug #19216)

  • If there was insufficient memory to store or update a blob record in a MyISAM table then the table will marked as crashed. (Bug #23196)

  • A server crash occurred when using LOAD DATA to load a table containing a NOT NULL spatial column, when the statement did not load the spatial column. Now a NULL supplied to NOT NULL column error occurs. (Bug #22372)

  • If elements in a nontop-level IN subquery were accessed by an index and the subquery result set included a NULL value, the quantified predicate that contained the subquery was evaluated to NULL when it should return a non-NULL value. (Bug #23478)

  • mysql_fix_privilege_tables did not accept a password containing embedded space or apostrophe characters. (Bug #17700)

  • The BUILD/check-cpu script did not recognize Celeron processors. (Bug #20061)

  • Accessing a fixed record format table with a crashed key definition results in server/myisamchk segmentation fault. (Bug #24855)

  • If a thread previously serviced a connection that was killed, excessive memory and CPU use by the thread occurred if it later serviced a connection that had to wait for a table lock. (Bug #25966)

  • The MERGE storage engine could return incorrect results when several index values that compare equality were present in an index (for example, 'gross' and 'gross ', which are considered equal but have different lengths). (Bug #24342)

  • If COMPRESS() returned NULL, subsequent invocations of COMPRESS() within a result set or within a trigger also returned NULL. (Bug #23254)

  • When updating a table that used a JOIN of the table itself (for example, when building trees) and the table was modified on one side of the expression, the table would either be reported as crashed or the wrong rows in the table would be updated. (Bug #21310)

  • Referencing an ambiguous column alias in an expression in the ORDER BY clause of a query caused the server to crash. (Bug #25427)

  • No warning was issued for use of the DATA DIRECTORY or INDEX DIRECTORY table options on a platform that does not support them. (Bug #17498)

  • Duplicate entries were not assessed correctly in a MEMORY table with a BTREE primary key on a utf8 ENUM column. (Bug #24985)

  • mysqldump --order-by-primary failed if the primary key name was an identifier that required quoting. (Bug #13926)

  • The internal functions for table preparation, creation, and alteration were not re-execution friendly, causing problems in code that: repeatedly altered a table; repeatedly created and dropped a table; opened and closed a cursor on a table, altered the table, and then reopened the cursor; used ALTER TABLE to change a table's current AUTO_INCREMENT value; created indexes on utf8 columns.

    Re-execution of CREATE DATABASE, CREATE TABLE, and ALTER TABLE statements as prepared statements also caused incorrect results or crashes. (Bug #4968, Bug #6895, Bug #19182, Bug #19733, Bug #22060, Bug #24879)

  • SHOW COLUMNS reported some NOT NULL columns as NULL. (Bug #22377)

  • STR_TO_DATE() returned NULL if the format string contained a space following a nonformat character. (Bug #22029)

  • The arguments to the ENCODE() and the DECODE() functions were not printed correctly, causing problems in the output of EXPLAIN EXTENDED and in view definitions. (Bug #23409)

  • Passing nested row expressions with different structures to an IN predicate caused a server crash. (Bug #27484)

  • For MyISAM tables, COUNT(*) could return an incorrect value if the WHERE clause compared an indexed TEXT column to the empty string (''). This happened if the column contained empty strings and also strings starting with control characters such as tab or newline. (Bug #26231)

  • If an ORDER BY or GROUP BY list included a constant expression being optimized away and, at the same time, containing single-row subselects that returned more that one row, no error was reported. If a query required sorting by expressions containing single-row subselects that returned more than one row, execution of the query could cause a server crash. (Bug #24653)

  • The return value from my_seek() was ignored. (Bug #22828)

  • The second execution of a prepared statement from a UNION query with ORDER BY RAND() caused the server to crash. (Bug #27937)

  • LOAD DATA INFILE sent an okay to the client before writing the binary log and committing the changes to the table had finished, thus violating ACID requirements. (Bug #26050)

  • NOW() returned the wrong value in statements executed at server startup with the --init-file option. (Bug #23240)

  • The fix for Bug #17212 provided correct sort order for misordered output of certain queries, but caused significant overall query performance degradation. (Results were correct (good), but returned much more slowly (bad).) The fix also affected performance of queries for which results were correct. The performance degradation has been addressed. (Bug #27531)

  • mysql_stmt_fetch() did an invalid memory deallocation when used with the embedded server. (Bug #25492)

  • For not-yet-authenticated connections, the Time column in SHOW PROCESSLIST was a random value rather than NULL. (Bug #23379)

  • The Handler_rollback status variable sometimes was incremented when no rollback had taken place. (Bug #22728)

  • It was possible to use DATETIME values whose year, month, and day parts were all zeros but whose hour, minute, and second parts contained nonzero values, an example of such an illegal DATETIME being '0000-00-00 11:23:45'.


    This fix was reverted in MySQL 4.1.24.

    (Bug #21789)

    References: See also Bug #25301.

  • The creation of MySQL system tables was not checked for by (Bug #20166)

  • For ODBC compatibility, MySQL supports use of WHERE col_name IS NULL for DATE or DATETIME columns that are NOT NULL, to permit column values of '0000-00-00' or '0000-00-00 00:00:00' to be selected. However, this was not working for WHERE clauses in DELETE statements. (Bug #23412)

  • For MERGE tables defined on underlying tables that contained a short VARCHAR column (shorter than four characters), using ALTER TABLE on at least one but not all of the underlying tables caused the table definitions to be considered different from that of the MERGE table, even if the ALTER TABLE did not change the definition.

    In addition, when the underlying tables contained a TINYINT or CHAR(1) column, the MERGE storage engine incorrectly reported that they differed from the MERGE table in certain cases. (Bug #26881)

  • For BOOLEAN mode full-text searches on nonindexed columns, NULL rows generated by a LEFT JOIN caused incorrect query results. (Bug #14708, Bug #25637)

  • Lack of validation for input and output TIME values resulted in several problems: SEC_TO_TIME() in some cases did not clip large values to the TIME range appropriately; SEC_TO_TIME() treated BIGINT UNSIGNED values as signed; only truncation warnings were produced when both truncation and out-of-range TIME values occurred. (Bug #11655, Bug #20927)

  • Using CAST() to convert DATETIME values to numeric values did not work. (Bug #23656)

  • A reference to a nonexistent column in the ORDER BY clause of an UPDATE ... ORDER BY statement could cause a server crash. (Bug #25126)

  • Selecting into variables sometimes returned incorrect wrong results. (Bug #20836)

  • A deadlock could occur, with the server hanging on Closing tables, with a sufficient number of concurrent INSERT DELAYED, FLUSH TABLES, and ALTER TABLE operations. (Bug #23312)

  • Metadata for columns calculated from scalar subqueries was limited to integer, double, or string, even if the actual type of the column was different. (Bug #11032)

  • The result set of a query that used WITH ROLLUP and DISTINCT could lack some rollup rows (rows with NULL values for grouping attributes) if the GROUP BY list contained constant expressions. (Bug #24856)

  • A crash of the MySQL Server could occur when unpacking a BLOB column from a row in a corrupted MyISAM table. This could happen when trying to repair a table using either REPAIR TABLE or myisamchk; it could also happen when trying to access such a broken row using statements like SELECT if the table was not marked as crashed. (Bug #22053)

  • Added support for --debugger=dbx for and added support for --debugger=devenv, --debugger=DevEnv, and --debugger=/path/to/devenv. (Bug #26792)

  • There was a race condition in the InnoDB fil_flush_file_spaces() function. (Bug #24089)

    References: This bug was introduced by Bug #15653.

  • EXPLAIN for a query on an empty table immediately after its creation could result in a server crash. (Bug #28272)

  • MySQL failed to build on Linux/Alpha. (Bug #23256)

    References: This bug was introduced by Bug #21250.

  • Running CHECK TABLE concurrently with a SELECT, INSERT or other statement on Windows could corrupt a MyISAM table. (Bug #25712)

  • Some small double precision numbers (such as 1.00000001e-300) that should have been accepted were truncated to zero. (Bug #22129)

  • mysqld_multi and mysqlaccess looked for option files in /etc even if the --sysconfdir option for configure had been given to specify a different directory. (Bug #24780)

  • A compressed MyISAM table that became corrupted could crash myisamchk and possibly the MySQL Server. (Bug #23139)

  • The --extern option for did not function correctly. (Bug #24354)

  • mysql-test-run did not work correctly for RPM-based installations. (Bug #17194)

  • mysqltest incorrectly tried to retrieve result sets for some queries where no result set was available. (Bug #19410)

  • If there was insufficient memory available to mysqld, this could sometimes cause the server to hang during startup. (Bug #24751)

  • Trailing spaces were not removed from Unicode CHAR column values when used in indexes. This resulted in excessive usage of storage space, and could affect the results of some ORDER BY queries that made use of such indexes.


    When upgrading, it is necessary to re-create any existing indexes on Unicode CHAR columns of each affected table to take advantage of the fix. See Section 2.11.4, “Rebuilding or Repairing Tables or Indexes”.

    (Bug #22052)

  • Incorrect results could be returned for some queries that contained a select list expression with IN or BETWEEN together with an ORDER BY or GROUP BY on the same expression using NOT IN or NOT BETWEEN. (Bug #27532)

  • Index hints (USE INDEX, IGNORE INDEX, FORCE INDEX) cannot be used with FULLTEXT indexes, but were not being ignored. (Bug #25951)

  • Changes to some system variables should invalidate statements in the query cache, but invalidation did not happen. (Bug #27792)

  • Queries using a column alias in an expression as part of an ORDER BY clause failed, an example of such a query being SELECT mycol + 1 AS mynum FROM mytable ORDER BY 30 - mynum. (Bug #22457)

  • The range optimizer could consume a combinatorial amount of memory for certain classes of WHERE clauses. (Bug #26624)

  • Attempts to access a MyISAM table with a corrupt column definition caused a server crash. (Bug #24401)

  • The InnoDB parser sometimes did not account for null bytes, causing spurious failure of some queries. (Bug #25596)

  • Storing NULL values in spatial fields caused excessive memory allocation and crashes on some systems. (Bug #27164)

  • Optimizations that are legal only for subqueries without tables and WHERE conditions were applied for any subquery without tables. (Bug #24670)

  • mysqltest crashed with a stack overflow. (Bug #24498)

  • ALTER TABLE statements that performed both RENAME TO and {ENABLE|DISABLE} KEYS operations caused a server crash. (Bug #24219)

  • In a MEMORY table, using a BTREE index to scan for updatable rows could lead to an infinite loop. (Bug #26996)

  • The range optimizer could cause the server to run out of memory. (Bug #26625)

  • Storing values specified as hexadecimal values 64 or more bits long into BIGINT or BIGINT UNSIGNED columns did not raise any warning or error if the value was out of range. (Bug #22533)

  • The number of setsockopt() calls performed for reads and writes to the network socket was reduced to decrease system call overhead. (Bug #22943)

  • mysql did not check for errors when fetching data during result set printing. (Bug #22913)

  • Changing the value of MI_KEY_BLOCK_LENGTH in myisam.h and recompiling MySQL resulted in a myisamchk that saw existing MyISAM tables as corrupt. (Bug #22119)

  • IN() and CHAR() can return NULL, but did not signal that to the query processor, causing incorrect results for IS NULL operations. (Bug #17047)

  • For ALTER TABLE, using ORDER BY expression could cause a server crash. Now the ORDER BY clause permits only column names to be specified as sort criteria (which was the only documented syntax, anyway). (Bug #24562)

  • ORDER BY values of the DOUBLE or DECIMAL types could change the result returned by a query. (Bug #19690)

  • Hebrew-to-Unicode conversion failed for some characters. Definitions for the following Hebrew characters (as specified by the ISO/IEC 8859-8:1999) were added: LEFT-TO-RIGHT MARK (LRM), RIGHT-TO-LEFT MARK (RLM) (Bug #24037)

  • User-defined variables could consume excess memory, leading to a crash caused by the exhaustion of resources available to the MEMORY storage engine, due to the fact that this engine is used by MySQL for variable storage and intermediate results of GROUP BY queries. Where SET had been used, such a condition could instead give rise to the misleading error message You may only use constant expressions with SET, rather than Out of memory (Needed NNNNNN bytes). (Bug #23443)

  • A table created with the ROW_FORMAT = FIXED table option lost that option if an index was added or dropped with CREATE INDEX or DROP INDEX. (Bug #23404)

  • Difficult repair or optimization operations could cause an assertion failure, resulting in a server crash. (Bug #25289)

  • The stack size for NetWare binaries was increased to 128KB to prevent problems caused by insufficient stack size. (Bug #23504)

  • InnoDB: During a restart of the MySQL Server that followed the creation of a temporary table using the InnoDB storage engine, MySQL failed to clean up in such a way that InnoDB still attempted to find the files associated with such tables. (Bug #20867)

  • Foreign key identifiers for InnoDB tables could not contain certain characters. (Bug #24299)

  • Some long error messages were printed incorrectly. (Bug #20710)

  • Conversion of DATETIME values in numeric contexts sometimes did not produce a double (YYYYMMDDHHMMSS.uuuuuu) value. (Bug #16546)

  • Comparisons using row constructors could fail for rows containing NULL values. (Bug #27704)

  • Through the C API, the member strings in MYSQL_FIELD for a query that contained expressions could return incorrect results. (Bug #21635)

  • Range searches on columns with an index prefix could miss records. (Bug #20732)

  • perror crashed on some platforms due to failure to handle a NULL pointer. (Bug #25344)

  • mysql would lose its connection to the server if its standard output was not writable. (Bug #17583)

  • INSERT...ON DUPLICATE KEY UPDATE could cause Error 1032: Can't find record in ... for inserts into an InnoDB table unique index using key column prefixes with an underlying utf8 string column. (Bug #13191)

  • In certain cases it could happen that deleting a row corrupted an RTREE index. This affected indexes on spatial columns. (Bug #25673)

  • The server was built even when configure was run with the --without-server option. (Bug #23973)

    References: See also Bug #32898.

  • ALTER TABLE ENABLE KEYS or ALTER TABLE DISABLE KEYS combined with another ALTER TABLE option other than RENAME TO did nothing. In addition, if ALTER TABLE was used on a table having disabled keys, the keys of the resulting table were enabled. (Bug #24395)

  • Certain joins using Range checked for each record in the query execution plan could cause the server to crash. (Bug #24776)

  • The server might fail to use an appropriate index for DELETE when ORDER BY, LIMIT, and a nonrestricting WHERE are present. (Bug #17711)

  • Adding a day, month, or year interval to a DATE value produced a DATE, but adding a week interval produced a DATETIME value. Now all produce a DATE value. (Bug #21811)