The following known errors or bugs are not fixed in MySQL 3.23 because fixing them would involve changing a lot of code that could introduce other even worse bugs. The bugs are also classified as ``not fatal'' or ``bearable.''
You can get a deadlock if you use LOCK TABLE to lock multiple tables and then in the same connection use DROP TABLE to drop one of them while another thread is trying to lock it. (To break the deadlock, you can use KILL to terminate any of the threads involved.) This issue is resolved in MySQL 4.0.12.
SELECT MAX(key_column) FROM t1,t2,t3... where one of the tables are empty doesn't return NULL but instead returns the maximum value for the column. This issue is resolved in MySQL 4.0.11.
DELETE FROM heap_table without a WHERE clause doesn't work on a locked HEAP table.
The following known errors or bugs are not fixed in MySQL 4.0 because fixing them would involve changing a lot of code that could introduce other even worse bugs. The bugs are also classified as ``not fatal'' or ``bearable.''
In a UNION, the first SELECT determines the type, max_length and NULL properties for the resulting columns. This issue is resolved in MySQL 4.1.1; the property values are based on the rows from all UNION parts.
The following problems are known and fixing them is a high priority:
Dropping a FOREIGN KEY constraint doesn't work in replication as the constraint may have another name.
You cannot mix UNION ALL and UNION DISTINCT in the same query. If you use ALL for one UNION, it is used for all of them.
If one user has a long running transaction and another user drops a table that is updated in the transaction, there is small chance that the binary log may contain the DROP TABLE command before the table is used in the transaction itself. We plan to fix this in 5.0 by having the DROP TABLE wait until the table is not used in any transaction.
When inserting a big integer value (between 2^63 and 2^64-1) into a decimal/string column, it is inserted as a negative value because the number is evaluated in a signed integer context. It is planned to be fixed in 4.1.
FLUSH TABLES WITH READ LOCK does not block CREATE TABLE or COMMIT, which make cause a problem with the binary log position when doing a full backup of tables and the binary log.
ANALYZE TABLE on a BDB table may in some cases make the table unusable until one has restarted mysqld. If this happens, you will see errors of the following form in the MySQL error file:
001207 22:07:56 bdb: log_flush: LSN past current end-of-log
MySQL accepts parentheses in the FROM part of a SELECT statement, but silently ignores them. The reason for not giving an error is that many clients that automatically generate queries add parentheses in the FROM part even where they are not needed.
Concatenating many RIGHT JOINS or combining LEFT and RIGHT join in the same query may not give a correct answer as MySQL only generates NULL rows for the table preceding a LEFT or before a RIGHT join. This will be fixed in 5.0 at the same time we add support for parentheses in the FROM part.
Don't execute ALTER TABLE on a BDB table on which you are running multiple-statement transactions until all those transactions complete. (The transaction will probably be ignored.)
ANALYZE TABLE, OPTIMIZE TABLE, and REPAIR TABLE may cause problems on tables for which you are using INSERT DELAYED.
Doing a LOCK TABLE ... and FLUSH TABLES ... doesn't guarantee that there isn't a half-finished transaction in progress on the table.
BDB tables are a bit slow to open. If you have many BDB tables in a database, it will take a long time to use the mysql client on the database if you are not using the -A option or if you are using rehash. This is especially notable when you have a large table cache.
Replication uses query-level logging: The master writes the executed queries to the binary log. This is a very fast, compact, and efficient logging method that works perfectly in most cases. Though we have never heard of it actually occurring, it is theoretically possible for the data on the master and slave to become different if a query is designed in such a way that the data modification is non-deterministic, that is, left to the will of the query optimizer. (That generally is not a good practice anyway, even outside of replication!) For example:
CREATE ... SELECT or INSERT ... SELECT statements that insert zero or NULL values into an AUTO_INCREMENT column.
DELETE if you are deleting rows from a table which has foreign keys with ON DELETE CASCADE properties.
REPLACE ... SELECT, INSERT IGNORE ... SELECT if you have duplicate key values in the inserted data.
IF and only if all these queries have NO ORDER BY clause guaranteeing a deterministic order.
Indeed, for example for INSERT ... SELECT with no ORDER BY, the SELECT may return rows in a different order (which will result in a row having different ranks, hence getting a different number in the auto_increment column), depending on the choices made by the optimizers on the master and slave. A query will be optimized differently on the master and slave only if:
The files used by the two queries are not exactly the same; for example OPTIMIZE TABLE was run on the master tables and not on the slave tables (to fix this, since MySQL 4.1.1, OPTIMIZE, ANALYZE and REPAIR are written to the binary log).
The table is stored in a different storage engine on the master than on the slave. (It is possible to use different storage engines on the master and slave. For example, you can use InnoDB on the master, but MyISAM on the slave if the slave has less available disk space.)
MySQL buffer sizes (key_buffer_size, etc.) are different on the master and slave.
The master and slave run different MySQL versions, and the optimizer code is different between these versions.
This problem may also affect database restoration using mysqlbinlog|mysql.
The easiest way to avoid this problem in all cases is add an ORDER BY clause to such non-deterministic queries to ensure that the rows are always stored or modified in the same order. In future MySQL versions, we will automatically add an ORDER BY clause when needed.
The following problems are known and will be fixed in due time:
Log files are based on hostnames (if you don't specify a file name with the startup option). For now you have to use options like --log-bin=old_host_name-bin if you change your host name to something else. Another option is to just rename the old files to reflect your hostname change. See Server options.
mysqlbinlog will not delete temporary files left after a LOAD DATA INFILE command. See mysqlbinlog.
RENAME doesn't work with TEMPORARY tables or tables used in a MERGE table.
When using the RPAD() function in a query that has to be resolved by using a temporary table, all resulting strings will have rightmost spaces removed. This is an example of such a query:
SELECT RPAD(t1.column1, 50, ' ') AS f2, RPAD(t2.column2, 50, ' ') AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON t1.record=t2.joinID ORDER BY t2.record;
The final result of this bug is that you will not be able to get spaces on the right side of the resulting values. The problem also occurs for any other string function that adds spaces to the right.
The reason for this is due to the fact that HEAP tables, which are used first for temporary tables, are not capable of handling VARCHAR columns.
This behavior exists in all versions of MySQL. It will be fixed in one of the 4.1 series releases.
Due to the way table definition files are stored, you cannot use character 255 (CHAR(255)) in table names, column names, or enumerations. This is scheduled to be fixed in version 5.1 when we have new table definition format files.
When using SET CHARACTER SET, you can't use translated characters in database, table, and column names.
You can't use _ or % with ESCAPE in LIKE ... ESCAPE.
If you have a DECIMAL column with a number stored in different formats (+01.00, 1.00, 01.00), GROUP BY may regard each value as a different value.
DELETE FROM merge_table used without a WHERE clause will only clear the mapping for the table, not delete everything in the mapped tables.
You cannot build the server in another directory when using MIT-pthreads. Because this requires changes to MIT-pthreads, we are not likely to fix this. See MIT-pthreads.
BLOB values can't ``reliably'' be used in GROUP BY or ORDER BY or DISTINCT. Only the first max_sort_length bytes are used when comparing BLOB values in these cases. The default value of max_sort_length value is 1024. It can be changed at server startup time. A workaround for most cases is to use a substring. For example: SELECT DISTINCT LEFT(blob,2048) FROM tbl_name.
Numeric calculations are done with BIGINT or DOUBLE (both are normally 64 bits long). It depends on the function which precision one gets. The general rule is that bit functions are done with BIGINT precision, IF, and ELT() with BIGINT or DOUBLE precision and the rest with DOUBLE precision. You should try to avoid using unsigned long long values if they resolve to be bigger than 63 bits (9223372036854775807) for anything other than bit fields. MySQL Server 4.0 has better BIGINT handling than 3.23.
All string columns, except BLOB and TEXT columns, automatically have all trailing spaces removed when retrieved. For CHAR types this is okay. The bug is that in MySQL Server, VARCHAR columns are treated the same way.
You can only have up to 255 ENUM and SET columns in one table.
In MIN(), MAX(), and other aggregate functions, MySQL currently compares ENUM and SET columns by their string value rather than by the string's relative position in the set.
mysqld_safe redirects all messages from mysqld to the mysqld log. One problem with this is that if you execute mysqladmin refresh to close and reopen the log, stdout and stderr are still redirected to the old log. If you use --log extensively, you should edit mysqld_safe to log to 'hostname'.err instead of 'hostname'.log so you can easily reclaim the space for the old log by deleting the old one and executing mysqladmin refresh.
In the UPDATE statement, columns are updated from left to right. If you refer to an updated column, you will get the updated value instead of the original value. For example:
mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
This will increment KEY by 2, not 1.
You can refer to multiple temporary tables in the same query, but you cannot refer to any given temporary table more than once. For example, the following doesn't work:
mysql> SELECT * FROM temporary_table, temporary_table AS t2;
The optimizer may handle DISTINCT differently if you are using 'hidden' columns in a join or not. In a join, hidden columns are counted as part of the result (even if they are not shown) while in normal queries hidden columns don't participate in the DISTINCT comparison. We will probably change this in the future to never compare the hidden columns when executing DISTINCT.
An example of this is:
SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC;
and
SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC;
In the second case you may in MySQL Server 3.23.x get two identical rows in the result set (because the values in the hidden id column may differ).
Note that this happens only for queries where you don't have the ORDER BY columns in the result, something that you are not allowed to do in SQL-92.
Because MySQL Server allows you to work with table types that don't support transactions, and thus can't roll back data, some things behave a little differently in MySQL Server than in other SQL servers. This is just to ensure that MySQL Server never needs to do a rollback for an SQL statement. This may be a little awkward at times as column values must be checked in the application, but this will actually give you a nice speed increase as it allows MySQL Server to do some optimizations that otherwise would be very hard to do.
If you set a column to an incorrect value, MySQL Server will, instead of doing a rollback, store the best possible value in the column:
If you try to store a value outside the range in a numerical column, MySQL Server instead stores the smallest or largest possible value in the column.
If you try to store a string that doesn't start with a number into a numerical column, MySQL Server stores 0.
If you try to store NULL into a column that doesn't allow NULL values, MySQL Server stores 0 or '' (the empty string) in it instead. (This behavior can, however, be changed with the -DDONT_USE_DEFAULT_FIELDS compile option.)
MySQL allows you to store some wrong date values into DATE and DATETIME columns (like '2000-02-31' or '2000-02-00'). The idea is that it's not the job of the SQL server to validate dates. If MySQL can store a date value and retrieve exactly the same value, MySQL stores it as given. If the date is totally wrong (outside the server's ability to store it), the special date value '0000-00-00' is stored in the column instead.
If you set an ENUM column to an unsupported value, it is set to the error value empty string, with numeric value 0.
If you set a SET column to an unsupported value, the value is ignored.
If you execute a PROCEDURE on a query that returns an empty set, in some cases the PROCEDURE will not transform the columns.
Creation of a table of type MERGE doesn't check if the underlying tables are of compatible types.
MySQL Server can't yet handle NaN, -Inf, and Inf values in DOUBLE columns. Using these will cause problems when trying to export and import data. We should as an intermediate solution change NaN to NULL (if possible) and -Inf and Inf to the minimum respective maximum possible double value.
If you use ALTER TABLE to first add a UNIQUE index to a table used in a MERGE table and then use ALTER TABLE to add a normal index on the MERGE table, the key order will be different for the tables if there was an old key that was not unique in the table. This is because ALTER TABLE puts UNIQUE indexes before normal indexes to be able to detect duplicate keys as early as possible.
The following are known bugs in earlier versions of MySQL:
You can get a hung thread if you do a DROP TABLE on a table that is one among many tables that is locked with LOCK TABLES.
In the following case you can get a core dump:
Delayed insert handler has pending inserts to a table.
LOCK table with WRITE.
FLUSH TABLES.
Before MySQL Server Version 3.23.2 an UPDATE that updated a key with a WHERE on the same key may have failed because the key was used to search for records and the same row may have been found multiple times:
UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;
A workaround is to use:
mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;
This will work because MySQL Server will not use an index on expressions in the WHERE clause.
Before MySQL Server Version 3.23, all numeric types were treated as fixed-point fields. That means you had to specify how many decimals a floating-point field should have. All results were returned with the correct number of decimals.
For platform-specific bugs, see the sections about compiling and porting. See Installing source. See Porting.