End of Product Lifecycle. Active development and support for MySQL database server versions 3.23, 4.0, and 4.1 has ended. However, for MySQL 4.0 and 4.1, there is still extended support available. For details, see http://www.mysql.com/company/legal/lifecycle/#calendar. According to the MySQL Lifecycle Policy (see http://www.mysql.com/company/legal/lifecycle/#policy), only Security and Severity Level 1 issues will still be fixed for MySQL 4.0 and 4.1. Please consider upgrading to a recent version (MySQL 5.0 or 5.1).
Functionality added or changed:
Incompatible Change:
String comparison now works according to the SQL standard.
Because we have that 'a' = 'a ' then from it
must follow that 'a' > 'a\t'. (The latter
was not the case before MySQL 4.1.2.) To implement it, we had to
change how storage engines compare strings internally. As a side
effect, if you have a table where a CHAR or
VARCHAR column in some row has a value with
the last character less than
ASCII(32), you have to repair
this table. CHECK TABLES tells you if this
problem exists.
(Bug#3152)
Incompatible Change:
The Type output column for SHOW
TABLE STATUS now is labeled Engine.
Incompatible Change:
Handling of the FLOAT and
DOUBLE floating-point data types is more
strict to follow standard SQL. For example, a data type of
FLOAT(3,1) stores a maximum value of 99.9.
Previously, the server allowed larger numbers to be stored. That
is, it stored a value such as 100.0 as 100.0. Now the server
clips 100.0 to the maximum allowable value of 99.9. If you have
tables that were created before MySQL 4.1.2 and that contain
floating-point data not strictly legal for the column type, you
should alter the data types of those columns. For example:
ALTER TABLEtbl_nameMODIFYcol_nameFLOAT(4,1);
Incompatible Change:
Added support for DEFAULT CURRENT_TIMESTAMP
and for ON UPDATE CURRENT_TIMESTAMP
specifications for TIMESTAMP columns. Now you
can explicitly say that a TIMESTAMP column
should be set automatically to the current timestamp for
INSERT and/or UPDATE
statements, or even prevent the column from updating
automatically. Only one column with such an auto-set feature per
table is supported. TIMESTAMP columns created
with earlier versions of MySQL behave as before. Behavior of
TIMESTAMP columns that were created without
explicit specification of default/on as earlier depends on its
position in table: If it is the first
TIMESTAMP column, it be treated as having
been specified as TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP. In other cases, it would
be treated as a TIMESTAMP DEFAULT 0 column.
NOW is supported as an alias for
CURRENT_TIMESTAMP.
Unlike in previous versions, explicit specification of default
values for TIMESTAMP column is never ignored
and turns off the auto-set feature (unless you have
CURRENT_TIMESTAMP as the default).
Incompatible Change: Renamed prepared statements C API functions:
| Old Name | New Name |
mysql_bind_param()
|
mysql_stmt_bind_param()
|
mysql_bind_result()
|
mysql_stmt_bind_result()
|
mysql_prepare()
|
mysql_stmt_prepare()
|
mysql_execute()
|
mysql_stmt_execute()
|
mysql_fetch()
|
mysql_stmt_fetch()
|
mysql_fetch_column()
|
mysql_stmt_fetch_column()
|
mysql_param_count()
|
mysql_stmt_param_count()
|
mysql_param_result()
|
mysql_stmt_param_metadata()
|
mysql_get_metadata()
|
mysql_stmt_result_metadata()
|
mysql_send_long_data()
|
mysql_stmt_send_long_data()
|
Now all functions that operate with a
MYSQL_STMT structure begin with the prefix
mysql_stmt_.
Incompatible Change:
The signature of the
mysql_stmt_prepare() function
was changed to int mysql_stmt_prepare(MYSQL_STMT *stmt,
const char *query, unsigned long length). To create a
MYSQL_STMT handle, you should use the
mysql_stmt_init() function, not
mysql_stmt_prepare().
The FLOAT and DECIMAL
types now obey (precision,scale) settings.
(Bug#10897)
The --defaults-file= option now requires that the filename must exist
(safety fix).
(Bug#3413)file_name
REVOKE ALL PRIVILEGES, GRANT FROM user_list
is changed to a more consistent REVOKE ALL PRIVILEGES,
GRANT OPTION FROM user_list.
(Bug#2642)
Now SQL_SELECT_LIMIT variable has no
influence on subqueries.
(Bug#2600)
For replication of MEMORY
(HEAP) tables: Made the master automatically
write a DELETE FROM statement to its binary
log when a MEMORY table is opened for the
first time since the master's startup. This is for the case
where the slave has replicated a non-empty
MEMORY table, and then the master is shut
down and restarted: the table is now empty on the master; the
DELETE FROM empties it on the slave as well.
Even with this fix, between the master's restart and the first
use of the table on master, the slave still has out-of-date data
in the table. However, if you use the
--init-file option to populate the
MEMORY table on the master at startup, it
ensures that the failing time interval is zero.
(Bug#2477)
ALTER TABLE DROP PRIMARY KEY no longer drops
the first UNIQUE index if there is no primary
index.
(Bug#2361)
MySQL now issues a warning when a SET or
ENUM column with duplicate values in the list
is created.
(Bug#1427)
A name of “Primary” no longer can be specified as
an index name. (That name is reserved for the PRIMARY
KEY if the table has one.)
(Bug#856)
SHOW GRANTS with no FOR
clause or with FOR CURRENT_USER() shows the
privileges for the current session.
mysqld_multi now creates the log in the
directory named by datadir (from the
[mysqld] section in
my.cnf or compiled in), not in
/tmp. Thanks to Christian Hammers from
Debian Security Team for reporting this.
(CVE-2004-0388)
Changed that when the MySQL server has binary logging disabled
(that is, no --log-bin option was used), then
no transaction binary log cache is allocated for connections.
This should save binlog_cache_size bytes of
memory (32KB by default) for every connection.
Added support for character set conversion and
MYSQL_TYPE_BLOB type code in prepared
statement protocol.
When a session having open temporary tables terminates, the
statement automatically written to the binary log is now
DROP TEMPORARY TABLE IF EXISTS instead of
DROP TEMPORARY TABLE, for more robustness.
Added option --to-last-log to
mysqlbinlog, for use in conjunction with
--read-from-remote-server.
mysql command-line client now supports
multiple -e options.
(Bug#591)
New myisam_data_pointer_size system variable.
See Section 5.1.3, “System Variables”.
MySQL now supports up to 64 indexes per table.
The Mac OS X Startup Item has been moved from the directory
/Library/StartupItems/MySQL to
/Library/StartupItems/MySQLCOM to avoid a
file name collision with the MySQL Startup Item installed with
Mac OS X Server. See Section 2.13.2, “Mac OS X Notes”.
Multi-line statements in the mysql
command-line client now are stored in the history file as a
single line.
UNHEX() function implemented.
See Section 11.4, “String Functions”.
Added the ENGINE table option as a synonym
for the TYPE option for CREATE
TABLE and ALTER TABLE.
The --log-warnings server option now is enabled
by default. Disable with --skip-log-warnings.
Internal string-to-number conversion now supports only SQL:2003
compatible syntax for numbers. In particular,
'0x10'+0 does not work anymore. (Actually, it
worked only on some systems before, such as Linux. It did not
work on others, such as FreeBSD or Solaris. Making these queries
OS-independent was the goal of this change.) Use
CONV() to convert hexadecimal
numbers to decimal. Example:
CONV(MID('0x10',3),16,10)+0.
Added the EXAMPLE storage engine.
Added explanation of hidden SELECT of
UNION in output of EXPLAIN
SELECT statement.
Added the storage_engine system variable as a
synonym for table_type.
Added Binlog_cache_use and
Binlog_cache_disk_use status variables that
count the number of transactions that used transaction binary
log and that had to flush this temporary binary log to disk
instead of using only the in-memory buffer. They can be used for
tuning the binlog_cache_size system variable.
Added latin1_spanish_ci (Modern Spanish)
collation for the latin1 character set.
The improved character set support introduced in MySQL 4.1.0 for
the MyISAM and HEAP
storage engines is now available for InnoDB
as well.
If you try to create a key with a key part that is too long, and it is safe to auto-truncate it to a smaller length, MySQL now does so. A warning is generated, rather than an error.
The mysql command-line client no longer stores in the history file multiple copies of identical queries that are run consecutively.
C API enhancement: SERVER_QUERY_NO_INDEX_USED
and SERVER_QUERY_NO_GOOD_INDEX_USED flags are
now set in the server_status field of the
MYSQL structure. It is these flags that make
the query to be logged as slow if mysqld was
started with --log-slow-queries
--log-queries-not-using-indexes.
Added Handler_discover status variable.
Added the
mysql_set_local_infile_handler()
and
mysql_set_local_infile_default()
C API functions.
Added init_connect and
init_slave system variables. The values
should be SQL statements to be executed when each client
connects or each time a slave's SQL thread starts, respectively.
The MySQL server now returns an error if SET
SQL_LOG_BIN or SET SQL_LOG_UPDATE
is issued by a user without the SUPER
privilege (in previous versions it just silently ignored the
statement in this case).
The mysqld Windows server was renamed to mysqld-debug. See Section 2.3.8, “Selecting a MySQL Server Type”.
MyISAM and InnoDB tables
now support index prefix lengths up to 1000 bytes long.
Added the --default-storage-engine server
option as a synonym for --default-table-type.
Prepared statements with all types of subqueries fixed.
UUID() function implemented.
Note that it does not work with replication yet. See
Section 11.10.4, “Miscellaneous Functions”.
mysqlhotcopy now works on NetWare.
CHAR BYTE is an alias for the
BINARY data type. (Previously, it was an
alias for CHAR BINARY.)
Added option --replicate-same-server-id.
MyISAM tables now support keys up to 1000
bytes long.
The ft_boolean_syntax variable now can be
changed while the server is running. See
Section 5.1.3, “System Variables”.
Bugs fixed:
Replication: Following a non-fatal error during the execution of a statement that later succeeded, the master failed to reset the error code to 0, so the error code was written into the binary log. This caused false Did not get the same error as on master errors on the slave. (Bug#2083)
Fixed a bug in REPAIR TABLE that resulted
sometimes in a corrupted table, if the table contained
FULLTEXT indexes and many words of different
lengths that are considered equal (which is possible in certain
collations, such as latin1_german2_ci or
utf8_general_ci).
(Bug#3835)
If server-id was not set using startup
options but with SET GLOBAL, the replication
slave still complained that it was not set.
(Bug#3829)
Fixed a crash of mysqld that was started with
binary logging disabled, but with a non-zero value for the
expire_logs_days system variable.
(Bug#3807)
Fixed crash of GROUP_CONCAT() on
expression with ORDER BY and external
ORDER BY in a query.
(Bug#3752)
Fixed a bug in a query that used DISTINCT and
ORDER BY by column's real name, while the
column had an alias, specified in SELECT
clause.
(Bug#3681)
Fixed a bug in ALL/SOME
subqueries in case of optimization (key field present in
subquery).
(Bug#3646)
mysqld could crash when a table was altered and used at the same time. This was a 4.1.2-specific bug. . (Bug#3643)
Fixed check of EXPLAIN of
UNION.
(Bug#3639)
Fixed crash on second execution of prepared statement with
UNION.
(Bug#3577)
Fixed a crash of the MySQL slave server when it was built with
--with-debug and replicating itself.
(Bug#3568)
Fixed incorrect results of aggregate functions in subquery with empty result set. (Bug#3505)
Multiple-table DELETE statements were always
replicated by the slave if there were some
--replicate-*-ignore-table options and no
--replicate-*-do-table options.
(Bug#3461)
Memory could be corrupted by replicating a LOAD DATA
INFILE from a MySQL 3.23 master. Some less critical
issues remain; see Section 14.7, “Replication Features and Known Problems”.
(Bug#3422)
mysqlbinlog failed to print a
USE statement under those rare circumstances
where the binary log contained a LOAD DATA
INFILE statement.
(Bug#3415)
Incorrect error message when wrong table used in multiple-table
DELETE statement in prepared statements.
(Bug#3411)
Fixed prepared statement support for INSERT,
REPLACE, CREATE,
DELETE, SELECT,
DO, SET and
SHOW. All other commands are prohibited via
prepared statement interface.
(Bug#3406, Bug#3398, Bug#2811)
Fixed security problem in new authentication where password was
not checked for changed GRANT accounts until
FLUSH PRIVILEGES was executed.
(Bug#3404)
Fixed a bug in SHOW GRANTS and
EXPLAIN SELECT character set conversion.
(Bug#3403)
Fixed a rare error condition that caused the slave SQL thread
spuriously to print the message Binlog has bad magic
number and stop when it was not necessary to do so.
(Bug#3401)
Fixed the Exec_master_log_pos column and its
disk image in the relay-log.info file to be
correct if the master had version 3.23. (The value was too big
by six bytes.) This bug does not exist in MySQL 5.0.
(Bug#3400)
Aggregate functions could lead to server crashes when used in prepared statements. (Bug#3360)
Fixed that in some replication error messages, a very long query caused the rest of the message to be invisible (truncated), by putting the query last in the message. (Bug#3357)
Fixed bug that caused execution of prepared statements to fail then table that this statement were using left table cache. This bug showed up as if this prepared statement used random garbage as column names or as server crashes. (Bug#3307)
Fixed a problem resulting from setting the
character_set_results variable to
NULL.
(Bug#3296)
Fixed a symlink vulnerability in the
mysqlbug script.
(Bug#3284)
Fixed bug in privilege checking of ALTER TABLE
RENAME.
(Bug#3270)
Fixed unknown error when negative value bind to unsigned. (Bug#3223)
Fixed mysqlbinlog --read-from-remote-server to print the exact positions of events in the "at #" lines. (Bug#3214)
mysqlbinlog --read-from-remote-server read
all binary logs following the one that was requested. It now
stops at the end of the requested file, the same as it does when
reading a local binary log. There is an option
--to-last-log to get the old behavior.
(Bug#3204)
CONCAT_WS() makes the server die
in case of illegal mix of collations.
(Bug#3087)
Changed that when a thread handling INSERT
DELAYED (also known as a
delayed_insert thread) is killed, its
statements are recorded with an error code of value zero
(killing such a thread does not endanger replication, so we thus
avoid a superfluous error on the slave).
(Bug#3081)
Fixed memory leak in the client library when statement handle
was freed on closed connection (call to
mysql_stmt_close() after
mysql_close()).
(Bug#3073)
Changed that when a DROP TEMPORARY TABLE
statement is automatically written to the binary log when a
session ends, the statement is recorded with an error code of
value zero (this ensures that killing a
SELECT on the master does not result in a
superfluous error on the slave).
(Bug#3063)
Added support for unsigned integer types to prepared statement API . (Bug#3035)
Fixed crash in prepared statements when subquery in the
FROM clause with parameter used.
(Bug#3020)
Fixed that when a Rotate event is found by
the slave SQL thread in the middle of a transaction, the value
of Relay_Log_Pos in SHOW SLAVE
STATUS remains correct.
(Bug#3017)
Corrected the master's binary log position that
InnoDB reports when it is doing a crash
recovery on a slave server.
(Bug#3015)
Fixed a bug in full-text search on multi-byte character set (such as UTF8) that appeared when a search word was shorter than a matching word from the index (for example, searching for “Uppsala” when table data contain “Uppsa*la”). (Bug#3011)
--replicate-wild-*-table rules now apply to
ALTER DATABASE when the table pattern is
%, as is the case for CREATE
DATABASE and DROP DATABASE.
(Bug#3000)
Fixed that a statement never triggers a superfluous error on the
slave, if it must be excluded given the
--replicate-* options. The bug was that if the
statement had been killed on the master, the slave would stop.
(Bug#2983)
UTF8 charset breaks joins with mixed column/string constant. (Bug#2959)
Fixed a bug in the GRANT system. When a
password was assigned to an account at the global level and then
privileges were granted at the database level (without
specifying any password), the existing password was replaced
temporarily in memory until the next FLUSH
PRIVILEGES operation or the server was restarted.
(Bug#2953)
Fixed a segmentation fault when running LOAD DATA FROM
MASTER after RESET SLAVE.
(Bug#2922)
Fixed deadlock when two START SLAVE commands
were run at the same time.
(Bug#2921)
Fixed comparison of tables/database names with
--lower_case_table_names option.
(Bug#2880)
Fixed using subqueries with OR and
AND functions.
(Bug#2838)
Changed the column Seconds_Behind_Master in
SHOW SLAVE STATUS to never show a value of
-1.
(Bug#2826)
Table default character set affects LONGBLOB
columns.
(Bug#2821)
Fixed server segmentation faults when processing malformed prepared statements. (Bug#2795, Bug#2274)
Made clearer the error message that one gets when an update is
refused because of the --read-only option.
(Bug#2757)
Fixed calculation of Index_length in
HEAP table status for
BTREE indexes.
(Bug#2719)
Fixed crash in MATCH ... AGAINST() on a
phrase search operator with a missing closing double quote.
(Bug#2708)
Fixed output of mysqldump --tab. (Bug#2705)
The MySQL server did not report any error if a statement
(submitted through
mysql_real_query() or
mysql_stmt_prepare()) was
terminated by garbage characters. This can happen if you pass a
wrong length parameter to these functions.
The result was that the garbage characters were written into the
binary log.
(Bug#2703)
An issue with the range optimizer caused a segmentation fault on some very rare queries. (Bug#2698)
Fixed a lot of bugs in
GROUP_CONCAT().
(Bug#2695, Bug#3319, Bug#3381)
Fixed processing of RAND() in
subqueries with static tables.
(Bug#2645)
Fixed bug in ALTER TABLE RENAME, when rename
to the table with the same name in another database silently
dropped destination table if it existed.
(Bug#2628)
Fixed bug with SHOW CREATE TABLE ... which
didn't properly double quotes.
(Bug#2593)
Fixed bug with mysqldump not quoting “tricky” names correctly. (Bug#2592)
Fixed bug with quoting of table names in
mysqldump for various values of
sql_mode of server.
(Bug#2591)
Fixed bug in replication with CREATE TABLE ... LIKE
... that resulted in a statement not being written to
the binary log.
(Bug#2557)
Fix for a bug in UNION operations with
InnoDB storage engine, when some columns from
one table were used in one SELECT statement
and some were used in another SELECT
statement.
(Bug#2552)
Fix for a bug that prevented table / column privileges from being loaded on startup. (Bug#2546)
Multiple-table DELETE statements were never
replicated by the slave if there were any
--replicate-*-table options.
(Bug#2527)
Fix for a bug in UNION operations that
prevented proper handling of NULL columns.
This happened only if a column in the first
SELECT node was NOT NULL.
(Bug#2508)
Fixed memory leak in INSERT ... ON DUPLICATE KEY UPDATE
....
(Bug#2438)
Fixed incorrect parsing of subqueries in the
FROM clause.
(Bug#2421)
Fixed a rare table corruption on adding data
(INSERT, REPLACE,
UPDATE, etc. but not
DELETE) to a FULLTEXT
index.
(Bug#2417)
Removed try to check NULL if index built on
column where NULL is impossible in
IN subquery optimization.
(Bug#2393)
Fixed bug in ANALYZE TABLE on a
BDB table inside a transaction that hangs
server thread.
(Bug#2342)
ALTER DATABASE caused the client to hang if
the database did not exist.
(Bug#2333)
Fixed parsing of short-form IP addresses in
INET_ATON().
(Bug#2310)
Compile the MySQL-client RPM package against
libreadline instead of
libedit.
(Bug#2289)
Fixed bug in client library that caused
mysql_stmt_fetch() and
mysql_stmt_store_result() to
hang if they were called without prior call of
mysql_stmt_execute(). Now they
give an error instead.
(Bug#2248)
Fixed
mysql_stmt_affected_rows() call
to always return number of rows affected by given statement.
(Bug#2247)
Fixed bug when using impossible WHERE with
PROCEDURE ANALYSE(). .
(Bug#2238)
Fix for a crashing bug that occurred in the mysql client program when database name was longer then expected. (Bug#2221)
Fix for a bug that caused wrong results when
CAST() was applied on
NULL to signed or unsigned integer column.
(Bug#2219)
Fix for a bug that caused client/server communication to be
broken when
mysql_set_server_option() was
invoked.
(Bug#2207)
Fixed a bug in CHECK TABLE that sometimes
resulted in a spurious error Found key at page ... that
points to record outside datafile for a table with a
FULLTEXT index.
(Bug#2190)
Fixed bug in GRANT with table-level privilege
handling.
(Bug#2178)
Fixed bug in ORDER BY on a small column.
(Bug#2147)
Fixed a crash when the replication slave was unable to create the first relay log. (Bug#2145)
Removed a misleading "check permissions on master.info" from a replication error message, because the cause of the problem could be different from permissions. (Bug#2121)
Queries with subqueries in FROM clause locks
all tables at once for now. This also fixed bugs in
EXPLAIN of subqueries in
FROM output.
(Bug#2120)
Fixed bug with storing values that are out of range for
DOUBLE and FLOAT columns.
(Bug#2082)
Fixed a hang in full-text indexing of strings in multi-byte (all
besides utf8) charsets.
(Bug#2065)
Added optimization that allows for prepared statements using a large number of tables or tables with a large number of columns to be re-executed significantly faster. (Bug#2050)
Fixed a crash in full-text indexing of UTF8 data. (Bug#2033)
Fix for a crashing bug that was caused by not setting
vio_timeout() virtual function for all
protocols. This bug occurred on Windows only.
(Bug#2025)
Replication: a rare race condition in the slave SQL thread that could lead to an incorrect complaint that the relay log is corrupted. (Bug#2011)
Fixed a bug in myisamchk and CHECK
TABLE that sometimes resulted in a spurious error
Found key at page ... that points to record outside
datafile for a table with a
FULLTEXT index.
(Bug#1977)
Replication: If a client connects to a slave server and issues
an administrative statement for a table (for example,
OPTIMIZE TABLE or REPAIR
TABLE), this could sometimes stop the slave SQL
thread. This does not lead to any corruption, but you must use
START SLAVE to get replication going again.
(Bug#1858)
Replication: in the slave SQL thread, a multiple-table
UPDATE could produce an incorrect complaint
that some record was not found in one table, if the
UPDATE was preceded by a INSERT ...
SELECT.
(Bug#1701)
Fixed
mysql_stmt_send_long_data()
behavior on second execution of prepared statement and in case
when long data had zero length.
(Bug#1664)
Fixed bug with compiling --with-pstack with
binutils 2.13.90.
(Bug#1661)
You can now call mysql_stmt_attr_set(...,
STMT_ATTR_UPDATE_MAX_LENGTH) to tell the client
library to update MYSQL_FIELD->max_length
when doing
mysql_stmt_store_result(). .
(Bug#1647)
Fixed a bug with the INTERVAL()
function when 8 or more comparison arguments are provided.
(Bug#1561)
A query that uses both UNION [DISTINCT] and
UNION ALL now works correctly.
(Bug#1428)
Fixed a bug in parallel repair (myisamchk -p,
myisam_repair_threads); sometimes the repair
process failed to repair a table.
(Bug#1334)
Fixed query cache statistics.
Fixed bug in the parser, making the syntax
CONVERT(
legal again.
expr,type)
Packaging: Fixed a bug in the Mac OS PKG
postinstall script
(mysql_install_db was called with an obsolete
argument).
Requiring UPDATE privilege for tables which
are not updated in multiple-table UPDATE
statement in prepared statements.
Fixed a bug in multiple-table UPDATE
statements that resulted in an error when one of the tables was
not updated but was used in the nested query, contained therein.
Fixed DROP DATABASE to report number of
tables deleted.
The --local-load option of
mysqlbinlog now requires an argument.
Fixed a bug that made Max_used_connections to
be less than the actual maximum number of connections in use
simultaneously.
Packaging: Added missing file
mysql_create_system_tables to the server
RPM package. This bug was fixed for the 4.1.1 RPMs by updating
the MySQL-server RPM from
MySQL-server-4.1.1-0 to
MySQL-server-4.1.1-1. The other RPMs were not
affected by this change.
Fixed a bug in CREATE ... SELECT that
sometimes caused a string column with a multi-byte character set
(such as utf8) to have insufficient length to
hold the data.
UNION statements did not consult
SQL_SELECT_LIMIT value when set. This is now
fixed properly, which means that this limit is applied to the
top level query, unless LIMIT for entire
UNION is used.
Prepare statements parameter do not cause error message as
fields used in select list but not included in ORDER
BY list.

User Comments
Add your own comment.