Released on 3 Sep 2003
MySQL 4.0.15 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.


If you are using this release on Windows, you should upgrade at least your clients (any program that uses libmysql.lib) to 4.0.16 or above. This is because the 4.0.15 release had a bug in the Windows client library that causes Windows clients using the library to die with a Lost connection to MySQL server during query error for queries that take more than 30 seconds. This problem is specific to Windows; clients on other platforms are unaffected.

Functionality added or changed:

  • mysqldump now correctly quotes all identifiers when communicating with the server. This assures that during the dump process, mysqldump never sends queries to the server that result in a syntax error. This problem is not related to the mysqldump program's output, which was not changed. (Bug #1148)

  • Change result set metadata information so that MIN() and MAX() report that they can return NULL (this is true because an empty set returns NULL). (Bug #324)

  • Produce an error message on Windows if a second mysqld server is started on the same TCP/IP port as a running mysqld server.

  • The mysqld system variables wait_timeout, net_read_timeout, and net_write_timeout now work on Windows. One can now also set timeouts for read and writes in Windows clients with mysql_options().

  • Added option --sql-mode=NO_DIR_IN_CREATE to make it possible for slaves to ignore INDEX DIRECTORY and DATA DIRECTORY options given to CREATE TABLE. When this is mode is on, SHOW CREATE TABLE does not show the given directories.

  • SHOW CREATE TABLE now shows the INDEX DIRECTORY and DATA DIRECTORY options, if they were specified when the table was created.

  • The open_files_limit system variable now shows the real open files limit.

  • MATCH ... AGAINST() in natural language mode now treats words that are present in more than 2,000,000 rows as stopwords.

  • The Mac OS X installation disk images now include an additional MySQLStartupItem.pkg package that enables the automatic startup of MySQL on system startup. See Section 2.5, “Installing MySQL on Mac OS X”.

  • Most of the documentation included in the binary tarball distributions (.tar.gz) has been moved into a subdirectory docs. See Section 2.1.5, “Installation Layouts”.

  • The manual is now included as an additional info file in the binary distributions. (Bug #1019)

  • The binary distributions now include the embedded server library (libmysqld.a) by default. Due to a linking problem with non-gcc compilers, it was not included in all packages of the initial 4.0.15 release. The affected packages were rebuilt and released as 4.0.15a. See Section 1.5, “MySQL 4.0 in a Nutshell”.

  • MySQL can now use range optimization for BETWEEN with nonconstant limits. (Bug #991)

  • Replication error messages now include the default database, so that users can check which database the failing query was run for.

  • A documentation change: Added a paragraph about how the binlog-do-db and binlog-ignore-db options are tested against the database on the master (see Section 5.3.4, “The Binary Log”), and a paragraph about how --replicate-do-db, --replicate-do-table and analogous options are tested against the database and tables on the slave (see Section 14.8, “Replication and Binary Logging Options and Variables”).

  • Now the slave does not replicate SET PASSWORD if it is configured to exclude the mysql database from replication (using for example --replicate-wild-ignore-table=mysql.%). This was the case for GRANT and REVOKE since version 4.0.13 (although there was Bug #980 in 4.0.13 & 4.0.14, which has been fixed in 4.0.15).

  • Rewrote the information shown in the State column of SHOW PROCESSLIST for replication threads and for MASTER_POS_WAIT() and added the most common states for these threads to the documentation, see Section 14.3, “Replication Implementation Details”.

  • Added a test in replication to detect the case where the master died in the middle of writing a transaction to the binary log; such unfinished transactions now trigger an error message on the slave.

  • A GRANT statement that creates an anonymous user (that is, an account with an empty user name) no longer requires FLUSH PRIVILEGES for the account to be recognized by the server. (Bug #473)

  • CHANGE MASTER TO now flushes Previously this was deferred to the next run of START SLAVE, so if mysqld was shutdown on the slave after CHANGE MASTER TO without having run START SLAVE, the relay log's name and position were lost. At restart they were reloaded from, thus reverting to their old (incorrect) values from before CHANGE MASTER TO and leading to error messages (as the old relay log did not exist any more) and the slave threads refusing to start. (Bug #858)

Bugs fixed:

  • Fixed buffer overflow in password handling which could potentially be exploited by MySQL users with ALTER privilege on the mysql.user table to execute random code or to gain shell access with the UID of the mysqld process (thanks to Jedi/Sector One for spotting and reporting this bug). (CVE-2003-0780)

  • Fixed server crash on FORCE INDEX in a query that contained "Range checked for each record" in the EXPLAIN output. (Bug #1172)

  • Fixed table/column grant handling: The proper sort order (from most specific to less specific, see Section 5.5.5, “Access Control, Stage 2: Request Verification”) was not honored. (Bug #928)

  • Fixed rare bug in MYISAM introduced in 4.0.3 where the index file header was not updated directly after an UPDATE of split dynamic rows. The symptom was that the table had a corrupted delete-link if mysqld was shut down or the table was checked directly after the update.

  • Fixed Can't unlock file error when running myisamchk --sort-index on Windows. (Bug #1119)

  • Fixed possible deadlock when changing key_buffer_size while the key cache was actively used. (Bug #1088)

  • Fixed overflow bug in MyISAM and ISAM when a row is updated in a table with a large number of columns and at least one BLOB/TEXT column.

  • Fixed incorrect result when doing UNION and LIMIT #,# when braces were not used around the SELECT parts.

  • Fixed incorrect result when doing UNION and ORDER BY .. LIMIT # when one didn't use braces around the SELECT parts.

  • Fixed problem with SELECT SQL_CALC_FOUND_ROWS ... UNION ALL ... LIMIT # where FOUND_ROWS() returned incorrect number of rows.

  • Fixed unlikely stack bug when having a BIG expression of type 1+1-1+1-1... in certain combinations. (Bug #871)

  • Fixed the bug that sometimes prevented a table with a FULLTEXT index from being marked as "analyzed".

  • Fixed MySQL so that the column length (in C API) for the second column in SHOW CREATE TABLE is always larger than the data length. The only known application that was affected by the old behavior was Borland dbExpress, which truncated the output from the command. (Bug #1064)

  • Fixed crash in comparisons of strings using the tis620 character set. (Bug #1116)

  • Fixed ISAM bug in MAX() optimization.

  • myisamchk --sort-records=N no longer marks table as crashed if sorting failed because of an inappropriate key. (Bug #892)

  • Fixed a minor bug in MyISAM compressed table handling that sometimes made it impossible to repair compressed table in "Repair by sort" mode. "Repair with keycache" (myisamchk --safe-recover) worked, though. (Bug #1015)

  • Fixed bug in propagating the version number to the manual included in the distribution files. (Bug #1020)

  • Fixed key sorting problem (a PRIMARY key declared for a column that is not explicitly marked NOT NULL was sorted after a UNIQUE key for a NOT NULL column).

  • Fixed the result of INTERVAL when applied to a DATE value. (Bug #792)

  • Fixed compiling of the embedded server library in the RPM spec file. (Bug #959)

  • Added some missing files to the RPM spec file and fixed some RPM building errors that occurred on Red Hat Linux 9. (Bug #998)

  • Fixed incorrect XOR evaluation in WHERE clause. (Bug #992)

  • Fixed bug with processing in query cache merged tables constructed from more than 255 tables. (Bug #930)

  • Fixed incorrect results from outer join query (for example, LEFT JOIN) when ON condition is always false, and range search in used. (Bug #926)

  • Fixed a bug causing incorrect results from MATCH ... AGAINST() in some joins. (Bug #942)

  • MERGE tables do not ignore Using index (from EXPLAIN output) anymore.

  • Fixed a bug that prevented an empty table from being marked as "analyzed". (Bug #937)

  • Fixed myisamchk --sort-records crash when used on compressed table.

  • Fixed slow (as compared to 3.23) ALTER TABLE and related commands such as CREATE INDEX. (Bug #712)

  • Fixed segmentation fault resulting from LOAD DATA FROM MASTER when the master was running without the --log-bin option. (Bug #934)

  • Fixed a security bug: A server compiled without SSL support still permitted connections by users who had the REQUIRE SSL option specified for their accounts.

  • Fixed a random bug: Sometimes the slave would replicate GRANT or REVOKE queries even if it was configured to exclude the mysql database from replication (for example, using --replicate-wild-ignore-table=mysql.%). (Bug #980)

  • The Last_Errno and Last_Error fields in the output of SHOW SLAVE STATUS are now cleared by CHANGE MASTER TO and when the slave SQL thread starts. (Bug #986)

  • A documentation mistake: It said that RESET SLAVE does not change connection information (master host, port, user, and password), whereas it does. The statement resets these to the startup options (master-host etc) if there were some. (Bug #985)

  • SHOW SLAVE STATUS now shows correct information (master host, port, user, and password) after RESET SLAVE (that is, it shows the new values, which are copied from the startup options if there were some). (Bug #985)

  • Disabled propagation of the original master's log position for events because this caused unexpected values for Exec_Master_Log_Pos and problems with MASTER_POS_WAIT() in A->B->C replication setup. (Bug #1086)

  • Fixed a segmentation fault in mysqlbinlog when --position=x was used with x being between a Create_file event and its fellow Append_block, Exec_load or Delete_file events. (Bug #1091)

  • mysqlbinlog printed superfluous warnings when using --database, which caused syntax errors when piped to mysql. (Bug #1092)

  • Made mysqlbinlog --database filter LOAD DATA INFILE too (previously, it filtered all queries except LOAD DATA INFILE). (Bug #1093)

  • mysqlbinlog in some cases forgot to put a leading '#' in front of the original LOAD DATA INFILE (this command is displayed only for information, not to be run; it is later reworked to LOAD DATA LOCAL with a different file name, for execution by mysql). (Bug #1096)

  • binlog-do-db and binlog-ignore-db incorrectly filtered LOAD DATA INFILE (it was half-written to the binary log). This resulted in a corrupted binary log, which could cause the slave to stop with an error. (Bug #1100)

  • When, in a transaction, a transactional table (such as an InnoDB table) was updated, and later in the same transaction a nontransactional table (such as a MyISAM table) was updated using the updated content of the transactional table (with INSERT ... SELECT for example), the queries were written to the binary log in an incorrect order. (Bug #873)

  • When, in a transaction, INSERT ... SELECT updated a nontransactional table, and ROLLBACK was issued, no error was returned to the client. Now the client is warned that some changes could not be rolled back, as this was the case for normal INSERT. (Bug #1113)

  • Fixed a potential bug: When STOP SLAVE was run while the slave SQL thread was in the middle of a transaction, and then CHANGE MASTER TO was used to point the slave to some nontransactional statement, the slave SQL thread could get confused (because it would still think, from the past, that it was in a transaction).