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 http://www.mysql.com/about/legal/lifecycle/#calendar. 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.
Functionality added or changed:
Security Fix:
The
--defaults-file=
option now requires that the file name must exist.
(Bug#3413)file_name
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_name
MODIFYcol_name
FLOAT(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()
.
Replication:
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 nonempty
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)
Replication:
UUID()
function implemented. Note
that it does not work with replication yet. See
Section 11.10.4, “Miscellaneous Functions”.
Replication:
Added option
--replicate-same-server-id
.
The FLOAT
and
DECIMAL
types now obey
(precision,scale) settings.
(Bug#10897)
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)
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, “Server 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.12.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 now work with all types of subqueries.
mysqlhotcopy now works on NetWare.
CHAR BYTE
is an alias for the
BINARY
data type. (Previously, it
was an alias for CHAR BINARY
.)
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, “Server System Variables”.
Bugs fixed:
Packaging:
In the Mac OS PKG postinstall
script,
mysql_install_db was invokrd with an invalid
argument.
Replication:
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)
Replication:
A MySQL slave server built using
--with-debug
, and replicating
itself, crashed.
(Bug#3568)
Replication:
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)
Replication:
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)
Replication: 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)
Replication:
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)
Replication:
Corrected the master's binary log position that
InnoDB
reports when it is doing a crash
recovery on a slave server.
(Bug#3015)
Replication:
--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)
Replication:
Statements did not raise errors on the slave, if the slave was
excluded given the --replicate-*
options in use
at the time. The effect of this problem was: when a statement
was killed on the master, the slave stopped.
(Bug#2983)
Replication:
CREATE TABLE ... LIKE ...
statements were not
always written to the binary log.
(Bug#2557)
Replication:
Multiple-table DELETE
statements
were never replicated by the slave if there were any
--replicate-*-table
options.
(Bug#2527)
Replication: If a replication slave was unable to create the first relay log, it crashed. (Bug#2145)
Replication: 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)
Replication: Following a nonfatal 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)
Replication: 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)
Replication:
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:
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)
REPAIR TABLE
could corrupt a
table containing 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)
Starting mysqld with binary logging disabled,
but with a nonzero value for the
expire_logs_days
system
variable caused the server to crash.
(Bug#3807)
Using the GROUP_CONCAT()
function
on an expression with ORDER BY
as well as an
external ORDER BY
in a query caused the
server to crash.
(Bug#3752)
The results of a query that used DISTINCT
and
ORDER BY
by a column's real name, while
the column had an alias specified in the
SELECT
clause, were not returned
in the correct order.
(Bug#3681)
Optimization of ALL
and
SOME
subqueries was not performed well (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)
EXPLAIN
should now work correctly
with UNION
queries.
(Bug#3639)
The second execution of a prepared statement using
UNION
caused the server to crash.
(Bug#3577)
Results of aggregate functions used in subqueries with empty result sets were incorrect. (Bug#3505)
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)
Prepared statements are supported for
INSERT
,
REPLACE
,
CREATE
,
DELETE
,
SELECT
,
DO
,
SET
and
SHOW
statements. All other
statements are now prohibited by the prepared statement
interface.
(Bug#3406, Bug#3398, Bug#2811)
A password was not checked for changes in
GRANT
accounts until
FLUSH
PRIVILEGES
was executed.
(Bug#3404)
SHOW GRANTS
and
EXPLAIN
SELECT
did not always perform character set conversion
correctly.
(Bug#3403)
A rare error condition 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)
The Exec_master_log_pos
column and its disk
image in the relay-log.info
were not
handled correctly 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)
FLUSH TABLES
sometimes corrupted table resolution for statements which were
prepared before the FLUSH
TABLES
but which were being executed repeatedly
afterwards.
(Bug#3307)
On Linux platforms, setting the
character_set_results
variable
to NULL
and then attempting to retrieve it
using SELECT @@character_set_results
caused
the server to crash.
(Bug#3296)
There was a symlink vulnerability in the
mysqlbug
script.
(Bug#3284)
Privileges were not checked correctly for ALTER TABLE
RENAME
.
(Bug#3270)
Attempting to bind a negative value bind to unsigned caused an Unknown error. (Bug#3223)
mysqlbinlog --read-from-remote-server now
print the exact positions of events in lines beginning with
at #
in the log.
(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)
A memory leak occurred in the client library when a statement
handle was freed on a 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)
A prepared statement using parameters and having a subquery in
the FROM
clause could cause the server to
crash.
(Bug#3020)
When a Rotate
event was found by the slave
SQL thread in the middle of a transaction, the value of
Relay_Log_Pos
in SHOW
SLAVE STATUS
was incorrectly altered.
(Bug#3017)
Full-text search on multi-byte character sets (such as UTF8) that appeared when a search word was shorter than a matching word from the index (for example, searching for “Uppsala” when the table contains “Uppsa*la”). (Bug#3011)
UTF8 charset breaks joins with mixed column/string constant. (Bug#2959)
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)
Running LOAD DATA FROM MASTER
after
RESET SLAVE
caused a segmentation
fault.
(Bug#2922)
A deadlock ocurred when two START
SLAVE
commands were run at the same time.
(Bug#2921)
Comparison of table and database names when using the
--lower_case_table_names
option was not always
performed correctly.
(Bug#2880)
Subqueries with OR
and AND
did not always work correctly.
(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)
Segmentation faults could occur 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)
Index_length
in HEAP
table
status for BTREE
indexes was not calculated
correctly.
(Bug#2719)
MATCH ... AGAINST()
on a phrase search
operator with a missing closing double quote caused the server
to crash.
(Bug#2708)
The output of mysqldump --tab was not correct. (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)
The GROUP_CONCAT()
had a number
of issues with ORDER BY
and
DISTINCT
, and with GROUP
BY
in subqueries.
(Bug#2695, Bug#3319, Bug#3381)
Processing of RAND()
in
subqueries with static tables was not always handled correctly.
(Bug#2645)
When ALTER TABLE RENAME
, was used to rename a
table with the same name in another database, it silently
dropped the destination table if it existed.
(Bug#2628)
SHOW CREATE TABLE ...
did not properly double
quotes.
(Bug#2593)
mysqldump did not quote names containing
backtick characters (`
) correctly.
(Bug#2592)
Table names in were quoted in mysqldump when using values for the server SQL mode where this was not appropriate. (Bug#2591)
UNION
operations with the
InnoDB
storage engine, when some columns from
one table were used in one SELECT
statement and some were used in another
SELECT
statement, were not
handled correctly.
(Bug#2552)
Table and column privileges were not loaded on startup. (Bug#2546)
UNION
operations did not handle
NULL
columns properly, when a column in the
first SELECT
node was
NOT NULL
.
(Bug#2508)
A memory leak could occur with
INSERT ...
ON DUPLICATE KEY UPDATE
.
(Bug#2438)
Subqueries in the FROM
clause were not always
parsed correctly.
(Bug#2421)
Write operations on a column hvaing a
FULLTEXT
index could under some rare
circumstances lead to table file corruption.
(Bug#2417)
Removed try to check NULL
if index built on
column where NULL
is impossible in
IN
subquery optimization.
(Bug#2393)
ANALYZE TABLE
on a
BDB
table inside a transaction caused the
server to hang.
(Bug#2342)
ALTER DATABASE
caused the client
to hang if the database did not exist.
(Bug#2333)
Short-form IP addresses used as arguments to
INET_ATON()
were not parsed
correctly.
(Bug#2310)
Compile the MySQL-client
RPM package against
libreadline
instead of
libedit
.
(Bug#2289)
mysql_stmt_fetch()
and
mysql_stmt_store_result()
could
hang if they were called without a prior call to
mysql_stmt_execute()
. Now they
give an error instead.
(Bug#2248)
mysql_stmt_affected_rows()
now
always returns the number of rows affected by a given statement.
(Bug#2247)
Using an impossible WHERE
with
PROCEDURE ANALYSE()
caused the server to
hang.
(Bug#2238)
The mysql client program crashed when passed a database name that was longer then expected. (Bug#2221)
Invalid results were returned when
CAST()
was applied to
NULL
to obtain a signed or unsigned integer
value.
(Bug#2219)
Invoking
mysql_set_server_option()
caused
client-server communications to be broken.
(Bug#2207)
CHECK TABLE
sometimes produced a
spurious error Found key at page ... that points to
record outside datafile for a table with a
FULLTEXT
index.
(Bug#2190)
GRANT
did not handle table-level
privileges correctly.
(Bug#2178)
ORDER BY
did not always work correctly with
SMALLINT
columns.
(Bug#2147)
Queries with subqueries in the FROM
clause
now lock all tables at once.
EXPLAIN
of subqueries in
FROM
output was also not handled correctly.
(Bug#2120)
DOUBLE
and
FLOAT
columns could store out of
range values.
(Bug#2082)
Full-text indexing of strings in multi-byte (all besides
utf8
) charsets could sometimes hang.
(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)
Full-text indexing of UTF8 data did not work correctly. (Bug#2033)
vio_timeout()
virtual function was not set
for all protocols. This lead to crashes on Windows.
(Bug#2025)
myisamchk and CHECK
TABLE
that sometimes a spurious error Found
key at page ... that points to record outside
datafile for a table with a
FULLTEXT
index.
(Bug#1977)
mysql_stmt_send_long_data()
misbehaved on the second execution of a prepared statement when
long data had zero length.
(Bug#1664)
Compiling the server using the --with-pstack
options did not work 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)
The INTERVAL()
function did not
work correctly when 8 or more comparison arguments were used.
(Bug#1561)
A query that uses both UNION [DISTINCT]
and
UNION ALL
now
works correctly.
(Bug#1428)
Parallel repair (myisamchk -p,
myisam_repair_threads
)
sometimes failed to repair a table.
(Bug#1334)
The syntax
CONVERT(
is now supported again.
expr
,type
)
Requiring UPDATE
privilege for
tables which are not updated in multiple-table
UPDATE
statement in prepared
statements.
A multiple-table UPDATE
statement
resulted in an error when one of the tables was not updated but
was used in the nested query contained therein.
DROP DATABASE
now reports the
number of tables deleted.
The --local-load
option of
mysqlbinlog now requires an argument.
Max_used_connections
was 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.
CREATE ... SELECT
sometimes created a string
column with a multi-byte character set (such as
UTF8
) of insufficient length for holding 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.