Released on 28 Jun 2004
MySQL 4.1.3 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.


The initial release of MySQL 4.1.3 for Windows was accidentally compiled without support for the Spatial Extensions (OpenGIS). This was fixed by rebuilding from the same 4.1 code snapshot with the missing option and releasing those packages as version 4.1.3a.

To enable compiling the newly released PHP 5 against MySQL 4.1.3 on Windows, the Windows packages had to be rebuilt once more to add a few missing symbols to the MySQL client library. These packages were released as MySQL 4.1.3b.

Functionality Added or Changed

  • Incompatible Change: The timezone system variable has been removed and replaced by system_time_zone. See Section 5.1.3, “Server System Variables”.

  • Incompatible Change: C API change: mysql_shutdown() now requires a second argument. This is a source-level incompatibility that affects how you compile client programs; it does not affect the ability of compiled clients to communicate with older servers. See Section, “mysql_shutdown()”.

  • Replication: Replication and mysqlbinlog now have better support for the case that the session character set and collation variables are changed within a given session. See Section 14.7, “Replication Features and Issues”.

  • Replication: DROP DATABASE IF EXISTS, DROP TABLE IF EXISTS, single-table DELETE and single-table UPDATE are now written to the binary log even if they changed nothing on the master (for example, even if the DELETE matched no row). The old behavior sometimes caused bad surprises in replication setups.

  • Added SQL syntax for prepared statements. See Section 12.6, “SQL Syntax for Prepared Statements”.

  • Added the sync_binlog=N global variable and startup option, which makes the MySQL server synchronize its binary log to disk (fdatasync()) after every Nth write to the binary log.

  • CHECK TABLE now can be killed. It then marks the table as corrupted. See Section, “KILL Syntax”.

  • OPTIMIZE TABLE for InnoDB tables is now mapped to ALTER TABLE instead of ANALYZE TABLE.

  • Added the ARCHIVE storage engine.

  • Added --innodb-safe-binlog server option, which adds consistency guarantees between the content of InnoDB tables and the binary log. See Section 5.3.4, “The Binary Log”.

  • sync_frm is now a settable global variable (not only a startup option).

  • Support for per-connection time zones was added. Now you can set the current time zone for a connection by setting the @@time_zone system variable to a value such as '+10:00' or 'Europe/Moscow' (where 'Europe/Moscow' is the name of one of the time zones described in the system tables). Functions like CURRENT_TIMESTAMP, UNIX_TIMESTAMP, and so forth honor this time zone. Values of TIMESTAMP type are also interpreted as values in this time zone. So now our TIMESTAMP type behaves similar to Oracle's TIMESTAMP WITH LOCAL TIME ZONE. That is, values stored in such a column are normalized toward UTC and converted back to the current connection time zone when they are retrieved from such a column. To set up the tables that store time zone information, see Section 2.10, “Postinstallation Setup and Testing”.

  • LIKE now supports the use of a prepared statement parameter or delimited constant expression as the argument to ESCAPE . (Bug #4200)

  • Language-specific collations were added for the ucs2 and utf8 Unicode character sets: Icelandic, Latvian, Romanian, Slovenian, Polish, Estonian, Swedish, Turkish, Czech, Danish, Lithuanian, Slovak, Spanish, Traditional Spanish.

  • Changed the slave SQL thread to print fewer useless error messages (no more message duplication; no more messages when an error is skipped (because of slave-skip-errors).

  • Basic time zone conversion function CONVERT_TZ() was added. It assumes that its first argument is a datetime value in the time zone specified by its second argument and returns the equivalent datetime value in the time zone specified by its third argument.

Bugs Fixed

  • Replication: Complex expressions using AND, OR, or both could result in a crash if the query containing the expression query was ignored, either by a replication server due to --replicate-*-table rules, or by any MySQL server due to a syntax error. (Bug #3969, Bug #4494)

  • Replication: The slave SQL thread refused to replicate INSERT ... SELECT if it examined more than 4 billion rows. (Bug #3871)

  • Re-execution of optimized COUNT(*), MAX(), and MIN() functions is now handled correctly for prepared statements. (Bug #2687)

  • Different numbers of warnings were generated when an invalid datetime (as a string or as a number) was inserted into a DATETIME or TIMESTAMP column. (Bug #2336)

  • During the installation process of the server RPM on Linux, if mysqld was run as the root system user and with --log-bin pointing to a directory outside of /var/lib/mysql, it created binary log files owned by root in this directory, which remained owned by root after the installation. Now mysqld is started as the mysql system user instead. (Bug #4038)

  • A potential memory overrun could occur in mysql_real_connect() (which required a compromised DNS server and certain operating systems). (Bug #4017)

  • CREATE DATABASE IF NOT EXISTS caused an error on Win32 platforms if the database existed. (Bug #4378)

  • Attempt to prepare a statement containing a character set introducer caused the server to crash. (Bug #4105)

  • Attempting to execute a nonprepared statement could cause the server to crash. (Bug #4236)

  • mysqlbinlog didn't escape the string content of user variables, and did not deal well when these variables were in non-ASCII character sets; this is now fixed by always printing the string content of user variables in hexadecimal. The character set and collation of the string is now also printed. (Bug #3875)

  • UNION returned incorrect results if the display length of columns for numeric types was set to less than the actual length of values in them. (Bug #4067)

  • Conversion of a client-side string column to a MYSQL_TIME application buffer was not handled correctly by the prepared statements API. (Bug #4030)

  • Prepared EXPLAIN statements could lead to a server crash. (Bug #4271)

  • A malicious user could bypass password verification with specially crafted packets, using a modified client library. (CVE-2004-0627, CVE-2004-0628)

  • NULL was not handled correctly with derived tables. (Bug #4097)

  • MERGE tables created with INSERT_METHOD=LAST were not able to report a key number, causing Duplicate entry errors for UNIQUE keys in INSERT statements. As a result, the error message was not precise enough (error 1022 instead of error 1062) and INSERT ... ON DUPLICATE KEY UPDATE did not work. (Bug #4008)

  • Parameters in some prepared statements were not handled correctly. (Bug #4280)

  • Prepared statements did not always work correctly on big-endian platforms. (Bug #4173)

  • CONCAT(?, col_name), when used in prepared statements, returned incorrect results. (Bug #3796)

  • Tables were unlocked too early in cases of a subquery in a query's HAVING clause. (Bug #3984)

  • The range optimizer did not perform correctly when using many IN() queries on different key parts. (Bug #4157)

  • Performance of COUNT(DISTINCT) degraded in cases like COUNT(DISTINCT a TEXT, b CHAR(1)) (no index used). (Bug #3904)

  • In rare circumstances, DELETE from a table with FULLTEXT indexes resulted in a corrupted table, if words of different lengths could be considered equal. This is possible with some collations, for example, utf8_general_ci and latin1_german2_ci. (Bug #3808)

  • mysql_stmt_close() hung when attempting to close a statement after failed mysql_stmt_fetch() call. (Bug #4079)

  • Using --with-charset with configure did not affect the MySQL client library. (Bug #3990)

  • Added missing root account to Windows version of mysqld. (Bug #4242)

  • The microseconds part of MYSQL_TYPE_TIME/MYSQL_TYPE_DATETIME columns was not sent to the client by prepared statements. (Bug #4026)

  • mysqldump when it did not return any error if the output device was full. (Bug #1851)

  • Made DROP DATABASE honor the value of lower_case_table_names. (Bug #4066)

  • Under rare circumstances, MATCH ... AGAINST(... IN BOOLEAN MODE) could yield incorrect results if, in the collation used for the data, one byte could match many (as in utf8_general_ci and latin1_german2_ci.) (Bug #3964)