Functionality added or changed:
CHAR BYTE is an alias for the
BINARY data type. (Previously, it was an
alias for CHAR BINARY.)
Warning: 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);
Warning: 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)
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.
Warning: Incompatible change:
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).
Warning: 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_.
Warning: 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().
Warning: Incompatible change:
The Type output column for SHOW
TABLE STATUS now is labeled
Engine.
Added the EXAMPLE storage engine.
The mysqld Windows server was renamed to mysqld-debug. See Section 2.3.8, “Selecting a MySQL Server type”.
Added Handler_discover status variable.
Added support for character set conversion and
MYSQL_TYPE_BLOB type code in prepared
statement protocol.
Added explanation of hidden SELECT of
UNION in output of EXPLAIN
SELECT statement.
mysql command-line client now supports
multiple -e options. (Bug#591)
New myisam_data_pointer_size system
variable. See Section 5.2.2, “System Variables”.
The --log-warnings server option now is
enabled by default. Disable with
--skip-log-warnings.
The
--defaults-file=
option now requires that the filename must exist (safety fix).
(Bug#3413)
file_name
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)
SHOW GRANTS with no FOR
clause or with FOR CURRENT_USER() shows the
privileges for the current session.
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.
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)
MySQL now issues a warning when a SET or
ENUM column with duplicate values in the
list is created. (Bug#1427)
Now SQL_SELECT_LIMIT variable has no
influence on subqueries. (Bug#2600)
UNHEX() function implemented. See
Section 12.3, “String Functions”.
The mysql command-line client no longer stores in the history file multiple copies of identical queries that are run consecutively.
Multi-line statements in the mysql
command-line client now are stored in the history file as a
single line.
UUID() function implemented. Note that it
does not work with replication yet. See
Section 12.9.4, “Miscellaneous Functions”.
Prepared statements with all types of subqueries fixed.
MySQL now supports up to 64 indexes per table.
MyISAM tables now support keys up to 1000
bytes long.
MyISAM and InnoDB tables
now support index prefix lengths up to 1000 bytes long.
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 ft_boolean_syntax variable now can be
changed while the server is running. See
Section 5.2.2, “System Variables”.
REVOKE ALL PRIVILEGES, GRANT FROM user_list
is changed to a more consistent REVOKE ALL
PRIVILEGES, GRANT OPTION FROM user_list. (Bug#2642)
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.
mysqlhotcopy now works on NetWare.
ALTER TABLE DROP PRIMARY KEY no longer
drops the first UNIQUE index if there is no
primary index. (Bug#2361)
Added latin1_spanish_ci (Modern Spanish)
collation for the latin1 character set.
Added the ENGINE table option as a synonym
for the TYPE option for CREATE
TABLE and ALTER TABLE.
Added the --default-storage-engine server
option as a synonym for --default-table-type.
Added the storage_engine system variable as
a synonym for table_type.
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.
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.
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 master's startup. This is for
the case where the slave has replicated a non-empty
MEMORY table, then the master is shut down
and restarted: the table is now empty on master; the
DELETE FROM empties it on slave too. Note
that 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. But 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)
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.
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).
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 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 option --replicate-same-server-id.
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”.
Added option --to-last-log to
mysqlbinlog, for use in conjunction with
--read-from-remote-server.
The FLOAT and DECIMAL
types now obey (precision,scale) settings. (Bug#10897)
Added the mysql_set_local_infile_handler()
and mysql_set_local_infile_default() C API
functions.
Bugs fixed:
Fixed check of EXPLAIN of
UNION. (Bug#3639)
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)
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 bug when using impossible WHERE with
PROCEDURE ANALYSE(). (Bug#2238).
Fixed security problem in new authentication where password
was not checked for changed GRANT accounts
until FLUSH PRIVILEGES was executed. (Bug#3404)
Fixed crash of GROUP_CONCAT() on expression
with ORDER BY and external ORDER
BY in a query. (Bug#3752)
Fixed a bug in ALL/SOME
subqueries in case of optimization (key field present in
subquery). (Bug#3646)
Fixed a bug in SHOW GRANTS and
EXPLAIN SELECT character set conversion.
(Bug#3403)
Prepare statements parameter do not cause error message as
fields used in select list but not included in ORDER
BY list.
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.
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 mysql_stmt_send_long_data() behavior
on second execution of prepared statement and in case when
long data had zero length. (Bug#1664)
Fixed crash on second execution of prepared statement with
UNION. (Bug#3577)
Fixed incorrect results of aggregate functions in subquery with empty result set. (Bug#3505)
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).
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 unknown error when negative value bind to unsigned. (Bug#3223)
Fixed aggregate function in prepared statements. (Bug#3360)
Incorrect error message when wrong table used in
multiple-table DELETE statement in prepared
statements. (Bug#3411)
Requiring UPDATE privilege for tables which
are not updated in multiple-table UPDATE
statement in prepared statements.
Fixed prepared statement support for
INSERT, REPLACE,
CREATE, DELETE,
SELECT, DO,
SET and SHOW. All other
commands are prohibited via prepared statement interface. (Bug#3398, Bug#3406, Bug#2811)
Fixed a lot of bugs in GROUP_CONCAT(). (Bug#2695, Bug#3381, Bug#3319)
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 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 query cache statistics.
Fixed bug in ANALYZE TABLE on a
BDB table inside a transaction that hangs
server thread. (Bug#2342)
Fixed a symlink vulnerability in the
mysqlbug script. (Bug#3284,
CVE-2004-0381)
Fixed a bug in parallel repair (myisamchk
-p, myisam_repair_threads);
sometimes the repair process failed to repair a table. (Bug#1334)
A query that uses both UNION [DISTINCT] and
UNION ALL now works correctly. (Bug#1428)
Table default character set affects
LONGBLOB columns. (Bug#2821)
CONCAT_WS() makes the server die in case of
illegal mix of collations. (Bug#3087)
UTF8 charset breaks joins with mixed column/string constant. (Bug#2959)
Fixed DROP DATABASE to report number of
tables deleted.
Fixed bug in privilege checking of ALTER TABLE
RENAME. (Bug#3270,
CVE-2004-0835)
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)
Fixed server segmentation faults when processing malformed prepared statements. (Bug#2795, Bug#2274)
Fixed using subqueries with OR and
AND functions. (Bug#2838)
Fixed comparison of tables/database names with
--lower_case_table_names option. (Bug#2880)
Removed try to check NULL if index built on
column where NULL is impossible in
IN subquery optimization. (Bug#2393)
Fixed incorrect parsing of subqueries in the
FROM clause. (Bug#2421)
Fixed processing of RAND() in subqueries
with static tables. (Bug#2645)
Fixed bug with quoting of table names in
mysqldump for various values of
sql_mode of server. (Bug#2591)
Fixed bug with storing values that are out of range for
DOUBLE and FLOAT
columns. (Bug#2082)
Fixed bug with compiling --with-pstack with
binutils 2.13.90. (Bug#1661)
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 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)
Fixed a bug that made Max_used_connections
to be less than the actual maximum number of connections in
use simultaneously.
Fixed calculation of Index_length in
HEAP table status for
BTREE indexes. (Bug#2719)
Fixed mysql_stmt_affected_rows() call to
always return number of rows affected by given statement. (Bug#2247)
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)
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)
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)
Fixed a few years old bug in the range optimizer that caused a segmentation fault on some very rare queries. (Bug#2698)
Fixed bug with SHOW CREATE TABLE ... which
didn't properly double quotes. (Bug#2593)
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 mysqldump not quoting “tricky” names correctly. (Bug#2592)
Fix for a bug that prevented table / column privileges from being loaded on startup. (Bug#2546)
Fixed bug in replication with CREATE TABLE ... LIKE
... that resulted in a statement not being written
to the binary log. (Bug#2557)
Fixed memory leak in INSERT ... ON DUPLICATE KEY
UPDATE .... (Bug#2438)
Fixed bug in the parser, making the syntax
CONVERT(
legal again.
expr,type)
Fixed parsing of short-form IP addresses in
INET_ATON(). (Bug#2310)
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.
Fixed a rare table corruption on adding data
(INSERT, REPLACE,
UPDATE, etc. but not
DELETE) to a FULLTEXT
index. (Bug#2417)
Compile the MySQL-client RPM package
against libreadline instead of
libedit. (Bug#2289)
Fix for a crashing bug that was caused by not setting
vio_timeout() virtual function for all
protocols. This bug occurred on Windows. (Bug#2025)
Fix for a bug that caused mysql client program to erroneously cache the value of the current database. (Bug#2025)
Fix for a bug that caused client/server communication to be
broken when mysql_set_server_option() or
mysql_get_server_option() were invoked.
(Bug#2207)
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 crashing bug that occurred in the mysql client program when database name was longer then expected. (Bug#2221)
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 bug with the INTERVAL() function
when 8 or more comparison arguments are provided. (Bug#1561)
Packaging: Fixed a bug in the Mac OS PKG
postinstall script
(mysql_install_db was called with an
obsolete argument).
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 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)
Fixed a hang in full-text indexing of strings in multi-byte
(all besides utf8) charsets. (Bug#2065)
Fixed a crash in full-text indexing of UTF8 data. (Bug#2033)
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: 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)
Replication: sometimes the master gets a non-fatal error
during the execution of a statement but finally the statements
succeeds (for example, a write to a MyISAM
table first receives "no space left on device" but is able to
finally complete, see Section A.4.3, “How MySQL Handles a Full Disk”); the bug
was that the master forgot to reset the error code to 0 after
success, so the error code got into its binary log, thus
making the slave giving false alarms like "did not get the
same error as on master". (Bug#2083)
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)
Fixed a crash when the replication slave was unable to create the first relay log. (Bug#2145)
ALTER DATABASE caused the client to hang if
the database did not exist. (Bug#2333)
Multiple-table DELETE statements were never
replicated by the slave if there were any
--replicate-*-table options. (Bug#2527)
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)
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)
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)
Made clearer the error message that one gets when an update is
refused because of the --read-only option.
(Bug#2757)
Fixed that --replicate-wild-*-table rules
apply to ALTER DATABASE when the table
pattern is %, as is the case for
CREATE DATABASE and DROP
DATABASE. (Bug#3000)
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)
Changed the column Seconds_Behind_Master in
SHOW SLAVE STATUS to never show a value of
-1. (Bug#2826)
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)
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 deadlock when two START SLAVE
commands were run at the same time. (Bug#2921)
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)
The --local-load option of
mysqlbinlog now requires an argument.
Fixed a segmentation fault when running LOAD DATA
FROM MASTER after RESET SLAVE.
(Bug#2922)
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)
Fixed mysqlbinlog --read-from-remote-server to print the exact positions of events in the "at #" lines. (Bug#3214)
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)
Fixed mysqlbinlog not to forget to print a
USE statement under rare circumstances
where the binary log contained a LOAD DATA
INFILE statement. (Bug#3415)
Fixed a memory corruption when replicating a LOAD
DATA INFILE when the master had version 3.23. Some
smaller problems remain in this setup, See
Section 6.7, “Replication Features and Known Problems”. (Bug#3422)
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)
Fixed a crash of the MySQL slave server when it was built with
--with-debug and replicating itself. (Bug#3568)
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 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)
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)
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)

User Comments
Add your own comment.